nixos/timezone: support imperative timezone configuration (#26608)
Fixes #26469.
This commit is contained in:
parent
449946ef94
commit
a0d464033c
@ -14,13 +14,16 @@ in
|
|||||||
time = {
|
time = {
|
||||||
|
|
||||||
timeZone = mkOption {
|
timeZone = mkOption {
|
||||||
default = "UTC";
|
default = null;
|
||||||
type = types.str;
|
type = types.nullOr types.str;
|
||||||
example = "America/New_York";
|
example = "America/New_York";
|
||||||
description = ''
|
description = ''
|
||||||
The time zone used when displaying times and dates. See <link
|
The time zone used when displaying times and dates. See <link
|
||||||
xlink:href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones"/>
|
xlink:href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones"/>
|
||||||
for a comprehensive list of possible values for this setting.
|
for a comprehensive list of possible values for this setting.
|
||||||
|
|
||||||
|
If null, the timezone will default to UTC and can be set imperatively
|
||||||
|
using timedatectl.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -40,13 +43,14 @@ in
|
|||||||
# This way services are restarted when tzdata changes.
|
# This way services are restarted when tzdata changes.
|
||||||
systemd.globalEnvironment.TZDIR = tzdir;
|
systemd.globalEnvironment.TZDIR = tzdir;
|
||||||
|
|
||||||
environment.etc.localtime =
|
systemd.services.systemd-timedated.environment = lib.optionalAttrs (config.time.timeZone != null) { NIXOS_STATIC_TIMEZONE = "1"; };
|
||||||
{ source = "/etc/zoneinfo/${config.time.timeZone}";
|
|
||||||
mode = "direct-symlink";
|
environment.etc = {
|
||||||
|
zoneinfo.source = tzdir;
|
||||||
|
} // lib.optionalAttrs (config.time.timeZone == null) {
|
||||||
|
localtime.source = "/etc/zoneinfo/${config.time.timeZone}";
|
||||||
|
localtime.mode = "direct-symlink";
|
||||||
};
|
};
|
||||||
|
|
||||||
environment.etc.zoneinfo.source = tzdir;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
45
nixos/tests/timezone.nix
Normal file
45
nixos/tests/timezone.nix
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
{
|
||||||
|
timezone-static = import ./make-test.nix ({ pkgs, ... }: {
|
||||||
|
name = "timezone-static";
|
||||||
|
meta.maintainers = with pkgs.lib.maintainers; [ lheckemann ];
|
||||||
|
|
||||||
|
machine.time.timeZone = "Europe/Amsterdam";
|
||||||
|
|
||||||
|
testScript = ''
|
||||||
|
$machine->waitForUnit("dbus.socket");
|
||||||
|
$machine->fail("timedatectl set-timezone Asia/Tokyo");
|
||||||
|
my @dateResult = $machine->execute('date -d @0 "+%Y-%m-%d %H:%M:%S"');
|
||||||
|
$dateResult[1] eq "1970-01-01 01:00:00\n" or die "Timezone seems to be wrong";
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
|
||||||
|
timezone-imperative = import ./make-test.nix ({ pkgs, ... }: {
|
||||||
|
name = "timezone-imperative";
|
||||||
|
meta.maintainers = with pkgs.lib.maintainers; [ lheckemann ];
|
||||||
|
|
||||||
|
machine.time.timeZone = null;
|
||||||
|
|
||||||
|
testScript = ''
|
||||||
|
$machine->waitForUnit("dbus.socket");
|
||||||
|
|
||||||
|
# Should default to UTC
|
||||||
|
my @dateResult = $machine->execute('date -d @0 "+%Y-%m-%d %H:%M:%S"');
|
||||||
|
print $dateResult[1];
|
||||||
|
$dateResult[1] eq "1970-01-01 00:00:00\n" or die "Timezone seems to be wrong";
|
||||||
|
|
||||||
|
$machine->succeed("timedatectl set-timezone Asia/Tokyo");
|
||||||
|
|
||||||
|
# Adjustment should be taken into account
|
||||||
|
my @dateResult = $machine->execute('date -d @0 "+%Y-%m-%d %H:%M:%S"');
|
||||||
|
print $dateResult[1];
|
||||||
|
$dateResult[1] eq "1970-01-01 09:00:00\n" or die "Timezone was not adjusted";
|
||||||
|
|
||||||
|
# Adjustment should persist across a reboot
|
||||||
|
$machine->shutdown;
|
||||||
|
$machine->waitForUnit("dbus.socket");
|
||||||
|
my @dateResult = $machine->execute('date -d @0 "+%Y-%m-%d %H:%M:%S"');
|
||||||
|
print $dateResult[1];
|
||||||
|
$dateResult[1] eq "1970-01-01 09:00:00\n" or die "Timezone adjustment was not persisted";
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user