• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Vote/Hub Proxy

Crafter6432

Workaholic
Registriert
22 Dezember 2011
Beiträge
681
Diamanten
0
Ich hab mir, weil ich nun 3 Server betreibe und die Liste nur 1 Vote/Tag zulässt ein Proxy geschrieben, dass einen Vote dupliziert und an alle in der Config eingestellten Server weiterleitet. Außerdem wird verhindert, dass wenn die Liste spinnt nicht jeder X-mal etwas für das voten bekommt.Sollte mal einer der Ziel Server offline sein wird so lange versucht den Vote zu senden, bis das Timeout erreicht wird oder Vote ankommt

proxy.py
Code:
import SocketServer
import re
import traceback
import socket
import sys
import time
import datetime
import ConfigParser, os
from thread import start_new_thread
import threading, Queue
from warnings import filterwarnings
from Crypto.PublicKey import RSA
class VoteProxy(SocketServer.ThreadingTCPServer):
    def __init__(self, server_address, RequestHandlerClass, decrypt,encrypt, targets,voteoptions):
        self.decrypt = decrypt
        self.encrypt = encrypt
        self.targets = targets
        self.delivertimeout = datetime.timedelta(seconds=voteoptions[0])
        self.voteinterval = datetime.timedelta(seconds=voteoptions[1])
        self.voters = {}
        SocketServer.ThreadingTCPServer.__init__(self, server_address, RequestHandlerClass)
    def shutdown(self):
      self.delivertimeout = datetime.timedelta(seconds=1)
      self.__shutdown_request = True
      SocketServer.ThreadingTCPServer.shutdown(self)
class VoteCatcher(SocketServer.BaseRequestHandler):   
    def readString(self,s,pos):
        n=""
        for i in range(pos,len(s)):
                if s[i] == '\n':
                        return n
                n=n+s[i]
    def handle(self): 
        self.request.send("VOTIFIER 1.9")
        data = self.request.recv(256) 
        #print self.server.decrypt.decrypt(data)
        block = self.server.decrypt.decrypt(data)
        pos = 0
        optcode = ""
        trys=0
        while not"VOTE" in optcode and trys<10:
                optcode = self.readString(block,pos)
                pos=pos+len(optcode)+1
                trys=trys+1
        if trys == 10:
                print "Invalid vote dump:"
                print block.encode('base64')
                return
        #print optcode
        service = self.readString(block,pos)
        pos=pos+len(service)+1
        #print service
        username = self.readString(block,pos)
        pos=pos+len(username)+1
        #print username
        address = self.readString(block,pos)
        pos=pos+len(address)+1
        timestamp = self.readString(block,pos)
        #print timestamp
        voter = self.server.voters.get(username)
        if not voter == None:
                if voter.has_key(service):
                        if datetime.datetime.now()-voter.get(service)<self.server.voteinterval:
                                print username + " Votes too fast!"
                                return
                        voter.update({service:datetime.datetime.now()})                               
        else:
                        voter = {service:datetime.datetime.now()}
                        self.server.voters.update({username:voter})            
        if timestamp == None or len(timestamp) == 0:
                timestamp = time.time()                        
        print str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))+" Vote from: " + str(service) + " player: " + str(username) + " ip: " + str(address)
        for t in self.server.targets:
                     if(len(t.split(":")) == 2):
                        #self.forwardVote(user,userip,service,timestamp,t.split(":")[0],int(t.split(":")[1]))
                        self.forwardVote(data,t.split(":")[0],int(t.split(":")[1]))
                     else:
                        #self.forwardVote(user,userip,service,timestamp,t.split(":")[0],8192) 
                        self.forwardVote(data,t.split(":")[0],8192)   
    #def forwardVote(self,user,userip,service,timestamp,destip,destport):
    def forwardVote(self,data,destip,destport):
        start_time = datetime.datetime.now()
        while (datetime.datetime.now()-start_time)<self.server.delivertimeout:
                try:
                  con = socket.create_connection((destip,destport), socket.AF_INET)
                  con.send(data)
                  con.close()
                  return
                except Exception, e:
                  if datetime.datetime.now()-start_time < datetime.timedelta(seconds=1):
                        print "Failed to connect " + destip+":"+str(destport) 
                  time.sleep(1.05)
def file_get_contents(filename):
    with open(filename) as f:
        return f.read()
def file_exists(filename):
        try:
                with open(filename) as f: pass
        except IOError as e:
                return False
        return True
if not file_exists('proxy.cfg'):
        print "proxy.cfg not found"
        sys.exit(0)
config = ConfigParser.ConfigParser()
config.readfp(open('proxy.cfg'))
vinterval = config.getint("Proxy","vote-interval")
bind = (config.get("Proxy","address"),config.getint("Proxy","port"))
keys = (config.get("Proxy","public-key"),config.get("Proxy","private-key"))
dtimeout = config.getint("Proxy","deliver-timeout")
vinterval = config.getint("Proxy","vote-interval")
targets = []
for t in config.get("Proxy","targets").split(","):
        targets.append(t)
print str(len(targets)) + " targets loaded!"
if not file_exists(keys[0]):
        print "Public key not found"
        sys.exit(0)
if not file_exists(keys[1]):
        print "Private key not found"
        sys.exit(0)
pub = "-----BEGIN PUBLIC KEY-----\n" + file_get_contents(keys[0]) + "\n\n-----END PUBLIC KEY-----"
priv = "-----BEGIN PRIVATE KEY-----\n"+ file_get_contents(keys[1]) + "\n\n-----END PRIVATE KEY-----"
decrypt = RSA.importKey(priv)
encrypt = RSA.importKey(pub)
server = None
try:
        server = VoteProxy((bind[0], bind[1]),VoteCatcher,decrypt,encrypt,targets,(dtimeout,vinterval))
        print "Listening on: " + bind[0] + ":" + str(bind[1]) 
except Exception, e:
        print "Can't bind server to: " + bind[0] + ":" + str(bind[1])     
        sys.exit(0)  
try:                                
        server.serve_forever()
except KeyboardInterrupt, e:
        server.shutdown()
        print ""
        sys.exit(0)

proxy.cfg
Code:
[Proxy]
address: 0.0.0.0
port: 8192
public-key: public.key
private-key: private.key
targets: 127.0.0.1:8193,127.0.0.1:8194,127.0.0.1:8195
deliver-timeout: 3600
vote-interval: 3600

Voraussetzungen:
Python 2.7.3 (3.3 wird nicht unterstützt!)
pycrypto-2.6 (Die Version aus dem Ubuntu Repo ist zu alt!)
 
Zuletzt bearbeitet:
Oben