75 lines
2.0 KiB
Nix
75 lines
2.0 KiB
Nix
|
{ 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 = pkgs.callPackage ../../../pkgs/by-name/po/porkbun-ddns/package.nix { };
|
||
|
defaultText = "pkgs.porkbun-ddns";
|
||
|
description = lib.mdDoc "The porkbun-ddns package to use.";
|
||
|
};
|
||
|
|
||
|
interval = mkOption {
|
||
|
type = types.str;
|
||
|
default = "10m";
|
||
|
description = 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;
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
}
|