Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # coding: utf-8
- import time, asyncore, atexit, subprocess, socket, shlex, threading
- class ConnectionHandler(asyncore.dispatcher_with_send):
- def handle_read(self):
- data = self.recv(1024).decode()
- if data:
- main(self, data)
- def response(self, message):
- self.send(str.encode(message))
- class ConnectionServer(asyncore.dispatcher):
- def __init__(self, host, port):
- asyncore.dispatcher.__init__(self)
- self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
- self.set_reuse_addr()
- self.bind((host, port))
- self.listen(5)
- def handle_accepted(self, sock, addr):
- print("Connection from %s accepted." % repr(addr))
- handler = ConnectionHandler(sock)
- # Array for saving the users
- Users = {}
- # Thread for running servers
- class RunServer(threading.Thread):
- def __init__(self, args, logfile):
- threading.Thread.__init__(self) # init the thread
- self.Args = args
- self.Logfile = open(logfile, "wb")
- self.Running = True
- def run(self):
- while self.Running:
- self.ServerProcess = subprocess.Popen(self.Args, stdin=None, stdout=self.Logfile)
- self.ServerPID = self.ServerProcess.pid
- self.ServerProcess.wait()
- self.ServerPID = -1
- time.sleep(1.5)
- self.Logfile.write(str.encode("Restart: " + time.strftime("%d/%m/%Y %H:%M:%S") + '\n'))
- self.Logfile.close()
- def GetServerPID(self):
- return self.ServerPID
- def GetServerProcess(self):
- return self.ServerProcess
- def Stop(self):
- self.Running = False
- try:
- self.ServerProcess.terminate()
- except:
- pass
- # User Class
- class User():
- def __init__(self, userid):
- self.Servers = {}
- self.UserID = int(userid)
- self.UserName = str(username)
- print("New User: '" + str(self.UserID) + "'")
- # Server Class
- class Server():
- def __init__(self, userid, serverid, serverfile, serverconfig):
- self.UserID = int(userid)
- self.ServerID = int(serverid)
- self.ServerFile = str(serverfile)
- self.ServerConfig = str(serverconfig)
- def Start(self):
- try:
- if(self.ServerThread.GetServerPID() != -1):
- print("Server: '" + str(self.ServerID) + "' allready running with PID: '" + str(self.ServerThread.GetServerPID()) + "'")
- return "Server allready running!"
- except:
- pass
- args = shlex.split("./" + self.ServerFile + " -f " + self.ServerConfig)
- self.ServerThread = RunServer(args, str(self.UserID) + "_" + str(self.ServerID) + ".log")
- self.ServerThread.deamon = True
- self.ServerThread.start()
- time.sleep(0.1)
- if not(self.ServerThread.is_alive()):
- self.ServerThread = 0
- return "Couldn't start server!"
- print("Server: '" + str(self.ServerID) + "' started by '" + str(self.UserID) + "'")
- time.sleep(0.5)
- if(self.ServerThread.GetServerProcess().poll() == None):
- return "Server started successfully."
- else:
- self.ServerThread.Stop()
- self.ServerThread = 0
- return "Server force-closed!\nCheck the logfile for errors."
- def Stop(self):
- try:
- if not(self.ServerThread.is_alive()):
- return "Server not running!"
- except:
- return "Server not running!"
- self.ServerThread.Stop()
- self.ServerThread = 0
- print("Server: '" + str(self.ServerID) + "' stopped by '" + str(self.UserID) + "'")
- return "Server terminated."
- def ReStart(self):
- try:
- if not(self.ServerThread.is_alive()):
- return "Server not running!"
- except:
- return "Server not running!"
- self.ServerThread.GetServerProcess().terminate()
- return "Server restarted."
- def Info(self):
- try:
- if(self.ServerThread.is_alive()):
- return "Server running."
- except:
- return "Server not running."
- def main(conn, raw_data):
- data = raw_data.split('\x00')
- if(str(data[0]) != "HEAD_TEESERVER_B0T0X"):
- return
- UserID = int(data[1])
- ServerID = int(data[2])
- ServerFile = str(data[3])
- ServerConfig = str(data[4])
- ServerState = str(data[5])
- print("Message OK, UserID: '" + str(UserID) + "', ServerID: '" + str(ServerID) + "', ServerFile: '" + ServerFile + "', ServerConfig: '" + ServerConfig + "', ServerState: '" + ServerState + "'")
- try:
- if(Users[UserID].UserID == UserID):
- print("UserID: '" + str(UserID) + "' connnected.")
- conn.response("User found.")
- except:
- print("UserID: '" + str(UserID) + "' not found. Creating...")
- conn.response("User not found. Creating...")
- Users[UserID] = User(UserID)
- if(ServerState != "new"):
- try:
- if(Users[UserID].Servers[ServerID].ServerID == ServerID):
- print("Server with ID: '" + str(ServerID) + "' found.")
- conn.response("Server found.")
- except:
- print("Server with ID: '" + str(ServerID) + "' not found. Creating...")
- conn.response("Server not found. Creating...")
- Users[UserID].Servers[ServerID] = Server(UserID, ServerID, ServerFile, ServerConfig)
- if(ServerState == "stop"):
- conn.response(Users[UserID].Servers[ServerID].Stop())
- elif(ServerState == "start"):
- conn.response(Users[UserID].Servers[ServerID].Start())
- elif(ServerState == "restart"):
- conn.response(Users[UserID].Servers[ServerID].ReStart())
- elif(ServerState == "info"):
- conn.response(Users[UserID].Servers[ServerID].Info())
- elif(ServerState == "new"):
- try:
- Users[UserID].Servers[ServerID].Stop()
- time.sleep(0.1)
- except:
- pass
- Users[UserID].Servers[ServerID] = Server(UserID, ServerID, ServerFile, ServerConfig)
- conn.response("Server successfully created.")
- else:
- conn.response("Unknown serverstate")
- return
- conn.shutdown(socket.SHUT_RDWR)
- conn.close()
- if __name__ == '__main__':
- server = ConnectionServer('127.0.0.1', 2327)
- asyncore.loop()
Add Comment
Please, Sign In to add comment