vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / system / automatic-timezoned.nix
blob50f84f39af7d2f318c89b1fcc3fb26be00e2b84b
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
6   cfg = config.services.automatic-timezoned;
7 in
9   options = {
10     services.automatic-timezoned = {
11       enable = mkOption {
12         type = types.bool;
13         default = false;
14         description = ''
15           Enable `automatic-timezoned`, simple daemon for keeping the system
16           timezone up-to-date based on the current location. It uses geoclue2 to
17           determine the current location and systemd-timedated to actually set
18           the timezone.
20           To avoid silent overriding by the service, if you have explicitly set a
21           timezone, either remove it or ensure that it is set with a lower priority
22           than the default value using `lib.mkDefault` or `lib.mkOverride`. This is
23           to make the choice deliberate. An error will be presented otherwise.
24         '';
25       };
26       package = mkPackageOption pkgs "automatic-timezoned" { };
27     };
28   };
30   config = mkIf cfg.enable {
31     # This will give users an error if they have set an explicit time
32     # zone, rather than having the service silently override it.
33     time.timeZone = null;
35     security.polkit.extraConfig = ''
36       polkit.addRule(function(action, subject) {
37         if (action.id == "org.freedesktop.timedate1.set-timezone"
38             && subject.user == "automatic-timezoned") {
39           return polkit.Result.YES;
40         }
41       });
42     '';
44     services.geoclue2 = {
45       enable = true;
46       appConfig.automatic-timezoned = {
47         isAllowed = true;
48         isSystem = true;
49         users = [ (toString config.ids.uids.automatic-timezoned) ];
50       };
51     };
53     systemd.services = {
55       automatic-timezoned = {
56         description = "Automatically update system timezone based on location";
57         requires = [ "automatic-timezoned-geoclue-agent.service" ];
58         after = [ "automatic-timezoned-geoclue-agent.service" ];
59         serviceConfig = {
60           Type = "exec";
61           User = "automatic-timezoned";
62           ExecStart = "${cfg.package}/bin/automatic-timezoned";
63         };
64         wantedBy = [ "default.target" ];
65       };
67       automatic-timezoned-geoclue-agent = {
68         description = "Geoclue agent for automatic-timezoned";
69         requires = [ "geoclue.service" ];
70         after = [ "geoclue.service" ];
71         serviceConfig = {
72           Type = "exec";
73           User = "automatic-timezoned";
74           ExecStart = "${pkgs.geoclue2-with-demo-agent}/libexec/geoclue-2.0/demos/agent";
75           Restart = "on-failure";
76           PrivateTmp = true;
77         };
78         wantedBy = [ "default.target" ];
79       };
81     };
83     users = {
84       users.automatic-timezoned = {
85         description = "automatic-timezoned";
86         uid = config.ids.uids.automatic-timezoned;
87         group = "automatic-timezoned";
88       };
89       groups.automatic-timezoned = {
90         gid = config.ids.gids.automatic-timezoned;
91       };
92     };
93   };