[PATCH] services: Add udev-rules-service helper.

  • Done
  • quality assurance status badge
Details
2 participants
  • Brice Waegeneire
  • Ludovic Courtès
Owner
unassigned
Submitted by
Brice Waegeneire
Severity
normal
B
B
Brice Waegeneire wrote on 5 Apr 2020 21:51
(address . guix-patches@gnu.org)
20200405195141.21985-1-brice@waegenei.re
* 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(-)

Toggle diff (137 lines)
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 <jsoo1@asu.edu>
;;; Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
;;; Copyright © 2020 Florian Pelz <pelzflorian@pelzflorian.de>
+;;; Copyright © 2020 Brice Waegeneire <brice@waegenei.re>
;;;
;;; 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
B
B
Brice Waegeneire wrote on 6 Apr 2020 16:49
(address . 40454@debbugs.gnu.org)(name . Guix-patches)(address . guix-patches-bounces+brice+lists=waegenei.re@gnu.org)
47883c43b2a6a8cb6c261858b1e5183e@waegenei.re
Hello Guix,

I forgot to explain what this patch does, it's a helper for
“udev-service-type”.
Here are some examples I use it for:

(udev-rules-service 'adb android-udev-rules #:groups '("adbusers"))
(udev-rules-service 'backlight brightnessctl #:groups '("video"
"input"))
(udev-rules-service 'u2f libu2f-host #:groups '("plugdev"))

- Brice
L
L
Ludovic Courtès wrote on 22 Apr 2020 19:11
(name . Brice Waegeneire)(address . brice@waegenei.re)(address . 40454-done@debbugs.gnu.org)
87lfmnv427.fsf@gnu.org
Hi,

Brice Waegeneire <brice@waegenei.re> skribis:

Toggle quote (5 lines)
> * 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.

Definitely more convenient than using ‘modify-services’ & co.

Applied, thanks!

Ludo’.
Closed
?