#!/usr/bin/python3 import configparser import concurrent.futures import signal import sys from lib import core from lib import model from lib.config import Config class PyWhoisD(): """Main class. It reads the configuration options and starts the server""" def __init__(self): self.config = Config().parser self.data = None self.daemon = None self.classic_server = None self.web_server = None self.executor = concurrent.futures.ThreadPoolExecutor(max_workers=2) def signal_sigint(self, signal, frame): print("[+] Received SIGINT signal. Aborting...") sys.exit(0) # What kind of storage are we using? def config_data(self): """Config data sources.""" #At the moment only XML is supported. mode = self.config['Storage']['mode'] if mode == 'xml': self.data = model.DataXML() def config_daemon(self): """Config common information source for all configured servers""" self.config_data() self.daemon = core.Daemon(self.data) def web(self): """Returns true if web server is enabled""" return self.config['Servers']['web'] == 'yes' def classic(self): """Returns true if classic whois server is enabled""" return self.config['Servers']['classic'] == 'yes' def config_servers(self): """Sets up server configuration from config files""" if self.classic(): self.classic_server = core.ClassicServer(self.daemon) else: print("[+] Classic server is not enabled") if self.web(): self.web_server = core.WebServer(self.daemon) else: print("[+] Web server is not enabled") def start_servers(self): """Properly configure and start configured servers""" self.config_servers() if self.classic_server: print("[+] Starting classic whois server") self.executor.submit(self.classic_server.serve_forever) if self.web_server: self.executor.submit(self.web_server.serve_forever) def main(self): signal.signal(signal.SIGINT, self.signal_sigint) self.config_daemon() self.start_servers() # Wait for running server to finish. Probably never. # self.executor.shutdown() if __name__ == "__main__": pwd = PyWhoisD() pwd.main()