diff --git a/nixos/modules/services/misc/tzupdate.nix b/nixos/modules/services/misc/tzupdate.nix index 18fee37ddd1b..454b47620e11 100644 --- a/nixos/modules/services/misc/tzupdate.nix +++ b/nixos/modules/services/misc/tzupdate.nix @@ -18,6 +18,25 @@ in update the timezone. ''; }; + + package = lib.mkPackageOption pkgs "tzupdate" { }; + + timer.enable = lib.mkOption { + type = lib.types.bool; + default = true; + description = '' + Enable the tzupdate timer to update the timezone automatically. + ''; + }; + + timer.interval = lib.mkOption { + type = lib.types.str; + default = "hourly"; + description = '' + The interval at which the tzupdate timer should run. See + {manpage}`systemd.time(7)` to understand the format. + ''; + }; }; config = lib.mkIf cfg.enable { @@ -26,15 +45,16 @@ in # zone, which is better than silently overriding it. time.timeZone = null; - # We provide a one-shot service which can be manually run. We could - # provide a service that runs on startup, but it's tricky to get - # a service to run after you have *internet* access. + # We provide a one-shot service that runs at startup once network + # interfaces are up, but we can’t ensure we actually have Internet access + # at that point. It can also be run manually with `systemctl start tzupdate`. systemd.services.tzupdate = { description = "tzupdate timezone update service"; + wantedBy = [ "multi-user.target" ]; wants = [ "network-online.target" ]; after = [ "network-online.target" ]; script = '' - timezone="$(${lib.getExe pkgs.tzupdate} --print-only)" + timezone="$(${lib.getExe cfg.package} --print-only)" if [[ -n "$timezone" ]]; then echo "Setting timezone to '$timezone'" timedatectl set-timezone "$timezone" @@ -45,6 +65,17 @@ in Type = "oneshot"; }; }; + + systemd.timers.tzupdate = { + enable = cfg.timer.enable; + interval = cfg.timer.interval; + timerConfig = { + OnStartupSec = "30s"; + OnCalendar = cfg.timer.interval; + Persistent = true; + }; + wantedBy = [ "timers.target" ]; + }; }; meta.maintainers = with lib.maintainers; [ doronbehar ];