irctest/irctest/controllers/anope_services.py

119 lines
2.7 KiB
Python

import os
import shutil
import subprocess
from typing import Type
from irctest.basecontrollers import BaseServicesController, DirectoryBasedController
TEMPLATE_CONFIG = """
serverinfo {{
name = "services.example.org"
description = "Anope IRC Services"
numeric = "00A"
pid = "services.pid"
motd = "conf/empty_file"
}}
uplink {{
host = "{server_hostname}"
port = {server_port}
password = "password"
}}
module {{
name = "{protocol}"
}}
networkinfo {{
networkname = "testnet"
nicklen = 31
userlen = 10
hostlen = 64
chanlen = 32
}}
mail {{
usemail = no
}}
service {{
nick = "NickServ"
user = "services"
host = "services.host"
gecos = "Nickname Registration Service"
}}
module {{
name = "nickserv"
client = "NickServ"
forceemail = no
passlen = 1000 # Some tests need long passwords
}}
command {{ service = "NickServ"; name = "HELP"; command = "generic/help"; }}
module {{
name = "ns_register"
registration = "none"
}}
command {{ service = "NickServ"; name = "REGISTER"; command = "nickserv/register"; }}
options {{
casemap = "ascii"
readtimeout = 5s
warningtimeout = 4h
}}
module {{ name = "m_sasl" }}
module {{ name = "enc_sha256" }}
module {{ name = "ns_cert" }}
"""
class AnopeController(BaseServicesController, DirectoryBasedController):
"""Collaborator for server controllers that rely on Anope"""
def run(self, protocol: str, server_hostname: str, server_port: int) -> None:
self.create_config()
assert protocol in ("inspircd3", "charybdis", "hybrid", "plexus", "unreal4")
with self.open_file("conf/services.conf") as fd:
fd.write(
TEMPLATE_CONFIG.format(
protocol=protocol,
server_hostname=server_hostname,
server_port=server_port,
)
)
with self.open_file("conf/empty_file") as fd:
pass
assert self.directory
# Config and code need to be in the same directory, *obviously*
os.symlink(
os.path.join(
os.path.dirname(shutil.which("services")), "..", "lib" # type: ignore
),
os.path.join(self.directory, "lib"),
)
self.proc = subprocess.Popen(
[
"services",
"-n", # don't fork
"--config=services.conf", # can't be an absolute path
# "--logdir",
# f"/tmp/services-{server_port}.log",
],
cwd=self.directory,
# stdout=subprocess.DEVNULL,
# stderr=subprocess.DEVNULL,
)
def get_irctest_controller_class() -> Type[AnopeController]:
return AnopeController