{ config, lib, pkgs, ... }: let cfg = config.services.vspd; in { options.services.vspd = with lib; { enable = mkEnableOption "Voting Service Provider Daemon"; package = mkOption { type = types.package; default = pkgs.vspd; description = "vspd package to use"; }; user = mkOption { type = types.str; default = "vspd"; description = "User to run vspd as"; }; group = mkOption { type = types.str; default = cfg.user; description = "Group to run vspd as"; }; dataDir = mkOption { type = types.path; default = "/var/lib/vspd"; description = "State directory for vspd"; }; configFile = mkOption { type = types.path; description = "Path to vspd.conf"; }; }; config = lib.mkIf cfg.enable { users.users.${cfg.user} = { group = cfg.group; home = cfg.dataDir; isSystemUser = true; description = "vspd user"; }; users.groups.${cfg.group} = {}; systemd.services.vspd = { description = "Voting Service Provider Daemon"; wantedBy = [ "multi-user.target" ]; after = [ "network-online.target" ]; wants = [ "network-online.target" ]; serviceConfig = { User = cfg.user; Group = cfg.group; StateDirectory = "vspd"; StateDirectoryMode = "0750"; WorkingDirectory = cfg.dataDir; # Link the provided config file to the expected location in homedir ExecStartPre = "${pkgs.bash}/bin/bash -c 'ln -sf ${cfg.configFile} ${cfg.dataDir}/vspd.conf'"; ExecStart = "${lib.getExe cfg.package} --homedir=${cfg.dataDir}"; Restart = "on-failure"; RestartSec = "10s"; }; }; }; }