summaryrefslogtreecommitdiffstats
path: root/nixos/modules/services/monitoring/tuptime.nix
blob: 67706e63f289288e9df9a63cb5dc9e46afd665e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
{
  config,
  lib,
  pkgs,
  ...
}:
let

  cfg = config.services.tuptime;

in
{

  options.services.tuptime = {

    enable = lib.mkEnableOption "the total uptime service";

    timer = {
      enable = lib.mkOption {
        type = lib.types.bool;
        default = true;
        description = "Whether to regularly log uptime to detect bad shutdowns.";
      };

      period = lib.mkOption {
        type = lib.types.str;
        default = "*:0/5";
        description = "systemd calendar event";
      };
    };
  };

  config = lib.mkIf cfg.enable {

    environment.systemPackages = [ pkgs.tuptime ];

    users = {
      groups._tuptime.members = [ "_tuptime" ];
      users._tuptime = {
        isSystemUser = true;
        group = "_tuptime";
        description = "tuptime database owner";
      };
    };

    systemd = {
      services = {

        tuptime = {
          description = "The total uptime service";
          documentation = [ "man:tuptime(1)" ];
          after = [ "time-sync.target" ];
          wantedBy = [ "multi-user.target" ];
          serviceConfig = {
            StateDirectory = "tuptime";
            Type = "oneshot";
            User = "_tuptime";
            RemainAfterExit = true;
            ExecStart = "${pkgs.tuptime}/bin/tuptime -q";
            ExecStop = "${pkgs.tuptime}/bin/tuptime -qg";
          };
        };

        tuptime-sync = lib.mkIf cfg.timer.enable {
          description = "Tuptime scheduled sync service";
          serviceConfig = {
            Type = "oneshot";
            User = "_tuptime";
            ExecStart = "${pkgs.tuptime}/bin/tuptime -q";
          };
        };
      };

      timers.tuptime-sync = lib.mkIf cfg.timer.enable {
        description = "Tuptime scheduled sync timer";
        # this timer should be started if the service is started
        # even if the timer was previously stopped
        wantedBy = [
          "tuptime.service"
          "timers.target"
        ];
        # this timer should be stopped if the service is stopped
        partOf = [ "tuptime.service" ];
        timerConfig = {
          OnBootSec = "1min";
          OnCalendar = cfg.timer.period;
          Unit = "tuptime-sync.service";
        };
      };
    };
  };
}