Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

nixos/soju: add admin socket option and sojuctl wrapper #258520

Merged
merged 4 commits into from Apr 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions nixos/doc/manual/release-notes/rl-2405.section.md
Expand Up @@ -485,6 +485,8 @@ The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been m

- The `krb5` module has been rewritten and moved to `security.krb5`, moving all options but `security.krb5.enable` and `security.krb5.package` into `security.krb5.settings`.

- `services.soju` now has a wrapper for the `sojuctl` command, pointed at the service config file. It also has the new option `adminSocket.enable`, which creates a unix admin socket at `/run/soju/admin`.

- Gitea 1.21 upgrade has several breaking changes, including:
- Custom themes and other assets that were previously stored in `custom/public/*` now belong in `custom/public/assets/*`
- New instances of Gitea using MySQL now ignore the `[database].CHARSET` config option and always use the `utf8mb4` charset, existing instances should migrate via the `gitea doctor convert` CLI command.
Expand Down
24 changes: 22 additions & 2 deletions nixos/modules/services/networking/soju.nix
Expand Up @@ -5,7 +5,10 @@ with lib;
let
cfg = config.services.soju;
stateDir = "/var/lib/soju";
listenCfg = concatMapStringsSep "\n" (l: "listen ${l}") cfg.listen;
runtimeDir = "/run/soju";
listen = cfg.listen
++ optional cfg.adminSocket.enable "unix+admin://${runtimeDir}/admin";
listenCfg = concatMapStringsSep "\n" (l: "listen ${l}") listen;
tlsCfg = optionalString (cfg.tlsCertificate != null)
"tls ${cfg.tlsCertificate} ${cfg.tlsCertificateKey}";
logCfg = optionalString cfg.enableMessageLogging
Expand All @@ -22,13 +25,19 @@ let

${cfg.extraConfig}
'';

sojuctl = pkgs.writeShellScriptBin "sojuctl" ''
exec ${cfg.package}/bin/sojuctl --config ${configFile} "$@"
'';
in
{
###### interface

options.services.soju = {
enable = mkEnableOption (lib.mdDoc "soju");

package = mkPackageOption pkgs "soju" { };

listen = mkOption {
type = types.listOf types.str;
default = [ ":6697" ];
Expand Down Expand Up @@ -66,6 +75,14 @@ in
description = lib.mdDoc "Whether to enable message logging.";
};

adminSocket.enable = mkOption {
SuperSandro2000 marked this conversation as resolved.
Show resolved Hide resolved
type = types.bool;
default = true;
description = lib.mdDoc ''
Listen for admin connections from sojuctl at /run/soju/admin.
'';
};

httpOrigins = mkOption {
type = types.listOf types.str;
default = [];
Expand Down Expand Up @@ -107,6 +124,8 @@ in
}
];

environment.systemPackages = [ sojuctl ];

systemd.services.soju = {
description = "soju IRC bouncer";
wantedBy = [ "multi-user.target" ];
Expand All @@ -115,8 +134,9 @@ in
serviceConfig = {
DynamicUser = true;
Restart = "always";
ExecStart = "${pkgs.soju}/bin/soju -config ${configFile}";
ExecStart = "${cfg.package}/bin/soju -config ${configFile}";
StateDirectory = "soju";
RuntimeDirectory = "soju";
};
};
};
Expand Down
1 change: 1 addition & 0 deletions nixos/tests/all-tests.nix
Expand Up @@ -821,6 +821,7 @@ in {
soapui = handleTest ./soapui.nix {};
soft-serve = handleTest ./soft-serve.nix {};
sogo = handleTest ./sogo.nix {};
soju = handleTest ./soju.nix {};
solanum = handleTest ./solanum.nix {};
sonarr = handleTest ./sonarr.nix {};
sonic-server = handleTest ./sonic-server.nix {};
Expand Down
31 changes: 31 additions & 0 deletions nixos/tests/soju.nix
@@ -0,0 +1,31 @@
import ./make-test-python.nix ({ pkgs, lib, ... }:
let
certs = import ./common/acme/server/snakeoil-certs.nix;
domain = certs.domain;

user = "testuser";
pass = "hunter2";
in
{
name = "soju";
meta.maintainers = with lib.maintainers; [ Benjamin-L ];

nodes.machine = { ... }: {
services.soju = {
enable = true;
adminSocket.enable = true;
hostName = domain;
tlsCertificate = certs.${domain}.cert;
tlsCertificateKey = certs.${domain}.key;
};
};

testScript = ''
start_all()

machine.wait_for_unit("soju")
machine.wait_for_file("/run/soju/admin")

machine.succeed("sojuctl user create -username ${user} -password ${pass}")
'';
})