~ruther/guix-local

a023cca8d90cfdc7114bbdaa886c52b324075fb6 — Ludovic Courtès 11 years ago 4d54785
services: Add 'dhcp-client-service'.

* gnu/services/networking.scm (dhcp-client-service): New procedure.
* doc/guix.texi (Networking Services): Document it.
2 files changed, 39 insertions(+), 0 deletions(-)

M doc/guix.texi
M gnu/services/networking.scm
M doc/guix.texi => doc/guix.texi +6 -0
@@ 3449,6 3449,12 @@ Run @var{udev}, which populates the @file{/dev} directory dynamically.
The @code{(gnu system networking)} module provides services to configure
the network interface.

@cindex DHCP, networking service
@deffn {Monadic Procedure} dhcp-client-service [#:dhcp @var{isc-dhcp}]
Return a service that runs @var{dhcp}, a Dynamic Host Configuration
Protocol (DHCP) client, on all the non-loopback network interfaces.
@end deffn

@deffn {Monadic Procedure} static-networking-service @var{interface} @var{ip} @
       [#:gateway #f] [#:name-services @code{'()}]
Return a service that starts @var{interface} with address @var{ip}.  If

M gnu/services/networking.scm => gnu/services/networking.scm +33 -0
@@ 25,6 25,7 @@
  #:use-module (guix gexp)
  #:use-module (guix monads)
  #:export (static-networking-service
            dhcp-client-service
            tor-service))

;;; Commentary:


@@ 94,6 95,38 @@ gateway."
                                #t)))))
      (respawn? #f)))))

(define* (dhcp-client-service #:key (dhcp isc-dhcp))
  "Return a service that runs @var{dhcp}, a Dynamic Host Configuration
Protocol (DHCP) client, on all the non-loopback network interfaces."

  (define dhclient
    #~(string-append #$dhcp "/sbin/dhclient"))

  (define pid-file
    "/var/run/dhclient.pid")

  (with-monad %store-monad
    (return (service
             (documentation
              "Set up networking via DHCP.")
             (requirement '(user-processes udev))
             (provision '(networking))
             (start #~(lambda _
                        ;; When invoked without any arguments, 'dhclient'
                        ;; discovers all non-loopback interfaces *that are
                        ;; up*.  However, the relevant interfaces are
                        ;; typically down at this point.  Thus we perform our
                        ;; own interface discovery here.
                        (let* ((valid? (negate loopback-network-interface?))
                               (ifaces (filter valid?
                                               (all-network-interfaces)))
                               (pid    (fork+exec-command
                                        (cons* #$dhclient "-pf" #$pid-file
                                               ifaces))))
                          (and (zero? (cdr (waitpid pid)))
                               (call-with-input-file #$pid-file read)))))
             (stop #~(make-kill-destructor))))))

(define* (tor-service #:key (tor tor))
  "Return a service to run the @uref{https://torproject.org,Tor} daemon.