at 18.09-beta 3.3 kB view raw
1{ config, pkgs, lib, ... }: 2let 3 inherit (lib) mkOption mkEnableOption mkIf mkMerge types optional; 4 5 cfg = config.services.uptime; 6 7 configDir = pkgs.runCommand "config" {} (if cfg.configFile != null then '' 8 mkdir $out 9 ext=`echo ${cfg.configFile} | grep -o \\..*` 10 ln -sv ${cfg.configFile} $out/default$ext 11 ln -sv /var/lib/uptime/runtime.json $out/runtime.json 12 '' else '' 13 mkdir $out 14 cat ${pkgs.nodePackages.node-uptime}/lib/node_modules/node-uptime/config/default.yaml > $out/default.yaml 15 cat >> $out/default.yaml <<EOF 16 17 autoStartMonitor: false 18 19 mongodb: 20 connectionString: 'mongodb://localhost/uptime' 21 EOF 22 ln -sv /var/lib/uptime/runtime.json $out/runtime.json 23 ''); 24in { 25 options.services.uptime = { 26 configFile = mkOption { 27 description = '' 28 The uptime configuration file 29 30 If mongodb: server != localhost, please set usesRemoteMongo = true 31 32 If you only want to run the monitor, please set enableWebService = false 33 and enableSeparateMonitoringService = true 34 35 If autoStartMonitor: false (recommended) and you want to run both 36 services, please set enableSeparateMonitoringService = true 37 ''; 38 39 type = types.nullOr types.path; 40 41 default = null; 42 }; 43 44 usesRemoteMongo = mkOption { 45 description = "Whether the configuration file specifies a remote mongo instance"; 46 47 default = false; 48 49 type = types.bool; 50 }; 51 52 enableWebService = mkEnableOption "the uptime monitoring program web service"; 53 54 enableSeparateMonitoringService = mkEnableOption "the uptime monitoring service" // { default = cfg.enableWebService; }; 55 56 nodeEnv = mkOption { 57 description = "The node environment to run in (development, production, etc.)"; 58 59 type = types.string; 60 61 default = "production"; 62 }; 63 }; 64 65 config = mkMerge [ (mkIf cfg.enableWebService { 66 systemd.services.uptime = { 67 description = "uptime web service"; 68 wantedBy = [ "multi-user.target" ]; 69 environment = { 70 NODE_CONFIG_DIR = configDir; 71 NODE_ENV = cfg.nodeEnv; 72 NODE_PATH = "${pkgs.nodePackages.node-uptime}/lib/node_modules/node-uptime/node_modules"; 73 }; 74 preStart = "mkdir -p /var/lib/uptime"; 75 serviceConfig.ExecStart = "${pkgs.nodejs}/bin/node ${pkgs.nodePackages.node-uptime}/lib/node_modules/node-uptime/app.js"; 76 }; 77 78 services.mongodb.enable = mkIf (!cfg.usesRemoteMongo) true; 79 }) (mkIf cfg.enableSeparateMonitoringService { 80 systemd.services.uptime-monitor = { 81 description = "uptime monitoring service"; 82 wantedBy = [ "multi-user.target" ]; 83 requires = optional cfg.enableWebService "uptime.service"; 84 after = optional cfg.enableWebService "uptime.service"; 85 environment = { 86 NODE_CONFIG_DIR = configDir; 87 NODE_ENV = cfg.nodeEnv; 88 NODE_PATH = "${pkgs.nodePackages.node-uptime}/lib/node_modules/node-uptime/node_modules"; 89 }; 90 # Ugh, need to wait for web service to be up 91 preStart = if cfg.enableWebService then "sleep 1s" else "mkdir -p /var/lib/uptime"; 92 serviceConfig.ExecStart = "${pkgs.nodejs}/bin/node ${pkgs.nodePackages.node-uptime}/lib/node_modules/node-uptime/monitor.js"; 93 }; 94 }) ]; 95}