import os import subprocess from typing import Optional, Set, Type from irctest.basecontrollers import ( BaseServerController, DirectoryBasedController, NotImplementedByController, ) TEMPLATE_CONFIG = """ # M:::::: M:My.Little.Server:{hostname}:Somewhere:{port}:0042: # A:::::: A:Organization, IRC dept.:Daemon :Client Server::IRCnet: # P::<*>::: P::::{port}:: # Y:::::::: Y:10:90::100:512000:100.100:100.100: # I::::::: I::{password_field}:::10:: # O::::::: O:*:operpassword:operuser:::: """ class Ircu2Controller(BaseServerController, DirectoryBasedController): binary_name: str services_protocol: str supports_sts = False extban_mute_char = None 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, ) -> None: if valid_metadata_keys or invalid_metadata_keys: raise NotImplementedByController( "Defining valid and invalid METADATA keys." ) if ssl: raise NotImplementedByController("TLS") if run_services: raise NotImplementedByController("Services") assert self.proc is None self.port = port self.hostname = hostname self.create_config() password_field = password if password else "" assert self.directory pidfile = os.path.join(self.directory, "ircd.pid") with self.open_file("server.conf") as fd: fd.write( TEMPLATE_CONFIG.format( hostname=hostname, port=port, password_field=password_field, pidfile=pidfile, ) ) self.proc = subprocess.Popen( [ "ircd", "-s", # no iauth "-p", "on", "-f", os.path.join(self.directory, "server.conf"), ], # stderr=subprocess.DEVNULL, ) def get_irctest_controller_class() -> Type[Ircu2Controller]: return Ircu2Controller