diff options
author | Oleg Pykhalov <go.wigust@gmail.com> | 2018-11-29 20:41:40 +0300 |
---|---|---|
committer | Oleg Pykhalov <go.wigust@gmail.com> | 2018-12-17 22:09:11 +0300 |
commit | 85c07cff9cd2197a16c2d3544e4930e278513cf7 (patch) | |
tree | 8429b1fa84a36f2b408fdc1bc4f3fd852d871f83 | |
parent | 1a3e7534d0a02fad1d19173985cf47e1aaa3b956 (diff) | |
download | patches-85c07cff9cd2197a16c2d3544e4930e278513cf7.tar patches-85c07cff9cd2197a16c2d3544e4930e278513cf7.tar.gz |
services: monitoring: Add 'zabbix-front-end'.
* gnu/services/monitoring.scm (nginx-server-configuration-list?,
serialize-nginx-server-configuration-list, zabbix-front-end-configuration,
zabbix-front-end-config, zabbix-front-end-activation,
generate-zabbix-front-end-documentation): New procedures.
(%zabbix-front-end-configuration-nginx, %maintenance.inc.php,
zabbix-front-end-service-type): New variables.
* doc/guix.texi (Monitoring Services): Document this.
-rw-r--r-- | doc/guix.texi | 75 | ||||
-rw-r--r-- | gnu/services/monitoring.scm | 148 | ||||
-rw-r--r-- | gnu/tests/monitoring.scm | 49 |
3 files changed, 270 insertions, 2 deletions
diff --git a/doc/guix.texi b/doc/guix.texi index 7304cf5f13..338ff45c39 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -16906,6 +16906,81 @@ Defaults to @samp{()}. @c %end of fragment +@subsubheading Zabbix front-end +@cindex zabbix zabbix-front-end + +This service provides a WEB interface to Zabbix server. + +@c %start of fragment + +Available @code{zabbix-front-end-configuration} fields are: + +@deftypevr {@code{zabbix-front-end-configuration} parameter} nginx-server-configuration-list nginx +NGINX configuration. + +@end deftypevr + +@deftypevr {@code{zabbix-front-end-configuration} parameter} string db-host +Database host name. + +Defaults to @samp{"localhost"}. + +@end deftypevr + +@deftypevr {@code{zabbix-front-end-configuration} parameter} number db-port +Database port. + +Defaults to @samp{5432}. + +@end deftypevr + +@deftypevr {@code{zabbix-front-end-configuration} parameter} string db-name +Database name. + +Defaults to @samp{"zabbix"}. + +@end deftypevr + +@deftypevr {@code{zabbix-front-end-configuration} parameter} string db-user +Database user. + +Defaults to @samp{"zabbix"}. + +@end deftypevr + +@deftypevr {@code{zabbix-front-end-configuration} parameter} string db-password +Database password. Please, use @code{db-secret-file} instead. + +Defaults to @samp{""}. + +@end deftypevr + +@deftypevr {@code{zabbix-front-end-configuration} parameter} string db-secret-file +Secret file which will be appended to @file{zabbix.conf.php} file. This +file contains credentials for use by Zabbix front-end. You are expected +to create it manually. + +Defaults to @samp{""}. + +@end deftypevr + +@deftypevr {@code{zabbix-front-end-configuration} parameter} string zabbix-host +Zabbix server hostname. + +Defaults to @samp{"localhost"}. + +@end deftypevr + +@deftypevr {@code{zabbix-front-end-configuration} parameter} number zabbix-port +Zabbix server port. + +Defaults to @samp{10051}. + +@end deftypevr + + +@c %end of fragment + @node Kerberos Services @subsubsection Kerberos Services @cindex Kerberos diff --git a/gnu/services/monitoring.scm b/gnu/services/monitoring.scm index 323c0ace56..18413096e4 100644 --- a/gnu/services/monitoring.scm +++ b/gnu/services/monitoring.scm @@ -22,6 +22,7 @@ #:use-module (gnu services) #:use-module (gnu services configuration) #:use-module (gnu services shepherd) + #:use-module (gnu services web) #:use-module (gnu packages admin) #:use-module (gnu packages monitoring) #:use-module (gnu system shadow) @@ -29,6 +30,7 @@ #:use-module (guix packages) #:use-module (guix records) #:use-module (ice-9 match) + #:use-module (ice-9 rdelim) #:use-module (srfi srfi-26) #:export (darkstat-configuration prometheus-node-exporter-configuration @@ -38,7 +40,10 @@ zabbix-server-configuration zabbix-server-service-type zabbix-agent-configuration - zabbix-agent-service-type)) + zabbix-agent-service-type + zabbix-front-end-configuration + zabbix-front-end-service-type + %zabbix-front-end-configuration-nginx)) ;;; @@ -179,6 +184,12 @@ prometheus.") (define (serialize-extra-options field-name val) (if (null? val) "" (display val))) +(define (nginx-server-configuration-list? val) + (and (list? val) (and-map nginx-server-configuration? val))) + +(define (serialize-nginx-server-configuration-list field-name val) + "") + (define-configuration zabbix-server-configuration (zabbix-server (package zabbix-server) @@ -356,7 +367,7 @@ the hosts listed here.") proxies for active checks. If port is not specified, default port is used. If this parameter is not specified, active checks are disabled.") (extra-options - (string "") + (extra-options "") "Extra options will be appended to Zabbix server configuration file.") (include-files (include-files '()) @@ -445,3 +456,136 @@ configuration file.")) `((zabbix-agent-configuration ,zabbix-agent-configuration-fields)) 'zabbix-agent-configuration)) + +(define %zabbix-front-end-configuration-nginx + (nginx-server-configuration + (root #~(string-append #$zabbix-server:front-end "/share/zabbix/php")) + (index '("index.php")) + (locations + (let ((php-location (nginx-php-location))) + (list (nginx-location-configuration + (inherit php-location) + (body (append (nginx-location-configuration-body php-location) + (list " +fastcgi_param PHP_VALUE \"post_max_size = 16M + max_execution_time = 300\"; +"))))))))) + +(define-configuration zabbix-front-end-configuration + ;; TODO: Specify zabbix front-end package. + ;; (zabbix- + ;; (package zabbix-front-end) + ;; "The zabbix-front-end package.") + (nginx + (nginx-server-configuration-list + (list %zabbix-front-end-configuration-nginx)) + "NGINX configuration.") + (db-host + (string "localhost") + "Database host name.") + (db-port + (number 5432) + "Database port.") + (db-name + (string "zabbix") + "Database name.") + (db-user + (string "zabbix") + "Database user.") + (db-password + (string "") + "Database password. Please, use @code{db-secret-file} instead.") + (db-secret-file + (string "") + "Secret file which will be appended to @file{zabbix.conf.php} file. This +file contains credentials for use by Zabbix front-end. You are expected to +create it manually.") + (zabbix-host + (string "localhost") + "Zabbix server hostname.") + (zabbix-port + (number 10051) + "Zabbix server port.")) + +(define zabbix-front-end-config + (match-lambda + (($ <zabbix-front-end-configuration> + _ db-host db-port db-name db-user db-password db-secret-file + zabbix-host zabbix-port) + (mixed-text-file "zabbix.conf.php" + "\ +<?php +// Zabbix GUI configuration file. +global $DB; + +$DB['TYPE'] = 'POSTGRESQL'; +$DB['SERVER'] = '" db-host "'; +$DB['PORT'] = '" (number->string db-port) "'; +$DB['DATABASE'] = '" db-name "'; +$DB['USER'] = '" db-user "'; +$DB['PASSWORD'] = '" (if (string-null? db-password) + (if (string-null? db-secret-file) + (display "Provide a `db-secret-file' \ +or `db-password' field. +" + (current-error-port)) + (string-trim-both + (with-input-from-file db-secret-file + read-string))) + (begin + (display " +Hint: Consider use `db-secret-file' instead of `db-password' and unset +`db-password' for security in `zabbix-front-end-configuration'. +") + db-password)) "'; + +// Schema name. Used for IBM DB2 and PostgreSQL. +$DB['SCHEMA'] = ''; + +$ZBX_SERVER = '" zabbix-host "'; +$ZBX_SERVER_PORT = '" (number->string zabbix-port) "'; +$ZBX_SERVER_NAME = ''; + +$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG; +")))) + +(define %maintenance.inc.php + ;; Empty php file to allow us move zabbix-frontend configs to ‘/etc/zabbix’ + ;; directory. See ‘install-front-end’ phase in + ;; (@ (gnu packages monitoring) zabbix-server) package. + "\ +<?php +") + +(define (zabbix-front-end-activation config) + "Return the activation gexp for CONFIG." + #~(begin + (use-modules (guix build utils)) + (mkdir-p "/etc/zabbix") + (call-with-output-file "/etc/zabbix/maintenance.inc.php" + (lambda (port) + (display #$%maintenance.inc.php port))) + (copy-file #$(zabbix-front-end-config config) + "/etc/zabbix/zabbix.conf.php"))) + +(define zabbix-front-end-service-type + (service-type + (name 'zabbix-front-end) + (extensions + (list (service-extension activation-service-type + zabbix-front-end-activation) + (service-extension nginx-service-type + zabbix-front-end-configuration-nginx) + ;; Make sure php-fpm is instantiated. + (service-extension php-fpm-service-type + (const #t)))) + (default-value (zabbix-front-end-configuration)) + (description + "Run the zabbix-front-end web interface, which allows users to interact +with Zabbix server."))) + +(define (generate-zabbix-front-end-documentation) + (generate-documentation + `((zabbix-front-end-configuration + ,zabbix-front-end-configuration-fields)) + 'zabbix-front-end-configuration)) diff --git a/gnu/tests/monitoring.scm b/gnu/tests/monitoring.scm index 76a2d3e946..ab72682aed 100644 --- a/gnu/tests/monitoring.scm +++ b/gnu/tests/monitoring.scm @@ -20,11 +20,13 @@ (define-module (gnu tests monitoring) #:use-module (gnu packages databases) #:use-module (gnu packages monitoring) + #:use-module (gnu packages php) #:use-module (gnu services) #:use-module (gnu services monitoring) #:use-module (gnu services networking) #:use-module (gnu services databases) #:use-module (gnu services shepherd) + #:use-module (gnu services web) #:use-module (gnu system vm) #:use-module (gnu system) #:use-module (gnu tests) @@ -249,6 +251,44 @@ zabbix||{} '(file-exists? "/var/run/zabbix/zabbix_agent.pid") marionette)) + ;; Wait for php-fpm to be up and running. + (test-assert "php-fpm running" + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (start-service 'php-fpm)) + marionette)) + + ;; Wait for nginx to be up and running. + (test-assert "nginx running" + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (start-service 'nginx)) + marionette)) + + ;; Make sure the PID file is created. + (test-assert "nginx PID file" + (marionette-eval + '(file-exists? "/var/run/nginx/pid") + marionette)) + + ;; Make sure we can access pages that correspond to our repository. + (letrec-syntax ((test-url + (syntax-rules () + ((_ path code) + (test-equal (string-append "GET " path) + code + (let-values (((response body) + (http-get (string-append + "http://localhost:8080" + path)))) + (response-code response)))) + ((_ path) + (test-url path 200))))) + (test-url "/") + (test-url "/does-not-exist" 404)) + (test-end) (exit (= (test-runner-fail-count (test-runner-current)) 0))))) @@ -261,6 +301,15 @@ zabbix||{} (simple-operating-system (service dhcp-client-service-type) (postgresql-service) + (service zabbix-front-end-service-type + (zabbix-front-end-configuration + (db-password "zabbix"))) + + (service php-fpm-service-type + (php-fpm-configuration + (timezone "Europe/Paris") + (php php-with-bcmath))) + (service zabbix-server-service-type (zabbix-server-configuration (db-password "zabbix") |