{ lib, config, pkgs, satnogsDemoDisplayPkgs, ... }: with lib; let # Shorter name to access final settings a # user of hello.nix module HAS ACTUALLY SET. # cfg is a typical convention. cfg = config.services.satnogsDemoDisplay; in { options.services.satnogsDemoDisplay = { enable = mkEnableOption "satnogs-demo-display service"; package = mkOption { default = satnogsDemoDisplayPkgs.x86_64-linux.default; type = types.package; description = "satnogsDemoDisplay packages to use. Needed to fix crosscompilation issues."; }; user = mkOption { type = types.str; default = "satnogs-demo"; description = mdDoc "User to run the desktop environment and display script."; }; group = mkOption { type = types.str; default = "satnogs-demo"; description = mdDoc "Group for the user."; }; stateDir = mkOption { default = "/var/lib/satnogs-demo-display"; type = types.str; description = mdDoc "Demo display data directory."; }; }; config = mkIf cfg.enable { environment.systemPackages = with pkgs; [ cfg.package unclutter xorg.xhost xorg.xrandr feh ]; users.users = mkIf (cfg.user == "satnogs-demo") { satnogs-demo = { group = cfg.group; isNormalUser = true; }; }; users.groups = mkIf (cfg.group == "satnogs-demo") { satnogs-demo = { }; }; systemd.tmpfiles.rules = [ "d '${cfg.stateDir}' 0750 ${cfg.user} ${cfg.group} - -" ]; systemd.services.satnogsDemoDisplay = { wantedBy = [ "multi-user.target" ]; description = "satnogsDemoDisplay service"; serviceConfig = { Type = "exec"; User = cfg.user; Group = cfg.group; Restart = "always"; RestartSec = "1s"; StartLimitIntervalSec = "0"; WorkingDirectory = cfg.stateDir; }; script = '' unlink ./satnogs-logo.png ln -s ${cfg.package}/satnogs-logo.png ./ unlink ./Montserrat-Regular.otf ln -s ${cfg.package}/Montserrat-Regular.otf ./ while true; do ${cfg.package}/bin/satnogs-demo-display sleep 60 done ''; }; # Some programs need SUID wrappers, can be configured further or are # started in user sessions. # programs.mtr.enable = true; # programs.gnupg.agent = { # enable = true; # enableSSHSupport = true; # }; services.xserver = { enable = true; monitorSection = '' Option "NODPMS" ''; serverLayoutSection = '' Option "BlankTime" "0" Option "DPMS" "false" ''; # Let lightdm handle autologin displayManager = { autoLogin = { user = cfg.user; enable = true; }; lightdm = { enable = true; }; defaultSession = "none+i3"; }; # Start i3 after autologin windowManager.i3 = { enable = true; configFile = ./i3config; extraSessionCommands = '' ${pkgs.xorg.xhost}/bin/xhost + ${pkgs.unclutter}/bin/unclutter & ${pkgs.feh}/bin/feh --reload 30.0 -F ${cfg.stateDir}/waterfall.png & ''; }; }; systemd.services."display-manager".after = [ "network-online.target" "systemd-resolved.service" ]; }; }