From 8b7e2b0b7bc22b72895e9e5e2d8522094e801ae2 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Note Date: Sat, 9 May 2020 15:14:26 +0000 Subject: gnu: Add cachefilesd-service. * doc/guix.texi (Linux Services): Add a new subsection and document the new service and its configuration. * gnu/services/linux.scm (cachefilesd-service-type): New type. (cachefilesd-configuration): New type. --- gnu/services/linux.scm | 210 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 209 insertions(+), 1 deletion(-) diff --git a/gnu/services/linux.scm b/gnu/services/linux.scm index 12934c2084..810901e0ca 100644 --- a/gnu/services/linux.scm +++ b/gnu/services/linux.scm @@ -42,7 +42,11 @@ earlyoom-configuration-send-notification-command earlyoom-service-type - kernel-module-loader-service-type)) + kernel-module-loader-service-type + + cachefilesd-configuration + cachefilesd-configuration? + cachefilesd-service-type)) ;;; @@ -177,3 +181,207 @@ representation." (compose concatenate) (extend append) (default-value '()))) + + +;;; +;;; cachefilesd. +;;; + +(define-record-type* + cachefilesd-configuration make-cachefilesd-configuration + cachefilesd-configuration? + + ;; + (cachefilesd cachefilesd-configuration-cachefilesd + (default cachefilesd)) + + ;; cmdline flags + ;; Boolean + (daemonic? cachefilesd-configuration-daemonic? + (default #t)) + + ;; string + (pid-file cachefilesd-configuration-pid-file + (default "/var/run/cachefilesd.pid")) + + ;; Boolean + (debug? cachefilesd-configuration-debug? + (default #f)) + ;; Boolean + (syslog? cachefilesd-configuration-syslog? + (default #t)) + ;; Boolean + (culling-and-scanning? cachefilesd-configuration-culling-and-scanning? + (default #t)) + + ;; configuration file contents + ;; String + (dir cachefilesd-configuration-dir + (default "/var/cache/fscache")) + + ;; String + (tag cachefilesd-configuration-tag + (default "CacheFiles")) + + ;; String + (secctx cachefilesd-configuration-secctx + (default #f)) + + ;; integers + (brun cachefilesd-configuration-brun + (default 7)) + (frun cachefilesd-configuration-frun + (default 7)) + (bcull cachefilesd-configuration-bcull + (default 5)) + (fcull cachefilesd-configuration-fcull + (default 5)) + (bstop cachefilesd-configuration-bstop + (default 1)) + (fstop cachefilesd-configuration-fstop + (default 1)) + + ;; integer + (culltable cachefilesd-configuration-culltable + (default 12)) + + ;; integer / debug mask + (kernel-debug cachefilesd-configuration-kernel-debug + (default 0)) + + ;; boolean + (nocull? cachefilesd-configuration-nocull? + (default #f)) + ;; Boolean + ;; XXX: This should really be handled in an orthogonal way, for instance as + ;; proposed in . Keep it internal/undocumented + ;; for now. + (%auto-start? cachefilesd-auto-start? + (default #t))) + +(define (cachefilesd-configuration-file config) + "Return the cachefilesd configuration file corresponding to CONFIG." + (define secctx + (cachefilesd-configuration-dir config)) + + (computed-file + "cachefilesd.conf" + #~(begin + (use-modules (ice-9 match)) + (call-with-output-file #$output + (lambda (port) + (display "# Generated by 'cachefilesd-service'.\n" port) + (format port "dir ~a\n" #$(cachefilesd-configuration-dir config)) + + (let ((secctx #$(cachefilesd-configuration-secctx config))) + (if secctx (format port "secctx ~a" secctx))) + + ;; XXX factor this + (format port "brun ~a%\n" + #$(number->string + (cachefilesd-configuration-brun config))) + (format port "frun ~a%\n" + #$(number->string + (cachefilesd-configuration-frun config))) + (format port "bcull ~a%\n" + #$(number->string + (cachefilesd-configuration-bcull config))) + (format port "fcull ~a%\n" + #$(number->string + (cachefilesd-configuration-fcull config))) + (format port "bstop ~a%\n" + #$(number->string + (cachefilesd-configuration-bstop config))) + (format port "fstop ~a%\n" + #$(number->string + (cachefilesd-configuration-fstop config))) + + (format port "tag ~a\n" #$(cachefilesd-configuration-tag config)) + + (format port "culltable ~a\n" + #$(number->string + (cachefilesd-configuration-culltable config))) + + (if #$(cachefilesd-configuration-nocull? config) + (display "nocull\n" port)) + + (format port "debug ~a\n" + #$(number->string + (cachefilesd-configuration-kernel-debug config))) + + #t))))) + +(define (cachefilesd-activation config) + "Return cachefilesd's activation GEXP for CONFIG." + (with-imported-modules '((guix build utils)) + #~(begin + (use-modules (guix build utils)) + ;; Make sure the cache directory and pid dir exists + (mkdir-p #$(cachefilesd-configuration-dir config)) + (mkdir-p (dirname #$(cachefilesd-configuration-pid-file config)))))) + +(define (cachefilesd-shepherd-service config) + "Return a for cachefilesd with CONFIG." + + (define cachefilesdpath + (cachefilesd-configuration-cachefilesd config)) + (define pid-file + (cachefilesd-configuration-pid-file config)) + (define syslog? + (cachefilesd-configuration-syslog? config)) + (define culling-and-scanning? + (cachefilesd-configuration-culling-and-scanning? config)) + (define debug? + (cachefilesd-configuration-debug? config)) + + (define cachefilesd-command + #~(list #$(file-append cachefilesdpath "/sbin/cachefilesd") + #$@(if (cachefilesd-configuration-daemonic? config) '() '("-n")) + ;; XXX shepherd pid file handling: no idea how shepherd does it + ;; and if it's going to conflict with cachefilesd's + #$@(if debug? '("-d") '()) + #$@(if syslog? '() '("-s")) + #$@(if culling-and-scanning? '() '("-N")) + "-p" #$pid-file + "-f" #$(cachefilesd-configuration-file config))) + + (list (shepherd-service + (documentation "Start cachefilesd daemon.") + (requirement (append '(file-systems cachefiles-module) + (if syslog? '(syslogd) '()))) + (provision '(cachefilesd)) + (start #~(make-forkexec-constructor #$cachefilesd-command + #:pid-file #$pid-file)) + (stop #~(make-kill-destructor)) + (auto-start? (cachefilesd-auto-start? config))) + + (shepherd-service + (provision '(cachefiles-module)) + (requirement '(file-systems)) + (modules '((guix build utils))) + (documentation + "Load the cachefiles Linux kernel module.") + (start (with-imported-modules '((guix build utils)) + #~(lambda _ + ;; XXX: duplicated from networking + ;; -- factor this into a modprobe command + ;; XXX: We can't use 'load-linux-module*' here because it + ;; expects a flat module directory. + (setenv "LINUX_MODULE_DIRECTORY" + "/run/booted-system/kernel/lib/modules") + (invoke #$(file-append kmod "/bin/modprobe") + "cachefiles")))) + (one-shot? #t)))) + +(define cachefilesd-service-type + (service-type (name 'cachefilesd) + (description + "Run the CacheFile backend daemon, @command{cachefilesd}.") + (extensions + (list + (service-extension shepherd-root-service-type + cachefilesd-shepherd-service) + (service-extension activation-service-type + cachefilesd-activation))) + (compose concatenate) + (default-value (cachefilesd-configuration)))) -- cgit v1.2.3