From 7b816ec6a71effb66790febabb935eff9389a3aa Mon Sep 17 00:00:00 2001 From: h7x4 Date: Thu, 12 Feb 2026 18:06:49 +0900 Subject: [PATCH] module.nix: add options for deadline daemon --- nix/module.nix | 267 +++++++++++++--------- nix/nixos-configurations/vm-non-kiosk.nix | 1 + nix/nixos-configurations/vm.nix | 1 + 3 files changed, 164 insertions(+), 105 deletions(-) diff --git a/nix/module.nix b/nix/module.nix index 4a4d69b..1f1cd86 100644 --- a/nix/module.nix +++ b/nix/module.nix @@ -54,10 +54,43 @@ in { freeformType = format.type; }; }; + + deadline-daemon = { + enable = lib.mkEnableOption "" // { + description = '' + Whether to enable the worblehat deadline-daemon service, + which periodically checks for upcoming deadlines and notifies users. + + Note that this service is independent of the main worblehat service, + and must be enabled separately. + ''; + }; + + onCalendar = lib.mkOption { + type = lib.types.str; + description = '' + How often to trigger rendering the map, + in the format of a systemd timer onCalendar configuration. + + See {manpage}`systemd.timer(5)`. + ''; + default = "*-*-* 10:15:00"; + }; + }; }; - config = lib.mkIf cfg.enable (lib.mkMerge [ - { + config = lib.mkMerge [ + (lib.mkIf (cfg.enable || cfg.deadline-daemon.enable) { + environment.etc."worblehat/config.toml".source = format.generate "worblehat-config.toml" cfg.settings; + + users = { + users.worblehat = { + group = "worblehat"; + isNormalUser = true; + }; + groups.worblehat = { }; + }; + services.worblehat.settings = lib.pipe ../config-template.toml [ builtins.readFile builtins.fromTOML @@ -69,123 +102,147 @@ in { }) (lib.mapAttrsRecursive (_: lib.mkDefault)) ]; - } - { - environment.systemPackages = [ cfg.package ]; + }) - environment.etc."worblehat/config.toml".source = format.generate "worblehat-config.toml" cfg.settings; + (lib.mkIf cfg.enable (lib.mkMerge [ + { + environment.systemPackages = [ cfg.package ]; - users = { - users.worblehat = { - group = "worblehat"; - isNormalUser = true; + services.worblehat.settings.database.type = "postgresql"; + services.worblehat.settings.database.postgresql = { + host = "/run/postgresql"; }; - groups.worblehat = { }; - }; - services.worblehat.settings.database.type = "postgresql"; - services.worblehat.settings.database.postgresql = { - host = "/run/postgresql"; - }; - - services.postgresql = lib.mkIf cfg.createLocalDatabase { - ensureDatabases = [ "worblehat" ]; - ensureUsers = [{ - name = "worblehat"; - ensureDBOwnership = true; - ensureClauses.login = true; - }]; - }; - - systemd.services.worblehat-setup-database = lib.mkIf cfg.createLocalDatabase { - description = "Dibbler database setup"; - wantedBy = [ "default.target" ]; - after = [ "postgresql.service" ]; - unitConfig = { - ConditionPathExists = "!/var/lib/worblehat/.db-setup-done"; + services.postgresql = lib.mkIf cfg.createLocalDatabase { + ensureDatabases = [ "worblehat" ]; + ensureUsers = [{ + name = "worblehat"; + ensureDBOwnership = true; + ensureClauses.login = true; + }]; }; + + systemd.services.worblehat-setup-database = lib.mkIf cfg.createLocalDatabase { + description = "Dibbler database setup"; + wantedBy = [ "default.target" ]; + after = [ "postgresql.service" ]; + unitConfig = { + ConditionPathExists = "!/var/lib/worblehat/.db-setup-done"; + }; + serviceConfig = { + Type = "oneshot"; + ExecStart = "${lib.getExe cfg.package} --config /etc/worblehat/config.toml create-db"; + ExecStartPost = "${lib.getExe' pkgs.coreutils "touch"} /var/lib/worblehat/.db-setup-done"; + StateDirectory = "worblehat"; + + User = "worblehat"; + Group = "worblehat"; + }; + }; + } + (lib.mkIf cfg.kioskMode { + boot.kernelParams = [ + "console=tty1" + ]; + + users.users.worblehat = { + extraGroups = [ "lp" ]; + shell = (pkgs.writeShellScriptBin "login-shell" "${lib.getExe' cfg.screenPackage "screen"} -x worblehat") // { + shellPath = "/bin/login-shell"; + }; + }; + + services.worblehat.settings.general = { + quit_allowed = false; + stop_allowed = false; + }; + + systemd.services.worblehat-screen-session = { + description = "Worblehat Screen Session"; + wantedBy = [ + "default.target" + ]; + after = if cfg.createLocalDatabase then [ + "postgresql.service" + "worblehat-setup-database.service" + ] else [ + "network.target" + ]; + serviceConfig = { + Type = "forking"; + RemainAfterExit = false; + Restart = "always"; + RestartSec = "5s"; + SuccessExitStatus = 1; + + User = "worblehat"; + Group = "worblehat"; + + ExecStartPre = "-${lib.getExe' cfg.screenPackage "screen"} -X -S worblehat kill"; + ExecStart = let + screenArgs = lib.escapeShellArgs [ + # -dm creates the screen in detached mode without accessing it + "-dm" + + # Session name + "-S" + "worblehat" + + # Set optimal output mode instead of VT100 emulation + "-O" + + # Enable login mode, updates utmp entries + "-l" + ]; + + worblehatArgs = lib.cli.toCommandLineShellGNU { } { + config = "/etc/worblehat/config.toml"; + }; + + in "${lib.getExe' cfg.screenPackage "screen"} ${screenArgs} ${lib.getExe cfg.package} ${worblehatArgs} cli"; + ExecStartPost = + lib.optionals (cfg.limitScreenWidth != null) [ + "${lib.getExe' cfg.screenPackage "screen"} -X -S worblehat width ${toString cfg.limitScreenWidth}" + ] + ++ lib.optionals (cfg.limitScreenHeight != null) [ + "${lib.getExe' cfg.screenPackage "screen"} -X -S worblehat height ${toString cfg.limitScreenHeight}" + ]; + }; + }; + + services.getty.autologinUser = "worblehat"; + }) + ])) + + (lib.mkIf cfg.deadline-daemon.enable { + systemd.timers.worblehat-deadline-daemon = { + description = "Worblehat Deadline Daemon"; + wantedBy = [ "timers.target" ]; + timerConfig = { + OnCalendar = cfg.deadline-daemon.onCalendar; + Persistent = true; + }; + }; + + systemd.services.worblehat-deadline-daemon = { + description = "Worblehat Deadline Daemon"; + wantedBy = [ "multi-user.target" ]; + after = [ "network.target" ]; serviceConfig = { Type = "oneshot"; - ExecStart = "${lib.getExe cfg.package} --config /etc/worblehat/config.toml create-db"; - ExecStartPost = "${lib.getExe' pkgs.coreutils "touch"} /var/lib/worblehat/.db-setup-done"; - StateDirectory = "worblehat"; + CPUSchedulingPolicy = "idle"; + IOSchedulingClass = "idle"; - User = "worblehat"; - Group = "worblehat"; - }; - }; - } - (lib.mkIf cfg.kioskMode { - boot.kernelParams = [ - "console=tty1" - ]; - - users.users.worblehat = { - extraGroups = [ "lp" ]; - shell = (pkgs.writeShellScriptBin "login-shell" "${lib.getExe cfg.screenPackage} -x worblehat") // { - shellPath = "/bin/login-shell"; - }; - }; - - services.worblehat.settings.general = { - quit_allowed = false; - stop_allowed = false; - }; - - systemd.services.worblehat-screen-session = { - description = "Worblehat Screen Session"; - wantedBy = [ - "default.target" - ]; - after = if cfg.createLocalDatabase then [ - "postgresql.service" - "worblehat-setup-database.service" - ] else [ - "network.target" - ]; - serviceConfig = { - Type = "forking"; - RemainAfterExit = false; - Restart = "always"; - RestartSec = "5s"; - SuccessExitStatus = 1; - - User = "worblehat"; - Group = "worblehat"; - - ExecStartPre = "-${lib.getExe cfg.screenPackage} -X -S worblehat kill"; ExecStart = let - screenArgs = lib.escapeShellArgs [ - # -dm creates the screen in detached mode without accessing it - "-dm" - - # Session name - "-S" - "worblehat" - - # Set optimal output mode instead of VT100 emulation - "-O" - - # Enable login mode, updates utmp entries - "-l" - ]; - worblehatArgs = lib.cli.toCommandLineShellGNU { } { config = "/etc/worblehat/config.toml"; }; + in "${lib.getExe cfg.package} ${worblehatArgs} deadline-daemon"; - in "${lib.getExe cfg.screenPackage} ${screenArgs} ${lib.getExe cfg.package} ${worblehatArgs} cli"; - ExecStartPost = - lib.optionals (cfg.limitScreenWidth != null) [ - "${lib.getExe cfg.screenPackage} -X -S worblehat width ${toString cfg.limitScreenWidth}" - ] - ++ lib.optionals (cfg.limitScreenHeight != null) [ - "${lib.getExe cfg.screenPackage} -X -S worblehat height ${toString cfg.limitScreenHeight}" - ]; + User = "worblehat"; + Group = "worblehat"; }; }; - - services.getty.autologinUser = "worblehat"; }) - ]); + ]; } diff --git a/nix/nixos-configurations/vm-non-kiosk.nix b/nix/nixos-configurations/vm-non-kiosk.nix index db35327..ca87efc 100644 --- a/nix/nixos-configurations/vm-non-kiosk.nix +++ b/nix/nixos-configurations/vm-non-kiosk.nix @@ -48,6 +48,7 @@ nixpkgs.lib.nixosSystem { services.worblehat = { enable = true; createLocalDatabase = true; + deadline-daemon.enable = true; }; }) ]; diff --git a/nix/nixos-configurations/vm.nix b/nix/nixos-configurations/vm.nix index 4b5f3b2..ca07285 100644 --- a/nix/nixos-configurations/vm.nix +++ b/nix/nixos-configurations/vm.nix @@ -29,6 +29,7 @@ nixpkgs.lib.nixosSystem { DEBUG = true; }; }; + deadline-daemon.enable = true; }; }) ];