services: Add 'file-database' service.

* 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.
This commit is contained in:
Ludovic Courtès 2023-07-05 10:19:15 +02:00
parent 56667ee55c
commit e63c87020d
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
2 changed files with 145 additions and 0 deletions

View file

@ -388,6 +388,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.
@ -18428,6 +18429,7 @@ declaration.
* 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 @@ details.
@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

View file

@ -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@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))))
;;;
;;; Unattended upgrade.