python3Packages.orjson: Disable failing tests on 32 bit
[NixPkgs.git] / nixos / modules / services / misc / gammu-smsd.nix
blob72e83a249c84c94b05f2d1afb4d13a27e3c447fe
1 { pkgs, lib, config, ... }:
3 with lib;
4 let
5   cfg = config.services.gammu-smsd;
7   configFile = pkgs.writeText "gammu-smsd.conf" ''
8     [gammu]
9     Device = ${cfg.device.path}
10     Connection = ${cfg.device.connection}
11     SynchronizeTime = ${if cfg.device.synchronizeTime then "yes" else "no"}
12     LogFormat = ${cfg.log.format}
13     ${if (cfg.device.pin != null) then "PIN = ${cfg.device.pin}" else ""}
14     ${cfg.extraConfig.gammu}
17     [smsd]
18     LogFile = ${cfg.log.file}
19     Service = ${cfg.backend.service}
21     ${optionalString (cfg.backend.service == "files") ''
22       InboxPath = ${cfg.backend.files.inboxPath}
23       OutboxPath = ${cfg.backend.files.outboxPath}
24       SentSMSPath = ${cfg.backend.files.sentSMSPath}
25       ErrorSMSPath = ${cfg.backend.files.errorSMSPath}
26     ''}
28     ${optionalString (cfg.backend.service == "sql" && cfg.backend.sql.driver == "sqlite") ''
29       Driver = ${cfg.backend.sql.driver}
30       DBDir = ${cfg.backend.sql.database}
31     ''}
33     ${optionalString (cfg.backend.service == "sql" && cfg.backend.sql.driver == "native_pgsql") (
34       with cfg.backend; ''
35         Driver = ${sql.driver}
36         ${if (sql.database!= null) then "Database = ${sql.database}" else ""}
37         ${if (sql.host != null) then "Host = ${sql.host}" else ""}
38         ${if (sql.user != null) then "User = ${sql.user}" else ""}
39         ${if (sql.password != null) then "Password = ${sql.password}" else ""}
40       '')}
42     ${cfg.extraConfig.smsd}
43   '';
45   initDBDir = "share/doc/gammu/examples/sql";
47   gammuPackage = with cfg.backend; (pkgs.gammu.override {
48     dbiSupport = (service == "sql" && sql.driver == "sqlite");
49     postgresSupport = (service == "sql" && sql.driver == "native_pgsql");
50   });
52 in {
53   options = {
54     services.gammu-smsd = {
56       enable = mkEnableOption (lib.mdDoc "gammu-smsd daemon");
58       user = mkOption {
59         type = types.str;
60         default = "smsd";
61         description = lib.mdDoc "User that has access to the device";
62       };
64       device = {
65         path = mkOption {
66           type = types.path;
67           description = lib.mdDoc "Device node or address of the phone";
68           example = "/dev/ttyUSB2";
69         };
71         group = mkOption {
72           type = types.str;
73           default = "root";
74           description = lib.mdDoc "Owner group of the device";
75           example = "dialout";
76         };
78         connection = mkOption {
79           type = types.str;
80           default = "at";
81           description = lib.mdDoc "Protocol which will be used to talk to the phone";
82         };
84         synchronizeTime = mkOption {
85           type = types.bool;
86           default = true;
87           description = lib.mdDoc "Whether to set time from computer to the phone during starting connection";
88         };
90         pin = mkOption {
91           type = types.nullOr types.str;
92           default = null;
93           description = lib.mdDoc "PIN code for the simcard";
94         };
95       };
98       log = {
99         file = mkOption {
100           type = types.str;
101           default = "syslog";
102           description = lib.mdDoc "Path to file where information about communication will be stored";
103         };
105         format = mkOption {
106           type = types.enum [ "nothing" "text" "textall" "textalldate" "errors" "errorsdate" "binary" ];
107           default = "errors";
108           description = lib.mdDoc "Determines what will be logged to the LogFile";
109         };
110       };
113       extraConfig = {
114         gammu = mkOption {
115           type = types.lines;
116           default = "";
117           description = lib.mdDoc "Extra config lines to be added into [gammu] section";
118         };
121         smsd = mkOption {
122           type = types.lines;
123           default = "";
124           description = lib.mdDoc "Extra config lines to be added into [smsd] section";
125         };
126       };
129       backend = {
130         service = mkOption {
131           type = types.enum [ "null" "files" "sql" ];
132           default = "null";
133           description = lib.mdDoc "Service to use to store sms data.";
134         };
136         files = {
137           inboxPath = mkOption {
138             type = types.path;
139             default = "/var/spool/sms/inbox/";
140             description = lib.mdDoc "Where the received SMSes are stored";
141           };
143           outboxPath = mkOption {
144             type = types.path;
145             default = "/var/spool/sms/outbox/";
146             description = lib.mdDoc "Where SMSes to be sent should be placed";
147           };
149           sentSMSPath = mkOption {
150             type = types.path;
151             default = "/var/spool/sms/sent/";
152             description = lib.mdDoc "Where the transmitted SMSes are placed";
153           };
155           errorSMSPath = mkOption {
156             type = types.path;
157             default = "/var/spool/sms/error/";
158             description = lib.mdDoc "Where SMSes with error in transmission is placed";
159           };
160         };
162         sql = {
163           driver = mkOption {
164             type = types.enum [ "native_mysql" "native_pgsql" "odbc" "dbi" ];
165             description = lib.mdDoc "DB driver to use";
166           };
168           sqlDialect = mkOption {
169             type = types.nullOr types.str;
170             default = null;
171             description = lib.mdDoc "SQL dialect to use (odbc driver only)";
172           };
174           database = mkOption {
175             type = types.nullOr types.str;
176             default = null;
177             description = lib.mdDoc "Database name to store sms data";
178           };
180           host = mkOption {
181             type = types.str;
182             default = "localhost";
183             description = lib.mdDoc "Database server address";
184           };
186           user = mkOption {
187             type = types.nullOr types.str;
188             default = null;
189             description = lib.mdDoc "User name used for connection to the database";
190           };
192           password = mkOption {
193             type = types.nullOr types.str;
194             default = null;
195             description = lib.mdDoc "User password used for connetion to the database";
196           };
197         };
198       };
199     };
200   };
202   config = mkIf cfg.enable {
203     users.users.${cfg.user} = {
204       description = "gammu-smsd user";
205       isSystemUser = true;
206       group = cfg.device.group;
207     };
209     environment.systemPackages = with cfg.backend; [ gammuPackage ]
210     ++ optionals (service == "sql" && sql.driver == "sqlite")  [ pkgs.sqlite ];
212     systemd.services.gammu-smsd = {
213       description = "gammu-smsd daemon";
215       wantedBy = [ "multi-user.target" ];
217       wants = with cfg.backend; [ ]
218       ++ optionals (service == "sql" && sql.driver == "native_pgsql") [ "postgresql.service" ];
220       preStart = with cfg.backend;
222         optionalString (service == "files") (with files; ''
223           mkdir -m 755 -p ${inboxPath} ${outboxPath} ${sentSMSPath} ${errorSMSPath}
224           chown ${cfg.user} -R ${inboxPath}
225           chown ${cfg.user} -R ${outboxPath}
226           chown ${cfg.user} -R ${sentSMSPath}
227           chown ${cfg.user} -R ${errorSMSPath}
228         '')
229       + optionalString (service == "sql" && sql.driver == "sqlite") ''
230          cat "${gammuPackage}/${initDBDir}/sqlite.sql" \
231          | ${pkgs.sqlite.bin}/bin/sqlite3 ${sql.database}
232         ''
233       + (let execPsql = extraArgs: concatStringsSep " " [
234           (optionalString (sql.password != null) "PGPASSWORD=${sql.password}")
235           "${config.services.postgresql.package}/bin/psql"
236           (optionalString (sql.host != null) "-h ${sql.host}")
237           (optionalString (sql.user != null) "-U ${sql.user}")
238           "$extraArgs"
239           "${sql.database}"
240         ]; in optionalString (service == "sql" && sql.driver == "native_pgsql") ''
241          echo '\i '"${gammuPackage}/${initDBDir}/pgsql.sql" | ${execPsql ""}
242        '');
244       serviceConfig = {
245         User = "${cfg.user}";
246         Group = "${cfg.device.group}";
247         PermissionsStartOnly = true;
248         ExecStart = "${gammuPackage}/bin/gammu-smsd -c ${configFile}";
249       };
251     };
252   };