From 5b9c6c5a289f8d4c7c33e78befc2a76c2c24a3ff Mon Sep 17 00:00:00 2001 From: xeals Date: Thu, 9 Nov 2023 09:36:59 +1100 Subject: [PATCH] modules/porkbun-ddns: init --- modules/services/networking/porkbun-ddns.nix | 74 ++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 modules/services/networking/porkbun-ddns.nix diff --git a/modules/services/networking/porkbun-ddns.nix b/modules/services/networking/porkbun-ddns.nix new file mode 100644 index 0000000..ba512cc --- /dev/null +++ b/modules/services/networking/porkbun-ddns.nix @@ -0,0 +1,74 @@ +{ config, lib, pkgs, ... }: +let + inherit (lib) mkOption types; + + cfg = config.services.porkbun-ddns; +in +{ + options = { + services.porkbun-ddns = { + enable = lib.mkEnableOption "Porkbun dynamic DNS client"; + + package = mkOption { + # TODO: How do I use mkPackageOption when the package isn't in the + # package set? + type = types.package; + default = (import ../../..).porkbun-ddns; + defaultText = "pkgs.porkbun-ddns"; + description = lib.mdDoc "The porkbun-ddns package to use."; + }; + + interval = mkOption { + type = types.str; + default = "10m"; + default = lib.mdDoc '' + Interval to update dynamic DNS records. The default is to update every + 10 minutes. The format is described in {manpage}`systemd.time(7)`. + ''; + }; + + domains = mkOption { + type = types.listOf types.str; + default = [ ]; + description = lib.mdDoc "Domains to update."; + }; + + apiKeyFile = mkOption { + type = types.nullOr types.path; + description = lib.mdDoc '' + File containing the API key to use when running the client. + ''; + }; + + secretApiKeyFile = mkOption { + type = types.nullOr types.path; + description = lib.mdDoc '' + File containing the secret API key to use when running the + client. + ''; + }; + }; + }; + + config = lib.mkIf cfg.enable { + systemd.services.porkbun-ddns = { + description = "Porkbun dynamic DNS client"; + script = '' + ${cfg.package}/bin/porkbun-ddns \ + -K ${cfg.apiKeyFile} \ + -S ${cfg.secretApiKeyFile} \ + ${lib.concatStringsSep " " cfg.domains} + ''; + }; + + systemd.timers.porkbun-ddns = { + description = "Porkbun dynamic DNS client"; + wants = [ "network-online.target" ]; + wantedBy = [ "timers.target" ]; + timerConfig = { + OnBootSec = cfg.interval; + OnUnitActiveSec = cfg.interval; + }; + }; + }; +}