diff mbox series

[bug#59845,v2,3/4] gnu: Add PMB service.

Message ID 20221209115349.5821-3-yarl-baudig@mailoo.org
State New
Headers show
Series [bug#59845,v2,1/4] gnu: php: Add '--enable-soap' configure option. | expand

Commit Message

yarl baudig Dec. 9, 2022, 11:53 a.m. UTC
* gnu/services/ils.scm: New file.
* gnu/local.mk: Add it.
---
 gnu/local.mk         |   1 +
 gnu/services/ils.scm | 128 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 129 insertions(+)
 create mode 100644 gnu/services/ils.scm

Comments

Ludovic Courtès Dec. 20, 2022, 3:03 p.m. UTC | #1
Yarl Baudig <yarl-baudig@mailoo.org> skribis:

> * gnu/services/ils.scm: New file.
> * gnu/local.mk: Add it.

[...]

> +    #~(begin
> +        (use-modules (guix build utils))
> +        (use-modules (ice-9 ftw))
> +        (format #t "Copying pmb '~a' to http directory '~a'~%"
> +                (string-append #$pmb "/share/http/pmb")
> +                #$http-directory)
> +        (mkdir-p #$http-directory)
> +        ;; Please be quiet
> +        (call-with-output-file "/dev/null"
> +          (lambda (port)
> +            (with-output-to-port port
> +              (lambda ()
> +                (copy-recursively (string-append #$pmb "/share/http/pmb")
> +                                  #$http-directory)))))

Do we really need to copy these files?

Keep in mind that activation snippets run each time you boot the system,
and each time you reconfigure.  It’s best to avoid doing too much work
there.

> +        (define (enter? name stat result)
> +          #t)
> +        (define (lchown obj)
> +          (let ((user (getpwnam #$php-fpm-user))
> +                (group (getgrnam #$php-fpm-group)))
> +            (chown obj (passwd:uid user) (group:gid group))))
> +        (define (leaf name stat result)
> +          (lchown name)
> +          result)
> +        (define (down name stat result)
> +          (lchown name)
> +	  result)
> +        (define (up name stat result) result)
> +        (define (skip name stat result) result)
> +        (define (error name stat errno result)
> +          (warning (G_ "~a: ~a~%")
> +                   name (strerror errno))
> +          result)
> +        (file-system-fold enter? leaf down up skip error '() #$http-directory)

This can be simplified along these lines:

  (for-each lchown (find-files #$http-directory #:directories? #t))

But again, that’s a lot of I/O.

> +        ;; Those are to hide installation files on a re-activation
> +        (if
> +         (file-exists? (string-append #$http-directory "/tables/noinstall.php"))
> +         (delete-file (string-append #$http-directory "/tables/install.php")))
> +        (if
> +         (file-exists? (string-append #$http-directory "/tables/noinstall_rep.php"))
> +         (delete-file (string-append #$http-directory "/tables/install_rep.php"))))))

Or just:

  (false-if-exception (delete-file …))

> +(define pmb-service-type
> +  (service-type
> +   (name 'guix)
> +   (extensions
> +    (list (service-extension activation-service-type
> +                             pmb-activation)))
> +   (default-value (pmb-configuration))
> +   (description "Install the pmb Integrated Library System")))

Should it extend ‘nginx-service-type’ with ‘%default-pmb-location’?

Likewise, it looks like it’d be nice to extend ‘mysql-service-type’ with
the extra config.  That’s not currently possible but we should add it.
That way, adding (service pmb-service-type) is all it would take to get
the service up and running.
diff mbox series

Patch

diff --git a/gnu/local.mk b/gnu/local.mk
index ff0c86584a..16de11e31e 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -670,6 +670,7 @@  GNU_SYSTEM_MODULES =				\
   %D%/services/getmail.scm				\
   %D%/services/guix.scm			\
   %D%/services/hurd.scm				\
+  %D%/services/ils.scm				\
   %D%/services/kerberos.scm			\
   %D%/services/lightdm.scm      		\
   %D%/services/linux.scm			\
diff --git a/gnu/services/ils.scm b/gnu/services/ils.scm
new file mode 100644
index 0000000000..5a704d368b
--- /dev/null
+++ b/gnu/services/ils.scm
@@ -0,0 +1,128 @@ 
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2022 Yarl Baudig <yarl-baudig@mailoo.org>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (gnu services ils)
+  #:use-module (gnu services)
+  #:use-module (gnu services web)
+  #:use-module (gnu packages ils)
+  #:use-module (guix records)
+  #:use-module (guix utils)
+  #:use-module (guix gexp)
+  #:use-module (ice-9 match)
+  #:use-module (ice-9 format)
+  #:export (pmb-configuration
+	    pmb-service-type
+	    %default-nginx-pmb-location
+	    %default-pmb-php-fpm-configuration
+	    %default-pmb-mysql-configuration-extra-content))
+
+;;; Commentary
+;;;
+;;; Integrated Library Systems services.
+;;;
+;;; Code
+
+(define %default-nginx-pmb-location
+  (let ((base (nginx-php-location)))
+    (nginx-location-configuration
+     (inherit base)
+     (body (cons
+            "fastcgi_read_timeout 300;"
+            (nginx-location-configuration-body base))))))
+
+(define %default-pmb-php-fpm-configuration
+  "expose_php=off
+max_execution_time=300
+max_input_vars=50000
+memory_limit=256M
+post_max_size=64M
+upload_max_filesize=64M
+date.timezone=Europe/Paris")
+
+(define %default-pmb-mysql-configuration-extra-content
+  "[server]
+sql_mode=NO_AUTO_CREATE_USER
+collation_server=utf8_unicode_ci
+key_buffer_size=1000001536
+join_buffer_size=4000000")
+
+(define-record-type* <pmb-configuration>
+  pmb-configuration make-pmb-configuration
+  pmb-configuration?
+  (pmb pmb-configuration-pmb (default pmb))
+  (http-directory pmb-configuration-http-directory
+                  (default "/srv/http/pmb"))
+  (php-fpm-user pmb-configuration-php-fpm-user
+                (default "php-fpm"))
+  (php-fpm-group pmb-configuration-php-fpm-group
+		 (default "php-fpm")))
+
+(define (pmb-activation config)
+  (match-record
+      config
+      <pmb-configuration>
+    (pmb http-directory php-fpm-user php-fpm-group)
+    #~(begin
+        (use-modules (guix build utils))
+        (use-modules (ice-9 ftw))
+        (format #t "Copying pmb '~a' to http directory '~a'~%"
+                (string-append #$pmb "/share/http/pmb")
+                #$http-directory)
+        (mkdir-p #$http-directory)
+        ;; Please be quiet
+        (call-with-output-file "/dev/null"
+          (lambda (port)
+            (with-output-to-port port
+              (lambda ()
+                (copy-recursively (string-append #$pmb "/share/http/pmb")
+                                  #$http-directory)))))
+        (define (enter? name stat result)
+          #t)
+        (define (lchown obj)
+          (let ((user (getpwnam #$php-fpm-user))
+                (group (getgrnam #$php-fpm-group)))
+            (chown obj (passwd:uid user) (group:gid group))))
+        (define (leaf name stat result)
+          (lchown name)
+          result)
+        (define (down name stat result)
+          (lchown name)
+	  result)
+        (define (up name stat result) result)
+        (define (skip name stat result) result)
+        (define (error name stat errno result)
+          (warning (G_ "~a: ~a~%")
+                   name (strerror errno))
+          result)
+        (file-system-fold enter? leaf down up skip error '() #$http-directory)
+        ;; Those are to hide installation files on a re-activation
+        (if
+         (file-exists? (string-append #$http-directory "/tables/noinstall.php"))
+         (delete-file (string-append #$http-directory "/tables/install.php")))
+        (if
+         (file-exists? (string-append #$http-directory "/tables/noinstall_rep.php"))
+         (delete-file (string-append #$http-directory "/tables/install_rep.php"))))))
+
+(define pmb-service-type
+  (service-type
+   (name 'guix)
+   (extensions
+    (list (service-extension activation-service-type
+                             pmb-activation)))
+   (default-value (pmb-configuration))
+   (description "Install the pmb Integrated Library System")))