* [bug#64471] [PATCH 0/2] File database update services @ 2023-07-05 9:59 Ludovic Courtès 2023-07-05 10:16 ` [bug#64471] [PATCH 1/2] services: Add 'file-database' service Ludovic Courtès ` (2 more replies) 0 siblings, 3 replies; 10+ messages in thread From: Ludovic Courtès @ 2023-07-05 9:59 UTC (permalink / raw) To: 64471; +Cc: Ludovic Courtès Hi! These patches add two system services to periodically update file databases: one for 'updatedb', and one for 'guix locate --update'. I did not add them to '%base-services' mainly because: (1) 'updatedb' builds a database of all the files available on the system, which can be a problem on multi-user systems, and (2) the 'guix locate' service is quite expensive ('time-machine' + 'store' method by default) and eventually users may often download a pre-built database from ci.guix or similar. Thoughts? Ludo'. Ludovic Courtès (2): services: Add 'file-database' service. services: Add 'package-database' service. doc/guix.texi | 111 ++++++++++++++++++++++++++++++++++++++- gnu/services/admin.scm | 116 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 226 insertions(+), 1 deletion(-) base-commit: c4a836f65d178786a5dd1f7c2d9491bb2c7482b3 -- 2.40.1 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [bug#64471] [PATCH 1/2] services: Add 'file-database' service. 2023-07-05 9:59 [bug#64471] [PATCH 0/2] File database update services Ludovic Courtès @ 2023-07-05 10:16 ` Ludovic Courtès 2023-07-13 18:00 ` Bruno Victal 2023-07-05 10:16 ` [bug#64471] [PATCH 2/2] services: Add 'package-database' service Ludovic Courtès 2023-08-07 14:39 ` bug#64471: [PATCH 0/2] File database update services Ludovic Courtès 2 siblings, 1 reply; 10+ messages in thread From: Ludovic Courtès @ 2023-07-05 10:16 UTC (permalink / raw) To: 64471; +Cc: Ludovic Courtès * gnu/services/admin.scm (%default-file-database-update-schedule) (%default-file-database-excluded-directories): New variables. (<file-database-configuration>): New record type. (file-database-mcron-jobs): New procedure. (file-database-service-type): New variable. * doc/guix.texi (File Search Services): New node. --- doc/guix.texi | 62 ++++++++++++++++++++++++++++++++++++++ gnu/services/admin.scm | 67 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+) diff --git a/doc/guix.texi b/doc/guix.texi index 853396f776..21ff15ccbc 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -388,6 +388,7 @@ Top * Printing Services:: Local and remote printer support. * Desktop Services:: D-Bus and desktop services. * Sound Services:: ALSA and Pulseaudio services. +* File Search Services:: Tools to search for files. * Database Services:: SQL databases, key-value stores, etc. * Mail Services:: IMAP, POP3, SMTP, and all that. * Messaging Services:: Messaging services. @@ -18414,6 +18415,7 @@ Services * Printing Services:: Local and remote printer support. * Desktop Services:: D-Bus and desktop services. * Sound Services:: ALSA and Pulseaudio services. +* File Search Services:: Tools to search for files. * Database Services:: SQL databases, key-value stores, etc. * Mail Services:: IMAP, POP3, SMTP, and all that. * Messaging Services:: Messaging services. @@ -24924,6 +24926,66 @@ Sound Services @end defvar +@node File Search Services +@subsection File Search Services + +@cindex file search +@cindex searching for a file +The services in this section populate @dfn{file databases} that let you +search for files on your machine. These services are provided by the +@code{(gnu services admin)} module. + +The first one, @code{file-database-service-type}, periodically runs the +venerable @command{updatedb} command (@pxref{Invoking updatedb,,, find, +GNU Findutils}). That command populates a database of file names that +you can then search with the @command{locate} command (@pxref{Invoing +locate,,, find, GNU Findutils}), as in this example: + +@example +locate important-notes.txt +@end example + +You can enable this service with its default settings by adding this +snippet to your operating system services: + +@lisp +(service file-database-service-type) +@end lisp + +This updates the database once a week, excluding files from +@file{/gnu/store}---these are more usefully handled by @command{guix +locate} (@pxref{Invoking guix locate}). You can of course provide a +custom configuration, as described below. + +@defvar file-database-service-type +This is the type of the file database service, which runs +@command{updatedb} periodically. Its associated value must be a +@code{file-database-configuration} record, as described below. +@end defvar + +@deftp {Data Type} file-database-configuration +Record type for the @code{file-database-service-type} configuration, +with the following fields: + +@table @asis +@item @code{package} (default: @code{findutils}) +The GNU@tie{}Findutils package from which the @command{updatedb} command +is taken. + +@item @code{schedule} (default: @code{%default-file-database-update-schedule}) +String or G-exp denoting an mcron schedule for the periodic +@command{updatedb} job (@pxref{Guile Syntax,,, mcron, GNU@tie{}mcron}). + +@item @code{excluded-directories} (default @code{%default-file-database-excluded-directories}) +List of directories to ignore when building the file database. By +default, this includes @file{/tmp} and @file{/gnu/store}, which should +instead be indexed by @command{guix locate} (@pxref{Invoking guix +locate}). This list is passed to the @option{--prunepaths} option of +@command{updatedb} (@pxref{Invoking updatedb,,, find, +GNU@tie{}Findutils}). +@end table +@end deftp + @node Database Services @subsection Database Services diff --git a/gnu/services/admin.scm b/gnu/services/admin.scm index 1c10cfb1f6..57fdfc35c0 100644 --- a/gnu/services/admin.scm +++ b/gnu/services/admin.scm @@ -21,11 +21,14 @@ (define-module (gnu services admin) #:use-module (gnu packages admin) + #:use-module ((gnu packages base) + #:select (canonical-package findutils)) #:use-module (gnu packages certs) #:use-module (gnu packages package-management) #:use-module (gnu services) #:use-module (gnu services mcron) #:use-module (gnu services shepherd) + #:use-module ((guix store) #:select (%store-prefix)) #:use-module (guix gexp) #:use-module (guix modules) #:use-module (guix packages) @@ -55,6 +58,15 @@ (define-module (gnu services admin) log-cleanup-configuration-expiry log-cleanup-configuration-schedule + file-database-service-type + file-database-configuration + file-database-configuration? + file-database-configuration-package + file-database-configuration-schedule + file-database-configuration-excluded-directories + %default-file-database-update-schedule + %default-file-database-excluded-directories + unattended-upgrade-service-type unattended-upgrade-configuration unattended-upgrade-configuration? @@ -255,6 +267,61 @@ (define log-cleanup-service-type (description "Periodically delete old log files."))) +\f +;;; +;;; File databases. +;;; + +(define %default-file-database-update-schedule + ;; Default mcron schedule for the periodic 'updatedb' job: once every + ;; Sunday. + "10 23 * * 0") + +(define %default-file-database-excluded-directories + ;; Directories excluded from the 'locate' database. + (list (%store-prefix) + "/tmp" "/var/tmp" "/var/cache" ".*/\\.cache" + "/run/udev")) + +(define-record-type* <file-database-configuration> + file-database-configuration make-file-database-configuration + file-database-configuration? + (package file-database-configuration-package + (default + (let-system (system target) + ;; Unless we're cross-compiling, avoid pulling a + ;; second copy of findutils. + (if target + findutils + (canonical-package findutils))))) + (schedule file-database-configuration-schedule + (default %default-file-database-update-schedule)) + (excluded-directories file-database-configuration-excluded-directories + (default %default-file-database-excluded-directories))) + +(define (file-database-mcron-jobs configuration) + (match-record configuration <file-database-configuration> + (package schedule excluded-directories) + (let ((updatedb (program-file + "updatedb" + #~(execl #$(file-append package "/bin/updatedb") + "updatedb" + #$(string-append "--prunepaths=" + (string-join + excluded-directories)))))) + (list #~(job #$schedule #$updatedb))))) + +(define file-database-service-type + (service-type + (name 'file-database) + (extensions (list (service-extension mcron-service-type + file-database-mcron-jobs))) + (description + "Periodically update the file database used by the @command{locate} command, +which lets you search for files by name. The database is created by running +the @command{updatedb} command.") + (default-value (file-database-configuration)))) + \f ;;; ;;; Unattended upgrade. -- 2.40.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [bug#64471] [PATCH 1/2] services: Add 'file-database' service. 2023-07-05 10:16 ` [bug#64471] [PATCH 1/2] services: Add 'file-database' service Ludovic Courtès @ 2023-07-13 18:00 ` Bruno Victal 2023-07-17 20:22 ` [bug#64471] [PATCH 0/2] File database update services Ludovic Courtès 0 siblings, 1 reply; 10+ messages in thread From: Bruno Victal @ 2023-07-13 18:00 UTC (permalink / raw) To: Ludovic Courtès; +Cc: 64471 Hi Ludo’, On 2023-07-05 11:16, Ludovic Courtès wrote: > +(define-record-type* <file-database-configuration> > + file-database-configuration make-file-database-configuration > + file-database-configuration? > + (package file-database-configuration-package > + (default > + (let-system (system target) > + ;; Unless we're cross-compiling, avoid pulling a > + ;; second copy of findutils. > + (if target > + findutils > + (canonical-package findutils))))) > + (schedule file-database-configuration-schedule > + (default %default-file-database-update-schedule)) > + (excluded-directories file-database-configuration-excluded-directories > + (default %default-file-database-excluded-directories))) How about using define-configuration instead to have the documentation neatly in sync with the fields? > + > +(define (file-database-mcron-jobs configuration) > + (match-record configuration <file-database-configuration> > + (package schedule excluded-directories) > + (let ((updatedb (program-file > + "updatedb" > + #~(execl #$(file-append package "/bin/updatedb") > + "updatedb" > + #$(string-append "--prunepaths=" > + (string-join > + excluded-directories)))))) > + (list #~(job #$schedule #$updatedb))))) I'm afraid #$schedule might be insufficient if this is a _mcron_ time-spec. There's an elaborate dance done by fstrim-service-type to handle the more exotic mcron time expressions, perhaps you can reuse it here? -- Furthermore, I consider that nonfree software must be eradicated. Cheers, Bruno. ^ permalink raw reply [flat|nested] 10+ messages in thread
* [bug#64471] [PATCH 0/2] File database update services 2023-07-13 18:00 ` Bruno Victal @ 2023-07-17 20:22 ` Ludovic Courtès 2023-07-20 21:22 ` [bug#64471] [PATCH v2 1/2] services: Add 'file-database' service Ludovic Courtès ` (2 more replies) 0 siblings, 3 replies; 10+ messages in thread From: Ludovic Courtès @ 2023-07-17 20:22 UTC (permalink / raw) To: Bruno Victal; +Cc: 64471 Hello, Bruno Victal <mirai@makinata.eu> skribis: > On 2023-07-05 11:16, Ludovic Courtès wrote: >> +(define-record-type* <file-database-configuration> >> + file-database-configuration make-file-database-configuration >> + file-database-configuration? >> + (package file-database-configuration-package >> + (default >> + (let-system (system target) >> + ;; Unless we're cross-compiling, avoid pulling a >> + ;; second copy of findutils. >> + (if target >> + findutils >> + (canonical-package findutils))))) >> + (schedule file-database-configuration-schedule >> + (default %default-file-database-update-schedule)) >> + (excluded-directories file-database-configuration-excluded-directories >> + (default %default-file-database-excluded-directories))) > > How about using define-configuration instead to have the documentation neatly > in sync with the fields? Hmm, good point, I’ll take a look. >> +(define (file-database-mcron-jobs configuration) >> + (match-record configuration <file-database-configuration> >> + (package schedule excluded-directories) >> + (let ((updatedb (program-file >> + "updatedb" >> + #~(execl #$(file-append package "/bin/updatedb") >> + "updatedb" >> + #$(string-append "--prunepaths=" >> + (string-join >> + excluded-directories)))))) >> + (list #~(job #$schedule #$updatedb))))) > > I'm afraid #$schedule might be insufficient if this is a _mcron_ time-spec. > There's an elaborate dance done by fstrim-service-type to handle the more exotic > mcron time expressions, perhaps you can reuse it here? I’m not sure what fstrim-service-type is trying to achieve with this: #~(job ;; Note: The “if” below is to ensure that ;; lists are ungexp'd correctly since @var{schedule} ;; can be either a procedure, a string or a list. #$(if (list? schedule) #~'(#$@schedule) schedule) …") If we simply have: #~(job #$schedule …) then ‘schedule’ can be anything you might expect, like: • "0 * * * *" ;string • #~(next-hour …) ;gexp • #~(lambda (x) …) ;another gexp What’s the problem? :-) Ludo’. ^ permalink raw reply [flat|nested] 10+ messages in thread
* [bug#64471] [PATCH v2 1/2] services: Add 'file-database' service. 2023-07-17 20:22 ` [bug#64471] [PATCH 0/2] File database update services Ludovic Courtès @ 2023-07-20 21:22 ` Ludovic Courtès 2023-07-26 13:28 ` Bruno Victal 2023-07-20 21:22 ` [bug#64471] [PATCH v2 2/2] services: Add 'package-database' service Ludovic Courtès 2023-07-26 13:22 ` [bug#64471] [PATCH 0/2] File database update services Bruno Victal 2 siblings, 1 reply; 10+ messages in thread From: Ludovic Courtès @ 2023-07-20 21:22 UTC (permalink / raw) To: 64471; +Cc: Ludovic Courtès, Bruno Victal * gnu/services/admin.scm (%default-file-database-update-schedule) (%default-file-database-excluded-directories): New variables. (<file-database-configuration>): New record type. (file-database-mcron-jobs): New procedure. (file-database-service-type): New variable. * doc/guix.texi (File Search Services): New node. --- doc/guix.texi | 62 +++++++++++++++++++++++++++++++ gnu/services/admin.scm | 83 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+) Change since v1: use of 'define-configuration' instead of 'define-record-type*'. However, I am not using the generated documentation due to <https://issues.guix.gnu.org/64754>. (Overall I'm not fully satisfied with 'define-configuration'.) Thoughts? Ludo'. diff --git a/doc/guix.texi b/doc/guix.texi index 1d8ebcd72f..1d5f7c6b47 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -388,6 +388,7 @@ Top * Printing Services:: Local and remote printer support. * Desktop Services:: D-Bus and desktop services. * Sound Services:: ALSA and Pulseaudio services. +* File Search Services:: Tools to search for files. * Database Services:: SQL databases, key-value stores, etc. * Mail Services:: IMAP, POP3, SMTP, and all that. * Messaging Services:: Messaging services. @@ -18428,6 +18429,7 @@ Services * Printing Services:: Local and remote printer support. * Desktop Services:: D-Bus and desktop services. * Sound Services:: ALSA and Pulseaudio services. +* File Search Services:: Tools to search for files. * Database Services:: SQL databases, key-value stores, etc. * Mail Services:: IMAP, POP3, SMTP, and all that. * Messaging Services:: Messaging services. @@ -24938,6 +24940,66 @@ Sound Services @end defvar +@node File Search Services +@subsection File Search Services + +@cindex file search +@cindex searching for a file +The services in this section populate @dfn{file databases} that let you +search for files on your machine. These services are provided by the +@code{(gnu services admin)} module. + +The first one, @code{file-database-service-type}, periodically runs the +venerable @command{updatedb} command (@pxref{Invoking updatedb,,, find, +GNU Findutils}). That command populates a database of file names that +you can then search with the @command{locate} command (@pxref{Invoing +locate,,, find, GNU Findutils}), as in this example: + +@example +locate important-notes.txt +@end example + +You can enable this service with its default settings by adding this +snippet to your operating system services: + +@lisp +(service file-database-service-type) +@end lisp + +This updates the database once a week, excluding files from +@file{/gnu/store}---these are more usefully handled by @command{guix +locate} (@pxref{Invoking guix locate}). You can of course provide a +custom configuration, as described below. + +@defvar file-database-service-type +This is the type of the file database service, which runs +@command{updatedb} periodically. Its associated value must be a +@code{file-database-configuration} record, as described below. +@end defvar + +@deftp {Data Type} file-database-configuration +Record type for the @code{file-database-service-type} configuration, +with the following fields: + +@table @asis +@item @code{package} (default: @code{findutils}) +The GNU@tie{}Findutils package from which the @command{updatedb} command +is taken. + +@item @code{schedule} (default: @code{%default-file-database-update-schedule}) +String or G-exp denoting an mcron schedule for the periodic +@command{updatedb} job (@pxref{Guile Syntax,,, mcron, GNU@tie{}mcron}). + +@item @code{excluded-directories} (default @code{%default-file-database-excluded-directories}) +List of directories to ignore when building the file database. By +default, this includes @file{/tmp} and @file{/gnu/store}, which should +instead be indexed by @command{guix locate} (@pxref{Invoking guix +locate}). This list is passed to the @option{--prunepaths} option of +@command{updatedb} (@pxref{Invoking updatedb,,, find, +GNU@tie{}Findutils}). +@end table +@end deftp + @node Database Services @subsection Database Services diff --git a/gnu/services/admin.scm b/gnu/services/admin.scm index 1c10cfb1f6..636367a6f3 100644 --- a/gnu/services/admin.scm +++ b/gnu/services/admin.scm @@ -21,16 +21,21 @@ (define-module (gnu services admin) #:use-module (gnu packages admin) + #:use-module ((gnu packages base) + #:select (canonical-package findutils)) #:use-module (gnu packages certs) #:use-module (gnu packages package-management) #:use-module (gnu services) + #:use-module (gnu services configuration) #:use-module (gnu services mcron) #:use-module (gnu services shepherd) + #:use-module ((guix store) #:select (%store-prefix)) #:use-module (guix gexp) #:use-module (guix modules) #:use-module (guix packages) #:use-module (guix records) #:use-module (srfi srfi-1) + #:use-module (ice-9 match) #:use-module (ice-9 vlist) #:export (%default-rotations %rotated-files @@ -55,6 +60,15 @@ (define-module (gnu services admin) log-cleanup-configuration-expiry log-cleanup-configuration-schedule + file-database-service-type + file-database-configuration + file-database-configuration? + file-database-configuration-package + file-database-configuration-schedule + file-database-configuration-excluded-directories + %default-file-database-update-schedule + %default-file-database-excluded-directories + unattended-upgrade-service-type unattended-upgrade-configuration unattended-upgrade-configuration? @@ -255,6 +269,75 @@ (define log-cleanup-service-type (description "Periodically delete old log files."))) +\f +;;; +;;; File databases. +;;; + +(define %default-file-database-update-schedule + ;; Default mcron schedule for the periodic 'updatedb' job: once every + ;; Sunday. + "10 23 * * 0") + +(define %default-file-database-excluded-directories + ;; Directories excluded from the 'locate' database. + (list (%store-prefix) + "/tmp" "/var/tmp" "/var/cache" ".*/\\.cache" + "/run/udev")) + +(define (string-or-gexp? obj) + (or (string? obj) (gexp? obj))) + +(define string-list? + (match-lambda + (((? string) ...) #t) + (_ #f))) + +(define-configuration/no-serialization file-database-configuration + (package + (file-like (let-system (system target) + ;; Unless we're cross-compiling, avoid pulling a second copy + ;; of findutils. + (if target + findutils + (canonical-package findutils)))) + "The GNU@tie{}Findutils package from which the @command{updatedb} command +is taken.") + (schedule + (string-or-gexp %default-file-database-update-schedule) + "String or G-exp denoting an mcron schedule for the periodic +@command{updatedb} job (@pxref{Guile Syntax,,, mcron, GNU@tie{}mcron}).") + (excluded-directories + (string-list %default-file-database-excluded-directories) + "List of directories to ignore when building the file database. By +default, this includes @file{/tmp} and @file{/gnu/store}, which should instead +be indexed by @command{guix locate} (@pxref{Invoking guix locate}). This list +is passed to the @option{--prunepaths} option of +@command{updatedb} (@pxref{Invoking updatedb,,, find, GNU@tie{}Findutils}).")) + +(define (file-database-mcron-jobs configuration) + (match-record configuration <file-database-configuration> + (package schedule excluded-directories) + (let ((updatedb (program-file + "updatedb" + #~(execl #$(file-append package "/bin/updatedb") + "updatedb" + #$(string-append "--prunepaths=" + (string-join + excluded-directories)))))) + (list #~(job #$schedule #$updatedb))))) + +(define file-database-service-type + (service-type + (name 'file-database) + (extensions (list (service-extension mcron-service-type + file-database-mcron-jobs))) + (description + "Periodically update the file database used by the @command{locate} command, +which lets you search for files by name. The database is created by running +the @command{updatedb} command.") + (default-value (file-database-configuration)))) + \f ;;; ;;; Unattended upgrade. base-commit: 283969d0c527aa41e65bb4f5c2a7fa3baf86c49a -- 2.41.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [bug#64471] [PATCH v2 1/2] services: Add 'file-database' service. 2023-07-20 21:22 ` [bug#64471] [PATCH v2 1/2] services: Add 'file-database' service Ludovic Courtès @ 2023-07-26 13:28 ` Bruno Victal 0 siblings, 0 replies; 10+ messages in thread From: Bruno Victal @ 2023-07-26 13:28 UTC (permalink / raw) To: Ludovic Courtès; +Cc: 64471 On 2023-07-20 22:22, Ludovic Courtès wrote: > +(define string-list? > + (match-lambda > + (((? string) ...) #t) > + (_ #f))) There's a procedure 'list-of' from (gnu services configuration) that you can use to define these kinds of procedures. In fact, there's already a list-of-strings? predicate as a starting point within said module that you can use instead. -- Furthermore, I consider that nonfree software must be eradicated. Cheers, Bruno. ^ permalink raw reply [flat|nested] 10+ messages in thread
* [bug#64471] [PATCH v2 2/2] services: Add 'package-database' service. 2023-07-17 20:22 ` [bug#64471] [PATCH 0/2] File database update services Ludovic Courtès 2023-07-20 21:22 ` [bug#64471] [PATCH v2 1/2] services: Add 'file-database' service Ludovic Courtès @ 2023-07-20 21:22 ` Ludovic Courtès 2023-07-26 13:22 ` [bug#64471] [PATCH 0/2] File database update services Bruno Victal 2 siblings, 0 replies; 10+ messages in thread From: Ludovic Courtès @ 2023-07-20 21:22 UTC (permalink / raw) To: 64471; +Cc: Ludovic Courtès, Bruno Victal * gnu/services/admin.scm (%default-package-database-update-schedule): New variable. (<package-database-configuration>): New record type. (package-database-mcron-jobs): New procedure. (package-database-service-type): New variable. * doc/guix.texi (File Search Services): Document it. --- doc/guix.texi | 49 +++++++++++++++++++++++++++++++++++++- gnu/services/admin.scm | 53 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 1 deletion(-) diff --git a/doc/guix.texi b/doc/guix.texi index 1d5f7c6b47..833865f009 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -4481,7 +4481,9 @@ Invoking guix locate exist or is too old, it falls back to the per-user database, by default under @file{~/.cache/guix/locate}. On a multi-user system, administrators may want to periodically update the system-wide database -so that all users can benefit from it. +so that all users can benefit from it, for instance by setting up +@code{package-database-service-type} (@pxref{File Search Services, +@code{package-database-service-type}}). The general syntax is: @@ -25000,6 +25002,51 @@ File Search Services @end table @end deftp +The second service, @code{package-database-service-type}, builds the +database used by @command{guix locate}, which lets you search for +packages that contain a given file (@pxref{Invoking guix locate}). The +service periodically updates a system-wide database, which will be +readily available to anyone running @command{guix locate} on the system. +To use this service with its default settings, add this snippet to your +service list: + +@lisp +(service package-database-service-type) +@end lisp + +This will run @command{guix locate --update} once a week. + +@defvar package-database-service-type +This is the service type for periodic @command{guix locate} updates +(@pxref{Invoking guix locate}). Its value must be a +@code{package-database-configuration} record, as shown below. +@end defvar + +@deftp {Data Type} package-database-configuration +Data type to configure periodic package database updates. It has the +following fields: + +@table @asis +@item @code{package} (default: @code{guix}) +The Guix package to use. + +@item @code{schedule} (default: @code{%default-package-database-update-schedule}) +String or G-exp denoting an mcron schedule for the periodic +@command{guix locate --update} job (@pxref{Guile Syntax,,, mcron, +GNU@tie{}mcron}). + +@item @code{method} (default: @code{'store}) +Indexing method for @command{guix locate}. The default value, +@code{'store}, yields a more complete database but is relatively +expensive in terms of CPU and input/output. + +@item @code{channels} (default: @code{#~%default-channels}) +G-exp denoting the channels to use when updating the database +(@pxref{Channels}). +@end table +@end deftp + + @node Database Services @subsection Database Services diff --git a/gnu/services/admin.scm b/gnu/services/admin.scm index 636367a6f3..0c24cedd43 100644 --- a/gnu/services/admin.scm +++ b/gnu/services/admin.scm @@ -29,6 +29,8 @@ (define-module (gnu services admin) #:use-module (gnu services configuration) #:use-module (gnu services mcron) #:use-module (gnu services shepherd) + #:use-module (gnu system accounts) + #:use-module ((gnu system shadow) #:select (account-service-type)) #:use-module ((guix store) #:select (%store-prefix)) #:use-module (guix gexp) #:use-module (guix modules) @@ -69,6 +71,14 @@ (define-module (gnu services admin) %default-file-database-update-schedule %default-file-database-excluded-directories + package-database-service-type + package-database-configuration + package-database-configuration? + package-database-configuration-package + package-database-configuration-schedule + package-database-configuration-method + package-database-configuration-channels + unattended-upgrade-service-type unattended-upgrade-configuration unattended-upgrade-configuration? @@ -338,6 +348,49 @@ (define file-database-service-type the @command{updatedb} command.") (default-value (file-database-configuration)))) +(define %default-package-database-update-schedule + ;; Default mcron schedule for the periodic 'guix locate --update' job: once + ;; every Monday. + "10 23 * * 1") + +(define-configuration/no-serialization package-database-configuration + (package (file-like guix) + "The Guix package to use.") + (schedule (string-or-gexp + %default-package-database-update-schedule) + "String or G-exp denoting an mcron schedule for the periodic +@command{guix locate --update} job (@pxref{Guile Syntax,,, mcron, +GNU@tie{}mcron}).") + (method (symbol 'store) + "Indexing method for @command{guix locate}. The default value, +@code{'store}, yields a more complete database but is relatively expensive in +terms of CPU and input/output.") + (channels (gexp #~%default-channels) + "G-exp denoting the channels to use when updating the database +(@pxref{Channels}).")) + +(define (package-database-mcron-jobs configuration) + (match-record configuration <package-database-configuration> + (package schedule method channels) + (let ((channels (scheme-file "channels.scm" channels))) + (list #~(job #$schedule + ;; XXX: The whole thing's running as "root" just because it + ;; needs write access to /var/cache/guix/locate. + (string-append #$(file-append package "/bin/guix") + " time-machine -C " #$channels + " -- locate --update --method=" + #$(symbol->string method))))))) + +(define package-database-service-type + (service-type + (name 'package-database) + (extensions (list (service-extension mcron-service-type + package-database-mcron-jobs))) + (description + "Periodically update the package database used by the @code{guix locate} command, +which lets you search for packages that provide a given file.") + (default-value (package-database-configuration)))) + \f ;;; ;;; Unattended upgrade. -- 2.41.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [bug#64471] [PATCH 0/2] File database update services 2023-07-17 20:22 ` [bug#64471] [PATCH 0/2] File database update services Ludovic Courtès 2023-07-20 21:22 ` [bug#64471] [PATCH v2 1/2] services: Add 'file-database' service Ludovic Courtès 2023-07-20 21:22 ` [bug#64471] [PATCH v2 2/2] services: Add 'package-database' service Ludovic Courtès @ 2023-07-26 13:22 ` Bruno Victal 2 siblings, 0 replies; 10+ messages in thread From: Bruno Victal @ 2023-07-26 13:22 UTC (permalink / raw) To: Ludovic Courtès; +Cc: 64471 Hi Ludo’, On 2023-07-17 21:22, Ludovic Courtès wrote: > Bruno Victal <mirai@makinata.eu> skribis: > >> >> I'm afraid #$schedule might be insufficient if this is a _mcron_ time-spec. >> There's an elaborate dance done by fstrim-service-type to handle the more exotic >> mcron time expressions, perhaps you can reuse it here? > > I’m not sure what fstrim-service-type is trying to achieve with this: > > #~(job > ;; Note: The “if” below is to ensure that > ;; lists are ungexp'd correctly since @var{schedule} > ;; can be either a procedure, a string or a list. > #$(if (list? schedule) > #~'(#$@schedule) > schedule) > …") > > If we simply have: > > #~(job #$schedule …) > > then ‘schedule’ can be anything you might expect, like: > > • "0 * * * *" ;string > > • #~(next-hour …) ;gexp > > • #~(lambda (x) …) ;another gexp > > What’s the problem? :-) There's a third choice for that argument: a staged expression/list, hence the gexp/ungexp dance. [1]: <https://www.gnu.org/software/mcron/manual/mcron.html#Guile-Syntax> [2]: <https://www.gnu.org/software/mcron/manual/mcron.html#Extended-Guile-examples> -- Furthermore, I consider that nonfree software must be eradicated. Cheers, Bruno. ^ permalink raw reply [flat|nested] 10+ messages in thread
* [bug#64471] [PATCH 2/2] services: Add 'package-database' service. 2023-07-05 9:59 [bug#64471] [PATCH 0/2] File database update services Ludovic Courtès 2023-07-05 10:16 ` [bug#64471] [PATCH 1/2] services: Add 'file-database' service Ludovic Courtès @ 2023-07-05 10:16 ` Ludovic Courtès 2023-08-07 14:39 ` bug#64471: [PATCH 0/2] File database update services Ludovic Courtès 2 siblings, 0 replies; 10+ messages in thread From: Ludovic Courtès @ 2023-07-05 10:16 UTC (permalink / raw) To: 64471; +Cc: Ludovic Courtès * gnu/services/admin.scm (%default-package-database-update-schedule): New variable. (<package-database-configuration>): New record type. (package-database-mcron-jobs): New procedure. (package-database-service-type): New variable. * doc/guix.texi (File Search Services): Document it. --- doc/guix.texi | 49 +++++++++++++++++++++++++++++++++++++++++- gnu/services/admin.scm | 49 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 1 deletion(-) diff --git a/doc/guix.texi b/doc/guix.texi index 21ff15ccbc..05cfdb9bc7 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -4481,7 +4481,9 @@ Invoking guix locate exist or is too old, it falls back to the per-user database, by default under @file{~/.cache/guix/locate}. On a multi-user system, administrators may want to periodically update the system-wide database -so that all users can benefit from it. +so that all users can benefit from it, for instance by setting up +@code{package-database-service-type} (@pxref{File Search Services, +@code{package-database-service-type}}). The general syntax is: @@ -24986,6 +24988,51 @@ File Search Services @end table @end deftp +The second service, @code{package-database-service-type}, builds the +database used by @command{guix locate}, which lets you search for +packages that contain a given file (@pxref{Invoking guix locate}). The +service periodically updates a system-wide database, which will be +readily available to anyone running @command{guix locate} on the system. +To use this service with its default settings, add this snippet to your +service list: + +@lisp +(service package-database-service-type) +@end lisp + +This will run @command{guix locate --update} once a week. + +@defvar package-database-service-type +This is the service type for periodic @command{guix locate} updates +(@pxref{Invoking guix locate}). Its value must be a +@code{package-database-configuration} record, as shown below. +@end defvar + +@deftp {Data Type} package-database-configuration +Data type to configure periodic package database updates. It has the +following fields: + +@table @asis +@item @code{package} (default: @code{guix}) +The Guix package to use. + +@item @code{schedule} (default: @code{%default-package-database-update-schedule}) +String or G-exp denoting an mcron schedule for the periodic +@command{guix locate --update} job (@pxref{Guile Syntax,,, mcron, +GNU@tie{}mcron}). + +@item @code{method} (default: @code{'store}) +Indexing method for @command{guix locate}. The default value, +@code{'store}, yields a more complete database but is relatively +expensive in terms of CPU and input/output. + +@item @code{channels} (default: @code{#~%default-channels}) +G-exp denoting the channels to use when updating the database +(@pxref{Channels}). +@end table +@end deftp + + @node Database Services @subsection Database Services diff --git a/gnu/services/admin.scm b/gnu/services/admin.scm index 57fdfc35c0..f16880029f 100644 --- a/gnu/services/admin.scm +++ b/gnu/services/admin.scm @@ -28,6 +28,8 @@ (define-module (gnu services admin) #:use-module (gnu services) #:use-module (gnu services mcron) #:use-module (gnu services shepherd) + #:use-module (gnu system accounts) + #:use-module ((gnu system shadow) #:select (account-service-type)) #:use-module ((guix store) #:select (%store-prefix)) #:use-module (guix gexp) #:use-module (guix modules) @@ -67,6 +69,14 @@ (define-module (gnu services admin) %default-file-database-update-schedule %default-file-database-excluded-directories + package-database-service-type + package-database-configuration + package-database-configuration? + package-database-configuration-package + package-database-configuration-schedule + package-database-configuration-method + package-database-configuration-channels + unattended-upgrade-service-type unattended-upgrade-configuration unattended-upgrade-configuration? @@ -322,6 +332,45 @@ (define file-database-service-type the @command{updatedb} command.") (default-value (file-database-configuration)))) +(define %default-package-database-update-schedule + ;; Default mcron schedule for the periodic 'guix locate --update' job: once + ;; every Monday. + "10 23 * * 1") + +(define-record-type* <package-database-configuration> + package-database-configuration make-package-database-configuration + package-database-configuration? + (package package-database-configuration-package + (default guix)) + (schedule package-database-configuration-schedule + (default %default-package-database-update-schedule)) + (method package-database-configuration-method + (default 'store)) + (channels package-database-configuration-channels + (default #~%default-channels))) + +(define (package-database-mcron-jobs configuration) + (match-record configuration <package-database-configuration> + (package schedule method channels) + (let ((channels (scheme-file "channels.scm" channels))) + (list #~(job #$schedule + ;; XXX: The whole thing's running as "root" just because it + ;; needs write access to /var/cache/guix/locate. + (string-append #$(file-append package "/bin/guix") + " time-machine -C " #$channels + " -- locate --update --method=" + #$(symbol->string method))))))) + +(define package-database-service-type + (service-type + (name 'package-database) + (extensions (list (service-extension mcron-service-type + package-database-mcron-jobs))) + (description + "Periodically update the package database used by the @code{guix locate} command, +which lets you search for packages that provide a given file.") + (default-value (package-database-configuration)))) + \f ;;; ;;; Unattended upgrade. -- 2.40.1 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* bug#64471: [PATCH 0/2] File database update services 2023-07-05 9:59 [bug#64471] [PATCH 0/2] File database update services Ludovic Courtès 2023-07-05 10:16 ` [bug#64471] [PATCH 1/2] services: Add 'file-database' service Ludovic Courtès 2023-07-05 10:16 ` [bug#64471] [PATCH 2/2] services: Add 'package-database' service Ludovic Courtès @ 2023-08-07 14:39 ` Ludovic Courtès 2 siblings, 0 replies; 10+ messages in thread From: Ludovic Courtès @ 2023-08-07 14:39 UTC (permalink / raw) To: 64471-done; +Cc: Bruno Victal Ludovic Courtès <ludo@gnu.org> skribis: > services: Add 'file-database' service. > services: Add 'package-database' service. Pushed as b3a2b3e7238161ebd86c7609f68e8f1e9c1dd6b7! Ludo’. ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2023-08-07 14:40 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-07-05 9:59 [bug#64471] [PATCH 0/2] File database update services Ludovic Courtès 2023-07-05 10:16 ` [bug#64471] [PATCH 1/2] services: Add 'file-database' service Ludovic Courtès 2023-07-13 18:00 ` Bruno Victal 2023-07-17 20:22 ` [bug#64471] [PATCH 0/2] File database update services Ludovic Courtès 2023-07-20 21:22 ` [bug#64471] [PATCH v2 1/2] services: Add 'file-database' service Ludovic Courtès 2023-07-26 13:28 ` Bruno Victal 2023-07-20 21:22 ` [bug#64471] [PATCH v2 2/2] services: Add 'package-database' service Ludovic Courtès 2023-07-26 13:22 ` [bug#64471] [PATCH 0/2] File database update services Bruno Victal 2023-07-05 10:16 ` [bug#64471] [PATCH 2/2] services: Add 'package-database' service Ludovic Courtès 2023-08-07 14:39 ` bug#64471: [PATCH 0/2] File database update services Ludovic Courtès
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/guix.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).