Ejemplo n.º 1
0
    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()
Ejemplo n.º 2
0
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