satnogs-demo-display/module.nix

144 lines
3.3 KiB
Nix

{ 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"
];
};
}