AutoPercenty3/test/rpc/server_manager.py

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()