diff options
Diffstat (limited to 'gnu/services/networking.scm')
-rw-r--r-- | gnu/services/networking.scm | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm index 53840c2764..85ad5287f2 100644 --- a/gnu/services/networking.scm +++ b/gnu/services/networking.scm @@ -109,6 +109,24 @@ dhcpd-configuration-pid-file dhcpd-configuration-interfaces + dhcpcd-service-type + dhcpcd-configuration + dhcpcd-configuration? + dhcpcd-configuration-interfaces + dhcpcd-configuration-command-arguments + dhcpcd-configuration-host-name + dhcpcd-configuration-duid + dhcpcd-configuration-persistent? + dhcpcd-configuration-option + dhcpcd-configuration-require + dhcpcd-configuration-slaac + dhcpcd-configuration-no-option + dhcpcd-configuration-no-hook + dhcpcd-configuration-static + dhcpcd-configuration-vendor-class-id + dhcpcd-configuration-client-id + dhcpcd-configuration-extra-content + ntp-configuration ntp-configuration? ntp-configuration-ntp @@ -493,6 +511,149 @@ Protocol (DHCP) client, on all the non-loopback network interfaces."))) daemon is responsible for allocating IP addresses to its client."))) +;; +;; DHCPCD. +;; + +(define (serialize-field-name field-name) + (let ((str (symbol->string field-name))) + (string-replace-substring + (if (string-suffix? "?" str) + (string-drop-right str 1) + str) + "-" ""))) + +(define (dhcpcd-serialize-string field-name value) + (if (equal? field-name 'extra-content) + #~(string-append #$value "\n") + #~(format #f "~a ~a~%" #$(serialize-field-name field-name) #$value))) + +(define (dhcpcd-serialize-boolean field-name value) + (if value + #~(format #f "~a~%" #$(serialize-field-name field-name)) + "")) + +(define (dhcpcd-serialize-list-of-strings field-name value) + #~(string-append #$@(map (cut dhcpcd-serialize-string field-name <>) value))) + +;; Some fields (e.g. host-name) can be specified with an empty string argument. +;; Therefore, we need a maybe type to differentiate disabled/empty-string. +(define-maybe string (prefix dhcpcd-)) + +(define-configuration dhcpcd-configuration + (interfaces + (list '()) + "List of networking interfaces---e.g., @code{\"eth0\"}---to start a DHCP client +for. If no interface is specified (i.e., the list is empty) then @command{dhcpcd} +discovers available Ethernet interfaces, that can be configured, automatically." + empty-serializer) + (command-arguments + (list '("-q" "-q")) + "List of additional command-line options." + empty-serializer) + + ;; The following defaults replicate the default dhcpcd configuration file. + ;; + ;; See https://github.com/NetworkConfiguration/dhcpcd/tree/v10.0.10#configuration + (host-name + (maybe-string "") + "Host name to send via DHCP, defaults to the current system host name.") + (duid + (maybe-string "") + "DHCPv4 clients require a unique client identifier, this option uses the DHCPv6 +Unique Identifier as a DHCPv4 client identifier as well. For more information, refer +to @uref{https://www.rfc-editor.org/rfc/rfc4361, RFC 4361} and @code{dhcpcd.conf(5)}.") + (persistent? + (boolean #t) + "When true, automatically de-configure the interface when @command{dhcpcd} exits.") + (option + (list-of-strings + '("rapid_commit" + "domain_name_servers" + "domain_name" + "domain_search" + "host_name" + "classless_static_routes" + "interface_mtu")) + "List of options to request from the server.") + (require + (list-of-strings '("dhcp_server_identifier")) + "List of options to require in responses.") + (slaac + (maybe-string "private") + "Interface identifier used for SLAAC generated IPv6 addresses.") + + ;; Common options not set in the default configuration file. + (no-option + (list-of-strings '()) + "List of options to remove from the message before it's processed.") + (no-hook + (list-of-strings '()) + "List of hook script which should not be invoked.") + (static + (list-of-strings '()) + "DHCP client can request different options from a DHCP server, through +@code{static} it is possible to configure static values for selected options. For +example, @code{\"domain_name_servers=127.0.0.1\"}.") + (vendor-class-id + maybe-string + "Set the DHCP Vendor Class (e.g., @code{MSFT}). For more information, refer +to @uref{https://www.rfc-editor.org/rfc/rfc2132#section-9.13,RFC 2132}.") + (client-id + maybe-string + "Use the interface hardware address or the given string as a client identifier, +this is matually exclusive with the @code{duid} option.") + + ;; Escape hatch for the generated configuration file. + (extra-content + maybe-string + "Extra content to append to the configuration as-is.") + + (prefix dhcpcd-)) + +(define (dhcpcd-config-file config) + (mixed-text-file "dhcpcd.conf" + (serialize-configuration + config + dhcpcd-configuration-fields))) + +(define dhcpcd-account-service + (list (user-group (name "dhcpcd") (system? #t)) + (user-account + (name "dhcpcd") + (group "dhcpcd") + (system? #t) + (comment "dhcpcd daemon user") + (home-directory "/var/empty") + (shell (file-append shadow "/sbin/nologin"))))) + +(define (dhcpcd-shepherd-service config) + (let* ((config-file (dhcpcd-config-file config)) + (command-args (dhcpcd-configuration-command-arguments config)) + (ifaces (dhcpcd-configuration-interfaces config))) + (list (shepherd-service + (documentation "dhcpcd daemon.") + (provision '(networking)) + (requirement '(user-processes udev)) + (actions (list (shepherd-configuration-action config-file))) + (start + #~(make-forkexec-constructor + (list (string-append #$dhcpcd "/sbin/dhcpcd") + #$@command-args "-B" "-f" #$config-file #$@ifaces))) + (stop #~(make-kill-destructor)))))) + +(define dhcpcd-service-type + (service-type (name 'dhcpcd) + (description "Run the dhcpcd daemon.") + (extensions + (list (service-extension account-service-type + (const dhcpcd-account-service)) + (service-extension shepherd-root-service-type + dhcpcd-shepherd-service))) + (compose concatenate) + (default-value (dhcpcd-configuration)))) + + ;;; ;;; NTP. ;;; |