75 lines
2.4 KiB
Python
75 lines
2.4 KiB
Python
from xmlrpc.server import SimpleXMLRPCServer
|
|
from loggerModule import Logger
|
|
import multiprocessing
|
|
import logging
|
|
|
|
logger = Logger(log_file="server_manager.log", logger_name="ServerManager")
|
|
|
|
class ServerManagerRPC:
|
|
def __init__(self):
|
|
self.manager = ServerManager()
|
|
|
|
def start_server(self, port):
|
|
"""서버 시작 요청"""
|
|
return self.manager.start_server(port)
|
|
|
|
def stop_server(self, port):
|
|
"""서버 종료 요청"""
|
|
return self.manager.stop_server(port)
|
|
|
|
def list_servers(self):
|
|
"""현재 실행 중인 서버 목록 반환"""
|
|
return self.manager.list_servers()
|
|
|
|
|
|
class ServerManager:
|
|
def __init__(self):
|
|
self.servers = {} # {포트 번호: 프로세스 객체}
|
|
|
|
def start_server(self, port):
|
|
if port in self.servers:
|
|
logger.log(f"포트 {port}에서 이미 서버가 실행 중입니다.", level=logging.WARNING)
|
|
return f"Server on port {port} already running."
|
|
|
|
process = multiprocessing.Process(target=self._run_server, args=(port,), daemon=True)
|
|
process.start()
|
|
self.servers[port] = process
|
|
logger.log(f"포트 {port}에서 서버가 시작되었습니다.")
|
|
return f"Server started on port {port}."
|
|
|
|
def stop_server(self, port):
|
|
if port not in self.servers:
|
|
logger.log(f"포트 {port}에서 실행 중인 서버가 없습니다.", level=logging.WARNING)
|
|
return f"No server running on port {port}."
|
|
|
|
process = self.servers.pop(port)
|
|
process.terminate()
|
|
process.join()
|
|
logger.log(f"포트 {port}에서 서버가 종료되었습니다.")
|
|
return f"Server stopped on port {port}."
|
|
|
|
def _run_server(self, port):
|
|
from rpc_server import start_rpc_server
|
|
start_rpc_server(port)
|
|
|
|
def list_servers(self):
|
|
active_ports = list(self.servers.keys())
|
|
logger.log(f"실행 중인 서버 포트: {active_ports}")
|
|
return active_ports
|
|
|
|
|
|
def main():
|
|
# Server Manager RPC 시작
|
|
server = SimpleXMLRPCServer(("localhost", 8000), allow_none=True)
|
|
server.register_instance(ServerManagerRPC())
|
|
|
|
logger.log("서버 매니저 RPC가 실행 중입니다. 포트: 8000")
|
|
try:
|
|
server.serve_forever()
|
|
except KeyboardInterrupt:
|
|
logger.log("Server Manager 종료 요청 수신.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|