[PATCH] services: base: Add file->udev-rule function.

  • Done
  • quality assurance status badge
Details
2 participants
  • Ludovic Courtès
  • Maxim Cournoyer
Owner
unassigned
Submitted by
Maxim Cournoyer
Severity
normal
M
M
Maxim Cournoyer wrote on 29 Sep 2017 17:58
(name . guix-patches)(address . guix-patches@gnu.org)
87lgkxxzr1.fsf@gmail.com
Hello,

While experimenting with udev rules, I found a need to be able to pass
file-like objects containing udev rules to the udev-service. This patch
implements a `file->udev-rule' method that does just that.
From 050e96b3325f851f3118de0c881d25796d76049b Mon Sep 17 00:00:00 2001
From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
Date: Wed, 27 Sep 2017 21:33:25 -0400
Subject: [PATCH] services: base: Add file->udev-rule function.

This function allows passing a file-like object to the udev service.

* gnu/services/base.scm (file->udev-rule): New function.
* doc/guix.texi (Base Services): Document it.
---
doc/guix.texi | 15 ++++++++++++---
gnu/services/base.scm | 17 +++++++++++++++++
2 files changed, 29 insertions(+), 3 deletions(-)

Toggle diff (73 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index fff3fbd5f..a073dccb5 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -9707,11 +9707,20 @@ Return a service that runs the Guix build daemon according to
@var{config}.
@end deffn
-@deffn {Scheme Procedure} udev-service [#:udev udev]
+@deffn {Scheme Procedure} udev-service [#:udev @var{eudev} #:rules @code{'()}]
Run @var{udev}, which populates the @file{/dev} directory dynamically.
+Packages can be included in the @var{rules} list in order to extend the
+udev rules with the definitions found under their
+@file{lib/udev/rules.d} sub-directory.
+
+The functions @code{udev-rules} and @code{file->udev-rules} from
+@code{(gnu services base)} can be used to create rule objects based on a
+string or a file-like object, respectively. Those rule objects can be
+passed to udev-service just like packages.
+
@end deffn
-@deffn {Scheme Procedure} urandom-seed-service @var{#f}
+@deffn {Scheme Procedure} urandom-seed-service
Save some entropy in @var{%random-seed-file} to seed @file{/dev/urandom}
when rebooting.
@end deffn
@@ -9823,7 +9832,7 @@ to add @var{device} to the kernel's entropy pool. The service will fail if
@cindex session limits
@cindex ulimit
@cindex priority
-@deffn {Scheme Procedure} pam-limits-service [#:limits @var{limits}]
+@deffn {Scheme Procedure} pam-limits-service [#:limits @code{'()}]
Return a service that installs a configuration file for the
@uref{http://linux-pam.org/Linux-PAM-html/sag-pam_limits.html,
diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index 64620a9b0..711167a2f 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -71,6 +71,7 @@
udev-service-type
udev-service
udev-rule
+ file->udev-rule
login-configuration
login-configuration?
@@ -1628,6 +1629,22 @@ item of @var{packages}."
(lambda (port)
(display #$contents port)))))))
+(define (file->udev-rule file-name file)
+ "Return a directory with a udev rule file FILE-NAME which is a copy of FILE."
+ (computed-file file-name
+ (with-imported-modules '((guix build utils))
+ #~(begin
+ (use-modules (guix build utils))
+
+ (define rules.d
+ (string-append #$output "/lib/udev/rules.d"))
+
+ (define file-copy-dest
+ (string-append rules.d "/" #$file-name))
+
+ (mkdir-p rules.d)
+ (copy-file #$file file-copy-dest)))))
+
(define kvm-udev-rule
;; Return a directory with a udev rule that changes the group of /dev/kvm to
;; "kvm" and makes it #o660. Apparently QEMU-KVM used to ship this rule,
--
2.14.1
Below is an operating-system declaration that makes use of it.
;; This is an operating system configuration template ;; for a "desktop" setup without full-blown desktop ;; environments. (use-modules (gnu) (gnu system nss) (gnu services) (gnu system shadow) ;for user-group (guix download) ;for url-fetch (guix gexp) ;for file-append (guix packages) ;for origin (guix store) ;for %default-substitute-urls (srfi srfi-1)) ;for the remove function (use-service-modules base ;for nscd-service-type desktop networking ;for wicd-service-type ssh) ;for lsh-service (use-package-modules admin ;for wpa-supplicant ratpoison certs) (define 51-android-udev.rules (let ((version "20170910")) (origin (method url-fetch) (uri (string-append "https://raw.githubusercontent.com/M0Rf30/" "android-udev-rules/" version "/51-android.rules")) (sha256 (base32 "0lmmagpyb6xsq6zcr2w1cyx9qmjqmajkvrdbhjx32gqf1d9is003"))))) (operating-system (host-name "apteryx") (timezone "America/Montreal") ;America/Los_Angeles, Asia/Tokyo (locale "en_US.UTF-8") ;; Assuming /dev/sdX is the target hard disk, and "my-root" ;; is the label of the target root file system. (bootloader (bootloader-configuration (bootloader grub-bootloader) (target "/dev/sda"))) (file-systems (cons (file-system (device "my-root") (title 'label) (mount-point "/") (type "ext4")) %base-file-systems)) (users (cons (user-account (name "maxim") (comment "Maxim Cournoyer") (group "users") (supplementary-groups '("lp" ;for bluetooth "adbusers" ;for adb "wheel" "netdev" "audio" "video")) (home-directory "/home/maxim")) %base-user-accounts)) ;; Add plugdev to %base-groups (groups (cons (user-group (system? #t) (name "adbusers")) %base-groups)) ;; Add a bunch of window managers; we can choose one at ;; the log-in screen with F1. (packages (cons* ratpoison nss-certs ;for HTTPS access %base-packages)) ;; Use the "desktop" services, which include the X11 ;; log-in service and more. (services (cons* (bluetooth-service #:auto-enable? #t) (modify-services %desktop-services ;; Add a couple extra substitute servers. (guix-service-type config => (guix-configuration (inherit config) (substitute-urls (cons* "https://bayfront.guixsd.org" "https://berlin.guixsd.org" %default-substitute-urls)))) ;; Enable using adb as a simple user with a multitude of devices. (udev-service-type config => (udev-configuration (inherit config) (rules (cons* (file->udev-rule "51-android-udev.rules" 51-android-udev.rules) (udev-configuration-rules config)))))))) ;; Allow resolution of '.local' host names with mDNS. (name-service-switch %mdns-host-lookup-nss))
Thanks,

Maxim
L
L
Ludovic Courtès wrote on 3 Oct 2017 15:18
(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)(address . 28647@debbugs.gnu.org)
87bmlo74jq.fsf@gnu.org
Hi Maxim,

Maxim Cournoyer <maxim.cournoyer@gmail.com> skribis:

Toggle quote (4 lines)
> While experimenting with udev rules, I found a need to be able to pass
> file-like objects containing udev rules to the udev-service. This patch
> implements a `file->udev-rule' method that does just that.

Looks useful!

Toggle quote (10 lines)
> From 050e96b3325f851f3118de0c881d25796d76049b Mon Sep 17 00:00:00 2001
> From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
> Date: Wed, 27 Sep 2017 21:33:25 -0400
> Subject: [PATCH] services: base: Add file->udev-rule function.
>
> This function allows passing a file-like object to the udev service.
>
> * gnu/services/base.scm (file->udev-rule): New function.
> * doc/guix.texi (Base Services): Document it.

[...]

Toggle quote (12 lines)
> -@deffn {Scheme Procedure} udev-service [#:udev udev]
> +@deffn {Scheme Procedure} udev-service [#:udev @var{eudev} #:rules @code{'()}]
> Run @var{udev}, which populates the @file{/dev} directory dynamically.
> +Packages can be included in the @var{rules} list in order to extend the
> +udev rules with the definitions found under their
> +@file{lib/udev/rules.d} sub-directory.
> +
> +The functions @code{udev-rules} and @code{file->udev-rules} from
> +@code{(gnu services base)} can be used to create rule objects based on a
> +string or a file-like object, respectively. Those rule objects can be
> +passed to udev-service just like packages.

Could you document the procedures with @deffn so that they have an entry
in the index?

@deffn {Scheme Procedure} udev-rules @var{rules}
@end deffn

@deffn {Scheme Procedure} file->udev-rules @var{files}
Similar to @code{udev-rules}, but…
@end deffn

TIA!

Ludo’.
L
L
Ludovic Courtès wrote on 3 Oct 2017 15:20
(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)(address . 28647@debbugs.gnu.org)
87377074gs.fsf@gnu.org
Also, could you add an example in guix.texi that shows the use of the
Android udev rules that you submitted separately?

Thanks,
Ludo’.
L
L
Ludovic Courtès wrote on 23 Oct 2017 00:16
(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)(address . 28647@debbugs.gnu.org)
87wp3mygjn.fsf@gnu.org
Hey Maxim,

Just a friendly reminder. :-)

ludo@gnu.org (Ludovic Courtès) skribis:

Toggle quote (49 lines)
> Hi Maxim,
>
> Maxim Cournoyer <maxim.cournoyer@gmail.com> skribis:
>
>> While experimenting with udev rules, I found a need to be able to pass
>> file-like objects containing udev rules to the udev-service. This patch
>> implements a `file->udev-rule' method that does just that.
>
> Looks useful!
>
>> From 050e96b3325f851f3118de0c881d25796d76049b Mon Sep 17 00:00:00 2001
>> From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
>> Date: Wed, 27 Sep 2017 21:33:25 -0400
>> Subject: [PATCH] services: base: Add file->udev-rule function.
>>
>> This function allows passing a file-like object to the udev service.
>>
>> * gnu/services/base.scm (file->udev-rule): New function.
>> * doc/guix.texi (Base Services): Document it.
>
> [...]
>
>> -@deffn {Scheme Procedure} udev-service [#:udev udev]
>> +@deffn {Scheme Procedure} udev-service [#:udev @var{eudev} #:rules @code{'()}]
>> Run @var{udev}, which populates the @file{/dev} directory dynamically.
>> +Packages can be included in the @var{rules} list in order to extend the
>> +udev rules with the definitions found under their
>> +@file{lib/udev/rules.d} sub-directory.
>> +
>> +The functions @code{udev-rules} and @code{file->udev-rules} from
>> +@code{(gnu services base)} can be used to create rule objects based on a
>> +string or a file-like object, respectively. Those rule objects can be
>> +passed to udev-service just like packages.
>
> Could you document the procedures with @deffn so that they have an entry
> in the index?
>
> @deffn {Scheme Procedure} udev-rules @var{rules}
> …
> @end deffn
>
> @deffn {Scheme Procedure} file->udev-rules @var{files}
> Similar to @code{udev-rules}, but…
> @end deffn
>
> TIA!
>
> Ludo’.

ludo@gnu.org (Ludovic Courtès) skribis:

Toggle quote (5 lines)
> Also, could you add an example in guix.texi that shows the use of the
> Android udev rules that you submitted separately?
>
> Thanks,
> Ludo’.
M
M
Maxim Cournoyer wrote on 23 Oct 2017 03:53
Re: [bug#28647] [PATCHv2] services: base: Add file->udev-rule function.
(name . Ludovic Courtès)(address . ludo@gnu.org)(address . 28647@debbugs.gnu.org)
87mv4i3a07.fsf_-_@gmail.com
Hi Ludovic, and sorry for the delayed reply!

ludo@gnu.org (Ludovic Courtès) writes:

Toggle quote (46 lines)
> Hi Maxim,
>
> Maxim Cournoyer <maxim.cournoyer@gmail.com> skribis:
>
>> While experimenting with udev rules, I found a need to be able to pass
>> file-like objects containing udev rules to the udev-service. This patch
>> implements a `file->udev-rule' method that does just that.
>
> Looks useful!
>
>> From 050e96b3325f851f3118de0c881d25796d76049b Mon Sep 17 00:00:00 2001
>> From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
>> Date: Wed, 27 Sep 2017 21:33:25 -0400
>> Subject: [PATCH] services: base: Add file->udev-rule function.
>>
>> This function allows passing a file-like object to the udev service.
>>
>> * gnu/services/base.scm (file->udev-rule): New function.
>> * doc/guix.texi (Base Services): Document it.
>
> [...]
>
>> -@deffn {Scheme Procedure} udev-service [#:udev udev]
>> +@deffn {Scheme Procedure} udev-service [#:udev @var{eudev} #:rules @code{'()}]
>> Run @var{udev}, which populates the @file{/dev} directory dynamically.
>> +Packages can be included in the @var{rules} list in order to extend the
>> +udev rules with the definitions found under their
>> +@file{lib/udev/rules.d} sub-directory.
>> +
>> +The functions @code{udev-rules} and @code{file->udev-rules} from
>> +@code{(gnu services base)} can be used to create rule objects based on a
>> +string or a file-like object, respectively. Those rule objects can be
>> +passed to udev-service just like packages.
>
> Could you document the procedures with @deffn so that they have an entry
> in the index?
>
> @deffn {Scheme Procedure} udev-rules @var{rules}
> …
> @end deffn
>
> @deffn {Scheme Procedure} file->udev-rules @var{files}
> Similar to @code{udev-rules}, but…
> @end deffn
>

I'm hoping the attached patch addresses the requested additions. Thanks
for the review and comments.

Maxim
L
L
Ludovic Courtès wrote on 23 Oct 2017 04:39
(name . Maxim Cournoyer)(address . maxim.cournoyer@gmail.com)(address . 28647@debbugs.gnu.org)
8760b6wpsz.fsf@gnu.org
Hi Maxim,

Maxim Cournoyer <maxim.cournoyer@gmail.com> skribis:

Toggle quote (3 lines)
> I'm hoping the attached patch addresses the requested additions. Thanks
> for the review and comments.

It does!

Toggle quote (10 lines)
> From d2da854ad8d9d0d588c646e439ebfb7ef1c21f7c Mon Sep 17 00:00:00 2001
> From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
> Date: Wed, 27 Sep 2017 21:33:25 -0400
> Subject: [PATCH] services: base: Add file->udev-rule function.
>
> This function allows passing a file-like object to the udev service.
>
> * gnu/services/base.scm (file->udev-rule): New function.
> * doc/guix.texi (Base Services): Document it.

Applied, thanks!

Ludo’.
L
L
Ludovic Courtès wrote on 23 Oct 2017 04:39
control message for bug #28647
(address . control@debbugs.gnu.org)
874lqqwpsc.fsf@gnu.org
tags 28647 fixed
close 28647
?