services: network-manager: Await for NetworkManager to finish starting up.

This is similar to its NetworkManager-wait-online.service systemd counterpart,
with the main difference being that we handle it all in 'networking symbol, rather than
introduce a new 'networking-online symbol. (see discussion #47253)

As a result of this change, with opensmtpd-service-type as an example,
manual 'herd restart smtpd' after system bootups are no longer required
when opensmtpd is configured with a smtpd.conf containing non-loopback interfaces.
(this issue is described in more detail at #60300)

Fixes <https://issues.guix.gnu.org/60300>.

* gnu/services/networking.scm (network-manager-shepherd-service): Await for
NetworkManager to finish starting up.

Signed-off-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
Bruno Victal 2023-03-07 12:44:03 +00:00 committed by Ludovic Courtès
parent 17c80118fa
commit d04955972e
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5

View file

@ -1235,17 +1235,30 @@ (define (network-manager-shepherd-service config)
;; TODO: iwd? is deprecated and should be passed
;; with shepherd-requirement, remove later.
,@(if iwd? '(iwd) '())))
(start #~(make-forkexec-constructor
(list (string-append #$network-manager
"/sbin/NetworkManager")
(string-append "--config=" #$conf)
"--no-daemon")
#:environment-variables
(list (string-append "NM_VPN_PLUGIN_DIR=" #$vpn
"/lib/NetworkManager/VPN")
;; Override non-existent default users
"NM_OPENVPN_USER="
"NM_OPENVPN_GROUP=")))
(start
#~(lambda _
(let ((pid
(fork+exec-command
(list #$(file-append network-manager
"/sbin/NetworkManager")
(string-append "--config=" #$conf)
"--no-daemon")
#:environment-variables
(list (string-append "NM_VPN_PLUGIN_DIR=" #$vpn
"/lib/NetworkManager/VPN")
;; Override non-existent default users
"NM_OPENVPN_USER="
"NM_OPENVPN_GROUP="))))
;; XXX: Despite the "online" name, this doesn't guarantee
;; WAN connectivity, it merely waits for NetworkManager
;; to finish starting-up. This is required otherwise
;; services will fail since the network interfaces be
;; absent until NetworkManager finishes setting them up.
(system* #$(file-append network-manager "/bin/nm-online")
"--wait-for-startup" "--quiet")
;; XXX: Finally, return the pid from running
;; fork+exec-command to shepherd.
pid)))
(stop #~(make-kill-destructor)))))))
(define network-manager-service-type