From 38f7836fa54366429a299ccbc077284ee6508433 Mon Sep 17 00:00:00 2001 From: Daniel Oaks Date: Thu, 2 Nov 2017 00:07:20 +0000 Subject: [PATCH] controllers: Add hybrid controller --- irctest/controllers/hybrid.py | 86 +++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 irctest/controllers/hybrid.py diff --git a/irctest/controllers/hybrid.py b/irctest/controllers/hybrid.py new file mode 100644 index 0000000..a5974dd --- /dev/null +++ b/irctest/controllers/hybrid.py @@ -0,0 +1,86 @@ +import os +import time +import shutil +import tempfile +import subprocess + +from irctest import client_mock +from irctest import authentication +from irctest.basecontrollers import NotImplementedByController +from irctest.basecontrollers import BaseServerController, DirectoryBasedController + +TEMPLATE_CONFIG = """ +serverinfo {{ + name = "My.Little.Server"; + sid = "42X"; + description = "test server"; +{ssl_config} +}}; +listen {{ + host = "{hostname}"; + port = {port}; +}}; +general {{ + disable_auth = yes; + anti_nick_flood = no; + max_nick_changes = 256; + throttle_count = 512; +}}; +auth {{ + user = "*"; + flags = exceed_limit; + {password_field} +}}; +""" + +TEMPLATE_SSL_CONFIG = """ + rsa_private_key_file = "{key_path}"; + ssl_certificate_file = "{pem_path}"; + ssl_dh_param_file = "{dh_path}"; +""" + + +class HybridController(BaseServerController, DirectoryBasedController): + software_name = 'Hybrid' + supported_sasl_mechanisms = set() + def create_config(self): + super().create_config() + with self.open_file('server.conf'): + pass + + def run(self, hostname, port, password=None, ssl=False, + valid_metadata_keys=None, invalid_metadata_keys=None): + if valid_metadata_keys or invalid_metadata_keys: + raise NotImplementedByController( + 'Defining valid and invalid METADATA keys.') + assert self.proc is None + self.create_config() + self.port = port + password_field = 'password = "{}";'.format(password) if password else '' + if ssl: + self.gen_ssl() + ssl_config = TEMPLATE_SSL_CONFIG.format( + key_path=self.key_path, + pem_path=self.pem_path, + dh_path=self.dh_path, + ) + else: + ssl_config = '' + with self.open_file('server.conf') as fd: + fd.write(TEMPLATE_CONFIG.format( + hostname=hostname, + port=port, + password_field=password_field, + ssl_config=ssl_config, + )) + self.proc = subprocess.Popen(['ircd', '-foreground', + '-configfile', os.path.join(self.directory, 'server.conf'), + '-pidfile', os.path.join(self.directory, 'server.pid'), + ], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL + ) + + +def get_irctest_controller_class(): + return HybridController