services: Add 'package-database' service.

* 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.
This commit is contained in:
Ludovic Courtès 2023-07-05 11:49:34 +02:00
parent e63c87020d
commit b3a2b3e723
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
2 changed files with 101 additions and 1 deletions

View file

@ -4481,7 +4481,9 @@ database, usually under @file{/var/cache/guix/locate}; if it does not
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 @@ GNU@tie{}Findutils}).
@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

View file

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