diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 6b94add..20c200b 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -8,6 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +* Add support for `/etc/snac/snac.conf` to control which modules are configured + ## [3.0.0] - 2025-09-18 Release corresponding to the LV 2025Q4 / NILRT 11.3 release. diff --git a/nilrt_snac/__main__.py b/nilrt_snac/__main__.py index 2dbf31d..ad5c395 100644 --- a/nilrt_snac/__main__.py +++ b/nilrt_snac/__main__.py @@ -3,18 +3,17 @@ import argparse import logging import sys -from typing import List, Optional +import configparser +from pathlib import Path +from typing import Dict, List, Optional from nilrt_snac._pre_reqs import verify_prereqs from nilrt_snac.opkg import opkg_helper from nilrt_snac._configs import CONFIGS - - from nilrt_snac import Errors, logger, SNACError, __version__ PROG_NAME = "nilrt-snac" -VERSION_DESCRIPTION = \ -f"""\ +VERSION_DESCRIPTION = f"""\ nilrt-snac {__version__} Copyright (C) 2024 NI (Emerson Electric) License MIT: MIT License @@ -23,6 +22,38 @@ """ +def _get_enabled_modules(config_file_path: Path = Path("/etc/snac/snac.conf")) -> Dict[str, bool]: + """Read the config file and return a dict of module enabled states. Strict validation and error reporting.""" + enabled_modules: Dict[str, bool] = {} + valid_names = {c.name for c in CONFIGS} + if config_file_path.exists(): + parser = configparser.ConfigParser() + try: + parser.read(str(config_file_path)) + except (configparser.MissingSectionHeaderError, configparser.ParsingError) as e: + raise SNACError(f"Malformed config file: {config_file_path}", Errors.EX_USAGE) + if not parser.has_section("modules"): + logger.warning( + f"Config file {config_file_path} missing [modules] section. All modules will be enabled." + ) + return enabled_modules + for name, value in parser.items("modules"): + key = name.strip().lower() + val = value.strip().lower() + if key not in valid_names: + raise SNACError( + f"Unknown module name '{key}' in config file: {config_file_path}. Valid names: {sorted(valid_names)}", + Errors.EX_USAGE, + ) + if val not in ("enabled", "disabled"): + raise SNACError( + f"Invalid value for module '{key}' in config file: '{value}'. Must be 'enabled' or 'disabled'.", + Errors.EX_USAGE, + ) + enabled_modules[key] = val == "enabled" + return enabled_modules + + def _configure(args: argparse.Namespace) -> int: """Configure SNAC mode.""" logger.warning("!! Running this tool will irreversibly alter the state of your system. !!") @@ -38,7 +69,15 @@ def _configure(args: argparse.Namespace) -> int: print("Configuring SNAC mode.") opkg_helper.update() + + # Read /etc/snac/snac.conf for module enable/disable + enabled_modules = _get_enabled_modules() + for config in CONFIGS: + enabled = enabled_modules.get(config.name, True) + if not enabled: + logger.info(f"Skipping configuration for: {config.name} (disabled in config file)") + continue config.configure(args) print("!! A reboot is now required to affect your system configuration. !!") @@ -51,7 +90,15 @@ def _verify(args: argparse.Namespace) -> int: """Configure SNAC mode.""" print("Validating SNAC mode.") valid = True + + # Read /etc/snac/snac.conf for module enable/disable + enabled_modules = _get_enabled_modules() + for config in CONFIGS: + enabled = enabled_modules.get(config.name, True) + if not enabled: + logger.info(f"Skipping verification for: {config.name} (disabled in config file)") + continue new_valid = config.verify(args) valid = valid and new_valid @@ -139,7 +186,7 @@ def main( # noqa: D103 - Missing docstring in public function (auto-generated n if args.cmd is None: logger.error("Command required: {configure, verify}, see --help for more information.") return Errors.EX_USAGE - + try: if not args.dry_run: verify_prereqs() @@ -150,5 +197,6 @@ def main( # noqa: D103 - Missing docstring in public function (auto-generated n return ret_val + if __name__ == "__main__": sys.exit(main(sys.argv)) diff --git a/nilrt_snac/_configs/_auditd_config.py b/nilrt_snac/_configs/_auditd_config.py index 0320ac6..a4cf40c 100644 --- a/nilrt_snac/_configs/_auditd_config.py +++ b/nilrt_snac/_configs/_auditd_config.py @@ -12,6 +12,7 @@ from nilrt_snac._configs._config_file import EqualsDelimitedConfigFile, _ConfigFile from nilrt_snac.opkg import opkg_helper + def ensure_groups_exist(groups: List[str]) -> None: "Ensures the specified groups exist on the system." for group in groups: @@ -21,8 +22,10 @@ def ensure_groups_exist(groups: List[str]) -> None: _cmd("groupadd", group) logger.info(f"Group {group} created.") + def format_email_template_text(audit_email: str) -> str: - return textwrap.dedent("""\ + return textwrap.dedent( + """\ #!/usr/bin/perl use strict; use warnings; @@ -60,19 +63,22 @@ def format_email_template_text(audit_email: str) -> str: $smtp->dataend() or die "Error ending data: $!"; $smtp->quit; - """).format(audit_email=audit_email) + """ + ).format(audit_email=audit_email) + def is_valid_email(email: str) -> bool: "Validates an email address." - email_regex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+$' + email_regex = r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+$" return re.match(email_regex, email) is not None class _AuditdConfig(_BaseConfig): def __init__(self): + super().__init__("auditd") self._opkg_helper = opkg_helper - self.log_path = os.path.realpath('/var/log') - self.audit_config_path = '/etc/audit/auditd.conf' + self.log_path = os.path.realpath("/var/log") + self.audit_config_path = "/etc/audit/auditd.conf" def configure(self, args: argparse.Namespace) -> None: print("Configuring auditd...") @@ -82,7 +88,7 @@ def configure(self, args: argparse.Namespace) -> None: if not self._opkg_helper.is_installed("auditd"): self._opkg_helper.install("auditd") - #Ensure proper groups exist + # Ensure proper groups exist groups_required = ["adm", "sudo"] ensure_groups_exist(groups_required) @@ -100,7 +106,9 @@ def configure(self, args: argparse.Namespace) -> None: audit_email = f"root@{socket.gethostname()}" if is_valid_email(audit_email): - auditd_config_file.update(r'^action_mail_acct\s*=.*$', f'action_mail_acct = {audit_email}') + auditd_config_file.update( + r"^action_mail_acct\s*=.*$", f"action_mail_acct = {audit_email}" + ) # Install recommended SMTP package dependency if not self._opkg_helper.is_installed("perl-module-net-smtp"): @@ -111,7 +119,7 @@ def configure(self, args: argparse.Namespace) -> None: self._opkg_helper.install("audispd-plugins") # Create template audit rule script to send email alerts - audit_rule_script_path = '/etc/audit/audit_email_alert.pl' + audit_rule_script_path = "/etc/audit/audit_email_alert.pl" if not os.path.exists(audit_rule_script_path): audit_rule_script = format_email_template_text(audit_email) @@ -121,14 +129,16 @@ def configure(self, args: argparse.Namespace) -> None: # Set the appropriate permissions _cmd("chmod", "700", audit_rule_script_path) - audit_email_conf_path = '/etc/audit/plugins.d/audit_email_alert.conf' + audit_email_conf_path = "/etc/audit/plugins.d/audit_email_alert.conf" if not os.path.exists(audit_email_conf_path): - audit_email_config = textwrap.dedent("""\ + audit_email_config = textwrap.dedent( + """\ active = yes direction = out path = {audit_rule_script_path} type = always - """).format(audit_rule_script_path=audit_rule_script_path) + """ + ).format(audit_rule_script_path=audit_rule_script_path) with open(audit_email_conf_path, "w") as file: file.write(audit_email_config) @@ -150,15 +160,17 @@ def configure(self, args: argparse.Namespace) -> None: _cmd("/etc/init.d/auditd", "restart") # Set the appropriate permissions to allow only root and the 'adm' group to write/read - init_log_permissions_path = '/etc/init.d/set_log_permissions.sh' + init_log_permissions_path = "/etc/init.d/set_log_permissions.sh" if not os.path.exists(init_log_permissions_path) and not dry_run: - init_log_permissions_script = textwrap.dedent("""\ + init_log_permissions_script = textwrap.dedent( + """\ #!/bin/sh chmod 770 {log_path} chown root:adm {log_path} setfacl -d -m g:adm:rwx {log_path} setfacl -d -m o::0 {log_path} - """).format(log_path=self.log_path) + """ + ).format(log_path=self.log_path) with open(init_log_permissions_path, "w") as file: file.write(init_log_permissions_script) @@ -169,7 +181,6 @@ def configure(self, args: argparse.Namespace) -> None: # Schedule the script to run at start _cmd(*"update-rc.d set_log_permissions.sh start 3 S .".split()) - def verify(self, args: argparse.Namespace) -> bool: print("Verifying auditd configuration...") valid: bool = True diff --git a/nilrt_snac/_configs/_base_config.py b/nilrt_snac/_configs/_base_config.py index 2adb61a..e3c12c1 100644 --- a/nilrt_snac/_configs/_base_config.py +++ b/nilrt_snac/_configs/_base_config.py @@ -4,6 +4,9 @@ class _BaseConfig(ABC): + def __init__(self, name: str): + self.name = name + @abstractmethod def configure(self, args: argparse.Namespace) -> None: raise NotImplementedError diff --git a/nilrt_snac/_configs/_console_config.py b/nilrt_snac/_configs/_console_config.py index 4dedcea..5689014 100644 --- a/nilrt_snac/_configs/_console_config.py +++ b/nilrt_snac/_configs/_console_config.py @@ -9,7 +9,7 @@ class _ConsoleConfig(_BaseConfig): def __init__(self): - pass # Nothing to do for now + super().__init__("console") def configure(self, args: argparse.Namespace) -> None: print("Deconfiguring console access...") diff --git a/nilrt_snac/_configs/_cryptsetup_config.py b/nilrt_snac/_configs/_cryptsetup_config.py index 61e33f1..552249e 100644 --- a/nilrt_snac/_configs/_cryptsetup_config.py +++ b/nilrt_snac/_configs/_cryptsetup_config.py @@ -8,6 +8,7 @@ class _CryptSetupConfig(_BaseConfig): def __init__(self): + super().__init__("cryptsetup") self._opkg_helper = opkg_helper def configure(self, args: argparse.Namespace) -> None: diff --git a/nilrt_snac/_configs/_faillock_config.py b/nilrt_snac/_configs/_faillock_config.py index a42af9c..f37fa3c 100644 --- a/nilrt_snac/_configs/_faillock_config.py +++ b/nilrt_snac/_configs/_faillock_config.py @@ -8,6 +8,7 @@ class _FaillockConfig(_BaseConfig): def __init__(self): + super().__init__("faillock") self._opkg_helper = opkg_helper def configure(self, args: argparse.Namespace) -> None: diff --git a/nilrt_snac/_configs/_firewall_config.py b/nilrt_snac/_configs/_firewall_config.py index d928574..b5973d0 100644 --- a/nilrt_snac/_configs/_firewall_config.py +++ b/nilrt_snac/_configs/_firewall_config.py @@ -6,31 +6,33 @@ from nilrt_snac import logger from nilrt_snac.opkg import opkg_helper + def _cmd(*args: str): "Syntactic sugar for firewall-cmd -q." subprocess.run(["firewall-cmd", "-q"] + list(args), check=True) + def _offlinecmd(*args: str): "Syntactic sugar for firewall-offline-cmd -q." subprocess.run(["firewall-offline-cmd", "-q"] + list(args), check=True) + def _check_target(policy: str, expected: str = "REJECT") -> bool: "Verifies firewall-cmd --policy=POLICY --get-target matches what is expected." - actual: str = subprocess.getoutput( - f"firewall-cmd --permanent --policy={policy} --get-target") + actual: str = subprocess.getoutput(f"firewall-cmd --permanent --policy={policy} --get-target") if expected == actual: return True logger.error(f"ERROR: policy {policy} target: expected {expected}, observed {actual}") return False + def _check_service(Q: str, service: str, expected: str = "yes") -> bool: """Verifies firewall-cmd (--policy=POLICY/--zone=ZONE/etc.) --query-service=SERVICE matches what is expected. """ - actual: str = subprocess.getoutput( - f"firewall-cmd --permanent {Q} --query-service={service}") + actual: str = subprocess.getoutput(f"firewall-cmd --permanent {Q} --query-service={service}") if expected == actual: return True logger.error(f"ERROR: {Q} service {service}: expected {expected}, observed {actual}") @@ -42,8 +44,7 @@ def _check_service_info(service: str, Q: str, expected: str) -> bool: matches what is expected. """ - actual: str = subprocess.getoutput( - f"firewall-cmd --permanent --service={service} {Q}") + actual: str = subprocess.getoutput(f"firewall-cmd --permanent --service={service} {Q}") if expected == actual: return True logger.error(f"ERROR: service {service} {Q}: expected {expected}, observed {actual}") @@ -52,6 +53,7 @@ def _check_service_info(service: str, Q: str, expected: str) -> bool: class _FirewallConfig(_BaseConfig): def __init__(self): + super().__init__("firewall") self._opkg_helper = opkg_helper def configure(self, args: argparse.Namespace) -> None: @@ -77,23 +79,25 @@ def configure(self, args: argparse.Namespace) -> None: _offlinecmd("--policy=work-in", "--add-egress-zone=HOST") _offlinecmd("--policy=work-in", "--add-protocol=icmp") _offlinecmd("--policy=work-in", "--add-protocol=ipv6-icmp") - _offlinecmd("--policy=work-in", - "--add-service=ssh", - "--add-service=mdns", - ) + _offlinecmd( + "--policy=work-in", + "--add-service=ssh", + "--add-service=mdns", + ) _offlinecmd("--new-policy=work-out") _offlinecmd("--policy=work-out", "--add-ingress-zone=HOST") _offlinecmd("--policy=work-out", "--add-egress-zone=work") _offlinecmd("--policy=work-out", "--add-protocol=icmp") _offlinecmd("--policy=work-out", "--add-protocol=ipv6-icmp") - _offlinecmd("--policy=work-out", - "--add-service=ssh", - "--add-service=http", - "--add-service=https", - "--add-service=syslog", - "--add-service=ni-logos-xt", - ) + _offlinecmd( + "--policy=work-out", + "--add-service=ssh", + "--add-service=http", + "--add-service=https", + "--add-service=syslog", + "--add-service=ni-logos-xt", + ) _offlinecmd("--policy=work-out", "--set-target=REJECT") _offlinecmd("--new-policy=public-in") @@ -101,43 +105,48 @@ def configure(self, args: argparse.Namespace) -> None: _offlinecmd("--policy=public-in", "--add-egress-zone=HOST") _offlinecmd("--policy=public-in", "--add-protocol=icmp") _offlinecmd("--policy=public-in", "--add-protocol=ipv6-icmp") - _offlinecmd("--policy=public-in", - "--add-service=ssh", - "--add-service=wireguard", - ) + _offlinecmd( + "--policy=public-in", + "--add-service=ssh", + "--add-service=wireguard", + ) _offlinecmd("--new-policy=public-out") _offlinecmd("--policy=public-out", "--add-ingress-zone=HOST") _offlinecmd("--policy=public-out", "--add-egress-zone=public") - _offlinecmd("--policy=public-out", "--add-protocol=icmp") - _offlinecmd("--policy=public-out", "--add-protocol=ipv6-icmp") - _offlinecmd("--policy=public-out", - "--add-service=dhcp", - "--add-service=dhcpv6", - "--add-service=http", - "--add-service=https", - "--add-service=wireguard", - "--add-service=dns", - "--add-service=ntp", - ) + _offlinecmd("--policy=public-out", "--add-protocol=icmp") + _offlinecmd("--policy=public-out", "--add-protocol=ipv6-icmp") + _offlinecmd( + "--policy=public-out", + "--add-service=dhcp", + "--add-service=dhcpv6", + "--add-service=http", + "--add-service=https", + "--add-service=wireguard", + "--add-service=dns", + "--add-service=ntp", + ) _offlinecmd("--policy=public-out", "--set-target=REJECT") - _offlinecmd("--policy=work-in", - "--add-service=ni-labview-realtime", - "--add-service=ni-labview-viserver", - "--add-service=ni-logos-xt", - "--add-service=ni-mxs", - "--add-service=ni-rpc-server", - "--add-service=ni-service-locator", - ) - _offlinecmd("--policy=work-in", - # Temporary port add; see x-niroco-static-port.ini - "--add-port=55184/tcp", - ) - _offlinecmd("--policy=work-out", - "--add-service=amqp", - "--add-service=salt-master", - ) + _offlinecmd( + "--policy=work-in", + "--add-service=ni-labview-realtime", + "--add-service=ni-labview-viserver", + "--add-service=ni-logos-xt", + "--add-service=ni-mxs", + "--add-service=ni-rpc-server", + "--add-service=ni-service-locator", + ) + _offlinecmd( + "--policy=work-in", + # Temporary port add; see x-niroco-static-port.ini + "--add-port=55184/tcp", + ) + _offlinecmd( + "--policy=work-out", + "--add-service=amqp", + "--add-service=salt-master", + ) _cmd("--reload") @@ -157,15 +166,17 @@ def verify(self, args: argparse.Namespace) -> bool: logger.error(f"MISSING: firewall-cmd") valid = False - valid = all([ - _check_target("work-in", "CONTINUE"), - _check_target("work-out"), - _check_target("public-in", "CONTINUE"), - _check_target("public-out"), - _check_service("--policy=work-in", "ni-labview-realtime"), - _check_service("--policy=public-in", "ni-labview-realtime", "no"), - _check_service("--zone=public", "ni-labview-realtime", "no"), - _check_service_info("ni-labview-realtime", "--get-ports", "3079/tcp"), - ]) + valid = all( + [ + _check_target("work-in", "CONTINUE"), + _check_target("work-out"), + _check_target("public-in", "CONTINUE"), + _check_target("public-out"), + _check_service("--policy=work-in", "ni-labview-realtime"), + _check_service("--policy=public-in", "ni-labview-realtime", "no"), + _check_service("--zone=public", "ni-labview-realtime", "no"), + _check_service_info("ni-labview-realtime", "--get-ports", "3079/tcp"), + ] + ) return valid diff --git a/nilrt_snac/_configs/_graphical_config.py b/nilrt_snac/_configs/_graphical_config.py index db5623e..4f34d11 100644 --- a/nilrt_snac/_configs/_graphical_config.py +++ b/nilrt_snac/_configs/_graphical_config.py @@ -10,6 +10,9 @@ class _GraphicalConfig(_BaseConfig): """The graphical configuration for SNAC is to deconfigure the X11, embedded UI, and other components that are useful only when using the graphical UI.""" + def __init__(self): + super().__init__("graphical") + def configure(self, args: Namespace) -> None: print("Deconfiguring the graphical UI...") if not args.dry_run: diff --git a/nilrt_snac/_configs/_niauth_config.py b/nilrt_snac/_configs/_niauth_config.py index ae63d48..b92a77f 100644 --- a/nilrt_snac/_configs/_niauth_config.py +++ b/nilrt_snac/_configs/_niauth_config.py @@ -9,6 +9,7 @@ class _NIAuthConfig(_BaseConfig): def __init__(self): + super().__init__("niauth") self._opkg_helper = opkg_helper def configure(self, args: argparse.Namespace) -> None: diff --git a/nilrt_snac/_configs/_ntp_config.py b/nilrt_snac/_configs/_ntp_config.py index 1d89d2f..c0cf8ae 100644 --- a/nilrt_snac/_configs/_ntp_config.py +++ b/nilrt_snac/_configs/_ntp_config.py @@ -10,6 +10,7 @@ class _NTPConfig(_BaseConfig): def __init__(self): + super().__init__("ntp") self._opkg_helper = opkg_helper def configure(self, args: argparse.Namespace) -> None: diff --git a/nilrt_snac/_configs/_opkg_config.py b/nilrt_snac/_configs/_opkg_config.py index f3c0d8d..e1af357 100644 --- a/nilrt_snac/_configs/_opkg_config.py +++ b/nilrt_snac/_configs/_opkg_config.py @@ -12,6 +12,7 @@ class _OPKGConfig(_BaseConfig): def __init__(self): + super().__init__("opkg") self._opkg_helper = opkg_helper def configure(self, args: argparse.Namespace) -> None: diff --git a/nilrt_snac/_configs/_pwquality_config.py b/nilrt_snac/_configs/_pwquality_config.py index 9aa3a4e..b027a1f 100644 --- a/nilrt_snac/_configs/_pwquality_config.py +++ b/nilrt_snac/_configs/_pwquality_config.py @@ -10,11 +10,12 @@ class _PWQualityConfig(_BaseConfig): def __init__(self): + super().__init__("pwquality") self._opkg_helper = opkg_helper def configure(self, args: argparse.Namespace) -> None: print("Configuring Password quality...") - opasswd_file = _ConfigFile("/etc/security/opasswd") # contains password history + opasswd_file = _ConfigFile("/etc/security/opasswd") # contains password history config_file = _ConfigFile("/etc/pam.d/common-password") dry_run: bool = args.dry_run self._opkg_helper.install("libpwquality") @@ -31,7 +32,7 @@ def configure(self, args: argparse.Namespace) -> None: # check for password complexity password requisite pam_pwquality.so retry=3 \1""" - ) + ), ) config_file.save(dry_run) diff --git a/nilrt_snac/_configs/_ssh_config.py b/nilrt_snac/_configs/_ssh_config.py index 27da31e..41eef97 100644 --- a/nilrt_snac/_configs/_ssh_config.py +++ b/nilrt_snac/_configs/_ssh_config.py @@ -8,6 +8,7 @@ class _SshConfig(_BaseConfig): def __init__(self): + super().__init__("ssh") self.ssh_config_path = "/etc/ssh/sshd_config" self.tmout_config_path = "/etc/profile.d/tmout.sh" self.client_alive_interval = "ClientAliveInterval 15" @@ -39,7 +40,6 @@ def configure(self, args: argparse.Namespace) -> None: tmout_config_file.add(self.tmout) tmout_config_file.save(dry_run) - def verify(self, args: argparse.Namespace) -> bool: print("Verifying ssh configuration...") sshd_config_file = _ConfigFile("/etc/ssh/sshd_config") diff --git a/nilrt_snac/_configs/_sudo_config.py b/nilrt_snac/_configs/_sudo_config.py index b002459..e501e93 100644 --- a/nilrt_snac/_configs/_sudo_config.py +++ b/nilrt_snac/_configs/_sudo_config.py @@ -9,7 +9,7 @@ class _SudoConfig(_BaseConfig): def __init__(self): - pass # Nothing to do for now + super().__init__("sudo") def configure(self, args: argparse.Namespace) -> None: print("Configuring sudo...") diff --git a/nilrt_snac/_configs/_sysapi_config.py b/nilrt_snac/_configs/_sysapi_config.py index bc32843..3c91d3d 100644 --- a/nilrt_snac/_configs/_sysapi_config.py +++ b/nilrt_snac/_configs/_sysapi_config.py @@ -8,6 +8,7 @@ class _SysAPIConfig(_BaseConfig): def __init__(self): + super().__init__("sysapi") self._opkg_helper = opkg_helper def configure(self, args: argparse.Namespace) -> None: diff --git a/nilrt_snac/_configs/_syslog_ng_config.py b/nilrt_snac/_configs/_syslog_ng_config.py index 09a74f6..e35cf46 100644 --- a/nilrt_snac/_configs/_syslog_ng_config.py +++ b/nilrt_snac/_configs/_syslog_ng_config.py @@ -8,6 +8,7 @@ class _SyslogConfig(_BaseConfig): def __init__(self): + super().__init__("syslog") self._opkg_helper = opkg_helper self.syslog_conf_path = "/etc/syslog-ng/syslog-ng.conf" diff --git a/nilrt_snac/_configs/_tmux_config.py b/nilrt_snac/_configs/_tmux_config.py index b6eae4f..f0a943d 100644 --- a/nilrt_snac/_configs/_tmux_config.py +++ b/nilrt_snac/_configs/_tmux_config.py @@ -10,6 +10,7 @@ class _TmuxConfig(_BaseConfig): def __init__(self): + super().__init__("tmux") self._opkg_helper = opkg_helper def configure(self, args: argparse.Namespace) -> None: diff --git a/nilrt_snac/_configs/_usbguard_config.py b/nilrt_snac/_configs/_usbguard_config.py index 241cd43..51c9fd5 100644 --- a/nilrt_snac/_configs/_usbguard_config.py +++ b/nilrt_snac/_configs/_usbguard_config.py @@ -13,6 +13,7 @@ class _USBGuardConfig(_BaseConfig): """USBGuard configuration handler.""" def __init__(self): + super().__init__("usbguard") self.config_file_path = "/etc/usbguard/usbguard-daemon.conf" self.package_name = "usbguard" self._opkg_helper = opkg_helper diff --git a/nilrt_snac/_configs/_wifi_config.py b/nilrt_snac/_configs/_wifi_config.py index 7acdf5c..694f69a 100644 --- a/nilrt_snac/_configs/_wifi_config.py +++ b/nilrt_snac/_configs/_wifi_config.py @@ -10,7 +10,7 @@ class _WIFIConfig(_BaseConfig): def __init__(self): - pass + super().__init__("wifi") def configure(self, args: argparse.Namespace) -> None: print("Disabling WiFi support...") diff --git a/nilrt_snac/_configs/_wireguard_config.py b/nilrt_snac/_configs/_wireguard_config.py index 320fcbc..1643254 100644 --- a/nilrt_snac/_configs/_wireguard_config.py +++ b/nilrt_snac/_configs/_wireguard_config.py @@ -12,6 +12,7 @@ class _WireguardConfig(_BaseConfig): def __init__(self): + super().__init__("wireguard") self._sysconnf_path = pathlib.Path("/etc/wireguard") self._opkg_helper = opkg_helper