Rebase to libguestfs 1.54.0

resolves: RHEL-56809
This commit is contained in:
Richard W.M. Jones 2024-10-09 09:59:05 +01:00
parent 6b578e0d34
commit f62fa9f195
42 changed files with 229 additions and 4337 deletions

View File

@ -1,63 +0,0 @@
From d2e6dce96a9f197b688758f90481407e75ae11d2 Mon Sep 17 00:00:00 2001
From: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
Date: Wed, 26 Apr 2023 15:59:44 +0300
Subject: [PATCH] daemon/selinux-relabel: don't exclude "/selinux" if it's
non-existent
Since RHBZ#726528, filesystem.rpm doesn't include /selinux. setfiles
then gives us the warning: "Can't stat exclude path "/sysroot/selinux",
No such file or directory - ignoring."
Though the warning is harmless, let's get rid of it by checking the
existence of /selinux directory.
Signed-off-by: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
(cherry picked from commit 9ced5fac8c1f0f8ff7ed2b5671c1c7f5f0bfa875)
---
daemon/selinux-relabel.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/daemon/selinux-relabel.c b/daemon/selinux-relabel.c
index 976cffe3..454486c1 100644
--- a/daemon/selinux-relabel.c
+++ b/daemon/selinux-relabel.c
@@ -21,6 +21,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/stat.h>
#include "guestfs_protocol.h"
#include "daemon.h"
@@ -37,6 +38,17 @@ optgroup_selinuxrelabel_available (void)
return prog_exists ("setfiles");
}
+static int
+dir_exists (const char *dir)
+{
+ struct stat statbuf;
+
+ if (stat (dir, &statbuf) == 0 && S_ISDIR (statbuf.st_mode))
+ return 1;
+ else
+ return 0;
+}
+
static int
setfiles_has_option (int *flag, char opt_char)
{
@@ -99,8 +111,10 @@ do_selinux_relabel (const char *specfile, const char *path,
*/
ADD_ARG (argv, i, "-e"); ADD_ARG (argv, i, s_dev);
ADD_ARG (argv, i, "-e"); ADD_ARG (argv, i, s_proc);
- ADD_ARG (argv, i, "-e"); ADD_ARG (argv, i, s_selinux);
ADD_ARG (argv, i, "-e"); ADD_ARG (argv, i, s_sys);
+ if (dir_exists (s_selinux)) {
+ ADD_ARG (argv, i, "-e"); ADD_ARG (argv, i, s_selinux);
+ }
/* You have to use the -m option (where available) otherwise
* setfiles puts all the mountpoints on the excludes list for no

View File

@ -0,0 +1,25 @@
From 0edaea8f91bf08025651eeff32f53b9335003842 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 8 Oct 2024 14:53:38 +0100
Subject: [PATCH] website: Add links for 1.54 and 1.55 download locations
---
website/index.html.in | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/website/index.html.in b/website/index.html.in
index a61fca92..2a0d3221 100644
--- a/website/index.html.in
+++ b/website/index.html.in
@@ -186,9 +186,10 @@ git clone <a href="https://github.com/libguestfs/libguestfs">https://github.com/
LATEST-URL: http://libguestfs.org/download/1.53-development/libguestfs-@PACKAGE_VERSION@.tar.gz
LATEST-VERSION: @PACKAGE_VERSION@
-->
- <a href="download/1.53-development/">Latest development version: <strong>@PACKAGE_VERSION@</strong></a> (released <strong>@RELEASE_DATE@</strong>).<br/>
+ <a href="download/1.55-development/">Latest development version: <strong>@PACKAGE_VERSION@</strong></a> (released <strong>@RELEASE_DATE@</strong>).<br/>
Stable branch:
<strong>
+ <a href="download/1.54-stable/">1.54.x</a>,
<a href="download/1.52-stable/">1.52.x</a>,
<a href="download/1.50-stable/">1.50.x</a>,
<a href="download/1.48-stable/">1.48.x</a>

View File

@ -1,4 +1,4 @@
From 66b9338e3d786db28fbd853d397741c3ceb19352 Mon Sep 17 00:00:00 2001
From 88b210d09addca52663b1723d1c24754277215ee Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 29 Jul 2013 14:47:56 +0100
Subject: [PATCH] RHEL: Disable unsupported remote drive protocols
@ -10,28 +10,23 @@ This disables support for unsupported remote drive protocols:
* ftps
* http
* https
* tftp
* gluster
* iscsi
* sheepdog
* ssh
Note 'nbd' is not disabled, and of course 'file' works.
We hope to gradually add some of these back over the lifetime of RHEL.
---
docs/guestfs-testing.pod | 20 -----
fish/guestfish.pod | 66 ++--------------
fish/test-add-uri.sh | 32 --------
generator/actions_core.ml | 50 +------------
lib/drives.c | 8 ++
lib/guestfs.pod | 100 -------------------------
tests/disks/test-qemu-drive-libvirt.sh | 28 -------
tests/disks/test-qemu-drive.sh | 60 ---------------
8 files changed, 16 insertions(+), 348 deletions(-)
fish/guestfish.pod | 42 ++-------
fish/test-add-uri.sh | 21 -----
generator/actions_core.ml | 34 +-------
lib/drives.c | 113 -------------------------
lib/guestfs.pod | 67 ---------------
tests/disks/test-qemu-drive-libvirt.sh | 7 --
tests/disks/test-qemu-drive.sh | 40 ---------
8 files changed, 8 insertions(+), 336 deletions(-)
diff --git a/docs/guestfs-testing.pod b/docs/guestfs-testing.pod
index 47f381a7..c7b44928 100644
index f5c09df6..ee4b26d6 100644
--- a/docs/guestfs-testing.pod
+++ b/docs/guestfs-testing.pod
@@ -109,26 +109,6 @@ image. To exit, type C<exit>.
@ -62,7 +57,7 @@ index 47f381a7..c7b44928 100644
Run L<virt-alignment-scan(1)> on guests or disk images:
diff --git a/fish/guestfish.pod b/fish/guestfish.pod
index ccc0825b..d36cac9d 100644
index da47c86d..33fc8b2c 100644
--- a/fish/guestfish.pod
+++ b/fish/guestfish.pod
@@ -131,9 +131,9 @@ To list what is available do:
@ -92,7 +87,7 @@ index ccc0825b..d36cac9d 100644
The possible I<-a URI> formats are described below.
@@ -1144,40 +1144,6 @@ The possible I<-a URI> formats are described below.
@@ -1144,28 +1144,6 @@ The possible I<-a URI> formats are described below.
Add the local disk image (or device) called F<disk.img>.
@ -104,24 +99,12 @@ index ccc0825b..d36cac9d 100644
-
-=head2 B<-a https://[user@]example.com[:port]/disk.img>
-
-=head2 B<-a tftp://[user@]example.com[:port]/disk.img>
-
-Add a disk located on a remote FTP, HTTP or TFTP server.
-Add a disk located on a remote FTP or HTTP server.
-
-The equivalent API command would be:
-
- ><fs> add /disk.img protocol:(ftp|...) server:tcp:example.com
-
-=head2 B<-a gluster://example.com[:port]/volname/image>
-
-Add a disk image located on GlusterFS storage.
-
-The server is the one running C<glusterd>, and may be C<localhost>.
-
-The equivalent API command would be:
-
- ><fs> add volname/image protocol:gluster server:tcp:example.com
-
-=head2 B<-a iscsi://example.com[:port]/target-iqn-name[/lun]>
-
-Add a disk located on an iSCSI server.
@ -133,22 +116,10 @@ index ccc0825b..d36cac9d 100644
=head2 B<-a nbd://example.com[:port]>
=head2 B<-a nbd://example.com[:port]/exportname>
@@ -1212,35 +1178,13 @@ The equivalent API command would be:
@@ -1200,23 +1178,13 @@ The equivalent API command would be:
><fs> add pool/disk protocol:rbd server:tcp:example.com:port
-=head2 B<-a sheepdog://[example.com[:port]]/volume/image>
-
-Add a disk image located on a Sheepdog volume.
-
-The server name is optional. Although libguestfs and Sheepdog
-supports multiple servers, only at most one server can be specified
-when using this URI syntax.
-
-The equivalent API command would be:
-
- ><fs> add volume protocol:sheepdog [server:tcp:example.com]
-
-=head2 B<-a ssh://[user@]example.com[:port]/disk.img>
-
-Add a disk image located on a remote server, accessed using the Secure
@ -171,35 +142,24 @@ index ccc0825b..d36cac9d 100644
In this case, the password is C<pass@word>.
diff --git a/fish/test-add-uri.sh b/fish/test-add-uri.sh
index 21d42498..ddabeb63 100755
index 533a3ce0..ddabeb63 100755
--- a/fish/test-add-uri.sh
+++ b/fish/test-add-uri.sh
@@ -40,14 +40,6 @@ function fail ()
@@ -40,10 +40,6 @@ function fail ()
$VG guestfish -x -a file://$abs_builddir/test-add-uri.img </dev/null >test-add-uri.out 2>&1
grep -sq 'add_drive ".*/test-add-uri.img"' test-add-uri.out || fail
-# curl
-$VG guestfish -x -a ftp://user@example.com/disk.img </dev/null >test-add-uri.out 2>&1
-grep -sq 'add_drive "/disk.img" "protocol:ftp" "server:tcp:example.com" "username:user"' test-add-uri.out || fail
-
-# gluster
-$VG guestfish -x -a gluster://example.com/disk </dev/null >test-add-uri.out 2>&1
-grep -sq 'add_drive "disk" "protocol:gluster" "server:tcp:example.com"' test-add-uri.out || fail
-
# NBD
$VG guestfish -x -a nbd://example.com </dev/null >test-add-uri.out 2>&1
grep -sq 'add_drive "" "protocol:nbd" "server:tcp:example.com"' test-add-uri.out || fail
@@ -67,29 +59,5 @@ grep -sq 'add_drive "pool/disk" "protocol:rbd" "server:tcp:example.com:6789"' te
@@ -63,22 +59,5 @@ grep -sq 'add_drive "pool/disk" "protocol:rbd" "server:tcp:example.com:6789"' te
$VG guestfish -x -a rbd:///pool/disk </dev/null >test-add-uri.out 2>&1
grep -sq 'add_drive "pool/disk" "protocol:rbd"' test-add-uri.out || fail
-# sheepdog
-$VG guestfish -x -a sheepdog:///volume/image </dev/null >test-add-uri.out 2>&1
-grep -sq 'add_drive "volume/image" "protocol:sheepdog"' test-add-uri.out || fail
-
-$VG guestfish -x -a sheepdog://example.com:3000/volume/image </dev/null >test-add-uri.out 2>&1
-grep -sq 'add_drive "volume/image" "protocol:sheepdog" "server:tcp:example.com:3000"' test-add-uri.out || fail
-
-# ssh
-$VG guestfish -x -a ssh://example.com/disk.img </dev/null >test-add-uri.out 2>&1
-grep -sq 'add_drive "/disk.img" "protocol:ssh" "server:tcp:example.com"' test-add-uri.out || fail
@ -220,26 +180,19 @@ index 21d42498..ddabeb63 100755
rm test-add-uri.out
rm test-add-uri.img
diff --git a/generator/actions_core.ml b/generator/actions_core.ml
index bfb43a19..314bb0ae 100644
index 20f6e843..768f5843 100644
--- a/generator/actions_core.ml
+++ b/generator/actions_core.ml
@@ -350,29 +350,6 @@ F<filename> is interpreted as a local file or device.
@@ -350,22 +350,6 @@ F<filename> is interpreted as a local file or device.
This is the default if the optional protocol parameter
is omitted.
-=item C<protocol = \"ftp\"|\"ftps\"|\"http\"|\"https\"|\"tftp\">
-=item C<protocol = \"ftp\"|\"ftps\"|\"http\"|\"https\">
-
-Connect to a remote FTP, HTTP or TFTP server.
-Connect to a remote FTP or HTTP server.
-The C<server> parameter must also be supplied - see below.
-
-See also: L<guestfs(3)/FTP, HTTP AND TFTP>
-
-=item C<protocol = \"gluster\">
-
-Connect to the GlusterFS server.
-The C<server> parameter must also be supplied - see below.
-
-See also: L<guestfs(3)/GLUSTER>
-See also: L<guestfs(3)/FTP AND HTTP>
-
-=item C<protocol = \"iscsi\">
-
@ -253,17 +206,10 @@ index bfb43a19..314bb0ae 100644
=item C<protocol = \"nbd\">
Connect to the Network Block Device server.
@@ -389,22 +366,6 @@ The C<secret> parameter may be supplied. See below.
@@ -382,15 +366,6 @@ The C<secret> parameter may be supplied. See below.
See also: L<guestfs(3)/CEPH>.
-=item C<protocol = \"sheepdog\">
-
-Connect to the Sheepdog server.
-The C<server> parameter may also be supplied - see below.
-
-See also: L<guestfs(3)/SHEEPDOG>.
-
-=item C<protocol = \"ssh\">
-
-Connect to the Secure Shell (ssh) server.
@ -276,26 +222,24 @@ index bfb43a19..314bb0ae 100644
=back
=item C<server>
@@ -415,13 +376,8 @@ is a list of server(s).
@@ -401,11 +376,8 @@ is a list of server(s).
Protocol Number of servers required
-------- --------------------------
file List must be empty or param not used at all
- ftp|ftps|http|https|tftp Exactly one
- gluster Exactly one
- ftp|ftps|http|https Exactly one
- iscsi Exactly one
nbd Exactly one
rbd Zero or more
- sheepdog Zero or more
- ssh Exactly one
Each list element is a string specifying a server. The string must be
in one of the following formats:
@@ -437,10 +393,10 @@ for the protocol is used (see F</etc/services>).
@@ -421,10 +393,10 @@ for the protocol is used (see F</etc/services>).
=item C<username>
-For the C<ftp>, C<ftps>, C<http>, C<https>, C<iscsi>, C<rbd>, C<ssh>
-and C<tftp> protocols, this specifies the remote username.
-For the C<ftp>, C<ftps>, C<http>, C<https>, C<iscsi>, C<rbd> and C<ssh>
-protocols, this specifies the remote username.
+For the C<rbd>
+protocol, this specifies the remote username.
@ -305,85 +249,162 @@ index bfb43a19..314bb0ae 100644
example if using the libvirt backend and if the libvirt backend is configured to
start the qemu appliance as a special user such as C<qemu.qemu>. If in doubt,
diff --git a/lib/drives.c b/lib/drives.c
index c5a20846..efb28925 100644
index c068b8ec..6e4453ce 100644
--- a/lib/drives.c
+++ b/lib/drives.c
@@ -166,6 +166,7 @@ create_drive_non_file (guestfs_h *g,
@@ -166,34 +166,6 @@ create_drive_non_file (guestfs_h *g,
return drv;
}
+#if 0 /* DISABLED IN RHEL 8 */
static struct drive *
create_drive_curl (guestfs_h *g,
const struct drive_create_data *data)
@@ -224,6 +225,7 @@ create_drive_gluster (guestfs_h *g,
return create_drive_non_file (g, data);
}
+#endif /* DISABLED IN RHEL 8 */
-static struct drive *
-create_drive_curl (guestfs_h *g,
- const struct drive_create_data *data)
-{
- if (data->nr_servers != 1) {
- error (g, _("curl: you must specify exactly one server"));
- return NULL;
- }
-
- if (data->servers[0].transport != drive_transport_none &&
- data->servers[0].transport != drive_transport_tcp) {
- error (g, _("curl: only tcp transport is supported"));
- return NULL;
- }
-
- if (STREQ (data->exportname, "")) {
- error (g, _("curl: pathname should not be an empty string"));
- return NULL;
- }
-
- if (data->exportname[0] != '/') {
- error (g, _("curl: pathname must begin with a '/'"));
- return NULL;
- }
-
- return create_drive_non_file (g, data);
-}
-
static int
nbd_port (void)
@@ -292,6 +294,7 @@ create_drive_rbd (guestfs_h *g,
{
@@ -261,67 +233,6 @@ create_drive_rbd (guestfs_h *g,
return create_drive_non_file (g, data);
}
+#if 0 /* DISABLED IN RHEL 8 */
static struct drive *
create_drive_sheepdog (guestfs_h *g,
const struct drive_create_data *data)
@@ -392,6 +395,7 @@ create_drive_iscsi (guestfs_h *g,
return create_drive_non_file (g, data);
}
+#endif /* DISABLED IN RHEL 8 */
-static struct drive *
-create_drive_ssh (guestfs_h *g,
- const struct drive_create_data *data)
-{
- if (data->nr_servers != 1) {
- error (g, _("ssh: you must specify exactly one server"));
- return NULL;
- }
-
- if (data->servers[0].transport != drive_transport_none &&
- data->servers[0].transport != drive_transport_tcp) {
- error (g, _("ssh: only tcp transport is supported"));
- return NULL;
- }
-
- if (STREQ (data->exportname, "")) {
- error (g, _("ssh: pathname should not be an empty string"));
- return NULL;
- }
-
- if (data->exportname[0] != '/') {
- error (g, _("ssh: pathname must begin with a '/'"));
- return NULL;
- }
-
- if (data->username && STREQ (data->username, "")) {
- error (g, _("ssh: username should not be an empty string"));
- return NULL;
- }
-
- return create_drive_non_file (g, data);
-}
-
-static struct drive *
-create_drive_iscsi (guestfs_h *g,
- const struct drive_create_data *data)
-{
- if (data->nr_servers != 1) {
- error (g, _("iscsi: you must specify exactly one server"));
- return NULL;
- }
-
- if (data->servers[0].transport != drive_transport_none &&
- data->servers[0].transport != drive_transport_tcp) {
- error (g, _("iscsi: only tcp transport is supported"));
- return NULL;
- }
-
- if (STREQ (data->exportname, "")) {
- error (g, _("iscsi: target name should not be an empty string"));
- return NULL;
- }
-
- if (data->exportname[0] == '/') {
- error (g, _("iscsi: target string must not begin with a '/'"));
- return NULL;
- }
-
- return create_drive_non_file (g, data);
-}
-
/**
* Create the special F</dev/null> drive.
@@ -842,6 +846,7 @@ guestfs_impl_add_drive_opts (guestfs_h *g, const char *filename,
*
@@ -768,26 +679,6 @@ guestfs_impl_add_drive_opts (guestfs_h *g, const char *filename,
drv = create_drive_file (g, &data);
}
}
+#if 0 /* DISABLED IN RHEL 8 */
else if (STREQ (protocol, "ftp")) {
data.protocol = drive_protocol_ftp;
drv = create_drive_curl (g, &data);
@@ -866,6 +871,7 @@ guestfs_impl_add_drive_opts (guestfs_h *g, const char *filename,
data.protocol = drive_protocol_iscsi;
drv = create_drive_iscsi (g, &data);
}
+#endif /* DISABLED IN RHEL 8 */
- else if (STREQ (protocol, "ftp")) {
- data.protocol = drive_protocol_ftp;
- drv = create_drive_curl (g, &data);
- }
- else if (STREQ (protocol, "ftps")) {
- data.protocol = drive_protocol_ftps;
- drv = create_drive_curl (g, &data);
- }
- else if (STREQ (protocol, "http")) {
- data.protocol = drive_protocol_http;
- drv = create_drive_curl (g, &data);
- }
- else if (STREQ (protocol, "https")) {
- data.protocol = drive_protocol_https;
- drv = create_drive_curl (g, &data);
- }
- else if (STREQ (protocol, "iscsi")) {
- data.protocol = drive_protocol_iscsi;
- drv = create_drive_iscsi (g, &data);
- }
else if (STREQ (protocol, "nbd")) {
data.protocol = drive_protocol_nbd;
drv = create_drive_nbd (g, &data);
@@ -874,6 +880,7 @@ guestfs_impl_add_drive_opts (guestfs_h *g, const char *filename,
@@ -796,10 +687,6 @@ guestfs_impl_add_drive_opts (guestfs_h *g, const char *filename,
data.protocol = drive_protocol_rbd;
drv = create_drive_rbd (g, &data);
}
+#if 0 /* DISABLED IN RHEL 8 */
else if (STREQ (protocol, "sheepdog")) {
data.protocol = drive_protocol_sheepdog;
drv = create_drive_sheepdog (g, &data);
@@ -886,6 +893,7 @@ guestfs_impl_add_drive_opts (guestfs_h *g, const char *filename,
data.protocol = drive_protocol_tftp;
drv = create_drive_curl (g, &data);
}
+#endif /* DISABLED IN RHEL 8 */
- else if (STREQ (protocol, "ssh")) {
- data.protocol = drive_protocol_ssh;
- drv = create_drive_ssh (g, &data);
- }
else {
error (g, _("unknown protocol %s"), protocol);
drv = NULL; /*FALLTHROUGH*/
diff --git a/lib/guestfs.pod b/lib/guestfs.pod
index c6c8cb16..866a4638 100644
index ecab0e1f..dff32cc9 100644
--- a/lib/guestfs.pod
+++ b/lib/guestfs.pod
@@ -723,70 +723,6 @@ a qcow2 backing file specification, libvirt does not construct an
@@ -723,51 +723,6 @@ a qcow2 backing file specification, libvirt does not construct an
ephemeral secret object from those, for Ceph authentication. Refer to
L<https://bugzilla.redhat.com/2033247>.
-=head3 FTP, HTTP AND TFTP
-=head3 FTP AND HTTP
-
-Libguestfs can access remote disks over FTP, FTPS, HTTP, HTTPS
-or TFTP protocols.
-Libguestfs can access remote disks over FTP, FTPS, HTTP or HTTPS
-protocols.
-
-To do this, set the optional C<protocol> and C<server> parameters of
-L</guestfs_add_drive_opts> like this:
@ -396,35 +417,16 @@ index c6c8cb16..866a4638 100644
- -1);
-
-The C<protocol> can be one of C<"ftp">, C<"ftps">, C<"http">,
-C<"https"> or C<"tftp">.
-or C<"https">.
-
-C<servers> (the C<server> parameter) is a list which must have a
-single element. The single element is a string defining the web,
-FTP or TFTP server. The format of this string is documented in
-single element. The single element is a string defining the web
-or FTP server. The format of this string is documented in
-L</guestfs_add_drive_opts>.
-
-=head3 GLUSTER
-
-Libguestfs can access Gluster disks.
-
-To do this, set the optional C<protocol> and C<server> parameters of
-L</guestfs_add_drive_opts> like this:
-
- char **servers = { "gluster.example.org:24007", NULL };
- guestfs_add_drive_opts (g, "volname/image",
- GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw",
- GUESTFS_ADD_DRIVE_OPTS_PROTOCOL, "gluster",
- GUESTFS_ADD_DRIVE_OPTS_SERVER, servers,
- -1);
-
-C<servers> (the C<server> parameter) is a list which must have a
-single element. The single element is a string defining the Gluster
-server. The format of this string is documented in
-L</guestfs_add_drive_opts>.
-
-Note that gluster usually requires the client process (ie. libguestfs)
-to run as B<root> and will give unfathomable errors if it is not
-(eg. "No data available").
-Glusterfs support was removed in libguestfs 1.54 (2024).
-
-=head3 ISCSI
-
@ -447,27 +449,13 @@ index c6c8cb16..866a4638 100644
=head3 NETWORK BLOCK DEVICE
Libguestfs can access Network Block Device (NBD) disks remotely.
@@ -849,42 +785,6 @@ L<https://bugs.launchpad.net/qemu/+bug/1155677>
@@ -830,28 +785,6 @@ L<https://bugs.launchpad.net/qemu/+bug/1155677>
=back
-=head3 SHEEPDOG
-
-Libguestfs can access Sheepdog disks.
-
-To do this, set the optional C<protocol> and C<server> parameters of
-L</guestfs_add_drive_opts> like this:
-
- char **servers = { /* optional servers ... */ NULL };
- guestfs_add_drive_opts (g, "volume",
- GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw",
- GUESTFS_ADD_DRIVE_OPTS_PROTOCOL, "sheepdog",
- GUESTFS_ADD_DRIVE_OPTS_SERVER, servers,
- -1);
-
-The optional list of C<servers> may be zero or more server addresses
-(C<"hostname:port">). The format of the server strings is documented
-in L</guestfs_add_drive_opts>.
-Sheepdog support was removed in libguestfs 1.54 (2024).
-
-=head3 SSH
-
@ -491,20 +479,13 @@ index c6c8cb16..866a4638 100644
Libguestfs has APIs for inspecting an unknown disk image to find out
diff --git a/tests/disks/test-qemu-drive-libvirt.sh b/tests/disks/test-qemu-drive-libvirt.sh
index d86a1ecd..cf7d2a0c 100755
index afbeddec..93df4be0 100755
--- a/tests/disks/test-qemu-drive-libvirt.sh
+++ b/tests/disks/test-qemu-drive-libvirt.sh
@@ -65,34 +65,6 @@ check_output
@@ -65,13 +65,6 @@ check_output
grep -sq -- '-drive file=rbd:abc-def/ghi-jkl:auth_supported=none,' "$DEBUG_QEMU_FILE" || fail ceph2
rm "$DEBUG_QEMU_FILE"
-# Gluster.
-
-$guestfish -d gluster run ||:
-check_output
-grep -sq -- '-drive file=gluster://1.2.3.4:1234/volname/image,' "$DEBUG_QEMU_FILE" || fail gluster
-rm "$DEBUG_QEMU_FILE"
-
-# iSCSI.
-
-$guestfish -d iscsi run ||:
@ -512,28 +493,14 @@ index d86a1ecd..cf7d2a0c 100755
-grep -sq -- '-drive file=iscsi://1.2.3.4:1234/iqn.2003-01.org.linux-iscsi.fedora' "$DEBUG_QEMU_FILE" || fail iscsi
-rm "$DEBUG_QEMU_FILE"
-
-# NBD.
-
-$guestfish -d nbd run ||:
-check_output
-grep -sq -- '-drive file=nbd:1.2.3.4:1234,' "$DEBUG_QEMU_FILE" || fail nbd
-rm "$DEBUG_QEMU_FILE"
-
-# Sheepdog.
-
-$guestfish -d sheepdog run ||:
-check_output
-grep -sq -- '-drive file=sheepdog:volume,' "$DEBUG_QEMU_FILE" || fail sheepdog
-rm "$DEBUG_QEMU_FILE"
-
# Local, stored in a pool.
# NBD.
$guestfish -d pool1 run ||:
$guestfish -d nbd run ||:
diff --git a/tests/disks/test-qemu-drive.sh b/tests/disks/test-qemu-drive.sh
index 12937fb3..b3e4f990 100755
index 9ee7df38..b3e4f990 100755
--- a/tests/disks/test-qemu-drive.sh
+++ b/tests/disks/test-qemu-drive.sh
@@ -62,45 +62,6 @@ check_output
@@ -62,35 +62,6 @@ check_output
grep -sq -- '-drive file=rbd:abc-def/ghi-jkl:auth_supported=none,' "$DEBUG_QEMU_FILE" || fail
rm "$DEBUG_QEMU_FILE"
@ -547,16 +514,6 @@ index 12937fb3..b3e4f990 100755
-grep -sq -- '-drive file=http://www.example.com/disk.img,' "$DEBUG_QEMU_FILE" || fail
-rm "$DEBUG_QEMU_FILE"
-
-# Gluster.
-
-guestfish <<EOF ||:
- add "volname/image" "format:raw" "protocol:gluster" "server:www.example.com:24007"
- run
-EOF
-check_output
-grep -sq -- '-drive file=gluster://www.example.com:24007/volname/image,' "$DEBUG_QEMU_FILE" || fail
-rm "$DEBUG_QEMU_FILE"
-
-# iSCSI.
-
-guestfish <<EOF ||:
@ -579,21 +536,11 @@ index 12937fb3..b3e4f990 100755
# NBD.
guestfish <<EOF ||:
@@ -118,24 +79,3 @@ EOF
@@ -108,14 +79,3 @@ EOF
check_output
grep -sq -- '-drive file=nbd:unix:/socket,' "$DEBUG_QEMU_FILE" || fail
rm "$DEBUG_QEMU_FILE"
-
-# Sheepdog.
-
-guestfish <<EOF ||:
- add "volume" "format:raw" "protocol:sheepdog"
- run
-EOF
-check_output
-grep -sq -- '-drive file=sheepdog:volume,' "$DEBUG_QEMU_FILE" || fail
-rm "$DEBUG_QEMU_FILE"
-
-# SSH.
-
-guestfish <<EOF ||:

View File

@ -1,33 +0,0 @@
From 917455b15894c6c82bd657e918ceb09cd825c9c4 Mon Sep 17 00:00:00 2001
From: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
Date: Wed, 26 Apr 2023 15:59:45 +0300
Subject: [PATCH] daemon/selinux-relabel: search for "invalid option" in
setfiles output
'X' in the setiles' stderr doesn't necessarily mean that option 'X'
doesn't exist. For instance, when passing '-T' we get: "setfiles:
option requires an argument -- 'T'".
Signed-off-by: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
(cherry picked from commit 152d6e4bdf2dac88856a4ff83cf73451f897d4d4)
---
daemon/selinux-relabel.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/daemon/selinux-relabel.c b/daemon/selinux-relabel.c
index 454486c1..60a6f48a 100644
--- a/daemon/selinux-relabel.c
+++ b/daemon/selinux-relabel.c
@@ -56,8 +56,9 @@ setfiles_has_option (int *flag, char opt_char)
if (*flag == -1) {
char option[] = { '-', opt_char, '\0' }; /* "-X" */
- char err_opt[] = { '\'', opt_char, '\'', '\0'}; /* "'X'" */
+ char err_opt[32]; /* "invalid option -- 'X'" */
+ snprintf(err_opt, sizeof(err_opt), "invalid option -- '%c'", opt_char);
ignore_value (command (NULL, &err, "setfiles", option, NULL));
*flag = err && strstr (err, /* "invalid option -- " */ err_opt) == NULL;
}

View File

@ -1,4 +1,4 @@
From b875668bfa9f596aba2e84999c7c9921f8dcb55e Mon Sep 17 00:00:00 2001
From 4e73e1c5c33be8b392ef5a2b93dc3fea7f91ec2a Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 7 Jul 2015 09:28:03 -0400
Subject: [PATCH] RHEL: Reject use of libguestfs-winsupport features except for
@ -13,14 +13,14 @@ edits.
3 files changed, 19 insertions(+)
diff --git a/generator/c.ml b/generator/c.ml
index 447059b8..0391dd3d 100644
index 447059b8..a32d959d 100644
--- a/generator/c.ml
+++ b/generator/c.ml
@@ -1846,6 +1846,22 @@ and generate_client_actions actions () =
check_args_validity c_name style;
trace_call name c_name style;
+ (* RHEL 8 *)
+ (* RHEL *)
+ if name = "mount" || name = "mount_ro" || name = "mount_options" ||
+ name = "mount_vfs" then (
+ pr " if (g->program && !STRPREFIX (g->program, \"virt-\")) {\n";

View File

@ -1,78 +0,0 @@
From d2f8308813da27f422607e5aa21fc95d113a17f0 Mon Sep 17 00:00:00 2001
From: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
Date: Wed, 26 Apr 2023 15:59:46 +0300
Subject: [PATCH] daemon/selinux-relabel: run setfiles with "-T 0", if
supported
Since SELinux userspace v3.4 [1], setfiles command supports "-T nthreads"
option, which allows parallel execution. "-T 0" allows using as many
threads as there're available CPU cores. This might speed up the process
of filesystem relabeling in case the appliance is being run with multiple
vCPUs. The latter is true for at least v2v starting from d2b64ecc67
("v2v: Set the number of vCPUs to same as host number of pCPUs.").
For instance, when running virt-v2v-in-place on my 12-core Xeon host
with SSD, with appliance being run with 8 vCPUs (the upper limit specified
in d2b64ecc67), and on the ~150GiB disk VM (physical size on the host),
I get the following results:
./in-place/virt-v2v-in-place -i libvirt fedora37-vm -v -x
Without this patch:
...
commandrvf: setfiles -F -e /sysroot/dev -e /sysroot/proc -e /sysroot/sys -m -C -r /sysroot -v /sysroot/etc/selinux/targeted/contexts/files/file_contexts /sysroot/^M
libguestfs: trace: v2v: selinux_relabel = 0
libguestfs: trace: v2v: rm_f "/.autorelabel"
guestfsd: => selinux_relabel (0x1d3) took 17.94 secs
...
With this patch:
...
commandrvf: setfiles -F -e /sysroot/dev -e /sysroot/proc -e /sysroot/sys -m -C -T 0 -r /sysroot -v /sysroot/etc/selinux/targeted/contexts/files/file_contexts /sysroot/^M
libguestfs: trace: v2v: selinux_relabel = 0
libguestfs: trace: v2v: rm_f "/.autorelabel"
guestfsd: => selinux_relabel (0x1d3) took 5.88 secs
...
So in my scenario it's getting 3 times faster.
[1] https://github.com/SELinuxProject/selinux/releases/tag/3.4
Signed-off-by: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
(cherry picked from commit d0d8e6738477148a7b752348f9364a3b8faed67f)
---
daemon/selinux-relabel.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/daemon/selinux-relabel.c b/daemon/selinux-relabel.c
index 60a6f48a..cfc5a31d 100644
--- a/daemon/selinux-relabel.c
+++ b/daemon/selinux-relabel.c
@@ -73,6 +73,7 @@ do_selinux_relabel (const char *specfile, const char *path,
{
static int flag_m = -1;
static int flag_C = -1;
+ static int flag_T = -1;
const char *argv[MAX_ARGS];
CLEANUP_FREE char *s_dev = NULL, *s_proc = NULL, *s_selinux = NULL,
*s_sys = NULL, *s_specfile = NULL, *s_path = NULL;
@@ -131,6 +132,17 @@ do_selinux_relabel (const char *specfile, const char *path,
if (setfiles_has_option (&flag_C, 'C'))
ADD_ARG (argv, i, "-C");
+ /* If the appliance is being run with multiple vCPUs, running setfiles
+ * in multithreading mode might speeds up the process. Option "-T" was
+ * introduced in SELinux userspace v3.4, and we need to check whether it's
+ * supported. Passing "-T 0" creates as many threads as there're available
+ * vCPU cores.
+ * https://github.com/SELinuxProject/selinux/releases/tag/3.4
+ */
+ if (setfiles_has_option (&flag_T, 'T')) {
+ ADD_ARG (argv, i, "-T"); ADD_ARG (argv, i, "0");
+ }
+
/* Relabelling in a chroot. */
if (STRNEQ (sysroot, "/")) {
ADD_ARG (argv, i, "-r");

View File

@ -1,63 +0,0 @@
From d4be44928a40e7ca1ef6255fb04d28f2fa7fc6b6 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 7 Feb 2023 13:20:36 +0000
Subject: [PATCH] Remove virt-dib
The tool only supports an older version of the diskimage-builder
metadata, and we do not have the time or inclination to update it to a
newer version.
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1910039
(cherry picked from commit 7503eeebede688409b2adf616d71a94e04b7f0d2)
---
appliance/packagelist.in | 30 ------------------------------
1 file changed, 30 deletions(-)
diff --git a/appliance/packagelist.in b/appliance/packagelist.in
index 585d52ad..20b08c47 100644
--- a/appliance/packagelist.in
+++ b/appliance/packagelist.in
@@ -110,7 +110,6 @@ ifelse(ARCHLINUX,1,
dnl syslinux has mtools as optional dependency, but in reality it's
dnl a hard one:
mtools
- multipath-tools dnl for kpartx
nilfs-utils
ntfs-3g
ntfs-3g-system-compression
@@ -266,35 +265,6 @@ util-linux-ng
xfsprogs
zerofree
-dnl tools needed by virt-dib
-ifelse(REDHAT,1,
- qemu-img
- which
-)
-ifelse(DEBIAN,1,
- qemu-utils
-)
-ifelse(ARCHLINUX,1,
- qemu
- which
-)
-ifelse(SUSE,1,
- qemu-tools
- which
-)
-ifelse(FRUGALWARE,1,
- qemu
- which
-)
-ifelse(MAGEIA,1,
- qemu-img
- which
-)
-curl
-kpartx
-dnl (virt-dib) tools optionally used for elements
-debootstrap
-
dnl exFAT is not usually available in free software repos
exfat-fuse
exfat-utils

View File

@ -1,32 +0,0 @@
From d9ba056079f797483ea99394b265c9bf39769687 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 9 Feb 2023 13:38:50 +0000
Subject: [PATCH] lib: Choose q35 machine type for x86-64
This machine type is more modern than the older 'pc' type and as most
qemu development is now focused there we expect it will perform and
behave better. In almost all respects this change should make no
difference.
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=2168578
Acked-by: Laszlo Ersek <lersek@redhat.com>
See-also: https://listman.redhat.com/archives/libguestfs/2023-February/030645.html
(cherry picked from commit f0f8e6c5fe0c3f6d5d90534d263bded3a4dc7e8d)
---
lib/guestfs-internal.h | 3 +++
1 file changed, 3 insertions(+)
diff --git a/lib/guestfs-internal.h b/lib/guestfs-internal.h
index 306f2a2e..fb55e026 100644
--- a/lib/guestfs-internal.h
+++ b/lib/guestfs-internal.h
@@ -113,6 +113,9 @@ cleanup_mutex_unlock (pthread_mutex_t **ptr)
#define MAX_WINDOWS_EXPLORER_SIZE (4 * 1000 * 1000)
/* Machine types. */
+#if defined(__x86_64__)
+#define MACHINE_TYPE "q35"
+#endif
#ifdef __arm__
#define MACHINE_TYPE "virt"
#endif

View File

@ -1,97 +0,0 @@
From 826cf6d68e4369de3d160e91b7dad6a894469797 Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Fri, 19 May 2023 16:08:48 +0200
Subject: [PATCH] LUKS-on-LVM inspection test: rename VGs and LVs
In preparation for a subsequent patch, rename "VG" to "Volume-Group", and
"LV<n>" to "Logical-Volume-<n>", in the LUKS-on-LVM inspection test.
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2168506
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20230519140849.310774-3-lersek@redhat.com>
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
(cherry picked from commit 58e26402334a4696fa08730eecc9098fc270ed1c)
---
test-data/phony-guests/make-fedora-img.pl | 30 +++++++++++--------
.../test-key-option-inspect-luks-on-lvm.sh | 16 +++++-----
2 files changed, 25 insertions(+), 21 deletions(-)
diff --git a/test-data/phony-guests/make-fedora-img.pl b/test-data/phony-guests/make-fedora-img.pl
index 4c8e1499..b7dc902e 100755
--- a/test-data/phony-guests/make-fedora-img.pl
+++ b/test-data/phony-guests/make-fedora-img.pl
@@ -224,23 +224,27 @@ EOF
# Create the Volume Group on /dev/sda2.
$g->pvcreate ('/dev/sda2');
- $g->vgcreate ('VG', ['/dev/sda2']);
- $g->lvcreate ('Root', 'VG', 32);
- $g->lvcreate ('LV1', 'VG', 32);
- $g->lvcreate ('LV2', 'VG', 32);
- $g->lvcreate ('LV3', 'VG', 64);
+ $g->vgcreate ('Volume-Group', ['/dev/sda2']);
+ $g->lvcreate ('Root', 'Volume-Group', 32);
+ $g->lvcreate ('Logical-Volume-1', 'Volume-Group', 32);
+ $g->lvcreate ('Logical-Volume-2', 'Volume-Group', 32);
+ $g->lvcreate ('Logical-Volume-3', 'Volume-Group', 64);
# Format each Logical Group as a LUKS device, with a different password.
- $g->luks_format ('/dev/VG/Root', 'FEDORA-Root', 0);
- $g->luks_format ('/dev/VG/LV1', 'FEDORA-LV1', 0);
- $g->luks_format ('/dev/VG/LV2', 'FEDORA-LV2', 0);
- $g->luks_format ('/dev/VG/LV3', 'FEDORA-LV3', 0);
+ $g->luks_format ('/dev/Volume-Group/Root', 'FEDORA-Root', 0);
+ $g->luks_format ('/dev/Volume-Group/Logical-Volume-1', 'FEDORA-LV1', 0);
+ $g->luks_format ('/dev/Volume-Group/Logical-Volume-2', 'FEDORA-LV2', 0);
+ $g->luks_format ('/dev/Volume-Group/Logical-Volume-3', 'FEDORA-LV3', 0);
# Open the LUKS devices. This creates nodes like /dev/mapper/*-luks.
- $g->cryptsetup_open ('/dev/VG/Root', 'FEDORA-Root', 'Root-luks');
- $g->cryptsetup_open ('/dev/VG/LV1', 'FEDORA-LV1', 'LV1-luks');
- $g->cryptsetup_open ('/dev/VG/LV2', 'FEDORA-LV2', 'LV2-luks');
- $g->cryptsetup_open ('/dev/VG/LV3', 'FEDORA-LV3', 'LV3-luks');
+ $g->cryptsetup_open ('/dev/Volume-Group/Root',
+ 'FEDORA-Root', 'Root-luks');
+ $g->cryptsetup_open ('/dev/Volume-Group/Logical-Volume-1',
+ 'FEDORA-LV1', 'LV1-luks');
+ $g->cryptsetup_open ('/dev/Volume-Group/Logical-Volume-2',
+ 'FEDORA-LV2', 'LV2-luks');
+ $g->cryptsetup_open ('/dev/Volume-Group/Logical-Volume-3',
+ 'FEDORA-LV3', 'LV3-luks');
# Phony root filesystem.
$g->mkfs ('ext2', '/dev/mapper/Root-luks', blocksize => 4096, label => 'ROOT');
diff --git a/tests/luks/test-key-option-inspect-luks-on-lvm.sh b/tests/luks/test-key-option-inspect-luks-on-lvm.sh
index 52cd7e98..a8d72b9f 100755
--- a/tests/luks/test-key-option-inspect-luks-on-lvm.sh
+++ b/tests/luks/test-key-option-inspect-luks-on-lvm.sh
@@ -30,10 +30,10 @@ skip_unless_phony_guest fedora-luks-on-lvm.img
# Volume names.
guestfish=(guestfish --listen --ro --inspector
--add ../test-data/phony-guests/fedora-luks-on-lvm.img)
-keys_by_lvname=(--key /dev/VG/Root:key:FEDORA-Root
- --key /dev/VG/LV1:key:FEDORA-LV1
- --key /dev/VG/LV2:key:FEDORA-LV2
- --key /dev/VG/LV3:key:FEDORA-LV3)
+keys_by_lvname=(--key /dev/Volume-Group/Root:key:FEDORA-Root
+ --key /dev/Volume-Group/Logical-Volume-1:key:FEDORA-LV1
+ --key /dev/Volume-Group/Logical-Volume-2:key:FEDORA-LV2
+ --key /dev/Volume-Group/Logical-Volume-3:key:FEDORA-LV3)
# The variable assignment below will fail, and abort the script, if guestfish
# refuses to start up.
@@ -56,10 +56,10 @@ function cleanup_guestfish
trap cleanup_guestfish EXIT
# Get the UUIDs of the LUKS devices.
-uuid_root=$(guestfish --remote -- luks-uuid /dev/VG/Root)
-uuid_lv1=$( guestfish --remote -- luks-uuid /dev/VG/LV1)
-uuid_lv2=$( guestfish --remote -- luks-uuid /dev/VG/LV2)
-uuid_lv3=$( guestfish --remote -- luks-uuid /dev/VG/LV3)
+uuid_root=$(guestfish --remote -- luks-uuid /dev/Volume-Group/Root)
+uuid_lv1=$( guestfish --remote -- luks-uuid /dev/Volume-Group/Logical-Volume-1)
+uuid_lv2=$( guestfish --remote -- luks-uuid /dev/Volume-Group/Logical-Volume-2)
+uuid_lv3=$( guestfish --remote -- luks-uuid /dev/Volume-Group/Logical-Volume-3)
# The actual test.
function check_filesystems

View File

@ -1,46 +0,0 @@
From 56d7564eaa308ef7de44c8b2b5dfc7997140142e Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Fri, 19 May 2023 16:08:49 +0200
Subject: [PATCH] LUKS-on-LVM inspection test: test /dev/mapper/VG-LV
translation
In the LUKS-on-LVM inspection test, call the "check_filesystems" function
yet another time, now with such "--key" options that exercise the recent
"/dev/mapper/VG-LV" -> "/dev/VG/LV" translation (unescaping) from
libguestfs-common.
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2168506
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20230519140849.310774-4-lersek@redhat.com>
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
(cherry picked from commit 32408a9c36165af376f9f42e7d3e158d3da2c76e)
---
.../test-key-option-inspect-luks-on-lvm.sh | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/tests/luks/test-key-option-inspect-luks-on-lvm.sh b/tests/luks/test-key-option-inspect-luks-on-lvm.sh
index a8d72b9f..932862b1 100755
--- a/tests/luks/test-key-option-inspect-luks-on-lvm.sh
+++ b/tests/luks/test-key-option-inspect-luks-on-lvm.sh
@@ -101,3 +101,21 @@ eval "$fish_ref"
# Repeat the test.
check_filesystems
+
+# Exit the current guestfish background process.
+guestfish --remote -- exit
+GUESTFISH_PID=
+
+# Start up another guestfish background process, and specify the keys in
+# /dev/mapper/VG-LV format this time.
+keys_by_mapper_lvname=(
+ --key /dev/mapper/Volume--Group-Root:key:FEDORA-Root
+ --key /dev/mapper/Volume--Group-Logical--Volume--1:key:FEDORA-LV1
+ --key /dev/mapper/Volume--Group-Logical--Volume--2:key:FEDORA-LV2
+ --key /dev/mapper/Volume--Group-Logical--Volume--3:key:FEDORA-LV3
+)
+fish_ref=$("${guestfish[@]}" "${keys_by_mapper_lvname[@]}")
+eval "$fish_ref"
+
+# Repeat the test.
+check_filesystems

View File

@ -1,62 +0,0 @@
From 744a257083ccc30e6b7bae40acc04eb45a59a971 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 22 May 2023 17:15:39 +0100
Subject: [PATCH] fuse: Don't call fclose(NULL) on error paths
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Various errors like this:
In function test_fuse,
inlined from main at test-fuse.c:133:11:
test-fuse.c:274:5: error: argument 1 null where non-null expected [-Werror=nonnull]
274 | fclose (fp);
| ^~~~~~~~~~~
In file included from test-fuse.c:26:
/usr/include/stdio.h: In function main:
/usr/include/stdio.h:183:12: note: in a call to function fclose declared nonnull
183 | extern int fclose (FILE *__stream) __nonnull ((1));
| ^~~~~~
(cherry picked from commit ca20f27cb0898c347e49b543a8acdfb0a8a8fa7e)
---
fuse/test-fuse.c | 4 ----
1 file changed, 4 deletions(-)
diff --git a/fuse/test-fuse.c b/fuse/test-fuse.c
index 9c0db594..90a78dc7 100644
--- a/fuse/test-fuse.c
+++ b/fuse/test-fuse.c
@@ -271,7 +271,6 @@ test_fuse (void)
fp = fopen ("hello.txt", "r");
if (fp == NULL) {
perror ("open: hello.txt");
- fclose (fp);
return -1;
}
if (getline (&line, &len, fp) == -1) {
@@ -289,7 +288,6 @@ test_fuse (void)
fp = fopen ("world.txt", "r");
if (fp == NULL) {
perror ("open: world.txt");
- fclose (fp);
return -1;
}
if (getline (&line, &len, fp) == -1) {
@@ -352,7 +350,6 @@ test_fuse (void)
fp = fopen ("new", "w");
if (fp == NULL) {
perror ("open: new");
- fclose (fp);
return -1;
}
fclose (fp);
@@ -615,7 +612,6 @@ test_fuse (void)
fp = fopen ("new.txt", "w");
if (fp == NULL) {
perror ("open: new.txt");
- fclose (fp);
return -1;
}
for (u = 0; u < 1000; ++u) {

View File

@ -1,38 +0,0 @@
From 8aafa0631b55ec92ba1fae34d94500dd1e027083 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=BCrgen=20H=C3=B6tzel?= <juergen@archlinux.org>
Date: Sat, 27 May 2023 15:32:36 +0200
Subject: [PATCH] ocaml/implicit_close test: collect all currently unreachable
blocks
Fixes failing implice_close test on OCaml 5.
RWMJ:
I adjusted this patch so that we continue to call Gc.compact on
exiting the test, to move all of the heap (hopefully revealing flaws
in the bindings). This only works on OCaml <= 4, but Gc.compact may
be fixed/reimplemented later in the 5.x series.
Please see also the lengthy discussion of this patch upstream:
https://listman.redhat.com/archives/libguestfs/2023-May/thread.html#31639
https://listman.redhat.com/archives/libguestfs/2023-June/thread.html#31709
https://discuss.ocaml.org/t/ocaml-heap-fsck-and-forcing-collection-of-unreachable-objects/12281/1
(cherry picked from commit 1274452d225da71f115e0cb8ad435e02670dc4fb)
---
ocaml/t/guestfs_065_implicit_close.ml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ocaml/t/guestfs_065_implicit_close.ml b/ocaml/t/guestfs_065_implicit_close.ml
index 567e550b..f2dfecbd 100644
--- a/ocaml/t/guestfs_065_implicit_close.ml
+++ b/ocaml/t/guestfs_065_implicit_close.ml
@@ -30,7 +30,7 @@ let () =
*)
(* This should cause the GC to close the handle. *)
-let () = Gc.compact ()
+let () = Gc.full_major ()
let () = assert (!close_invoked = 1)

View File

@ -1,70 +0,0 @@
From 25108090a1566bc49caab833fe1591a0c6f941be Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 27 Jun 2023 10:17:58 +0100
Subject: [PATCH] ocaml: Replace old enter/leave_blocking_section calls
Since OCaml 4 the old and confusing caml_enter_blocking_section and
caml_leave_blocking_section calls have been replaced with
caml_release_runtime_system and caml_acquire_runtime_system (in that
order). Use the new names.
(cherry picked from commit 7e1d7c1330185a1f3da2ce2100f59637518c3302)
---
generator/OCaml.ml | 5 +++--
ocaml/guestfs-c.c | 5 +++--
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/generator/OCaml.ml b/generator/OCaml.ml
index 02d9ee2e..07ccd269 100644
--- a/generator/OCaml.ml
+++ b/generator/OCaml.ml
@@ -429,6 +429,7 @@ and generate_ocaml_c () =
#include <caml/memory.h>
#include <caml/mlvalues.h>
#include <caml/signals.h>
+#include <caml/threads.h>
#include <guestfs.h>
#include \"guestfs-utils.h\"
@@ -689,12 +690,12 @@ copy_table (char * const * argv)
pr "\n";
if blocking then
- pr " caml_enter_blocking_section ();\n";
+ pr " caml_release_runtime_system ();\n";
pr " r = %s " c_function;
generate_c_call_args ~handle:"g" style;
pr ";\n";
if blocking then
- pr " caml_leave_blocking_section ();\n";
+ pr " caml_acquire_runtime_system ();\n";
(* Free strings if we copied them above. *)
List.iter (
diff --git a/ocaml/guestfs-c.c b/ocaml/guestfs-c.c
index 3888c945..8c8aa460 100644
--- a/ocaml/guestfs-c.c
+++ b/ocaml/guestfs-c.c
@@ -34,6 +34,7 @@
#include <caml/mlvalues.h>
#include <caml/printexc.h>
#include <caml/signals.h>
+#include <caml/threads.h>
#include <caml/unixsupport.h>
#include "guestfs-c.h"
@@ -395,12 +396,12 @@ event_callback_wrapper (guestfs_h *g,
/* Ensure we are holding the GC lock before any GC operations are
* possible. (RHBZ#725824)
*/
- caml_leave_blocking_section ();
+ caml_acquire_runtime_system ();
event_callback_wrapper_locked (g, data, event, event_handle, flags,
buf, buf_len, array, array_len);
- caml_enter_blocking_section ();
+ caml_release_runtime_system ();
}
value

View File

@ -1,28 +0,0 @@
From 166e4e90eef0d4c81a92940e5d61450d70f00662 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 27 Jun 2023 11:36:55 +0100
Subject: [PATCH] ocaml: Release runtime lock around guestfs_close
When finalizing the handle we call guestfs_close. This function could
be long-running (eg. it may have to shut down the qemu subprocess), so
release the runtime lock.
(cherry picked from commit 4a79c023e57e07844c2ac3259aaf9b885e402fdf)
---
ocaml/guestfs-c.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/ocaml/guestfs-c.c b/ocaml/guestfs-c.c
index 8c8aa460..a1865a72 100644
--- a/ocaml/guestfs-c.c
+++ b/ocaml/guestfs-c.c
@@ -77,7 +77,9 @@ guestfs_finalize (value gv)
* above, which is why we don't want to delete them before
* closing the handle.
*/
+ caml_release_runtime_system ();
guestfs_close (g);
+ caml_acquire_runtime_system ();
/* Now unregister the global roots. */
if (roots && len > 0) {

View File

@ -1,73 +0,0 @@
From c13dd5b6d4ca94eebe32bc32993f5be0b5b373ad Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 27 Jun 2023 12:09:12 +0100
Subject: [PATCH] ocaml: Conditionally acquire the lock in callbacks
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This fix was originally suggested by Jürgen Hötzel (link below) which
I have lightly modified so it works with OCaml <= 4 too.
Link: https://listman.redhat.com/archives/libguestfs/2023-May/031640.html
Link: https://discuss.ocaml.org/t/test-caml-state-and-conditionally-caml-acquire-runtime-system-good-or-bad/12489
(cherry picked from commit 16464878cf980ffab1c1aeada2e438b0281ad1bc)
---
ocaml/guestfs-c.c | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/ocaml/guestfs-c.c b/ocaml/guestfs-c.c
index a1865a72..67dc3547 100644
--- a/ocaml/guestfs-c.c
+++ b/ocaml/guestfs-c.c
@@ -19,6 +19,7 @@
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
+#include <stdbool.h>
#include <string.h>
#include <errno.h>
@@ -36,6 +37,7 @@
#include <caml/signals.h>
#include <caml/threads.h>
#include <caml/unixsupport.h>
+#include <caml/version.h>
#include "guestfs-c.h"
@@ -397,13 +399,32 @@ event_callback_wrapper (guestfs_h *g,
{
/* Ensure we are holding the GC lock before any GC operations are
* possible. (RHBZ#725824)
+ *
+ * There are many paths where we already hold the OCaml lock before
+ * this function, for example "non-blocking" calls, and the
+ * libguestfs global atexit path (which calls guestfs_close). To
+ * avoid double acquisition we need to check if we already hold the
+ * lock. OCaml 5 is strict about this. In earlier OCaml versions
+ * there is no way to check, but they did not implement the lock as
+ * a mutex and so it didn't cause problems.
+ *
+ * See also:
+ * https://discuss.ocaml.org/t/test-caml-state-and-conditionally-caml-acquire-runtime-system-good-or-bad/12489
*/
- caml_acquire_runtime_system ();
+#if OCAML_VERSION_MAJOR >= 5
+ bool acquired = caml_state != NULL;
+#else
+ const bool acquired = false;
+#endif
+
+ if (!acquired)
+ caml_acquire_runtime_system ();
event_callback_wrapper_locked (g, data, event, event_handle, flags,
buf, buf_len, array, array_len);
- caml_release_runtime_system ();
+ if (!acquired)
+ caml_release_runtime_system ();
}
value

View File

@ -1,59 +0,0 @@
From b6c9d4624899f4d81cc8d64d47ecef60aad8dd94 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 27 Jun 2023 16:20:49 +0100
Subject: [PATCH] ocaml: Fix guestfs_065_implicit_close.ml for OCaml 5
Link: https://discuss.ocaml.org/t/ocaml-5-forcing-objects-to-be-collected-and-finalized/12492/3
Thanks: Josh Berdine
Thanks: Vincent Laviron
(cherry picked from commit 7d4e9c927e8478662ece204b98ee3b5b147ab4b9)
---
ocaml/t/guestfs_065_implicit_close.ml | 33 +++++++++++++++------------
1 file changed, 19 insertions(+), 14 deletions(-)
diff --git a/ocaml/t/guestfs_065_implicit_close.ml b/ocaml/t/guestfs_065_implicit_close.ml
index f2dfecbd..9e68bc4c 100644
--- a/ocaml/t/guestfs_065_implicit_close.ml
+++ b/ocaml/t/guestfs_065_implicit_close.ml
@@ -16,22 +16,27 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*)
-let close_invoked = ref 0
+let [@inline never][@local never] run () =
+ let close_invoked = ref 0 in
-let close _ _ _ _ =
- incr close_invoked
+ let close _ _ _ _ =
+ incr close_invoked
+ in
-let () =
- let g = new Guestfs.guestfs () in
- ignore (g#set_event_callback close [Guestfs.EVENT_CLOSE]);
- assert (!close_invoked = 0)
-(* Allow the 'g' handle to go out of scope here, to ensure there is no
- * reference held on the stack.
- *)
+ let () =
+ let g = new Guestfs.guestfs () in
+ ignore (g#set_event_callback close [Guestfs.EVENT_CLOSE]);
+ assert (!close_invoked = 0)
+ (* Allow the 'g' handle to go out of scope here, to ensure there is no
+ * reference held on the stack.
+ *)
+ in
-(* This should cause the GC to close the handle. *)
-let () = Gc.full_major ()
+ (* This should cause the GC to close the handle. *)
+ Gc.full_major ();
-let () = assert (!close_invoked = 1)
+ assert (!close_invoked = 1);
-let () = Gc.compact ()
+ Gc.compact ()
+
+let () = run ()

View File

@ -1,25 +0,0 @@
From ff62b8f758e16aab82960474c79a7fc10a0af3ed Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 27 Jun 2023 16:31:55 +0100
Subject: [PATCH] ocaml: Use Caml_state_opt in preference to caml_state
Link: https://discuss.ocaml.org/t/test-caml-state-and-conditionally-caml-acquire-runtime-system-good-or-bad/12489/7
Thanks: Guillaume Munch-Maccagnoni
(cherry picked from commit cade0b1aeb828d294a7c4e323f8131322d30fb73)
---
ocaml/guestfs-c.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ocaml/guestfs-c.c b/ocaml/guestfs-c.c
index 67dc3547..8a8761e8 100644
--- a/ocaml/guestfs-c.c
+++ b/ocaml/guestfs-c.c
@@ -412,7 +412,7 @@ event_callback_wrapper (guestfs_h *g,
* https://discuss.ocaml.org/t/test-caml-state-and-conditionally-caml-acquire-runtime-system-good-or-bad/12489
*/
#if OCAML_VERSION_MAJOR >= 5
- bool acquired = caml_state != NULL;
+ bool acquired = Caml_state_opt != NULL;
#else
const bool acquired = false;
#endif

View File

@ -1,398 +0,0 @@
From 0be1035c710d95aeca68a10fe9a7b4b740ae7aff Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 29 Jun 2023 13:33:04 +0100
Subject: [PATCH] generator: Add --chown option for virt-customize
Also this updates the common submodule to include the changes.
Fixes: https://github.com/rwmjones/guestfs-tools/issues/12
Acked-by: Laszlo Ersek <lersek@redhat.com>
(cherry picked from commit d8e48bff212f9b0558480ffedf8158157360d0d5)
---
common | 2 +-
generator/customize.ml | 28 ++++++++++++++++++++++++++++
2 files changed, 29 insertions(+), 1 deletion(-)
Submodule common d61cd820..bbb54714:
diff --git a/common/mlcustomize/customize-options.pod b/common/mlcustomize/customize-options.pod
index 22a96e04..22724600 100644
--- a/common/mlcustomize/customize-options.pod
+++ b/common/mlcustomize/customize-options.pod
@@ -63,6 +63,30 @@ Change the permissions of C<FILE> to C<PERMISSIONS>.
I<Note>: C<PERMISSIONS> by default would be decimal, unless you prefix
it with C<0> to get octal, ie. use C<0700> not C<700>.
+=item B<--chown> UID.GID:PATH
+
+Change the owner user and group ID of a file or directory in the guest.
+Note:
+
+=over 4
+
+=item *
+
+Only numeric UIDs and GIDs will work, and these may not be the same
+inside the guest as on the host.
+
+=item *
+
+This will not work with Windows guests.
+
+=back
+
+For example:
+
+ virt-customize --chown '0.0:/var/log/audit.log'
+
+See also: I<--upload>.
+
=item B<--commands-from-file> FILENAME
Read the customize commands from a file, one (and its arguments)
diff --git a/common/mlcustomize/customize-synopsis.pod b/common/mlcustomize/customize-synopsis.pod
index d04f421e..e20b12d4 100644
--- a/common/mlcustomize/customize-synopsis.pod
+++ b/common/mlcustomize/customize-synopsis.pod
@@ -1,15 +1,15 @@
[--append-line FILE:LINE] [--chmod PERMISSIONS:FILE]
- [--commands-from-file FILENAME] [--copy SOURCE:DEST]
- [--copy-in LOCALPATH:REMOTEDIR] [--delete PATH] [--edit FILE:EXPR]
- [--firstboot SCRIPT] [--firstboot-command 'CMD+ARGS']
- [--firstboot-install PKG,PKG..] [--hostname HOSTNAME]
- [--inject-qemu-ga METHOD] [--inject-virtio-win METHOD]
- [--install PKG,PKG..] [--link TARGET:LINK[:LINK..]] [--mkdir DIR]
- [--move SOURCE:DEST] [--password USER:SELECTOR]
- [--root-password SELECTOR] [--run SCRIPT]
- [--run-command 'CMD+ARGS'] [--scrub FILE] [--sm-attach SELECTOR]
- [--sm-register] [--sm-remove] [--sm-unregister]
- [--ssh-inject USER[:SELECTOR]] [--truncate FILE]
+ [--chown UID.GID:PATH] [--commands-from-file FILENAME]
+ [--copy SOURCE:DEST] [--copy-in LOCALPATH:REMOTEDIR]
+ [--delete PATH] [--edit FILE:EXPR] [--firstboot SCRIPT]
+ [--firstboot-command 'CMD+ARGS'] [--firstboot-install PKG,PKG..]
+ [--hostname HOSTNAME] [--inject-qemu-ga METHOD]
+ [--inject-virtio-win METHOD] [--install PKG,PKG..]
+ [--link TARGET:LINK[:LINK..]] [--mkdir DIR] [--move SOURCE:DEST]
+ [--password USER:SELECTOR] [--root-password SELECTOR]
+ [--run SCRIPT] [--run-command 'CMD+ARGS'] [--scrub FILE]
+ [--sm-attach SELECTOR] [--sm-register] [--sm-remove]
+ [--sm-unregister] [--ssh-inject USER[:SELECTOR]] [--truncate FILE]
[--truncate-recursive PATH] [--timezone TIMEZONE] [--touch FILE]
[--uninstall PKG,PKG..] [--update] [--upload FILE:DEST]
[--write FILE:CONTENT] [--no-logfile]
diff --git a/common/mlcustomize/customize_cmdline.ml b/common/mlcustomize/customize_cmdline.ml
index 3c24315d..fd3074ad 100644
--- a/common/mlcustomize/customize_cmdline.ml
+++ b/common/mlcustomize/customize_cmdline.ml
@@ -41,6 +41,8 @@ and op = [
(* --append-line FILE:LINE *)
| `Chmod of string * string
(* --chmod PERMISSIONS:FILE *)
+ | `Chown of string * string
+ (* --chown UID.GID:PATH *)
| `CommandsFromFile of string
(* --commands-from-file FILENAME *)
| `Copy of string * string
@@ -187,6 +189,17 @@ let rec argspec () =
s_"Change the permissions of a file"
),
Some "PERMISSIONS:FILE", "Change the permissions of C<FILE> to C<PERMISSIONS>.\n\nI<Note>: C<PERMISSIONS> by default would be decimal, unless you prefix\nit with C<0> to get octal, ie. use C<0700> not C<700>.";
+ (
+ [ L"chown" ],
+ Getopt.String (
+ s_"UID.GID:PATH",
+ fun s ->
+ let p = split_string_pair "chown" s in
+ List.push_front (`Chown p) ops
+ ),
+ s_"Change the owner user and group ID of a file or directory"
+ ),
+ Some "UID.GID:PATH", "Change the owner user and group ID of a file or directory in the guest.\nNote:\n\n=over 4\n\n=item *\n\nOnly numeric UIDs and GIDs will work, and these may not be the same\ninside the guest as on the host.\n\n=item *\n\nThis will not work with Windows guests.\n\n=back\n\nFor example:\n\n virt-customize --chown '0.0:/var/log/audit.log'\n\nSee also: I<--upload>.";
(
[ L"commands-from-file" ],
Getopt.String (
diff --git a/common/mlcustomize/customize_cmdline.mli b/common/mlcustomize/customize_cmdline.mli
index 0cc166e6..5883bbe0 100644
--- a/common/mlcustomize/customize_cmdline.mli
+++ b/common/mlcustomize/customize_cmdline.mli
@@ -33,6 +33,8 @@ and op = [
(* --append-line FILE:LINE *)
| `Chmod of string * string
(* --chmod PERMISSIONS:FILE *)
+ | `Chown of string * string
+ (* --chown UID.GID:PATH *)
| `CommandsFromFile of string
(* --commands-from-file FILENAME *)
| `Copy of string * string
diff --git a/common/mltools/curl.ml b/common/mltools/curl.ml
index 6dba9753..73eed903 100644
--- a/common/mltools/curl.ml
+++ b/common/mltools/curl.ml
@@ -20,11 +20,13 @@ open Printf
open Std_utils
open Tools_utils
+open Common_gettext.Gettext
type t = {
curl : string;
args : args;
tmpdir : string option;
+ url : string;
}
and args = (string * string option) list
@@ -40,11 +42,17 @@ let args_of_proxy = function
| SystemProxy -> []
| ForcedProxy url -> [ "proxy", Some url; "noproxy", Some "" ]
-let create ?(curl = "curl") ?(proxy = SystemProxy) ?tmpdir args =
+let create ?(curl = "curl") ?(proxy = SystemProxy) ?tmpdir args url =
+ (* The ["url"] key must not appear in [args]. This was how the
+ * previous version of this module worked, so lets check there
+ * are no callers still doing this.
+ *)
+ List.iter (function "url", _ -> assert false | _ -> ()) args;
+
let args = safe_args @ args_of_proxy proxy @ args in
- { curl = curl; args = args; tmpdir = tmpdir }
+ { curl; args; tmpdir; url }
-let run { curl; args; tmpdir } =
+let run { curl; args; tmpdir; url } =
let config_file, chan = Filename.open_temp_file ?temp_dir:tmpdir
"guestfscurl" ".conf" in
List.iter (
@@ -67,15 +75,16 @@ let run { curl; args; tmpdir } =
| c -> output_char chan c
done;
fprintf chan "\"\n"
- ) args;
+ ) (("url", Some url) :: args);
close_out chan;
let cmd = sprintf "%s -q --config %s" (quote curl) (quote config_file) in
- let lines = external_command ~echo_cmd:false cmd in
+ let help = sprintf (f_"downloading %s") url in
+ let lines = external_command ~echo_cmd:false ~help cmd in
Unix.unlink config_file;
lines
-let to_string { curl; args } =
+let to_string { curl; args; url } =
let b = Buffer.create 128 in
bprintf b "%s -q" (quote curl);
List.iter (
@@ -85,7 +94,7 @@ let to_string { curl; args } =
| "user", Some _ -> bprintf b " --user <hidden>"
| name, Some value -> bprintf b " --%s %s" name (quote value)
) args;
- bprintf b "\n";
+ bprintf b " %s\n" (quote url);
Buffer.contents b
let print chan t = output_string chan (to_string t)
diff --git a/common/mltools/curl.mli b/common/mltools/curl.mli
index a3e98dc6..1606a79a 100644
--- a/common/mltools/curl.mli
+++ b/common/mltools/curl.mli
@@ -27,13 +27,16 @@ type proxy =
| SystemProxy (** Use the system settings. *)
| ForcedProxy of string (** The proxy is forced to the specified URL. *)
-val create : ?curl:string -> ?proxy:proxy -> ?tmpdir:string -> args -> t
+val create : ?curl:string -> ?proxy:proxy -> ?tmpdir:string -> args -> string
+ -> t
(** Create a curl command handle.
The curl arguments are a list of key, value pairs corresponding
to curl command line parameters, without leading dashes,
eg. [("user", Some "user:password")].
+ The string parameter is the URL (which is required).
+
The optional [?curl] parameter controls the name of the curl
binary (default ["curl"]).
diff --git a/common/mltools/tools_utils.ml b/common/mltools/tools_utils.ml
index 8b611e77..23f16c51 100644
--- a/common/mltools/tools_utils.ml
+++ b/common/mltools/tools_utils.ml
@@ -435,8 +435,12 @@ let create_standard_options argspec ?anon_fun ?(key_opts = false)
let getopt = Getopt.create argspec ?anon_fun usage_msg in
{ getopt; ks; debug_gc }
+let external_command_failed help cmd reason =
+ let help_prefix = match help with None -> "" | Some str -> str ^ ": " in
+ error "%s%s %s: %s" help_prefix (s_"external command") cmd reason
+
(* Run an external command, slurp up the output as a list of lines. *)
-let external_command ?(echo_cmd = true) cmd =
+let external_command ?(echo_cmd = true) ?help cmd =
if echo_cmd then
debug "%s" cmd;
let chan = Unix.open_process_in cmd in
@@ -448,15 +452,18 @@ let external_command ?(echo_cmd = true) cmd =
(match stat with
| Unix.WEXITED 0 -> ()
| Unix.WEXITED i ->
- error (f_"external command %s exited with error %d") cmd i
+ let reason = sprintf (f_"exited with error %d") i in
+ external_command_failed help cmd reason
| Unix.WSIGNALED i ->
- error (f_"external command %s killed by signal %d") cmd i
+ let reason = sprintf (f_"killed by signal %d") i in
+ external_command_failed help cmd reason
| Unix.WSTOPPED i ->
- error (f_"external command %s stopped by signal %d") cmd i
+ let reason = sprintf (f_"stopped by signal %d") i in
+ external_command_failed help cmd reason
);
lines
-let rec run_commands ?(echo_cmd = true) cmds =
+let rec run_commands ?(echo_cmd = true) ?help cmds =
let res = Array.make (List.length cmds) 0 in
let pids =
List.mapi (
@@ -482,21 +489,21 @@ let rec run_commands ?(echo_cmd = true) cmds =
let matching_pair = List.hd matching_pair in
let idx, _, app, outfd, errfd = matching_pair in
pids := new_pids;
- res.(idx) <- do_teardown app outfd errfd stat
+ res.(idx) <- do_teardown help app outfd errfd stat
);
done;
Array.to_list res
-and run_command ?(echo_cmd = true) ?stdout_fd ?stderr_fd args =
+and run_command ?(echo_cmd = true) ?help ?stdout_fd ?stderr_fd args =
let run_res = do_run args ~echo_cmd ?stdout_fd ?stderr_fd in
match run_res with
| Either (pid, app, outfd, errfd) ->
let _, stat = Unix.waitpid [] pid in
- do_teardown app outfd errfd stat
+ do_teardown help app outfd errfd stat
| Or code ->
code
-and do_run ?(echo_cmd = true) ?stdout_fd ?stderr_fd args =
+and do_run ?(echo_cmd = true) ?help ?stdout_fd ?stderr_fd args =
let app = List.hd args in
let get_fd default = function
| None ->
@@ -522,16 +529,18 @@ and do_run ?(echo_cmd = true) ?stdout_fd ?stderr_fd args =
debug "%s: %s: executable not found" app fn;
Or 127
-and do_teardown app outfd errfd exitstat =
+and do_teardown help app outfd errfd exitstat =
Option.iter Unix.close outfd;
Option.iter Unix.close errfd;
match exitstat with
| Unix.WEXITED i ->
- i
+ i
| Unix.WSIGNALED i ->
- error (f_"external command %s killed by signal %d") app i
+ let reason = sprintf (f_"killed by signal %d") i in
+ external_command_failed help app reason
| Unix.WSTOPPED i ->
- error (f_"external command %s stopped by signal %d") app i
+ let reason = sprintf (f_"stopped by signal %d") i in
+ external_command_failed help app reason
let shell_command ?(echo_cmd = true) cmd =
if echo_cmd then
diff --git a/common/mltools/tools_utils.mli b/common/mltools/tools_utils.mli
index ec900e63..193ba7b6 100644
--- a/common/mltools/tools_utils.mli
+++ b/common/mltools/tools_utils.mli
@@ -103,13 +103,17 @@ val create_standard_options : Getopt.speclist -> ?anon_fun:Getopt.anon_fun -> ?k
Returns a new {!cmdline_options} structure. *)
-val external_command : ?echo_cmd:bool -> string -> string list
+val external_command : ?echo_cmd:bool -> ?help:string -> string -> string list
(** Run an external command, slurp up the output as a list of lines.
[echo_cmd] specifies whether to output the full command on verbose
- mode, and it's on by default. *)
+ mode, and it's on by default.
-val run_commands : ?echo_cmd:bool -> (string list * Unix.file_descr option * Unix.file_descr option) list -> int list
+ [help] is an optional string which is printed as a prefix in
+ case the external command fails, eg as a hint to the user about
+ what we were trying to do. *)
+
+val run_commands : ?echo_cmd:bool -> ?help:string -> (string list * Unix.file_descr option * Unix.file_descr option) list -> int list
(** Run external commands in parallel without using a shell,
and return a list with their exit codes.
@@ -126,16 +130,24 @@ val run_commands : ?echo_cmd:bool -> (string list * Unix.file_descr option * Uni
end of the execution of the command for which it was specified.
[echo_cmd] specifies whether output the full command on verbose
- mode, and it's on by default. *)
+ mode, and it's on by default.
-val run_command : ?echo_cmd:bool -> ?stdout_fd:Unix.file_descr -> ?stderr_fd:Unix.file_descr -> string list -> int
+ [help] is an optional string which is printed as a prefix in
+ case the external command fails, eg as a hint to the user about
+ what we were trying to do. *)
+
+val run_command : ?echo_cmd:bool -> ?help:string -> ?stdout_fd:Unix.file_descr -> ?stderr_fd:Unix.file_descr -> string list -> int
(** Run an external command without using a shell, and return its exit code.
If [stdout_fd] or [stderr_fd] is specified, the file descriptor
is automatically closed after executing the command.
[echo_cmd] specifies whether output the full command on verbose
- mode, and it's on by default. *)
+ mode, and it's on by default.
+
+ [help] is an optional string which is printed as a prefix in
+ case the external command fails, eg as a hint to the user about
+ what we were trying to do. *)
val shell_command : ?echo_cmd:bool -> string -> int
(** Run an external shell command, and return its exit code.
diff --git a/generator/customize.ml b/generator/customize.ml
index aa7ac8e8..8d3dec3e 100644
--- a/generator/customize.ml
+++ b/generator/customize.ml
@@ -95,6 +95,34 @@ I<Note>: C<PERMISSIONS> by default would be decimal, unless you prefix
it with C<0> to get octal, ie. use C<0700> not C<700>.";
};
+ { op_name = "chown";
+ op_type = StringPair "UID.GID:PATH";
+ op_discrim = "`Chown";
+ op_shortdesc = "Change the owner user and group ID of a file or directory";
+ op_pod_longdesc = "\
+Change the owner user and group ID of a file or directory in the guest.
+Note:
+
+=over 4
+
+=item *
+
+Only numeric UIDs and GIDs will work, and these may not be the same
+inside the guest as on the host.
+
+=item *
+
+This will not work with Windows guests.
+
+=back
+
+For example:
+
+ virt-customize --chown '0.0:/var/log/audit.log'
+
+See also: I<--upload>.";
+ };
+
{ op_name = "commands-from-file";
op_type = StringFn ("FILENAME", "customize_read_from_file");
op_discrim = "`CommandsFromFile";

View File

@ -1,101 +0,0 @@
From cda24a0207fda8659790376a79fdac3d1775da83 Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Tue, 11 Jul 2023 13:39:06 +0200
Subject: [PATCH] lib: remove guestfs_int_cmd_clear_close_files()
The last (only?) caller of guestfs_int_cmd_clear_close_files() disappeared
in commit e4c396888056 ("lib/info: Remove /dev/fd hacking and pass a true
filename to qemu-img info.", 2018-01-23), part of v1.37.36.
Simplify the code by removing guestfs_int_cmd_clear_close_files().
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Message-Id: <20230711113906.107340-1-lersek@redhat.com>
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
(cherry picked from commit 13c7052ff96d5ee99ec1b1252f1a3b4d7aed44d2)
---
lib/command.c | 37 ++++++++++---------------------------
lib/guestfs-internal.h | 1 -
2 files changed, 10 insertions(+), 28 deletions(-)
diff --git a/lib/command.c b/lib/command.c
index 515ef624..82a47baf 100644
--- a/lib/command.c
+++ b/lib/command.c
@@ -152,9 +152,6 @@ struct command
/* When using the pipe_* APIs, stderr is pointed to a temporary file. */
char *error_file;
- /* Close file descriptors (defaults to true). */
- bool close_files;
-
/* Supply a callback to receive stdout. */
cmd_stdout_callback stdout_callback;
void *stdout_data;
@@ -186,7 +183,6 @@ guestfs_int_new_command (guestfs_h *g)
cmd = safe_calloc (g, 1, sizeof *cmd);
cmd->g = g;
cmd->capture_errors = true;
- cmd->close_files = true;
cmd->errorfd = -1;
cmd->outfd = -1;
return cmd;
@@ -358,17 +354,6 @@ guestfs_int_cmd_clear_capture_errors (struct command *cmd)
cmd->capture_errors = false;
}
-/**
- * Don't close file descriptors after the fork.
- *
- * XXX Should allow single fds to be sent to child process.
- */
-void
-guestfs_int_cmd_clear_close_files (struct command *cmd)
-{
- cmd->close_files = false;
-}
-
/**
* Set a function to be executed in the child, right before the
* execution. Can be used to setup the child, for example changing
@@ -564,18 +549,16 @@ run_child (struct command *cmd, char **env)
for (i = 1; i < NSIG; ++i)
sigaction (i, &sa, NULL);
- if (cmd->close_files) {
- /* Close all other file descriptors. This ensures that we don't
- * hold open (eg) pipes from the parent process.
- */
- max_fd = sysconf (_SC_OPEN_MAX);
- if (max_fd == -1)
- max_fd = 1024;
- if (max_fd > 65536)
- max_fd = 65536; /* bound the amount of work we do here */
- for (fd = 3; fd < max_fd; ++fd)
- close (fd);
- }
+ /* Close all other file descriptors. This ensures that we don't
+ * hold open (eg) pipes from the parent process.
+ */
+ max_fd = sysconf (_SC_OPEN_MAX);
+ if (max_fd == -1)
+ max_fd = 1024;
+ if (max_fd > 65536)
+ max_fd = 65536; /* bound the amount of work we do here */
+ for (fd = 3; fd < max_fd; ++fd)
+ close (fd);
/* Set the umask for all subcommands to something sensible (RHBZ#610880). */
umask (022);
diff --git a/lib/guestfs-internal.h b/lib/guestfs-internal.h
index fb55e026..c7ef3227 100644
--- a/lib/guestfs-internal.h
+++ b/lib/guestfs-internal.h
@@ -751,7 +751,6 @@ extern void guestfs_int_cmd_set_stdout_callback (struct command *, cmd_stdout_ca
extern void guestfs_int_cmd_set_stderr_to_stdout (struct command *);
extern void guestfs_int_cmd_set_child_rlimit (struct command *, int resource, long limit);
extern void guestfs_int_cmd_clear_capture_errors (struct command *);
-extern void guestfs_int_cmd_clear_close_files (struct command *);
extern void guestfs_int_cmd_set_child_callback (struct command *, cmd_child_callback child_callback, void *data);
extern int guestfs_int_cmd_run (struct command *);
extern void guestfs_int_cmd_close (struct command *);

View File

@ -1,34 +0,0 @@
From 1eaf876ff2a3bfeaa8756b92e5fa74a91b74f45c Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Fri, 14 Jul 2023 15:22:09 +0200
Subject: [PATCH] docs: fix broken link in the guestfs manual
Commit 55202a4d49a1 ("New API: get-sockdir", 2016-02-03) added identical
language to "fish/guestfish.pod" and "src/guestfs.pod", including an
internal link L</get-sockdir>. That's appropriate for
"fish/guestfish.pod", but the same API description is generated with a
different anchor for "src/guestfs.pod". Adapt the reference.
Fixes: 55202a4d49a101392148d79cb2e1591428db2681
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2184967
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
Message-Id: <20230714132213.96616-4-lersek@redhat.com>
(cherry picked from commit b4a4b754c6161b95ddee05e398e0200e6b73b840)
---
lib/guestfs.pod | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/guestfs.pod b/lib/guestfs.pod
index 866a4638..5db6dd91 100644
--- a/lib/guestfs.pod
+++ b/lib/guestfs.pod
@@ -3123,7 +3123,7 @@ non-essential runtime files.
If it is set, then is used to store temporary sockets. Otherwise,
F</tmp> is used.
-See also L</get-sockdir>,
+See also L</guestfs_get_sockdir>,
L<http://www.freedesktop.org/wiki/Specifications/basedir-spec/>.
=back

View File

@ -1,75 +0,0 @@
From bb3b9ac1ec7021ac04bca03748f15761c6c97487 Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Fri, 14 Jul 2023 15:22:10 +0200
Subject: [PATCH] docs: clarify sockdir's separation
There's another reason for separating sockdir from tmpdir, beyond "shorter
pathnames needed": permissions. For example, passt drops privileges such
that it cannot access "/tmp", and that restricts both the unix domain
socket and the PID file of passt.
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2184967
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
Message-Id: <20230714132213.96616-5-lersek@redhat.com>
(cherry picked from commit 21ccddecf7dd51b24bb2b71dbc8beb1a8dd01923)
---
fish/guestfish.pod | 4 ++--
generator/actions_properties.ml | 8 ++++++--
lib/guestfs.pod | 4 ++--
3 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/fish/guestfish.pod b/fish/guestfish.pod
index d36cac9d..33fc8b2c 100644
--- a/fish/guestfish.pod
+++ b/fish/guestfish.pod
@@ -1492,8 +1492,8 @@ See L</LIBGUESTFS_CACHEDIR>, L</LIBGUESTFS_TMPDIR>.
This directory represents a user-specific directory for storing
non-essential runtime files.
-If it is set, then is used to store temporary sockets. Otherwise,
-F</tmp> is used.
+If it is set, then is used to store temporary sockets and PID files.
+Otherwise, F</tmp> is used.
See also L</get-sockdir>,
L<http://www.freedesktop.org/wiki/Specifications/basedir-spec/>.
diff --git a/generator/actions_properties.ml b/generator/actions_properties.ml
index f84afb10..42eaaa4d 100644
--- a/generator/actions_properties.ml
+++ b/generator/actions_properties.ml
@@ -595,13 +595,17 @@ Get the handle identifier. See C<guestfs_set_identifier>." };
name = "get_sockdir"; added = (1, 33, 8);
style = RString (RPlainString, "sockdir"), [], [];
blocking = false;
- shortdesc = "get the temporary directory for sockets";
+ shortdesc = "get the temporary directory for sockets and PID files";
longdesc = "\
-Get the directory used by the handle to store temporary socket files.
+Get the directory used by the handle to store temporary socket and PID
+files.
This is different from C<guestfs_get_tmpdir>, as we need shorter
paths for sockets (due to the limited buffers of filenames for UNIX
sockets), and C<guestfs_get_tmpdir> may be too long for them.
+Furthermore, sockets and PID files must be accessible to such background
+services started by libguestfs that may not have permission to access
+the temporary directory returned by C<guestfs_get_tmpdir>.
The environment variable C<XDG_RUNTIME_DIR> controls the default
value: If C<XDG_RUNTIME_DIR> is set, then that is the default.
diff --git a/lib/guestfs.pod b/lib/guestfs.pod
index 5db6dd91..dff32cc9 100644
--- a/lib/guestfs.pod
+++ b/lib/guestfs.pod
@@ -3120,8 +3120,8 @@ See L</LIBGUESTFS_CACHEDIR>, L</LIBGUESTFS_TMPDIR>.
This directory represents a user-specific directory for storing
non-essential runtime files.
-If it is set, then is used to store temporary sockets. Otherwise,
-F</tmp> is used.
+If it is set, then is used to store temporary sockets and PID files.
+Otherwise, F</tmp> is used.
See also L</guestfs_get_sockdir>,
L<http://www.freedesktop.org/wiki/Specifications/basedir-spec/>.

View File

@ -1,144 +0,0 @@
From 8ba3628594c354dafcc715a842199c75a5676b57 Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Fri, 14 Jul 2023 15:22:11 +0200
Subject: [PATCH] lib: move guestfs_int_create_socketname() from "launch.c" to
"tmpdirs.c"
Consider the following inverted call tree (effectively a dependency tree
-- callees are at the top and near the left margin):
lazy_make_tmpdir() [lib/tmpdirs.c]
guestfs_int_lazy_make_tmpdir() [lib/tmpdirs.c]
guestfs_int_make_temp_path() [lib/tmpdirs.c]
guestfs_int_lazy_make_sockdir() [lib/tmpdirs.c]
guestfs_int_create_socketname() [lib/launch.c]
lazy_make_tmpdir() is our common workhorse / helper function that
centralizes the mkdtemp() function call.
guestfs_int_lazy_make_tmpdir() and guestfs_int_lazy_make_sockdir() are the
next level functions, both calling lazy_make_tmpdir(), just feeding it
different dirname generator functions, and different "is_runtime_dir"
qualifications. These functions create temp dirs for various, more
specific, purposes (see the manual and "lib/guestfs-internal.h" for more
details).
On a yet higher level are guestfs_int_make_temp_path() and
guestfs_int_create_socketname() -- they serve for creating *entries* in
those specific temp directories.
The discrepancy here is that, although all the other functions live in
"lib/tmpdirs.c", guestfs_int_create_socketname() is defined in
"lib/launch.c". That makes for a confusing code reading; move the function
to "lib/tmpdirs.c", just below its sibling function
guestfs_int_make_temp_path().
While at it, correct the leading comment on
guestfs_int_create_socketname() -- the socket pathname is created in the
socket directory, not in the temporary directory.
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2184967
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
Message-Id: <20230714132213.96616-6-lersek@redhat.com>
(cherry picked from commit 0b2ad40a098cbaf91d0d0a2df6e31bf8e3e08ace)
---
lib/guestfs-internal.h | 2 +-
lib/launch.c | 26 --------------------------
lib/tmpdirs.c | 26 ++++++++++++++++++++++++++
3 files changed, 27 insertions(+), 27 deletions(-)
diff --git a/lib/guestfs-internal.h b/lib/guestfs-internal.h
index c7ef3227..ebd68380 100644
--- a/lib/guestfs-internal.h
+++ b/lib/guestfs-internal.h
@@ -668,6 +668,7 @@ extern int guestfs_int_set_env_runtimedir (guestfs_h *g, const char *envname, co
extern int guestfs_int_lazy_make_tmpdir (guestfs_h *g);
extern int guestfs_int_lazy_make_sockdir (guestfs_h *g);
extern char *guestfs_int_make_temp_path (guestfs_h *g, const char *name, const char *extension);
+extern int guestfs_int_create_socketname (guestfs_h *g, const char *filename, char (*sockname)[UNIX_PATH_MAX]);
extern char *guestfs_int_lazy_make_supermin_appliance_dir (guestfs_h *g);
extern void guestfs_int_remove_tmpdir (guestfs_h *g);
extern void guestfs_int_remove_sockdir (guestfs_h *g);
@@ -700,7 +701,6 @@ extern int guestfs_int_get_uefi (guestfs_h *g, char *const *firmwares, const cha
extern int64_t guestfs_int_timeval_diff (const struct timeval *x, const struct timeval *y);
extern void guestfs_int_launch_send_progress (guestfs_h *g, int perdozen);
extern void guestfs_int_unblock_sigterm (void);
-extern int guestfs_int_create_socketname (guestfs_h *g, const char *filename, char (*sockname)[UNIX_PATH_MAX]);
extern void guestfs_int_register_backend (const char *name, const struct backend_ops *);
extern int guestfs_int_set_backend (guestfs_h *g, const char *method);
diff --git a/lib/launch.c b/lib/launch.c
index 6e08b120..bd0526c9 100644
--- a/lib/launch.c
+++ b/lib/launch.c
@@ -309,32 +309,6 @@ guestfs_impl_config (guestfs_h *g,
return 0;
}
-/**
- * Create the path for a socket with the selected filename in the
- * tmpdir.
- */
-int
-guestfs_int_create_socketname (guestfs_h *g, const char *filename,
- char (*sockpath)[UNIX_PATH_MAX])
-{
- int r;
-
- if (guestfs_int_lazy_make_sockdir (g) == -1)
- return -1;
-
- r = snprintf (*sockpath, UNIX_PATH_MAX, "%s/%s", g->sockdir, filename);
- if (r >= UNIX_PATH_MAX) {
- error (g, _("socket path too long: %s/%s"), g->sockdir, filename);
- return -1;
- }
- if (r < 0) {
- perrorf (g, _("%s"), g->sockdir);
- return -1;
- }
-
- return 0;
-}
-
/**
* When the library is loaded, each backend calls this function to
* register itself in a global list.
diff --git a/lib/tmpdirs.c b/lib/tmpdirs.c
index b8e19de2..24adf98d 100644
--- a/lib/tmpdirs.c
+++ b/lib/tmpdirs.c
@@ -253,6 +253,32 @@ guestfs_int_make_temp_path (guestfs_h *g,
extension ? extension : "");
}
+/**
+ * Create the path for a socket with the selected filename in the
+ * sockdir.
+ */
+int
+guestfs_int_create_socketname (guestfs_h *g, const char *filename,
+ char (*sockpath)[UNIX_PATH_MAX])
+{
+ int r;
+
+ if (guestfs_int_lazy_make_sockdir (g) == -1)
+ return -1;
+
+ r = snprintf (*sockpath, UNIX_PATH_MAX, "%s/%s", g->sockdir, filename);
+ if (r >= UNIX_PATH_MAX) {
+ error (g, _("socket path too long: %s/%s"), g->sockdir, filename);
+ return -1;
+ }
+ if (r < 0) {
+ perrorf (g, _("%s"), g->sockdir);
+ return -1;
+ }
+
+ return 0;
+}
+
/**
* Create the supermin appliance directory under cachedir, if it does
* not exist.

View File

@ -1,241 +0,0 @@
From e7501a32cb096c1957aae0de934c0b563ff18a5f Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Sat, 15 Jul 2023 16:33:18 +0100
Subject: [PATCH] generator: customize: Add new StringTriplet for use by
--chown
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The just added --chown option previously used StringPair, splitting
the argument as UID.GID:FILENAME. However this will not work if we
ever extend this with the ability to use user or group names, since
they may contain dot (but not colon). Add a new StringTriplet type
and split the argument string three ways. The new option becomes:
virt-customize ... --chown UID:GID:FILENAME
Include the following commit from the common submodule:
commit e70d89a58dae068be2e19c7c21558707261af96a
Author: Richard W.M. Jones <rjones@redhat.com>
Date: Sat Jul 15 16:42:06 2023 +0100
customize: Update generated files for --chown with StringTriplet
Updates: commit d8e48bff212f9b0558480ffedf8158157360d0d5
(cherry picked from commit c08032ebe2763f5e9ce5b14e003721475219d390)
---
common | 2 +-
generator/customize.ml | 44 ++++++++++++++++++++++++++++++++----------
2 files changed, 35 insertions(+), 11 deletions(-)
Submodule common bbb54714..e70d89a5:
diff --git a/common/mlcustomize/customize-options.pod b/common/mlcustomize/customize-options.pod
index 22724600..e658a447 100644
--- a/common/mlcustomize/customize-options.pod
+++ b/common/mlcustomize/customize-options.pod
@@ -63,7 +63,7 @@ Change the permissions of C<FILE> to C<PERMISSIONS>.
I<Note>: C<PERMISSIONS> by default would be decimal, unless you prefix
it with C<0> to get octal, ie. use C<0700> not C<700>.
-=item B<--chown> UID.GID:PATH
+=item B<--chown> UID:GID:PATH
Change the owner user and group ID of a file or directory in the guest.
Note:
@@ -83,7 +83,7 @@ This will not work with Windows guests.
For example:
- virt-customize --chown '0.0:/var/log/audit.log'
+ virt-customize --chown '0:0:/var/log/audit.log'
See also: I<--upload>.
diff --git a/common/mlcustomize/customize-synopsis.pod b/common/mlcustomize/customize-synopsis.pod
index e20b12d4..5031b015 100644
--- a/common/mlcustomize/customize-synopsis.pod
+++ b/common/mlcustomize/customize-synopsis.pod
@@ -1,5 +1,5 @@
[--append-line FILE:LINE] [--chmod PERMISSIONS:FILE]
- [--chown UID.GID:PATH] [--commands-from-file FILENAME]
+ [--chown UID:GID:PATH] [--commands-from-file FILENAME]
[--copy SOURCE:DEST] [--copy-in LOCALPATH:REMOTEDIR]
[--delete PATH] [--edit FILE:EXPR] [--firstboot SCRIPT]
[--firstboot-command 'CMD+ARGS'] [--firstboot-install PKG,PKG..]
diff --git a/common/mlcustomize/customize_cmdline.ml b/common/mlcustomize/customize_cmdline.ml
index fd3074ad..3ce901db 100644
--- a/common/mlcustomize/customize_cmdline.ml
+++ b/common/mlcustomize/customize_cmdline.ml
@@ -41,8 +41,8 @@ and op = [
(* --append-line FILE:LINE *)
| `Chmod of string * string
(* --chmod PERMISSIONS:FILE *)
- | `Chown of string * string
- (* --chown UID.GID:PATH *)
+ | `Chown of string * string * string
+ (* --chown UID:GID:PATH *)
| `CommandsFromFile of string
(* --commands-from-file FILENAME *)
| `Copy of string * string
@@ -154,8 +154,13 @@ let rec argspec () =
option_name in
let len = String.length arg in
String.sub arg 0 i, String.sub arg (i+1) (len-(i+1))
- in
- let split_string_list arg =
+ and split_string_triplet option_name arg =
+ match String.nsplit ~max:3 "," arg with
+ | [a; b; c] -> a, b, c
+ | _ ->
+ error (f_"invalid format for '--%s' parameter, see the man page")
+ option_name
+ and split_string_list arg =
String.nsplit "," arg
in
let split_links_list option_name arg =
@@ -192,14 +197,14 @@ let rec argspec () =
(
[ L"chown" ],
Getopt.String (
- s_"UID.GID:PATH",
+ s_"UID:GID:PATH",
fun s ->
- let p = split_string_pair "chown" s in
+ let p = split_string_triplet "chown" s in
List.push_front (`Chown p) ops
),
s_"Change the owner user and group ID of a file or directory"
),
- Some "UID.GID:PATH", "Change the owner user and group ID of a file or directory in the guest.\nNote:\n\n=over 4\n\n=item *\n\nOnly numeric UIDs and GIDs will work, and these may not be the same\ninside the guest as on the host.\n\n=item *\n\nThis will not work with Windows guests.\n\n=back\n\nFor example:\n\n virt-customize --chown '0.0:/var/log/audit.log'\n\nSee also: I<--upload>.";
+ Some "UID:GID:PATH", "Change the owner user and group ID of a file or directory in the guest.\nNote:\n\n=over 4\n\n=item *\n\nOnly numeric UIDs and GIDs will work, and these may not be the same\ninside the guest as on the host.\n\n=item *\n\nThis will not work with Windows guests.\n\n=back\n\nFor example:\n\n virt-customize --chown '0:0:/var/log/audit.log'\n\nSee also: I<--upload>.";
(
[ L"commands-from-file" ],
Getopt.String (
diff --git a/common/mlcustomize/customize_cmdline.mli b/common/mlcustomize/customize_cmdline.mli
index 5883bbe0..112b74dc 100644
--- a/common/mlcustomize/customize_cmdline.mli
+++ b/common/mlcustomize/customize_cmdline.mli
@@ -33,8 +33,8 @@ and op = [
(* --append-line FILE:LINE *)
| `Chmod of string * string
(* --chmod PERMISSIONS:FILE *)
- | `Chown of string * string
- (* --chown UID.GID:PATH *)
+ | `Chown of string * string * string
+ (* --chown UID:GID:PATH *)
| `CommandsFromFile of string
(* --commands-from-file FILENAME *)
| `Copy of string * string
diff --git a/generator/customize.ml b/generator/customize.ml
index 8d3dec3e..fe87ef5e 100644
--- a/generator/customize.ml
+++ b/generator/customize.ml
@@ -41,6 +41,7 @@ and op_type =
| Unit (* no argument *)
| String of string (* string *)
| StringPair of string (* string:string *)
+| StringTriplet of string (* string:string:string *)
| StringList of string (* string,string,... *)
| TargetLinks of string (* target:link[:link...] *)
| PasswordSelector of string (* password selector *)
@@ -96,7 +97,7 @@ it with C<0> to get octal, ie. use C<0700> not C<700>.";
};
{ op_name = "chown";
- op_type = StringPair "UID.GID:PATH";
+ op_type = StringTriplet "UID:GID:PATH";
op_discrim = "`Chown";
op_shortdesc = "Change the owner user and group ID of a file or directory";
op_pod_longdesc = "\
@@ -118,7 +119,7 @@ This will not work with Windows guests.
For example:
- virt-customize --chown '0.0:/var/log/audit.log'
+ virt-customize --chown '0:0:/var/log/audit.log'
See also: I<--upload>.";
};
@@ -761,8 +762,13 @@ let rec argspec () =
option_name in
let len = String.length arg in
String.sub arg 0 i, String.sub arg (i+1) (len-(i+1))
- in
- let split_string_list arg =
+ and split_string_triplet option_name arg =
+ match String.nsplit ~max:3 \",\" arg with
+ | [a; b; c] -> a, b, c
+ | _ ->
+ error (f_\"invalid format for '--%%s' parameter, see the man page\")
+ option_name
+ and split_string_list arg =
String.nsplit \",\" arg
in
let split_links_list option_name arg =
@@ -807,6 +813,19 @@ let rec argspec () =
pr " s_\"%s\"\n" shortdesc;
pr " ),\n";
pr " Some %S, %S;\n" v longdesc
+ | { op_type = StringTriplet v; op_name = name; op_discrim = discrim;
+ op_shortdesc = shortdesc; op_pod_longdesc = longdesc } ->
+ pr " (\n";
+ pr " [ L\"%s\" ],\n" name;
+ pr " Getopt.String (\n";
+ pr " s_\"%s\",\n" v;
+ pr " fun s ->\n";
+ pr " let p = split_string_triplet \"%s\" s in\n" name;
+ pr " List.push_front (%s p) ops\n" discrim;
+ pr " ),\n";
+ pr " s_\"%s\"\n" shortdesc;
+ pr " ),\n";
+ pr " Some %S, %S;\n" v longdesc
| { op_type = StringList v; op_name = name; op_discrim = discrim;
op_shortdesc = shortdesc; op_pod_longdesc = longdesc } ->
pr " (\n";
@@ -956,6 +975,7 @@ let rec argspec () =
| { op_type = Unit; }
| { op_type = String _; }
| { op_type = StringPair _; }
+ | { op_type = StringTriplet _; }
| { op_type = StringList _; }
| { op_type = TargetLinks _; }
| { op_type = PasswordSelector _; }
@@ -1021,6 +1041,10 @@ type ops = {
| { op_type = StringPair v; op_discrim = discrim;
op_name = name } ->
pr " | %s of string * string\n (* --%s %s *)\n" discrim name v
+ | { op_type = StringTriplet v; op_discrim = discrim;
+ op_name = name } ->
+ pr " | %s of string * string * string\n (* --%s %s *)\n"
+ discrim name v
| { op_type = StringList v; op_discrim = discrim;
op_name = name } ->
pr " | %s of string list\n (* --%s %s *)\n" discrim name v
@@ -1073,9 +1097,9 @@ let generate_customize_synopsis_pod () =
function
| { op_type = Unit; op_name = n } ->
n, sprintf "[--%s]" n
- | { op_type = String v | StringPair v | StringList v | TargetLinks v
- | PasswordSelector v | UserPasswordSelector v | SSHKeySelector v
- | StringFn (v, _) | SMPoolSelector v;
+ | { op_type = String v | StringPair v | StringTriplet v | StringList v
+ | TargetLinks v | PasswordSelector v | UserPasswordSelector v
+ | SSHKeySelector v | StringFn (v, _) | SMPoolSelector v;
op_name = n } ->
n, sprintf "[--%s %s]" n v
) ops @
@@ -1116,9 +1140,9 @@ let generate_customize_options_pod () =
function
| { op_type = Unit; op_name = n; op_pod_longdesc = ld } ->
n, sprintf "B<--%s>" n, ld
- | { op_type = String v | StringPair v | StringList v | TargetLinks v
- | PasswordSelector v | UserPasswordSelector v | SSHKeySelector v
- | StringFn (v, _) | SMPoolSelector v;
+ | { op_type = String v | StringPair v | StringTriplet v | StringList v
+ | TargetLinks v | PasswordSelector v | UserPasswordSelector v
+ | SSHKeySelector v | StringFn (v, _) | SMPoolSelector v;
op_name = n; op_pod_longdesc = ld } ->
n, sprintf "B<--%s> %s" n v, ld
) ops @

View File

@ -1,57 +0,0 @@
From 981b48085a2d0e422578bc12d6c3b68e312bad44 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 20 Jul 2023 11:15:26 +0100
Subject: [PATCH] daemon: lvm: Do reverse device name translation on pvs_full
device fields
Intermittent test failures in virt-filesystems showed that when using
the pvs_full API, the pv_name field in the returned list of structures
was not being reverse translated. As a result internal partition
names could appear in the output of virt-filesystems.
See: https://listman.redhat.com/archives/libguestfs/2023-July/032058.html
(cherry picked from commit 32cb5b45cfbe5edbc7643fc533da70db2d3c6cda)
---
daemon/lvm.c | 29 ++++++++++++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/daemon/lvm.c b/daemon/lvm.c
index 7e76e17c..b8c01f71 100644
--- a/daemon/lvm.c
+++ b/daemon/lvm.c
@@ -146,7 +146,34 @@ do_vgs (void)
guestfs_int_lvm_pv_list *
do_pvs_full (void)
{
- return parse_command_line_pvs ();
+ guestfs_int_lvm_pv_list *r;
+ size_t i;
+ char *din, *dout;
+
+ r = parse_command_line_pvs ();
+ if (r == NULL)
+ /* parse_command_line_pvs has already called reply_with_error */
+ return NULL;
+
+ /* The pv_name fields contain device names which must be reverse
+ * translated. The problem here is that the generator does not have
+ * a "FMountable" field type in types.mli.
+ */
+ for (i = 0; i < r->guestfs_int_lvm_pv_list_len; ++i) {
+ din = r->guestfs_int_lvm_pv_list_val[i].pv_name;
+ if (din) {
+ dout = reverse_device_name_translation (din);
+ if (!dout) {
+ /* reverse_device_name_translation has already called reply_with_error*/
+ /* XXX memory leak here */
+ return NULL;
+ }
+ r->guestfs_int_lvm_pv_list_val[i].pv_name = dout;
+ free (din);
+ }
+ }
+
+ return r;
}
guestfs_int_lvm_vg_list *

View File

@ -1,208 +0,0 @@
From 12873e21070ba3d0aca45b626f4df00adb14aad5 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 21 Sep 2023 15:16:51 +0100
Subject: [PATCH] ruby: Replace MiniTest with Minitest
See this commit in hivex:
https://github.com/libguestfs/hivex/commit/fbcff7fbd8f96214c7f13f36bd7669a9142824ab
(cherry picked from commit d25a48e2dd2c2a2063b8d03a33b5e3cbe773c47d)
---
ruby/t/tc_010_load.rb | 2 +-
ruby/t/tc_020_create.rb | 2 +-
ruby/t/tc_030_create_flags.rb | 2 +-
ruby/t/tc_040_create_multiple.rb | 2 +-
ruby/t/tc_050_handle_properties.rb | 2 +-
ruby/t/tc_060_explicit_close.rb | 2 +-
ruby/t/tc_070_optargs.rb | 2 +-
ruby/t/tc_090_retvalues.rb | 2 +-
ruby/t/tc_100_launch.rb | 2 +-
ruby/t/tc_410_close_event.rb | 2 +-
ruby/t/tc_420_log_messages.rb | 2 +-
ruby/t/tc_800_rhbz507346.rb | 2 +-
ruby/t/tc_810_rhbz664558c6.rb | 2 +-
ruby/t/tc_820_rhbz1046509.rb | 2 +-
14 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/ruby/t/tc_010_load.rb b/ruby/t/tc_010_load.rb
index 9dc2db67..40ddccd8 100644
--- a/ruby/t/tc_010_load.rb
+++ b/ruby/t/tc_010_load.rb
@@ -17,7 +17,7 @@
require File::join(File::dirname(__FILE__), 'test_helper')
-class Test010Load < MiniTest::Unit::TestCase
+class Test010Load < Minitest::Test
def test_010_load
end
end
diff --git a/ruby/t/tc_020_create.rb b/ruby/t/tc_020_create.rb
index 840dd858..c3f5307e 100644
--- a/ruby/t/tc_020_create.rb
+++ b/ruby/t/tc_020_create.rb
@@ -17,7 +17,7 @@
require File::join(File::dirname(__FILE__), 'test_helper')
-class Test020Create < MiniTest::Unit::TestCase
+class Test020Create < Minitest::Test
def test_020_create
g = Guestfs::Guestfs.new()
refute_nil (g)
diff --git a/ruby/t/tc_030_create_flags.rb b/ruby/t/tc_030_create_flags.rb
index ac6d1f46..4949d2a8 100644
--- a/ruby/t/tc_030_create_flags.rb
+++ b/ruby/t/tc_030_create_flags.rb
@@ -17,7 +17,7 @@
require File::join(File::dirname(__FILE__), 'test_helper')
-class Test030CreateFlags < MiniTest::Unit::TestCase
+class Test030CreateFlags < Minitest::Test
def test_030_create_flags
g = Guestfs::Guestfs.new(:environment => false, :close_on_exit => true)
refute_nil (g)
diff --git a/ruby/t/tc_040_create_multiple.rb b/ruby/t/tc_040_create_multiple.rb
index 36e8edc7..623ccc6e 100644
--- a/ruby/t/tc_040_create_multiple.rb
+++ b/ruby/t/tc_040_create_multiple.rb
@@ -17,7 +17,7 @@
require File::join(File::dirname(__FILE__), 'test_helper')
-class Test040CreateMultiple < MiniTest::Unit::TestCase
+class Test040CreateMultiple < Minitest::Test
def test_040_create_multiple
g1 = Guestfs::Guestfs.new()
g2 = Guestfs::Guestfs.new()
diff --git a/ruby/t/tc_050_handle_properties.rb b/ruby/t/tc_050_handle_properties.rb
index 5928532e..b22c51fd 100644
--- a/ruby/t/tc_050_handle_properties.rb
+++ b/ruby/t/tc_050_handle_properties.rb
@@ -17,7 +17,7 @@
require File::join(File::dirname(__FILE__), 'test_helper')
-class Test050HandleProperties < MiniTest::Unit::TestCase
+class Test050HandleProperties < Minitest::Test
def test_050_handle_properties
g = Guestfs::Guestfs.new()
refute_nil (g)
diff --git a/ruby/t/tc_060_explicit_close.rb b/ruby/t/tc_060_explicit_close.rb
index 0c9118aa..20afd0de 100644
--- a/ruby/t/tc_060_explicit_close.rb
+++ b/ruby/t/tc_060_explicit_close.rb
@@ -17,7 +17,7 @@
require File::join(File::dirname(__FILE__), 'test_helper')
-class Test060ExplicitClose < MiniTest::Unit::TestCase
+class Test060ExplicitClose < Minitest::Test
def test_060_explicit_close
g = Guestfs::Guestfs.new()
refute_nil (g)
diff --git a/ruby/t/tc_070_optargs.rb b/ruby/t/tc_070_optargs.rb
index fff5fbf7..a2360b2f 100644
--- a/ruby/t/tc_070_optargs.rb
+++ b/ruby/t/tc_070_optargs.rb
@@ -17,7 +17,7 @@
require File::join(File::dirname(__FILE__), 'test_helper')
-class Test070Optargs < MiniTest::Unit::TestCase
+class Test070Optargs < Minitest::Test
def test_070_optargs
g = Guestfs::Guestfs.new()
diff --git a/ruby/t/tc_090_retvalues.rb b/ruby/t/tc_090_retvalues.rb
index 4bcc8b54..c9a84276 100644
--- a/ruby/t/tc_090_retvalues.rb
+++ b/ruby/t/tc_090_retvalues.rb
@@ -17,7 +17,7 @@
require File::join(File::dirname(__FILE__), 'test_helper')
-class Test090RetValues < MiniTest::Unit::TestCase
+class Test090RetValues < Minitest::Test
def test_090_retvalues
g = Guestfs::Guestfs.new()
diff --git a/ruby/t/tc_100_launch.rb b/ruby/t/tc_100_launch.rb
index 43db4b67..096cbd62 100644
--- a/ruby/t/tc_100_launch.rb
+++ b/ruby/t/tc_100_launch.rb
@@ -17,7 +17,7 @@
require File::join(File::dirname(__FILE__), 'test_helper')
-class Test100Launch < MiniTest::Unit::TestCase
+class Test100Launch < Minitest::Test
def test_100_launch
g = Guestfs::Guestfs.new()
diff --git a/ruby/t/tc_410_close_event.rb b/ruby/t/tc_410_close_event.rb
index 1b98957e..9a4e0558 100644
--- a/ruby/t/tc_410_close_event.rb
+++ b/ruby/t/tc_410_close_event.rb
@@ -17,7 +17,7 @@
require File::join(File::dirname(__FILE__), 'test_helper')
-class Test410CloseEvent < MiniTest::Unit::TestCase
+class Test410CloseEvent < Minitest::Test
def test_410_close_event
g = Guestfs::Guestfs.new()
diff --git a/ruby/t/tc_420_log_messages.rb b/ruby/t/tc_420_log_messages.rb
index 936e0fd4..a113c62e 100644
--- a/ruby/t/tc_420_log_messages.rb
+++ b/ruby/t/tc_420_log_messages.rb
@@ -17,7 +17,7 @@
require File::join(File::dirname(__FILE__), 'test_helper')
-class Test420LogMessages < MiniTest::Unit::TestCase
+class Test420LogMessages < Minitest::Test
def test_420_log_messages
g = Guestfs::Guestfs.new()
diff --git a/ruby/t/tc_800_rhbz507346.rb b/ruby/t/tc_800_rhbz507346.rb
index 4b7cc010..06767352 100644
--- a/ruby/t/tc_800_rhbz507346.rb
+++ b/ruby/t/tc_800_rhbz507346.rb
@@ -17,7 +17,7 @@
require File::join(File::dirname(__FILE__), 'test_helper')
-class Test800RHBZ507346 < MiniTest::Unit::TestCase
+class Test800RHBZ507346 < Minitest::Test
def test_800_rhbz507346
g = Guestfs::Guestfs.new()
exception = assert_raises TypeError do
diff --git a/ruby/t/tc_810_rhbz664558c6.rb b/ruby/t/tc_810_rhbz664558c6.rb
index f5e9adee..1504c070 100644
--- a/ruby/t/tc_810_rhbz664558c6.rb
+++ b/ruby/t/tc_810_rhbz664558c6.rb
@@ -21,7 +21,7 @@
require File::join(File::dirname(__FILE__), 'test_helper')
-class Test810RHBZ664558C6 < MiniTest::Unit::TestCase
+class Test810RHBZ664558C6 < Minitest::Test
def test_810_rhbz_664558c6
g = Guestfs::Guestfs.new()
diff --git a/ruby/t/tc_820_rhbz1046509.rb b/ruby/t/tc_820_rhbz1046509.rb
index 882ddb55..0595293d 100644
--- a/ruby/t/tc_820_rhbz1046509.rb
+++ b/ruby/t/tc_820_rhbz1046509.rb
@@ -20,7 +20,7 @@
require File::join(File::dirname(__FILE__), 'test_helper')
-class Test820RHBZ1046509 < MiniTest::Unit::TestCase
+class Test820RHBZ1046509 < Minitest::Test
def _handleok(g)
g.add_drive("/dev/null")
g.close()

View File

@ -1,278 +0,0 @@
From fbe7e96cee460e26a0ff6a9c293c155a78bfdfde Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 21 Sep 2023 15:20:55 +0100
Subject: [PATCH] ruby: Get rid of old Test::Unit compatibility
See this commit in hivex:
https://github.com/libguestfs/hivex/commit/6dbbc474d3df5cdfd21ed5e692b3a58136fffc42
(cherry picked from commit ecf361d7237d38b2418ddecb1b70e3b722509c12)
---
ruby/Makefile.am | 3 +--
ruby/t/tc_010_load.rb | 3 ++-
ruby/t/tc_020_create.rb | 3 ++-
ruby/t/tc_030_create_flags.rb | 3 ++-
ruby/t/tc_040_create_multiple.rb | 3 ++-
ruby/t/tc_050_handle_properties.rb | 3 ++-
ruby/t/tc_060_explicit_close.rb | 3 ++-
ruby/t/tc_070_optargs.rb | 3 ++-
ruby/t/tc_090_retvalues.rb | 3 ++-
ruby/t/tc_100_launch.rb | 3 ++-
ruby/t/tc_410_close_event.rb | 3 ++-
ruby/t/tc_420_log_messages.rb | 3 ++-
ruby/t/tc_800_rhbz507346.rb | 3 ++-
ruby/t/tc_810_rhbz664558c6.rb | 3 ++-
ruby/t/tc_820_rhbz1046509.rb | 3 ++-
ruby/t/test_helper.rb | 33 ------------------------------
16 files changed, 29 insertions(+), 49 deletions(-)
delete mode 100644 ruby/t/test_helper.rb
diff --git a/ruby/Makefile.am b/ruby/Makefile.am
index c26513a7..867b05b1 100644
--- a/ruby/Makefile.am
+++ b/ruby/Makefile.am
@@ -40,8 +40,7 @@ EXTRA_DIST = \
lib/guestfs.rb \
run-bindtests \
run-ruby-tests \
- t/tc_*.rb \
- t/test_helper.rb
+ t/tc_*.rb
CLEANFILES += \
lib/*~ \
diff --git a/ruby/t/tc_010_load.rb b/ruby/t/tc_010_load.rb
index 40ddccd8..e7ec482e 100644
--- a/ruby/t/tc_010_load.rb
+++ b/ruby/t/tc_010_load.rb
@@ -15,7 +15,8 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require File::join(File::dirname(__FILE__), 'test_helper')
+require 'minitest/autorun'
+require 'guestfs'
class Test010Load < Minitest::Test
def test_010_load
diff --git a/ruby/t/tc_020_create.rb b/ruby/t/tc_020_create.rb
index c3f5307e..26bb2ecf 100644
--- a/ruby/t/tc_020_create.rb
+++ b/ruby/t/tc_020_create.rb
@@ -15,7 +15,8 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require File::join(File::dirname(__FILE__), 'test_helper')
+require 'minitest/autorun'
+require 'guestfs'
class Test020Create < Minitest::Test
def test_020_create
diff --git a/ruby/t/tc_030_create_flags.rb b/ruby/t/tc_030_create_flags.rb
index 4949d2a8..8006d962 100644
--- a/ruby/t/tc_030_create_flags.rb
+++ b/ruby/t/tc_030_create_flags.rb
@@ -15,7 +15,8 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require File::join(File::dirname(__FILE__), 'test_helper')
+require 'minitest/autorun'
+require 'guestfs'
class Test030CreateFlags < Minitest::Test
def test_030_create_flags
diff --git a/ruby/t/tc_040_create_multiple.rb b/ruby/t/tc_040_create_multiple.rb
index 623ccc6e..32b2b094 100644
--- a/ruby/t/tc_040_create_multiple.rb
+++ b/ruby/t/tc_040_create_multiple.rb
@@ -15,7 +15,8 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require File::join(File::dirname(__FILE__), 'test_helper')
+require 'minitest/autorun'
+require 'guestfs'
class Test040CreateMultiple < Minitest::Test
def test_040_create_multiple
diff --git a/ruby/t/tc_050_handle_properties.rb b/ruby/t/tc_050_handle_properties.rb
index b22c51fd..d37b1d03 100644
--- a/ruby/t/tc_050_handle_properties.rb
+++ b/ruby/t/tc_050_handle_properties.rb
@@ -15,7 +15,8 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require File::join(File::dirname(__FILE__), 'test_helper')
+require 'minitest/autorun'
+require 'guestfs'
class Test050HandleProperties < Minitest::Test
def test_050_handle_properties
diff --git a/ruby/t/tc_060_explicit_close.rb b/ruby/t/tc_060_explicit_close.rb
index 20afd0de..8d103616 100644
--- a/ruby/t/tc_060_explicit_close.rb
+++ b/ruby/t/tc_060_explicit_close.rb
@@ -15,7 +15,8 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require File::join(File::dirname(__FILE__), 'test_helper')
+require 'minitest/autorun'
+require 'guestfs'
class Test060ExplicitClose < Minitest::Test
def test_060_explicit_close
diff --git a/ruby/t/tc_070_optargs.rb b/ruby/t/tc_070_optargs.rb
index a2360b2f..c2298131 100644
--- a/ruby/t/tc_070_optargs.rb
+++ b/ruby/t/tc_070_optargs.rb
@@ -15,7 +15,8 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require File::join(File::dirname(__FILE__), 'test_helper')
+require 'minitest/autorun'
+require 'guestfs'
class Test070Optargs < Minitest::Test
def test_070_optargs
diff --git a/ruby/t/tc_090_retvalues.rb b/ruby/t/tc_090_retvalues.rb
index c9a84276..d7927465 100644
--- a/ruby/t/tc_090_retvalues.rb
+++ b/ruby/t/tc_090_retvalues.rb
@@ -15,7 +15,8 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require File::join(File::dirname(__FILE__), 'test_helper')
+require 'minitest/autorun'
+require 'guestfs'
class Test090RetValues < Minitest::Test
def test_090_retvalues
diff --git a/ruby/t/tc_100_launch.rb b/ruby/t/tc_100_launch.rb
index 096cbd62..c4da234e 100644
--- a/ruby/t/tc_100_launch.rb
+++ b/ruby/t/tc_100_launch.rb
@@ -15,7 +15,8 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require File::join(File::dirname(__FILE__), 'test_helper')
+require 'minitest/autorun'
+require 'guestfs'
class Test100Launch < Minitest::Test
def test_100_launch
diff --git a/ruby/t/tc_410_close_event.rb b/ruby/t/tc_410_close_event.rb
index 9a4e0558..84cc11ab 100644
--- a/ruby/t/tc_410_close_event.rb
+++ b/ruby/t/tc_410_close_event.rb
@@ -15,7 +15,8 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require File::join(File::dirname(__FILE__), 'test_helper')
+require 'minitest/autorun'
+require 'guestfs'
class Test410CloseEvent < Minitest::Test
def test_410_close_event
diff --git a/ruby/t/tc_420_log_messages.rb b/ruby/t/tc_420_log_messages.rb
index a113c62e..fd3049a0 100644
--- a/ruby/t/tc_420_log_messages.rb
+++ b/ruby/t/tc_420_log_messages.rb
@@ -15,7 +15,8 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require File::join(File::dirname(__FILE__), 'test_helper')
+require 'minitest/autorun'
+require 'guestfs'
class Test420LogMessages < Minitest::Test
def test_420_log_messages
diff --git a/ruby/t/tc_800_rhbz507346.rb b/ruby/t/tc_800_rhbz507346.rb
index 06767352..54f7734f 100644
--- a/ruby/t/tc_800_rhbz507346.rb
+++ b/ruby/t/tc_800_rhbz507346.rb
@@ -15,7 +15,8 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-require File::join(File::dirname(__FILE__), 'test_helper')
+require 'minitest/autorun'
+require 'guestfs'
class Test800RHBZ507346 < Minitest::Test
def test_800_rhbz507346
diff --git a/ruby/t/tc_810_rhbz664558c6.rb b/ruby/t/tc_810_rhbz664558c6.rb
index 1504c070..5ffa2265 100644
--- a/ruby/t/tc_810_rhbz664558c6.rb
+++ b/ruby/t/tc_810_rhbz664558c6.rb
@@ -19,7 +19,8 @@
# the interpreter to segfault. See:
# https://bugzilla.redhat.com/show_bug.cgi?id=664558#c6
-require File::join(File::dirname(__FILE__), 'test_helper')
+require 'minitest/autorun'
+require 'guestfs'
class Test810RHBZ664558C6 < Minitest::Test
def test_810_rhbz_664558c6
diff --git a/ruby/t/tc_820_rhbz1046509.rb b/ruby/t/tc_820_rhbz1046509.rb
index 0595293d..b2a6d80b 100644
--- a/ruby/t/tc_820_rhbz1046509.rb
+++ b/ruby/t/tc_820_rhbz1046509.rb
@@ -18,7 +18,8 @@
# Test that we don't break the old ::create module function while
# fixing https://bugzilla.redhat.com/show_bug.cgi?id=1046509
-require File::join(File::dirname(__FILE__), 'test_helper')
+require 'minitest/autorun'
+require 'guestfs'
class Test820RHBZ1046509 < Minitest::Test
def _handleok(g)
diff --git a/ruby/t/test_helper.rb b/ruby/t/test_helper.rb
deleted file mode 100644
index 54f857ce..00000000
--- a/ruby/t/test_helper.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-# libguestfs Ruby bindings -*- ruby -*-
-# Copyright (C) 2009-2023 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-begin
- require 'minitest/autorun'
-rescue LoadError
- require 'test/unit'
- MiniTest = Test
- module Test
- Assertions = Unit::Assertions
- module Assertions
- alias refute_nil assert_not_nil
- end
- end
-end
-
-$:.unshift(File::join(File::dirname(__FILE__), "..", "lib"))
-$:.unshift(File::join(File::dirname(__FILE__), "..", "ext", "guestfs"))
-require 'guestfs'

View File

@ -1,63 +0,0 @@
From 7408a59c6b43253cc7323269258851fb6be287c4 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 26 Oct 2023 21:06:21 +0100
Subject: [PATCH] generator: Sort virt-customize options into alphabetical
order
(cherry picked from commit 297db5cccc1eb6e838f35d38e60fac894b372676)
---
generator/customize.ml | 34 +++++++++++++++++-----------------
1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/generator/customize.ml b/generator/customize.ml
index fe87ef5e..c3dd259e 100644
--- a/generator/customize.ml
+++ b/generator/customize.ml
@@ -510,23 +510,6 @@ You can have multiple I<--ssh-inject> options, for different users
and also for more keys for each user."
};
- { op_name = "truncate";
- op_type = String "FILE";
- op_discrim = "`Truncate";
- op_shortdesc = "Truncate a file to zero size";
- op_pod_longdesc = "\
-This command truncates C<FILE> to a zero-length file. The file must exist
-already.";
- };
-
- { op_name = "truncate-recursive";
- op_type = String "PATH";
- op_discrim = "`TruncateRecursive";
- op_shortdesc = "Recursively truncate all files in directory";
- op_pod_longdesc = "\
-This command recursively truncates all files under C<PATH> to zero-length.";
- };
-
{ op_name = "timezone";
op_type = String "TIMEZONE";
op_discrim = "`Timezone";
@@ -544,6 +527,23 @@ string like C<Europe/London>";
This command performs a L<touch(1)>-like operation on C<FILE>.";
};
+ { op_name = "truncate";
+ op_type = String "FILE";
+ op_discrim = "`Truncate";
+ op_shortdesc = "Truncate a file to zero size";
+ op_pod_longdesc = "\
+This command truncates C<FILE> to a zero-length file. The file must exist
+already.";
+ };
+
+ { op_name = "truncate-recursive";
+ op_type = String "PATH";
+ op_discrim = "`TruncateRecursive";
+ op_shortdesc = "Recursively truncate all files in directory";
+ op_pod_longdesc = "\
+This command recursively truncates all files under C<PATH> to zero-length.";
+ };
+
{ op_name = "uninstall";
op_type = StringList "PKG,PKG..";
op_discrim = "`UninstallPackages";

View File

@ -1,173 +0,0 @@
From 3cf513cab7bc93a80c8d9f1dea221cba471cafb9 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 26 Oct 2023 19:44:03 +0100
Subject: [PATCH] generator: Add new virt-customize --tar-in operation
Using 'virt-customize --tar-in some.tar:/dir -a disk.img' will unpack
'some.tar' into '/dir' in the guest. Note that this will not work for
compressed tar files as written since the underlying guestfs_tar_in
function requires the compression type to be set explicitly and
defaults to no compression (it does not auto-detect or default to
compression).
(cherry picked from commit b5f7b0ec18e30d25342bc322e571edf17a72974f)
---
common | 2 +-
generator/customize.ml | 12 ++++++++++++
2 files changed, 13 insertions(+), 1 deletion(-)
Submodule common e70d89a5..9a8ba593:
diff --git a/common/mlcustomize/customize-options.pod b/common/mlcustomize/customize-options.pod
index e658a447..ff93630d 100644
--- a/common/mlcustomize/customize-options.pod
+++ b/common/mlcustomize/customize-options.pod
@@ -427,6 +427,14 @@ the C<SELECTOR> field.
You can have multiple I<--ssh-inject> options, for different users
and also for more keys for each user.
+=item B<--tar-in> TARFILE:REMOTEDIR
+
+Copy local files or directories from a local tar file
+called C<TARFILE> into the disk image, placing them in the
+directory C<REMOTEDIR> (which must exist). Note that
+the tar file must be uncompressed (F<.tar.gz> files will not work
+here)
+
=item B<--timezone> TIMEZONE
Set the default timezone of the guest to C<TIMEZONE>. Use a location
diff --git a/common/mlcustomize/customize-synopsis.pod b/common/mlcustomize/customize-synopsis.pod
index 5031b015..bb0ce125 100644
--- a/common/mlcustomize/customize-synopsis.pod
+++ b/common/mlcustomize/customize-synopsis.pod
@@ -9,8 +9,9 @@
[--password USER:SELECTOR] [--root-password SELECTOR]
[--run SCRIPT] [--run-command 'CMD+ARGS'] [--scrub FILE]
[--sm-attach SELECTOR] [--sm-register] [--sm-remove]
- [--sm-unregister] [--ssh-inject USER[:SELECTOR]] [--truncate FILE]
- [--truncate-recursive PATH] [--timezone TIMEZONE] [--touch FILE]
+ [--sm-unregister] [--ssh-inject USER[:SELECTOR]]
+ [--tar-in TARFILE:REMOTEDIR] [--timezone TIMEZONE] [--touch FILE]
+ [--truncate FILE] [--truncate-recursive PATH]
[--uninstall PKG,PKG..] [--update] [--upload FILE:DEST]
[--write FILE:CONTENT] [--no-logfile]
[--password-crypto md5|sha256|sha512] [--no-selinux-relabel]
diff --git a/common/mlcustomize/customize_cmdline.ml b/common/mlcustomize/customize_cmdline.ml
index 3ce901db..245d9960 100644
--- a/common/mlcustomize/customize_cmdline.ml
+++ b/common/mlcustomize/customize_cmdline.ml
@@ -93,14 +93,16 @@ and op = [
(* --sm-unregister *)
| `SSHInject of string * Ssh_key.ssh_key_selector
(* --ssh-inject USER[:SELECTOR] *)
- | `Truncate of string
- (* --truncate FILE *)
- | `TruncateRecursive of string
- (* --truncate-recursive PATH *)
+ | `TarIn of string * string
+ (* --tar-in TARFILE:REMOTEDIR *)
| `Timezone of string
(* --timezone TIMEZONE *)
| `Touch of string
(* --touch FILE *)
+ | `Truncate of string
+ (* --truncate FILE *)
+ | `TruncateRecursive of string
+ (* --truncate-recursive PATH *)
| `UninstallPackages of string list
(* --uninstall PKG,PKG.. *)
| `Update
@@ -418,17 +420,16 @@ let rec argspec () =
),
Some "USER[:SELECTOR]", "Inject an ssh key so the given C<USER> will be able to log in over\nssh without supplying a password. The C<USER> must exist already\nin the guest.\n\nSee L<virt-builder(1)/SSH KEYS> for the format of\nthe C<SELECTOR> field.\n\nYou can have multiple I<--ssh-inject> options, for different users\nand also for more keys for each user.";
(
- [ L"truncate" ],
- Getopt.String (s_"FILE", fun s -> List.push_front (`Truncate s) ops),
- s_"Truncate a file to zero size"
+ [ L"tar-in" ],
+ Getopt.String (
+ s_"TARFILE:REMOTEDIR",
+ fun s ->
+ let p = split_string_pair "tar-in" s in
+ List.push_front (`TarIn p) ops
+ ),
+ s_"Copy local files or directories from a tarball into image"
),
- Some "FILE", "This command truncates C<FILE> to a zero-length file. The file must exist\nalready.";
- (
- [ L"truncate-recursive" ],
- Getopt.String (s_"PATH", fun s -> List.push_front (`TruncateRecursive s) ops),
- s_"Recursively truncate all files in directory"
- ),
- Some "PATH", "This command recursively truncates all files under C<PATH> to zero-length.";
+ Some "TARFILE:REMOTEDIR", "Copy local files or directories from a local tar file\ncalled C<TARFILE> into the disk image, placing them in the\ndirectory C<REMOTEDIR> (which must exist). Note that\nthe tar file must be uncompressed (F<.tar.gz> files will not work\nhere)";
(
[ L"timezone" ],
Getopt.String (s_"TIMEZONE", fun s -> List.push_front (`Timezone s) ops),
@@ -441,6 +442,18 @@ let rec argspec () =
s_"Run touch on a file"
),
Some "FILE", "This command performs a L<touch(1)>-like operation on C<FILE>.";
+ (
+ [ L"truncate" ],
+ Getopt.String (s_"FILE", fun s -> List.push_front (`Truncate s) ops),
+ s_"Truncate a file to zero size"
+ ),
+ Some "FILE", "This command truncates C<FILE> to a zero-length file. The file must exist\nalready.";
+ (
+ [ L"truncate-recursive" ],
+ Getopt.String (s_"PATH", fun s -> List.push_front (`TruncateRecursive s) ops),
+ s_"Recursively truncate all files in directory"
+ ),
+ Some "PATH", "This command recursively truncates all files under C<PATH> to zero-length.";
(
[ L"uninstall" ],
Getopt.String (
diff --git a/common/mlcustomize/customize_cmdline.mli b/common/mlcustomize/customize_cmdline.mli
index 112b74dc..51a156ea 100644
--- a/common/mlcustomize/customize_cmdline.mli
+++ b/common/mlcustomize/customize_cmdline.mli
@@ -85,14 +85,16 @@ and op = [
(* --sm-unregister *)
| `SSHInject of string * Ssh_key.ssh_key_selector
(* --ssh-inject USER[:SELECTOR] *)
- | `Truncate of string
- (* --truncate FILE *)
- | `TruncateRecursive of string
- (* --truncate-recursive PATH *)
+ | `TarIn of string * string
+ (* --tar-in TARFILE:REMOTEDIR *)
| `Timezone of string
(* --timezone TIMEZONE *)
| `Touch of string
(* --touch FILE *)
+ | `Truncate of string
+ (* --truncate FILE *)
+ | `TruncateRecursive of string
+ (* --truncate-recursive PATH *)
| `UninstallPackages of string list
(* --uninstall PKG,PKG.. *)
| `Update
diff --git a/generator/customize.ml b/generator/customize.ml
index c3dd259e..e64b45c0 100644
--- a/generator/customize.ml
+++ b/generator/customize.ml
@@ -510,6 +510,18 @@ You can have multiple I<--ssh-inject> options, for different users
and also for more keys for each user."
};
+ { op_name = "tar-in";
+ op_type = StringPair "TARFILE:REMOTEDIR";
+ op_discrim = "`TarIn";
+ op_shortdesc = "Copy local files or directories from a tarball into image";
+ op_pod_longdesc = "\
+Copy local files or directories from a local tar file
+called C<TARFILE> into the disk image, placing them in the
+directory C<REMOTEDIR> (which must exist). Note that
+the tar file must be uncompressed (F<.tar.gz> files will not work
+here)";
+ };
+
{ op_name = "timezone";
op_type = String "TIMEZONE";
op_discrim = "`Timezone";

View File

@ -1,271 +0,0 @@
From 8dc3b9fb23e4af1b6a5271a7d40d6c2706cf1f78 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 16 Nov 2023 10:38:59 +0000
Subject: [PATCH] New mailing list email address
(cherry picked from commit 0b8b1e4b2d70cf4ed59775c3c2d1aa42d3c29ca2)
---
.gitpublish | 2 +-
appliance/Makefile.am | 2 +-
po-docs/Makefile.am | 2 +-
po-docs/cs.po | 2 +-
po-docs/de.po | 2 +-
po-docs/en_GB.po | 2 +-
po-docs/es.po | 2 +-
po-docs/eu.po | 2 +-
po-docs/fi.po | 2 +-
po-docs/fr.po | 2 +-
po-docs/ja.po | 2 +-
po-docs/libguestfs-docs.pot | 2 +-
po-docs/nl.po | 2 +-
po-docs/pt_BR.po | 2 +-
po-docs/si.po | 2 +-
po-docs/tg.po | 2 +-
po-docs/uk.po | 2 +-
po-docs/zh_CN.po | 2 +-
python/setup.py.in | 2 +-
19 files changed, 19 insertions(+), 19 deletions(-)
diff --git a/.gitpublish b/.gitpublish
index 9775dd23..2aae0c09 100644
--- a/.gitpublish
+++ b/.gitpublish
@@ -1,3 +1,3 @@
[gitpublishprofile "default"]
base = master
-to = libguestfs@redhat.com
+to = guestfs@lists.libguestfs.org
diff --git a/appliance/Makefile.am b/appliance/Makefile.am
index 063c19f6..8cb9bd1f 100644
--- a/appliance/Makefile.am
+++ b/appliance/Makefile.am
@@ -88,7 +88,7 @@ else
if HAVE_PACMAN
QUERY_FILES_CMD := xargs pacman -Qo | sed -r 's/.* is owned by ([^ ]+) .*/\1/'
else
-$(error Error: Unknown Linux distribution "$(DISTRO)". Please add support to m4/guestfs-appliance.m4 and appliance/Makefile.am and send a patch upstream to libguestfs@redhat.com)
+$(error Error: Unknown Linux distribution "$(DISTRO)". Please add support to m4/guestfs-appliance.m4 and appliance/Makefile.am and send a patch upstream to guestfs@lists.libguestfs.org)
endif !HAVE_PACMAN
endif !HAVE_DPKG
endif !HAVE_RPM
diff --git a/po-docs/Makefile.am b/po-docs/Makefile.am
index 61c1b1c9..330b673f 100644
--- a/po-docs/Makefile.am
+++ b/po-docs/Makefile.am
@@ -46,7 +46,7 @@ libguestfs-docs.pot:
-M utf-8 -L utf-8 \
--package-name $(PACKAGE_NAME) \
--package-version $(PACKAGE_VERSION) \
- --msgid-bugs-address libguestfs@redhat.com \
+ --msgid-bugs-address guestfs@lists.libguestfs.org \
--copyright-holder "Red Hat Inc." \
-p $(abs_srcdir)/$@ \
$(patsubst %,-m %,$(shell cat $(srcdir)/podfiles))
diff --git a/po-docs/cs.po b/po-docs/cs.po
index 5618cb0f..d50e53bf 100644
--- a/po-docs/cs.po
+++ b/po-docs/cs.po
@@ -3,7 +3,7 @@
msgid ""
msgstr ""
"Project-Id-Version: libguestfs 1.39.12\n"
-"Report-Msgid-Bugs-To: libguestfs@redhat.com\n"
+"Report-Msgid-Bugs-To: guestfs@lists.libguestfs.org\n"
"POT-Creation-Date: 2020-07-06 15:46+0100\n"
"PO-Revision-Date: 2017-09-11 04:54+0000\n"
"Last-Translator: Zdenek <chmelarz@gmail.com>\n"
diff --git a/po-docs/de.po b/po-docs/de.po
index da449e9f..76abc8d3 100644
--- a/po-docs/de.po
+++ b/po-docs/de.po
@@ -7,7 +7,7 @@
msgid ""
msgstr ""
"Project-Id-Version: libguestfs 1.39.12\n"
-"Report-Msgid-Bugs-To: libguestfs@redhat.com\n"
+"Report-Msgid-Bugs-To: guestfs@lists.libguestfs.org\n"
"POT-Creation-Date: 2020-07-06 15:46+0100\n"
"PO-Revision-Date: 2021-11-18 23:16+0000\n"
"Last-Translator: Ettore Atalan <atalanttore@googlemail.com>\n"
diff --git a/po-docs/en_GB.po b/po-docs/en_GB.po
index 283402a6..75610b9e 100644
--- a/po-docs/en_GB.po
+++ b/po-docs/en_GB.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: libguestfs 1.39.12\n"
-"Report-Msgid-Bugs-To: libguestfs@redhat.com\n"
+"Report-Msgid-Bugs-To: guestfs@lists.libguestfs.org\n"
"POT-Creation-Date: 2020-07-06 15:46+0100\n"
"PO-Revision-Date: 2015-02-21 10:15+0000\n"
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
diff --git a/po-docs/es.po b/po-docs/es.po
index a163e26d..defbd61d 100644
--- a/po-docs/es.po
+++ b/po-docs/es.po
@@ -9,7 +9,7 @@
msgid ""
msgstr ""
"Project-Id-Version: libguestfs 1.39.12\n"
-"Report-Msgid-Bugs-To: libguestfs@redhat.com\n"
+"Report-Msgid-Bugs-To: guestfs@lists.libguestfs.org\n"
"POT-Creation-Date: 2020-07-06 15:46+0100\n"
"PO-Revision-Date: 2023-02-05 15:20+0000\n"
"Last-Translator: Emilio Herrera <ehespinosa57@gmail.com>\n"
diff --git a/po-docs/eu.po b/po-docs/eu.po
index 7f1f634b..63653271 100644
--- a/po-docs/eu.po
+++ b/po-docs/eu.po
@@ -7,7 +7,7 @@
msgid ""
msgstr ""
"Project-Id-Version: libguestfs 1.39.12\n"
-"Report-Msgid-Bugs-To: libguestfs@redhat.com\n"
+"Report-Msgid-Bugs-To: guestfs@lists.libguestfs.org\n"
"POT-Creation-Date: 2020-07-06 15:46+0100\n"
"PO-Revision-Date: 2015-02-21 10:17+0000\n"
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
diff --git a/po-docs/fi.po b/po-docs/fi.po
index d96bfd38..361de115 100644
--- a/po-docs/fi.po
+++ b/po-docs/fi.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: libguestfs 1.43.1\n"
-"Report-Msgid-Bugs-To: libguestfs@redhat.com\n"
+"Report-Msgid-Bugs-To: guestfs@lists.libguestfs.org\n"
"POT-Creation-Date: 2020-08-12 15:34+0200\n"
"PO-Revision-Date: 2022-12-23 18:20+0000\n"
"Last-Translator: Jan Kuparinen <copper_fin@hotmail.com>\n"
diff --git a/po-docs/fr.po b/po-docs/fr.po
index f411d189..cd903c0e 100644
--- a/po-docs/fr.po
+++ b/po-docs/fr.po
@@ -8,7 +8,7 @@
msgid ""
msgstr ""
"Project-Id-Version: libguestfs 1.39.12\n"
-"Report-Msgid-Bugs-To: libguestfs@redhat.com\n"
+"Report-Msgid-Bugs-To: guestfs@lists.libguestfs.org\n"
"POT-Creation-Date: 2020-07-06 15:46+0100\n"
"PO-Revision-Date: 2015-02-21 10:19+0000\n"
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
diff --git a/po-docs/ja.po b/po-docs/ja.po
index 4120b2de..d90437dc 100644
--- a/po-docs/ja.po
+++ b/po-docs/ja.po
@@ -12,7 +12,7 @@
msgid ""
msgstr ""
"Project-Id-Version: libguestfs 1.39.12\n"
-"Report-Msgid-Bugs-To: libguestfs@redhat.com\n"
+"Report-Msgid-Bugs-To: guestfs@lists.libguestfs.org\n"
"POT-Creation-Date: 2020-07-06 15:46+0100\n"
"PO-Revision-Date: 2017-02-24 07:33+0000\n"
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
diff --git a/po-docs/libguestfs-docs.pot b/po-docs/libguestfs-docs.pot
index 8e33712f..3954a51e 100644
--- a/po-docs/libguestfs-docs.pot
+++ b/po-docs/libguestfs-docs.pot
@@ -7,7 +7,7 @@
msgid ""
msgstr ""
"Project-Id-Version: libguestfs 1.43.1\n"
-"Report-Msgid-Bugs-To: libguestfs@redhat.com\n"
+"Report-Msgid-Bugs-To: guestfs@lists.libguestfs.org\n"
"POT-Creation-Date: 2020-08-12 15:34+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
diff --git a/po-docs/nl.po b/po-docs/nl.po
index 571f3523..0cf147ee 100644
--- a/po-docs/nl.po
+++ b/po-docs/nl.po
@@ -7,7 +7,7 @@
msgid ""
msgstr ""
"Project-Id-Version: libguestfs 1.39.12\n"
-"Report-Msgid-Bugs-To: libguestfs@redhat.com\n"
+"Report-Msgid-Bugs-To: guestfs@lists.libguestfs.org\n"
"POT-Creation-Date: 2020-07-06 15:46+0100\n"
"PO-Revision-Date: 2015-02-21 10:33+0000\n"
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
diff --git a/po-docs/pt_BR.po b/po-docs/pt_BR.po
index 87c0059f..229f49c3 100644
--- a/po-docs/pt_BR.po
+++ b/po-docs/pt_BR.po
@@ -3,7 +3,7 @@
msgid ""
msgstr ""
"Project-Id-Version: libguestfs 1.39.12\n"
-"Report-Msgid-Bugs-To: libguestfs@redhat.com\n"
+"Report-Msgid-Bugs-To: guestfs@lists.libguestfs.org\n"
"POT-Creation-Date: 2020-07-06 15:46+0100\n"
"PO-Revision-Date: 2017-01-29 09:50+0000\n"
"Last-Translator: Rodrigo de Araujo Sousa Fonseca "
diff --git a/po-docs/si.po b/po-docs/si.po
index e7327945..aa7f5f97 100644
--- a/po-docs/si.po
+++ b/po-docs/si.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: libguestfs 1.43.1\n"
-"Report-Msgid-Bugs-To: libguestfs@redhat.com\n"
+"Report-Msgid-Bugs-To: guestfs@lists.libguestfs.org\n"
"POT-Creation-Date: 2020-08-12 15:34+0200\n"
"PO-Revision-Date: 2021-08-19 07:04+0000\n"
"Last-Translator: Hela Basa <r45xveza@pm.me>\n"
diff --git a/po-docs/tg.po b/po-docs/tg.po
index 446653ab..9e6fa072 100644
--- a/po-docs/tg.po
+++ b/po-docs/tg.po
@@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: libguestfs 1.39.12\n"
-"Report-Msgid-Bugs-To: libguestfs@redhat.com\n"
+"Report-Msgid-Bugs-To: guestfs@lists.libguestfs.org\n"
"POT-Creation-Date: 2020-07-06 15:46+0100\n"
"PO-Revision-Date: 2015-02-21 10:34+0000\n"
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n"
diff --git a/po-docs/uk.po b/po-docs/uk.po
index 52b5ce56..960ea8f8 100644
--- a/po-docs/uk.po
+++ b/po-docs/uk.po
@@ -15,7 +15,7 @@
msgid ""
msgstr ""
"Project-Id-Version: libguestfs 1.39.12\n"
-"Report-Msgid-Bugs-To: libguestfs@redhat.com\n"
+"Report-Msgid-Bugs-To: guestfs@lists.libguestfs.org\n"
"POT-Creation-Date: 2020-07-06 15:46+0100\n"
"PO-Revision-Date: 2020-08-16 15:29+0000\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
diff --git a/po-docs/zh_CN.po b/po-docs/zh_CN.po
index 7c546775..0c15c1c1 100644
--- a/po-docs/zh_CN.po
+++ b/po-docs/zh_CN.po
@@ -8,7 +8,7 @@
msgid ""
msgstr ""
"Project-Id-Version: libguestfs 1.39.12\n"
-"Report-Msgid-Bugs-To: libguestfs@redhat.com\n"
+"Report-Msgid-Bugs-To: guestfs@lists.libguestfs.org\n"
"POT-Creation-Date: 2020-07-06 15:46+0100\n"
"PO-Revision-Date: 2017-07-24 08:04+0000\n"
"Last-Translator: cheng ye <18969068329@163.com>\n"
diff --git a/python/setup.py.in b/python/setup.py.in
index aa9fb7ad..17571944 100644
--- a/python/setup.py.in
+++ b/python/setup.py.in
@@ -30,7 +30,7 @@ This package contains the Python bindings for libguestfs.
""",
author='The @PACKAGE_NAME@ team',
- author_email='libguestfs@redhat.com',
+ author_email='guestfs@lists.libguestfs.org',
url='http://libguestfs.org',
license='LGPLv2+',

View File

@ -1,590 +0,0 @@
From 86408417cfe9d742b70104187e52b775e89e497e Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 16 Nov 2023 10:52:11 +0000
Subject: [PATCH] New mailing list archives
(cherry picked from commit b2f3994de26c25d61ed94d2ee3b2ea9600755ee1)
---
README | 2 +-
configure.ac | 2 +-
docs/guestfs-faq.pod | 6 +++---
docs/guestfs-hacking.pod | 2 +-
docs/guestfs-security.pod | 2 +-
docs/guestfs-testing.pod | 2 +-
po-docs/cs.po | 4 ++--
po-docs/de.po | 4 ++--
po-docs/en_GB.po | 8 ++++----
po-docs/es.po | 4 ++--
po-docs/eu.po | 4 ++--
po-docs/fi.po | 12 ++++++------
po-docs/fr.po | 4 ++--
po-docs/ja.po | 6 +++---
po-docs/libguestfs-docs.pot | 12 ++++++------
po-docs/nl.po | 4 ++--
po-docs/pt_BR.po | 4 ++--
po-docs/si.po | 12 ++++++------
po-docs/tg.po | 4 ++--
po-docs/uk.po | 6 +++---
po-docs/zh_CN.po | 4 ++--
website/index.html.in | 2 +-
22 files changed, 55 insertions(+), 55 deletions(-)
diff --git a/README b/README
index 40a7267e..b350edb5 100644
--- a/README
+++ b/README
@@ -6,7 +6,7 @@ disk images. For more information see the home page:
For discussion, development, patches, etc. please use the mailing
list:
- http://www.redhat.com/mailman/listinfo/libguestfs
+ https://lists.libguestfs.org
To find out how to build libguestfs from source, read:
diff --git a/configure.ac b/configure.ac
index b72e99cf..92479e20 100644
--- a/configure.ac
+++ b/configure.ac
@@ -321,7 +321,7 @@ echo "If any optional component is configured 'no' when you expected 'yes'"
echo "then you should check the preceding messages."
echo
echo "Please report bugs back to the mailing list:"
-echo "http://www.redhat.com/mailman/listinfo/libguestfs"
+echo "https://lists.libguestfs.org"
echo
echo "Next you should type 'make' to build the package,"
echo "then 'make check' to run the tests."
diff --git a/docs/guestfs-faq.pod b/docs/guestfs-faq.pod
index 1e83a9c5..3a03282f 100644
--- a/docs/guestfs-faq.pod
+++ b/docs/guestfs-faq.pod
@@ -106,7 +106,7 @@ contact S<Red Hat Support>: L<http://redhat.com/support>
There is a mailing list, mainly for development, but users are also
welcome to ask questions about libguestfs and the virt tools:
-L<https://www.redhat.com/mailman/listinfo/libguestfs>
+L<https://lists.libguestfs.org>
You can also talk to us on IRC channel C<#guestfs> on Libera Chat.
We're not always around, so please stay in the channel after asking
@@ -1289,7 +1289,7 @@ documented stable API.
=head2 Where do I send patches?
Please send patches to the libguestfs mailing list
-L<https://www.redhat.com/mailman/listinfo/libguestfs>. You don't have
+L<https://lists.libguestfs.org>. You don't have
to be subscribed, but there will be a delay until your posting is
manually approved.
@@ -1302,7 +1302,7 @@ prefer to have a linear history.
Large new features that you intend to contribute should be discussed
on the mailing list first
-(L<https://www.redhat.com/mailman/listinfo/libguestfs>). This avoids
+(L<https://lists.libguestfs.org>). This avoids
disappointment and wasted work if we don't think the feature would fit
into the libguestfs project.
diff --git a/docs/guestfs-hacking.pod b/docs/guestfs-hacking.pod
index e1b47ec1..987697b2 100644
--- a/docs/guestfs-hacking.pod
+++ b/docs/guestfs-hacking.pod
@@ -804,7 +804,7 @@ examining the F<tmp/valgrind*> log files carefully.
=head2 SUBMITTING PATCHES
Submit patches to the mailing list:
-L<http://www.redhat.com/mailman/listinfo/libguestfs>
+L<https://lists.libguestfs.org>
and CC to L<rjones@redhat.com>.
You do not need to subscribe to the mailing list if you dont want to.
diff --git a/docs/guestfs-security.pod b/docs/guestfs-security.pod
index afacb091..60d22952 100644
--- a/docs/guestfs-security.pod
+++ b/docs/guestfs-security.pod
@@ -15,7 +15,7 @@ L<https://access.redhat.com/security/team/contact>
If the security problem is not so serious, you can simply file a bug
(see L</BUGS> below), or send an email to our mailing list
-(L<https://www.redhat.com/mailman/listinfo/libguestfs>). You do not
+(L<https://lists.libguestfs.org>). You do not
need to subscribe to the mailing list to send email, but there will be
a delay while the message is moderated.
diff --git a/docs/guestfs-testing.pod b/docs/guestfs-testing.pod
index c7b44928..ee4b26d6 100644
--- a/docs/guestfs-testing.pod
+++ b/docs/guestfs-testing.pod
@@ -21,7 +21,7 @@ or post on the mailing list (registration is B<not> required, but if
you're not registered then you'll have to wait for a moderator to
manually approve your message):
-L<https://www.redhat.com/mailman/listinfo/libguestfs>
+L<https://lists.libguestfs.org>
=head1 TESTS
diff --git a/po-docs/cs.po b/po-docs/cs.po
index d50e53bf..60c29165 100644
--- a/po-docs/cs.po
+++ b/po-docs/cs.po
@@ -16000,7 +16000,7 @@ msgstr ""
#: ../docs/guestfs-faq.pod:1297
msgid ""
"Large new features that you intend to contribute should be discussed on the "
-"mailing list first (L<https://www.redhat.com/mailman/listinfo/libguestfs>). "
+"mailing list first (L<https://lists.libguestfs.org>). "
"This avoids disappointment and wasted work if we don't think the feature "
"would fit into the libguestfs project."
msgstr ""
@@ -38700,7 +38700,7 @@ msgstr ""
#. type: textblock
#: ../docs/guestfs-testing.pod:24
-msgid "L<https://www.redhat.com/mailman/listinfo/libguestfs>"
+msgid "L<https://lists.libguestfs.org>"
msgstr ""
#. type: =head1
diff --git a/po-docs/de.po b/po-docs/de.po
index 76abc8d3..565cd66f 100644
--- a/po-docs/de.po
+++ b/po-docs/de.po
@@ -16118,7 +16118,7 @@ msgstr ""
#: ../docs/guestfs-faq.pod:1297
msgid ""
"Large new features that you intend to contribute should be discussed on the "
-"mailing list first (L<https://www.redhat.com/mailman/listinfo/libguestfs>). "
+"mailing list first (L<https://lists.libguestfs.org>). "
"This avoids disappointment and wasted work if we don't think the feature "
"would fit into the libguestfs project."
msgstr ""
@@ -38822,7 +38822,7 @@ msgstr ""
#. type: textblock
#: ../docs/guestfs-testing.pod:24
-msgid "L<https://www.redhat.com/mailman/listinfo/libguestfs>"
+msgid "L<https://lists.libguestfs.org>"
msgstr ""
#. type: =head1
diff --git a/po-docs/en_GB.po b/po-docs/en_GB.po
index 75610b9e..31edb8bf 100644
--- a/po-docs/en_GB.po
+++ b/po-docs/en_GB.po
@@ -17054,12 +17054,12 @@ msgstr "How do I propose a feature?"
#: ../docs/guestfs-faq.pod:1297
msgid ""
"Large new features that you intend to contribute should be discussed on the "
-"mailing list first (L<https://www.redhat.com/mailman/listinfo/libguestfs>). "
+"mailing list first (L<https://lists.libguestfs.org>). "
"This avoids disappointment and wasted work if we don't think the feature "
"would fit into the libguestfs project."
msgstr ""
"Large new features that you intend to contribute should be discussed on the "
-"mailing list first (L<https://www.redhat.com/mailman/listinfo/libguestfs>). "
+"mailing list first (L<https://lists.libguestfs.org>). "
"This avoids disappointment and wasted work if we don't think the feature "
"would fit into the libguestfs project."
@@ -42254,8 +42254,8 @@ msgstr ""
#. type: textblock
#: ../docs/guestfs-testing.pod:24
-msgid "L<https://www.redhat.com/mailman/listinfo/libguestfs>"
-msgstr "L<https://www.redhat.com/mailman/listinfo/libguestfs>"
+msgid "L<https://lists.libguestfs.org>"
+msgstr "L<https://lists.libguestfs.org>"
#. type: =head1
#: ../docs/guestfs-testing.pod:26
diff --git a/po-docs/es.po b/po-docs/es.po
index defbd61d..c84192f4 100644
--- a/po-docs/es.po
+++ b/po-docs/es.po
@@ -16057,7 +16057,7 @@ msgstr ""
#: ../docs/guestfs-faq.pod:1297
msgid ""
"Large new features that you intend to contribute should be discussed on the "
-"mailing list first (L<https://www.redhat.com/mailman/listinfo/libguestfs>). "
+"mailing list first (L<https://lists.libguestfs.org>). "
"This avoids disappointment and wasted work if we don't think the feature "
"would fit into the libguestfs project."
msgstr ""
@@ -38908,7 +38908,7 @@ msgstr ""
#. type: textblock
#: ../docs/guestfs-testing.pod:24
-msgid "L<https://www.redhat.com/mailman/listinfo/libguestfs>"
+msgid "L<https://lists.libguestfs.org>"
msgstr ""
#. type: =head1
diff --git a/po-docs/eu.po b/po-docs/eu.po
index 63653271..44bc885d 100644
--- a/po-docs/eu.po
+++ b/po-docs/eu.po
@@ -15951,7 +15951,7 @@ msgstr ""
#: ../docs/guestfs-faq.pod:1297
msgid ""
"Large new features that you intend to contribute should be discussed on the "
-"mailing list first (L<https://www.redhat.com/mailman/listinfo/libguestfs>). "
+"mailing list first (L<https://lists.libguestfs.org>). "
"This avoids disappointment and wasted work if we don't think the feature "
"would fit into the libguestfs project."
msgstr ""
@@ -38651,7 +38651,7 @@ msgstr ""
#. type: textblock
#: ../docs/guestfs-testing.pod:24
-msgid "L<https://www.redhat.com/mailman/listinfo/libguestfs>"
+msgid "L<https://lists.libguestfs.org>"
msgstr ""
#. type: =head1
diff --git a/po-docs/fi.po b/po-docs/fi.po
index 361de115..3ff70b33 100644
--- a/po-docs/fi.po
+++ b/po-docs/fi.po
@@ -13507,7 +13507,7 @@ msgstr ""
msgid ""
"There is a mailing list, mainly for development, but users are also welcome "
"to ask questions about libguestfs and the virt tools: "
-"L<https://www.redhat.com/mailman/listinfo/libguestfs>"
+"L<https://lists.libguestfs.org>"
msgstr ""
#. type: textblock
@@ -15849,7 +15849,7 @@ msgstr ""
#: docs/guestfs-faq.pod:1285
msgid ""
"Please send patches to the libguestfs mailing list "
-"L<https://www.redhat.com/mailman/listinfo/libguestfs>. You don't have to be "
+"L<https://lists.libguestfs.org>. You don't have to be "
"subscribed, but there will be a delay until your posting is manually "
"approved."
msgstr ""
@@ -15872,7 +15872,7 @@ msgstr ""
#: docs/guestfs-faq.pod:1297
msgid ""
"Large new features that you intend to contribute should be discussed on the "
-"mailing list first (L<https://www.redhat.com/mailman/listinfo/libguestfs>). "
+"mailing list first (L<https://lists.libguestfs.org>). "
"This avoids disappointment and wasted work if we don't think the feature "
"would fit into the libguestfs project."
msgstr ""
@@ -17816,7 +17816,7 @@ msgstr ""
#: docs/guestfs-hacking.pod:840
msgid ""
"Submit patches to the mailing list: "
-"L<http://www.redhat.com/mailman/listinfo/libguestfs> and CC to "
+"L<https://lists.libguestfs.org> and CC to "
"L<rjones@redhat.com>."
msgstr ""
@@ -37995,7 +37995,7 @@ msgstr ""
msgid ""
"If the security problem is not so serious, you can simply file a bug (see "
"L</BUGS> below), or send an email to our mailing list "
-"(L<https://www.redhat.com/mailman/listinfo/libguestfs>). You do not need to "
+"(L<https://lists.libguestfs.org>). You do not need to "
"subscribe to the mailing list to send email, but there will be a delay while "
"the message is moderated."
msgstr ""
@@ -38598,7 +38598,7 @@ msgstr ""
#. type: textblock
#: docs/guestfs-testing.pod:24
-msgid "L<https://www.redhat.com/mailman/listinfo/libguestfs>"
+msgid "L<https://lists.libguestfs.org>"
msgstr ""
#. type: =head1
diff --git a/po-docs/fr.po b/po-docs/fr.po
index cd903c0e..34b6149e 100644
--- a/po-docs/fr.po
+++ b/po-docs/fr.po
@@ -16363,7 +16363,7 @@ msgstr ""
#: ../docs/guestfs-faq.pod:1297
msgid ""
"Large new features that you intend to contribute should be discussed on the "
-"mailing list first (L<https://www.redhat.com/mailman/listinfo/libguestfs>). "
+"mailing list first (L<https://lists.libguestfs.org>). "
"This avoids disappointment and wasted work if we don't think the feature "
"would fit into the libguestfs project."
msgstr ""
@@ -40728,7 +40728,7 @@ msgstr ""
#. type: textblock
#: ../docs/guestfs-testing.pod:24
-msgid "L<https://www.redhat.com/mailman/listinfo/libguestfs>"
+msgid "L<https://lists.libguestfs.org>"
msgstr ""
#. type: =head1
diff --git a/po-docs/ja.po b/po-docs/ja.po
index d90437dc..d00d73d2 100644
--- a/po-docs/ja.po
+++ b/po-docs/ja.po
@@ -16574,7 +16574,7 @@ msgstr ""
#: ../docs/guestfs-faq.pod:1297
msgid ""
"Large new features that you intend to contribute should be discussed on the "
-"mailing list first (L<https://www.redhat.com/mailman/listinfo/libguestfs>). "
+"mailing list first (L<https://lists.libguestfs.org>). "
"This avoids disappointment and wasted work if we don't think the feature "
"would fit into the libguestfs project."
msgstr ""
@@ -39859,8 +39859,8 @@ msgstr ""
#. type: textblock
#: ../docs/guestfs-testing.pod:24
-msgid "L<https://www.redhat.com/mailman/listinfo/libguestfs>"
-msgstr "L<https://www.redhat.com/mailman/listinfo/libguestfs>"
+msgid "L<https://lists.libguestfs.org>"
+msgstr "L<https://lists.libguestfs.org>"
#. type: =head1
#: ../docs/guestfs-testing.pod:26
diff --git a/po-docs/libguestfs-docs.pot b/po-docs/libguestfs-docs.pot
index 3954a51e..56d0777b 100644
--- a/po-docs/libguestfs-docs.pot
+++ b/po-docs/libguestfs-docs.pot
@@ -13453,7 +13453,7 @@ msgstr ""
msgid ""
"There is a mailing list, mainly for development, but users are also welcome "
"to ask questions about libguestfs and the virt tools: "
-"L<https://www.redhat.com/mailman/listinfo/libguestfs>"
+"L<https://lists.libguestfs.org>"
msgstr ""
#. type: textblock
@@ -15795,7 +15795,7 @@ msgstr ""
#: docs/guestfs-faq.pod:1285
msgid ""
"Please send patches to the libguestfs mailing list "
-"L<https://www.redhat.com/mailman/listinfo/libguestfs>. You don't have to be "
+"L<https://lists.libguestfs.org>. You don't have to be "
"subscribed, but there will be a delay until your posting is manually "
"approved."
msgstr ""
@@ -15818,7 +15818,7 @@ msgstr ""
#: docs/guestfs-faq.pod:1297
msgid ""
"Large new features that you intend to contribute should be discussed on the "
-"mailing list first (L<https://www.redhat.com/mailman/listinfo/libguestfs>). "
+"mailing list first (L<https://lists.libguestfs.org>). "
"This avoids disappointment and wasted work if we don't think the feature "
"would fit into the libguestfs project."
msgstr ""
@@ -17762,7 +17762,7 @@ msgstr ""
#: docs/guestfs-hacking.pod:840
msgid ""
"Submit patches to the mailing list: "
-"L<http://www.redhat.com/mailman/listinfo/libguestfs> and CC to "
+"L<https://lists.libguestfs.org> and CC to "
"L<rjones@redhat.com>."
msgstr ""
@@ -37939,7 +37939,7 @@ msgstr ""
msgid ""
"If the security problem is not so serious, you can simply file a bug (see "
"L</BUGS> below), or send an email to our mailing list "
-"(L<https://www.redhat.com/mailman/listinfo/libguestfs>). You do not need to "
+"(L<https://lists.libguestfs.org>). You do not need to "
"subscribe to the mailing list to send email, but there will be a delay while "
"the message is moderated."
msgstr ""
@@ -38542,7 +38542,7 @@ msgstr ""
#. type: textblock
#: docs/guestfs-testing.pod:24
-msgid "L<https://www.redhat.com/mailman/listinfo/libguestfs>"
+msgid "L<https://lists.libguestfs.org>"
msgstr ""
#. type: =head1
diff --git a/po-docs/nl.po b/po-docs/nl.po
index 0cf147ee..1f8ac7d0 100644
--- a/po-docs/nl.po
+++ b/po-docs/nl.po
@@ -15951,7 +15951,7 @@ msgstr ""
#: ../docs/guestfs-faq.pod:1297
msgid ""
"Large new features that you intend to contribute should be discussed on the "
-"mailing list first (L<https://www.redhat.com/mailman/listinfo/libguestfs>). "
+"mailing list first (L<https://lists.libguestfs.org>). "
"This avoids disappointment and wasted work if we don't think the feature "
"would fit into the libguestfs project."
msgstr ""
@@ -38651,7 +38651,7 @@ msgstr ""
#. type: textblock
#: ../docs/guestfs-testing.pod:24
-msgid "L<https://www.redhat.com/mailman/listinfo/libguestfs>"
+msgid "L<https://lists.libguestfs.org>"
msgstr ""
#. type: =head1
diff --git a/po-docs/pt_BR.po b/po-docs/pt_BR.po
index 229f49c3..d69895cf 100644
--- a/po-docs/pt_BR.po
+++ b/po-docs/pt_BR.po
@@ -15947,7 +15947,7 @@ msgstr ""
#: ../docs/guestfs-faq.pod:1297
msgid ""
"Large new features that you intend to contribute should be discussed on the "
-"mailing list first (L<https://www.redhat.com/mailman/listinfo/libguestfs>). "
+"mailing list first (L<https://lists.libguestfs.org>). "
"This avoids disappointment and wasted work if we don't think the feature "
"would fit into the libguestfs project."
msgstr ""
@@ -38647,7 +38647,7 @@ msgstr ""
#. type: textblock
#: ../docs/guestfs-testing.pod:24
-msgid "L<https://www.redhat.com/mailman/listinfo/libguestfs>"
+msgid "L<https://lists.libguestfs.org>"
msgstr ""
#. type: =head1
diff --git a/po-docs/si.po b/po-docs/si.po
index aa7f5f97..de16c4ac 100644
--- a/po-docs/si.po
+++ b/po-docs/si.po
@@ -13455,7 +13455,7 @@ msgstr ""
msgid ""
"There is a mailing list, mainly for development, but users are also welcome "
"to ask questions about libguestfs and the virt tools: "
-"L<https://www.redhat.com/mailman/listinfo/libguestfs>"
+"L<https://lists.libguestfs.org>"
msgstr ""
#. type: textblock
@@ -15797,7 +15797,7 @@ msgstr ""
#: docs/guestfs-faq.pod:1285
msgid ""
"Please send patches to the libguestfs mailing list "
-"L<https://www.redhat.com/mailman/listinfo/libguestfs>. You don't have to be "
+"L<https://lists.libguestfs.org>. You don't have to be "
"subscribed, but there will be a delay until your posting is manually "
"approved."
msgstr ""
@@ -15820,7 +15820,7 @@ msgstr ""
#: docs/guestfs-faq.pod:1297
msgid ""
"Large new features that you intend to contribute should be discussed on the "
-"mailing list first (L<https://www.redhat.com/mailman/listinfo/libguestfs>). "
+"mailing list first (L<https://lists.libguestfs.org>). "
"This avoids disappointment and wasted work if we don't think the feature "
"would fit into the libguestfs project."
msgstr ""
@@ -17764,7 +17764,7 @@ msgstr ""
#: docs/guestfs-hacking.pod:840
msgid ""
"Submit patches to the mailing list: "
-"L<http://www.redhat.com/mailman/listinfo/libguestfs> and CC to "
+"L<https://lists.libguestfs.org> and CC to "
"L<rjones@redhat.com>."
msgstr ""
@@ -37941,7 +37941,7 @@ msgstr ""
msgid ""
"If the security problem is not so serious, you can simply file a bug (see "
"L</BUGS> below), or send an email to our mailing list "
-"(L<https://www.redhat.com/mailman/listinfo/libguestfs>). You do not need to "
+"(L<https://lists.libguestfs.org>). You do not need to "
"subscribe to the mailing list to send email, but there will be a delay while "
"the message is moderated."
msgstr ""
@@ -38544,7 +38544,7 @@ msgstr ""
#. type: textblock
#: docs/guestfs-testing.pod:24
-msgid "L<https://www.redhat.com/mailman/listinfo/libguestfs>"
+msgid "L<https://lists.libguestfs.org>"
msgstr ""
#. type: =head1
diff --git a/po-docs/tg.po b/po-docs/tg.po
index 9e6fa072..80db7183 100644
--- a/po-docs/tg.po
+++ b/po-docs/tg.po
@@ -15952,7 +15952,7 @@ msgstr ""
#: ../docs/guestfs-faq.pod:1297
msgid ""
"Large new features that you intend to contribute should be discussed on the "
-"mailing list first (L<https://www.redhat.com/mailman/listinfo/libguestfs>). "
+"mailing list first (L<https://lists.libguestfs.org>). "
"This avoids disappointment and wasted work if we don't think the feature "
"would fit into the libguestfs project."
msgstr ""
@@ -38652,7 +38652,7 @@ msgstr ""
#. type: textblock
#: ../docs/guestfs-testing.pod:24
-msgid "L<https://www.redhat.com/mailman/listinfo/libguestfs>"
+msgid "L<https://lists.libguestfs.org>"
msgstr ""
#. type: =head1
diff --git a/po-docs/uk.po b/po-docs/uk.po
index 960ea8f8..40c96852 100644
--- a/po-docs/uk.po
+++ b/po-docs/uk.po
@@ -19726,7 +19726,7 @@ msgstr "Як запропонувати нову можливість?"
#: ../docs/guestfs-faq.pod:1297
msgid ""
"Large new features that you intend to contribute should be discussed on the "
-"mailing list first (L<https://www.redhat.com/mailman/listinfo/libguestfs>). "
+"mailing list first (L<https://lists.libguestfs.org>). "
"This avoids disappointment and wasted work if we don't think the feature "
"would fit into the libguestfs project."
msgstr ""
@@ -47713,8 +47713,8 @@ msgstr ""
#. type: textblock
#: ../docs/guestfs-testing.pod:24
-msgid "L<https://www.redhat.com/mailman/listinfo/libguestfs>"
-msgstr "L<https://www.redhat.com/mailman/listinfo/libguestfs>"
+msgid "L<https://lists.libguestfs.org>"
+msgstr "L<https://lists.libguestfs.org>"
#. type: =head1
#: ../docs/guestfs-testing.pod:26
diff --git a/po-docs/zh_CN.po b/po-docs/zh_CN.po
index 0c15c1c1..1ad0e1cd 100644
--- a/po-docs/zh_CN.po
+++ b/po-docs/zh_CN.po
@@ -15954,7 +15954,7 @@ msgstr ""
#: ../docs/guestfs-faq.pod:1297
msgid ""
"Large new features that you intend to contribute should be discussed on the "
-"mailing list first (L<https://www.redhat.com/mailman/listinfo/libguestfs>). "
+"mailing list first (L<https://lists.libguestfs.org>). "
"This avoids disappointment and wasted work if we don't think the feature "
"would fit into the libguestfs project."
msgstr ""
@@ -38654,7 +38654,7 @@ msgstr ""
#. type: textblock
#: ../docs/guestfs-testing.pod:24
-msgid "L<https://www.redhat.com/mailman/listinfo/libguestfs>"
+msgid "L<https://lists.libguestfs.org>"
msgstr ""
#. type: =head1
diff --git a/website/index.html.in b/website/index.html.in
index 91088b59..e7a03d6d 100644
--- a/website/index.html.in
+++ b/website/index.html.in
@@ -54,7 +54,7 @@ guestfish --ro -i -a disk.img
<p>
Join us on
-the <a href="http://www.redhat.com/mailman/listinfo/libguestfs">libguestfs
+the <a href="https://lists.libguestfs.org">libguestfs
mailing list</a>, or on IRC channel <code>#guestfs</code>
on <a href="https://libera.chat/">Libera Chat</a>.
</p>

View File

@ -1,25 +0,0 @@
From f6f2f56535a54a90a5c02974eba09bb7a8f0709c Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 27 Nov 2023 14:04:33 +0000
Subject: [PATCH] lib: Include <libxml/parser.h> for xmlReadMemory
Since libxml2 2.12.1 including this header is required to have this
function declared.
(cherry picked from commit 02c39dc5e8109ddb911d90759883a504008ba509)
---
lib/launch-libvirt.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/lib/launch-libvirt.c b/lib/launch-libvirt.c
index d4bf1a8f..79465dd4 100644
--- a/lib/launch-libvirt.c
+++ b/lib/launch-libvirt.c
@@ -38,6 +38,7 @@
#include <libvirt/virterror.h>
#endif
+#include <libxml/parser.h>
#include <libxml/xmlwriter.h>
#include <libxml/xpath.h>

View File

@ -1,132 +0,0 @@
From 836b63ce6d6a47f0d8179ccd3c96ce152396ba77 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 13 Dec 2023 22:50:56 +0000
Subject: [PATCH] ocaml: Use Gc.finalise instead of a C finalizer
Since OCaml 5.1.1, changes to custom blocks caused C finalizers that
call caml_enter_blocking_section to stop working (if they ever did
before). They are relatively inflexible compared to registering an
OCaml finalizer (Gc.finalise) to call Guestfs.close, so use that
instead.
Suggested-by: Guillaume Munch-Maccagnoni
See: https://github.com/ocaml/ocaml/issues/12820
See: https://gitlab.com/nbdkit/libnbd/-/commit/db48794fa89547a4799b832331e82b4b8b98f03d
(cherry picked from commit 61418535ad63b5a2a91f1caf4703d7134834e4dd)
---
generator/OCaml.ml | 7 ++++-
ocaml/guestfs-c.c | 69 +++++++++++++++++++++-------------------------
2 files changed, 37 insertions(+), 39 deletions(-)
diff --git a/generator/OCaml.ml b/generator/OCaml.ml
index 07ccd269..1e6f603a 100644
--- a/generator/OCaml.ml
+++ b/generator/OCaml.ml
@@ -312,10 +312,15 @@ type t
exception Error of string
exception Handle_closed of string
-external create : ?environment:bool -> ?close_on_exit:bool -> unit -> t =
+external _create : ?environment:bool -> ?close_on_exit:bool -> unit -> t =
\"guestfs_int_ocaml_create\"
external close : t -> unit = \"guestfs_int_ocaml_close\"
+let create ?environment ?close_on_exit () =
+ let g = _create ?environment ?close_on_exit () in
+ Gc.finalise close g;
+ g
+
type event =
";
List.iter (
diff --git a/ocaml/guestfs-c.c b/ocaml/guestfs-c.c
index 8a8761e8..700c33ab 100644
--- a/ocaml/guestfs-c.c
+++ b/ocaml/guestfs-c.c
@@ -61,43 +61,10 @@ value guestfs_int_ocaml_delete_event_callback (value gv, value eh);
value guestfs_int_ocaml_event_to_string (value events);
value guestfs_int_ocaml_last_errno (value gv);
-/* Allocate handles and deal with finalization. */
-static void
-guestfs_finalize (value gv)
-{
- guestfs_h *g = Guestfs_val (gv);
-
- if (g) {
- /* There is a nasty, difficult to solve case here where the
- * user deletes events in one of the callbacks that we are
- * about to invoke, resulting in a double-free. XXX
- */
- size_t len;
- value **roots = get_all_event_callbacks (g, &len);
-
- /* Close the handle: this could invoke callbacks from the list
- * above, which is why we don't want to delete them before
- * closing the handle.
- */
- caml_release_runtime_system ();
- guestfs_close (g);
- caml_acquire_runtime_system ();
-
- /* Now unregister the global roots. */
- if (roots && len > 0) {
- size_t i;
- for (i = 0; i < len; ++i) {
- caml_remove_generational_global_root (roots[i]);
- free (roots[i]);
- }
- free (roots);
- }
- }
-}
-
+/* Allocate handles. */
static struct custom_operations guestfs_custom_operations = {
(char *) "guestfs_custom_operations",
- guestfs_finalize,
+ custom_finalize_default,
custom_compare_default,
custom_hash_default,
custom_serialize_default,
@@ -179,11 +146,37 @@ value
guestfs_int_ocaml_close (value gv)
{
CAMLparam1 (gv);
+ guestfs_h *g = Guestfs_val (gv);
- guestfs_finalize (gv);
+ if (g) {
+ /* There is a nasty, difficult to solve case here where the
+ * user deletes events in one of the callbacks that we are
+ * about to invoke, resulting in a double-free. XXX
+ */
+ size_t len;
+ value **roots = get_all_event_callbacks (g, &len);
- /* So we don't double-free in the finalizer. */
- Guestfs_val (gv) = NULL;
+ /* Close the handle: this could invoke callbacks from the list
+ * above, which is why we don't want to delete them before
+ * closing the handle.
+ */
+ caml_release_runtime_system ();
+ guestfs_close (g);
+ caml_acquire_runtime_system ();
+
+ /* Now unregister the global roots. */
+ if (roots && len > 0) {
+ size_t i;
+ for (i = 0; i < len; ++i) {
+ caml_remove_generational_global_root (roots[i]);
+ free (roots[i]);
+ }
+ free (roots);
+ }
+
+ /* So we don't double-free. */
+ Guestfs_val (gv) = NULL;
+ }
CAMLreturn (Val_unit);
}

View File

@ -1,39 +0,0 @@
From a534de4f269ea3c2671b99172063e872204fb978 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 14 Dec 2023 08:33:10 +0000
Subject: [PATCH] ocaml: Nullify custom block before releasing runtime lock
Avoids a potential, though if possible then very rare, double free
path.
Suggested-by: Guillaume Munch-Maccagnoni
See: https://github.com/ocaml/ocaml/issues/12820
(cherry picked from commit e93fd7e8acf34192c0d1b70611e3474dde346941)
---
ocaml/guestfs-c.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/ocaml/guestfs-c.c b/ocaml/guestfs-c.c
index 700c33ab..ea9a0598 100644
--- a/ocaml/guestfs-c.c
+++ b/ocaml/guestfs-c.c
@@ -156,6 +156,9 @@ guestfs_int_ocaml_close (value gv)
size_t len;
value **roots = get_all_event_callbacks (g, &len);
+ /* So we don't double-free. */
+ Guestfs_val (gv) = NULL;
+
/* Close the handle: this could invoke callbacks from the list
* above, which is why we don't want to delete them before
* closing the handle.
@@ -173,9 +176,6 @@ guestfs_int_ocaml_close (value gv)
}
free (roots);
}
-
- /* So we don't double-free. */
- Guestfs_val (gv) = NULL;
}
CAMLreturn (Val_unit);

View File

@ -1,162 +0,0 @@
From 7073e06b2e45ad1544e715d308662a00a6aa20ae Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 14 Dec 2023 09:03:49 +0000
Subject: [PATCH] Update common submodule
The list of patches is below. The one which matters for guestfish is
addition of --key all:... selector.
Andrey Drobyshev (1):
mldrivers: look for bootloader config in /boot/grub/grub.cfg in case of UEFI
Richard W.M. Jones (5):
mlxml: Include <libxml/parser.h> for xmlReadMemory
options/keys.c: Rewrite confusing match statement
options: Rewrite --key documentation fragment
options: Allow --key all:SELECTOR to be used to match any device
mltools/libosinfo-c.c: Fix off-by-one error
Fixes: https://issues.redhat.com/browse/RHEL-19367
(cherry picked from commit 7fd41b5a02b7a9d217150fa49940115a98aae329)
---
common | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Submodule common 9a8ba593..0dba002c:
diff --git a/common/mldrivers/linux_bootloaders.ml b/common/mldrivers/linux_bootloaders.ml
index 6f8857ef..91c5ab9e 100644
--- a/common/mldrivers/linux_bootloaders.ml
+++ b/common/mldrivers/linux_bootloaders.ml
@@ -375,6 +375,18 @@ let detect_bootloader (g : G.guestfs) root i_firmware =
with G.Error msg ->
error (f_"could not find bootloader mount point (%s): %s") mp msg in
+ (*
+ * Workaround for older UEFI-based Debian which may not have
+ * /boot/efi/EFI/debian/grub.cfg.
+ *)
+ let paths =
+ if g#exists "/boot/grub/grub.cfg" then
+ match i_firmware with
+ | Firmware.I_BIOS -> paths
+ | I_UEFI _ -> paths @ ["/boot/grub/grub.cfg"]
+ else paths
+ in
+
(* We can determine if the bootloader config file is grub 1 or
* grub 2 just by looking at the filename.
*)
diff --git a/common/mltools/libosinfo-c.c b/common/mltools/libosinfo-c.c
index 93357fd9..a48c8989 100644
--- a/common/mltools/libosinfo-c.c
+++ b/common/mltools/libosinfo-c.c
@@ -296,7 +296,7 @@ v2v_osinfo_os_get_device_drivers (value osv)
driver = OSINFO_DEVICE_DRIVER(osinfo_list_get_nth (OSINFO_LIST(list), i));
- vi = caml_alloc (6, 0);
+ vi = caml_alloc (7, 0);
str = osinfo_device_driver_get_architecture (driver);
copyv = caml_copy_string (str);
Store_field (vi, 0, copyv);
diff --git a/common/mlxml/xml-c.c b/common/mlxml/xml-c.c
index 715c3bb2..e024bd8a 100644
--- a/common/mlxml/xml-c.c
+++ b/common/mlxml/xml-c.c
@@ -34,6 +34,7 @@
#include <caml/memory.h>
#include <caml/mlvalues.h>
+#include <libxml/parser.h>
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>
#include <libxml/uri.h>
diff --git a/common/options/key-option.pod b/common/options/key-option.pod
index 6bc04df1..1470d863 100644
--- a/common/options/key-option.pod
+++ b/common/options/key-option.pod
@@ -1,22 +1,37 @@
=item B<--key> SELECTOR
Specify a key for LUKS, to automatically open a LUKS device when using
-the inspection. C<ID> can be either the libguestfs device name, or
-the UUID of the LUKS device.
+the inspection.
=over 4
-=item B<--key> C<ID>:key:KEY_STRING
+=item B<--key> NAMEB<:key:>KEY_STRING
+
+=item B<--key> UUIDB<:key:>KEY_STRING
+
+=item B<--key> B<all:key:>KEY_STRING
+
+C<NAME> is the libguestfs device name (eg. C</dev/sda1>). C<UUID> is
+the device UUID. C<all> means try the key against any encrypted
+device.
Use the specified C<KEY_STRING> as passphrase.
-=item B<--key> C<ID>:file:FILENAME
+=item B<--key> NAMEB<:file:>FILENAME
+
+=item B<--key> UUIDB<:file:>FILENAME
+
+=item B<--key> B<all:file:>FILENAME
Read the passphrase from F<FILENAME>.
-=item B<--key> C<ID>:clevis
+=item B<--key> NAMEB<:clevis>
-Attempt passphrase-less unlocking for C<ID> with Clevis, over the
+=item B<--key> UUIDB<:clevis>
+
+=item B<--key> B<all:clevis>
+
+Attempt passphrase-less unlocking for the device with Clevis, over the
network. Please refer to L<guestfs(3)/ENCRYPTED DISKS> for more
information on network-bound disk encryption (NBDE).
diff --git a/common/options/keys.c b/common/options/keys.c
index 52b27369..87acba51 100644
--- a/common/options/keys.c
+++ b/common/options/keys.c
@@ -20,6 +20,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include <stdbool.h>
#include <unistd.h>
#include <termios.h>
#include <string.h>
@@ -152,9 +153,13 @@ get_keys (struct key_store *ks, const char *device, const char *uuid,
if (ks) {
for (i = 0; i < ks->nr_keys; ++i) {
struct key_store_key *key = &ks->keys[i];
+ bool key_id_matches_this_device;
- if (STRNEQ (key->id, device) && (!uuid || STRNEQ (key->id, uuid)))
- continue;
+ key_id_matches_this_device =
+ STREQ (key->id, "all") || /* special string "all" matches any device */
+ STREQ (key->id, device) ||
+ (uuid && STREQ (key->id, uuid));
+ if (!key_id_matches_this_device) continue;
switch (key->type) {
case key_string:
diff --git a/common/options/options.h b/common/options/options.h
index 94e8b9ee..dcb15c28 100644
--- a/common/options/options.h
+++ b/common/options/options.h
@@ -109,6 +109,8 @@ struct key_store_key {
* device name, or the UUID.
*
* There may be multiple matching devices in the list.
+ *
+ * This may be the special string "all" which matches any device.
*/
char *id;

View File

@ -1,35 +0,0 @@
From 5de9915acd31ffe430adc0df497173032560311c Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Thu, 14 Dec 2023 09:15:08 +0000
Subject: [PATCH] tests: Test guestfish --key all:... selector
(cherry picked from commit 40f43cc8ea6bd556749ee7ba280971aa8b043d27)
---
.../luks/test-key-option-inspect-luks-on-lvm.sh | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/tests/luks/test-key-option-inspect-luks-on-lvm.sh b/tests/luks/test-key-option-inspect-luks-on-lvm.sh
index 932862b1..2b60c797 100755
--- a/tests/luks/test-key-option-inspect-luks-on-lvm.sh
+++ b/tests/luks/test-key-option-inspect-luks-on-lvm.sh
@@ -119,3 +119,20 @@ eval "$fish_ref"
# Repeat the test.
check_filesystems
+
+# Exit the current guestfish background process.
+guestfish --remote -- exit
+GUESTFISH_PID=
+
+# Test the --key all:... selector.
+keys_by_mapper_lvname=(
+ --key all:key:FEDORA-Root
+ --key all:key:FEDORA-LV1
+ --key all:key:FEDORA-LV2
+ --key all:key:FEDORA-LV3
+)
+fish_ref=$("${guestfish[@]}" "${keys_by_mapper_lvname[@]}")
+eval "$fish_ref"
+
+# Repeat the test.
+check_filesystems

View File

@ -1,44 +0,0 @@
From 118b93a189be2d39d2dc20ef059c9b38c60fe8be Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Fri, 19 Jan 2024 13:18:00 +0000
Subject: [PATCH] generator/customize.ml: Split --chown parameter on ':'
character
The previous code split it on ',' which was completely wrong.
(It reveals the lack of testing however).
Fixes: commit c08032ebe2763f5e9ce5b14e003721475219d390
Reported-by: Yongkui Guo
(cherry picked from commit e9a728bb22dfa1de5328fbbe7d6d7acad2dbed64)
---
common | 2 +-
generator/customize.ml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
Submodule common 0dba002c..54869c98:
diff --git a/common/mlcustomize/customize_cmdline.ml b/common/mlcustomize/customize_cmdline.ml
index 245d9960..48ee3344 100644
--- a/common/mlcustomize/customize_cmdline.ml
+++ b/common/mlcustomize/customize_cmdline.ml
@@ -157,7 +157,7 @@ let rec argspec () =
let len = String.length arg in
String.sub arg 0 i, String.sub arg (i+1) (len-(i+1))
and split_string_triplet option_name arg =
- match String.nsplit ~max:3 "," arg with
+ match String.nsplit ~max:3 ":" arg with
| [a; b; c] -> a, b, c
| _ ->
error (f_"invalid format for '--%s' parameter, see the man page")
diff --git a/generator/customize.ml b/generator/customize.ml
index e64b45c0..e2c4b605 100644
--- a/generator/customize.ml
+++ b/generator/customize.ml
@@ -775,7 +775,7 @@ let rec argspec () =
let len = String.length arg in
String.sub arg 0 i, String.sub arg (i+1) (len-(i+1))
and split_string_triplet option_name arg =
- match String.nsplit ~max:3 \",\" arg with
+ match String.nsplit ~max:3 \":\" arg with
| [a; b; c] -> a, b, c
| _ ->
error (f_\"invalid format for '--%%s' parameter, see the man page\")

View File

@ -1,65 +0,0 @@
From f1ced749d4b714e98c82a971ac60148f95312812 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 24 Apr 2024 12:23:34 +0100
Subject: [PATCH] Update common submodule
In particular pick this:
commit 93a7f3af5c23ece6a8e092827ed5928a8973fd3c
Author: Richard W.M. Jones <rjones@redhat.com>
Date: Wed Apr 24 12:08:01 2024 +0100
options: Allow nbd+unix:// URIs
(cherry picked from commit 7968de46f17eed7f18c200c6528ebdfec5c3f279)
---
common | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Submodule common 54869c98..93a7f3af:
diff --git a/common/options/uri.c b/common/options/uri.c
index 84d393c1..9180d6a2 100644
--- a/common/options/uri.c
+++ b/common/options/uri.c
@@ -99,7 +99,7 @@ is_uri (const char *arg)
return 0;
for (p--; p >= arg; p--) {
- if (!c_islower (*p))
+ if (! (c_islower (*p) || *p == '+'))
return 0;
}
@@ -148,7 +148,10 @@ parse (const char *arg, char **path_ret, char **protocol_ret,
}
*/
- *protocol_ret = strdup (uri->scheme);
+ if (STREQ (uri->scheme, "nbd+unix"))
+ *protocol_ret = strdup ("nbd");
+ else
+ *protocol_ret = strdup (uri->scheme);
if (*protocol_ret == NULL) {
perror ("strdup: protocol");
return -1;
@@ -194,7 +197,7 @@ parse (const char *arg, char **path_ret, char **protocol_ret,
if (path && path[0] == '/' &&
(STREQ (uri->scheme, "gluster") ||
STREQ (uri->scheme, "iscsi") ||
- STREQ (uri->scheme, "nbd") ||
+ STRPREFIX (uri->scheme, "nbd") ||
STREQ (uri->scheme, "rbd") ||
STREQ (uri->scheme, "sheepdog")))
path++;
diff --git a/common/progress/progress.c b/common/progress/progress.c
index e4b30663..5848abd7 100644
--- a/common/progress/progress.c
+++ b/common/progress/progress.c
@@ -123,6 +123,7 @@ progress_bar_init (unsigned flags)
bar->machine_readable = 1;
bar->utf8_mode = 0;
bar->have_terminfo = 0;
+ bar->fp = NULL;
} else {
bar->machine_readable = 0;

View File

@ -1,86 +0,0 @@
From 04a45af93d21880e54a386386313100a04b91ca7 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 8 Jul 2024 14:37:22 +0100
Subject: [PATCH] New APIs: findfs_partuuid and findfs_partlabel
These search for partitions by UUID or label (name). They only work
for GPT.
(cherry picked from commit 1816651f3c138600ad2e5ba0d6437b4753333818)
---
daemon/findfs.ml | 4 ++++
generator/actions_core.ml | 24 ++++++++++++++++++++++++
generator/proc_nr.ml | 2 ++
lib/MAX_PROC_NR | 2 +-
4 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/daemon/findfs.ml b/daemon/findfs.ml
index cf2ba4a8..a94e0ce7 100644
--- a/daemon/findfs.ml
+++ b/daemon/findfs.ml
@@ -27,6 +27,10 @@ let rec findfs_uuid uuid =
findfs "UUID" uuid
and findfs_label label =
findfs "LABEL" label
+and findfs_partuuid uuid =
+ findfs "PARTUUID" uuid
+and findfs_partlabel label =
+ findfs "PARTLABEL" label
and findfs tag str =
(* Kill the cache file, forcing blkid to reread values from the
diff --git a/generator/actions_core.ml b/generator/actions_core.ml
index 314bb0ae..c3afe810 100644
--- a/generator/actions_core.ml
+++ b/generator/actions_core.ml
@@ -5688,6 +5688,30 @@ filesystem can be found.
To find the label of a filesystem, use C<guestfs_vfs_label>." };
+ { defaults with
+ name = "findfs_partuuid"; added = (1, 5, 3);
+ style = RString (RDevice, "device"), [String (PlainString, "uuid")], [];
+ impl = OCaml "Findfs.findfs_partuuid";
+ shortdesc = "find a partition by UUID";
+ longdesc = "\
+This command searches the partitions and returns the one
+which has the given partition UUID. An error is returned if no such
+partition can be found.
+
+To find the UUID of a partition, use C<guestfs_blkid> (C<PART_ENTRY_UUID>)." };
+
+ { defaults with
+ name = "findfs_partlabel"; added = (1, 5, 3);
+ style = RString (RDevice, "device"), [String (PlainString, "label")], [];
+ impl = OCaml "Findfs.findfs_partlabel";
+ shortdesc = "find a partition by label";
+ longdesc = "\
+This command searches the partitions and returns the one
+which has the given label. An error is returned if no such
+partition can be found.
+
+To find the label of a partition, use C<guestfs_blkid> (C<PART_ENTRY_NAME>)." };
+
{ defaults with
name = "is_chardev"; added = (1, 5, 10);
style = RBool "flag", [String (Pathname, "path")], [OBool "followsymlinks"];
diff --git a/generator/proc_nr.ml b/generator/proc_nr.ml
index f71a849c..56cd97a9 100644
--- a/generator/proc_nr.ml
+++ b/generator/proc_nr.ml
@@ -516,6 +516,8 @@ let proc_nr = [
511, "internal_readdir";
512, "clevis_luks_unlock";
513, "inspect_get_build_id";
+514, "findfs_partuuid";
+515, "findfs_partlabel";
]
(* End of list. If adding a new entry, add it at the end of the list
diff --git a/lib/MAX_PROC_NR b/lib/MAX_PROC_NR
index 31cf34b8..3cda32fc 100644
--- a/lib/MAX_PROC_NR
+++ b/lib/MAX_PROC_NR
@@ -1 +1 @@
-513
+515

View File

@ -1,41 +0,0 @@
From ebce03824a3ce75823037003ca2311d7b8d61565 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Mon, 8 Jul 2024 14:39:16 +0100
Subject: [PATCH] inspection: Resolve PARTUUID= and PARTLABEL= in /etc/fstab
Fixes: https://issues.redhat.com/browse/RHEL-46596
(cherry picked from commit e616c8f286ddacf401d7c356724ae874ed883262)
---
daemon/inspect_fs_unix_fstab.ml | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/daemon/inspect_fs_unix_fstab.ml b/daemon/inspect_fs_unix_fstab.ml
index 837c8c62..f5817a31 100644
--- a/daemon/inspect_fs_unix_fstab.ml
+++ b/daemon/inspect_fs_unix_fstab.ml
@@ -131,6 +131,25 @@ and check_fstab_entry md_map root_mountable os_type aug entry =
with
Failure _ -> return None
)
+ (* EFI partition UUIDs and labels. *)
+ else if String.is_prefix spec "PARTUUID=" then (
+ let uuid = String.sub spec 9 (String.length spec - 9) in
+ let uuid = shell_unquote uuid in
+ (* Just ignore the device if the UUID cannot be resolved. *)
+ try
+ Mountable.of_device (Findfs.findfs_partuuid uuid)
+ with
+ Failure _ -> return None
+ )
+ else if String.is_prefix spec "PARTLABEL=" then (
+ let label = String.sub spec 10 (String.length spec - 10) in
+ let label = shell_unquote label in
+ (* Just ignore the device if the label cannot be resolved. *)
+ try
+ Mountable.of_device (Findfs.findfs_partlabel label)
+ with
+ Failure _ -> return None
+ )
(* Resolve /dev/root to the current device.
* Do the same for the / partition of the *BSD
* systems, since the BSD -> Linux device

View File

@ -7,7 +7,7 @@ set -e
# ./copy-patches.sh
project=libguestfs
rhel_version=9.5
rhel_version=9.6
# Check we're in the right directory.
if [ ! -f $project.spec ]; then

View File

@ -24,16 +24,8 @@
# Verify tarball signature with GPGv2.
%global verify_tarball_signature 1
# If there are patches which touch autotools files, set this to 1.
%if !0%{?rhel}
%global patches_touch_autotools %{nil}
%else
# On RHEL the downstream patches always touch autotools files.
%global patches_touch_autotools 1
%endif
# The source directory.
%global source_directory 1.50-stable
%global source_directory 1.54-stable
# Filter perl provides.
%{?perl_default_filter}
@ -44,9 +36,9 @@
Summary: Access and modify virtual machine disk images
Name: libguestfs
Epoch: 1
Version: 1.50.2
Version: 1.54.0
Release: 1%{?dist}
License: LGPLv2+
License: LGPL-2.1-or-later
# Build only for architectures that have a kernel
ExclusiveArch: %{kernel_arches}
@ -79,60 +71,15 @@ Source7: libguestfs.keyring
# Maintainer script which helps with handling patches.
Source8: copy-patches.sh
# This is a copy of the common/ submodule from libguestfs @v1.50.2.
# We need it because the libguestfs tarball does not include common/
# directories that are not used by libguestfs (eg. common/mlcustomize).
# However the patches (below) patch files in those directories and so
# do not apply properly to the libguestfs tarball. Therefore before
# applying the patches we unpack this in the common/ subdirectory.
Source9: libguestfs-common-1.50.2.tar.gz
# Patches are maintained in the following repository:
# https://github.com/libguestfs/libguestfs/commits/rhel-9.5
# https://github.com/libguestfs/libguestfs/commits/rhel-9.6
# Patches.
Patch0001: 0001-daemon-selinux-relabel-don-t-exclude-selinux-if-it-s.patch
Patch0002: 0002-daemon-selinux-relabel-search-for-invalid-option-in-.patch
Patch0003: 0003-daemon-selinux-relabel-run-setfiles-with-T-0-if-supp.patch
Patch0004: 0004-RHEL-Disable-unsupported-remote-drive-protocols-RHBZ.patch
Patch0005: 0005-RHEL-Reject-use-of-libguestfs-winsupport-features-ex.patch
Patch0006: 0006-Remove-virt-dib.patch
Patch0007: 0007-lib-Choose-q35-machine-type-for-x86-64.patch
Patch0008: 0008-LUKS-on-LVM-inspection-test-rename-VGs-and-LVs.patch
Patch0009: 0009-LUKS-on-LVM-inspection-test-test-dev-mapper-VG-LV-tr.patch
Patch0010: 0010-fuse-Don-t-call-fclose-NULL-on-error-paths.patch
Patch0011: 0011-ocaml-implicit_close-test-collect-all-currently-unre.patch
Patch0012: 0012-ocaml-Replace-old-enter-leave_blocking_section-calls.patch
Patch0013: 0013-ocaml-Release-runtime-lock-around-guestfs_close.patch
Patch0014: 0014-ocaml-Conditionally-acquire-the-lock-in-callbacks.patch
Patch0015: 0015-ocaml-Fix-guestfs_065_implicit_close.ml-for-OCaml-5.patch
Patch0016: 0016-ocaml-Use-Caml_state_opt-in-preference-to-caml_state.patch
Patch0017: 0017-generator-Add-chown-option-for-virt-customize.patch
Patch0018: 0018-lib-remove-guestfs_int_cmd_clear_close_files.patch
Patch0019: 0019-docs-fix-broken-link-in-the-guestfs-manual.patch
Patch0020: 0020-docs-clarify-sockdir-s-separation.patch
Patch0021: 0021-lib-move-guestfs_int_create_socketname-from-launch.c.patch
Patch0022: 0022-generator-customize-Add-new-StringTriplet-for-use-by.patch
Patch0023: 0023-daemon-lvm-Do-reverse-device-name-translation-on-pvs.patch
Patch0024: 0024-ruby-Replace-MiniTest-with-Minitest.patch
Patch0025: 0025-ruby-Get-rid-of-old-Test-Unit-compatibility.patch
Patch0026: 0026-generator-Sort-virt-customize-options-into-alphabeti.patch
Patch0027: 0027-generator-Add-new-virt-customize-tar-in-operation.patch
Patch0028: 0028-New-mailing-list-email-address.patch
Patch0029: 0029-New-mailing-list-archives.patch
Patch0030: 0030-lib-Include-libxml-parser.h-for-xmlReadMemory.patch
Patch0031: 0031-ocaml-Use-Gc.finalise-instead-of-a-C-finalizer.patch
Patch0032: 0032-ocaml-Nullify-custom-block-before-releasing-runtime-.patch
Patch0033: 0033-Update-common-submodule.patch
Patch0034: 0034-tests-Test-guestfish-key-all-.-selector.patch
Patch0035: 0035-generator-customize.ml-Split-chown-parameter-on-char.patch
Patch0036: 0036-Update-common-submodule.patch
Patch0037: 0037-New-APIs-findfs_partuuid-and-findfs_partlabel.patch
Patch0038: 0038-inspection-Resolve-PARTUUID-and-PARTLABEL-in-etc-fst.patch
Patch0001: 0001-website-Add-links-for-1.54-and-1.55-download-locatio.patch
Patch0002: 0002-RHEL-Disable-unsupported-remote-drive-protocols-RHBZ.patch
Patch0003: 0003-RHEL-Reject-use-of-libguestfs-winsupport-features-ex.patch
%if 0%{patches_touch_autotools}
BuildRequires: autoconf, automake, libtool, gettext-devel
%endif
# Basic build requirements.
BuildRequires: gcc, gcc-c++
@ -186,9 +133,10 @@ BuildRequires: jansson-devel
BuildRequires: systemd-devel
BuildRequires: bash-completion
BuildRequires: /usr/bin/ping
BuildRequires: /usr/bin/wget
BuildRequires: curl
BuildRequires: xz
BuildRequires: zstd
BuildRequires: libzstd-devel
BuildRequires: /usr/bin/qemu-img
%if 0%{verify_tarball_signature}
@ -316,7 +264,6 @@ BuildRequires: util-linux
BuildRequires: vim-minimal
BuildRequires: xfsprogs
BuildRequires: xz
BuildRequires: yajl
%if !0%{?rhel}
BuildRequires: zerofree
%endif
@ -339,6 +286,7 @@ Requires: (%{name}-appliance = %{epoch}:%{version}-%{release} or %{name}-no
# The daemon dependencies are not included automatically, because it
# is buried inside the appliance, so list them here.
Requires: augeas-libs%{?_isa} >= 1.7.0
Requires: jansson%{?_isa}
Requires: libacl%{?_isa}
Requires: libcap%{?_isa}
Requires: libselinux%{?_isa}
@ -346,7 +294,6 @@ Requires: hivex-libs%{?_isa} >= 1.3.10
Requires: pcre2%{?_isa}
Requires: rpm-libs%{?_isa} >= 4.16.1.3
Requires: systemd-libs%{?_isa}
Requires: yajl%{?_isa}
# For core mount-local (FUSE) API.
Requires: fuse
@ -364,7 +311,6 @@ Requires: xz
Requires: qemu-kvm-core
%if !0%{?rhel}
Suggests: qemu-block-curl
Suggests: qemu-block-gluster
Suggests: qemu-block-iscsi
%endif
Suggests: qemu-block-rbd
@ -376,6 +322,7 @@ Requires: libvirt-daemon-driver-qemu >= 7.1.0
Requires: libvirt-daemon-driver-secret
Requires: libvirt-daemon-driver-storage-core
Requires: selinux-policy >= 3.11.1-63
Recommends: passt
%ifarch aarch64
Requires: edk2-aarch64
@ -447,6 +394,7 @@ Language bindings:
%package appliance
Summary: Appliance for %{name}
License: GPL-2.0-or-later AND LGPL-2.1-or-later
Requires: supermin >= 5.1.18
@ -468,7 +416,7 @@ for %{name}.
%if !0%{?rhel}
%package forensics
Summary: Filesystem forensics support for %{name}
License: LGPLv2+
License: GPL-2.0-or-later
Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release}
%description forensics
@ -480,7 +428,7 @@ want to forensically analyze disk images using The Sleuth Kit.
%if !0%{?rhel}
%package gfs2
Summary: GFS2 support for %{name}
License: LGPLv2+
License: GPL-2.0-or-later
Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release}
%description gfs2
@ -493,7 +441,7 @@ disk images containing GFS2.
%ifnarch ppc
%package hfsplus
Summary: HFS+ support for %{name}
License: LGPLv2+
License: GPL-2.0-or-later
Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release}
%description hfsplus
@ -505,7 +453,7 @@ disk images containing HFS+ / Mac OS Extended filesystems.
%package rescue
Summary: virt-rescue shell
License: LGPLv2+
License: GPL-2.0-or-later
Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release}
%description rescue
@ -516,7 +464,7 @@ network utilities, editors and debugging utilities.
%package rsync
Summary: rsync support for %{name}
License: LGPLv2+
License: GPL-2.0-or-later
Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release}
%description rsync
@ -527,7 +475,7 @@ rsync to upload or download files into disk images.
%if !0%{?rhel}
%package ufs
Summary: UFS (BSD) support for %{name}
License: LGPLv2+
License: GPL-2.0-or-later
Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release}
%description ufs
@ -538,7 +486,7 @@ disk images containing UFS (BSD filesystems).
%package xfs
Summary: XFS support for %{name}
License: LGPLv2+
License: GPL-2.0-or-later
Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release}
%description xfs
@ -550,7 +498,7 @@ disk images containing XFS.
%ifnarch %{arm} aarch64 s390 s390x riscv64
%package zfs
Summary: ZFS support for %{name}
License: LGPLv2+
License: GPL-2.0-or-later
Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release}
%description zfs
@ -562,7 +510,7 @@ disk images containing ZFS.
%package inspect-icons
Summary: Additional dependencies for inspecting guest icons
License: LGPLv2+
License: LGPL-2.1-or-later
BuildArch: noarch
Requires: %{name} = %{epoch}:%{version}-%{release}
@ -582,6 +530,7 @@ having to depend on Perl. See https://bugzilla.redhat.com/1194158
%package bash-completion
Summary: Bash tab-completion scripts for %{name} tools
License: GPL-2.0-or-later
BuildArch: noarch
Requires: bash-completion >= 2.0
@ -713,6 +662,7 @@ golang-%{name} contains Go language bindings for %{name}.
%package man-pages-ja
Summary: Japanese (ja) man pages for %{name}
License: GPL-2.0-or-later
BuildArch: noarch
Requires: %{name} = %{epoch}:%{version}-%{release}
@ -723,6 +673,7 @@ for %{name}.
%package man-pages-uk
Summary: Ukrainian (uk) man pages for %{name}
License: GPL-2.0-or-later
BuildArch: noarch
Requires: %{name} = %{epoch}:%{version}-%{release}
@ -736,14 +687,9 @@ for %{name}.
%{gpgverify} --keyring='%{SOURCE7}' --signature='%{SOURCE1}' --data='%{SOURCE0}'
%endif
%setup -q
%if 0%{?rhel}
tar zxf %{SOURCE9}
%endif
%autopatch -p1
%if 0%{patches_touch_autotools}
autoreconf -i
%endif
autoreconf -fiv
# For sVirt to work, the local temporary directory we use in the tests
# must be labelled the same way as /tmp. This doesn't work if either
@ -764,7 +710,7 @@ sed 's/@VERSION@/%{version}/g' < %{SOURCE4} > README
# Test if network is available.
ip addr list ||:
ip route list ||:
if ping -c 3 -w 20 8.8.8.8 && wget http://libguestfs.org -O /dev/null; then
if ping -c 3 -w 20 8.8.8.8 && curl http://libguestfs.org -o /dev/null; then
extra=
else
mkdir cachedir repo
@ -800,7 +746,7 @@ fi
# 'INSTALLDIRS' ensures that Perl and Ruby libs are installed in the
# vendor dir not the site dir.
make V=1 INSTALLDIRS=vendor %{?_smp_mflags}
%make_build INSTALLDIRS=vendor
%check
@ -826,7 +772,7 @@ fi
%install
# 'INSTALLDIRS' ensures that Perl and Ruby libs are installed in the
# vendor dir not the site dir.
make DESTDIR=$RPM_BUILD_ROOT INSTALLDIRS=vendor install
%make_install INSTALLDIRS=vendor
# Delete static libraries.
rm $( find $RPM_BUILD_ROOT -name '*.a' | grep -v /ocaml/ )
@ -1141,6 +1087,10 @@ rm ocaml/html/.gitignore
%changelog
* Wed Oct 09 2024 Richard W.M. Jones <rjones@redhat.com> - 1:1.54.0-1
- Rebase to libguestfs 1.54.0
resolves: RHEL-56809
* Tue Jul 09 2024 Richard W.M. Jones <rjones@redhat.com> - 1:1.50.2-1
- Update to libguestfs 1.50.2
resolves: RHEL-46775

View File

@ -1,3 +1,2 @@
SHA512 (libguestfs-1.50.2.tar.gz) = ede323e12dbe2a472e7b34b9c391399b45c9b09486bb126ad41598c5205539a7502c17cc98747112869237215b071aa9668fa0e967cd42fce238337bf84a2a4d
SHA512 (libguestfs-1.50.2.tar.gz.sig) = 56b91c15f3608f2c56b48beaa63c2c1e7d8dce2a71965db6c4c75d95d80f7c1aed487b5cca5f6d8ed6e76f5d415214443bab2cdaa49385f8aba09ec81c720de4
SHA512 (libguestfs-common-1.50.2.tar.gz) = 4f21dc950974458d4d4642bc39a3edb012d46243f8434804f6df07e155aaf6c050eea2cd55f4a875f16ef992dd2e6b945fe9ce0a46b86d1adf50866868037ea1
SHA512 (libguestfs-1.54.0.tar.gz) = 45fd91a36384c15737820c9157d4a8a670c94177ab917a2600fef04ecbc8d6531ef04a4a86bea6540e04a550de7dfacbef9645f2869e7c5eab6cb63058ff2d86
SHA512 (libguestfs-1.54.0.tar.gz.sig) = 97c27a5cafa533587ae2e22a54fed16d37c5366cca2a4c40cb098a8dacf62ee8b1bcee9d28f63b01e7034f0f211e8a8c71368ae418f1bfba4970ca1942bf40f3