diff --git a/modules/misc/ids.nix b/modules/misc/ids.nix index 11f41aa0827..f69ae2f3b9f 100644 --- a/modules/misc/ids.nix +++ b/modules/misc/ids.nix @@ -56,6 +56,7 @@ in sabnzbd = 33; tor = 35; cups = 36; + foldingAtHome = 37; # When adding a uid, make sure it doesn't match an existing gid. nixbld = 30000; # start of range of uids diff --git a/modules/module-list.nix b/modules/module-list.nix index 973c3a3e493..29c2101b707 100644 --- a/modules/module-list.nix +++ b/modules/module-list.nix @@ -62,6 +62,7 @@ ./services/misc/autofs.nix ./services/misc/disnix.nix ./services/misc/felix.nix + ./services/misc/folding-at-home.nix ./services/misc/gpsd.nix ./services/misc/nix-daemon.nix ./services/misc/nix-gc.nix diff --git a/modules/services/misc/folding-at-home.nix b/modules/services/misc/folding-at-home.nix new file mode 100644 index 00000000000..691b752c63c --- /dev/null +++ b/modules/services/misc/folding-at-home.nix @@ -0,0 +1,75 @@ +{ config, pkgs, ... }: +with pkgs.lib; +let + stateDir = "/var/lib/foldingathome"; + cfg = config.services.foldingAtHome; + fahUser = "foldingathome"; +in { + + ###### interface + + options = { + + services.foldingAtHome = { + + enable = mkOption { + default = false; + description = '' + Whether to enable the Folding@Home to use idle CPU time. + ''; + }; + + nickname = mkOption { + default = "Anonymous"; + description = '' + A unique handle for statistics. + ''; + }; + + config = mkOption { + default = ""; + description = '' + Extra configuration. Contents will be added verbatim to the + configuration file. + ''; + }; + + }; + + }; + + ###### implementation + + config = mkIf cfg.enable { + environment.systemPackages = [ pkgs.foldingathome ]; + + users.extraUsers = singleton + { name = fahUser; + uid = config.ids.uids.foldingAtHome; + description = "Folding@Home user"; + home = stateDir; + }; + + jobs.foldingAtHome = + { name = "foldingathome"; + + startOn = "started network-interfaces"; + stopOn = "stopping network-interfaces"; + + preStart = + '' + mkdir -m 0755 -p ${stateDir} + chown ${fahUser} ${stateDir} + cp -f ${pkgs.writeText "client.cfg" cfg.config} ${stateDir}/client.cfg + ''; + exec = "${pkgs.su}/bin/su -s ${pkgs.stdenv.shell} ${fahUser} -c 'cd ${stateDir}; ${pkgs.foldingathome}/bin/fah6'"; + }; + + services.foldingAtHome.config = '' + [settings] + username=${cfg.nickname} + ''; + + }; + +} \ No newline at end of file