import os import subprocess from typing import Optional, Set, Type from irctest.basecontrollers import ( BaseServerController, DirectoryBasedController, NotImplementedByController, ) from irctest.irc_utils.junkdrawer import find_hostname_and_port TEMPLATE_CONFIG = """ # Clients: {ssl_config} # Disable 'NOTICE #chan :*** foo invited bar into the channel- # Services: # Anope errors when missing # Atheme raises a warning when missing # Protocol: # for testing mute extbans # For multi-prefix # Misc: """ TEMPLATE_SSL_CONFIG = """ """ class InspircdController(BaseServerController, DirectoryBasedController): software_name = "InspIRCd" supported_sasl_mechanisms = {"PLAIN"} supports_sts = False extban_mute_char = "m" def create_config(self) -> None: super().create_config() with self.open_file("server.conf"): pass def run( self, hostname: str, port: int, *, password: Optional[str], ssl: bool, run_services: bool, valid_metadata_keys: Optional[Set[str]] = None, invalid_metadata_keys: Optional[Set[str]] = None, restricted_metadata_keys: Optional[Set[str]] = None, ) -> None: if valid_metadata_keys or invalid_metadata_keys: raise NotImplementedByController( "Defining valid and invalid METADATA keys." ) assert self.proc is None self.port = port self.hostname = hostname self.create_config() (services_hostname, services_port) = find_hostname_and_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, services_hostname=services_hostname, services_port=services_port, password_field=password_field, ssl_config=ssl_config, ) ) assert self.directory self.proc = subprocess.Popen( [ "inspircd", "--nofork", "--config", os.path.join(self.directory, "server.conf"), ], stdout=subprocess.DEVNULL, ) if run_services: self.wait_for_port() self.services_controller = self.services_controller_class( self.test_config, self ) self.services_controller.run( protocol="inspircd3", server_hostname=services_hostname, server_port=services_port, ) def get_irctest_controller_class() -> Type[InspircdController]: return InspircdController