grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / misc / cgminer.nix
blob6aa6bc63c99c87b0c29f915dae9afeb77db451d7
1 { config, lib, pkgs, ... }:
2 let
3   cfg = config.services.cgminer;
5   convType = with builtins;
6     v: if lib.isBool v then lib.boolToString v else toString v;
7   mergedHwConfig =
8     lib.mapAttrsToList (n: v: ''"${n}": "${(lib.concatStringsSep "," (map convType v))}"'')
9       (lib.foldAttrs (n: a: [n] ++ a) [] cfg.hardware);
10   mergedConfig = with builtins;
11     lib.mapAttrsToList (n: v: ''"${n}":  ${if lib.isBool v then convType v else ''"${convType v}"''}'')
12       cfg.config;
14   cgminerConfig = pkgs.writeText "cgminer.conf" ''
15   {
16   ${lib.concatStringsSep ",\n" mergedHwConfig},
17   ${lib.concatStringsSep ",\n" mergedConfig},
18   "pools": [
19   ${lib.concatStringsSep ",\n"
20     (map (v: ''{"url": "${v.url}", "user": "${v.user}", "pass": "${v.pass}"}'')
21           cfg.pools)}]
22   }
23   '';
26   ###### interface
27   options = {
29     services.cgminer = {
31       enable = lib.mkEnableOption "cgminer, an ASIC/FPGA/GPU miner for bitcoin and litecoin";
33       package = lib.mkPackageOption pkgs "cgminer" { };
35       user = lib.mkOption {
36         type = lib.types.str;
37         default = "cgminer";
38         description = "User account under which cgminer runs";
39       };
41       pools = lib.mkOption {
42         default = [];  # Run benchmark
43         type = lib.types.listOf (lib.types.attrsOf lib.types.str);
44         description = "List of pools where to mine";
45         example = [{
46           url = "http://p2pool.org:9332";
47           username = "17EUZxTvs9uRmPsjPZSYUU3zCz9iwstudk";
48           password="X";
49         }];
50       };
52       hardware = lib.mkOption {
53         default = []; # Run without options
54         type = lib.types.listOf (lib.types.attrsOf (lib.types.either lib.types.str lib.types.int));
55         description= "List of config options for every GPU";
56         example = [
57         {
58           intensity = 9;
59           gpu-engine = "0-985";
60           gpu-fan = "0-85";
61           gpu-memclock = 860;
62           gpu-powertune = 20;
63           temp-cutoff = 95;
64           temp-overheat = 85;
65           temp-target = 75;
66         }
67         {
68           intensity = 9;
69           gpu-engine = "0-950";
70           gpu-fan = "0-85";
71           gpu-memclock = 825;
72           gpu-powertune = 20;
73           temp-cutoff = 95;
74           temp-overheat = 85;
75           temp-target = 75;
76         }];
77       };
79       config = lib.mkOption {
80         default = {};
81         type = lib.types.attrsOf (lib.types.either lib.types.bool lib.types.int);
82         description = "Additional config";
83         example = {
84           auto-fan = true;
85           auto-gpu = true;
86           expiry = 120;
87           failover-only = true;
88           gpu-threads = 2;
89           log = 5;
90           queue = 1;
91           scan-time = 60;
92           temp-histeresys = 3;
93         };
94       };
95     };
96   };
99   ###### implementation
101   config = lib.mkIf config.services.cgminer.enable {
103     users.users = lib.optionalAttrs (cfg.user == "cgminer") {
104       cgminer = {
105         isSystemUser = true;
106         group = "cgminer";
107         description = "Cgminer user";
108       };
109     };
110     users.groups = lib.optionalAttrs (cfg.user == "cgminer") {
111       cgminer = {};
112     };
114     environment.systemPackages = [ cfg.package ];
116     systemd.services.cgminer = {
117       path = [ pkgs.cgminer ];
119       after = [ "network.target" "display-manager.service" ];
120       wantedBy = [ "multi-user.target" ];
122       environment = {
123         LD_LIBRARY_PATH = "/run/opengl-driver/lib:/run/opengl-driver-32/lib";
124         DISPLAY = ":${toString config.services.xserver.display}";
125         GPU_MAX_ALLOC_PERCENT = "100";
126         GPU_USE_SYNC_OBJECTS = "1";
127       };
129       startLimitIntervalSec = 60;  # 1 min
130       serviceConfig = {
131         ExecStart = "${pkgs.cgminer}/bin/cgminer --syslog --text-only --config ${cgminerConfig}";
132         User = cfg.user;
133         RestartSec = "30s";
134         Restart = "always";
135       };
136     };
138   };