Code:
import socket, time, random, MS_Qw
from threading import Thread
from datetime import datetime
class Main():
def __init__(self):
self.masterServer1 = ('185.34.104.231', 20710) # CoD2 master server
self.masterServer2 = ('185.34.104.231', 20700) # This one doesn't respond
self.mainServer = ['185.46.53.126',0] # Your PC's public IP address
self.redirectServer = ('77.239.73.148', 28960) # The original idea was when someone tries to connect to the fake server,
# they would be redirected to this IP address. But since this program works like
# a proxy, huge latency is generated. Maybe on this server there can be a mod that
# will redirect the user to a new server ?
self.settings = {'threads': 1, 'userPorts': [0], 'usersC': []}
self.isAlive = False
def start(self):
self.isAlive = True
servers = MS_Qw.get_list('115').split('\n') # Gets the list of all cod2 servers using protocol 115 (version 1.0)
for num in range(self.settings['threads']):
for server in servers:
if '192.168' not in server and '185.46' not in server and MS_Qw.query_server(server):
Thread(target = self.startServer, args = ((self.mainServer[0], self.getPort()),(server.split(':')[0],int(server.split(':')[1]) ))).start()
def log(self, msg):
print msg
def getPort(self, port = 49000): # ports at first were generated randomly, thus this method was born (seems inefficient with this linear one)
while port in self.settings['userPorts']:
port += 1
self.settings['userPorts'].append(port)
return port
def getRmsg(self, msg, addr, redict, sock = ''): # Get live status from server
remove = []
for user, obj in self.settings['usersC']:
if user == addr:
sock = obj[0] # This just enables full-time connection with the client (so he can join the server)
obj[1] = datetime.now()
if (datetime.now() - obj[1]).seconds > 5:
remove.append([user, obj])
for item in remove:
try: self.settings['usersC'].remove(item)
except: pass
if (not sock) or ('getstatus' in msg.lower()) or ('getinfo' in msg.lower()) :
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.connect(redict)
sock.settimeout(1)
self.settings['usersC'].append([addr, [sock, datetime.now()]])
sock.sendto(msg, redict)
try:
data, addr = sock.recvfrom(10024)
except:
data = ''
return data
def startServer(self, ip, redict):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
sock.bind(ip)
except :
self.log('Server '+str(ip)+' cant be started.')
return
self.log('Started server on port: '+str(ip[1]) +', using redirect: ' + str(redict))
sock.settimeout(2)
sock.sendto('\xff\xff\xff\xffheartbeat COD-2', self.masterServer1)
sock.sendto('\xff\xff\xff\xffgetIpAuthorize 1740261450 185.34.104.231 test_mod 0', self.masterServer2) # Maybe this is useless ?
lastSent = datetime.now()
while self.isAlive:
if (datetime.now() - lastSent).seconds > 60: # Send Heartbeat every 60 seconds
sock.sendto('\xff\xff\xff\xffheartbeat COD-2', self.masterServer1)
lastSent = datetime.now()
try: data, addr = sock.recvfrom(1024)
except: continue
if not data: continue
if 'getstatus' in data.lower():
#self.log('Got status request. '+str(addr))
returnMsg = self.getRmsg(data, addr, redict)
elif 'getinfo' in data.lower():
#self.log('Got info request.'+str(addr))
returnMsg = self.getRmsg(data, addr, redict)
else:
#self.log('Unknown request: ' + str(data))
returnMsg = '\xff\xff\xff\xfferror\r\nIs this funny or what haha. =)' # Message when they try to connect
#returnMsg = self.getRmsg(data, addr, self.redirectServer) # Uncomment if you want them to actually connect
pass
if returnMsg: sock.sendto(returnMsg, addr)
if __name__ == '__main__':
main = Main()
main.start()
while main.isAlive:
try: time.sleep(1)
except:
print "Control C"
main.isAlive = False
You can't actually protect your server from being duplicated. iptables or some other firewall can only stop incoming/outgoing connection and some little modification here can make the script take server information via gametracker or even the tracker on this site.