Package: guix-patches;
Reported by: Ludovic Courtès <ludo <at> gnu.org>
Date: Wed, 5 Jul 2023 10:01:02 UTC
Severity: normal
Tags: patch
Done: Ludovic Courtès <ludo <at> gnu.org>
Bug is archived. No further changes may be made.
View this message in rfc822 format
From: Ludovic Courtès <ludo <at> gnu.org> To: 64471 <at> debbugs.gnu.org Cc: Ludovic Courtès <ludo <at> gnu.org>, Bruno Victal <mirai <at> makinata.eu> Subject: [bug#64471] [PATCH v2 1/2] services: Add 'file-database' service. Date: Thu, 20 Jul 2023 23:22:27 +0200
* 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 <at> 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 <at> 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 <at> 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."))) + +;;; +;;; 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 <at> 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 <at> 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 <at> 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)))) + ;;; ;;; Unattended upgrade. base-commit: 283969d0c527aa41e65bb4f5c2a7fa3baf86c49a -- 2.41.0
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.