services: networking: Add a dependency override mechanism to <static-networking>.

* gnu/services/networking.scm (<static-networking>)[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.
This commit is contained in:
Marius Bakke 2017-10-31 21:38:21 +01:00
parent 5859fd6c9e
commit db8ed7cee8
No known key found for this signature in database
GPG Key ID: A2A06DF2A33A54FA
3 changed files with 14 additions and 6 deletions

View File

@ -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

View File

@ -1986,6 +1986,7 @@ This service is not part of @var{%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)

View File

@ -5,6 +5,7 @@
;;; Copyright © 2016 John Darrington <jmd@gnu.org>
;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org>
;;; Copyright © 2017 Thomas Danckaert <post@thomasdanckaert.be>
;;; Copyright © 2017 Marius Bakke <mbakke@fastmail.com>
;;;
;;; This file is part of GNU Guix.
;;;
@ -51,6 +52,7 @@
static-networking-ip
static-networking-netmask
static-networking-gateway
static-networking-requirement
static-networking-service
static-networking-service-type
@ -145,22 +147,21 @@ fe80::1%lo0 apps.facebook.com\n")
(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
(($ <static-networking> 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 @@ network interface.")))
(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 @@ to handle."
(list (static-networking (interface interface) (ip ip)
(netmask netmask) (gateway gateway)
(provision provision)
(requirement requirement)
(name-servers name-servers)))))
(define dhcp-client-service-type