services: networking: Allow dhcp-client to use a config file.

* gnu/services/networking.scm (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
Signed-off-by: Maxim Cournoyer <maxim.cournoyer@gmail.com>
This commit is contained in:
Richard Sent 2024-06-17 20:49:12 -04:00 committed by Maxim Cournoyer
parent e92259e56f
commit b539e5ae39
No known key found for this signature in database
GPG key ID: 1260E46482E63562
2 changed files with 16 additions and 2 deletions

View file

@ -21035,6 +21035,9 @@ When set to @code{'all}, the DHCP client listens on all the available
non-loopback interfaces that can be activated. Otherwise the DHCP non-loopback interfaces that can be activated. Otherwise the DHCP
client listens only on the specified interfaces. 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{'()}) @item @code{shepherd-requirement} (default: @code{'()})
@itemx @code{shepherd-provision} (default: @code{'(networking)}) @itemx @code{shepherd-provision} (default: @code{'(networking)})
This option can be used to provide a list of symbols naming Shepherd services This option can be used to provide a list of symbols naming Shepherd services

View file

@ -91,6 +91,7 @@ (define-module (gnu services networking)
dhcp-client-configuration? dhcp-client-configuration?
dhcp-client-configuration-package dhcp-client-configuration-package
dhcp-client-configuration-interfaces dhcp-client-configuration-interfaces
dhcp-client-configuration-config-file
dhcp-client-configuration-shepherd-provision dhcp-client-configuration-shepherd-provision
dhcp-client-configuration-shepherd-requirement dhcp-client-configuration-shepherd-requirement
@ -319,6 +320,8 @@ (define-record-type* <dhcp-client-configuration>
(default '())) (default '()))
(shepherd-provision dhcp-client-configuration-shepherd-provision (shepherd-provision dhcp-client-configuration-shepherd-provision
(default '(networking))) (default '(networking)))
(config-file dhcp-client-configuration-config-file
(default #f))
(interfaces dhcp-client-configuration-interfaces (interfaces dhcp-client-configuration-interfaces
(default 'all))) ;'all | list of strings (default 'all))) ;'all | list of strings
@ -329,6 +332,7 @@ (define dhcp-client-shepherd-service
(requirement (dhcp-client-configuration-shepherd-requirement config)) (requirement (dhcp-client-configuration-shepherd-requirement config))
(provision (dhcp-client-configuration-shepherd-provision config)) (provision (dhcp-client-configuration-shepherd-provision config))
(interfaces (dhcp-client-configuration-interfaces config)) (interfaces (dhcp-client-configuration-interfaces config))
(config-file (dhcp-client-configuration-config-file config))
(pid-file "/var/run/dhclient.pid")) (pid-file "/var/run/dhclient.pid"))
(list (shepherd-service (list (shepherd-service
(documentation "Set up networking via DHCP.") (documentation "Set up networking via DHCP.")
@ -364,6 +368,11 @@ (define ifaces
(_ (_
#~'#$interfaces)))) #~'#$interfaces))))
(define config-file-args
(if #$config-file
(list "-cf" #$config-file)
'()))
(false-if-exception (delete-file #$pid-file)) (false-if-exception (delete-file #$pid-file))
(let ((pid (fork+exec-command (let ((pid (fork+exec-command
;; By default dhclient uses a ;; By default dhclient uses a
@ -371,8 +380,10 @@ (define ifaces
;; DDNS, which is incompatable with ;; DDNS, which is incompatable with
;; non-ISC DHCP servers; thus, pass '-I'. ;; non-ISC DHCP servers; thus, pass '-I'.
;; <https://kb.isc.org/docs/aa-01091>. ;; <https://kb.isc.org/docs/aa-01091>.
(cons* dhclient "-nw" "-I" `(,dhclient "-nw" "-I"
"-pf" #$pid-file ifaces)))) "-pf" ,#$pid-file
,@config-file-args
,@ifaces))))
(and (zero? (cdr (waitpid pid))) (and (zero? (cdr (waitpid pid)))
(read-pid-file #$pid-file))))) (read-pid-file #$pid-file)))))
(stop #~(make-kill-destructor)))))) (stop #~(make-kill-destructor))))))