diff --git a/nixos/modules/misc/ids.nix b/nixos/modules/misc/ids.nix index c2e588bf00dd..c7ab3f313a6e 100644 --- a/nixos/modules/misc/ids.nix +++ b/nixos/modules/misc/ids.nix @@ -178,7 +178,7 @@ in radvd = 139; zookeeper = 140; dnsmasq = 141; - uhub = 142; + #uhub = 142; # unused yandexdisk = 143; mxisd = 144; # was once collectd consul = 145; diff --git a/nixos/modules/services/misc/uhub.nix b/nixos/modules/services/misc/uhub.nix index d1b388310280..da2613e6db17 100644 --- a/nixos/modules/services/misc/uhub.nix +++ b/nixos/modules/services/misc/uhub.nix @@ -3,178 +3,110 @@ with lib; let - - cfg = config.services.uhub; - - uhubPkg = pkgs.uhub.override { tlsSupport = cfg.enableTLS; }; - - pluginConfig = "" - + optionalString cfg.plugins.authSqlite.enable '' - plugin ${uhubPkg.mod_auth_sqlite}/mod_auth_sqlite.so "file=${cfg.plugins.authSqlite.file}" - '' - + optionalString cfg.plugins.logging.enable '' - plugin ${uhubPkg.mod_logging}/mod_logging.so ${if cfg.plugins.logging.syslog then "syslog=true" else "file=${cfg.plugins.logging.file}"} - '' - + optionalString cfg.plugins.welcome.enable '' - plugin ${uhubPkg.mod_welcome}/mod_welcome.so "motd=${pkgs.writeText "motd.txt" cfg.plugins.welcome.motd} rules=${pkgs.writeText "rules.txt" cfg.plugins.welcome.rules}" - '' - + optionalString cfg.plugins.history.enable '' - plugin ${uhubPkg.mod_chat_history}/mod_chat_history.so "history_max=${toString cfg.plugins.history.max} history_default=${toString cfg.plugins.history.default} history_connect=${toString cfg.plugins.history.connect}" - ''; - - uhubConfigFile = pkgs.writeText "uhub.conf" '' - file_acl=${pkgs.writeText "users.conf" cfg.aclConfig} - file_plugins=${pkgs.writeText "plugins.conf" pluginConfig} - server_bind_addr=${cfg.address} - server_port=${toString cfg.port} - ${lib.optionalString cfg.enableTLS "tls_enable=yes"} - ${cfg.hubConfig} - ''; - -in - -{ + settingsFormat = { + type = with lib.types; attrsOf (oneOf [ bool int str ]); + generate = name: attrs: + pkgs.writeText name (lib.strings.concatStringsSep "\n" + (lib.attrsets.mapAttrsToList + (key: value: "${key}=${builtins.toJSON value}") attrs)); + }; +in { options = { - services.uhub = { + services.uhub = mkOption { + default = { }; + description = "Uhub ADC hub instances"; + type = types.attrsOf (types.submodule { + options = { - enable = mkOption { - type = types.bool; - default = false; - description = "Whether to enable the uhub ADC hub."; - }; + enable = mkEnableOption "hub instance" // { default = true; }; - port = mkOption { - type = types.int; - default = 1511; - description = "TCP port to bind the hub to."; - }; - - address = mkOption { - type = types.str; - default = "any"; - description = "Address to bind the hub to."; - }; - - enableTLS = mkOption { - type = types.bool; - default = false; - description = "Whether to enable TLS support."; - }; - - hubConfig = mkOption { - type = types.lines; - default = ""; - description = "Contents of uhub configuration file."; - }; - - aclConfig = mkOption { - type = types.lines; - default = ""; - description = "Contents of user ACL configuration file."; - }; - - plugins = { - - authSqlite = { - enable = mkOption { + enableTLS = mkOption { type = types.bool; default = false; - description = "Whether to enable the Sqlite authentication database plugin"; + description = "Whether to enable TLS support."; }; - file = mkOption { - type = types.path; - example = "/var/db/uhub-users"; - description = "Path to user database. Use the uhub-passwd utility to create the database and add/remove users."; - }; - }; - logging = { - enable = mkOption { - type = types.bool; - default = false; - description = "Whether to enable the logging plugin."; - }; - file = mkOption { - type = types.str; - default = ""; - description = "Path of log file."; - }; - syslog = mkOption { - type = types.bool; - default = false; - description = "If true then the system log is used instead of writing to file."; - }; - }; - - welcome = { - enable = mkOption { - type = types.bool; - default = false; - description = "Whether to enable the welcome plugin."; - }; - motd = mkOption { - default = ""; - type = types.lines; + settings = mkOption { + inherit (settingsFormat) type; description = '' - Welcome message displayed to clients after connecting - and with the !motd command. + Configuration of uhub. + See https://www.uhub.org/doc/config.php for a list of options. ''; + default = { }; + example = { + server_bind_addr = "any"; + server_port = 1511; + hub_name = "My Public Hub"; + hub_description = "Yet another ADC hub"; + max_users = 150; + }; }; - rules = mkOption { - default = ""; - type = types.lines; - description = '' - Rules message, displayed to clients with the !rules command. - ''; - }; - }; - history = { - enable = mkOption { - type = types.bool; - default = false; - description = "Whether to enable the history plugin."; + plugins = mkOption { + description = "Uhub plugin configuration."; + type = with types; + listOf (submodule { + options = { + plugin = mkOption { + type = path; + example = literalExample + "$${pkgs.uhub}/plugins/mod_auth_sqlite.so"; + description = "Path to plugin file."; + }; + settings = mkOption { + description = "Settings specific to this plugin."; + type = with types; attrsOf str; + example = { file = "/etc/uhub/users.db"; }; + }; + }; + }); + default = [ ]; }; - max = mkOption { - type = types.int; - default = 200; - description = "The maximum number of messages to keep in history"; - }; - default = mkOption { - type = types.int; - default = 10; - description = "When !history is provided without arguments, then this default number of messages are returned."; - }; - connect = mkOption { - type = types.int; - default = 5; - description = "The number of chat history messages to send when users connect (0 = do not send any history)."; - }; - }; - }; + }; + }); }; }; - config = mkIf cfg.enable { + config = let + hubs = lib.attrsets.filterAttrs (_: cfg: cfg.enable) config.services.uhub; + in { - users = { - users.uhub.uid = config.ids.uids.uhub; - groups.uhub.gid = config.ids.gids.uhub; - }; + environment.etc = lib.attrsets.mapAttrs' (name: cfg: + let + settings' = cfg.settings // { + tls_enable = cfg.enableTLS; + file_plugins = pkgs.writeText "uhub-plugins.conf" + (lib.strings.concatStringsSep "\n" (map ({ plugin, settings }: + "plugin ${plugin} ${ + toString + (lib.attrsets.mapAttrsToList (key: value: ''"${key}=${value}"'') + settings) + }") cfg.plugins)); + }; + in { + name = "uhub/${name}.conf"; + value.source = settingsFormat.generate "uhub-${name}.conf" settings'; + }) hubs; - systemd.services.uhub = { - description = "high performance peer-to-peer hub for the ADC network"; - after = [ "network.target" ]; - wantedBy = [ "multi-user.target" ]; - serviceConfig = { - Type = "notify"; - ExecStart = "${uhubPkg}/bin/uhub -c ${uhubConfigFile} -u uhub -g uhub -L"; - ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; + systemd.services = lib.attrsets.mapAttrs' (name: cfg: { + name = "uhub-${name}"; + value = let pkg = pkgs.uhub.override { tlsSupport = cfg.enableTLS; }; + in { + description = "high performance peer-to-peer hub for the ADC network"; + after = [ "network.target" ]; + wantedBy = [ "multi-user.target" ]; + reloadIfChanged = true; + serviceConfig = { + Type = "notify"; + ExecStart = "${pkg}/bin/uhub -c /etc/uhub/${name}.conf -L"; + ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; + DynamicUser = true; + }; }; - }; + }) hubs; }; }