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 ;; TODO: iwd? is deprecated and should be passed
;; with shepherd-requirement, remove later. ;; with shepherd-requirement, remove later.
,@(if iwd? '(iwd) '()))) ,@(if iwd? '(iwd) '())))
(start #~(make-forkexec-constructor (start
(list (string-append #$network-manager #~(lambda _
"/sbin/NetworkManager") (let ((pid
(string-append "--config=" #$conf) (fork+exec-command
"--no-daemon") (list #$(file-append network-manager
#:environment-variables "/sbin/NetworkManager")
(list (string-append "NM_VPN_PLUGIN_DIR=" #$vpn (string-append "--config=" #$conf)
"/lib/NetworkManager/VPN") "--no-daemon")
;; Override non-existent default users #:environment-variables
"NM_OPENVPN_USER=" (list (string-append "NM_VPN_PLUGIN_DIR=" #$vpn
"NM_OPENVPN_GROUP="))) "/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))))))) (stop #~(make-kill-destructor)))))))
(define network-manager-service-type (define network-manager-service-type