diff options
| author | Mathieu Othacehe <othacehe@gnu.org> | 2021-01-18 10:52:25 +0100 | 
|---|---|---|
| committer | Mathieu Othacehe <othacehe@gnu.org> | 2021-01-28 12:57:26 +0100 | 
| commit | fe4b8823505c3271fc3eacaa93c30a5cec078739 (patch) | |
| tree | dd44ac59eb678e36265b25a74929ae0031c8885b | |
| parent | 6c0679215f4ffa534c1eb2e8c8a6e043a0c993fe (diff) | |
services: postgresql: Add log directory support.
* gnu/services/databases.scm (postgresql-configuration-log-directory): New
procedure.
(<postgresql-configuration>)[log-directory]: New field.
(postgresql-activation): Create the log directory.
(postgresql-shepherd-service): Honor it.
* gnu/tests/databases.scm (%postgresql-log-directory): New variable.
(log-file): New test case.
* doc/guix.texi (Database Services): Document it.
| -rw-r--r-- | doc/guix.texi | 5 | ||||
| -rw-r--r-- | gnu/services/databases.scm | 36 | ||||
| -rw-r--r-- | gnu/tests/databases.scm | 20 | 
3 files changed, 53 insertions, 8 deletions
| diff --git a/doc/guix.texi b/doc/guix.texi index b01bbf0d96..f4fbe6b0e6 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -19344,6 +19344,11 @@ The configuration file to use when running PostgreSQL@.  The default  behaviour uses the postgresql-config-file record with the default values  for the fields. +@item @code{log-directory} (default: @code{"/var/log/postgresql"}) +The directory where @command{pg_ctl} output will be written in a file +named @code{"pg_ctl.log"}.  This file can be useful to debug PostgreSQL +configuration errors for instance. +  @item @code{data-directory} (default: @code{"/var/lib/postgresql/data"})  Directory in which to store the data. diff --git a/gnu/services/databases.scm b/gnu/services/databases.scm index 83dee52cf3..c387a7da6c 100644 --- a/gnu/services/databases.scm +++ b/gnu/services/databases.scm @@ -52,6 +52,7 @@              postgresql-configuration-port              postgresql-configuration-locale              postgresql-configuration-file +            postgresql-configuration-log-directory              postgresql-configuration-data-directory              postgresql-service @@ -164,6 +165,8 @@ host	all	all	::1/128 	md5"))                        (default "en_US.utf8"))    (config-file        postgresql-configuration-file                        (default (postgresql-config-file))) +  (log-directory      postgresql-configuration-log-directory +                      (default "/var/log/postgresql"))    (data-directory     postgresql-configuration-data-directory                        (default "/var/lib/postgresql/data"))    (extension-packages postgresql-configuration-extension-packages @@ -200,15 +203,18 @@ host	all	all	::1/128 	md5"))  (define postgresql-activation    (match-lambda -    (($ <postgresql-configuration> postgresql port locale config-file data-directory -        extension-packages) +    (($ <postgresql-configuration> postgresql port locale config-file +                                   log-directory data-directory +                                   extension-packages)       #~(begin           (use-modules (guix build utils)                        (ice-9 match))           (let ((user (getpwnam "postgres")) -               (initdb (string-append #$(final-postgresql postgresql extension-packages) -                                      "/bin/initdb")) +               (initdb (string-append +                        #$(final-postgresql postgresql +                                            extension-packages) +                        "/bin/initdb"))                 (initdb-args                  (append                   (if #$locale @@ -225,6 +231,11 @@ host	all	all	::1/128 	md5"))                 (mkdir-p socket-directory)                 (chown socket-directory (passwd:uid user) (passwd:gid user)))) +           ;; Create the log directory. +           (when (string? #$log-directory) +             (mkdir-p #$log-directory) +             (chown #$log-directory (passwd:uid user) (passwd:gid user))) +             ;; Drop privileges and init state directory in a new             ;; process.  Wait for it to finish before proceeding.             (match (primitive-fork) @@ -247,8 +258,9 @@ host	all	all	::1/128 	md5"))  (define postgresql-shepherd-service    (match-lambda -    (($ <postgresql-configuration> postgresql port locale config-file data-directory -        extension-packages) +    (($ <postgresql-configuration> postgresql port locale config-file +                                   log-directory data-directory +                                   extension-packages)       (let* ((pg_ctl-wrapper               ;; Wrapper script that switches to the 'postgres' user before               ;; launching daemon. @@ -260,13 +272,21 @@ host	all	all	::1/128 	md5"))                    (match (command-line)                      ((_ mode)                       (let ((user (getpwnam "postgres")) -                           (pg_ctl #$(file-append (final-postgresql postgresql extension-packages) +                           (pg_ctl #$(file-append +                                      (final-postgresql postgresql +                                                        extension-packages)                                                    "/bin/pg_ctl"))                             (options (format #f "--config-file=~a -p ~d"                                              #$config-file #$port)))                         (setgid (passwd:gid user))                         (setuid (passwd:uid user)) -                       (execl pg_ctl pg_ctl "-D" #$data-directory "-o" options +                       (execl pg_ctl pg_ctl "-D" #$data-directory +                              #$@(if (string? log-directory) +                                     (list "-l" +                                           (string-append log-directory +                                                          "/pg_ctl.log")) +                                     '()) +                              "-o" options                                mode)))))))              (pid-file (in-vicinity data-directory "postmaster.pid"))              (action (lambda args diff --git a/gnu/tests/databases.scm b/gnu/tests/databases.scm index 7338007919..d881a8c3ee 100644 --- a/gnu/tests/databases.scm +++ b/gnu/tests/databases.scm @@ -214,6 +214,9 @@  ;;; The PostgreSQL service.  ;;; +(define %postgresql-log-directory +  "/var/log/postgresql") +  (define %postgresql-os    (simple-operating-system     (service postgresql-service-type @@ -262,6 +265,23 @@                  (start-service 'postgres))               marionette)) +          (test-assert "log-file" +            (marionette-eval +             '(begin +                (use-modules (ice-9 ftw) +                             (ice-9 match)) +                (current-output-port +                 (open-file "/dev/console" "w0")) +                (let ((server-log-file +                       (string-append #$%postgresql-log-directory +                                      "/pg_ctl.log"))) +                  (and (file-exists? server-log-file) +                       (display +                        (call-with-input-file server-log-file +                          get-string-all))) +                  #t)) +             marionette)) +            (test-end)            (exit (= (test-runner-fail-count (test-runner-current)) 0))))) | 
