[PATCH] Add cachefilesd service.

OpenSubmitted by Jean-Baptiste Note.
Details
2 participants
  • Jean-Baptiste Note
  • Mathieu Othacehe
Owner
unassigned
Severity
normal
J
J
Jean-Baptiste Note wrote on 10 May 2020 21:19
(name . guixpatch)(address . guix-patches@gnu.org)(name . Mathieu Othacehe)(address . m.othacehe@gmail.com)
87v9l3zjg7.fsf@m4x.org
Dear guix developers, Mathieu,
Please find attached a first version of the cachefilesd service patch.The second patch for documentation will be sent right after.
I have a few general newbie scheme questions:
- I gathered that #~ / #$ kinds of suspends evaluation / forces it -- is there documentation about this somewhere ?
- There's something that looks like a splat operator (only seen in conjuction with forcing evaluation in #$@) -- again i'd be interested in more documentation about this feature -- is this a guix-specific operator?
- I don't understand why there are ^L separating services in the scheme files -- is this necessary? A convention? What purpose does it serve?
Regarding the patch itself:
- i'm not entirely sure the service belongs to services/linux.scm
- documentation is hastily written. I have found no way to indent automatically the lisp code in the texi file, which is very painfull -- would there be an emacs solution for this?
- there are no automated tests (beyond what I have done by hand locally!), and there's no lint, so I don't really feel confident about it :) Are there tests for services to alleviate my fears?
- I've copied some other service for modprobing the required kernel modules before launching the daemon with a one-shot shepherd service. Frankly i'm not happy about this solution, it seems to me that it unnecessarily pollutes the shepherd configuration; maybe some other mechanism (graft?) adjusting the modprobe configuration could be better (better still, autoload the file). Any guidance would be nice (including, that this solution is sufficient for now :))
I had great fun writing this, it reminded me of writing cookbooks duringmy 'Chef' days. I must confess that the Chef DSL embedded in ruby seemedmore concise, and that it provided a way to write a cookbook'out-of-tree' which was kind of less daunting for newcomers; howeverit's already amazing that you have this kind of functionality!
Kind regards,Jean-Baptiste
From 729d43d541e8dcb41b36a7522ec291b0c3f8dd14 Mon Sep 17 00:00:00 2001From: Jean-Baptiste Note <jean-baptiste.note@m4x.org>Date: Sat, 9 May 2020 15:14:26 +0000Subject: [PATCH 1/2] gnu: Add cachefilesd-service.
* doc/guix.texi (Linux Services): Add a new subsection and document thenew 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(-)
Toggle diff (227 lines)diff --git a/gnu/services/linux.scm b/gnu/services/linux.scmindex 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>+ cachefilesd-configuration make-cachefilesd-configuration+ cachefilesd-configuration?++ ;; <package-path>+ (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 <https://bugs.gnu.org/27155>. 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 <shepherd-service> 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))))-- 2.26.2
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEPxcq3dp4FVY5UpckkC0pVsuz75YFAl64U8gACgkQkC0pVsuz75bJ4RAAoUmmXPdAGW3uD5W/YO8U8A1FhUr/qoq+1qkClSDv0Jt/qyKRca7hYrdZC0JAgfYGmdk/Qy0ltnRACR96pcZP4YUf5NWjTKNPQykOjucJISXsSUTSojljZHbTc4ei7KjNMU0jRrrKZFqR4IlsVLYy1K4wFQfU4yLH9sU2ZgUd4R+Mb6eM1F7zWYogqSHTp3+ZgAVB5BaZ9pDlDdsOAKU8WO5oy8in/GEFREoL5vjeBiueqLMSYI/epPWnN94j96cM3I/sL/FaBs6Ib5cGvXox8TW54BoOx2HBTZMoo4iZkhDnSnFro8cZYa66IeDta1xzfusDMmQibvMiw2w3D3w/mgLz+X5HO7kPTQrbg5XlK2kMdeiO6oUH5cw7GA7ooB4MTIivZZeyqynXieUvcS2lIQ/1TS8TU6wgGNymUsrmym08+Y06Qtc9lyZhnsIeFCmNEMqIXb/wIIjRgWtIX6movMmRNTCq7fBCXeTu50IvING1PNZsrToHN1qAV9g49CBByBhVbEa661bldRwfVJgINoigI23BBzTZe0omabNym9RKdayAHdP099yYzwC1e9KUUAK8UXU1X272lRjCElJy0+h5q++KVMdhiC8502nE2IJeLH1V2hZZOXkCcywDxV5BhxISME24RFAXCrJxFUqdViZ3cU3dL1lmKDg+NPk7pzQ==sR04-----END PGP SIGNATURE-----
J
J
Jean-Baptiste Note wrote on 10 May 2020 21:27
(address . 41180@debbugs.gnu.org)(name . Mathieu Othacehe)(address . m.othacehe@gmail.com)
87o8qvzj2p.fsf@m4x.org
Documentation patch.
From b169047ad64996860e6eb154bb4d20ad80463b47 Mon Sep 17 00:00:00 2001From: Jean-Baptiste Note <jean-baptiste.note@m4x.org>Date: Sun, 10 May 2020 18:43:08 +0000Subject: [PATCH 2/2] doc: Add documentation for cachefilesd-service.
* doc/guix.texi (Linux Services): Add a new subsection and document thecachefilesd service and its configuration.--- doc/guix.texi | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+)
Toggle diff (48 lines)diff --git a/doc/guix.texi b/doc/guix.texiindex 0cba0ee1ec..4aaec43739 100644--- a/doc/guix.texi+++ b/doc/guix.texi@@ -25724,6 +25724,41 @@ parameters, can be done as follow: @end lisp @end deffn +@cindex cachefilesd+@cindex cachefiles+@cindex fscache+@subsubheading cachefilesd Service++The cachefilesd service allows one to load start @code{cachefilesd} for+caching network filesystem data on local disks. This is especially+useful for NFS and AFS shares, reducing read latency.++@deffn {Scheme Variable} cachefilesd-service-type+The service type for starting cachefilesd. For example starting the+cachefiles daemon can be done as follow:++@lisp+(use-modules (gnu) (gnu services))+(use-package-modules linux)+(use-service-modules linux)++(operating-system+ ...+ (services+ (cons*+ (service cachefilesd-service-type+ (cachefilesd-configuration+ (dir "/var/cache/fscache") ; the default value+ (syslog? #f) ; don't require syslogd+ (secctx "cachefiles_kernel_t")+ (tag "mycache")+ (brun 10)+ (bcull 7)+ (bstop 3)))+ %base-services)))+@end lisp+@end deffn+ @node Miscellaneous Services @subsection Miscellaneous Services -- 2.26.2
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEPxcq3dp4FVY5UpckkC0pVsuz75YFAl64Va4ACgkQkC0pVsuz75YRNg/9FtMmMlfwnaGw8WDWqCr9SXmEF9fUE8pcw5HLitsWSDveoIjbgVRbWbWgKwe5g+O248FwVrfT3yKznWTWj3Dfa44wpnMswDTulK9rTjTG4OE2Z7DpQd94IVVIQ+x6i2/tKNPxoxNmJE3JdYFUNVo72ocBhygR6+Lb/6Bh3iw3Tx5PYy1xuDFGGVIjKYiwl4NdVVjQ0mW2mjmH/vdjBaU4xZ0fqV4xHzE43m8ypGFY8kaP+Cnx9GB5mw+Ln40nlxfordb7txlhSN7QK4rTAMoxFax1wbfVGWiSrqG2vlLy1GJVgZZMSaS9e9tg096iC+kvF+xbpkRIkbU1rppMX4N6ANIGCchRHjhY1TVk+WXHF5yBB7PxO8pcB6cA0OkGLVMKe+56g+EVoBcvI/tWGoKcP1fr6z7kYK8qs5QM0321SpbDNbpvgNURVV3pfHHCkK511/pkSTK5I2wNgyp10IkJgD4B90UqVzehiiaGscdMLc3ft5jEQg7ZB+SGWVbw/mWUAtZkluyem8PsTNsrRGfawVYULHwJt60XLrqNopz/zwEUt4fsbTllnG4d/wGx75GD67wCDnd6gjSFc8TDrEZA01Rh0B3mV+DY/w0qft2blCKoB813IVhxd4p4gCOCUNEKBrbNE063No8nONY484hgT6QefFmHUBktDshogQYxCIA==w2wH-----END PGP SIGNATURE-----
M
M
Mathieu Othacehe wrote on 11 May 2020 17:06
Re: [bug#41180] [PATCH] Add cachefilesd service.
(name . Jean-Baptiste Note)(address . jean-baptiste.note@m4x.org)(address . 41180@debbugs.gnu.org)
878shywly7.fsf@gnu.org
Hello Jean-Baptiste,
Thanks for this service!
Toggle quote (3 lines)> - I gathered that #~ / #$ kinds of suspends evaluation / forces it -- is> there documentation about this somewhere ?
#~ and #$ are related to the Gexp mechanism. It's documented here: https://guix.gnu.org/manual/en/html_node/G_002dExpressions.html.
Toggle quote (5 lines)> - There's something that looks like a splat operator (only seen in> conjuction with forcing evaluation in #$@) -- again i'd be interested> in more documentation about this feature -- is this a guix-specific> operator?
#$@ is a shortcut for ungexp-splicing. It's also documented in the linkabove. It can be a bit puzzling at start, don't hesitate to ask somehelp on #guix channel.
Toggle quote (3 lines)> - I don't understand why there are ^L separating services in the scheme> files -- is this necessary? A convention? What purpose does it serve?
Yes, see the "Pagination" section inhttps://mumble.net/~campbell/scheme/style.txt.You can install"emacs-page-break-lines" to replace it by cleaner lines.
Toggle quote (4 lines)> Regarding the patch itself:>> - i'm not entirely sure the service belongs to services/linux.scm
I think it's fine.
Toggle quote (4 lines)> - there are no automated tests (beyond what I have done by hand> locally!), and there's no lint, so I don't really feel confident about> it :) Are there tests for services to alleviate my fears?
It would be nice to implement tests along with the new servicedefinition. You can have a look to (gnu tests cups) module forinstance. It tests the cups service by spawning a virtual-machine calleda "marionette". You could create a (gnu tests cachefilesd) doing asimilar job.
See "Running the Test Suite" in the info page for more details on how torun the test suite.
Toggle quote (8 lines)> - I've copied some other service for modprobing the required kernel> modules before launching the daemon with a one-shot shepherd> service. Frankly i'm not happy about this solution, it seems to me> that it unnecessarily pollutes the shepherd configuration; maybe some> other mechanism (graft?) adjusting the modprobe configuration could be> better (better still, autoload the file). Any guidance would be nice> (including, that this solution is sufficient for now :))
The ideal would be that cachefilesd loads the appropriated module. Ifthis is not possible, we can discuss extendingkernel-module-loader-service-type service. But for now I guess it's ok.
I hope it answers your questions, I'll review the rest of the servicelater on.
Thanks,
Mathieu
M
M
Mathieu Othacehe wrote on 19 May 2020 14:12
(name . Jean-Baptiste Note)(address . jean-baptiste.note@m4x.org)(address . 41180@debbugs.gnu.org)
87k118unsc.fsf@gnu.org
Hello,
Overall, this looks nice! A few comments below. Note that you can mergethis patch with the documentation patch. It would also be nice to addthe associated system tests.
Toggle quote (9 lines)> +(define-record-type* <cachefilesd-configuration>> + cachefilesd-configuration make-cachefilesd-configuration> + cachefilesd-configuration?> +> + ;; <package-path>> + (cachefilesd cachefilesd-configuration-cachefilesd> + (default cachefilesd))> +
You could write something more concise here by removing empty lines andadding the 'type' comment on the same line.
Toggle quote (3 lines)> + (let ((secctx #$(cachefilesd-configuration-secctx config)))> + (if secctx (format port "secctx ~a" secctx)))
You can use 'when' for one arm if conditions.
Toggle quote (6 lines)> +> + ;; XXX factor this> + (format port "brun ~a%\n"> + #$(number->string> + (cachefilesd-configuration-brun config)))
It would indeed be nice to factor it, maybe by creating an associationtable with the symbol name as CAR and the matching procedure asCDR. Something like:
Toggle snippet (4 lines)'(("frun" . cachefilesd-configuration-frun) ("bcull" . cachefilesd-configuration-bcull))
then you could iterate on that list.
Toggle quote (3 lines)> + (if #$(cachefilesd-configuration-nocull? config)> + (display "nocull\n" port))
Same as above. You can use 'when' or 'unless' instead of "(if teststmt)".
Toggle quote (2 lines)> + ;; Make sure the cache directory and pid dir exists
"dir" -> "directory".
Toggle quote (3 lines)> + ;; XXX shepherd pid file handling: no idea how shepherd does it> + ;; and if it's going to conflict with cachefilesd's
Shepherd documentation says:
Toggle snippet (7 lines) When PID-FILE is true, it must be the name of a PID file associated with the process being launched; the return value is the PID once that file has been created. If PID-FILE does not show up in less than PID-FILE-TIMEOUT seconds, the service is considered as failing to start.
So I think you can remove this comment.
Thanks,
Mathieu
J
J
Jean-Baptiste Note wrote on 20 May 2020 22:39
(name . Mathieu Othacehe)(address . othacehe@gnu.org)(address . 41180@debbugs.gnu.org)
87367ucpdj.fsf@m4x.org
Hi Mathieu,
Thanks a lot for taking so much time to help me out and review thispatch.
Following your previous mail, I'm currently writing a test. I may followNFS's tests rather than CUPS -- (some of) NFS' tests just checks fromwithin the marionette that the service has been started, while CUPSverifies from the outside that an external service is correctly running.
While I do prefer the CUPS test -- verify at the "user level" that theservice is provided -- it seems very complex to me to test cachefilesdat a high level with a binary decision and no false positive. Venues forthis could be:
- maybe an NFS mount with the fsc option when cachefilesd is not activated will fail -- I need to check that;
- or maybe mounting some NFS share with fsc, accessing it, and checking afterwards that the cache has been filled by cached data -- this is getting complex though, and probably not a clear-cut scenario.
I don't know how high you will set the bar and if a simple 'check thatthe daemon is running' would be sufficient to you :)
Thanks a lot for the various documentation pointers and stylerecommendation. I really appreciate all of this!
I will provide a comprehensive patch with your changes integrated, and atest, as soon as i am happy with it -- or just give up writing theperfect test.
Kind regards,Jean-Baptiste
-----BEGIN PGP SIGNATURE-----
iQIzBAEBCAAdFiEEPxcq3dp4FVY5UpckkC0pVsuz75YFAl7FlYgACgkQkC0pVsuz75YGZxAAhizoSDCp66Nzs6FFGlKHE21PfqOB1nNF88ak/8kYd/mo+TLMN4CILaehXlivhmK28z6XN8lyX2ou5P5VPgd7vK16uKUbu/l7rNsZPA8IuO6MnejSAeoPO3K62dYQyjgJKDYbwV9cRQUu8kcUrzOcjbvQmpX6mwZIIcdU4l/RystsH8ddDa/IrAfO+YQ9VxiR7U8NCrMFJSnO2N/wl/h2OOygFg1LBO9HEGrbehJBFQnXSjTLsJNJRqV6Iq6FEIghm3OqGIgFfBbVJ6wGptTPaZOBleUGjcmoI52KZMu5y8AxkqXEjr2ly3ymJ8qKdyW0hGxptBIYxICD78mjAe/JK/zwqqT4Z1DZnvbLQDTpcJn0+hHgGZBBFoK3uIiI4FUjkFa+ML+8woFWCHA36DN62peU4XHilBYCgZWqGmh2RSMtSANjINp8uw6r2XSUEMT1Wg8SRj3oynO8uGU/q/OBEqioelLRxEPO67YUgNoELcTbUwO0dmMqbUUf7zP2Kz1sehT9762+9E7OpBTvPnk14xZNQK1IQb171AUmoIpaGMmUdT7VEq0CpyrVWVWfSVopCWNbMIuAxfC/jQkCHDigBNeSOPZZ9LSzhg/qE7bj89VD/NsBbiY98PdoHI5/rM7yl0mLW+WIm3yD1SyL1cIusZ7lEO+MKKjAi2DIw379DMw==bVBr-----END PGP SIGNATURE-----
M
M
Mathieu Othacehe wrote on 23 May 2020 08:44
(name . Jean-Baptiste Note)(address . jean-baptiste.note@m4x.org)(address . 41180@debbugs.gnu.org)
87lfljcfrc.fsf@gnu.org
Hello Jean-Baptiste,
Toggle quote (7 lines)> Thanks a lot for the various documentation pointers and style> recommendation. I really appreciate all of this!>> I will provide a comprehensive patch with your changes integrated, and a> test, as soon as i am happy with it -- or just give up writing the> perfect test.
Great :) I think that checking that the module is loaded, and thecachefilesd service is running is already a first step. You can alsocheck for some properties in the sysfs, but unless you're already there,maybe you don't need to push much further!
Thanks,
Mathieu
M
M
Mathieu Othacehe wrote on 2 Sep 2020 16:58
(name . Jean-Baptiste Note)(address . jean-baptiste.note@m4x.org)(address . 41180@debbugs.gnu.org)
87mu28ted0.fsf@gnu.org
Hello Jean-Baptiste,
Toggle quote (7 lines)> Thanks a lot for the various documentation pointers and style> recommendation. I really appreciate all of this!>> I will provide a comprehensive patch with your changes integrated, and a> test, as soon as i am happy with it -- or just give up writing the> perfect test.
Any progress on that one :)? Do not hesitate to ask some help here or on#guix if needed.
Thanks,
Mathieu
?
Your comment

Commenting via the web interface is currently disabled.

To comment on this conversation send email to 41180@debbugs.gnu.org