about summary refs log tree commit diff
path: root/gn/services
diff options
context:
space:
mode:
Diffstat (limited to 'gn/services')
-rw-r--r--gn/services/science.scm147
1 files changed, 147 insertions, 0 deletions
diff --git a/gn/services/science.scm b/gn/services/science.scm
new file mode 100644
index 0000000..4b34882
--- /dev/null
+++ b/gn/services/science.scm
@@ -0,0 +1,147 @@
+(define-module (gn services science)
+  #:export (munge-configuration
+            munge-configuration?
+            munge-service-type))
+
+(use-modules (gnu)
+             (guix records)
+             (ice-9 match))
+(use-service-modules shepherd)
+(use-package-modules admin parallel)
+
+(define %munge-accounts
+  (list (user-group
+          (name "munge")
+          (id 900)
+          (system? #t))
+        (user-account
+          (name "munge")
+          (group "munge")
+          (uid 900)
+          (system? #t)
+          (comment "Munge User")
+          (home-directory "/var/lib/munge")
+          (shell (file-append shadow "/sbin/nologin")))))
+
+(define %slurm-accounts
+  (list (user-group
+          (name "slurm")
+          (id 901)
+          (system? #t))
+        (user-account
+          (name "slurm")
+          (group "slurm")
+          (uid 901)
+          (system? #t)
+          (comment "Slurm User")
+          (home-directory "/var/lib/slurm"))))
+
+(define-record-type* <munge-configuration>
+  munge-configuration
+  make-munge-configuration
+  munge-configuration?
+  (package      munge-configuration-package
+                (default munge))
+  (socket       munge-configuration-socket
+                (default "/var/run/munge/munge.socket.2"))
+  (pid-file     munge-configuration-pid-file
+                (default "/var/run/munge/munged.pid"))
+  (log-file     munge-configuration-log-file
+                (default "/var/log/munge/munged.log"))
+  (key          munge-configuration-key
+                (default "/etc/munge/munge.key")))
+
+(define-record-type* <slurm-configuration>
+  slurm-configuration
+  make-slurm-configuration
+  slurm-configuration?
+  (package      slurm-configuration-package
+                (default slurm)))
+
+(define (munge-activation config)
+  "Return the activation GEXP for CONFIG for the munge service."
+  (with-imported-modules '((guix build utils))
+    #~(begin
+        (use-modules (guix build utils)
+                     (rnrs bytevectors)
+                     (rnrs io ports))
+        (define %user (getpw "munge"))
+        (let* ((homedir     (passwd:dir %user))
+               (key         #$(munge-configuration-key config))
+               (etc-dir     (dirname key))
+               (run-dir     (dirname #$(munge-configuration-pid-file config)))
+               (log-dir     (dirname #$(munge-configuration-log-file config))))
+          (for-each (lambda (dir)
+                      (unless (file-exists? dir)
+                        (mkdir-p dir))
+                      (chown dir (passwd:uid %user) (passwd:gid %user))
+                      (chmod dir #o700))
+                    (list homedir etc-dir log-dir))
+          (unless (file-exists? key)
+            ;; Borrowed from /dev/urandom in (gnu services base)
+            (call-with-input-file "/dev/urandom"
+              (lambda (urandom)
+                (let ((buf (make-bytevector 1024)))
+                  (get-bytevector-n! urandom buf 0 1024)
+                  (call-with-output-file key
+                    (lambda (seed)
+                      (put-bytevector seed buf)))))))
+          (chown key (passwd:uid %user) (passwd:gid %user))
+          (chmod key #o400)
+          (unless (file-exists? run-dir)
+            (mkdir-p run-dir))
+          (chown run-dir (passwd:uid %user) (passwd:gid %user))))))
+
+(define (slurm-activation config)
+  "Return the activation GEXP for CONFIG for the slurm service."
+  (with-imported-modules '((guix build utils))
+    #~(begin
+        (use-modules (guix build utils))
+        (unless (file-exists? "/var/lib/slurm")
+          (mkdir-p "/var/lib/slurm"))
+        (chown "/var/lib/slurm" (passwd:uid "slurm") (passwd:gid "slurm")))))
+
+(define munge-shepherd-service
+  (match-lambda
+    (($ <munge-configuration> package socket pid-file log-file key)
+     (list
+       (shepherd-service
+         (documentation "Munge server")
+         (provision '(munge))
+         (requirement '(loopback user-processes file-systems))
+         (start #~(make-forkexec-constructor
+                    (list #$(file-append package "/sbin/munged")
+                          "--foreground"    ; "--force"
+                          (string-append "--socket=" #$socket)
+                          (string-append "--key-file=" #$key)
+                          (string-append "--pid-file=" #$pid-file)
+                          (string-append "--log-file=" #$log-file))
+                    #:user "munge"
+                    #:group "munge"
+                    #:pid-file #$pid-file
+                    #:log-file #$log-file))
+         (stop #~(lambda _
+                   (not (and
+                          (list #$(file-append package "/sbin/munged")
+                                (string-append "--socket=" #$socket)
+                                "--stop")
+                          ;; This seems to not be removed by default.
+                          (delete-file (string-append #$socket ".lock"))))))
+         (auto-start? #t))))))
+
+(define munge-service-type
+  (service-type
+    (name 'munge)
+    (extensions
+      (list
+        (service-extension shepherd-root-service-type
+                           munge-shepherd-service)
+        (service-extension activation-service-type
+                           munge-activation)
+        (service-extension account-service-type
+                           (const %munge-accounts))
+        (service-extension profile-service-type
+                           (compose list munge-configuration-package))))
+    (default-value (munge-configuration))
+    (description
+     "Run a munge service.")))