grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / misc / gpsd.nix
blob76aa151f204adf608cf6d1190d2995aef1e1f4f1
1 { config, lib, pkgs, utils, ... }:
2 let
4   uid = config.ids.uids.gpsd;
5   gid = config.ids.gids.gpsd;
6   cfg = config.services.gpsd;
8 in {
10   ###### interface
12   imports = [
13     (lib.mkRemovedOptionModule [ "services" "gpsd" "device" ]
14       "Use `services.gpsd.devices` instead.")
15   ];
17   options = {
19     services.gpsd = {
21       enable = lib.mkOption {
22         type = lib.types.bool;
23         default = false;
24         description = ''
25           Whether to enable `gpsd`, a GPS service daemon.
26         '';
27       };
29       devices = lib.mkOption {
30         type = lib.types.listOf lib.types.str;
31         default = [ "/dev/ttyUSB0" ];
32         description = ''
33           List of devices that `gpsd` should subscribe to.
35           A device may be a local serial device for GPS input, or a
36           URL of the form:
37           `[{dgpsip|ntrip}://][user:passwd@]host[:port][/stream]` in
38           which case it specifies an input source for DGPS or ntrip
39           data.
40         '';
41       };
43       readonly = lib.mkOption {
44         type = lib.types.bool;
45         default = true;
46         description = ''
47           Whether to enable the broken-device-safety, otherwise
48           known as read-only mode.  Some popular bluetooth and USB
49           receivers lock up or become totally inaccessible when
50           probed or reconfigured.  This switch prevents gpsd from
51           writing to a receiver.  This means that gpsd cannot
52           configure the receiver for optimal performance, but it
53           also means that gpsd cannot break the receiver.  A better
54           solution would be for Bluetooth to not be so fragile.  A
55           platform independent method to identify
56           serial-over-Bluetooth devices would also be nice.
57         '';
58       };
60       nowait = lib.mkOption {
61         type = lib.types.bool;
62         default = false;
63         description = ''
64           don't wait for client connects to poll GPS
65         '';
66       };
68       port = lib.mkOption {
69         type = lib.types.port;
70         default = 2947;
71         description = ''
72           The port where to listen for TCP connections.
73         '';
74       };
76       debugLevel = lib.mkOption {
77         type = lib.types.int;
78         default = 0;
79         description = ''
80           The debugging level.
81         '';
82       };
84       listenany = lib.mkOption {
85         type = lib.types.bool;
86         default = false;
87         description = ''
88           Listen on all addresses rather than just loopback.
89         '';
90       };
92       extraArgs = lib.mkOption {
93         type = lib.types.listOf lib.types.str;
94         default = [ ];
95         example = [ "-r" "-s" "19200" ];
96         description = ''
97           A list of extra command line arguments to pass to gpsd.
98           Check gpsd(8) mangpage for possible arguments.
99         '';
100       };
102     };
104   };
106   ###### implementation
108   config = lib.mkIf cfg.enable {
110     users.users.gpsd = {
111       inherit uid;
112       group = "gpsd";
113       description = "gpsd daemon user";
114       home = "/var/empty";
115     };
117     users.groups.gpsd = { inherit gid; };
119     systemd.services.gpsd = {
120       description = "GPSD daemon";
121       wantedBy = [ "multi-user.target" ];
122       after = [ "network.target" ];
123       serviceConfig = {
124         Type = "forking";
125         ExecStart = let
126           devices = utils.escapeSystemdExecArgs cfg.devices;
127           extraArgs = utils.escapeSystemdExecArgs cfg.extraArgs;
128         in ''
129           ${pkgs.gpsd}/sbin/gpsd -D "${toString cfg.debugLevel}"  \
130             -S "${toString cfg.port}"                             \
131             ${lib.optionalString cfg.readonly "-b"}                   \
132             ${lib.optionalString cfg.nowait "-n"}                     \
133             ${lib.optionalString cfg.listenany "-G"}                  \
134             ${extraArgs}                                          \
135             ${devices}
136         '';
137       };
138     };
140   };