Crafter6432
Workaholic
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
proxy.cfg
Voraussetzungen:
Python 2.7.3 (3.3 wird nicht unterstützt!)
pycrypto-2.6 (Die Version aus dem Ubuntu Repo ist zu alt!)
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: