diff --git a/nix/module.nix b/nix/module.nix index 86b3335..8fcd395 100644 --- a/nix/module.nix +++ b/nix/module.nix @@ -1,8 +1,15 @@ -{ config, pkgs, lib, ... }: let +{ + config, + pkgs, + lib, + ... +}: +let cfg = config.services.dibbler; format = pkgs.formats.toml { }; -in { +in +{ options.services.dibbler = { enable = lib.mkEnableOption "dibbler, the little kiosk computer"; @@ -56,131 +63,149 @@ in { }; }; - config = lib.mkIf cfg.enable (lib.mkMerge [ - { - services.dibbler.settings = lib.pipe ../example-config.toml [ - builtins.readFile - builtins.fromTOML - (lib.mapAttrsRecursive (_: lib.mkDefault)) - ]; - } - { - environment.systemPackages = [ cfg.package ]; - - environment.etc."dibbler/dibbler.toml".source = format.generate "dibbler.toml" cfg.settings; - - users = { - users.dibbler = { - group = "dibbler"; - isNormalUser = true; - }; - groups.dibbler = { }; - }; - - services.dibbler.settings.database = lib.mkIf cfg.createLocalDatabase { - type = "postgresql"; - postgresql.host = "/run/postgresql"; - }; - - services.postgresql = lib.mkIf cfg.createLocalDatabase { - ensureDatabases = [ "dibbler" ]; - ensureUsers = [{ - name = "dibbler"; - ensureDBOwnership = true; - ensureClauses.login = true; - }]; - }; - - systemd.services.dibbler-setup-database = lib.mkIf cfg.createLocalDatabase { - description = "Dibbler database setup"; - wantedBy = [ "default.target" ]; - after = [ "postgresql.service" ]; - unitConfig = { - ConditionPathExists = "!/var/lib/dibbler/.db-setup-done"; - }; - serviceConfig = { - Type = "oneshot"; - ExecStart = "${lib.getExe cfg.package} --config /etc/dibbler/dibbler.toml create-db"; - ExecStartPost = "${lib.getExe' pkgs.coreutils "touch"} /var/lib/dibbler/.db-setup-done"; - StateDirectory = "dibbler"; - - User = "dibbler"; - Group = "dibbler"; - }; - }; - } - (lib.mkIf cfg.kioskMode { - boot.kernelParams = [ - "console=tty1" - ]; - - - users.users.dibbler = { - extraGroups = [ "lp" ]; - shell = (pkgs.writeShellScriptBin "login-shell" "${lib.getExe' cfg.screenPackage "screen"} -x dibbler") // { - shellPath = "/bin/login-shell"; - }; - }; - - services.dibbler.settings.general = { - quit_allowed = false; - stop_allowed = false; - }; - - systemd.services.dibbler-screen-session = { - description = "Dibbler Screen Session"; - wantedBy = [ - "default.target" + config = lib.mkIf cfg.enable ( + lib.mkMerge [ + { + services.dibbler.settings = lib.pipe ../example-config.toml [ + builtins.readFile + builtins.fromTOML + (lib.mapAttrsRecursive (_: lib.mkDefault)) ]; - after = if cfg.createLocalDatabase then [ - "postgresql.service" - "dibbler-setup-database.service" - ] else [ - "network.target" + } + { + environment.systemPackages = [ cfg.package ]; + + environment.etc."dibbler/dibbler.toml".source = format.generate "dibbler.toml" cfg.settings; + + users = { + users.dibbler = { + group = "dibbler"; + isNormalUser = true; + }; + groups.dibbler = { }; + }; + + services.dibbler.settings.database = lib.mkIf cfg.createLocalDatabase { + type = "postgresql"; + postgresql.host = "/run/postgresql"; + }; + + services.postgresql = lib.mkIf cfg.createLocalDatabase { + ensureDatabases = [ "dibbler" ]; + ensureUsers = [ + { + name = "dibbler"; + ensureDBOwnership = true; + ensureClauses.login = true; + } + ]; + }; + + systemd.services.dibbler-setup-database = lib.mkIf cfg.createLocalDatabase { + description = "Dibbler database setup"; + wantedBy = [ "default.target" ]; + after = [ "postgresql.service" ]; + unitConfig = { + ConditionPathExists = "!/var/lib/dibbler/.db-setup-done"; + }; + serviceConfig = { + Type = "oneshot"; + ExecStart = "${lib.getExe cfg.package} --config /etc/dibbler/dibbler.toml create-db"; + ExecStartPost = "${lib.getExe' pkgs.coreutils "touch"} /var/lib/dibbler/.db-setup-done"; + StateDirectory = "dibbler"; + + User = "dibbler"; + Group = "dibbler"; + }; + }; + } + (lib.mkIf cfg.kioskMode { + boot.kernelParams = [ + "console=tty1" ]; - serviceConfig = { - Type = "forking"; - RemainAfterExit = false; - Restart = "always"; - RestartSec = "5s"; - SuccessExitStatus = 1; - User = "dibbler"; - Group = "dibbler"; - - ExecStartPre = "-${lib.getExe' cfg.screenPackage "screen"} -X -S dibbler kill"; - ExecStart = let - screenArgs = lib.escapeShellArgs [ - # -dm creates the screen in detached mode without accessing it - "-dm" - - # Session name - "-S" - "dibbler" - - # Set optimal output mode instead of VT100 emulation - "-O" - - # Enable login mode, updates utmp entries - "-l" - ]; - - dibblerArgs = lib.cli.toCommandLineShellGNU { } { - config = "/etc/dibbler/dibbler.toml"; + users.users.dibbler = { + extraGroups = [ "lp" ]; + shell = + (pkgs.writeShellScriptBin "login-shell" "${lib.getExe' cfg.screenPackage "screen"} -x dibbler") + // { + shellPath = "/bin/login-shell"; }; - - in "${lib.getExe' cfg.screenPackage "screen"} ${screenArgs} ${lib.getExe cfg.package} ${dibblerArgs} loop"; - ExecStartPost = - lib.optionals (cfg.limitScreenWidth != null) [ - "${lib.getExe' cfg.screenPackage "screen"} -X -S dibbler width ${toString cfg.limitScreenWidth}" - ] - ++ lib.optionals (cfg.limitScreenHeight != null) [ - "${lib.getExe' cfg.screenPackage "screen"} -X -S dibbler height ${toString cfg.limitScreenHeight}" - ]; }; - }; - services.getty.autologinUser = "dibbler"; - }) - ]); + services.dibbler.settings.general = { + quit_allowed = false; + stop_allowed = false; + }; + + systemd.services.dibbler-screen-session = { + description = "Dibbler Screen Session"; + wantedBy = [ + "default.target" + ]; + after = + if cfg.createLocalDatabase then + [ + "postgresql.service" + "dibbler-setup-database.service" + ] + else + [ + "network.target" + ]; + serviceConfig = { + Type = "forking"; + RemainAfterExit = false; + Restart = "always"; + RestartSec = "5s"; + SuccessExitStatus = 1; + + User = "dibbler"; + Group = "dibbler"; + + ExecStartPre = "-${lib.getExe' cfg.screenPackage "screen"} -X -S dibbler kill"; + ExecStart = + let + screenArgs = lib.escapeShellArgs [ + # -dm creates the screen in detached mode without accessing it + "-dm" + + # Session name + "-S" + "dibbler" + + # Set optimal output mode instead of VT100 emulation + "-O" + + # Enable login mode, updates utmp entries + "-l" + + # Set window name + "-t" + "dibbler" + ]; + + dibblerArgs = lib.cli.toCommandLineShellGNU { } { + config = "/etc/dibbler/dibbler.toml"; + }; + + in + "${lib.getExe' cfg.screenPackage "screen"} ${screenArgs} ${lib.getExe cfg.package} ${dibblerArgs} loop"; + ExecStartPost = + lib.optionals (cfg.limitScreenWidth != null) [ + "${lib.getExe' cfg.screenPackage "screen"} -X -S dibbler width ${toString cfg.limitScreenWidth}" + ] + ++ lib.optionals (cfg.limitScreenHeight != null) [ + "${lib.getExe' cfg.screenPackage "screen"} -X -S dibbler height ${toString cfg.limitScreenHeight}" + ] + ++ [ + "${lib.getExe' cfg.screenPackage "screen"} -X -S dibbler -t worblehat bash -c 'echo \"This should be running worblehat.\"; sleep 3600'" + ]; + }; + }; + + services.getty.autologinUser = "dibbler"; + }) + ] + ); }