Guest User

Untitled

a guest
Oct 16th, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.39 KB | None | 0 0
  1. # coding: utf-8
  2. import time, asyncore, atexit, subprocess, socket, shlex, threading
  3.  
  4. class ConnectionHandler(asyncore.dispatcher_with_send):
  5.     def handle_read(self):
  6.         data = self.recv(1024).decode()
  7.         if data:
  8.             main(self, data)
  9.  
  10.     def response(self, message):
  11.         self.send(str.encode(message))
  12.  
  13. class ConnectionServer(asyncore.dispatcher):
  14.     def __init__(self, host, port):
  15.         asyncore.dispatcher.__init__(self)
  16.         self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
  17.         self.set_reuse_addr()
  18.         self.bind((host, port))
  19.         self.listen(5)
  20.  
  21.     def handle_accepted(self, sock, addr):
  22.         print("Connection from %s accepted." % repr(addr))
  23.         handler = ConnectionHandler(sock)
  24.  
  25. # Array for saving the users
  26. Users = {}
  27.  
  28. # Thread for running servers
  29. class RunServer(threading.Thread):
  30.     def __init__(self, args, logfile):
  31.         threading.Thread.__init__(self) # init the thread
  32.         self.Args = args
  33.         self.Logfile = open(logfile, "wb")
  34.         self.Running = True
  35.  
  36.     def run(self):
  37.         while self.Running:
  38.             self.ServerProcess = subprocess.Popen(self.Args, stdin=None, stdout=self.Logfile)
  39.             self.ServerPID = self.ServerProcess.pid
  40.             self.ServerProcess.wait()
  41.             self.ServerPID = -1
  42.             time.sleep(1.5)
  43.             self.Logfile.write(str.encode("Restart: " + time.strftime("%d/%m/%Y %H:%M:%S") + '\n'))
  44.         self.Logfile.close()
  45.  
  46.     def GetServerPID(self):
  47.         return self.ServerPID
  48.  
  49.     def GetServerProcess(self):
  50.         return self.ServerProcess
  51.  
  52.     def Stop(self):
  53.         self.Running = False
  54.         try:
  55.             self.ServerProcess.terminate()
  56.         except:
  57.             pass
  58.  
  59. # User Class
  60. class User():
  61.     def __init__(self, userid):
  62.         self.Servers = {}
  63.         self.UserID = int(userid)
  64.         self.UserName = str(username)
  65.         print("New User: '" + str(self.UserID) + "'")
  66.  
  67. # Server Class
  68. class Server():
  69.     def __init__(self, userid, serverid, serverfile, serverconfig):
  70.         self.UserID = int(userid)
  71.         self.ServerID = int(serverid)
  72.         self.ServerFile = str(serverfile)
  73.         self.ServerConfig = str(serverconfig)
  74.        
  75.     def Start(self):
  76.         try:
  77.             if(self.ServerThread.GetServerPID() != -1):
  78.                 print("Server: '" + str(self.ServerID) + "' allready running with PID: '" + str(self.ServerThread.GetServerPID()) + "'")
  79.                 return "Server allready running!"
  80.         except:
  81.             pass
  82.         args = shlex.split("./" + self.ServerFile + " -f " + self.ServerConfig)
  83.         self.ServerThread = RunServer(args, str(self.UserID) + "_" + str(self.ServerID) + ".log")
  84.         self.ServerThread.deamon = True
  85.         self.ServerThread.start()
  86.         time.sleep(0.1)
  87.         if not(self.ServerThread.is_alive()):
  88.             self.ServerThread = 0
  89.             return "Couldn't start server!"
  90.         print("Server: '" + str(self.ServerID) + "' started by '" + str(self.UserID) + "'")
  91.         time.sleep(0.5)
  92.         if(self.ServerThread.GetServerProcess().poll() == None):
  93.             return "Server started successfully."
  94.         else:
  95.             self.ServerThread.Stop()
  96.             self.ServerThread = 0
  97.             return "Server force-closed!\nCheck the logfile for errors."
  98.            
  99.     def Stop(self):
  100.         try:
  101.             if not(self.ServerThread.is_alive()):
  102.                 return "Server not running!"
  103.         except:
  104.             return "Server not running!"
  105.         self.ServerThread.Stop()
  106.         self.ServerThread = 0
  107.         print("Server: '" + str(self.ServerID) + "' stopped by '" + str(self.UserID) + "'")
  108.         return "Server terminated."
  109.    
  110.     def ReStart(self):
  111.         try:
  112.             if not(self.ServerThread.is_alive()):
  113.                 return "Server not running!"
  114.         except:
  115.             return "Server not running!"
  116.         self.ServerThread.GetServerProcess().terminate()
  117.         return "Server restarted."
  118.  
  119.     def Info(self):
  120.         try:
  121.             if(self.ServerThread.is_alive()):
  122.                 return "Server running."
  123.         except:
  124.             return "Server not running."
  125.  
  126. def main(conn, raw_data):
  127.     data = raw_data.split('\x00')
  128.     if(str(data[0]) != "HEAD_TEESERVER_B0T0X"):
  129.         return
  130.     UserID = int(data[1])
  131.     ServerID = int(data[2])
  132.     ServerFile = str(data[3])
  133.     ServerConfig = str(data[4])
  134.     ServerState = str(data[5])
  135.     print("Message OK, UserID: '" + str(UserID) + "', ServerID: '" + str(ServerID) + "', ServerFile: '" + ServerFile + "', ServerConfig: '" + ServerConfig + "', ServerState: '" + ServerState + "'")
  136.     try:
  137.         if(Users[UserID].UserID == UserID):
  138.             print("UserID: '" + str(UserID) + "' connnected.")
  139.             conn.response("User found.")
  140.     except:
  141.         print("UserID: '" + str(UserID) + "' not found. Creating...")
  142.         conn.response("User not found. Creating...")
  143.         Users[UserID] = User(UserID)
  144.  
  145.     if(ServerState != "new"):
  146.         try:
  147.             if(Users[UserID].Servers[ServerID].ServerID == ServerID):
  148.                 print("Server with ID: '" + str(ServerID) + "' found.")
  149.                 conn.response("Server found.")
  150.         except:
  151.             print("Server with ID: '" + str(ServerID) + "' not found. Creating...")
  152.             conn.response("Server not found. Creating...")
  153.             Users[UserID].Servers[ServerID] = Server(UserID, ServerID, ServerFile, ServerConfig)
  154.  
  155.     if(ServerState == "stop"):
  156.         conn.response(Users[UserID].Servers[ServerID].Stop())
  157.  
  158.     elif(ServerState == "start"):
  159.         conn.response(Users[UserID].Servers[ServerID].Start())
  160.  
  161.     elif(ServerState == "restart"):
  162.         conn.response(Users[UserID].Servers[ServerID].ReStart())
  163.  
  164.     elif(ServerState == "info"):
  165.         conn.response(Users[UserID].Servers[ServerID].Info())
  166.  
  167.     elif(ServerState == "new"):
  168.         try:
  169.             Users[UserID].Servers[ServerID].Stop()
  170.             time.sleep(0.1)
  171.         except:
  172.             pass
  173.         Users[UserID].Servers[ServerID] = Server(UserID, ServerID, ServerFile, ServerConfig)
  174.         conn.response("Server successfully created.")
  175.     else:
  176.         conn.response("Unknown serverstate")
  177.         return
  178.  
  179.     conn.shutdown(socket.SHUT_RDWR)
  180.     conn.close()
  181.  
  182. if __name__ == '__main__':
  183.     server = ConnectionServer('127.0.0.1', 2327)
  184.     asyncore.loop()
Add Comment
Please, Sign In to add comment