From db8ed7cee81cbd60b0f8d89a7bee377b369fdac1 Mon Sep 17 00:00:00 2001 From: Marius Bakke Date: Tue, 31 Oct 2017 21:38:21 +0100 Subject: [PATCH] services: networking: Add a dependency override mechanism to . * gnu/services/networking.scm ()[requirement]: New field. (static-networking-shepherd-service): Don't override requirement for loopback. (static-networking-service): Expose 'requirement' parameter. Default to UDEV. * gnu/services/base.scm (%base-services): Add (requirement '()) for loopback service. * doc/guix.texi (Networking Services): Document it. --- doc/guix.texi | 5 ++++- gnu/services/base.scm | 1 + gnu/services/networking.scm | 14 +++++++++----- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index d925b4edac..ad018ffc8e 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -10392,9 +10392,12 @@ This is the type for statically-configured network interfaces. @deffn {Scheme Procedure} static-networking-service @var{interface} @var{ip} @ [#:netmask #f] [#:gateway #f] [#:name-servers @code{'()}] + [#:requirement @code{'(udev)}] Return a service that starts @var{interface} with address @var{ip}. If @var{netmask} is true, use it as the network mask. If @var{gateway} is true, -it must be a string specifying the default network gateway. +it must be a string specifying the default network gateway. @var{requirement} +can be used to declare a dependency on another service before configuring the +interface. This procedure can be called several times, one for each network interface of interest. Behind the scenes what it does is extend diff --git a/gnu/services/base.scm b/gnu/services/base.scm index 7fc8f6aa7e..f4681c804d 100644 --- a/gnu/services/base.scm +++ b/gnu/services/base.scm @@ -1986,6 +1986,7 @@ (define %base-services (service static-networking-service-type (list (static-networking (interface "lo") (ip "127.0.0.1") + (requirement '()) (provision '(loopback))))) (syslog-service) (service urandom-seed-service-type) diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm index b0c23aafc7..c3ba0787c0 100644 --- a/gnu/services/networking.scm +++ b/gnu/services/networking.scm @@ -5,6 +5,7 @@ ;;; Copyright © 2016 John Darrington ;;; Copyright © 2017 Clément Lassieur ;;; Copyright © 2017 Thomas Danckaert +;;; Copyright © 2017 Marius Bakke ;;; ;;; This file is part of GNU Guix. ;;; @@ -51,6 +52,7 @@ (define-module (gnu services networking) static-networking-ip static-networking-netmask static-networking-gateway + static-networking-requirement static-networking-service static-networking-service-type @@ -145,22 +147,21 @@ (define-record-type* (default #f)) (provision static-networking-provision (default #f)) + (requirement static-networking-requirement + (default '())) (name-servers static-networking-name-servers ;FIXME: doesn't belong here (default '()))) (define static-networking-shepherd-service (match-lambda (($ interface ip netmask gateway provision - name-servers) + requirement name-servers) (let ((loopback? (and provision (memq 'loopback provision)))) (shepherd-service - ;; Unless we're providing the loopback interface, wait for udev to be up - ;; and running so that INTERFACE is actually usable. - (requirement (if loopback? '() '(udev))) - (documentation "Bring up the networking interface using a static IP address.") + (requirement requirement) (provision (or provision (list (symbol-append 'networking- (string->symbol interface))))) @@ -263,6 +264,8 @@ (define static-networking-service-type (define* (static-networking-service interface ip #:key netmask gateway provision + ;; Most interfaces require udev to be usable. + (requirement '(udev)) (name-servers '())) "Return a service that starts @var{interface} with address @var{ip}. If @var{netmask} is true, use it as the network mask. If @var{gateway} is true, @@ -277,6 +280,7 @@ (define* (static-networking-service interface ip (list (static-networking (interface interface) (ip ip) (netmask netmask) (gateway gateway) (provision provision) + (requirement requirement) (name-servers name-servers))))) (define dhcp-client-service-type