X-Git-Url: https://git.hcoop.net/jackhill/guix/guix.git/blobdiff_plain/459dd9eaf2ded3bd5676af7e62892db2c7880758..533935ccf71bef93f2f146fba1b2bb6402559965:/gnu/services/avahi.scm diff --git a/gnu/services/avahi.scm b/gnu/services/avahi.scm index 4ba1a513ab..54656708ca 100644 --- a/gnu/services/avahi.scm +++ b/gnu/services/avahi.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2014 Ludovic Courtès +;;; Copyright © 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès ;;; ;;; This file is part of GNU Guix. ;;; @@ -18,11 +18,30 @@ (define-module (gnu services avahi) #:use-module (gnu services) + #:use-module (gnu services base) + #:use-module (gnu services shepherd) + #:use-module (gnu services dbus) #:use-module (gnu system shadow) #:use-module (gnu packages avahi) - #:use-module (guix monads) + #:use-module (gnu packages admin) + #:use-module (guix deprecation) + #:use-module (guix records) #:use-module (guix gexp) - #:export (avahi-service)) + #:export (avahi-configuration + avahi-configuration? + + avahi-configuration-avahi + avahi-configuration-debug? + avahi-configuration-host-name + avahi-configuration-publish? + avahi-configuration-publish-workstation? + avahi-configuration-ipv4? + avahi-configuration-ipv6? + avahi-configuration-wide-area? + avahi-configuration-domains-to-browse + + avahi-service + avahi-service-type)) ;;; Commentary: ;;; @@ -31,37 +50,137 @@ ;;; ;;; Code: -(define* (configuration-file #:key host-name publish? - ipv4? ipv6? wide-area? domains-to-browse) - "Return an avahi-daemon configuration file." +(define-record-type* + avahi-configuration make-avahi-configuration + avahi-configuration? + (avahi avahi-configuration-avahi ; + (default avahi)) + (debug? avahi-configuration-debug? ;Boolean + (default #f)) + (host-name avahi-configuration-host-name ;string | #f + (default #f)) + (publish? avahi-configuration-publish? ;boolean + (default #t)) + + ;; The default for this was #t in Avahi 0.6.31 and became #f in 0.7. For + ;; now we stick to the old default. + (publish-workstation? avahi-configuration-publish-workstation? ;Boolean + (default #t)) + + (ipv4? avahi-configuration-ipv4? ;Boolean + (default #t)) + (ipv6? avahi-configuration-ipv6? ;Boolean + (default #t)) + (wide-area? avahi-configuration-wide-area? ;Boolean + (default #f)) + (domains-to-browse avahi-configuration-domains-to-browse ;list of strings + (default '()))) + +(define* (configuration-file config) + "Return an avahi-daemon configuration file based on CONFIG, an +." (define (bool value) (if value "yes\n" "no\n")) - (text-file "avahi-daemon.conf" - (string-append - "[server]\n" - (if host-name - (string-append "host-name=" host-name "\n") - "") - - "browse-domains=" (string-join domains-to-browse) - "\n" - "use-ipv4=" (bool ipv4?) - "use-ipv6=" (bool ipv6?) - "[wide-area]\n" - "enable-wide-area=" (bool wide-area?) - "[publish]\n" - "disable-publishing=" (bool (not publish?))))) - -(define* (avahi-service #:key (avahi avahi) - host-name - (publish? #t) - (ipv4? #t) (ipv6? #t) - wide-area? - (domains-to-browse '())) + (define host-name (avahi-configuration-host-name config)) + + (plain-file "avahi-daemon.conf" + (string-append + "[server]\n" + (if host-name + (string-append "host-name=" host-name "\n") + "") + + "browse-domains=" (string-join + (avahi-configuration-domains-to-browse + config)) + "\n" + "use-ipv4=" (bool (avahi-configuration-ipv4? config)) + "use-ipv6=" (bool (avahi-configuration-ipv6? config)) + "[wide-area]\n" + "enable-wide-area=" (bool (avahi-configuration-wide-area? config)) + "[publish]\n" + "disable-publishing=" + (bool (not (avahi-configuration-publish? config))) + "publish-workstation=" + (bool (avahi-configuration-publish-workstation? config))))) + +(define %avahi-accounts + ;; Account and group for the Avahi daemon. + (list (user-group (name "avahi") (system? #t)) + (user-account + (name "avahi") + (group "avahi") + (system? #t) + (comment "Avahi daemon user") + (home-directory "/var/empty") + (shell (file-append shadow "/sbin/nologin"))))) + +(define %avahi-activation + ;; Activation gexp. + #~(begin + (use-modules (guix build utils)) + (mkdir-p "/run/avahi-daemon"))) + +(define (avahi-shepherd-service config) + "Return a list of for CONFIG." + (let ((config (configuration-file config)) + (debug? (avahi-configuration-debug? config)) + (avahi (avahi-configuration-avahi config))) + (list (shepherd-service + (documentation "Run the Avahi mDNS/DNS-SD responder.") + (provision '(avahi-daemon)) + (requirement '(dbus-system networking)) + + (start #~(make-forkexec-constructor + (list #$(file-append avahi "/sbin/avahi-daemon") + "--daemonize" + #$@(if debug? #~("--debug") #~()) + "-f" #$config) + #:pid-file "/run/avahi-daemon/pid")) + (stop #~(make-kill-destructor)))))) + +(define avahi-service-type + (let ((avahi-package (compose list avahi-configuration-avahi))) + (service-type (name 'avahi) + (description + "Run @command{avahi-daemon}, a host and service discovery +daemon that implements the multicast DNS (mDNS) and DNS service +discovery (DNS-SD) protocols. Additionally, extend the C library's name +service switch (NSS) with support for @code{.local} host name resolution.") + (extensions + (list (service-extension shepherd-root-service-type + avahi-shepherd-service) + (service-extension dbus-root-service-type + avahi-package) + (service-extension account-service-type + (const %avahi-accounts)) + (service-extension activation-service-type + (const %avahi-activation)) + (service-extension nscd-service-type + (const (list nss-mdns))) + + ;; Provide 'avahi-browse', 'avahi-resolve', etc. in + ;; the system profile. + (service-extension profile-service-type + avahi-package))) + (default-value (avahi-configuration))))) + +(define-deprecated (avahi-service #:key (avahi avahi) debug? + host-name + (publish? #t) + (ipv4? #t) (ipv6? #t) + wide-area? + (domains-to-browse '())) + avahi-service-type "Return a service that runs @command{avahi-daemon}, a system-wide mDNS/DNS-SD responder that allows for service discovery and -\"zero-configuration\" host name lookups. +\"zero-configuration\" host name lookups (see @uref{https://avahi.org/}), and +extends the name service cache daemon (nscd) so that it can resolve +@code{.local} host names using +@uref{http://0pointer.de/lennart/projects/nss-mdns/, nss-mdns}. Additionally, +add the @var{avahi} package to the system profile so that commands such as +@command{avahi-browse} are directly usable. If @var{host-name} is different from @code{#f}, use that as the host name to publish for this machine; otherwise, use the machine's actual host name. @@ -74,36 +193,11 @@ When @var{wide-area?} is true, DNS-SD over unicast DNS is enabled. Boolean values @var{ipv4?} and @var{ipv6?} determine whether to use IPv4/IPv6 sockets." - (mlet %store-monad ((config (configuration-file #:host-name host-name - #:publish? publish? - #:ipv4? ipv4? - #:ipv6? ipv6? - #:wide-area? wide-area? - #:domains-to-browse - domains-to-browse))) - (return - (service - (documentation "Run the Avahi mDNS/DNS-SD responder.") - (provision '(avahi-daemon)) - (requirement '(dbus-system networking)) - - (start #~(make-forkexec-constructor - (string-append #$avahi "/sbin/avahi-daemon") - "--syslog" "-f" #$config)) - (stop #~(make-kill-destructor)) - (activate #~(begin - (use-modules (guix build utils)) - (mkdir-p "/var/run/avahi-daemon"))) - - (user-groups (list (user-group - (name "avahi")))) - (user-accounts (list (user-account - (name "avahi") - (group "avahi") - (system? #t) - (comment "Avahi daemon user") - (home-directory "/var/empty") - (shell - "/run/current-system/profile/sbin/nologin")))))))) + (service avahi-service-type + (avahi-configuration + (avahi avahi) (debug? debug?) (host-name host-name) + (publish? publish?) (ipv4? ipv4?) (ipv6? ipv6?) + (wide-area? wide-area?) + (domains-to-browse domains-to-browse)))) ;;; avahi.scm ends here