From 507f5b74261c109be39bb357ce2e38f44254ecd6 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Sat, 10 Sep 2022 11:38:29 +0200 Subject: [PATCH] Use pathlib to work with temporary config dirs --- irctest/basecontrollers.py | 22 +++++++++++----------- irctest/controllers/anope_services.py | 11 ++++------- irctest/controllers/atheme_services.py | 5 ++--- irctest/controllers/bahamut.py | 12 ++++++------ irctest/controllers/base_hybrid.py | 5 ++--- irctest/controllers/ergo.py | 10 ++++------ irctest/controllers/inspircd.py | 3 +-- irctest/controllers/irc2.py | 5 ++--- irctest/controllers/ircu2.py | 5 ++--- irctest/controllers/limnoria.py | 5 +---- irctest/controllers/mammon.py | 3 +-- irctest/controllers/ngircd.py | 5 ++--- irctest/controllers/snircd.py | 5 ++--- irctest/controllers/sopel.py | 10 +++++----- irctest/controllers/unrealircd.py | 12 ++++++------ 15 files changed, 51 insertions(+), 67 deletions(-) diff --git a/irctest/basecontrollers.py b/irctest/basecontrollers.py index 4c7c7f9..c2744a3 100644 --- a/irctest/basecontrollers.py +++ b/irctest/basecontrollers.py @@ -2,6 +2,7 @@ from __future__ import annotations import dataclasses import os +from pathlib import Path import shutil import socket import subprocess @@ -87,7 +88,7 @@ class DirectoryBasedController(_BaseController): """Helper for controllers whose software configuration is based on an arbitrary directory.""" - directory: Optional[str] + directory: Optional[Path] def __init__(self, test_config: TestCaseControllerConfig): super().__init__(test_config) @@ -110,22 +111,21 @@ class DirectoryBasedController(_BaseController): """Open a file in the configuration directory.""" assert self.directory if os.sep in name: - dir_ = os.path.join(self.directory, os.path.dirname(name)) - if not os.path.isdir(dir_): - os.makedirs(dir_) - assert os.path.isdir(dir_) - return open(os.path.join(self.directory, name), mode) + dir_ = self.directory / os.path.dirname(name) + dir_.mkdir(parents=True, exist_ok=True) + assert dir_.is_dir() + return (self.directory / name).open(mode) def create_config(self) -> None: if not self.directory: - self.directory = tempfile.mkdtemp() + self.directory = Path(tempfile.mkdtemp()) def gen_ssl(self) -> None: assert self.directory - self.csr_path = os.path.join(self.directory, "ssl.csr") - self.key_path = os.path.join(self.directory, "ssl.key") - self.pem_path = os.path.join(self.directory, "ssl.pem") - self.dh_path = os.path.join(self.directory, "dh.pem") + self.csr_path = self.directory / "ssl.csr" + self.key_path = self.directory / "ssl.key" + self.pem_path = self.directory / "ssl.pem" + self.dh_path = self.directory / "dh.pem" subprocess.check_output( [ self.openssl_bin, diff --git a/irctest/controllers/anope_services.py b/irctest/controllers/anope_services.py index e25e88d..bf577bf 100644 --- a/irctest/controllers/anope_services.py +++ b/irctest/controllers/anope_services.py @@ -1,4 +1,4 @@ -import os +from pathlib import Path import shutil import subprocess from typing import Type @@ -101,14 +101,11 @@ class AnopeController(BaseServicesController, DirectoryBasedController): pass assert self.directory + services_path = shutil.which("services") + assert services_path # 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.directory / "lib").symlink_to(Path(services_path).parent.parent / "lib") self.proc = subprocess.Popen( [ diff --git a/irctest/controllers/atheme_services.py b/irctest/controllers/atheme_services.py index 485d6d7..aa9ec22 100644 --- a/irctest/controllers/atheme_services.py +++ b/irctest/controllers/atheme_services.py @@ -1,4 +1,3 @@ -import os import subprocess from typing import Optional, Type @@ -81,11 +80,11 @@ class AthemeController(BaseServicesController, DirectoryBasedController): "atheme-services", "-n", # don't fork "-c", - os.path.join(self.directory, "services.conf"), + self.directory / "services.conf", "-l", f"/tmp/services-{server_port}.log", "-p", - os.path.join(self.directory, "services.pid"), + self.directory / "services.pid", "-D", self.directory, ], diff --git a/irctest/controllers/bahamut.py b/irctest/controllers/bahamut.py index 315c73d..2f187ab 100644 --- a/irctest/controllers/bahamut.py +++ b/irctest/controllers/bahamut.py @@ -1,4 +1,4 @@ -import os +from pathlib import Path import shutil import subprocess from typing import Optional, Set, Type @@ -80,7 +80,7 @@ oper {{ """ -def initialize_entropy(directory: str) -> None: +def initialize_entropy(directory: Path) -> None: # https://github.com/DALnet/bahamut/blob/7fc039d403f66a954225c5dc4ad1fe683aedd794/include/dh.h#L35-L38 nb_rand_bytes = 512 // 8 # https://github.com/DALnet/bahamut/blob/7fc039d403f66a954225c5dc4ad1fe683aedd794/src/dh.c#L186 @@ -89,7 +89,7 @@ def initialize_entropy(directory: str) -> None: # Not actually random; but we don't care. entropy = b"\x00" * entropy_file_size - with open(os.path.join(directory, ".ircd.entropy"), "wb") as fd: + with (directory / ".ircd.entropy").open("wb") as fd: fd.write(entropy) @@ -140,8 +140,8 @@ class BahamutController(BaseServerController, DirectoryBasedController): initialize_entropy(self.directory) # they are hardcoded... thankfully Bahamut reads them from the CWD. - shutil.copy(self.pem_path, os.path.join(self.directory, "ircd.crt")) - shutil.copy(self.key_path, os.path.join(self.directory, "ircd.key")) + shutil.copy(self.pem_path, self.directory / "ircd.crt") + shutil.copy(self.key_path, self.directory / "ircd.key") with self.open_file("server.conf") as fd: fd.write( @@ -168,7 +168,7 @@ class BahamutController(BaseServerController, DirectoryBasedController): "ircd", "-t", # don't fork "-f", - os.path.join(self.directory, "server.conf"), + self.directory / "server.conf", ], ) diff --git a/irctest/controllers/base_hybrid.py b/irctest/controllers/base_hybrid.py index e2c0418..79897ed 100644 --- a/irctest/controllers/base_hybrid.py +++ b/irctest/controllers/base_hybrid.py @@ -1,4 +1,3 @@ -import os import shutil import subprocess from typing import Optional, Set @@ -88,9 +87,9 @@ class BaseHybridController(BaseServerController, DirectoryBasedController): self.binary_name, "-foreground", "-configfile", - os.path.join(self.directory, "server.conf"), + self.directory / "server.conf", "-pidfile", - os.path.join(self.directory, "server.pid"), + self.directory / "server.pid", ], # stderr=subprocess.DEVNULL, ) diff --git a/irctest/controllers/ergo.py b/irctest/controllers/ergo.py index 3878e7b..6157712 100644 --- a/irctest/controllers/ergo.py +++ b/irctest/controllers/ergo.py @@ -185,21 +185,19 @@ class ErgoController(BaseServerController, DirectoryBasedController): bind_address = "127.0.0.1:%s" % (port,) listener_conf = None # plaintext if ssl: - self.key_path = os.path.join(self.directory, "ssl.key") - self.pem_path = os.path.join(self.directory, "ssl.pem") + self.key_path = self.directory / "ssl.key" + self.pem_path = self.directory / "ssl.pem" listener_conf = {"tls": {"cert": self.pem_path, "key": self.key_path}} config["server"]["listeners"][bind_address] = listener_conf # type: ignore - config["datastore"]["path"] = os.path.join( # type: ignore - self.directory, "ircd.db" - ) + config["datastore"]["path"] = str(self.directory / "ircd.db") # type: ignore if password is not None: config["server"]["password"] = hash_password(password) # type: ignore assert self.proc is None - self._config_path = os.path.join(self.directory, "server.yml") + self._config_path = self.directory / "server.yml" self._config = config self._write_config() subprocess.call(["ergo", "initdb", "--conf", self._config_path, "--quiet"]) diff --git a/irctest/controllers/inspircd.py b/irctest/controllers/inspircd.py index 75e2a69..a2db87c 100644 --- a/irctest/controllers/inspircd.py +++ b/irctest/controllers/inspircd.py @@ -1,4 +1,3 @@ -import os import shutil import subprocess from typing import Optional, Set, Type @@ -164,7 +163,7 @@ class InspircdController(BaseServerController, DirectoryBasedController): "inspircd", "--nofork", "--config", - os.path.join(self.directory, "server.conf"), + self.directory / "server.conf", ], stdout=subprocess.DEVNULL, ) diff --git a/irctest/controllers/irc2.py b/irctest/controllers/irc2.py index 69a5fb0..26cd37c 100644 --- a/irctest/controllers/irc2.py +++ b/irctest/controllers/irc2.py @@ -1,4 +1,3 @@ -import os import shutil import subprocess from typing import Optional, Set, Type @@ -68,7 +67,7 @@ class Irc2Controller(BaseServerController, DirectoryBasedController): self.create_config() password_field = password if password else "" assert self.directory - pidfile = os.path.join(self.directory, "ircd.pid") + pidfile = self.directory / "ircd.pid" with self.open_file("server.conf") as fd: fd.write( TEMPLATE_CONFIG.format( @@ -93,7 +92,7 @@ class Irc2Controller(BaseServerController, DirectoryBasedController): "-p", "on", "-f", - os.path.join(self.directory, "server.conf"), + self.directory / "server.conf", ], # stderr=subprocess.DEVNULL, ) diff --git a/irctest/controllers/ircu2.py b/irctest/controllers/ircu2.py index 2be36f7..e574a9c 100644 --- a/irctest/controllers/ircu2.py +++ b/irctest/controllers/ircu2.py @@ -1,4 +1,3 @@ -import os import shutil import subprocess from typing import Optional, Set, Type @@ -87,7 +86,7 @@ class Ircu2Controller(BaseServerController, DirectoryBasedController): self.create_config() password_field = 'password = "{}";'.format(password) if password else "" assert self.directory - pidfile = os.path.join(self.directory, "ircd.pid") + pidfile = self.directory / "ircd.pid" with self.open_file("server.conf") as fd: fd.write( TEMPLATE_CONFIG.format( @@ -110,7 +109,7 @@ class Ircu2Controller(BaseServerController, DirectoryBasedController): "ircd", "-n", # don't detach "-f", - os.path.join(self.directory, "server.conf"), + self.directory / "server.conf", "-x", "DEBUG", ], diff --git a/irctest/controllers/limnoria.py b/irctest/controllers/limnoria.py index 5b38e21..b56c921 100644 --- a/irctest/controllers/limnoria.py +++ b/irctest/controllers/limnoria.py @@ -1,4 +1,3 @@ -import os import subprocess from typing import Optional, Type @@ -85,9 +84,7 @@ class LimnoriaController(BaseClientController, DirectoryBasedController): ) ) assert self.directory - self.proc = subprocess.Popen( - ["supybot", os.path.join(self.directory, "bot.conf")] - ) + self.proc = subprocess.Popen(["supybot", self.directory / "bot.conf"]) def get_irctest_controller_class() -> Type[LimnoriaController]: diff --git a/irctest/controllers/mammon.py b/irctest/controllers/mammon.py index 591347e..04f59f7 100644 --- a/irctest/controllers/mammon.py +++ b/irctest/controllers/mammon.py @@ -1,4 +1,3 @@ -import os import shutil import subprocess from typing import Optional, Set, Type @@ -128,7 +127,7 @@ class MammonController(BaseServerController, DirectoryBasedController): "mammond", "--nofork", # '--debug', "--config", - os.path.join(self.directory, "server.yml"), + self.directory / "server.yml", ] ) diff --git a/irctest/controllers/ngircd.py b/irctest/controllers/ngircd.py index 50577dd..be42b16 100644 --- a/irctest/controllers/ngircd.py +++ b/irctest/controllers/ngircd.py @@ -1,4 +1,3 @@ -import os import shutil import subprocess from typing import Optional, Set, Type @@ -94,7 +93,7 @@ class NgircdController(BaseServerController, DirectoryBasedController): password_field=password_field, key_path=self.key_path, pem_path=self.pem_path, - empty_file=os.path.join(self.directory, "empty.txt"), + empty_file=self.directory / "empty.txt", ) ) @@ -110,7 +109,7 @@ class NgircdController(BaseServerController, DirectoryBasedController): "ngircd", "--nodaemon", "--config", - os.path.join(self.directory, "server.conf"), + self.directory / "server.conf", ], # stdout=subprocess.DEVNULL, ) diff --git a/irctest/controllers/snircd.py b/irctest/controllers/snircd.py index 2edb85c..f49a347 100644 --- a/irctest/controllers/snircd.py +++ b/irctest/controllers/snircd.py @@ -1,4 +1,3 @@ -import os import shutil import subprocess from typing import Optional, Set, Type @@ -86,7 +85,7 @@ class SnircdController(BaseServerController, DirectoryBasedController): self.create_config() password_field = 'password = "{}";'.format(password) if password else "" assert self.directory - pidfile = os.path.join(self.directory, "ircd.pid") + pidfile = self.directory / "ircd.pid" with self.open_file("server.conf") as fd: fd.write( TEMPLATE_CONFIG.format( @@ -109,7 +108,7 @@ class SnircdController(BaseServerController, DirectoryBasedController): "ircd", "-n", # don't detach "-f", - os.path.join(self.directory, "server.conf"), + self.directory / "server.conf", "-x", "DEBUG", ], diff --git a/irctest/controllers/sopel.py b/irctest/controllers/sopel.py index 7304315..ce5aa3b 100644 --- a/irctest/controllers/sopel.py +++ b/irctest/controllers/sopel.py @@ -1,4 +1,4 @@ -import os +from pathlib import Path import subprocess import tempfile from typing import Optional, TextIO, Type, cast @@ -38,14 +38,14 @@ class SopelController(BaseClientController): super().kill() if self.filename: try: - os.unlink(os.path.join(os.path.expanduser("~/.sopel/"), self.filename)) + (Path("~/.sopel/").expanduser() / self.filename).unlink() except OSError: #  File does not exist pass def open_file(self, filename: str, mode: str = "a") -> TextIO: - dir_path = os.path.expanduser("~/.sopel/") - os.makedirs(dir_path, exist_ok=True) - return cast(TextIO, open(os.path.join(dir_path, filename), mode)) + dir_path = Path("~/.sopel/").expanduser() + dir_path.mkdir(parents=True, exist_ok=True) + return cast(TextIO, (dir_path / filename).open(mode)) def create_config(self) -> None: with self.open_file(self.filename): diff --git a/irctest/controllers/unrealircd.py b/irctest/controllers/unrealircd.py index edf9cfb..51275f2 100644 --- a/irctest/controllers/unrealircd.py +++ b/irctest/controllers/unrealircd.py @@ -5,7 +5,7 @@ import shutil import signal import subprocess import textwrap -from typing import Optional, Set, Type +from typing import List, Optional, Set, Type, Union from irctest.basecontrollers import ( BaseServerController, @@ -222,20 +222,20 @@ class UnrealircdController(BaseServerController, DirectoryBasedController): password_field=password_field, key_path=self.key_path, pem_path=self.pem_path, - empty_file=os.path.join(self.directory, "empty.txt"), + empty_file=self.directory / "empty.txt", extras=extras, set_extras=set_extras, ) ) - proot_cmd = [] + proot_cmd: List[Union[str, pathlib.Path]] = [] self.using_proot = False if shutil.which("proot"): unrealircd_path = shutil.which("unrealircd") if unrealircd_path: unrealircd_prefix = pathlib.Path(unrealircd_path).parents[1] - tmpdir = os.path.join(self.directory, "tmp") - os.mkdir(tmpdir) + tmpdir = self.directory / "tmp" + tmpdir.mkdir() # Unreal cleans its tmp/ directory after each run, which prevents # multiple processes from running at the same time. # Using PRoot, we can isolate them, with a tmp/ directory for each @@ -258,7 +258,7 @@ class UnrealircdController(BaseServerController, DirectoryBasedController): "-t", "-F", # BOOT_NOFORK "-f", - os.path.join(self.directory, "unrealircd.conf"), + self.directory / "unrealircd.conf", ], # stdout=subprocess.DEVNULL, )