Subject: Re: [bug#71561] [PATCH] services: networking: Allow dhcp-client to use a config file

From: Maxim Cournoyer <[email-masked]>
Date: Mon, 17 Jun 2024 17:01:50 -0400

Hi Richard,

Richard Sent <[email-masked]> writes:

> * gnu/services/networking (dhcp-client-configuration): Create

Nitpick: The file name should be complete, including the extension.
Pressing 'C' on the diff's hunk while authoring a commit message in
Magit (Emacs) creates a ChangeLog entry automatically, if that helps.

> dhcp-client-configuration-config-file.

I'd perhaps reword this to:

(dhcp-client-configuration) [config-file]: New field.
(dhcp-client-configuration-config-file): New accessor.

> (dhcp-client-shepherd-service): Use the config file when invoking
> dhclient if supplied.
> * doc/guix.texi: Document it.
>
> Change-Id: I286de4ddf59c5e606bf1fe0a7510570869e62b1a
> ---
> Hi all.
>
> This patch adds support for providing dhcp-client a configuration
> file, which is a file of the form
> https://man.archlinux.org/man/dhclient.conf.5. I believe this can be
> used to resolve
> https://lists.gnu.org/archive/html/help-guix/2024-06/msg00071.html
> using the instructions at https://unix.stackexchange.com/a/399694,
> although I haven't confirmed that. Either way, adding more flexibility
> to the service is a good thing in my eyes.

I think it's a good thing to have the 'escape hatch' implemented by many
services!

>  doc/guix.texi               |  3 +++
>  gnu/services/networking.scm | 15 +++++++++++++--
>  2 files changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/doc/guix.texi b/doc/guix.texi
> index 0102fd0fad..ad67a436ea 100644
> --- a/doc/guix.texi
> +++ b/doc/guix.texi
> @@ -21035,6 +21035,9 @@ Networking Setup
>  non-loopback interfaces that can be activated.  Otherwise the DHCP
>  client listens only on the specified interfaces.
>  
> +@item @code{config-file} (default: @code{#f})
> +The configuration file for the DHCP client.
> +
>  @item @code{shepherd-requirement} (default: @code{'()})
>  @itemx @code{shepherd-provision} (default: @code{'(networking)})
>  This option can be used to provide a list of symbols naming Shepherd services
> diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm
> index 378e117a86..12d8934e43 100644
> --- a/gnu/services/networking.scm
> +++ b/gnu/services/networking.scm
> @@ -91,6 +91,7 @@ (define-module (gnu services networking)
>              dhcp-client-configuration?
>              dhcp-client-configuration-package
>              dhcp-client-configuration-interfaces
> +            dhcp-client-configuration-config-file
>              dhcp-client-configuration-shepherd-provision
>              dhcp-client-configuration-shepherd-requirement
>  
> @@ -319,6 +320,8 @@ (define-record-type* <dhcp-client-configuration>
>                          (default '()))
>    (shepherd-provision   dhcp-client-configuration-shepherd-provision
>                          (default '(networking)))
> +  (config-file dhcp-client-configuration-config-file
> +               (default #f))
>    (interfaces   dhcp-client-configuration-interfaces
>                  (default 'all)))                  ;'all | list of strings
>  
> @@ -329,6 +332,7 @@ (define dhcp-client-shepherd-service
>             (requirement (dhcp-client-configuration-shepherd-requirement config))
>             (provision (dhcp-client-configuration-shepherd-provision config))
>             (interfaces (dhcp-client-configuration-interfaces config))
> +           (config-file (dhcp-client-configuration-config-file config))
>             (pid-file "/var/run/dhclient.pid"))
>         (list (shepherd-service
>                (documentation "Set up networking via DHCP.")
> @@ -364,6 +368,11 @@ (define dhcp-client-shepherd-service
>                                         (_
>                                          #~'#$interfaces))))
>  
> +                         (define config-file-args
> +                           (if #$config-file
> +                               (list "-cf" #$config-file)
> +                               '()))
> +
>                           (false-if-exception (delete-file #$pid-file))
>                           (let ((pid (fork+exec-command
>                                       ;; By default dhclient uses a
> @@ -371,8 +380,10 @@ (define dhcp-client-shepherd-service
>                                       ;; DDNS, which is incompatable with
>                                       ;; non-ISC DHCP servers; thus, pass '-I'.
>                                       ;; <https://kb.isc.org/docs/aa-01091>.
> -                                     (cons* dhclient "-nw" "-I"
> -                                            "-pf" #$pid-file ifaces))))
> +                                     `(,dhclient "-nw" "-I"
> +                                                 "-pf" ,#$pid-file
> +                                                 ,@config-file-args
> +                                                 ,@ifaces))))
>                             (and (zero? (cdr (waitpid pid)))
>                                  (read-pid-file #$pid-file)))))
>                (stop #~(make-kill-destructor))))))

Reviewed-by: Maxim Cournoyer <maxim.cournoyer@gmail>

Thanks,
Maxim