1# Zabbix server daemon.
2{ config, lib, pkgs, ... }:
3
4with lib;
5
6let
7
8 cfg = config.services.zabbixServer;
9
10 stateDir = "/var/run/zabbix";
11
12 logDir = "/var/log/zabbix";
13
14 libDir = "/var/lib/zabbix";
15
16 pidFile = "${stateDir}/zabbix_server.pid";
17
18 configFile = pkgs.writeText "zabbix_server.conf"
19 ''
20 LogFile = ${logDir}/zabbix_server
21
22 PidFile = ${pidFile}
23
24 ${optionalString (cfg.dbServer != "localhost") ''
25 DBHost = ${cfg.dbServer}
26 ''}
27
28 DBName = zabbix
29
30 DBUser = zabbix
31
32 ${optionalString (cfg.dbPassword != "") ''
33 DBPassword = ${cfg.dbPassword}
34 ''}
35
36 ${config.services.zabbixServer.extraConfig}
37 '';
38
39 useLocalPostgres = cfg.dbServer == "localhost" || cfg.dbServer == "";
40
41in
42
43{
44
45 ###### interface
46
47 options = {
48
49 services.zabbixServer.enable = mkOption {
50 default = false;
51 type = types.bool;
52 description = ''
53 Whether to run the Zabbix server on this machine.
54 '';
55 };
56
57 services.zabbixServer.dbServer = mkOption {
58 default = "localhost";
59 type = types.str;
60 description = ''
61 Hostname or IP address of the database server.
62 Use an empty string ("") to use peer authentication.
63 '';
64 };
65
66 services.zabbixServer.dbPassword = mkOption {
67 default = "";
68 type = types.str;
69 description = "Password used to connect to the database server.";
70 };
71
72 services.zabbixServer.extraConfig = mkOption {
73 default = "";
74 type = types.lines;
75 description = ''
76 Configuration that is injected verbatim into the configuration file.
77 '';
78 };
79
80 };
81
82 ###### implementation
83
84 config = mkIf cfg.enable {
85
86 services.postgresql.enable = useLocalPostgres;
87
88 users.extraUsers = singleton
89 { name = "zabbix";
90 uid = config.ids.uids.zabbix;
91 description = "Zabbix daemon user";
92 };
93
94 systemd.services."zabbix-server" =
95 { description = "Zabbix Server";
96
97 wantedBy = [ "multi-user.target" ];
98 after = optional useLocalPostgres "postgresql.service";
99
100 preStart =
101 ''
102 mkdir -m 0755 -p ${stateDir} ${logDir} ${libDir}
103 chown zabbix ${stateDir} ${logDir} ${libDir}
104
105 if ! test -e "${libDir}/db-created"; then
106 ${pkgs.postgresql}/bin/createuser --no-superuser --no-createdb --no-createrole zabbix || true
107 ${pkgs.postgresql}/bin/createdb --owner zabbix zabbix || true
108 cat ${pkgs.zabbix.server}/share/zabbix/db/schema/postgresql.sql | ${pkgs.su}/bin/su -s "$SHELL" zabbix -c '${pkgs.postgresql}/bin/psql zabbix'
109 cat ${pkgs.zabbix.server}/share/zabbix/db/data/images_pgsql.sql | ${pkgs.su}/bin/su -s "$SHELL" zabbix -c '${pkgs.postgresql}/bin/psql zabbix'
110 cat ${pkgs.zabbix.server}/share/zabbix/db/data/data.sql | ${pkgs.su}/bin/su -s "$SHELL" zabbix -c '${pkgs.postgresql}/bin/psql zabbix'
111 touch "${libDir}/db-created"
112 fi
113 '';
114
115 path = [ pkgs.nettools ];
116
117 serviceConfig.ExecStart = "@${pkgs.zabbix.server}/sbin/zabbix_server zabbix_server --config ${configFile}";
118 serviceConfig.Type = "forking";
119 serviceConfig.Restart = "always";
120 serviceConfig.RestartSec = 2;
121 serviceConfig.PIDFile = pidFile;
122 };
123
124 };
125
126}