def start(self, conf_name): self.conf = get_config(conf_name) filename = export_conf(self.conf) # Prepare server ## Prepare storage file f = open(os.path.join(data_folder,'storage.cfg'), 'w') # USELESS #f.write('add_path .') #f.write('add_path $USERDIR') #f.write('add_path $DATADIR') # END USELESS f.write('add_path $CURRENTDIR') f.close() # Server Command if self.conf['conf'].get('server', ''): server_bin = self.conf['conf']['server'] else: server_bin = "`which teeworlds-server`" self.command = 'cd %s && %s -f %s' % (data_folder, server_bin, filename) # Open pty master, slave = pty.openpty() # Launch server self.process = Popen(self.command, shell=True, stdin=PIPE, stdout=slave, stderr=slave, close_fds=True) # Init thread self.server = TeeWorldsServer(self, master) self.live_stats = LiveStats() # Start Server self.server.start() # Start live stats thread self.live_stats.start()
class TeeWorldsManagerServer(object): def __init__(self, conf=None): # Prepare db self.con = Connection() tee_db = self.con['teeworlds'] # Prepare table self.join_table = tee_db['join'] self.changeteam_table = tee_db['changeteam'] self.changename_table = tee_db['changename'] self.round_table = tee_db['round'] self.map_table = tee_db['map'] self.kick_table = tee_db['kick'] self.timeout_table = tee_db['timeout'] self.leave_table = tee_db['leave'] self.servershutdown_table = tee_db['servershutdown'] self.pickup_table = tee_db['pickup'] self.kill_table = tee_db['kill'] self.flaggrab_table = tee_db['flaggrab'] self.flagreturn_table = tee_db['flagreturn'] self.flagcapture_table = tee_db['flagcapture'] self.server_executable = None self.conf = conf self.process = None #import pdb;pdb.set_trace() def empty_db(self): self.join_table.drop() self.changeteam_table.drop() self.changename_table.drop() self.round_table.drop() self.map_table.drop() self.kick_table.drop() self.timeout_table.drop() self.leave_table.drop() self.servershutdown_table.drop() self.pickup_table.drop() self.kill_table.drop() self.flaggrab_table.drop() self.flagreturn_table.drop() self.flagcapture_table.drop() def is_alive(self): if not hasattr(self, 'server'): return False return self.server.is_alive() def get_server_info(self): try: sock = socket(AF_INET, SOCK_DGRAM) sock.settimeout(TIMEOUT); sock.sendto(PACKET_GETINFO3, ('localhost',8303)) data, addr = sock.recvfrom(1400) sock.close() data = data[14:] # skip header slots = data.split("\x00") server_info = {} server_info["token"] = slots[0] server_info["version"] = slots[1] server_info["name"] = slots[2] server_info["map"] = slots[3] server_info["gametype"] = slots[4] server_info["flags"] = int(slots[5]) server_info["num_players"] = int(slots[6]) server_info["max_players"] = int(slots[7]) server_info["num_clients"] = int(slots[8]) server_info["max_clients"] = int(slots[9]) server_info["players"] = [] for i in xrange(0, server_info["num_clients"]): player = {} player["name"] = slots[10+i*5] player["clan"] = slots[10+i*5+1] player["country"] = int(slots[10+i*5+2]) player["score"] = int(slots[10+i*5+3]) if int(slots[10+i*5+4]): player["player"] = True else: player["player"] = False server_info["players"].append(player) return server_info except: sock.close() return None def start(self, conf_name): self.conf = get_config(conf_name) filename = export_conf(self.conf) # Prepare server ## Prepare storage file f = open(os.path.join(data_folder,'storage.cfg'), 'w') # USELESS #f.write('add_path .') #f.write('add_path $USERDIR') #f.write('add_path $DATADIR') # END USELESS f.write('add_path $CURRENTDIR') f.close() # Server Command if self.conf['conf'].get('server', ''): server_bin = self.conf['conf']['server'] else: server_bin = "`which teeworlds-server`" self.command = 'cd %s && %s -f %s' % (data_folder, server_bin, filename) # Open pty master, slave = pty.openpty() # Launch server self.process = Popen(self.command, shell=True, stdin=PIPE, stdout=slave, stderr=slave, close_fds=True) # Init thread self.server = TeeWorldsServer(self, master) self.live_stats = LiveStats() # Start Server self.server.start() # Start live stats thread self.live_stats.start() def stop(self): if self.process: # Stop thread self.live_stats.stop_server() self.server.stop_server() # Kill childs ps_command = Popen("ps -o pid --ppid %d --noheaders" % self.process.pid, shell=True, stdout=PIPE) ps_output = ps_command.stdout.read() retcode = ps_command.wait() #assert retcode == 0, "ps command returned %d" % retcode for pid_str in ps_output.split("\n")[:-1]: os.kill(int(pid_str), 15) # Kill teeworlds server !! self.process.terminate() self.process.wait() data = {'when': datetime.now(), 'round': self.server.round_, 'map': self.server.map_} self.servershutdown_table.save(data) self.process = None return True return False