{ config, lib, pkgs, ... }: let probesFormat = pkgs.formats.json { }; cfg = config.statelessUptimeKuma; in { options.statelessUptimeKuma = { build = { json = lib.mkOption { type = lib.types.package; }; script = lib.mkOption { type = lib.types.package; }; }; enableService = lib.mkEnableOption "the auto-deployment systemd unit"; host = lib.mkOption { default = null; type = with lib.types; nullOr str; }; username = lib.mkOption { default = null; type = with lib.types; nullOr str; }; passwordFile = lib.mkOption { type = with lib.types; nullOr path; }; extraFlags = lib.mkOption { default = [ ]; example = [ "--scrape-http-keywords" ]; type = with lib.types; listOf str; description = lib.mdDoc '' Extra arguments to use for executing `stateless-uptime-kuma`. ''; }; lib = lib.mkOption { type = lib.types.raw; }; probesConfig = { monitors = lib.mkOption { type = with lib.types; attrsOf probesFormat.type; default = { }; }; tags = lib.mkOption { type = with lib.types; attrsOf probesFormat.type; default = { }; }; notifications = lib.mkOption { type = with lib.types; attrsOf probesFormat.type; default = { }; }; status_pages = lib.mkOption { type = with lib.types; attrsOf probesFormat.type; default = { }; }; }; }; config = { statelessUptimeKuma = { lib = import ../lib { inherit lib; }; extraFlags = lib.optional (cfg.host != null) "--host ${cfg.host}" ++ lib.optional (cfg.username != null) "--username ${cfg.username}"; build = { json = probesFormat.generate "probes.json" cfg.probesConfig; script = pkgs.writeShellApplication { name = "deploy-uptime-kuma-probes"; runtimeInputs = [ pkgs.statelessUptimeKuma ]; text = '' args=("$@") stateless-uptime-kuma apply-json -f ${cfg.build.json} ${builtins.concatStringsSep " " cfg.extraFlags} "''${args[@]}" ''; }; }; }; systemd.services.stateless-uptime-kuma = lib.mkIf cfg.enableService { description = "Uptime-kuma probes deployment"; wants = [ "uptime-kuma.service" ]; after = [ "uptime-kuma.service" ]; wantedBy = [ "multi-user.target" ]; script = '' UPTIME_KUMA_PASSWORD=$(cat $CREDENTIALS_DIRECTORY/password) ${lib.getExe config.statelessUptimeKuma.build.script} ''; serviceConfig = { LoadCredential = "password:${cfg.passwordFile}"; Type = "oneshot"; }; }; }; }