aboutsummaryrefslogtreecommitdiff
path: root/nixpkgs/nixos/modules/services/misc/cgminer.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/nixos/modules/services/misc/cgminer.nix')
-rw-r--r--nixpkgs/nixos/modules/services/misc/cgminer.nix145
1 files changed, 145 insertions, 0 deletions
diff --git a/nixpkgs/nixos/modules/services/misc/cgminer.nix b/nixpkgs/nixos/modules/services/misc/cgminer.nix
new file mode 100644
index 00000000000..b1cf5a7d110
--- /dev/null
+++ b/nixpkgs/nixos/modules/services/misc/cgminer.nix
@@ -0,0 +1,145 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.cgminer;
+
+ convType = with builtins;
+ v: if isBool v then boolToString v else toString v;
+ mergedHwConfig =
+ mapAttrsToList (n: v: ''"${n}": "${(concatStringsSep "," (map convType v))}"'')
+ (foldAttrs (n: a: [n] ++ a) [] cfg.hardware);
+ mergedConfig = with builtins;
+ mapAttrsToList (n: v: ''"${n}": ${if isBool v then "" else ''"''}${convType v}${if isBool v then "" else ''"''}'')
+ cfg.config;
+
+ cgminerConfig = pkgs.writeText "cgminer.conf" ''
+ {
+ ${concatStringsSep ",\n" mergedHwConfig},
+ ${concatStringsSep ",\n" mergedConfig},
+ "pools": [
+ ${concatStringsSep ",\n"
+ (map (v: ''{"url": "${v.url}", "user": "${v.user}", "pass": "${v.pass}"}'')
+ cfg.pools)}]
+ }
+ '';
+in
+{
+ ###### interface
+ options = {
+
+ services.cgminer = {
+
+ enable = mkOption {
+ default = false;
+ description = ''
+ Whether to enable cgminer, an ASIC/FPGA/GPU miner for bitcoin and
+ litecoin.
+ '';
+ };
+
+ package = mkOption {
+ default = pkgs.cgminer;
+ defaultText = "pkgs.cgminer";
+ description = "Which cgminer derivation to use.";
+ type = types.package;
+ };
+
+ user = mkOption {
+ default = "cgminer";
+ description = "User account under which cgminer runs";
+ };
+
+ pools = mkOption {
+ default = []; # Run benchmark
+ description = "List of pools where to mine";
+ example = [{
+ url = "http://p2pool.org:9332";
+ username = "17EUZxTvs9uRmPsjPZSYUU3zCz9iwstudk";
+ password="X";
+ }];
+ };
+
+ hardware = mkOption {
+ default = []; # Run without options
+ description= "List of config options for every GPU";
+ example = [
+ {
+ intensity = 9;
+ gpu-engine = "0-985";
+ gpu-fan = "0-85";
+ gpu-memclock = 860;
+ gpu-powertune = 20;
+ temp-cutoff = 95;
+ temp-overheat = 85;
+ temp-target = 75;
+ }
+ {
+ intensity = 9;
+ gpu-engine = "0-950";
+ gpu-fan = "0-85";
+ gpu-memclock = 825;
+ gpu-powertune = 20;
+ temp-cutoff = 95;
+ temp-overheat = 85;
+ temp-target = 75;
+ }];
+ };
+
+ config = mkOption {
+ default = {};
+ description = "Additional config";
+ example = {
+ auto-fan = true;
+ auto-gpu = true;
+ expiry = 120;
+ failover-only = true;
+ gpu-threads = 2;
+ log = 5;
+ queue = 1;
+ scan-time = 60;
+ temp-histeresys = 3;
+ };
+ };
+ };
+ };
+
+
+ ###### implementation
+
+ config = mkIf config.services.cgminer.enable {
+
+ users.users = optionalAttrs (cfg.user == "cgminer") (singleton
+ { name = "cgminer";
+ uid = config.ids.uids.cgminer;
+ description = "Cgminer user";
+ });
+
+ environment.systemPackages = [ cfg.package ];
+
+ systemd.services.cgminer = {
+ path = [ pkgs.cgminer ];
+
+ after = [ "network.target" "display-manager.service" ];
+ wantedBy = [ "multi-user.target" ];
+
+ environment = {
+ LD_LIBRARY_PATH = ''/run/opengl-driver/lib:/run/opengl-driver-32/lib'';
+ DISPLAY = ":${toString config.services.xserver.display}";
+ GPU_MAX_ALLOC_PERCENT = "100";
+ GPU_USE_SYNC_OBJECTS = "1";
+ };
+
+ serviceConfig = {
+ ExecStart = "${pkgs.cgminer}/bin/cgminer --syslog --text-only --config ${cgminerConfig}";
+ User = cfg.user;
+ RestartSec = "30s";
+ Restart = "always";
+ StartLimitInterval = "1m";
+ };
+ };
+
+ };
+
+}