From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:470:142:3::10]:44598) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jLBJM-0006zV-2A for guix-patches@gnu.org; Sun, 05 Apr 2020 15:52:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jLBJK-0007zs-N1 for guix-patches@gnu.org; Sun, 05 Apr 2020 15:52:03 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:35097) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1jLBJK-0007zo-KT for guix-patches@gnu.org; Sun, 05 Apr 2020 15:52:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1jLBJK-0002tS-Jc for guix-patches@gnu.org; Sun, 05 Apr 2020 15:52:02 -0400 Subject: [bug#40454] [PATCH] services: Add udev-rules-service helper. Resent-Message-ID: Received: from eggs.gnu.org ([2001:470:142:3::10]:44571) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jLBJ8-0006xp-TJ for guix-patches@gnu.org; Sun, 05 Apr 2020 15:51:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jLBJ7-0007wp-Cc for guix-patches@gnu.org; Sun, 05 Apr 2020 15:51:50 -0400 Received: from relay5-d.mail.gandi.net ([217.70.183.197]:53879) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jLBJ7-0007wX-49 for guix-patches@gnu.org; Sun, 05 Apr 2020 15:51:49 -0400 Received: from localhost (luy13-1-78-237-113-178.fbx.proxad.net [78.237.113.178]) (Authenticated sender: brice@waegenei.re) by relay5-d.mail.gandi.net (Postfix) with ESMTPSA id 6F2881C0007 for ; Sun, 5 Apr 2020 19:51:47 +0000 (UTC) From: Brice Waegeneire Date: Sun, 5 Apr 2020 21:51:41 +0200 Message-Id: <20200405195141.21985-1-brice@waegenei.re> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+kyle=kyleam.com@gnu.org Sender: "Guix-patches" To: 40454@debbugs.gnu.org * doc/guix.texi (Base services): Add documentation for 'udev-rules-service'. Replace examples of 'udev-service-type' extension with 'udev-rules-service'. * gnu/services/base.scm (udev-rules-service): New procedure. --- doc/guix.texi | 46 +++++++++++++++++++++---------------------- gnu/services/base.scm | 22 +++++++++++++++++++++ 2 files changed, 45 insertions(+), 23 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index bc5602474e..da7fbbc12c 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -12785,8 +12785,12 @@ A directory path where the @command{guix-daemon} will perform builds. @deffn {Scheme Procedure} udev-service [#:udev @var{eudev} #:rules @code{'()}] Run @var{udev}, which populates the @file{/dev} directory dynamically. udev rules can be provided as a list of files through the @var{rules} -variable. The procedures @code{udev-rule} and @code{file->udev-rule} from -@code{(gnu services base)} simplify the creation of such rule files. +variable. The procedures @code{udev-rule}, @code{udev-rules-service} +and @code{file->udev-rule} from @code{(gnu services base)} simplify the +creation of such rule files. + +The @command{herd rules udev} command, as root, returns the name of the +directory containing all the active udev rules. @end deffn @deffn {Scheme Procedure} udev-rule [@var{file-name} @var{contents}] @@ -12805,23 +12809,27 @@ upon detecting a USB device with a given product identifier. "ATTR@{product@}==\"Example\", " "RUN+=\"/path/to/script\""))) @end lisp - -The @command{herd rules udev} command, as root, returns the name of the -directory containing all the active udev rules. @end deffn -Here we show how the default @var{udev-service} can be extended with it. +@deffn {Scheme Procedure} udev-rules-service [@var{name} @var{rules}] @ + [#:groups @var{groups}] +Return a service that extends @code{udev-service-type } with @var{rules} +and @code{account-service-type} with @var{groups} as system groups. +This works by creating a singleton service type +@var{name}@code{-udev-rules}, of which the returned service is an +instance. + +Here we show how it can be used to extend @var{udev-service} with the +previously defined rule @code{%example-udev-rule}. @lisp (operating-system ;; @dots{} (services - (modify-services %desktop-services - (udev-service-type config => - (udev-configuration (inherit config) - (rules (append (udev-configuration-rules config) - (list %example-udev-rule)))))))) + (cons* (udev-rules-service 'usb-thing %example-udev-rule) + %desktop-services))) @end lisp +@end deffn @deffn {Scheme Procedure} file->udev-rule [@var{file-name} @var{file}] Return a udev file named @var{file-name} containing the rules defined @@ -12861,7 +12869,7 @@ without root privileges. It also details how to create the the rules defined within the @var{android-udev-rules} package. To create such a group, we must define it both as part of the @var{supplementary-groups} of our @var{user-account} declaration, as -well as in the @var{groups} field of the @var{operating-system} record. +well as in the @var{groups} of the @var{udev-rules-service} procedure. @lisp (use-modules (gnu packages android) ;for android-udev-rules @@ -12875,19 +12883,11 @@ well as in the @var{groups} field of the @var{operating-system} record. (supplementary-groups '("adbusers" ;for adb "wheel" "netdev" "audio" "video"))))) - - (groups (cons (user-group (system? #t) (name "adbusers")) - %base-groups)) - ;; @dots{} - (services - (modify-services %desktop-services - (udev-service-type - config => - (udev-configuration (inherit config) - (rules (cons android-udev-rules - (udev-configuration-rules config)))))))) + (cons* (udev-rules-service 'android android-udev-rules + #:groups '("adbusers")) + %desktop-services))) @end lisp @defvr {Scheme Variable} urandom-seed-service-type diff --git a/gnu/services/base.scm b/gnu/services/base.scm index 8d9a563e2b..070765ab83 100644 --- a/gnu/services/base.scm +++ b/gnu/services/base.scm @@ -12,6 +12,7 @@ ;;; Copyright © 2019 John Soo ;;; Copyright © 2019 Jan (janneke) Nieuwenhuizen ;;; Copyright © 2020 Florian Pelz +;;; Copyright © 2020 Brice Waegeneire ;;; ;;; This file is part of GNU Guix. ;;; @@ -92,6 +93,7 @@ udev-service udev-rule file->udev-rule + udev-rules-service login-configuration login-configuration? @@ -2122,6 +2124,26 @@ extra rules from the packages listed in @var{rules}." (service udev-service-type (udev-configuration (udev udev) (rules rules)))) +(define* (udev-rules-service name rules #:key (groups '())) + "Return a service that extends udev-service-type with RULES and +account-service-type with GROUPS as system groups. This works by creating a +singleton service type NAME-udev-rules, of which the returned service is an +instance." + (let* ((name (symbol-append name '-udev-rules)) + (account-extension + (const (map (lambda (group) + (user-group (name group) (system? #t))) + groups))) + (udev-extension (const (list rules))) + (type (service-type + (name name) + (extensions (list + (service-extension + account-service-type account-extension) + (service-extension + udev-service-type udev-extension)))))) + (service type #f))) + (define swap-service-type (shepherd-service-type 'swap -- 2.26.0