Subject: Re: [bug#76963] [PATCH] home: Add home-snuik-service.

From: Maxim Cournoyer <[email-masked]>
Date: Wed, 12 Mar 2025 21:47:35 +0900

Hi Janneke!

Janneke Nieuwenhuizen <[email-masked]> writes:

> * gnu/home/services/messaging.scm (<home-snuik-configuration>): New type.
> (home-snuik-services, home-snuik-service-type): New procedures.
> * doc/guix.texi (Messaging Home Services): Document it.
>
> Change-Id: I1e278e7d8ed04efcb1a2ce9e12e69cb6a31a9fa4
> ---
>  doc/guix.texi                   | 58 ++++++++++++++++++++++++-
>  gnu/home/services/messaging.scm | 77 ++++++++++++++++++++++++++++++++-

Wouldn't such a service be a more natural match for a system service?
It seems like something I'd like running on a headless server.

>  2 files changed, 132 insertions(+), 3 deletions(-)
>
> diff --git a/doc/guix.texi b/doc/guix.texi
> index d109877a32..f35e156376 100644
> --- a/doc/guix.texi
> +++ b/doc/guix.texi
> @@ -36,7 +36,7 @@
>  Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Efraim Flashner@*
>  Copyright @copyright{} 2016 John Darrington@*
>  Copyright @copyright{} 2016, 2017 Nikita Gillmann@*
> -Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 Janneke Nieuwenhuizen@*
> +Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Janneke Nieuwenhuizen@*

Maybe use 2016-2025 :-).

>  Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021 Julien Lepiller@*
>  Copyright @copyright{} 2016 Alex ter Weele@*
>  Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021 Christopher Baines@*
> @@ -49714,6 +49714,62 @@ Messaging Home Services
>  @end table
>  @end deftp
>  
> +@cindex snuik
> +The @uref{https://gitlab.com/janneke/snuik, Snuik IRC bot} can be run as
> +a daemon to aid talking to users that are currently off-line.  With the
> +@code{(gnu home services messaging)} service, you can configure Snuik to
> +run upon login.

nitpick: I've only ever seen 'offline' spelled as a single word.

[...]

> +
> +;;;
> +;;; Snuik.
> +;;;
> +(define-record-type* <home-snuik-configuration>
> +  home-snuik-configuration make-home-snuik-configuration
> +  home-snuik-configuration?
> +  (snuik         home-snuik-snuik       ;file-like
> +                 (default snuik))
> +  (server        home-snuik-server      ;string
> +                 (default #f))
> +  (port          home-snuik-port        ;integer
> +                 (default #f))
> +  (nick          home-snuik-nick        ;string
> +                 (default #f))
> +  (password      home-snuik-password    ;string
> +                 (default #f))
> +  (password-file home-snuik-password-file ;string
> +                 (default #f))
> +  (channels      home-snuik-channels    ;list of string
> +                 (default '()))
> +  (extra-options home-snuik-extra-options ;list of string
> +                 (default '())))

I'd use define-configuration/no-serialization from (gnu services configuration), which
will type-check the field values and produce useful errors in case of a
mistake, which is more useful than a comment in the source file :-).

> +(define (home-snuik-services config)
> +  "Return a <shepherd-service> for snuik with CONFIG."
> +  (match-record config
> +      <home-snuik-configuration>
> +      (snuik server port nick password password-file channels extra-options)
> +    (let* ((snuik (file-append snuik "/bin/snuik"))
> +           (command #~'(#$snuik
> +                        #$@(if server
> +                               #~("--server" #$server)
> +                               #~())
> +                        #$@(if port
> +                               #~("--port" (number->string port))
> +                               #~())
> +                        #$@(if nick
> +                               #~("--nick" nick)
> +                               #~())
> +                        #$@(if password
> +                               #~("--password" password)
> +                               #~())
> +                        #$@(if password-file
> +                               #~("--password-file" password-file)
> +                               #~())
> +                        #$@(if (pair? channels)
> +                               #~("--channels" (string-join channels ","))
> +                               #~())
> +                        #$@extra-options))
> +           (log-file #~(string-append %user-log-dir "/snuik.log")))
> +      (list (shepherd-service
> +             (documentation "Run the snuik IRC bot.")
> +             (provision '(snuik))
> +             (modules '((shepherd support))) ;for '%user-log-dir'
> +             (start #~(make-forkexec-constructor #$command
> +                                                 #:log-file #$log-file))
> +             (stop #~(make-kill-destructor)))))))

Can home services use the least-authority-wrapper to containerize the
processes?  If yes, that'd be nice to use it.

-- 
Thanks,
Maxim