{ config, lib, pkgs, ... }: let dcrdEnabled = config.services.dcrd.enable or false; cfg = config.services.dcrwallet; in { options.services.dcrwallet = with lib; { enable = mkEnableOption "Decred wallet daemon"; package = mkOption { type = types.package; default = pkgs.dcrwallet; description = "Package providing the dcrwallet binary"; }; user = mkOption { type = types.str; default = "dcrwallet"; description = "User to run dcrwallet as"; }; group = mkOption { type = types.str; default = cfg.user; description = "Group to run dcrwallet as"; }; dataDir = mkOption { type = types.path; default = "/var/lib/dcrwallet"; description = "State directory for dcrwallet (appdata)"; }; configFile = mkOption { type = types.path; description = "Path to dcrwallet configuration file (runtime path)"; }; extraPackages = mkOption { type = types.listOf types.package; default = []; example = [ pkgs.dcrctl ]; description = "Additional packages to add to the dcrwallet user's environment"; }; }; config = lib.mkIf cfg.enable { users.users.${cfg.user} = { group = cfg.group; home = cfg.dataDir; isNormalUser = true; packages = [ cfg.package ] ++ cfg.extraPackages; # dcrwallet needs read access to the dcrd RPC certificate extraGroups = lib.optional (dcrdEnabled && config.services.dcrd.group != cfg.group) config.services.dcrd.group; }; users.groups.${cfg.group} = {}; systemd.tmpfiles.rules = [ "d ${cfg.dataDir} 0750 ${cfg.user} ${cfg.group} -" ]; systemd.services.dcrwallet = { description = "Decred wallet daemon"; after = [ "network-online.target" ] ++ lib.optional dcrdEnabled "dcrd.service"; wants = [ "network-online.target" ] ++ lib.optional dcrdEnabled "dcrd.service"; wantedBy = [ "multi-user.target" ]; serviceConfig = { User = cfg.user; Group = cfg.group; RuntimeDirectory = "dcrwallet"; StateDirectory = "dcrwallet"; StateDirectoryMode = "0750"; ExecStart = ''${lib.getExe cfg.package} --appdata=${cfg.dataDir} --configfile=${cfg.configFile}''; ExecStartPost = "+${pkgs.coreutils}/bin/chmod 0750 ${cfg.dataDir}"; }; restartTriggers = [ cfg.configFile ]; }; }; }