Compare commits
No commits in common. 'c9' and 'i9c-beta' have entirely different histories.
@ -1,2 +1 @@
|
|||||||
SOURCES/libguestfs.keyring
|
SOURCES/virt-v2v-2.5.6.tar.gz
|
||||||
SOURCES/virt-v2v-2.4.0.tar.gz
|
|
||||||
|
@ -1,2 +1 @@
|
|||||||
1bbc40f501a7fef9eef2a39b701a71aee2fea7c4 SOURCES/libguestfs.keyring
|
7c49844a2ffb54d6fcb58eca1dbf57b110d5d47e SOURCES/virt-v2v-2.5.6.tar.gz
|
||||||
52029cc7c3f9e05ec9685995ad86955154d7b28e SOURCES/virt-v2v-2.4.0.tar.gz
|
|
||||||
|
@ -1,20 +1,19 @@
|
|||||||
From 48c49139b94b1081c6392ab3b14fbb72c024f18d Mon Sep 17 00:00:00 2001
|
From 7800049c5612e6ffb30be7f8862d147d82976ae8 Mon Sep 17 00:00:00 2001
|
||||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||||
Date: Wed, 31 Jul 2024 10:09:50 +0100
|
Date: Wed, 31 Jul 2024 10:09:50 +0100
|
||||||
Subject: [PATCH] docs: Note that --mac len field is now optional
|
Subject: [PATCH] docs: Note that --mac len field is now optional
|
||||||
|
|
||||||
Reported-by: Ming Xie
|
Reported-by: Ming Xie
|
||||||
Updates: commit 159fda411d2f75b087106e7293d273ae142c9fbe
|
Updates: commit 159fda411d2f75b087106e7293d273ae142c9fbe
|
||||||
(cherry picked from commit 7800049c5612e6ffb30be7f8862d147d82976ae8)
|
|
||||||
---
|
---
|
||||||
docs/virt-v2v.pod | 6 +++---
|
docs/virt-v2v.pod | 6 +++---
|
||||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
|
diff --git a/docs/virt-v2v.pod b/docs/virt-v2v.pod
|
||||||
index 021ac897..c173563b 100644
|
index b53face6..dfe92d77 100644
|
||||||
--- a/docs/virt-v2v.pod
|
--- a/docs/virt-v2v.pod
|
||||||
+++ b/docs/virt-v2v.pod
|
+++ b/docs/virt-v2v.pod
|
||||||
@@ -372,9 +372,9 @@ Force a particular interface (controlled by its MAC address) to have a
|
@@ -394,9 +394,9 @@ Force a particular interface (controlled by its MAC address) to have a
|
||||||
static IP address after boot.
|
static IP address after boot.
|
||||||
|
|
||||||
The fields in the parameter are: C<ipaddr> is the IP address. C<gw>
|
The fields in the parameter are: C<ipaddr> is the IP address. C<gw>
|
@ -1,39 +0,0 @@
|
|||||||
From af68f253d1a11c4abaa30ae348ee3855cdec74e9 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
||||||
Date: Thu, 11 Jan 2024 15:33:08 +0000
|
|
||||||
Subject: [PATCH] virt-v2v: -i vmx: Remove scp -T option
|
|
||||||
|
|
||||||
This reverts the following commit:
|
|
||||||
|
|
||||||
commit d265639c2ab31418cfdbdedd0cc3e68cf290d834
|
|
||||||
Author: Richard W.M. Jones <rjones@redhat.com>
|
|
||||||
Date: Thu Jul 25 14:52:42 2019 +0100
|
|
||||||
|
|
||||||
v2v: -i vmx: Use scp -T option if available to unbreak scp (RHBZ#1733168).
|
|
||||||
|
|
||||||
See also the referenced bug:
|
|
||||||
https://bugzilla.redhat.com/show_bug.cgi?id=1733168
|
|
||||||
|
|
||||||
My rationale for removing this option is that since we now require
|
|
||||||
OpenSSH 8.8 we must be using sftp for file transfer so we no longer
|
|
||||||
need to defeat the check for correct expansion of wildcards. That
|
|
||||||
check was only relevant for OpenSSH <= 8.7 using the old scp protocol.
|
|
||||||
|
|
||||||
Reverts: commit d265639c2ab31418cfdbdedd0cc3e68cf290d834
|
|
||||||
---
|
|
||||||
input/parse_domain_from_vmx.ml | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/input/parse_domain_from_vmx.ml b/input/parse_domain_from_vmx.ml
|
|
||||||
index 2e75e785..f24990f8 100644
|
|
||||||
--- a/input/parse_domain_from_vmx.ml
|
|
||||||
+++ b/input/parse_domain_from_vmx.ml
|
|
||||||
@@ -68,7 +68,7 @@ let scp_from_remote_to_temporary uri tmpdir filename =
|
|
||||||
let localfile = tmpdir // filename in
|
|
||||||
|
|
||||||
let cmd =
|
|
||||||
- sprintf "scp -T%s%s %s%s:%s %s"
|
|
||||||
+ sprintf "scp%s%s %s%s:%s %s"
|
|
||||||
(if verbose () then "" else " -q")
|
|
||||||
(match port_of_uri uri with
|
|
||||||
| None -> ""
|
|
@ -1,48 +0,0 @@
|
|||||||
From 60d4a517e43f0715fb9dc4f87cbd2f5c88ab662a Mon Sep 17 00:00:00 2001
|
|
||||||
From: Weblate Translation Memory
|
|
||||||
<noreply-mt-weblate-translation-memory@weblate.org>
|
|
||||||
Date: Mon, 15 Jan 2024 14:37:13 +0100
|
|
||||||
Subject: [PATCH] Translated using Weblate (Polish)
|
|
||||||
|
|
||||||
Currently translated at 7.2% (35 of 481 strings)
|
|
||||||
|
|
||||||
Translation: libguestfs/virt-v2v-master
|
|
||||||
Translate-URL: https://translate.fedoraproject.org/projects/libguestfs/virt-v2v-master/pl/
|
|
||||||
---
|
|
||||||
po/pl.po | 9 +++++----
|
|
||||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/po/pl.po b/po/pl.po
|
|
||||||
index d4bee25f..e3a5b11d 100644
|
|
||||||
--- a/po/pl.po
|
|
||||||
+++ b/po/pl.po
|
|
||||||
@@ -14,8 +14,9 @@ msgstr ""
|
|
||||||
"Report-Msgid-Bugs-To: https://bugzilla.redhat.com/enter_bug."
|
|
||||||
"cgi?component=libguestfs&product=Virtualization+Tools\n"
|
|
||||||
"POT-Creation-Date: 2023-11-02 11:07+0000\n"
|
|
||||||
-"PO-Revision-Date: 2023-11-26 21:01+0000\n"
|
|
||||||
-"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
|
|
||||||
+"PO-Revision-Date: 2024-01-15 13:36+0000\n"
|
|
||||||
+"Last-Translator: Weblate Translation Memory <noreply-mt-weblate-translation-"
|
|
||||||
+"memory@weblate.org>\n"
|
|
||||||
"Language-Team: Polish <https://translate.fedoraproject.org/projects/"
|
|
||||||
"libguestfs/virt-v2v-master/pl/>\n"
|
|
||||||
"Language: pl\n"
|
|
||||||
@@ -24,7 +25,7 @@ msgstr ""
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
|
|
||||||
"|| n%100>=20) ? 1 : 2;\n"
|
|
||||||
-"X-Generator: Weblate 5.2.1\n"
|
|
||||||
+"X-Generator: Weblate 5.3.1\n"
|
|
||||||
|
|
||||||
#: input/input_ova.ml:136 common/mltools/tools_utils.ml:235
|
|
||||||
msgid "%s"
|
|
||||||
@@ -735,7 +736,7 @@ msgstr ""
|
|
||||||
#. common/mlcustomize/customize_cmdline.ml:245
|
|
||||||
#: common/mlcustomize/customize_cmdline.ml:453
|
|
||||||
msgid "PATH"
|
|
||||||
-msgstr ""
|
|
||||||
+msgstr "ŚCIEŻKA"
|
|
||||||
|
|
||||||
#: common/mlcustomize/customize_cmdline.ml:191
|
|
||||||
msgid "PERMISSIONS:FILE"
|
|
File diff suppressed because it is too large
Load Diff
@ -1,301 +0,0 @@
|
|||||||
From cddd07669d18a5a848f82dbde27b84ef405ef9fa Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
||||||
Date: Mon, 15 Jan 2024 14:24:35 +0000
|
|
||||||
Subject: [PATCH] virt-v2v: -i vmx: Refactor ssh/scp code into a new module
|
|
||||||
|
|
||||||
This is a straight refactor of the existing code that handles ssh/scp
|
|
||||||
into a new module. In this commit I just copy the code around without
|
|
||||||
doing any cleanup; cleanup will follow in subsequent commits.
|
|
||||||
|
|
||||||
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
|
|
||||||
---
|
|
||||||
input/Makefile.am | 6 ++-
|
|
||||||
input/input_vmx.ml | 8 ++--
|
|
||||||
input/parse_domain_from_vmx.ml | 60 ++-----------------------
|
|
||||||
input/parse_domain_from_vmx.mli | 6 ---
|
|
||||||
input/ssh.ml | 78 +++++++++++++++++++++++++++++++++
|
|
||||||
input/ssh.mli | 34 ++++++++++++++
|
|
||||||
6 files changed, 123 insertions(+), 69 deletions(-)
|
|
||||||
create mode 100644 input/ssh.ml
|
|
||||||
create mode 100644 input/ssh.mli
|
|
||||||
|
|
||||||
diff --git a/input/Makefile.am b/input/Makefile.am
|
|
||||||
index de016d60..4153f878 100644
|
|
||||||
--- a/input/Makefile.am
|
|
||||||
+++ b/input/Makefile.am
|
|
||||||
@@ -39,6 +39,7 @@ SOURCES_MLI = \
|
|
||||||
parse_domain_from_vmx.mli \
|
|
||||||
parse_libvirt_xml.mli \
|
|
||||||
parse_vmx.mli \
|
|
||||||
+ ssh.mli \
|
|
||||||
vCenter.mli
|
|
||||||
|
|
||||||
SOURCES_ML = \
|
|
||||||
@@ -46,11 +47,12 @@ SOURCES_ML = \
|
|
||||||
parse_libvirt_xml.ml \
|
|
||||||
OVF.ml \
|
|
||||||
OVA.ml \
|
|
||||||
- parse_vmx.ml \
|
|
||||||
- parse_domain_from_vmx.ml \
|
|
||||||
nbdkit_curl.ml \
|
|
||||||
nbdkit_ssh.ml \
|
|
||||||
nbdkit_vddk.ml \
|
|
||||||
+ ssh.ml \
|
|
||||||
+ parse_vmx.ml \
|
|
||||||
+ parse_domain_from_vmx.ml \
|
|
||||||
vCenter.ml \
|
|
||||||
input.ml \
|
|
||||||
input_disk.ml \
|
|
||||||
diff --git a/input/input_vmx.ml b/input/input_vmx.ml
|
|
||||||
index eed8a433..bd20420c 100644
|
|
||||||
--- a/input/input_vmx.ml
|
|
||||||
+++ b/input/input_vmx.ml
|
|
||||||
@@ -79,21 +79,21 @@ module VMX = struct
|
|
||||||
let socket = sprintf "%s/in%d" dir i in
|
|
||||||
On_exit.unlink socket;
|
|
||||||
|
|
||||||
- let vmx_path = path_of_uri uri in
|
|
||||||
+ let vmx_path = Ssh.path_of_uri uri in
|
|
||||||
let abs_path = absolute_path_from_other_file vmx_path filename in
|
|
||||||
let flat_vmdk = PCRE.replace (PCRE.compile "\\.vmdk$")
|
|
||||||
"-flat.vmdk" abs_path in
|
|
||||||
|
|
||||||
(* RHBZ#1774386 *)
|
|
||||||
- if not (remote_file_exists uri flat_vmdk) then
|
|
||||||
+ if not (Ssh.remote_file_exists uri flat_vmdk) then
|
|
||||||
error (f_"This transport does not support guests with snapshots. \
|
|
||||||
Either collapse the snapshots for this guest and try \
|
|
||||||
the conversion again, or use one of the alternate \
|
|
||||||
conversion methods described in \
|
|
||||||
virt-v2v-input-vmware(1) section \"NOTES\".");
|
|
||||||
|
|
||||||
- let server = server_of_uri uri in
|
|
||||||
- let port = Option.map string_of_int (port_of_uri uri) in
|
|
||||||
+ let server = Ssh.server_of_uri uri in
|
|
||||||
+ let port = Option.map string_of_int (Ssh.port_of_uri uri) in
|
|
||||||
let user = uri.Xml.uri_user in
|
|
||||||
let password =
|
|
||||||
match options.input_password with
|
|
||||||
diff --git a/input/parse_domain_from_vmx.ml b/input/parse_domain_from_vmx.ml
|
|
||||||
index f24990f8..8cf5893c 100644
|
|
||||||
--- a/input/parse_domain_from_vmx.ml
|
|
||||||
+++ b/input/parse_domain_from_vmx.ml
|
|
||||||
@@ -51,61 +51,6 @@ let vmx_source_of_arg input_transport arg =
|
|
||||||
error (f_"vmx URI path component looks incorrect");
|
|
||||||
SSH uri
|
|
||||||
|
|
||||||
-(* Return various fields from the URI. The checks in vmx_source_of_arg
|
|
||||||
- * should ensure that none of these assertions fail.
|
|
||||||
- *)
|
|
||||||
-let port_of_uri { Xml.uri_port } =
|
|
||||||
- match uri_port with i when i <= 0 -> None | i -> Some i
|
|
||||||
-let server_of_uri { Xml.uri_server } =
|
|
||||||
- match uri_server with None -> assert false | Some s -> s
|
|
||||||
-let path_of_uri { Xml.uri_path } =
|
|
||||||
- match uri_path with None -> assert false | Some p -> p
|
|
||||||
-
|
|
||||||
-(* 'scp' a remote file into a temporary local file, returning the path
|
|
||||||
- * of the temporary local file.
|
|
||||||
- *)
|
|
||||||
-let scp_from_remote_to_temporary uri tmpdir filename =
|
|
||||||
- let localfile = tmpdir // filename in
|
|
||||||
-
|
|
||||||
- let cmd =
|
|
||||||
- sprintf "scp%s%s %s%s:%s %s"
|
|
||||||
- (if verbose () then "" else " -q")
|
|
||||||
- (match port_of_uri uri with
|
|
||||||
- | None -> ""
|
|
||||||
- | Some port -> sprintf " -P %d" port)
|
|
||||||
- (match uri.Xml.uri_user with
|
|
||||||
- | None -> ""
|
|
||||||
- | Some user -> quote user ^ "@")
|
|
||||||
- (quote (server_of_uri uri))
|
|
||||||
- (quote (path_of_uri uri))
|
|
||||||
- (quote localfile) in
|
|
||||||
- if verbose () then
|
|
||||||
- eprintf "%s\n%!" cmd;
|
|
||||||
- if Sys.command cmd <> 0 then
|
|
||||||
- error (f_"could not copy the VMX file from the remote server, \
|
|
||||||
- see earlier error messages");
|
|
||||||
- localfile
|
|
||||||
-
|
|
||||||
-(* Test if [path] exists on the remote server. *)
|
|
||||||
-let remote_file_exists uri path =
|
|
||||||
- let cmd =
|
|
||||||
- sprintf "ssh%s %s%s test -f %s"
|
|
||||||
- (match port_of_uri uri with
|
|
||||||
- | None -> ""
|
|
||||||
- | Some port -> sprintf " -p %d" port)
|
|
||||||
- (match uri.Xml.uri_user with
|
|
||||||
- | None -> ""
|
|
||||||
- | Some user -> quote user ^ "@")
|
|
||||||
- (quote (server_of_uri uri))
|
|
||||||
- (* Double quoting is necessary for 'ssh', first to protect
|
|
||||||
- * from the local shell, second to protect from the remote
|
|
||||||
- * shell. https://github.com/libguestfs/virt-v2v/issues/35#issuecomment-1741730963
|
|
||||||
- *)
|
|
||||||
- (quote (quote path)) in
|
|
||||||
- if verbose () then
|
|
||||||
- eprintf "%s\n%!" cmd;
|
|
||||||
- Sys.command cmd = 0
|
|
||||||
-
|
|
||||||
let rec find_disks vmx vmx_source =
|
|
||||||
(* Set the s_disk_id field to an incrementing number. *)
|
|
||||||
List.mapi
|
|
||||||
@@ -390,7 +335,8 @@ let parse_domain_from_vmx vmx_source =
|
|
||||||
match vmx_source with
|
|
||||||
| File filename -> Parse_vmx.parse_file filename
|
|
||||||
| SSH uri ->
|
|
||||||
- let filename = scp_from_remote_to_temporary uri tmpdir "source.vmx" in
|
|
||||||
+ let filename = Ssh.scp_from_remote_to_temporary uri tmpdir
|
|
||||||
+ "source.vmx" in
|
|
||||||
Parse_vmx.parse_file filename in
|
|
||||||
|
|
||||||
let name =
|
|
||||||
@@ -400,7 +346,7 @@ let parse_domain_from_vmx vmx_source =
|
|
||||||
warning (f_"no displayName key found in VMX file");
|
|
||||||
match vmx_source with
|
|
||||||
| File filename -> name_from_disk filename
|
|
||||||
- | SSH uri -> name_from_disk (path_of_uri uri) in
|
|
||||||
+ | SSH uri -> name_from_disk (Ssh.path_of_uri uri) in
|
|
||||||
|
|
||||||
let genid =
|
|
||||||
(* See: https://lists.nongnu.org/archive/html/qemu-devel/2018-07/msg02019.html *)
|
|
||||||
diff --git a/input/parse_domain_from_vmx.mli b/input/parse_domain_from_vmx.mli
|
|
||||||
index e354b32e..42f8100e 100644
|
|
||||||
--- a/input/parse_domain_from_vmx.mli
|
|
||||||
+++ b/input/parse_domain_from_vmx.mli
|
|
||||||
@@ -22,9 +22,3 @@ type vmx_source =
|
|
||||||
|
|
||||||
val vmx_source_of_arg : [`SSH] option -> string -> vmx_source
|
|
||||||
val parse_domain_from_vmx : vmx_source -> Types.source * string list
|
|
||||||
-
|
|
||||||
-(* XXX Exporting these is a hack. *)
|
|
||||||
-val path_of_uri : Xml.uri -> string
|
|
||||||
-val server_of_uri : Xml.uri -> string
|
|
||||||
-val port_of_uri : Xml.uri -> int option
|
|
||||||
-val remote_file_exists : Xml.uri -> string -> bool
|
|
||||||
diff --git a/input/ssh.ml b/input/ssh.ml
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000..5e689d29
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/input/ssh.ml
|
|
||||||
@@ -0,0 +1,78 @@
|
|
||||||
+(* virt-v2v
|
|
||||||
+ * Copyright (C) 2009-2024 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.
|
|
||||||
+ *)
|
|
||||||
+
|
|
||||||
+open Std_utils
|
|
||||||
+open Tools_utils
|
|
||||||
+open Common_gettext.Gettext
|
|
||||||
+
|
|
||||||
+open Printf
|
|
||||||
+
|
|
||||||
+(* Return various fields from the URI. The checks in vmx_source_of_arg
|
|
||||||
+ * should ensure that none of these assertions fail.
|
|
||||||
+ *)
|
|
||||||
+let port_of_uri { Xml.uri_port } =
|
|
||||||
+ match uri_port with i when i <= 0 -> None | i -> Some i
|
|
||||||
+let server_of_uri { Xml.uri_server } =
|
|
||||||
+ match uri_server with None -> assert false | Some s -> s
|
|
||||||
+let path_of_uri { Xml.uri_path } =
|
|
||||||
+ match uri_path with None -> assert false | Some p -> p
|
|
||||||
+
|
|
||||||
+(* 'scp' a remote file into a temporary local file, returning the path
|
|
||||||
+ * of the temporary local file.
|
|
||||||
+ *)
|
|
||||||
+let scp_from_remote_to_temporary uri tmpdir filename =
|
|
||||||
+ let localfile = tmpdir // filename in
|
|
||||||
+
|
|
||||||
+ let cmd =
|
|
||||||
+ sprintf "scp%s%s %s%s:%s %s"
|
|
||||||
+ (if verbose () then "" else " -q")
|
|
||||||
+ (match port_of_uri uri with
|
|
||||||
+ | None -> ""
|
|
||||||
+ | Some port -> sprintf " -P %d" port)
|
|
||||||
+ (match uri.Xml.uri_user with
|
|
||||||
+ | None -> ""
|
|
||||||
+ | Some user -> quote user ^ "@")
|
|
||||||
+ (quote (server_of_uri uri))
|
|
||||||
+ (quote (path_of_uri uri))
|
|
||||||
+ (quote localfile) in
|
|
||||||
+ if verbose () then
|
|
||||||
+ eprintf "%s\n%!" cmd;
|
|
||||||
+ if Sys.command cmd <> 0 then
|
|
||||||
+ error (f_"could not copy the VMX file from the remote server, \
|
|
||||||
+ see earlier error messages");
|
|
||||||
+ localfile
|
|
||||||
+
|
|
||||||
+(* Test if [path] exists on the remote server. *)
|
|
||||||
+let remote_file_exists uri path =
|
|
||||||
+ let cmd =
|
|
||||||
+ sprintf "ssh%s %s%s test -f %s"
|
|
||||||
+ (match port_of_uri uri with
|
|
||||||
+ | None -> ""
|
|
||||||
+ | Some port -> sprintf " -p %d" port)
|
|
||||||
+ (match uri.Xml.uri_user with
|
|
||||||
+ | None -> ""
|
|
||||||
+ | Some user -> quote user ^ "@")
|
|
||||||
+ (quote (server_of_uri uri))
|
|
||||||
+ (* Double quoting is necessary for 'ssh', first to protect
|
|
||||||
+ * from the local shell, second to protect from the remote
|
|
||||||
+ * shell. https://github.com/libguestfs/virt-v2v/issues/35#issuecomment-1741730963
|
|
||||||
+ *)
|
|
||||||
+ (quote (quote path)) in
|
|
||||||
+ if verbose () then
|
|
||||||
+ eprintf "%s\n%!" cmd;
|
|
||||||
+ Sys.command cmd = 0
|
|
||||||
diff --git a/input/ssh.mli b/input/ssh.mli
|
|
||||||
new file mode 100644
|
|
||||||
index 00000000..e9a1a6a8
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/input/ssh.mli
|
|
||||||
@@ -0,0 +1,34 @@
|
|
||||||
+(* virt-v2v
|
|
||||||
+ * Copyright (C) 2009-2024 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.
|
|
||||||
+ *)
|
|
||||||
+
|
|
||||||
+(** Wrappers for finding and downloading remote files over ssh. *)
|
|
||||||
+
|
|
||||||
+val path_of_uri : Xml.uri -> string
|
|
||||||
+val server_of_uri : Xml.uri -> string
|
|
||||||
+val port_of_uri : Xml.uri -> int option
|
|
||||||
+
|
|
||||||
+(** [remote_file_exists ssh_uri path] checks that [path] exists
|
|
||||||
+ on the remote server [ssh_uri] (note any path inside [ssh_uri]
|
|
||||||
+ is ignored). *)
|
|
||||||
+val remote_file_exists : Xml.uri -> string -> bool
|
|
||||||
+
|
|
||||||
+(** [scp_from_remote_to_temporary ssh_uri tmpdir filename]
|
|
||||||
+ uses scp to copy the single remote file at [ssh_uri] to
|
|
||||||
+ the local file called [tmpdir/filename]. It returns the
|
|
||||||
+ final path [tmpdir/filename]. *)
|
|
||||||
+val scp_from_remote_to_temporary : Xml.uri -> string -> string -> string
|
|
@ -1,12 +1,10 @@
|
|||||||
From 03249203b25d946358e73d0e418805f293bb43bb Mon Sep 17 00:00:00 2001
|
From 7bc9b115baba6df2969451cd6907e2d7543ef22d Mon Sep 17 00:00:00 2001
|
||||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||||
Date: Mon, 5 Aug 2024 10:18:31 +0100
|
Date: Mon, 5 Aug 2024 10:18:31 +0100
|
||||||
Subject: [PATCH] Update common submodule
|
Subject: [PATCH] Update common submodule
|
||||||
|
|
||||||
Richard W.M. Jones (1):
|
Richard W.M. Jones (1):
|
||||||
mlcustomize: Write qemu-ga log file name to log.txt
|
mlcustomize: Write qemu-ga log file name to log.txt
|
||||||
|
|
||||||
(cherry picked from commit 7bc9b115baba6df2969451cd6907e2d7543ef22d)
|
|
||||||
---
|
---
|
||||||
common | 2 +-
|
common | 2 +-
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
@ -1,84 +0,0 @@
|
|||||||
From a0b22af28782a485cc2241dce55b8f435d8aaefc Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
||||||
Date: Mon, 15 Jan 2024 14:35:57 +0000
|
|
||||||
Subject: [PATCH] virt-v2v: -i vmx: Simplify scp wrapper
|
|
||||||
|
|
||||||
The existing 'scp_from_remote_to_temporary' wrapper around scp was
|
|
||||||
pretty weird (I think from much patching without refactoring).
|
|
||||||
Simplify it so it no longer generates the output filename, and rename
|
|
||||||
it accordingly to 'download_file' (as we will soon remove the need for
|
|
||||||
and dependency on 'scp').
|
|
||||||
|
|
||||||
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
|
|
||||||
---
|
|
||||||
input/parse_domain_from_vmx.ml | 4 ++--
|
|
||||||
input/ssh.ml | 13 ++++---------
|
|
||||||
input/ssh.mli | 7 +++----
|
|
||||||
3 files changed, 9 insertions(+), 15 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/input/parse_domain_from_vmx.ml b/input/parse_domain_from_vmx.ml
|
|
||||||
index 8cf5893c..e6500da6 100644
|
|
||||||
--- a/input/parse_domain_from_vmx.ml
|
|
||||||
+++ b/input/parse_domain_from_vmx.ml
|
|
||||||
@@ -335,8 +335,8 @@ let parse_domain_from_vmx vmx_source =
|
|
||||||
match vmx_source with
|
|
||||||
| File filename -> Parse_vmx.parse_file filename
|
|
||||||
| SSH uri ->
|
|
||||||
- let filename = Ssh.scp_from_remote_to_temporary uri tmpdir
|
|
||||||
- "source.vmx" in
|
|
||||||
+ let filename = tmpdir // "source.vmx" in
|
|
||||||
+ Ssh.download_file uri filename;
|
|
||||||
Parse_vmx.parse_file filename in
|
|
||||||
|
|
||||||
let name =
|
|
||||||
diff --git a/input/ssh.ml b/input/ssh.ml
|
|
||||||
index 5e689d29..63ffeb12 100644
|
|
||||||
--- a/input/ssh.ml
|
|
||||||
+++ b/input/ssh.ml
|
|
||||||
@@ -32,12 +32,8 @@ let server_of_uri { Xml.uri_server } =
|
|
||||||
let path_of_uri { Xml.uri_path } =
|
|
||||||
match uri_path with None -> assert false | Some p -> p
|
|
||||||
|
|
||||||
-(* 'scp' a remote file into a temporary local file, returning the path
|
|
||||||
- * of the temporary local file.
|
|
||||||
- *)
|
|
||||||
-let scp_from_remote_to_temporary uri tmpdir filename =
|
|
||||||
- let localfile = tmpdir // filename in
|
|
||||||
-
|
|
||||||
+(* 'scp' a remote file into a local file. *)
|
|
||||||
+let download_file uri output =
|
|
||||||
let cmd =
|
|
||||||
sprintf "scp%s%s %s%s:%s %s"
|
|
||||||
(if verbose () then "" else " -q")
|
|
||||||
@@ -49,13 +45,12 @@ let scp_from_remote_to_temporary uri tmpdir filename =
|
|
||||||
| Some user -> quote user ^ "@")
|
|
||||||
(quote (server_of_uri uri))
|
|
||||||
(quote (path_of_uri uri))
|
|
||||||
- (quote localfile) in
|
|
||||||
+ (quote output) in
|
|
||||||
if verbose () then
|
|
||||||
eprintf "%s\n%!" cmd;
|
|
||||||
if Sys.command cmd <> 0 then
|
|
||||||
error (f_"could not copy the VMX file from the remote server, \
|
|
||||||
- see earlier error messages");
|
|
||||||
- localfile
|
|
||||||
+ see earlier error messages")
|
|
||||||
|
|
||||||
(* Test if [path] exists on the remote server. *)
|
|
||||||
let remote_file_exists uri path =
|
|
||||||
diff --git a/input/ssh.mli b/input/ssh.mli
|
|
||||||
index e9a1a6a8..62e78bd3 100644
|
|
||||||
--- a/input/ssh.mli
|
|
||||||
+++ b/input/ssh.mli
|
|
||||||
@@ -27,8 +27,7 @@ val port_of_uri : Xml.uri -> int option
|
|
||||||
is ignored). *)
|
|
||||||
val remote_file_exists : Xml.uri -> string -> bool
|
|
||||||
|
|
||||||
-(** [scp_from_remote_to_temporary ssh_uri tmpdir filename]
|
|
||||||
+(** [download_file ssh_uri output]
|
|
||||||
uses scp to copy the single remote file at [ssh_uri] to
|
|
||||||
- the local file called [tmpdir/filename]. It returns the
|
|
||||||
- final path [tmpdir/filename]. *)
|
|
||||||
-val scp_from_remote_to_temporary : Xml.uri -> string -> string -> string
|
|
||||||
+ the local file called [output]. *)
|
|
||||||
+val download_file : Xml.uri -> string -> unit
|
|
@ -1,205 +0,0 @@
|
|||||||
From 40730615d2f691bc72777b4cb7356e2177edc1e1 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
||||||
Date: Mon, 15 Jan 2024 14:48:56 +0000
|
|
||||||
Subject: [PATCH] virt-v2v: -i vmx: Remove dependency of ssh.ml on Xml.uri
|
|
||||||
|
|
||||||
Xml.uri is a convenient way to pass the multiple ssh fields to
|
|
||||||
virt-v2v and is still used internally by the -i vmx code. However
|
|
||||||
don't leak this awkward implementation into the new ssh.ml module.
|
|
||||||
|
|
||||||
Like Nbdkit_ssh, we'll only deal with the explicit (password, port,
|
|
||||||
server, user, path) fields separately.
|
|
||||||
|
|
||||||
Note after this refactoring:
|
|
||||||
|
|
||||||
- The new Ssh module interface looks broadly similar to the
|
|
||||||
Nbdkit_ssh interface.
|
|
||||||
|
|
||||||
- vmx_source_of_arg assertions are no longer required inside the new
|
|
||||||
Ssh module, which was a mild layering violation before.
|
|
||||||
|
|
||||||
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
|
|
||||||
---
|
|
||||||
input/input_vmx.ml | 21 ++++++++++++++++-----
|
|
||||||
input/parse_domain_from_vmx.ml | 22 +++++++++++++++++++---
|
|
||||||
input/ssh.ml | 32 +++++++++++---------------------
|
|
||||||
input/ssh.mli | 21 ++++++++++-----------
|
|
||||||
4 files changed, 56 insertions(+), 40 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/input/input_vmx.ml b/input/input_vmx.ml
|
|
||||||
index b9cce10f..b3426fa2 100644
|
|
||||||
--- a/input/input_vmx.ml
|
|
||||||
+++ b/input/input_vmx.ml
|
|
||||||
@@ -83,22 +83,33 @@ module VMX = struct
|
|
||||||
let socket = sprintf "%s/in%d" dir i in
|
|
||||||
On_exit.unlink socket;
|
|
||||||
|
|
||||||
- let vmx_path = Ssh.path_of_uri uri in
|
|
||||||
+ let vmx_path =
|
|
||||||
+ match uri.uri_path with
|
|
||||||
+ | None -> assert false (* checked by vmx_source_of_arg *)
|
|
||||||
+ | Some path -> path in
|
|
||||||
let abs_path = absolute_path_from_other_file vmx_path filename in
|
|
||||||
let flat_vmdk = PCRE.replace (PCRE.compile "\\.vmdk$")
|
|
||||||
"-flat.vmdk" abs_path in
|
|
||||||
|
|
||||||
+ let server =
|
|
||||||
+ match uri.uri_server with
|
|
||||||
+ | None -> assert false (* checked by vmx_source_of_arg *)
|
|
||||||
+ | Some server -> server in
|
|
||||||
+ let port =
|
|
||||||
+ match uri.uri_port with
|
|
||||||
+ | i when i <= 0 -> None
|
|
||||||
+ | i -> Some (string_of_int i) in
|
|
||||||
+ let user = uri.Xml.uri_user in
|
|
||||||
+
|
|
||||||
(* RHBZ#1774386 *)
|
|
||||||
- if not (Ssh.remote_file_exists uri flat_vmdk) then
|
|
||||||
+ if not (Ssh.remote_file_exists ~password ?port ~server ?user
|
|
||||||
+ flat_vmdk) then
|
|
||||||
error (f_"This transport does not support guests with snapshots. \
|
|
||||||
Either collapse the snapshots for this guest and try \
|
|
||||||
the conversion again, or use one of the alternate \
|
|
||||||
conversion methods described in \
|
|
||||||
virt-v2v-input-vmware(1) section \"NOTES\".");
|
|
||||||
|
|
||||||
- let server = Ssh.server_of_uri uri in
|
|
||||||
- let port = Option.map string_of_int (Ssh.port_of_uri uri) in
|
|
||||||
- let user = uri.Xml.uri_user in
|
|
||||||
let cor = dir // "convert" in
|
|
||||||
let bandwidth = options.bandwidth in
|
|
||||||
let nbdkit = Nbdkit_ssh.create_ssh ?bandwidth ~cor ~password
|
|
||||||
diff --git a/input/parse_domain_from_vmx.ml b/input/parse_domain_from_vmx.ml
|
|
||||||
index 0719738c..99c86b1a 100644
|
|
||||||
--- a/input/parse_domain_from_vmx.ml
|
|
||||||
+++ b/input/parse_domain_from_vmx.ml
|
|
||||||
@@ -334,9 +334,22 @@ let parse_domain_from_vmx vmx_source =
|
|
||||||
let vmx =
|
|
||||||
match vmx_source with
|
|
||||||
| File filename -> Parse_vmx.parse_file filename
|
|
||||||
- | SSH (_, uri) ->
|
|
||||||
+ | SSH (password, uri) ->
|
|
||||||
+ let server =
|
|
||||||
+ match uri.uri_server with
|
|
||||||
+ | None -> assert false (* checked by vmx_source_of_arg *)
|
|
||||||
+ | Some server -> server in
|
|
||||||
+ let port =
|
|
||||||
+ match uri.uri_port with
|
|
||||||
+ | i when i <= 0 -> None
|
|
||||||
+ | i -> Some (string_of_int i) in
|
|
||||||
+ let user = uri.Xml.uri_user in
|
|
||||||
+ let path =
|
|
||||||
+ match uri.uri_path with
|
|
||||||
+ | None -> assert false (* checked by vmx_source_of_arg *)
|
|
||||||
+ | Some path -> path in
|
|
||||||
let filename = tmpdir // "source.vmx" in
|
|
||||||
- Ssh.download_file uri filename;
|
|
||||||
+ Ssh.download_file ~password ?port ~server ?user path filename;
|
|
||||||
Parse_vmx.parse_file filename in
|
|
||||||
|
|
||||||
let name =
|
|
||||||
@@ -346,7 +359,10 @@ let parse_domain_from_vmx vmx_source =
|
|
||||||
warning (f_"no displayName key found in VMX file");
|
|
||||||
match vmx_source with
|
|
||||||
| File filename -> name_from_disk filename
|
|
||||||
- | SSH (_, uri) -> name_from_disk (Ssh.path_of_uri uri) in
|
|
||||||
+ | SSH (_, uri) ->
|
|
||||||
+ match uri.uri_path with
|
|
||||||
+ | None -> assert false (* checked by vmx_source_of_arg *)
|
|
||||||
+ | Some path -> name_from_disk path in
|
|
||||||
|
|
||||||
let genid =
|
|
||||||
(* See: https://lists.nongnu.org/archive/html/qemu-devel/2018-07/msg02019.html *)
|
|
||||||
diff --git a/input/ssh.ml b/input/ssh.ml
|
|
||||||
index 63ffeb12..127e818c 100644
|
|
||||||
--- a/input/ssh.ml
|
|
||||||
+++ b/input/ssh.ml
|
|
||||||
@@ -22,29 +22,19 @@ open Common_gettext.Gettext
|
|
||||||
|
|
||||||
open Printf
|
|
||||||
|
|
||||||
-(* Return various fields from the URI. The checks in vmx_source_of_arg
|
|
||||||
- * should ensure that none of these assertions fail.
|
|
||||||
- *)
|
|
||||||
-let port_of_uri { Xml.uri_port } =
|
|
||||||
- match uri_port with i when i <= 0 -> None | i -> Some i
|
|
||||||
-let server_of_uri { Xml.uri_server } =
|
|
||||||
- match uri_server with None -> assert false | Some s -> s
|
|
||||||
-let path_of_uri { Xml.uri_path } =
|
|
||||||
- match uri_path with None -> assert false | Some p -> p
|
|
||||||
-
|
|
||||||
(* 'scp' a remote file into a local file. *)
|
|
||||||
-let download_file uri output =
|
|
||||||
+let download_file ~password:_ ?port ~server ?user path output =
|
|
||||||
let cmd =
|
|
||||||
sprintf "scp%s%s %s%s:%s %s"
|
|
||||||
(if verbose () then "" else " -q")
|
|
||||||
- (match port_of_uri uri with
|
|
||||||
+ (match port with
|
|
||||||
| None -> ""
|
|
||||||
- | Some port -> sprintf " -P %d" port)
|
|
||||||
- (match uri.Xml.uri_user with
|
|
||||||
+ | Some port -> sprintf " -P %s" port)
|
|
||||||
+ (match user with
|
|
||||||
| None -> ""
|
|
||||||
| Some user -> quote user ^ "@")
|
|
||||||
- (quote (server_of_uri uri))
|
|
||||||
- (quote (path_of_uri uri))
|
|
||||||
+ (quote server)
|
|
||||||
+ (quote path)
|
|
||||||
(quote output) in
|
|
||||||
if verbose () then
|
|
||||||
eprintf "%s\n%!" cmd;
|
|
||||||
@@ -53,16 +43,16 @@ let download_file uri output =
|
|
||||||
see earlier error messages")
|
|
||||||
|
|
||||||
(* Test if [path] exists on the remote server. *)
|
|
||||||
-let remote_file_exists uri path =
|
|
||||||
+let remote_file_exists ~password:_ ?port ~server ?user path =
|
|
||||||
let cmd =
|
|
||||||
sprintf "ssh%s %s%s test -f %s"
|
|
||||||
- (match port_of_uri uri with
|
|
||||||
+ (match port with
|
|
||||||
| None -> ""
|
|
||||||
- | Some port -> sprintf " -p %d" port)
|
|
||||||
- (match uri.Xml.uri_user with
|
|
||||||
+ | Some port -> sprintf " -p %s" port)
|
|
||||||
+ (match user with
|
|
||||||
| None -> ""
|
|
||||||
| Some user -> quote user ^ "@")
|
|
||||||
- (quote (server_of_uri uri))
|
|
||||||
+ (quote server)
|
|
||||||
(* Double quoting is necessary for 'ssh', first to protect
|
|
||||||
* from the local shell, second to protect from the remote
|
|
||||||
* shell. https://github.com/libguestfs/virt-v2v/issues/35#issuecomment-1741730963
|
|
||||||
diff --git a/input/ssh.mli b/input/ssh.mli
|
|
||||||
index 62e78bd3..1f39cd1b 100644
|
|
||||||
--- a/input/ssh.mli
|
|
||||||
+++ b/input/ssh.mli
|
|
||||||
@@ -18,16 +18,15 @@
|
|
||||||
|
|
||||||
(** Wrappers for finding and downloading remote files over ssh. *)
|
|
||||||
|
|
||||||
-val path_of_uri : Xml.uri -> string
|
|
||||||
-val server_of_uri : Xml.uri -> string
|
|
||||||
-val port_of_uri : Xml.uri -> int option
|
|
||||||
+(** [remote_file_exists password ?port server ?user path]
|
|
||||||
+ checks that [path] exists on the remote server. *)
|
|
||||||
+val remote_file_exists : password:Nbdkit_ssh.password ->
|
|
||||||
+ ?port:string -> server:string -> ?user:string ->
|
|
||||||
+ string -> bool
|
|
||||||
|
|
||||||
-(** [remote_file_exists ssh_uri path] checks that [path] exists
|
|
||||||
- on the remote server [ssh_uri] (note any path inside [ssh_uri]
|
|
||||||
- is ignored). *)
|
|
||||||
-val remote_file_exists : Xml.uri -> string -> bool
|
|
||||||
-
|
|
||||||
-(** [download_file ssh_uri output]
|
|
||||||
- uses scp to copy the single remote file at [ssh_uri] to
|
|
||||||
+(** [download_file password ?port server ?user path output]
|
|
||||||
+ uses scp to copy the single remote file at [path] to
|
|
||||||
the local file called [output]. *)
|
|
||||||
-val download_file : Xml.uri -> string -> unit
|
|
||||||
+val download_file : password:Nbdkit_ssh.password ->
|
|
||||||
+ ?port:string -> server:string -> ?user:string -> string ->
|
|
||||||
+ string -> unit
|
|
@ -1,55 +0,0 @@
|
|||||||
From 72c9734050f0235c80ff7d685282a57836a70bd5 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
||||||
Date: Mon, 15 Jan 2024 16:21:34 +0000
|
|
||||||
Subject: [PATCH] input/nbdkit_ssh: Make retry filter optional
|
|
||||||
|
|
||||||
This filter retries a request on failure. Add a flag to make this
|
|
||||||
filter optional, but default to using it if available (so there's no
|
|
||||||
change to default behaviour).
|
|
||||||
|
|
||||||
The reason we want to make this optional is that the next commit will
|
|
||||||
want to use nbdkit-ssh-plugin to probe to see if a remote file is
|
|
||||||
present, and we don't want to retry that probe on failure.
|
|
||||||
|
|
||||||
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
|
|
||||||
---
|
|
||||||
input/nbdkit_ssh.ml | 6 ++++--
|
|
||||||
input/nbdkit_ssh.mli | 1 +
|
|
||||||
2 files changed, 5 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/input/nbdkit_ssh.ml b/input/nbdkit_ssh.ml
|
|
||||||
index 3f6da9b6..3b72d3ad 100644
|
|
||||||
--- a/input/nbdkit_ssh.ml
|
|
||||||
+++ b/input/nbdkit_ssh.ml
|
|
||||||
@@ -44,7 +44,8 @@ let error_unless_nbdkit_min_version config =
|
|
||||||
error_unless_nbdkit_version_ge config nbdkit_min_version
|
|
||||||
|
|
||||||
(* Create an nbdkit module specialized for reading from SSH sources. *)
|
|
||||||
-let create_ssh ?bandwidth ?cor ~password ?port ~server ?user path =
|
|
||||||
+let create_ssh ?bandwidth ?cor ?(retry=true)
|
|
||||||
+ ~password ?port ~server ?user path =
|
|
||||||
if not (Nbdkit.is_installed ()) then
|
|
||||||
error (f_"nbdkit is not installed or not working");
|
|
||||||
|
|
||||||
@@ -67,7 +68,8 @@ let create_ssh ?bandwidth ?cor ~password ?port ~server ?user path =
|
|
||||||
(* Retry filter (if it exists) can be used to get around brief
|
|
||||||
* interruptions in service. It must be closest to the plugin.
|
|
||||||
*)
|
|
||||||
- Nbdkit.add_filter_if_available cmd "retry";
|
|
||||||
+ if retry then
|
|
||||||
+ Nbdkit.add_filter_if_available cmd "retry";
|
|
||||||
|
|
||||||
(* Caching extents speeds up qemu-img, especially its consecutive
|
|
||||||
* block_status requests with req_one=1.
|
|
||||||
diff --git a/input/nbdkit_ssh.mli b/input/nbdkit_ssh.mli
|
|
||||||
index bc798c5a..daa20bb2 100644
|
|
||||||
--- a/input/nbdkit_ssh.mli
|
|
||||||
+++ b/input/nbdkit_ssh.mli
|
|
||||||
@@ -25,6 +25,7 @@ type password =
|
|
||||||
|
|
||||||
val create_ssh : ?bandwidth:Types.bandwidth ->
|
|
||||||
?cor:string ->
|
|
||||||
+ ?retry:bool ->
|
|
||||||
password:password ->
|
|
||||||
?port:string ->
|
|
||||||
server:string ->
|
|
@ -1,167 +0,0 @@
|
|||||||
From fb72e059863a60503b6011b8590c25c3a010a58f Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
||||||
Date: Mon, 15 Jan 2024 15:38:30 +0000
|
|
||||||
Subject: [PATCH] virt-v2v: -i vmx: Replace external ssh/scp with
|
|
||||||
nbdkit-ssh-plugin
|
|
||||||
|
|
||||||
If you use a -i vmx ssh filename containing '*' then it will expand
|
|
||||||
the glob at the remote side. New scp is weird and silently creates a
|
|
||||||
directory on the local side. For example suppose there's a remote
|
|
||||||
file literally called "/tmp/test*" (ie. the '*' is part of the
|
|
||||||
filename) and you thought you could copy that to local using:
|
|
||||||
|
|
||||||
scp 'remote:/tmp/test*' '/tmp/test*'
|
|
||||||
|
|
||||||
scp treats the first parameter (only) as a wildcard and if there are
|
|
||||||
multiple files matching the wildcard /tmp/test*, will create a local
|
|
||||||
directory literally called "/tmp/test*/" and put the files into it.
|
|
||||||
Who expected any of that?
|
|
||||||
|
|
||||||
You might think that double quoting (as we used to use) might work,
|
|
||||||
but that breaks with spaces and quotes. I guess scp is using
|
|
||||||
different code paths internally for glob versus everything else.
|
|
||||||
|
|
||||||
The only way to really make this work is to stop using scp entirely
|
|
||||||
and just use sftp directly. The easiest way to use sftp is to use
|
|
||||||
nbdkit-ssh-plugin. We already depend on nbdkit-ssh-plugin, nbdcopy
|
|
||||||
and nbdinfo for other parts of virt-v2v, so might as well use the
|
|
||||||
whole lot here.
|
|
||||||
|
|
||||||
One advantage of this change is that now the -ip (input password)
|
|
||||||
parameter actually works in -i vmx -it ssh mode.
|
|
||||||
|
|
||||||
Other approaches that would have been possible:
|
|
||||||
|
|
||||||
- Use the OCaml NBD library instead of nbdcopy/nbdinfo
|
|
||||||
|
|
||||||
- Use 'nbdkit -U - ssh --run ...'
|
|
||||||
|
|
||||||
- Direct binding to libssh.
|
|
||||||
|
|
||||||
See also commit e2af12ba69c4463bb73d30db63290a887cdd41eb
|
|
||||||
("input: -i vmx: Remove support for openssh scp < 8.8")
|
|
||||||
|
|
||||||
See also commit 22c5b98ab78c734b478c26e14ee62e2a065aaa0c
|
|
||||||
("-it ssh: Double quote ssh command which tests remote file exists")
|
|
||||||
|
|
||||||
See also https://unix.stackexchange.com/a/587710
|
|
||||||
|
|
||||||
Reported-by: Ming Xie
|
|
||||||
Fixes: https://issues.redhat.com/browse/RHEL-21365
|
|
||||||
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
|
|
||||||
---
|
|
||||||
input/ssh.ml | 70 +++++++++++++++++++++++++--------------------------
|
|
||||||
input/ssh.mli | 7 ++++--
|
|
||||||
2 files changed, 40 insertions(+), 37 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/input/ssh.ml b/input/ssh.ml
|
|
||||||
index 127e818c..71ebbf2a 100644
|
|
||||||
--- a/input/ssh.ml
|
|
||||||
+++ b/input/ssh.ml
|
|
||||||
@@ -18,46 +18,46 @@
|
|
||||||
|
|
||||||
open Std_utils
|
|
||||||
open Tools_utils
|
|
||||||
+open Unix_utils
|
|
||||||
open Common_gettext.Gettext
|
|
||||||
|
|
||||||
open Printf
|
|
||||||
|
|
||||||
-(* 'scp' a remote file into a local file. *)
|
|
||||||
-let download_file ~password:_ ?port ~server ?user path output =
|
|
||||||
- let cmd =
|
|
||||||
- sprintf "scp%s%s %s%s:%s %s"
|
|
||||||
- (if verbose () then "" else " -q")
|
|
||||||
- (match port with
|
|
||||||
- | None -> ""
|
|
||||||
- | Some port -> sprintf " -P %s" port)
|
|
||||||
- (match user with
|
|
||||||
- | None -> ""
|
|
||||||
- | Some user -> quote user ^ "@")
|
|
||||||
- (quote server)
|
|
||||||
- (quote path)
|
|
||||||
- (quote output) in
|
|
||||||
- if verbose () then
|
|
||||||
- eprintf "%s\n%!" cmd;
|
|
||||||
- if Sys.command cmd <> 0 then
|
|
||||||
+let start_nbdkit ~password ?port ~server ?user path =
|
|
||||||
+ (* Create a random location for the socket used to talk to nbdkit. *)
|
|
||||||
+ let sockdir = Mkdtemp.temp_dir "v2vssh." in
|
|
||||||
+ On_exit.rm_rf sockdir;
|
|
||||||
+ let id = unique () in
|
|
||||||
+ let socket = sockdir // sprintf "nbdkit%d.sock" id in
|
|
||||||
+
|
|
||||||
+ (* Note: Disabling the retry filter helps in the missing file case,
|
|
||||||
+ * otherwise nbdkit takes ages to time out. We're not expecting that
|
|
||||||
+ * the VMX file is large, so using this filter isn't necessary.
|
|
||||||
+ *)
|
|
||||||
+ let nbdkit =
|
|
||||||
+ Nbdkit_ssh.create_ssh ~retry:false ~password ~server ?port ?user path in
|
|
||||||
+ Nbdkit.set_readonly nbdkit true;
|
|
||||||
+ let _, pid = Nbdkit.run_unix socket nbdkit in
|
|
||||||
+ On_exit.kill pid;
|
|
||||||
+
|
|
||||||
+ (* Return the URI of nbdkit. *)
|
|
||||||
+ "nbd+unix://?socket=" ^ socket
|
|
||||||
+
|
|
||||||
+(* Download a remote file into a local file. *)
|
|
||||||
+let download_file ~password ?port ~server ?user path output =
|
|
||||||
+ let uri = start_nbdkit ~password ?port ~server ?user path in
|
|
||||||
+
|
|
||||||
+ let cmd = [ "nbdcopy"; uri; output ] in
|
|
||||||
+ if run_command cmd <> 0 then
|
|
||||||
error (f_"could not copy the VMX file from the remote server, \
|
|
||||||
see earlier error messages")
|
|
||||||
|
|
||||||
(* Test if [path] exists on the remote server. *)
|
|
||||||
-let remote_file_exists ~password:_ ?port ~server ?user path =
|
|
||||||
- let cmd =
|
|
||||||
- sprintf "ssh%s %s%s test -f %s"
|
|
||||||
- (match port with
|
|
||||||
- | None -> ""
|
|
||||||
- | Some port -> sprintf " -p %s" port)
|
|
||||||
- (match user with
|
|
||||||
- | None -> ""
|
|
||||||
- | Some user -> quote user ^ "@")
|
|
||||||
- (quote server)
|
|
||||||
- (* Double quoting is necessary for 'ssh', first to protect
|
|
||||||
- * from the local shell, second to protect from the remote
|
|
||||||
- * shell. https://github.com/libguestfs/virt-v2v/issues/35#issuecomment-1741730963
|
|
||||||
- *)
|
|
||||||
- (quote (quote path)) in
|
|
||||||
- if verbose () then
|
|
||||||
- eprintf "%s\n%!" cmd;
|
|
||||||
- Sys.command cmd = 0
|
|
||||||
+let remote_file_exists ~password ?port ~server ?user path =
|
|
||||||
+ let uri = start_nbdkit ~password ?port ~server ?user path in
|
|
||||||
+
|
|
||||||
+ (* Testing for remote size using nbdinfo should be sufficient to
|
|
||||||
+ * prove the remote file exists.
|
|
||||||
+ *)
|
|
||||||
+ let cmd = [ "nbdinfo"; "--size"; uri ] in
|
|
||||||
+ run_command cmd = 0
|
|
||||||
diff --git a/input/ssh.mli b/input/ssh.mli
|
|
||||||
index 1f39cd1b..40843024 100644
|
|
||||||
--- a/input/ssh.mli
|
|
||||||
+++ b/input/ssh.mli
|
|
||||||
@@ -16,7 +16,10 @@
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*)
|
|
||||||
|
|
||||||
-(** Wrappers for finding and downloading remote files over ssh. *)
|
|
||||||
+(** Wrappers for finding and downloading remote files over ssh.
|
|
||||||
+
|
|
||||||
+ Internally this uses nbdkit-ssh-plugin (which uses sftp) as
|
|
||||||
+ that is much more predictable than running external ssh / scp. *)
|
|
||||||
|
|
||||||
(** [remote_file_exists password ?port server ?user path]
|
|
||||||
checks that [path] exists on the remote server. *)
|
|
||||||
@@ -25,7 +28,7 @@ val remote_file_exists : password:Nbdkit_ssh.password ->
|
|
||||||
string -> bool
|
|
||||||
|
|
||||||
(** [download_file password ?port server ?user path output]
|
|
||||||
- uses scp to copy the single remote file at [path] to
|
|
||||||
+ downloads the single remote file at [path] to
|
|
||||||
the local file called [output]. *)
|
|
||||||
val download_file : password:Nbdkit_ssh.password ->
|
|
||||||
?port:string -> server:string -> ?user:string -> string ->
|
|
@ -1,104 +0,0 @@
|
|||||||
From 4f0758a95a4b32a5c837cf86d2fa4442d3e136ec Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
||||||
Date: Tue, 16 Jan 2024 10:31:50 +0000
|
|
||||||
Subject: [PATCH] input/ssh: Rearrange parameters specifying ssh server
|
|
||||||
|
|
||||||
---
|
|
||||||
input/nbdkit_ssh.ml | 2 +-
|
|
||||||
input/nbdkit_ssh.mli | 4 ++--
|
|
||||||
input/ssh.ml | 10 +++++-----
|
|
||||||
input/ssh.mli | 13 +++++++------
|
|
||||||
4 files changed, 15 insertions(+), 14 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/input/nbdkit_ssh.ml b/input/nbdkit_ssh.ml
|
|
||||||
index bc96df13..ae93e4e8 100644
|
|
||||||
--- a/input/nbdkit_ssh.ml
|
|
||||||
+++ b/input/nbdkit_ssh.ml
|
|
||||||
@@ -44,7 +44,7 @@ let error_unless_nbdkit_min_version config =
|
|
||||||
|
|
||||||
(* Create an nbdkit module specialized for reading from SSH sources. *)
|
|
||||||
let create_ssh ?bandwidth ?cor ?(retry=true)
|
|
||||||
- ?password ?port ~server ?user path =
|
|
||||||
+ ~server ?port ?user ?password path =
|
|
||||||
if not (Nbdkit.is_installed ()) then
|
|
||||||
error (f_"nbdkit is not installed or not working");
|
|
||||||
|
|
||||||
diff --git a/input/nbdkit_ssh.mli b/input/nbdkit_ssh.mli
|
|
||||||
index 8ea8dea4..c26f539a 100644
|
|
||||||
--- a/input/nbdkit_ssh.mli
|
|
||||||
+++ b/input/nbdkit_ssh.mli
|
|
||||||
@@ -25,10 +25,10 @@ type password = (** Use [None] for no password *)
|
|
||||||
val create_ssh : ?bandwidth:Types.bandwidth ->
|
|
||||||
?cor:string ->
|
|
||||||
?retry:bool ->
|
|
||||||
- ?password:password ->
|
|
||||||
- ?port:string ->
|
|
||||||
server:string ->
|
|
||||||
+ ?port:string ->
|
|
||||||
?user:string ->
|
|
||||||
+ ?password:password ->
|
|
||||||
string -> Nbdkit.cmd
|
|
||||||
(** Create a nbdkit object using the SSH plugin. The required
|
|
||||||
string parameter is the remote path.
|
|
||||||
diff --git a/input/ssh.ml b/input/ssh.ml
|
|
||||||
index 10c61bbf..d3b6dc0c 100644
|
|
||||||
--- a/input/ssh.ml
|
|
||||||
+++ b/input/ssh.ml
|
|
||||||
@@ -23,7 +23,7 @@ open Common_gettext.Gettext
|
|
||||||
|
|
||||||
open Printf
|
|
||||||
|
|
||||||
-let start_nbdkit ?password ?port ~server ?user path =
|
|
||||||
+let start_nbdkit ~server ?port ?user ?password path =
|
|
||||||
(* Create a random location for the socket used to talk to nbdkit. *)
|
|
||||||
let sockdir = Mkdtemp.temp_dir "v2vssh." in
|
|
||||||
On_exit.rm_rf sockdir;
|
|
||||||
@@ -44,8 +44,8 @@ let start_nbdkit ?password ?port ~server ?user path =
|
|
||||||
"nbd+unix://?socket=" ^ socket
|
|
||||||
|
|
||||||
(* Download a remote file into a local file. *)
|
|
||||||
-let download_file ?password ?port ~server ?user path output =
|
|
||||||
- let uri = start_nbdkit ?password ?port ~server ?user path in
|
|
||||||
+let download_file ~server ?port ?user ?password path output =
|
|
||||||
+ let uri = start_nbdkit ~server ?port ?user ?password path in
|
|
||||||
|
|
||||||
let cmd = [ "nbdcopy"; uri; output ] in
|
|
||||||
if run_command cmd <> 0 then
|
|
||||||
@@ -53,8 +53,8 @@ let download_file ?password ?port ~server ?user path output =
|
|
||||||
see earlier error messages")
|
|
||||||
|
|
||||||
(* Test if [path] exists on the remote server. *)
|
|
||||||
-let remote_file_exists ?password ?port ~server ?user path =
|
|
||||||
- let uri = start_nbdkit ?password ?port ~server ?user path in
|
|
||||||
+let remote_file_exists ~server ?port ?user ?password path =
|
|
||||||
+ let uri = start_nbdkit ~server ?port ?user ?password path in
|
|
||||||
|
|
||||||
(* Testing for remote size using nbdinfo should be sufficient to
|
|
||||||
* prove the remote file exists.
|
|
||||||
diff --git a/input/ssh.mli b/input/ssh.mli
|
|
||||||
index 6d9f1370..ebce46ff 100644
|
|
||||||
--- a/input/ssh.mli
|
|
||||||
+++ b/input/ssh.mli
|
|
||||||
@@ -21,15 +21,16 @@
|
|
||||||
Internally this uses nbdkit-ssh-plugin (which uses sftp) as
|
|
||||||
that is much more predictable than running external ssh / scp. *)
|
|
||||||
|
|
||||||
-(** [remote_file_exists ?password ?port server ?user path]
|
|
||||||
+(** [remote_file_exists server ?port ?user ?password path]
|
|
||||||
checks that [path] exists on the remote server. *)
|
|
||||||
-val remote_file_exists : ?password:Nbdkit_ssh.password ->
|
|
||||||
- ?port:string -> server:string -> ?user:string ->
|
|
||||||
+val remote_file_exists : server:string -> ?port:string ->
|
|
||||||
+ ?user:string -> ?password:Nbdkit_ssh.password ->
|
|
||||||
string -> bool
|
|
||||||
|
|
||||||
-(** [download_file ?password ?port server ?user path output]
|
|
||||||
+(** [download_file server ?port ?user ?password path output]
|
|
||||||
downloads the single remote file at [path] to
|
|
||||||
the local file called [output]. *)
|
|
||||||
-val download_file : ?password:Nbdkit_ssh.password ->
|
|
||||||
- ?port:string -> server:string -> ?user:string -> string ->
|
|
||||||
+val download_file : server:string -> ?port:string ->
|
|
||||||
+ ?user:string -> ?password:Nbdkit_ssh.password ->
|
|
||||||
+ string ->
|
|
||||||
string -> unit
|
|
@ -1,54 +0,0 @@
|
|||||||
From 67fcf66904c7f1f6da858eba35e95dad670427c0 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
||||||
Date: Wed, 17 Jan 2024 14:16:10 +0000
|
|
||||||
Subject: [PATCH] docs: Remove paragraph about -ip passwords and ssh/scp
|
|
||||||
|
|
||||||
The documentation suggested (correctly) that the -ip option did not
|
|
||||||
cover all cases where we make an ssh connection to either VMware or
|
|
||||||
Xen. However with the recent change where we use nbdkit-ssh-plugin in
|
|
||||||
preference to ssh/scp (commit fb72e05986, "virt-v2v: -i vmx: Replace
|
|
||||||
external ssh/scp with nbdkit-ssh-plugin") this should no longer be
|
|
||||||
true for VMware. And I don't think it was true for Xen for a while.
|
|
||||||
|
|
||||||
Therefore remove this paragraph in the documentation (in two places).
|
|
||||||
|
|
||||||
See-also: https://bugzilla.redhat.com/show_bug.cgi?id=1854275
|
|
||||||
See-also: https://lists.libguestfs.org/archives/list/guestfs@lists.libguestfs.org/thread/CKBEYJHUZWLDUUDWAJM2JU6QIKZGTD6F/
|
|
||||||
Suggested-by: Laszlo Ersek
|
|
||||||
---
|
|
||||||
docs/virt-v2v-input-vmware.pod | 5 -----
|
|
||||||
docs/virt-v2v-input-xen.pod | 5 -----
|
|
||||||
2 files changed, 10 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/docs/virt-v2v-input-vmware.pod b/docs/virt-v2v-input-vmware.pod
|
|
||||||
index 48849f88..fe59222a 100644
|
|
||||||
--- a/docs/virt-v2v-input-vmware.pod
|
|
||||||
+++ b/docs/virt-v2v-input-vmware.pod
|
|
||||||
@@ -155,11 +155,6 @@ virt-v2v server to the ESXi hypervisor. For example:
|
|
||||||
$ ssh root@esxi.example.com
|
|
||||||
[ logs straight into the shell, no password is requested ]
|
|
||||||
|
|
||||||
-Note that support for non-interactive authentication via the I<-ip>
|
|
||||||
-option is incomplete. Some operations remain that still require the
|
|
||||||
-user to enter the password manually. Therefore ssh-agent is recommended
|
|
||||||
-over the I<-ip> option. See L<https://bugzilla.redhat.com/1854275>.
|
|
||||||
-
|
|
||||||
=head3 VMX: Construct the SSH URI
|
|
||||||
|
|
||||||
When using the SSH input transport you must specify a remote
|
|
||||||
diff --git a/docs/virt-v2v-input-xen.pod b/docs/virt-v2v-input-xen.pod
|
|
||||||
index 4a0544f8..38dc8f7b 100644
|
|
||||||
--- a/docs/virt-v2v-input-xen.pod
|
|
||||||
+++ b/docs/virt-v2v-input-xen.pod
|
|
||||||
@@ -32,11 +32,6 @@ server to the Xen host. For example:
|
|
||||||
$ ssh root@xen.example.com
|
|
||||||
[ logs straight into the shell, no password is requested ]
|
|
||||||
|
|
||||||
-Note that support for non-interactive authentication via the I<-ip>
|
|
||||||
-option is incomplete. Some operations remain that still require the
|
|
||||||
-user to enter the password manually. Therefore ssh-agent is recommended
|
|
||||||
-over the I<-ip> option. See L<https://bugzilla.redhat.com/1854275>.
|
|
||||||
-
|
|
||||||
With some modern ssh implementations, legacy crypto algorithms required
|
|
||||||
to interoperate with RHEL 5 sshd are disabled. To enable them, you may
|
|
||||||
need to add the following C<Host> stanza to your F<~/.ssh/config>:
|
|
@ -1,62 +0,0 @@
|
|||||||
From 970d7123c2025bc148870f4bc6fa75fa9e95905f Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
||||||
Date: Thu, 18 Jan 2024 17:22:26 +0000
|
|
||||||
Subject: [PATCH] input/ssh: Use nbdinfo --can connect (instead of --size)
|
|
||||||
|
|
||||||
nbdinfo --size prints the size on stdout, causing it to appear in
|
|
||||||
virt-v2v output. Using --can connect instead is silent.
|
|
||||||
|
|
||||||
Note that nbdinfo --can connect was added in libnbd 1.9.2 (Jul 2021)
|
|
||||||
and our previous minimum version of libnbd was 1.9.3 so we're OK.
|
|
||||||
However since neither of these was a stable version I also updated the
|
|
||||||
minimum libnbd requirement to 1.10 (Sep 2021), and added a proper
|
|
||||||
check in ./configure
|
|
||||||
|
|
||||||
Fixes: commit fb72e059863a60503b6011b8590c25c3a010a58f
|
|
||||||
---
|
|
||||||
README | 2 +-
|
|
||||||
input/ssh.ml | 4 ++--
|
|
||||||
m4/guestfs-libraries.m4 | 2 +-
|
|
||||||
3 files changed, 4 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/README b/README
|
|
||||||
index 5810f77d..f94bd6de 100644
|
|
||||||
--- a/README
|
|
||||||
+++ b/README
|
|
||||||
@@ -51,7 +51,7 @@ REQUIREMENTS
|
|
||||||
|
|
||||||
* OCaml bindings for libvirt (https://gitlab.com/libvirt/libvirt-ocaml)
|
|
||||||
|
|
||||||
-* libnbd >= 1.9.3 (https://gitlab.com/nbdkit/libnbd)
|
|
||||||
+* libnbd >= 1.10 (https://gitlab.com/nbdkit/libnbd)
|
|
||||||
|
|
||||||
* OCaml bindings for libnbd
|
|
||||||
|
|
||||||
diff --git a/input/ssh.ml b/input/ssh.ml
|
|
||||||
index d3b6dc0c..e35a2b5a 100644
|
|
||||||
--- a/input/ssh.ml
|
|
||||||
+++ b/input/ssh.ml
|
|
||||||
@@ -56,8 +56,8 @@ let download_file ~server ?port ?user ?password path output =
|
|
||||||
let remote_file_exists ~server ?port ?user ?password path =
|
|
||||||
let uri = start_nbdkit ~server ?port ?user ?password path in
|
|
||||||
|
|
||||||
- (* Testing for remote size using nbdinfo should be sufficient to
|
|
||||||
+ (* Testing that we can connect to the nbdkit server is enough to
|
|
||||||
* prove the remote file exists.
|
|
||||||
*)
|
|
||||||
- let cmd = [ "nbdinfo"; "--size"; uri ] in
|
|
||||||
+ let cmd = [ "nbdinfo"; "--can"; "connect"; uri ] in
|
|
||||||
run_command cmd = 0
|
|
||||||
diff --git a/m4/guestfs-libraries.m4 b/m4/guestfs-libraries.m4
|
|
||||||
index 33b5100e..6789a2cb 100644
|
|
||||||
--- a/m4/guestfs-libraries.m4
|
|
||||||
+++ b/m4/guestfs-libraries.m4
|
|
||||||
@@ -21,7 +21,7 @@ dnl Of course we need libguestfs.
|
|
||||||
PKG_CHECK_MODULES([LIBGUESTFS], [libguestfs >= 1.44])
|
|
||||||
|
|
||||||
dnl And libnbd.
|
|
||||||
-PKG_CHECK_MODULES([LIBNBD], [libnbd])
|
|
||||||
+PKG_CHECK_MODULES([LIBNBD], [libnbd >= 1.10])
|
|
||||||
|
|
||||||
dnl Test if it's GNU or XSI strerror_r.
|
|
||||||
AC_FUNC_STRERROR_R
|
|
@ -1,4 +1,4 @@
|
|||||||
From a2e7cf38ee640e9e806a680cf55f78d33a3c0ee8 Mon Sep 17 00:00:00 2001
|
From be45d1e5bca42148c295da10c27c485c72de28c3 Mon Sep 17 00:00:00 2001
|
||||||
From: Pino Toscano <ptoscano@redhat.com>
|
From: Pino Toscano <ptoscano@redhat.com>
|
||||||
Date: Tue, 26 Mar 2019 09:42:25 +0100
|
Date: Tue, 26 Mar 2019 09:42:25 +0100
|
||||||
Subject: [PATCH] RHEL: point to KB for supported v2v hypervisors/guests
|
Subject: [PATCH] RHEL: point to KB for supported v2v hypervisors/guests
|
@ -1,43 +0,0 @@
|
|||||||
From aafcd0d11453d8d58a32e66285f12ec3ba3440de Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
||||||
Date: Thu, 18 Jan 2024 17:32:01 +0000
|
|
||||||
Subject: [PATCH] build: Document that nbdinfo and nbdcopy are required, and
|
|
||||||
check
|
|
||||||
|
|
||||||
Update README to document that these tools have been needed (ever
|
|
||||||
since virt-v2v 2.0), and update ./configure to check it.
|
|
||||||
---
|
|
||||||
README | 2 ++
|
|
||||||
m4/guestfs-progs.m4 | 6 ++++++
|
|
||||||
2 files changed, 8 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/README b/README
|
|
||||||
index f94bd6de..4354754f 100644
|
|
||||||
--- a/README
|
|
||||||
+++ b/README
|
|
||||||
@@ -53,6 +53,8 @@ REQUIREMENTS
|
|
||||||
|
|
||||||
* libnbd >= 1.10 (https://gitlab.com/nbdkit/libnbd)
|
|
||||||
|
|
||||||
+* The 'nbdinfo' and 'nbdcopy' programs from libnbd.
|
|
||||||
+
|
|
||||||
* OCaml bindings for libnbd
|
|
||||||
|
|
||||||
* nbdkit >= 1.27.4 (https://gitlab.com/nbdkit/nbdkit)
|
|
||||||
diff --git a/m4/guestfs-progs.m4 b/m4/guestfs-progs.m4
|
|
||||||
index 7c5f0d81..ae5094ce 100644
|
|
||||||
--- a/m4/guestfs-progs.m4
|
|
||||||
+++ b/m4/guestfs-progs.m4
|
|
||||||
@@ -59,6 +59,12 @@ AM_CONDITIONAL([HAVE_ZIP],[test "x$ZIP" != "xno"])
|
|
||||||
AC_PATH_PROGS([UNZIP],[unzip],[no])
|
|
||||||
AC_DEFINE_UNQUOTED([UNZIP],["$UNZIP"],[Name of unzip program.])
|
|
||||||
|
|
||||||
+dnl nbdinfo, nbdcopy, required by virt-v2v
|
|
||||||
+AC_CHECK_PROG([NBDINFO], [nbdinfo], [nbdinfo], [no])
|
|
||||||
+AC_CHECK_PROG([NBDCOPY], [nbdcopy], [nbdcopy], [no])
|
|
||||||
+AS_IF([test "x$NBDINFO" = "xno" || test "x$NBDCOPY" = "xno"],
|
|
||||||
+ [AC_MSG_ERROR([nbdinfo and nbdcopy (from libnbd) must be installed])])
|
|
||||||
+
|
|
||||||
dnl Check for valgrind
|
|
||||||
AC_CHECK_PROG([VALGRIND],[valgrind],[valgrind],[no])
|
|
||||||
AS_IF([test "x$VALGRIND" != "xno"],[
|
|
@ -0,0 +1,40 @@
|
|||||||
|
From 94619ded353081255409eb3ffae51061adcbf9a4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||||||
|
Date: Thu, 29 Aug 2024 13:17:13 +0100
|
||||||
|
Subject: [PATCH] mlcustomize: Ignore sriov drivers on virtio-win disk
|
||||||
|
|
||||||
|
Fixes: https://issues.redhat.com/browse/RHEL-56383
|
||||||
|
Thanks: Vadim Rozenfeld
|
||||||
|
---
|
||||||
|
mlcustomize/inject_virtio_win.ml | 11 +++++++++--
|
||||||
|
1 file changed, 9 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/common/mlcustomize/inject_virtio_win.ml b/common/mlcustomize/inject_virtio_win.ml
|
||||||
|
index afec1e4..88c1c8c 100644
|
||||||
|
--- a/common/mlcustomize/inject_virtio_win.ml
|
||||||
|
+++ b/common/mlcustomize/inject_virtio_win.ml
|
||||||
|
@@ -478,7 +478,10 @@ and virtio_iso_path_matches_guest_os t path =
|
||||||
|
* "./drivers/amd64/Win2012R2/netkvm.sys".
|
||||||
|
* Note we check lowercase paths.
|
||||||
|
*)
|
||||||
|
- let pathelem elem = String.find lc_path ("/" ^ elem ^ "/") >= 0 in
|
||||||
|
+ let pathelem elem =
|
||||||
|
+ String.find lc_path ("/" ^ elem ^ "/") >= 0 ||
|
||||||
|
+ String.is_prefix lc_path (elem ^ "/")
|
||||||
|
+ in
|
||||||
|
let p_arch =
|
||||||
|
if pathelem "x86" || pathelem "i386" then "i386"
|
||||||
|
else if pathelem "amd64" then "x86_64"
|
||||||
|
@@ -522,7 +525,11 @@ and virtio_iso_path_matches_guest_os t path =
|
||||||
|
else
|
||||||
|
raise Not_found in
|
||||||
|
|
||||||
|
- arch = p_arch && os_major = p_os_major && os_minor = p_os_minor &&
|
||||||
|
+ let p_sriov = pathelem "sriov" in
|
||||||
|
+
|
||||||
|
+ arch = p_arch &&
|
||||||
|
+ not p_sriov && (* always ignored, see RHEL-56383 *)
|
||||||
|
+ os_major = p_os_major && os_minor = p_os_minor &&
|
||||||
|
match_os_variant os_variant &&
|
||||||
|
match_osinfo osinfo
|
||||||
|
|
@ -1,68 +0,0 @@
|
|||||||
From 88e4e0213f5dc9e60720f6a84edf36bffbea723e Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
||||||
Date: Thu, 16 May 2024 12:32:00 +0100
|
|
||||||
Subject: [PATCH] Update common submodule
|
|
||||||
|
|
||||||
Pulls in these commits, but they are not thought to be relevant to
|
|
||||||
virt-v2v.
|
|
||||||
|
|
||||||
Ben Brown (1):
|
|
||||||
Initialise bar->fp as NULL
|
|
||||||
|
|
||||||
Richard W.M. Jones (2):
|
|
||||||
mlcustomize: Update virt-customize generated files
|
|
||||||
options: Allow nbd+unix:// URIs
|
|
||||||
|
|
||||||
(cherry picked from commit 6513fcbec9a10652cb8b5690936e7265e9c8851c)
|
|
||||||
---
|
|
||||||
common | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
Submodule common 0dba002c..93a7f3af:
|
|
||||||
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/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++;
|
|
@ -1,109 +0,0 @@
|
|||||||
From 006bdf2599f4d56e0612192291b846b384675e96 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
||||||
Date: Thu, 25 Jul 2024 09:08:41 +0100
|
|
||||||
Subject: [PATCH] Update common submodule
|
|
||||||
|
|
||||||
This pulls in the commits below which simplify the installation of
|
|
||||||
Qemu Guest Agent on Windows.
|
|
||||||
|
|
||||||
Richard W.M. Jones (4):
|
|
||||||
mlcustomize: firstboot: Use Linux path for Powershell script path
|
|
||||||
mlcustomize: firstboot: Use powershell.exe instead of path
|
|
||||||
mlcustomize: firstboot: Use Powershell -NoProfile flag
|
|
||||||
mlcustomize: Revert delay installation of qemu-ga MSI
|
|
||||||
|
|
||||||
Fixes: https://issues.redhat.com/browse/RHEL-49761
|
|
||||||
(cherry picked from commit 4ba18d2d6d1155db7cd83641a650477c0a13dbec)
|
|
||||||
---
|
|
||||||
common | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
Submodule common 830cbdcf..5d1f5b84:
|
|
||||||
diff --git a/common/mlcustomize/firstboot.ml b/common/mlcustomize/firstboot.ml
|
|
||||||
index 5dc01234..4b9b910b 100644
|
|
||||||
--- a/common/mlcustomize/firstboot.ml
|
|
||||||
+++ b/common/mlcustomize/firstboot.ml
|
|
||||||
@@ -387,16 +387,10 @@ let add_firstboot_powershell g root ?prio name code =
|
|
||||||
(* Create the temporary directory to put the Powershell file. *)
|
|
||||||
let tempdir = sprintf "%s/Temp" windows_systemroot in
|
|
||||||
g#mkdir_p tempdir;
|
|
||||||
+ let ps_path = sprintf "%s/%s" tempdir name in
|
|
||||||
let code = String.concat "\r\n" code ^ "\r\n" in
|
|
||||||
- g#write (sprintf "%s/%s" tempdir name) code;
|
|
||||||
+ g#write ps_path code;
|
|
||||||
|
|
||||||
- (* Powershell interpreter. Should we check this exists? XXX *)
|
|
||||||
- let ps_exe =
|
|
||||||
- windows_systemroot ^
|
|
||||||
- "\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" in
|
|
||||||
-
|
|
||||||
- (* Windows path to the Powershell script. *)
|
|
||||||
- let ps_path = windows_systemroot ^ "\\Temp\\" ^ name in
|
|
||||||
-
|
|
||||||
- let fb = sprintf "%s -ExecutionPolicy ByPass -file %s" ps_exe ps_path in
|
|
||||||
+ let fb = sprintf "powershell.exe -ExecutionPolicy ByPass -NoProfile -file %s"
|
|
||||||
+ ps_path in
|
|
||||||
add_firstboot_script g root ?prio name fb
|
|
||||||
diff --git a/common/mlcustomize/inject_virtio_win.ml b/common/mlcustomize/inject_virtio_win.ml
|
|
||||||
index 4e0ed0e0..eee93669 100644
|
|
||||||
--- a/common/mlcustomize/inject_virtio_win.ml
|
|
||||||
+++ b/common/mlcustomize/inject_virtio_win.ml
|
|
||||||
@@ -575,40 +575,28 @@ and copy_from_libosinfo { g; i_osinfo; i_arch } destdir =
|
|
||||||
) driver.Libosinfo.files
|
|
||||||
with Not_found -> []
|
|
||||||
|
|
||||||
+(* Install qemu-ga. [files] is the non-empty list of possible qemu-ga
|
|
||||||
+ * installers we detected.
|
|
||||||
+ *)
|
|
||||||
and configure_qemu_ga t files =
|
|
||||||
+ let script = ref [] in
|
|
||||||
+ let add = List.push_back script in
|
|
||||||
+
|
|
||||||
+ add "# Virt-v2v script which installs QEMU Guest Agent";
|
|
||||||
+ add "";
|
|
||||||
+ add "# Uncomment this line for lots of debug output.";
|
|
||||||
+ add "# Set-PSDebug -Trace 2";
|
|
||||||
+ add "";
|
|
||||||
+ add "Write-Host Installing QEMU Guest Agent";
|
|
||||||
+ add "";
|
|
||||||
+ add "# Run qemu-ga installers";
|
|
||||||
List.iter (
|
|
||||||
fun msi_path ->
|
|
||||||
- (* Windows is a trashfire.
|
|
||||||
- * https://stackoverflow.com/a/18730884
|
|
||||||
- * https://bugzilla.redhat.com/show_bug.cgi?id=1895323
|
|
||||||
- *)
|
|
||||||
- let psh_script = ref [] in
|
|
||||||
- let add = List.push_back psh_script in
|
|
||||||
+ add (sprintf "C:\\%s /norestart /qn /l+*vx C:\\%s.log"
|
|
||||||
+ msi_path msi_path)
|
|
||||||
+ ) files;
|
|
||||||
|
|
||||||
- add "# Uncomment this line for lots of debug output.";
|
|
||||||
- add "# Set-PSDebug -Trace 2";
|
|
||||||
- add "";
|
|
||||||
- add "Write-Host Removing any previously scheduled qemu-ga installation";
|
|
||||||
- add "schtasks.exe /Delete /TN Firstboot-qemu-ga /F";
|
|
||||||
- add "";
|
|
||||||
- add (sprintf
|
|
||||||
- "Write-Host Scheduling delayed installation of qemu-ga from %s"
|
|
||||||
- msi_path);
|
|
||||||
- add "$d = (get-date).AddSeconds(120)";
|
|
||||||
- add "$dtfinfo = [System.Globalization.DateTimeFormatInfo]::CurrentInfo";
|
|
||||||
- add "$sdp = $dtfinfo.ShortDatePattern";
|
|
||||||
- add "$sdp = $sdp -replace 'y+', 'yyyy'";
|
|
||||||
- add "$sdp = $sdp -replace 'M+', 'MM'";
|
|
||||||
- add "$sdp = $sdp -replace 'd+', 'dd'";
|
|
||||||
- add "schtasks.exe /Create /SC ONCE `";
|
|
||||||
- add " /ST $d.ToString('HH:mm') /SD $d.ToString($sdp) `";
|
|
||||||
- add " /RU SYSTEM /TN Firstboot-qemu-ga `";
|
|
||||||
- add (sprintf " /TR \"C:\\%s /forcerestart /qn /l+*vx C:\\%s.log\""
|
|
||||||
- msi_path msi_path);
|
|
||||||
-
|
|
||||||
- Firstboot.add_firstboot_powershell t.g t.root
|
|
||||||
- (sprintf "install-%s.ps1" msi_path) !psh_script;
|
|
||||||
- ) files
|
|
||||||
+ Firstboot.add_firstboot_powershell t.g t.root "install-qemu-ga.ps1" !script
|
|
||||||
|
|
||||||
and configure_blnsvr t blnsvr =
|
|
||||||
let cmd = sprintf "\
|
|
@ -1,124 +0,0 @@
|
|||||||
From 22691e516898b0d54ad4100c9f04beb1e70f9dc0 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
||||||
Date: Sun, 28 Jul 2024 14:49:42 +0100
|
|
||||||
Subject: [PATCH] v2v: --mac: Allow gw and len fields to be empty
|
|
||||||
|
|
||||||
Even if these appear in the middle of the list, allow them to be
|
|
||||||
empty. For example this is now permitted whereas previously it was an
|
|
||||||
error:
|
|
||||||
|
|
||||||
virt-v2v --mac <MAC>:ip:<ADDR>,,,nameserver
|
|
||||||
|
|
||||||
Reported-by: Arik Hadas
|
|
||||||
(cherry picked from commit 159fda411d2f75b087106e7293d273ae142c9fbe)
|
|
||||||
---
|
|
||||||
in-place/in_place.ml | 12 +++++++-----
|
|
||||||
inspector/inspector.ml | 12 +++++++-----
|
|
||||||
v2v/v2v.ml | 12 +++++++-----
|
|
||||||
3 files changed, 21 insertions(+), 15 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/in-place/in_place.ml b/in-place/in_place.ml
|
|
||||||
index 2049db16..a61d9795 100644
|
|
||||||
--- a/in-place/in_place.ml
|
|
||||||
+++ b/in-place/in_place.ml
|
|
||||||
@@ -90,10 +90,10 @@ let rec main () =
|
|
||||||
| "ip" ->
|
|
||||||
(match String.nsplit "," out with
|
|
||||||
| [] -> error (f_"invalid --mac ip option")
|
|
||||||
- | [ip] -> add_static_ip mac ip None None []
|
|
||||||
- | [ip; gw] -> add_static_ip mac ip (Some gw) None []
|
|
||||||
+ | [ip] -> add_static_ip mac ip "" "" []
|
|
||||||
+ | [ip; gw] -> add_static_ip mac ip gw "" []
|
|
||||||
| ip :: gw :: len :: nameservers ->
|
|
||||||
- add_static_ip mac ip (Some gw) (Some len) nameservers
|
|
||||||
+ add_static_ip mac ip gw len nameservers
|
|
||||||
)
|
|
||||||
| _ -> assert false
|
|
||||||
and add_static_ip if_mac_addr if_ip_address if_default_gateway
|
|
||||||
@@ -108,12 +108,14 @@ let rec main () =
|
|
||||||
an IP address") what addr
|
|
||||||
in
|
|
||||||
error_unless_ip_addr "ipaddr" if_ip_address;
|
|
||||||
+ let if_default_gateway =
|
|
||||||
+ match if_default_gateway with "" -> None | gw -> Some gw in
|
|
||||||
Option.iter (error_unless_ip_addr "gw") if_default_gateway;
|
|
||||||
List.iter (error_unless_ip_addr "nameserver") if_nameservers;
|
|
||||||
let if_prefix_length =
|
|
||||||
match if_prefix_length_str with
|
|
||||||
- | None -> None
|
|
||||||
- | Some len ->
|
|
||||||
+ | "" -> None
|
|
||||||
+ | len ->
|
|
||||||
let len =
|
|
||||||
try int_of_string len with
|
|
||||||
| Failure _ -> error (f_"cannot parse --mac ip prefix length \
|
|
||||||
diff --git a/inspector/inspector.ml b/inspector/inspector.ml
|
|
||||||
index 02d1a0e7..417b31c5 100644
|
|
||||||
--- a/inspector/inspector.ml
|
|
||||||
+++ b/inspector/inspector.ml
|
|
||||||
@@ -97,10 +97,10 @@ let rec main () =
|
|
||||||
| "ip" ->
|
|
||||||
(match String.nsplit "," out with
|
|
||||||
| [] -> error (f_"invalid --mac ip option")
|
|
||||||
- | [ip] -> add_static_ip mac ip None None []
|
|
||||||
- | [ip; gw] -> add_static_ip mac ip (Some gw) None []
|
|
||||||
+ | [ip] -> add_static_ip mac ip "" "" []
|
|
||||||
+ | [ip; gw] -> add_static_ip mac ip gw "" []
|
|
||||||
| ip :: gw :: len :: nameservers ->
|
|
||||||
- add_static_ip mac ip (Some gw) (Some len) nameservers
|
|
||||||
+ add_static_ip mac ip gw len nameservers
|
|
||||||
)
|
|
||||||
| _ -> assert false
|
|
||||||
and add_static_ip if_mac_addr if_ip_address if_default_gateway
|
|
||||||
@@ -115,12 +115,14 @@ let rec main () =
|
|
||||||
is an IP address") what addr
|
|
||||||
in
|
|
||||||
error_unless_ip_addr "ipaddr" if_ip_address;
|
|
||||||
+ let if_default_gateway =
|
|
||||||
+ match if_default_gateway with "" -> None | gw -> Some gw in
|
|
||||||
Option.iter (error_unless_ip_addr "gw") if_default_gateway;
|
|
||||||
List.iter (error_unless_ip_addr "nameserver") if_nameservers;
|
|
||||||
let if_prefix_length =
|
|
||||||
match if_prefix_length_str with
|
|
||||||
- | None -> None
|
|
||||||
- | Some len ->
|
|
||||||
+ | "" -> None
|
|
||||||
+ | len ->
|
|
||||||
let len =
|
|
||||||
try int_of_string len with
|
|
||||||
| Failure _ -> error (f_"cannot parse --mac ip prefix \
|
|
||||||
diff --git a/v2v/v2v.ml b/v2v/v2v.ml
|
|
||||||
index 89c08fc5..6d9e3792 100644
|
|
||||||
--- a/v2v/v2v.ml
|
|
||||||
+++ b/v2v/v2v.ml
|
|
||||||
@@ -109,10 +109,10 @@ let rec main () =
|
|
||||||
| "ip" ->
|
|
||||||
(match String.nsplit "," out with
|
|
||||||
| [] -> error (f_"invalid --mac ip option")
|
|
||||||
- | [ip] -> add_static_ip mac ip None None []
|
|
||||||
- | [ip; gw] -> add_static_ip mac ip (Some gw) None []
|
|
||||||
+ | [ip] -> add_static_ip mac ip "" "" []
|
|
||||||
+ | [ip; gw] -> add_static_ip mac ip gw "" []
|
|
||||||
| ip :: gw :: len :: nameservers ->
|
|
||||||
- add_static_ip mac ip (Some gw) (Some len) nameservers
|
|
||||||
+ add_static_ip mac ip gw len nameservers
|
|
||||||
)
|
|
||||||
| _ -> assert false
|
|
||||||
and add_static_ip if_mac_addr if_ip_address if_default_gateway
|
|
||||||
@@ -127,12 +127,14 @@ let rec main () =
|
|
||||||
is an IP address") what addr
|
|
||||||
in
|
|
||||||
error_unless_ip_addr "ipaddr" if_ip_address;
|
|
||||||
+ let if_default_gateway =
|
|
||||||
+ match if_default_gateway with "" -> None | gw -> Some gw in
|
|
||||||
Option.iter (error_unless_ip_addr "gw") if_default_gateway;
|
|
||||||
List.iter (error_unless_ip_addr "nameserver") if_nameservers;
|
|
||||||
let if_prefix_length =
|
|
||||||
match if_prefix_length_str with
|
|
||||||
- | None -> None
|
|
||||||
- | Some len ->
|
|
||||||
+ | "" -> None
|
|
||||||
+ | len ->
|
|
||||||
let len =
|
|
||||||
try int_of_string len with
|
|
||||||
| Failure _ -> error (f_"cannot parse --mac ip prefix length field \
|
|
Binary file not shown.
@ -1,17 +0,0 @@
|
|||||||
-----BEGIN PGP SIGNATURE-----
|
|
||||||
|
|
||||||
iQJFBAABCAAvFiEE93dPsa0HSn6Mh2fqkXOPc+G3aKAFAmWW5kYRHHJpY2hAYW5u
|
|
||||||
ZXhpYS5vcmcACgkQkXOPc+G3aKBddxAAvM08lmWH0IlpLwKX06TwnVERt8fXD++p
|
|
||||||
bjRrfj2mOoayoN/B1oE61laCdZgCzPtN6MC/aW94LITaGJWHi7YYqdgdRgL1NqeC
|
|
||||||
n0tu8t14XsCT1xTIOa1ndb018+a5ppIcOnmGAj4naM5uA50rgRwChdSOTP/H10+J
|
|
||||||
93M2rvvak8aVdeWEhnMJyqWG2mFJ0YselJ+cMu66XFBkK7wg4UwCzzJ4Blqb1Igd
|
|
||||||
W/wctLDLqPVAxI85P/2p2dt+N4vzOnT/jr+dFxXOJg99E6iwa3qPCdzGHmszjhyC
|
|
||||||
uNhq/pWMt5tSk34IwYduyk1b9mlx9dCQsyREwrVomsdZD+XrUZHhrGrlcVJDfT07
|
|
||||||
2DCkVnGAoH0DRmz3t69KJS9U1JgzkaTDNaezkLlIZ7VZOdaC5nK74efnN0yinBkJ
|
|
||||||
9GhmR0qbk4/QVKeNWSftu4Rd9OUtRSaEMH0kO/S42vl3fW59u+ZGMEz26Ar4x/q7
|
|
||||||
jLx3vKfduJbpvberc3kQ2p9jQbUjlyFOTtnTAf84ckyIkvEMwpEhlyfchctPji/K
|
|
||||||
IaJ4Yd0KnKiLg/GH9Eon79cadAV2hzvYb2FZYI1RcrbRH+nZvGLgSbvHobqESERT
|
|
||||||
hBBXrAhaazRdxbOVqwMV9d+lq4llzUJJMOVCsK/PLnigrl5OCLQNQ2IVBbPv8WFD
|
|
||||||
VMg/9mGiUj0=
|
|
||||||
=lbFv
|
|
||||||
-----END PGP SIGNATURE-----
|
|
@ -0,0 +1,17 @@
|
|||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
|
||||||
|
iQJFBAABCAAvFiEE93dPsa0HSn6Mh2fqkXOPc+G3aKAFAmapDYsRHHJpY2hAYW5u
|
||||||
|
ZXhpYS5vcmcACgkQkXOPc+G3aKATow//dAt+/eD4WANTgt82gOK5VLuhlp/il6/L
|
||||||
|
IsErVntOsmAlr1Ukag6lAFmrQrxDHbRo1g9w+P3dabEbedqeAy0vlyE7feifbzfn
|
||||||
|
8dAGAYJBPqyhG5w5Y1YKU/ZfJF5OjxuD9kjn5YTBNmNNva2wqrb4vQqLfmfhpMlx
|
||||||
|
hf3xMlqJ3plXvaqPFk69BzSgA1hKP9Z/f522RQs9lRq+aSP00zatLX9DK5oXynas
|
||||||
|
6DbInkrfUjbMaENoYcuUzC1w45DUcTcq6Or36+h86G78yIkQpfwlS82G0/f4wVnv
|
||||||
|
QlD5pC6dCmowuCrr5/xMoYt5ah7L+qcEUIRJ4uB0xQgQtQV32eLIFjpcHsN973ot
|
||||||
|
ji2ievMtoM5Ncu2Hq1R02Hvx5PUvVZamEpEWf+HzqJl2VATw2F63CMALLjxR6mw4
|
||||||
|
WORi90ZLQWtbt7lJgZEI29WOabuBWGG/cn+01gWLh8swqQpAgkGsbJhCxNXLiUfy
|
||||||
|
0PE7K+zoWVZzSiuOVeIh1Gn2p75gSTRQXfY+l+IfPPfOUBOuNN+w1J5HRUaT7ZAk
|
||||||
|
zBbPGFA2Y6x2zR9TD5n87QftXF6LPhf715qh5URI4Wl0pE+C9gxhQk+nf1aMKJ5J
|
||||||
|
/fOAtU8N+PtZPUm95NTaQxpkraspwHmhLRygWzA7wUGANmVUiX0fE3qgxW9NE2bI
|
||||||
|
paYjGigt040=
|
||||||
|
=FGlR
|
||||||
|
-----END PGP SIGNATURE-----
|
Loading…
Reference in new issue