[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[bug#64471] [PATCH 2/2] services: Add 'package-database' service.
From: |
Ludovic Courtès |
Subject: |
[bug#64471] [PATCH 2/2] services: Add 'package-database' service. |
Date: |
Wed, 5 Jul 2023 12:16:36 +0200 |
* 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))))
+
;;;
;;; Unattended upgrade.
--
2.40.1
[bug#64471] [PATCH 2/2] services: Add 'package-database' service.,
Ludovic Courtès <=