Merge branch 'gammu-smsd' of https://github.com/zohl/nixpkgs into zohl-gammu-smsd

Closes #12998

Changed files
+263 -3
nixos
modules
pkgs
applications
misc
gammu
+1
nixos/modules/misc/ids.nix
···
rspamd = 225;
rmilter = 226;
cfdyndns = 227;
+
gammu-smsd = 228;
# When adding a uid, make sure it doesn't match an existing gid. And don't use uids above 399!
+1
nixos/modules/module-list.nix
···
./services/misc/etcd.nix
./services/misc/felix.nix
./services/misc/folding-at-home.nix
+
./services/misc/gammu-smsd.nix
#./services/misc/gitit.nix
./services/misc/gitlab.nix
./services/misc/gitolite.nix
+253
nixos/modules/services/misc/gammu-smsd.nix
···
+
{ pkgs, lib, config, ... }:
+
+
with lib;
+
let
+
cfg = config.services.gammu-smsd;
+
+
configFile = pkgs.writeText "gammu-smsd.conf" ''
+
[gammu]
+
Device = ${cfg.device.path}
+
Connection = ${cfg.device.connection}
+
SynchronizeTime = ${if cfg.device.synchronizeTime then "yes" else "no"}
+
LogFormat = ${cfg.log.format}
+
${if (cfg.device.pin != null) then "PIN = ${cfg.device.pin}" else ""}
+
${cfg.extraConfig.gammu}
+
+
+
[smsd]
+
LogFile = ${cfg.log.file}
+
Service = ${cfg.backend.service}
+
+
${optionalString (cfg.backend.service == "files") ''
+
InboxPath = ${cfg.backend.files.inboxPath}
+
OutboxPath = ${cfg.backend.files.outboxPath}
+
SentSMSPath = ${cfg.backend.files.sentSMSPath}
+
ErrorSMSPath = ${cfg.backend.files.errorSMSPath}
+
''}
+
+
${optionalString (cfg.backend.service == "sql" && cfg.backend.sql.driver == "sqlite") ''
+
Driver = ${cfg.backend.sql.driver}
+
DBDir = ${cfg.backend.sql.database}
+
''}
+
+
${optionalString (cfg.backend.service == "sql" && cfg.backend.sql.driver == "native_pgsql") (
+
with cfg.backend; ''
+
Driver = ${sql.driver}
+
${if (sql.database!= null) then "Database = ${sql.database}" else ""}
+
${if (sql.host != null) then "Host = ${sql.host}" else ""}
+
${if (sql.user != null) then "User = ${sql.user}" else ""}
+
${if (sql.password != null) then "Password = ${sql.password}" else ""}
+
'')}
+
+
${cfg.extraConfig.smsd}
+
'';
+
+
initDBDir = "share/doc/gammu/examples/sql";
+
+
gammuPackage = with cfg.backend; (pkgs.gammu.override {
+
dbiSupport = (service == "sql" && sql.driver == "sqlite");
+
postgresSupport = (service == "sql" && sql.driver == "native_pgsql");
+
});
+
+
in {
+
options = {
+
services.gammu-smsd = {
+
+
enable = mkEnableOption "gammu-smsd daemon";
+
+
user = mkOption {
+
type = types.str;
+
default = "smsd";
+
description = "User that has access to the device";
+
};
+
+
device = {
+
path = mkOption {
+
type = types.path;
+
description = "Device node or address of the phone";
+
example = "/dev/ttyUSB2";
+
};
+
+
group = mkOption {
+
type = types.str;
+
default = "root";
+
description = "Owner group of the device";
+
example = "dialout";
+
};
+
+
connection = mkOption {
+
type = types.str;
+
default = "at";
+
description = "Protocol which will be used to talk to the phone";
+
};
+
+
synchronizeTime = mkOption {
+
type = types.bool;
+
default = true;
+
description = "Whether to set time from computer to the phone during starting connection";
+
};
+
+
pin = mkOption {
+
type = types.nullOr types.str;
+
default = null;
+
description = "PIN code for the simcard";
+
};
+
};
+
+
+
log = {
+
file = mkOption {
+
type = types.str;
+
default = "syslog";
+
description = "Path to file where information about communication will be stored";
+
};
+
+
format = mkOption {
+
type = types.enum [ "nothing" "text" "textall" "textalldate" "errors" "errorsdate" "binary" ];
+
default = "errors";
+
description = "Determines what will be logged to the LogFile";
+
};
+
};
+
+
+
extraConfig = {
+
gammu = mkOption {
+
type = types.lines;
+
default = "";
+
description = "Extra config lines to be added into [gammu] section";
+
};
+
+
+
smsd = mkOption {
+
type = types.lines;
+
default = "";
+
description = "Extra config lines to be added into [smsd] section";
+
};
+
};
+
+
+
backend = {
+
service = mkOption {
+
type = types.enum [ "null" "files" "sql" ];
+
default = "null";
+
description = "Service to use to store sms data.";
+
};
+
+
files = {
+
inboxPath = mkOption {
+
type = types.path;
+
default = "/var/spool/sms/inbox/";
+
description = "Where the received SMSes are stored";
+
};
+
+
outboxPath = mkOption {
+
type = types.path;
+
default = "/var/spool/sms/outbox/";
+
description = "Where SMSes to be sent should be placed";
+
};
+
+
sentSMSPath = mkOption {
+
type = types.path;
+
default = "/var/spool/sms/sent/";
+
description = "Where the transmitted SMSes are placed";
+
};
+
+
errorSMSPath = mkOption {
+
type = types.path;
+
default = "/var/spool/sms/error/";
+
description = "Where SMSes with error in transmission is placed";
+
};
+
};
+
+
sql = {
+
driver = mkOption {
+
type = types.enum [ "native_mysql" "native_pgsql" "odbc" "dbi" ];
+
description = "DB driver to use";
+
};
+
+
sqlDialect = mkOption {
+
type = types.nullOr types.str;
+
default = null;
+
description = "SQL dialect to use (odbc driver only)";
+
};
+
+
database = mkOption {
+
type = types.str;
+
default = null;
+
description = "Database name to store sms data";
+
};
+
+
host = mkOption {
+
type = types.str;
+
default = "localhost";
+
description = "Database server address";
+
};
+
+
user = mkOption {
+
type = types.nullOr types.str;
+
default = null;
+
description = "User name used for connection to the database";
+
};
+
+
password = mkOption {
+
type = types.nullOr types.str;
+
default = null;
+
description = "User password used for connetion to the database";
+
};
+
};
+
};
+
};
+
};
+
+
config = mkIf cfg.enable {
+
users.extraUsers.${cfg.user} = {
+
description = "gammu-smsd user";
+
uid = config.ids.uids.gammu-smsd;
+
extraGroups = [ "${cfg.device.group}" ];
+
};
+
+
environment.systemPackages = with cfg.backend; [ gammuPackage ]
+
++ optionals (service == "sql" && sql.driver == "sqlite") [ pkgs.sqlite ];
+
+
systemd.services.gammu-smsd = {
+
description = "gammu-smsd daemon";
+
+
wantedBy = [ "multi-user.target" ];
+
+
wants = with cfg.backend; [ ]
+
++ optionals (service == "sql" && sql.driver == "native_pgsql") [ "postgresql.service" ];
+
+
preStart = with cfg.backend;
+
+
optionalString (service == "files") (with files; ''
+
mkdir -m 755 -p ${inboxPath} ${outboxPath} ${sentSMSPath} ${errorSMSPath}
+
chown ${cfg.user} -R ${inboxPath}
+
chown ${cfg.user} -R ${outboxPath}
+
chown ${cfg.user} -R ${sentSMSPath}
+
chown ${cfg.user} -R ${errorSMSPath}
+
'')
+
+ optionalString (service == "sql" && sql.driver == "sqlite") ''
+
cat "${gammuPackage}/${initDBDir}/sqlite.sql" \
+
| ${pkgs.sqlite}/bin/sqlite3 ${sql.database}
+
''
+
+ (let execPsql = extraArgs: concatStringsSep " " [
+
(optionalString (sql.password != null) "PGPASSWORD=${sql.password}")
+
"${config.services.postgresql.package}/bin/psql"
+
(optionalString (sql.host != null) "-h ${sql.host}")
+
(optionalString (sql.user != null) "-U ${sql.user}")
+
"$extraArgs"
+
"${sql.database}"
+
]; in optionalString (service == "sql" && sql.driver == "native_pgsql") ''
+
echo '\i '"${gammuPackage}/${initDBDir}/pgsql.sql" | ${execPsql ""}
+
'');
+
+
serviceConfig = {
+
User = "${cfg.user}";
+
Group = "${cfg.device.group}";
+
PermissionsStartOnly = true;
+
ExecStart = "${gammuPackage}/bin/gammu-smsd -c ${configFile}";
+
};
+
+
};
+
};
+
}
+8 -3
pkgs/applications/misc/gammu/default.nix
···
{ stdenv, fetchurl, python, pkgconfig, cmake, bluez, libusb1, curl
-
, libiconv, gettext, sqlite }:
+
, libiconv, gettext, sqlite
+
, dbiSupport ? false, libdbi ? null, libdbiDrivers ? null
+
, postgresSupport ? false, postgresql ? null
+
}:
with stdenv.lib;
···
patches = [ ./bashcomp-dir.patch ];
-
buildInputs = [ python pkgconfig cmake bluez libusb1 curl gettext sqlite libiconv ];
+
buildInputs = [ python pkgconfig cmake bluez libusb1 curl gettext sqlite libiconv ]
+
++ optionals dbiSupport [ libdbi libdbiDrivers ]
+
++ optionals postgresSupport [ postgresql ];
enableParallelBuilding = true;
meta = {
homepage = "http://wammu.eu/gammu/";
-
description = "Command line utility and library to control mobil phones";
+
description = "Command line utility and library to control mobile phones";
license = licenses.gpl2;
platforms = platforms.linux;
maintainers = [ maintainers.coroa ];