From 5efb2b2ab438f7621897e0da8602cf6d81a03ce2 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Mon, 29 Jul 2013 14:47:56 +0100 Subject: [PATCH] RHEL: Disable unsupported remote drive protocols (RHBZ#962113). This disables support for unsupported remote drive protocols: * ftp * ftps * http * https * iscsi * ssh Note 'nbd' is not disabled, and of course 'file' works. --- docs/guestfs-testing.pod | 20 ----- 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 f5c09df6e..ee4b26d6b 100644 --- a/docs/guestfs-testing.pod +++ b/docs/guestfs-testing.pod @@ -109,26 +109,6 @@ image. To exit, type C. If you get an error, try enabling debugging (add C<-v> to the command line). Also make sure that L succeeds. -=head2 Try to open a remote guest image with guestfish. - -You may also have to disable libvirt by setting this: - - export LIBGUESTFS_BACKEND=direct - -If you have a disk image available over HTTP/FTP, try to open it. - - guestfish --ro -i --format=raw -a http://www.example.com/disk.img - -For SSH you will need to make sure that ssh-agent is set up so you -don't need a password to log in to the remote machine. Then a command -similar to this should work: - - guestfish --ro -i --format=raw \ - -a ssh://remote.example.com/path/to/disk.img - -If you get an error, try enabling debugging (add C<-v> to the command -line). Also make sure that L succeeds. - =head2 Run virt-alignment-scan on all your guests. Run L on guests or disk images: diff --git a/fish/guestfish.pod b/fish/guestfish.pod index da47c86d6..33fc8b2c8 100644 --- a/fish/guestfish.pod +++ b/fish/guestfish.pod @@ -131,9 +131,9 @@ To list what is available do: =head2 Remote drives -Access a remote disk using ssh: +Access a remote disk using NBD: - guestfish -a ssh://example.com/path/to/disk.img + guestfish -a nbd://example.com =head2 Remote control @@ -1129,12 +1129,12 @@ L>. On the command line, you can use the I<-a> option to add network block devices using a URI-style format, for example: - guestfish -a ssh://root@example.com/disk.img + guestfish -a nbd://example.com URIs I be used with the L command. The equivalent command using the API directly is: - > add /disk.img protocol:ssh server:tcp:example.com username:root + > add /disk.img protocol:nbd server:tcp:example.com 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. -=head2 B<-a ftp://[user@]example.com[:port]/disk.img> - -=head2 B<-a ftps://[user@]example.com[:port]/disk.img> - -=head2 B<-a http://[user@]example.com[:port]/disk.img> - -=head2 B<-a https://[user@]example.com[:port]/disk.img> - -Add a disk located on a remote FTP or HTTP server. - -The equivalent API command would be: - - > add /disk.img protocol:(ftp|...) server:tcp:example.com - -=head2 B<-a iscsi://example.com[:port]/target-iqn-name[/lun]> - -Add a disk located on an iSCSI server. - -The equivalent API command would be: - - > add target-iqn-name/lun protocol:iscsi server:tcp:example.com - =head2 B<-a nbd://example.com[:port]> =head2 B<-a nbd://example.com[:port]/exportname> @@ -1200,23 +1178,13 @@ The equivalent API command would be: > add pool/disk protocol:rbd server:tcp:example.com:port -=head2 B<-a ssh://[user@]example.com[:port]/disk.img> - -Add a disk image located on a remote server, accessed using the Secure -Shell (ssh) SFTP protocol. SFTP is supported out of the box by all -major SSH servers. - -The equivalent API command would be: - - > add /disk protocol:ssh server:tcp:example.com [username:user] - Note that the URIs follow the syntax of L: in particular, there are restrictions on the allowed characters for the various components of the URI. Characters such as C<:>, C<@>, and C B be percent-encoded: - $ guestfish -a ssh://user:pass%40word@example.com/disk.img + $ guestfish -a rbd://user:pass%40word@example.com[:port]/pool/disk In this case, the password is C. diff --git a/fish/test-add-uri.sh b/fish/test-add-uri.sh index 533a3ce0c..ddabeb639 100755 --- a/fish/test-add-uri.sh +++ b/fish/test-add-uri.sh @@ -40,10 +40,6 @@ function fail () $VG guestfish -x -a file://$abs_builddir/test-add-uri.img 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 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 - # NBD $VG guestfish -x -a nbd://example.com test-add-uri.out 2>&1 grep -sq 'add_drive "" "protocol:nbd" "server:tcp:example.com"' test-add-uri.out || fail @@ -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 test-add-uri.out 2>&1 grep -sq 'add_drive "pool/disk" "protocol:rbd"' test-add-uri.out || fail -# ssh -$VG guestfish -x -a ssh://example.com/disk.img test-add-uri.out 2>&1 -grep -sq 'add_drive "/disk.img" "protocol:ssh" "server:tcp:example.com"' test-add-uri.out || fail - -$VG guestfish -x -a ssh://user@example.com/disk.img test-add-uri.out 2>&1 -grep -sq 'add_drive "/disk.img" "protocol:ssh" "server:tcp:example.com" "username:user"' test-add-uri.out || fail - -$VG guestfish -x -a ssh://user@example.com:2000/disk.img test-add-uri.out 2>&1 -grep -sq 'add_drive "/disk.img" "protocol:ssh" "server:tcp:example.com:2000" "username:user"' test-add-uri.out || fail - -# iSCSI -$VG guestfish -x -a iscsi://example.com/iqn.2015-12.com.libguestfs:test1/0 test-add-uri.out 2>&1 -grep -sq 'add_drive "iqn.2015-12.com.libguestfs:test1/0" "protocol:iscsi" "server:tcp:example.com"' test-add-uri.out || fail - -$VG guestfish -x -a iscsi://user:password@example.com/iqn.2015-12.com.libguestfs:test2/0 test-add-uri.out 2>&1 -grep -sq 'add_drive "iqn.2015-12.com.libguestfs:test2/0" "protocol:iscsi" "server:tcp:example.com" "username:user" "secret:password"' test-add-uri.out || fail - rm test-add-uri.out rm test-add-uri.img diff --git a/generator/actions_core.ml b/generator/actions_core.ml index 20f6e8436..768f58433 100644 --- a/generator/actions_core.ml +++ b/generator/actions_core.ml @@ -350,22 +350,6 @@ F is interpreted as a local file or device. This is the default if the optional protocol parameter is omitted. -=item C - -Connect to a remote FTP or HTTP server. -The C parameter must also be supplied - see below. - -See also: L - -=item C - -Connect to the iSCSI server. -The C parameter must also be supplied - see below. -The C parameter may be supplied. See below. -The C parameter may be supplied. See below. - -See also: L. - =item C Connect to the Network Block Device server. @@ -382,15 +366,6 @@ The C parameter may be supplied. See below. See also: L. -=item C - -Connect to the Secure Shell (ssh) server. - -The C parameter must be supplied. -The C parameter may be supplied. See below. - -See also: L. - =back =item C @@ -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 Exactly one - iscsi Exactly one nbd Exactly one rbd 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: @@ -421,10 +393,10 @@ for the protocol is used (see F). =item C -For the C, C, C, C, C, C and C -protocols, this specifies the remote username. +For the C +protocol, this specifies the remote username. -If not given, then the local username is used for C, and no authentication +If not given, then no authentication is attempted for ceph. But note this sometimes may give unexpected results, for 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. If in doubt, diff --git a/lib/drives.c b/lib/drives.c index c068b8ecb..6e4453ce5 100644 --- a/lib/drives.c +++ b/lib/drives.c @@ -166,34 +166,6 @@ create_drive_non_file (guestfs_h *g, return drv; } -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) { @@ -261,67 +233,6 @@ create_drive_rbd (guestfs_h *g, return create_drive_non_file (g, data); } -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 drive. * @@ -768,26 +679,6 @@ guestfs_impl_add_drive_opts (guestfs_h *g, const char *filename, drv = create_drive_file (g, &data); } } - 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); @@ -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); } - 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 ecab0e1f3..dff32cc9e 100644 --- a/lib/guestfs.pod +++ b/lib/guestfs.pod @@ -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. -=head3 FTP AND HTTP - -Libguestfs can access remote disks over FTP, FTPS, HTTP or HTTPS -protocols. - -To do this, set the optional C and C parameters of -L like this: - - char **servers = { "www.example.org", NULL }; - guestfs_add_drive_opts (g, "/disk.img", - GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw", - GUESTFS_ADD_DRIVE_OPTS_PROTOCOL, "http", - GUESTFS_ADD_DRIVE_OPTS_SERVER, servers, - -1); - -The C can be one of C<"ftp">, C<"ftps">, C<"http">, -or C<"https">. - -C (the C parameter) is a list which must have a -single element. The single element is a string defining the web -or FTP server. The format of this string is documented in -L. - -=head3 GLUSTER - -Glusterfs support was removed in libguestfs 1.54 (2024). - -=head3 ISCSI - -Libguestfs can access iSCSI disks remotely. - -To do this, set the optional C and C parameters like -this: - - char **server = { "iscsi.example.org:3000", NULL }; - guestfs_add_drive_opts (g, "target-iqn-name/lun", - GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw", - GUESTFS_ADD_DRIVE_OPTS_PROTOCOL, "iscsi", - GUESTFS_ADD_DRIVE_OPTS_SERVER, server, - -1); - -The C parameter is a list which must have a single element. -The single element is a string defining the iSCSI server. The format -of this string is documented in L. - =head3 NETWORK BLOCK DEVICE Libguestfs can access Network Block Device (NBD) disks remotely. @@ -830,28 +785,6 @@ L =back -=head3 SHEEPDOG - -Sheepdog support was removed in libguestfs 1.54 (2024). - -=head3 SSH - -Libguestfs can access disks over a Secure Shell (SSH) connection. - -To do this, set the C and C and (optionally) -C parameters of L like this: - - char **server = { "remote.example.com", NULL }; - guestfs_add_drive_opts (g, "/path/to/disk.img", - GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw", - GUESTFS_ADD_DRIVE_OPTS_PROTOCOL, "ssh", - GUESTFS_ADD_DRIVE_OPTS_SERVER, server, - GUESTFS_ADD_DRIVE_OPTS_USERNAME, "remoteuser", - -1); - -The format of the server string is documented in -L. - =head2 INSPECTION 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 afbeddec6..93df4be0a 100755 --- a/tests/disks/test-qemu-drive-libvirt.sh +++ b/tests/disks/test-qemu-drive-libvirt.sh @@ -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" -# iSCSI. - -$guestfish -d iscsi run ||: -check_output -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 ||: diff --git a/tests/disks/test-qemu-drive.sh b/tests/disks/test-qemu-drive.sh index 9ee7df389..b3e4f9903 100755 --- a/tests/disks/test-qemu-drive.sh +++ b/tests/disks/test-qemu-drive.sh @@ -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" -# HTTP. - -guestfish <