1{ config, pkgs, lib, ... }:
2let
3 inherit (lib) mkOption mkEnableOption mkIf mkMerge types optionalAttrs 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}