inputs: { config, lib, pkgs, ... }: let inherit (pkgs.stdenv.hostPlatform) system; cfg = config.services.birdtown-visit-counter; inherit (lib) types mkOption mkIf; package = inputs.self.packages."${system}".birdtown-visit-counter; in { options.services.birdtown-visit-counter = { enable = mkOption { type = types.bool; default = false; }; listenPort = mkOption { type = types.int; default = 11567; }; }; config = { users.users.birdtown-visit-counter = { group = "birdtown-visit-counter"; home = "/var/lib/birdtown-visit-counter"; isSystemUser = true; createHome = true; }; users.groups.birdtown-visit-counter = { }; systemd.services.birdtown-visit-counter = { after = [ "network.target" ]; wantedBy = [ "multi-user.target" ]; serviceConfig = { ExecStart = "${package}/bin/birdtown-visit-counter -addr :${cfg.listenPort} -file visits.json"; User = "birdtown-visit-counter"; Group = "birdtown-visit-counter"; WorkingDirectory = "/var/lib/birdtown-visit-counter"; }; }; systemd.timers.birdtown-visits-saver = { wantedBy = [ "timers.target" ]; timerConfig = { OnBootSec = "10m"; OnUnitActiveSec = "10m"; Unit = "birdtown-visits-saver.service"; }; }; systemd.services.birdtown-visits-saver = { script = '' set -eu if ${pkgs.curl}/bin/curl http://localhost:${cfg.listenPort}/visits > visits-new.json; then cp visits-new.json "$(date +"%Y-%m-%d-%H-%M").json" mv visits-new.json visits.json fi ''; serviceConfig = { Type = "oneshot"; User = "birdtown-visit-counter"; Group = "birdtown-visit-counter"; WorkingDirectory = "/var/lib/birdtown-visit-counter"; }; }; }; }