diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..479aabe --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +SOURCES/RHEV-Application-Provisioning-Tool.exe_4.43-3 +SOURCES/libguestfs-1.40.2.tar.gz +SOURCES/libguestfs.keyring +SOURCES/rhsrvany.exe diff --git a/.libguestfs.metadata b/.libguestfs.metadata new file mode 100644 index 0000000..b63e4dd --- /dev/null +++ b/.libguestfs.metadata @@ -0,0 +1,4 @@ +ac8722917cc31c36836e241bd7a4beb5f8a8b0c8 SOURCES/RHEV-Application-Provisioning-Tool.exe_4.43-3 +45755f0f73b503790974484053ff482f32665b13 SOURCES/libguestfs-1.40.2.tar.gz +1bbc40f501a7fef9eef2a39b701a71aee2fea7c4 SOURCES/libguestfs.keyring +2bd96e478fc004cd323b5bd754c856641877dac6 SOURCES/rhsrvany.exe diff --git a/SOURCES/0001-common-mlpcre-add-offset-flag-for-PCRE.matches.patch b/SOURCES/0001-common-mlpcre-add-offset-flag-for-PCRE.matches.patch new file mode 100644 index 0000000..1267d12 --- /dev/null +++ b/SOURCES/0001-common-mlpcre-add-offset-flag-for-PCRE.matches.patch @@ -0,0 +1,126 @@ +From 6e0dbefde3ddb0711e2b0961ee913084dc5e6a41 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Tue, 19 Feb 2019 10:50:01 +0100 +Subject: [PATCH] common/mlpcre: add offset flag for PCRE.matches + +This way it is possible to change where the matching start, instead of +always assuming it is the beginning. + +(cherry picked from commit 0ed2e5c14a302d15fd3b75ee2c1cb808a06cb746) +--- + common/mlpcre/PCRE.ml | 2 +- + common/mlpcre/PCRE.mli | 5 ++++- + common/mlpcre/pcre-c.c | 16 +++++++++++++--- + common/mlpcre/pcre_tests.ml | 11 ++++++++--- + 4 files changed, 26 insertions(+), 8 deletions(-) + +diff --git a/common/mlpcre/PCRE.ml b/common/mlpcre/PCRE.ml +index b054928f9..33074af1c 100644 +--- a/common/mlpcre/PCRE.ml ++++ b/common/mlpcre/PCRE.ml +@@ -23,7 +23,7 @@ exception Error of string * int + type regexp + + external compile : ?anchored:bool -> ?caseless:bool -> ?dotall:bool -> ?extended:bool -> ?multiline:bool -> string -> regexp = "guestfs_int_pcre_compile_byte" "guestfs_int_pcre_compile" +-external matches : regexp -> string -> bool = "guestfs_int_pcre_matches" ++external matches : ?offset:int -> regexp -> string -> bool = "guestfs_int_pcre_matches" + external sub : int -> string = "guestfs_int_pcre_sub" + external subi : int -> int * int = "guestfs_int_pcre_subi" + +diff --git a/common/mlpcre/PCRE.mli b/common/mlpcre/PCRE.mli +index eacb6fd90..e10d512fc 100644 +--- a/common/mlpcre/PCRE.mli ++++ b/common/mlpcre/PCRE.mli +@@ -62,7 +62,7 @@ val compile : ?anchored:bool -> ?caseless:bool -> ?dotall:bool -> ?extended:bool + See pcreapi(3) for details of what they do. + All flags default to false. *) + +-val matches : regexp -> string -> bool ++val matches : ?offset:int -> regexp -> string -> bool + (** Test whether the regular expression matches the string. This + returns true if the regexp matches or false otherwise. + +@@ -71,6 +71,9 @@ val matches : regexp -> string -> bool + or the thread/program exits. You can call {!sub} to return + these substrings. + ++ The [?offset] flag is used to change the start of the search, ++ which by default is at the beginning of the string (position 0). ++ + This can raise {!Error} if PCRE returns an error. *) + + val sub : int -> string +diff --git a/common/mlpcre/pcre-c.c b/common/mlpcre/pcre-c.c +index 0762a8341..be054a004 100644 +--- a/common/mlpcre/pcre-c.c ++++ b/common/mlpcre/pcre-c.c +@@ -121,6 +121,15 @@ is_Some_true (value v) + Bool_val (Field (v, 0)) /* Some true */; + } + ++static int ++Optint_val (value intv, int defval) ++{ ++ if (intv == Val_int (0)) /* None */ ++ return defval; ++ else /* Some int */ ++ return Int_val (Field (intv, 0)); ++} ++ + value + guestfs_int_pcre_compile (value anchoredv, value caselessv, value dotallv, + value extendedv, value multilinev, +@@ -165,9 +174,9 @@ guestfs_int_pcre_compile_byte (value *argv, int argn) + } + + value +-guestfs_int_pcre_matches (value rev, value strv) ++guestfs_int_pcre_matches (value offsetv, value rev, value strv) + { +- CAMLparam2 (rev, strv); ++ CAMLparam3 (offsetv, rev, strv); + pcre *re = Regexp_val (rev); + struct last_match *m, *oldm; + size_t len = caml_string_length (strv); +@@ -205,7 +214,8 @@ guestfs_int_pcre_matches (value rev, value strv) + caml_raise_out_of_memory (); + } + +- m->r = pcre_exec (re, NULL, m->subject, len, 0, 0, m->vec, veclen); ++ m->r = pcre_exec (re, NULL, m->subject, len, Optint_val (offsetv, 0), 0, ++ m->vec, veclen); + if (m->r < 0 && m->r != PCRE_ERROR_NOMATCH) { + int ret = m->r; + free_last_match (m); +diff --git a/common/mlpcre/pcre_tests.ml b/common/mlpcre/pcre_tests.ml +index 346019c40..3e5981107 100644 +--- a/common/mlpcre/pcre_tests.ml ++++ b/common/mlpcre/pcre_tests.ml +@@ -30,9 +30,9 @@ let compile ?(anchored = false) ?(caseless = false) + patt; + PCRE.compile ~anchored ~caseless ~dotall ~extended ~multiline patt + +-let matches re str = +- eprintf "PCRE.matches %s ->%!" str; +- let r = PCRE.matches re str in ++let matches ?(offset = 0) re str = ++ eprintf "PCRE.matches %s, %d ->%!" str offset; ++ let r = PCRE.matches ~offset re str in + eprintf " %b\n%!" r; + r + +@@ -103,6 +103,11 @@ let () = + assert (subi 1 = (2, 3)); + assert (subi 2 = (3, 3)); + ++ assert (matches ~offset:5 re0 "aaabcabc" = true); ++ assert (sub 0 = "ab"); ++ ++ assert (matches ~offset:5 re0 "aaabcbaac" = false); ++ + assert (replace re0 "dd" "abcabcaabccca" = "ddcabcaabccca"); + assert (replace ~global:true re0 "dd" "abcabcaabccca" = "ddcddcddccca"); + +-- +2.24.1 + diff --git a/SOURCES/0002-v2v-add-Var_expander.patch b/SOURCES/0002-v2v-add-Var_expander.patch new file mode 100644 index 0000000..6acf6d8 --- /dev/null +++ b/SOURCES/0002-v2v-add-Var_expander.patch @@ -0,0 +1,415 @@ +From a98136d6ee36df15a226f853d47bd803a7a25329 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Tue, 19 Feb 2019 14:54:31 +0100 +Subject: [PATCH] v2v: add Var_expander + +This helper module provides a facility to replace %{FOO}-like variables +in text strings with user-provided content. + +(cherry picked from commit a27748d7000f417c16045967497208d275a09ce8) +--- + .gitignore | 1 + + v2v/Makefile.am | 32 ++++++++++- + v2v/dummy.c | 2 + + v2v/var_expander.ml | 72 ++++++++++++++++++++++++ + v2v/var_expander.mli | 82 +++++++++++++++++++++++++++ + v2v/var_expander_tests.ml | 113 ++++++++++++++++++++++++++++++++++++++ + 6 files changed, 300 insertions(+), 2 deletions(-) + create mode 100644 v2v/dummy.c + create mode 100644 v2v/var_expander.ml + create mode 100644 v2v/var_expander.mli + create mode 100644 v2v/var_expander_tests.ml + +diff --git a/.gitignore b/.gitignore +index 637bf7765..f2efcdde2 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -693,6 +693,7 @@ Makefile.in + /v2v/uefi.ml + /v2v/uefi.mli + /v2v/v2v_unit_tests ++/v2v/var_expander_tests + /v2v/virt-v2v + /v2v/virt-v2v.1 + /v2v/virt-v2v-copy-to-local +diff --git a/v2v/Makefile.am b/v2v/Makefile.am +index 2312812fb..f196be81d 100644 +--- a/v2v/Makefile.am ++++ b/v2v/Makefile.am +@@ -98,6 +98,7 @@ SOURCES_MLI = \ + utils.mli \ + v2v.mli \ + vCenter.mli \ ++ var_expander.mli \ + windows.mli \ + windows_virtio.mli + +@@ -106,6 +107,7 @@ SOURCES_ML = \ + types.ml \ + uefi.ml \ + utils.ml \ ++ var_expander.ml \ + python_script.ml \ + name_from_disk.ml \ + vCenter.ml \ +@@ -442,7 +444,7 @@ TESTS += \ + endif + + if HAVE_OCAML_PKG_OUNIT +-TESTS += v2v_unit_tests ++TESTS += v2v_unit_tests var_expander_tests + endif + + if ENABLE_APPLIANCE +@@ -651,7 +653,7 @@ EXTRA_DIST += \ + # Unit tests. + check_PROGRAMS = + if HAVE_OCAML_PKG_OUNIT +-check_PROGRAMS += v2v_unit_tests ++check_PROGRAMS += v2v_unit_tests var_expander_tests + endif + + v2v_unit_tests_BOBJECTS = \ +@@ -671,13 +673,28 @@ v2v_unit_tests_SOURCES = $(virt_v2v_SOURCES) + v2v_unit_tests_CPPFLAGS = $(virt_v2v_CPPFLAGS) + v2v_unit_tests_CFLAGS = $(virt_v2v_CFLAGS) + ++var_expander_tests_BOBJECTS = \ ++ var_expander.cmo \ ++ var_expander_tests.cmo ++var_expander_tests_XOBJECTS = $(var_expander_tests_BOBJECTS:.cmo=.cmx) ++ ++var_expander_tests_SOURCES = dummy.c ++var_expander_tests_CPPFLAGS = $(virt_v2v_CPPFLAGS) ++var_expander_tests_CFLAGS = $(virt_v2v_CFLAGS) ++ + if !HAVE_OCAMLOPT + # Can't call this v2v_unit_tests_OBJECTS because automake gets confused. + v2v_unit_tests_THEOBJECTS = $(v2v_unit_tests_BOBJECTS) + v2v_unit_tests.cmo: OCAMLPACKAGES += -package oUnit ++ ++var_expander_tests_THEOBJECTS = $(var_expander_tests_BOBJECTS) ++var_expander_tests.cmo: OCAMLPACKAGES += -package oUnit + else + v2v_unit_tests_THEOBJECTS = $(v2v_unit_tests_XOBJECTS) + v2v_unit_tests.cmx: OCAMLPACKAGES += -package oUnit ++ ++var_expander_tests_THEOBJECTS = $(var_expander_tests_XOBJECTS) ++var_expander_tests.cmx: OCAMLPACKAGES += -package oUnit + endif + + v2v_unit_tests_DEPENDENCIES = \ +@@ -696,6 +713,17 @@ v2v_unit_tests_LINK = \ + $(OCAMLLINKFLAGS) \ + $(v2v_unit_tests_THEOBJECTS) -o $@ + ++var_expander_tests_DEPENDENCIES = \ ++ $(var_expander_tests_THEOBJECTS) \ ++ ../common/mlpcre/mlpcre.$(MLARCHIVE) \ ++ $(top_srcdir)/ocaml-link.sh ++var_expander_tests_LINK = \ ++ $(top_srcdir)/ocaml-link.sh -cclib '$(OCAMLCLIBS)' -- \ ++ $(OCAMLFIND) $(BEST) $(OCAMLFLAGS) \ ++ $(OCAMLPACKAGES) -package oUnit \ ++ $(OCAMLLINKFLAGS) \ ++ $(var_expander_tests_THEOBJECTS) -o $@ ++ + # Dependencies. + .depend: \ + $(srcdir)/*.mli \ +diff --git a/v2v/dummy.c b/v2v/dummy.c +new file mode 100644 +index 000000000..ebab6198c +--- /dev/null ++++ b/v2v/dummy.c +@@ -0,0 +1,2 @@ ++/* Dummy source, to be used for OCaml-based tools with no C sources. */ ++enum { foo = 1 }; +diff --git a/v2v/var_expander.ml b/v2v/var_expander.ml +new file mode 100644 +index 000000000..24b9bafe3 +--- /dev/null ++++ b/v2v/var_expander.ml +@@ -0,0 +1,72 @@ ++(* virt-v2v ++ * Copyright (C) 2019 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 ++ ++exception Invalid_variable of string ++ ++let var_re = PCRE.compile "(^|[^%])%{([^}]+)}" ++ ++let check_variable var = ++ String.iter ( ++ function ++ | '0'..'9' ++ | 'a'..'z' ++ | 'A'..'Z' ++ | '_' ++ | '-' -> () ++ | _ -> raise (Invalid_variable var) ++ ) var ++ ++let scan_variables str = ++ let res = ref [] in ++ let offset = ref 0 in ++ while PCRE.matches ~offset:!offset var_re str; do ++ let var = PCRE.sub 2 in ++ check_variable var; ++ let _, end_ = PCRE.subi 0 in ++ List.push_back res var; ++ offset := end_ ++ done; ++ List.remove_duplicates !res ++ ++let replace_fn str fn = ++ let res = ref str in ++ let offset = ref 0 in ++ while PCRE.matches ~offset:!offset var_re !res; do ++ let var = PCRE.sub 2 in ++ check_variable var; ++ let start_, end_ = PCRE.subi 0 in ++ match fn var with ++ | None -> ++ offset := end_ ++ | Some text -> ++ let prefix_len = ++ let prefix_start, prefix_end = PCRE.subi 1 in ++ prefix_end - prefix_start in ++ res := (String.sub !res 0 (start_ + prefix_len)) ^ text ^ (String.sub !res end_ (String.length !res - end_)); ++ offset := start_ + prefix_len + String.length text ++ done; ++ !res ++ ++let replace_list str lst = ++ let fn var = ++ try Some (List.assoc var lst) ++ with Not_found -> None ++ in ++ replace_fn str fn +diff --git a/v2v/var_expander.mli b/v2v/var_expander.mli +new file mode 100644 +index 000000000..80aa33c2c +--- /dev/null ++++ b/v2v/var_expander.mli +@@ -0,0 +1,82 @@ ++(* virt-v2v ++ * Copyright (C) 2019 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. ++ *) ++ ++(** Simple variable expander. ++ ++ This module provides the support to expand variables in strings, ++ specified in the form of [%{name}]. ++ ++ For example: ++ ++{v ++let str = "variable-%{INDEX} in %{INDEX} replaced %{INDEX} times" ++let index = ref 0 ++let fn = function ++ | "INDEX" -> ++ incr index; ++ Some (string_of_int !index) ++ | _ -> None ++in ++let str = Var_expander.replace_fn str fn ++(* now str is "variable-1 in 2 replaced 3 times" *) ++v} ++ ++ The names of variables can contain only ASCII letters (uppercase, ++ and lowercase), digits, underscores, and dashes. ++ ++ The replacement is done in a single pass: this means that if a ++ variable is replaced with the text of a variable, that new text ++ is kept as is in the final output. In practice: ++ ++{v ++let str = "%{VAR}" ++let str = Var_expander.replace_list str [("VAR", "%{VAR}")] ++(* now str is "%{VAR}" *) ++v} ++*) ++ ++exception Invalid_variable of string ++(** Invalid variable name error. ++ ++ In case a variable contains characters not allowed, then this ++ exception with the actual unacceptable variable. *) ++ ++val scan_variables : string -> string list ++(** Scan the pattern string for all the variables available. ++ ++ This can raise {!Invalid_variable} in case there are invalid ++ variable names. *) ++ ++val replace_fn : string -> (string -> string option) -> string ++(** Replaces a string expanding all the variables. ++ ++ The replacement function specify how a variable is replaced; ++ if [None] is returned, then that variable is not replaced. ++ ++ This can raise {!Invalid_variable} in case there are invalid ++ variable names. *) ++ ++val replace_list : string -> (string * string) list -> string ++(** Replaces a string expanding all the variables. ++ ++ The replacement list specify how a variable is replaced; ++ if it is not specified in the list, then that variable is not ++ replaced. ++ ++ This can raise {!Invalid_variable} in case there are invalid ++ variable names. *) +diff --git a/v2v/var_expander_tests.ml b/v2v/var_expander_tests.ml +new file mode 100644 +index 000000000..35b628369 +--- /dev/null ++++ b/v2v/var_expander_tests.ml +@@ -0,0 +1,113 @@ ++(* virt-v2v ++ * Copyright (C) 2019 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 Printf ++open OUnit ++ ++open Std_utils ++ ++let assert_equal_string = assert_equal ~printer:identity ++let assert_equal_stringlist = assert_equal ~printer:(fun x -> "(" ^ (String.escaped (String.concat "," x)) ^ ")") ++ ++let replace_none_fn _ = None ++let replace_empty_fn _ = Some "" ++ ++let test_no_replacement () = ++ assert_equal_string "" (Var_expander.replace_fn "" replace_none_fn); ++ assert_equal_string "x" (Var_expander.replace_fn "x" replace_none_fn); ++ assert_equal_string "%{}" (Var_expander.replace_fn "%{}" replace_none_fn); ++ assert_equal_string "%{EMPTY}" (Var_expander.replace_fn "%{EMPTY}" replace_none_fn); ++ assert_equal_string "%{EMPTY} %{no}" (Var_expander.replace_fn "%{EMPTY} %{no}" replace_none_fn); ++ assert_equal_string "a %{EMPTY} b" (Var_expander.replace_fn "a %{EMPTY} b" replace_none_fn); ++ () ++ ++let test_replacements () = ++ assert_equal_string "" (Var_expander.replace_fn "%{EMPTY}" replace_empty_fn); ++ assert_equal_string "x " (Var_expander.replace_fn "x %{EMPTY}" replace_empty_fn); ++ assert_equal_string "xy" (Var_expander.replace_fn "x%{EMPTY}y" replace_empty_fn); ++ assert_equal_string "x<->y" (Var_expander.replace_fn "x%{FOO}y" (function | "FOO" -> Some "<->" | _ -> None)); ++ assert_equal_string "a x b" (Var_expander.replace_fn "a %{FOO} b" (function | "FOO" -> Some "x" | _ -> None)); ++ assert_equal_string "%{FOO} x" (Var_expander.replace_fn "%{FOO} %{BAR}" (function | "BAR" -> Some "x" | _ -> None)); ++ assert_equal_string "%{FOO}" (Var_expander.replace_fn "%{BAR}" (function | "BAR" -> Some "%{FOO}" | _ -> None)); ++ assert_equal_string "%{FOO} x" (Var_expander.replace_fn "%{BAR} %{FOO}" (function | "BAR" -> Some "%{FOO}" | "FOO" -> Some "x" | _ -> None)); ++ begin ++ let str = "%{INDEX}, %{INDEX}, %{INDEX}" in ++ let index = ref 0 in ++ let fn = function ++ | "INDEX" -> ++ incr index; ++ Some (string_of_int !index) ++ | _ -> None ++ in ++ assert_equal_string "1, 2, 3" (Var_expander.replace_fn str fn) ++ end; ++ () ++ ++let test_escape () = ++ assert_equal_string "%%{FOO}" (Var_expander.replace_fn "%%{FOO}" replace_empty_fn); ++ assert_equal_string "x %%{FOO} x" (Var_expander.replace_fn "%{FOO} %%{FOO} %{FOO}" (function | "FOO" -> Some "x" | _ -> None)); ++ () ++ ++let test_list () = ++ assert_equal_string "x %{NONE}" (Var_expander.replace_list "%{FOO} %{NONE}" [("FOO", "x")]); ++ () ++ ++let test_scan_variables () = ++ let assert_invalid_variable var = ++ let str = "%{" ^ var ^ "}" in ++ assert_raises (Var_expander.Invalid_variable var) ++ (fun () -> Var_expander.scan_variables str) ++ in ++ assert_equal_stringlist [] (Var_expander.scan_variables ""); ++ assert_equal_stringlist [] (Var_expander.scan_variables "foo"); ++ assert_equal_stringlist ["FOO"] (Var_expander.scan_variables "%{FOO}"); ++ assert_equal_stringlist ["FOO"; "BAR"] (Var_expander.scan_variables "%{FOO} %{BAR}"); ++ assert_equal_stringlist ["FOO"; "BAR"] (Var_expander.scan_variables "%{FOO} %{BAR} %{FOO}"); ++ assert_equal_stringlist ["FOO"; "BAR"] (Var_expander.scan_variables "%{FOO} %%{ESCAPED} %{BAR}"); ++ assert_invalid_variable "FOO/BAR"; ++ () ++ ++let test_errors () = ++ let assert_invalid_variable var = ++ let str = "%{" ^ var ^ "}" in ++ assert_raises (Var_expander.Invalid_variable var) ++ (fun () -> Var_expander.replace_fn str replace_none_fn) ++ in ++ assert_invalid_variable "FOO/BAR"; ++ assert_invalid_variable "FOO:BAR"; ++ assert_invalid_variable "FOO(BAR"; ++ assert_invalid_variable "FOO)BAR"; ++ assert_invalid_variable "FOO@BAR"; ++ () ++ ++(* Suites declaration. *) ++let suite = ++ TestList ([ ++ "basic" >::: [ ++ "no_replacement" >:: test_no_replacement; ++ "replacements" >:: test_replacements; ++ "escape" >:: test_escape; ++ "list" >:: test_list; ++ "scan_variables" >:: test_scan_variables; ++ "errors" >:: test_errors; ++ ]; ++ ]) ++ ++let () = ++ ignore (run_test_tt_main suite); ++ Printf.fprintf stderr "\n" +-- +2.24.1 + diff --git a/SOURCES/0003-v2v-add-o-json-output-mode.patch b/SOURCES/0003-v2v-add-o-json-output-mode.patch new file mode 100644 index 0000000..b105a3d --- /dev/null +++ b/SOURCES/0003-v2v-add-o-json-output-mode.patch @@ -0,0 +1,785 @@ +From 480c7169c341fc2f86609a13100c42e10f599b83 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Mon, 25 Feb 2019 13:14:43 +0100 +Subject: [PATCH] v2v: add -o json output mode + +Add a new output mode to virt-v2v: similar to -o local, the written +metadata is a JSON file with the majority of the data that virt-v2v +knowns about (or collects) during the conversion. + +This is meant to be used only when no existing output mode is usable, +and a guest needs to be converted to run on KVM anyway. The user of +this mode is supposed to use all the data in the JSON, as they contain +important details on how even run the guest (e.g. w.r.t. firmware, +drivers of disks/NICs, etc). + +(cherry picked from commit f190e08d85556dac293ef15bfeee38e54471570f) +--- + v2v/Makefile.am | 4 + + v2v/cmdline.ml | 29 +++ + v2v/create_json.ml | 348 ++++++++++++++++++++++++++++++++++ + v2v/create_json.mli | 29 +++ + v2v/output_json.ml | 116 ++++++++++++ + v2v/output_json.mli | 31 +++ + v2v/virt-v2v-output-local.pod | 55 ++++++ + v2v/virt-v2v.pod | 15 +- + 8 files changed, 625 insertions(+), 2 deletions(-) + create mode 100644 v2v/create_json.ml + create mode 100644 v2v/create_json.mli + create mode 100644 v2v/output_json.ml + create mode 100644 v2v/output_json.mli + +diff --git a/v2v/Makefile.am b/v2v/Makefile.am +index f196be81d..53c137fc6 100644 +--- a/v2v/Makefile.am ++++ b/v2v/Makefile.am +@@ -52,6 +52,7 @@ SOURCES_MLI = \ + config.mli \ + convert_linux.mli \ + convert_windows.mli \ ++ create_json.mli \ + create_libvirt_xml.mli \ + create_ovf.mli \ + DOM.mli \ +@@ -75,6 +76,7 @@ SOURCES_MLI = \ + networks.mli \ + openstack_image_properties.mli \ + output_glance.mli \ ++ output_json.mli \ + output_libvirt.mli \ + output_local.mli \ + output_null.mli \ +@@ -117,6 +119,7 @@ SOURCES_ML = \ + parse_ovf_from_ova.ml \ + parse_ova.ml \ + create_ovf.ml \ ++ create_json.ml \ + linux.ml \ + windows.ml \ + windows_virtio.ml \ +@@ -141,6 +144,7 @@ SOURCES_ML = \ + convert_windows.ml \ + output_null.ml \ + output_glance.ml \ ++ output_json.ml \ + output_libvirt.ml \ + output_local.ml \ + output_qemu.ml \ +diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml +index 46f6910d0..4d390f249 100644 +--- a/v2v/cmdline.ml ++++ b/v2v/cmdline.ml +@@ -138,6 +138,7 @@ let parse_cmdline () = + | "glance" -> output_mode := `Glance + | "libvirt" -> output_mode := `Libvirt + | "disk" | "local" -> output_mode := `Local ++ | "json" -> output_mode := `JSON + | "null" -> output_mode := `Null + | "openstack" | "osp" | "rhosp" -> output_mode := `Openstack + | "ovirt" | "rhv" | "rhev" -> output_mode := `RHV +@@ -413,6 +414,17 @@ read the man page virt-v2v(1). + | `RHV -> no_options (); `RHV + | `QEmu -> no_options (); `QEmu + ++ | `JSON -> ++ if is_query then ( ++ Output_json.print_output_options (); ++ exit 0 ++ ) ++ else ( ++ let json_options = ++ Output_json.parse_output_options output_options in ++ `JSON json_options ++ ) ++ + | `Openstack -> + if is_query then ( + Output_openstack.print_output_options (); +@@ -546,6 +558,23 @@ read the man page virt-v2v(1). + Output_libvirt.output_libvirt output_conn output_storage, + output_format, output_alloc + ++ | `JSON json_options -> ++ if output_password <> None then ++ error_option_cannot_be_used_in_output_mode "json" "-op"; ++ if output_conn <> None then ++ error_option_cannot_be_used_in_output_mode "json" "-oc"; ++ let os = ++ match output_storage with ++ | None -> ++ error (f_"-o json: output directory was not specified, use '-os /dir'") ++ | Some d when not (is_directory d) -> ++ error (f_"-os %s: output directory does not exist or is not a directory") d ++ | Some d -> d in ++ if qemu_boot then ++ error_option_cannot_be_used_in_output_mode "json" "--qemu-boot"; ++ Output_json.output_json os json_options, ++ output_format, output_alloc ++ + | `Local -> + if output_password <> None then + error_option_cannot_be_used_in_output_mode "local" "-op"; +diff --git a/v2v/create_json.ml b/v2v/create_json.ml +new file mode 100644 +index 000000000..fdf7b12f5 +--- /dev/null ++++ b/v2v/create_json.ml +@@ -0,0 +1,348 @@ ++(* virt-v2v ++ * Copyright (C) 2019 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 C_utils ++open Tools_utils ++ ++open Types ++open Utils ++ ++module G = Guestfs ++ ++let json_list_of_string_list = ++ List.map (fun x -> JSON.String x) ++ ++let json_list_of_string_string_list = ++ List.map (fun (x, y) -> x, JSON.String y) ++ ++let push_optional_string lst name = function ++ | None -> () ++ | Some v -> List.push_back lst (name, JSON.String v) ++ ++let push_optional_int lst name = function ++ | None -> () ++ | Some v -> List.push_back lst (name, JSON.Int (Int64.of_int v)) ++ ++let json_unknown_string = function ++ | "unknown" -> JSON.Null ++ | v -> JSON.String v ++ ++let find_target_disk targets { s_disk_id = id } = ++ try List.find (fun t -> t.target_overlay.ov_source.s_disk_id = id) targets ++ with Not_found -> assert false ++ ++let create_json_metadata source targets target_buses ++ guestcaps inspect target_firmware = ++ let doc = ref [ ++ "version", JSON.Int 1L; ++ "name", JSON.String source.s_name; ++ "memory", JSON.Int source.s_memory; ++ "vcpu", JSON.Int (Int64.of_int source.s_vcpu); ++ ] in ++ ++ (match source.s_genid with ++ | None -> () ++ | Some genid -> List.push_back doc ("genid", JSON.String genid) ++ ); ++ ++ if source.s_cpu_vendor <> None || source.s_cpu_model <> None || ++ source.s_cpu_topology <> None then ( ++ let cpu = ref [] in ++ ++ push_optional_string cpu "vendor" source.s_cpu_vendor; ++ push_optional_string cpu "model" source.s_cpu_model; ++ (match source.s_cpu_topology with ++ | None -> () ++ | Some { s_cpu_sockets; s_cpu_cores; s_cpu_threads } -> ++ let attrs = [ ++ "sockets", JSON.Int (Int64.of_int s_cpu_sockets); ++ "cores", JSON.Int (Int64.of_int s_cpu_cores); ++ "threads", JSON.Int (Int64.of_int s_cpu_threads); ++ ] in ++ List.push_back cpu ("topology", JSON.Dict attrs) ++ ); ++ ++ List.push_back doc ("cpu", JSON.Dict !cpu); ++ ); ++ ++ let firmware = ++ let firmware_type = ++ match target_firmware with ++ | TargetBIOS -> "bios" ++ | TargetUEFI -> "uefi" in ++ ++ let fw = ref [ ++ "type", JSON.String firmware_type; ++ ] in ++ ++ (match target_firmware with ++ | TargetBIOS -> () ++ | TargetUEFI -> ++ let uefi_firmware = find_uefi_firmware guestcaps.gcaps_arch in ++ let flags = ++ List.map ( ++ function ++ | Uefi.UEFI_FLAG_SECURE_BOOT_REQUIRED -> "secure_boot_required" ++ ) uefi_firmware.Uefi.flags in ++ ++ let uefi = ref [ ++ "code", JSON.String uefi_firmware.Uefi.code; ++ "vars", JSON.String uefi_firmware.Uefi.vars; ++ "flags", JSON.List (json_list_of_string_list flags); ++ ] in ++ ++ push_optional_string uefi "code-debug" uefi_firmware.Uefi.code_debug; ++ ++ List.push_back fw ("uefi", JSON.Dict !uefi) ++ ); ++ ++ !fw in ++ List.push_back doc ("firmware", JSON.Dict firmware); ++ ++ List.push_back doc ("features", ++ JSON.List (json_list_of_string_list source.s_features)); ++ ++ let machine = ++ match guestcaps.gcaps_machine with ++ | I440FX -> "pc" ++ | Q35 -> "q35" ++ | Virt -> "virt" in ++ List.push_back doc ("machine", JSON.String machine); ++ ++ let disks, removables = ++ let disks = ref [] ++ and removables = ref [] in ++ ++ let iter_bus bus_name drive_prefix i = function ++ | BusSlotEmpty -> () ++ | BusSlotDisk d -> ++ (* Find the corresponding target disk. *) ++ let t = find_target_disk targets d in ++ ++ let target_file = ++ match t.target_file with ++ | TargetFile s -> s ++ | TargetURI _ -> assert false in ++ ++ let disk = [ ++ "dev", JSON.String (drive_prefix ^ drive_name i); ++ "bus", JSON.String bus_name; ++ "format", JSON.String t.target_format; ++ "file", JSON.String (absolute_path target_file); ++ ] in ++ ++ List.push_back disks (JSON.Dict disk) ++ ++ | BusSlotRemovable { s_removable_type = CDROM } -> ++ let cdrom = [ ++ "type", JSON.String "cdrom"; ++ "dev", JSON.String (drive_prefix ^ drive_name i); ++ "bus", JSON.String bus_name; ++ ] in ++ ++ List.push_back removables (JSON.Dict cdrom) ++ ++ | BusSlotRemovable { s_removable_type = Floppy } -> ++ let floppy = [ ++ "type", JSON.String "floppy"; ++ "dev", JSON.String (drive_prefix ^ drive_name i); ++ ] in ++ ++ List.push_back removables (JSON.Dict floppy) ++ in ++ ++ Array.iteri (iter_bus "virtio" "vd") target_buses.target_virtio_blk_bus; ++ Array.iteri (iter_bus "ide" "hd") target_buses.target_ide_bus; ++ Array.iteri (iter_bus "scsi" "sd") target_buses.target_scsi_bus; ++ Array.iteri (iter_bus "floppy" "fd") target_buses.target_floppy_bus; ++ ++ !disks, !removables in ++ List.push_back doc ("disks", JSON.List disks); ++ List.push_back doc ("removables", JSON.List removables); ++ ++ let nics = ++ List.map ( ++ fun { s_mac = mac; s_vnet_type = vnet_type; s_nic_model = nic_model; ++ s_vnet = vnet; } -> ++ let vnet_type_str = ++ match vnet_type with ++ | Bridge -> "bridge" ++ | Network -> "network" in ++ ++ let nic = ref [ ++ "vnet", JSON.String vnet; ++ "vnet-type", JSON.String vnet_type_str; ++ ] in ++ ++ let nic_model_str = Option.map string_of_nic_model nic_model in ++ push_optional_string nic "model" nic_model_str; ++ ++ push_optional_string nic "mac" mac; ++ ++ JSON.Dict !nic ++ ) source.s_nics in ++ List.push_back doc ("nics", JSON.List nics); ++ ++ let guestcaps_dict = ++ let block_bus = ++ match guestcaps.gcaps_block_bus with ++ | Virtio_blk -> "virtio-blk" ++ | Virtio_SCSI -> "virtio-scsi" ++ | IDE -> "ide" in ++ let net_bus = ++ match guestcaps.gcaps_net_bus with ++ | Virtio_net -> "virtio-net" ++ | E1000 -> "e1000" ++ | RTL8139 -> "rtl8139" in ++ let video = ++ match guestcaps.gcaps_video with ++ | QXL -> "qxl" ++ | Cirrus -> "cirrus" in ++ let machine = ++ match guestcaps.gcaps_machine with ++ | I440FX -> "i440fx" ++ | Q35 -> "q35" ++ | Virt -> "virt" in ++ ++ [ ++ "block-bus", JSON.String block_bus; ++ "net-bus", JSON.String net_bus; ++ "video", JSON.String video; ++ "machine", JSON.String machine; ++ "arch", JSON.String guestcaps.gcaps_arch; ++ "virtio-rng", JSON.Bool guestcaps.gcaps_virtio_rng; ++ "virtio-balloon", JSON.Bool guestcaps.gcaps_virtio_balloon; ++ "isa-pvpanic", JSON.Bool guestcaps.gcaps_isa_pvpanic; ++ "acpi", JSON.Bool guestcaps.gcaps_acpi; ++ ] in ++ List.push_back doc ("guestcaps", JSON.Dict guestcaps_dict); ++ ++ (match source.s_sound with ++ | None -> () ++ | Some { s_sound_model = model } -> ++ let sound = [ ++ "model", JSON.String (string_of_source_sound_model model); ++ ] in ++ List.push_back doc ("sound", JSON.Dict sound) ++ ); ++ ++ (match source.s_display with ++ | None -> () ++ | Some d -> ++ let display_type = ++ match d.s_display_type with ++ | Window -> "window" ++ | VNC -> "vnc" ++ | Spice -> "spice" in ++ ++ let display = ref [ ++ "type", JSON.String display_type; ++ ] in ++ ++ push_optional_string display "keymap" d.s_keymap; ++ push_optional_string display "password" d.s_password; ++ ++ let listen = ++ match d.s_listen with ++ | LNoListen -> None ++ | LAddress address -> ++ Some [ ++ "type", JSON.String "address"; ++ "address", JSON.String address; ++ ] ++ | LNetwork network -> ++ Some [ ++ "type", JSON.String "network"; ++ "network", JSON.String network; ++ ] ++ | LSocket None -> ++ Some [ ++ "type", JSON.String "socket"; ++ "socket", JSON.Null; ++ ] ++ | LSocket (Some socket) -> ++ Some [ ++ "type", JSON.String "socket"; ++ "socket", JSON.String socket; ++ ] ++ | LNone -> ++ Some [ ++ "type", JSON.String "none"; ++ ] in ++ (match listen with ++ | None -> () ++ | Some l -> List.push_back display ("listen", JSON.Dict l) ++ ); ++ ++ push_optional_int display "port" d.s_port; ++ ++ List.push_back doc ("display", JSON.Dict !display) ++ ); ++ ++ let inspect_dict = ++ let apps = ++ List.map ( ++ fun { G.app2_name = name; app2_display_name = display_name; ++ app2_epoch = epoch; app2_version = version; ++ app2_release = release; app2_arch = arch; } -> ++ JSON.Dict [ ++ "name", JSON.String name; ++ "display-name", JSON.String display_name; ++ "epoch", JSON.Int (Int64.of_int32 epoch); ++ "version", JSON.String version; ++ "release", JSON.String release; ++ "arch", JSON.String arch; ++ ] ++ ) inspect.i_apps in ++ ++ let firmware_dict = ++ match inspect.i_firmware with ++ | I_BIOS -> ++ [ ++ "type", JSON.String "bios"; ++ ] ++ | I_UEFI devices -> ++ [ ++ "type", JSON.String "uefi"; ++ "devices", JSON.List (json_list_of_string_list devices); ++ ] in ++ ++ [ ++ "root", JSON.String inspect.i_root; ++ "type", JSON.String inspect.i_type; ++ "distro", json_unknown_string inspect.i_distro; ++ "osinfo", json_unknown_string inspect.i_osinfo; ++ "arch", JSON.String inspect.i_arch; ++ "major-version", JSON.Int (Int64.of_int inspect.i_major_version); ++ "minor-version", JSON.Int (Int64.of_int inspect.i_minor_version); ++ "package-format", json_unknown_string inspect.i_package_format; ++ "package-management", json_unknown_string inspect.i_package_management; ++ "product-name", json_unknown_string inspect.i_product_name; ++ "product-variant", json_unknown_string inspect.i_product_variant; ++ "mountpoints", JSON.Dict (json_list_of_string_string_list inspect.i_mountpoints); ++ "applications", JSON.List apps; ++ "windows-systemroot", JSON.String inspect.i_windows_systemroot; ++ "windows-software-hive", JSON.String inspect.i_windows_software_hive; ++ "windows-system-hive", JSON.String inspect.i_windows_system_hive; ++ "windows-current-control-set", JSON.String inspect.i_windows_current_control_set; ++ "firmware", JSON.Dict firmware_dict; ++ ] in ++ List.push_back doc ("inspect", JSON.Dict inspect_dict); ++ ++ !doc +diff --git a/v2v/create_json.mli b/v2v/create_json.mli +new file mode 100644 +index 000000000..6dbb6e48b +--- /dev/null ++++ b/v2v/create_json.mli +@@ -0,0 +1,29 @@ ++(* virt-v2v ++ * Copyright (C) 2019 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. ++ *) ++ ++(** Create JSON metadata for [-o json]. *) ++ ++val create_json_metadata : Types.source -> Types.target list -> ++ Types.target_buses -> ++ Types.guestcaps -> ++ Types.inspect -> ++ Types.target_firmware -> ++ JSON.doc ++(** [create_json_metadata source targets target_buses guestcaps ++ inspect target_firmware] creates the JSON with the majority ++ of the data that virt-v2v used for the conversion. *) +diff --git a/v2v/output_json.ml b/v2v/output_json.ml +new file mode 100644 +index 000000000..ca0bda978 +--- /dev/null ++++ b/v2v/output_json.ml +@@ -0,0 +1,116 @@ ++(* virt-v2v ++ * Copyright (C) 2019 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 Printf ++ ++open Std_utils ++open Tools_utils ++open Common_gettext.Gettext ++ ++open Types ++open Utils ++ ++type json_options = { ++ json_disks_pattern : string; ++} ++ ++let print_output_options () = ++ printf (f_"Output options (-oo) which can be used with -o json: ++ ++ -oo json-disks-pattern=PATTERN Pattern for the disks. ++") ++ ++let known_pattern_variables = ["DiskNo"; "DiskDeviceName"; "GuestName"] ++ ++let parse_output_options options = ++ let json_disks_pattern = ref None in ++ ++ List.iter ( ++ function ++ | "json-disks-pattern", v -> ++ if !json_disks_pattern <> None then ++ error (f_"-o json: -oo json-disks-pattern set more than once"); ++ let vars = ++ try Var_expander.scan_variables v ++ with Var_expander.Invalid_variable var -> ++ error (f_"-o json: -oo json-disks-pattern: invalid variable %%{%s}") ++ var in ++ List.iter ( ++ fun var -> ++ if not (List.mem var known_pattern_variables) then ++ error (f_"-o json: -oo json-disks-pattern: unhandled variable %%{%s}") ++ var ++ ) vars; ++ json_disks_pattern := Some v ++ | k, _ -> ++ error (f_"-o json: unknown output option ‘-oo %s’") k ++ ) options; ++ ++ let json_disks_pattern = ++ Option.default "%{GuestName}-%{DiskDeviceName}" !json_disks_pattern in ++ ++ { json_disks_pattern } ++ ++class output_json dir json_options = object ++ inherit output ++ ++ method as_options = sprintf "-o json -os %s" dir ++ ++ method prepare_targets source overlays _ _ _ _ = ++ List.mapi ( ++ fun i (_, ov) -> ++ let outname = ++ let vars_fn = function ++ | "DiskNo" -> Some (string_of_int (i+1)) ++ | "DiskDeviceName" -> Some ov.ov_sd ++ | "GuestName" -> Some source.s_name ++ | _ -> assert false ++ in ++ Var_expander.replace_fn json_options.json_disks_pattern vars_fn in ++ let destname = dir // outname in ++ mkdir_p (Filename.dirname destname) 0o755; ++ TargetFile destname ++ ) overlays ++ ++ method supported_firmware = [ TargetBIOS; TargetUEFI ] ++ ++ method create_metadata source targets ++ target_buses guestcaps inspect target_firmware = ++ let doc = ++ Create_json.create_json_metadata source targets target_buses ++ guestcaps inspect target_firmware in ++ let doc_string = JSON.string_of_doc ~fmt:JSON.Indented doc in ++ ++ if verbose () then ( ++ eprintf "resulting JSON:\n"; ++ output_string stderr doc_string; ++ eprintf "\n\n%!"; ++ ); ++ ++ let name = source.s_name in ++ let file = dir // name ^ ".json" in ++ ++ with_open_out file ( ++ fun chan -> ++ output_string chan doc_string; ++ output_char chan '\n' ++ ) ++end ++ ++let output_json = new output_json ++let () = Modules_list.register_output_module "json" +diff --git a/v2v/output_json.mli b/v2v/output_json.mli +new file mode 100644 +index 000000000..52f58f2d1 +--- /dev/null ++++ b/v2v/output_json.mli +@@ -0,0 +1,31 @@ ++(* virt-v2v ++ * Copyright (C) 2019 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. ++ *) ++ ++(** [-o json] target. *) ++ ++type json_options ++(** Miscellaneous extra command line parameters used by json. *) ++ ++val print_output_options : unit -> unit ++val parse_output_options : (string * string) list -> json_options ++(** Print and parse json -oo options. *) ++ ++val output_json : string -> json_options -> Types.output ++(** [output_json directory json_options] creates and returns a new ++ {!Types.output} object specialized for writing output to local ++ files with JSON metadata. *) +diff --git a/v2v/virt-v2v-output-local.pod b/v2v/virt-v2v-output-local.pod +index 7427b1ed7..7c397c0a4 100644 +--- a/v2v/virt-v2v-output-local.pod ++++ b/v2v/virt-v2v-output-local.pod +@@ -11,6 +11,9 @@ or libvirt + + virt-v2v [-i* options] -o qemu -os DIRECTORY [--qemu-boot] + ++ virt-v2v [-i* options] -o json -os DIRECTORY ++ [-oo json-disks-pattern=PATTERN] ++ + virt-v2v [-i* options] -o null + + =head1 DESCRIPTION +@@ -54,6 +57,13 @@ above, a shell script is created which contains the raw qemu command + you would need to boot the guest. However the shell script is not + run, I you also add the I<--qemu-boot> option. + ++=item B<-o json -os> C ++ ++This converts the guest to files in C. The metadata ++produced is a JSON file containing the majority of the data virt-v2v ++gathers during the conversion. ++See L below. ++ + =item B<-o null> + + The guest is converted, but the final result is thrown away and no +@@ -140,6 +150,51 @@ Define the final guest in libvirt: + + =back + ++=head1 OUTPUT TO JSON ++ ++The I<-o json> option produces the following files by default: ++ ++ NAME.json JSON metadata. ++ NAME-sda, NAME-sdb, etc. Guest disk(s). ++ ++where C is the guest name. ++ ++It is possible to change the pattern of the disks using the ++I<-oo json-disks-pattern=...> option: it allows parameters in form of ++C<%{...}> variables, for example: ++ ++ -oo json-disks-pattern=disk%{DiskNo}.img ++ ++Recognized variables are: ++ ++=over 4 ++ ++=item C<%{DiskNo}> ++ ++The index of the disk, starting from 1. ++ ++=item C<%{DiskDeviceName}> ++ ++The destination device of the disk, e.g. C, C, etc. ++ ++=item C<%{GuestName}> ++ ++The name of the guest. ++ ++=back ++ ++Using a pattern it is possible use subdirectories for the disks, ++even with names depending on variables; for example: ++ ++ -oo json-disks-pattern=%{GuestName}-%{DiskNo}/disk.img ++ ++The default pattern is C<%{GuestName}-%{DiskDeviceName}>. ++ ++If the literal C<%{...}> text is needed, it is possible to avoid the ++escape it with a leading C<%>; for example, ++C<%%{GuestName}-%{DiskNo}.img> will create file names for the ++disks like C<%%{GuestName}-1.img>, C<%%{GuestName}-2.img>, etc. ++ + =head1 SEE ALSO + + L. +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index cf9464834..9a555c3be 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -425,6 +425,17 @@ instead. + Set the output method to OpenStack Glance. In this mode the converted + guest is uploaded to Glance. See L. + ++=item B<-o> B ++ ++Set the output method to I. ++ ++In this mode, the converted guest is written to a local directory ++specified by I<-os /dir> (the directory must exist), with a JSON file ++containing the majority of the metadata that virt-v2v gathered during ++the conversion. ++ ++See L. ++ + =item B<-o> B + + Set the output method to I. This is the default. +@@ -696,8 +707,8 @@ The location of the storage for the converted guest. + For I<-o libvirt>, this is a libvirt directory pool + (see S>) or pool UUID. + +-For I<-o local> and I<-o qemu>, this is a directory name. The +-directory must exist. ++For I<-o json>, I<-o local> and I<-o qemu>, this is a directory name. ++The directory must exist. + + For I<-o rhv-upload>, this is the name of the destination Storage + Domain. +-- +2.24.1 + diff --git a/SOURCES/0004-inspect-fix-icon-of-RHEL.patch b/SOURCES/0004-inspect-fix-icon-of-RHEL.patch new file mode 100644 index 0000000..bbc55f6 --- /dev/null +++ b/SOURCES/0004-inspect-fix-icon-of-RHEL.patch @@ -0,0 +1,32 @@ +From e7ff090884f5e32585e9683d35b72bca01e0a836 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Mon, 11 Feb 2019 19:28:00 +0100 +Subject: [PATCH] inspect: fix icon of RHEL + +Use a better icon for RHEL guests, still provided by redhat-logos (or +equivalent in downstream distributions), and which fits a better +definition of logo for the distribution. + +Thanks to Ray Strode for the hints. + +(cherry picked from commit c648052690a4a07a59c741308e0e8497d6f18057) +--- + lib/inspect-icon.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/inspect-icon.c b/lib/inspect-icon.c +index 623591aa6..19f3f87af 100644 +--- a/lib/inspect-icon.c ++++ b/lib/inspect-icon.c +@@ -317,7 +317,7 @@ icon_rhel (guestfs_h *g, int major, size_t *size_r) + if (major < 7) + shadowman = "/usr/share/pixmaps/redhat/shadowman-transparent.png"; + else +- shadowman = "/usr/share/pixmaps/fedora-logo-sprite.png"; ++ shadowman = "/usr/share/icons/hicolor/96x96/apps/system-logo-icon.png"; + + return get_png (g, shadowman, size_r, 102400); + } +-- +2.24.1 + diff --git a/SOURCES/0005-v2v-warn-when-the-guest-has-direct-network-interface.patch b/SOURCES/0005-v2v-warn-when-the-guest-has-direct-network-interface.patch new file mode 100644 index 0000000..8f3c240 --- /dev/null +++ b/SOURCES/0005-v2v-warn-when-the-guest-has-direct-network-interface.patch @@ -0,0 +1,48 @@ +From df8794643644c742b7cfced948eee4519b38a643 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Fri, 12 Apr 2019 17:28:12 +0200 +Subject: [PATCH] v2v: warn when the guest has direct network interfaces + (RHBZ#1518539) + +virt-v2v obviously cannot convert this kind of devices, since they are +specific to the host of the hypervisor. Thus, emit a warning about the +presence of direct network interfaces, so at least this can be noticed +when converting a guest. + +(cherry picked from commit 1629ec6a5639cf5e226e80bcee749ae8851b1fae) +--- + v2v/parse_libvirt_xml.ml | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +diff --git a/v2v/parse_libvirt_xml.ml b/v2v/parse_libvirt_xml.ml +index d5d78d367..b9970cee8 100644 +--- a/v2v/parse_libvirt_xml.ml ++++ b/v2v/parse_libvirt_xml.ml +@@ -492,6 +492,24 @@ let parse_libvirt_xml ?conn xml = + ) + in + ++ (* Check for direct attachments to physical network interfaces. ++ * (RHBZ#1518539) ++ *) ++ let () = ++ let obj = Xml.xpath_eval_expression xpathctx "/domain/devices/interface[@type='direct']" in ++ let nr_nodes = Xml.xpathobj_nr_nodes obj in ++ if nr_nodes > 0 then ( ++ (* Sadly fn_ in ocaml-gettext seems broken, and always returns the ++ * singular string no matter what. Work around this by using a simple ++ * string with sn_ (which works), and outputting it as a whole. ++ *) ++ let msg = sn_ "this guest has a direct network interface which will be ignored" ++ "this guest has direct network interfaces which will be ignored" ++ nr_nodes in ++ warning "%s" msg ++ ) ++ in ++ + ({ + s_hypervisor = hypervisor; + s_name = name; s_orig_name = name; +-- +2.24.1 + diff --git a/SOURCES/0006-v2v-update-documentation-on-nbdkit-RHBZ-1605242.patch b/SOURCES/0006-v2v-update-documentation-on-nbdkit-RHBZ-1605242.patch new file mode 100644 index 0000000..91678e5 --- /dev/null +++ b/SOURCES/0006-v2v-update-documentation-on-nbdkit-RHBZ-1605242.patch @@ -0,0 +1,55 @@ +From de267e07b9b26d2f89470d4305d7259edb24663b Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Fri, 12 Apr 2019 16:19:43 +0200 +Subject: [PATCH] v2v: update documentation on nbdkit (RHBZ#1605242) + +nbdkit >= 1.6 ships a VDDK plugin always built, so recommend that +version instead of recommending to build nbdkit from sources. + +(cherry picked from commit 0704d8eb0bcc8139886eb4291f75a3ca49a91e58) +--- + v2v/virt-v2v-input-vmware.pod | 28 ++-------------------------- + 1 file changed, 2 insertions(+), 26 deletions(-) + +diff --git a/v2v/virt-v2v-input-vmware.pod b/v2v/virt-v2v-input-vmware.pod +index 2b6dbaeec..b3ebda182 100644 +--- a/v2v/virt-v2v-input-vmware.pod ++++ b/v2v/virt-v2v-input-vmware.pod +@@ -197,32 +197,8 @@ library is permitted by the license. + + =item 2. + +-You must also compile nbdkit, enabling the VDDK plugin. nbdkit E +-1.1.25 is recommended, but it is usually best to compile from the git +-tree. +- +-=over 4 +- +-=item * +- +-L +- +-=item * +- +-L +- +-=back +- +-Compile nbdkit as described in the sources (see link above). +- +-You do B need to run C because you can run nbdkit +-from its source directory. The source directory has a shell script +-called F which runs the locally built copy of nbdkit and its +-plugins. So set C<$PATH> to point to the nbdkit top build directory +-(that is, the directory containing the shell script called F), +-eg: +- +- export PATH=/path/to/nbdkit-1.1.x:$PATH ++nbdkit E 1.6 is recommended, as it ships with the VDDK plugin ++enabled unconditionally. + + =item 3. + +-- +2.24.1 + diff --git a/SOURCES/0007-v2v-linux-do-not-uninstall-open-vm-tools-w-ubuntu-se.patch b/SOURCES/0007-v2v-linux-do-not-uninstall-open-vm-tools-w-ubuntu-se.patch new file mode 100644 index 0000000..4eca51c --- /dev/null +++ b/SOURCES/0007-v2v-linux-do-not-uninstall-open-vm-tools-w-ubuntu-se.patch @@ -0,0 +1,57 @@ +From 51367a1f2d4a5c54564a6bcaf8c193de643d3ee4 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Wed, 27 Feb 2019 17:51:59 +0100 +Subject: [PATCH] v2v: linux: do not uninstall open-vm-tools w/ ubuntu-server + +ubuntu-server depends on open-vm-tools on Ubuntu, so if v2v tries to +uninstall open-vm-tools then dpkg will (rightfully) fail with a +dependency issue. + +Since open-vm-tools is harmless after the conversion anyway (it will +not even run), then do not attempt to uninstall it if ubuntu-server is +installed too. + +Followup of commit 2bebacf8bf611f0f80a66915f78653ce30b38129. + +Thanks to: Ming Xie. + +(cherry picked from commit 1a4fd822ef057764f809cddce642b3223756629e) +--- + v2v/convert_linux.ml | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +diff --git a/v2v/convert_linux.ml b/v2v/convert_linux.ml +index 3d61400b5..b4b2f24c4 100644 +--- a/v2v/convert_linux.ml ++++ b/v2v/convert_linux.ml +@@ -289,6 +289,18 @@ let convert (g : G.guestfs) inspect source output rcaps = + + (* Uninstall VMware Tools. *) + let remove = ref [] and libraries = ref [] in ++ (* On Ubuntu, the ubuntu-server metapackage depends on ++ * open-vm-tools, and thus any attempt to remove it will cause ++ * dependency issues. Hence, special case this situation, and ++ * leave open-vm-tools installed in this case. ++ *) ++ let has_ubuntu_server = ++ if family = `Debian_family then ++ List.exists ( ++ fun { G.app2_name = name } -> ++ name = "ubuntu-server" ++ ) inspect.i_apps ++ else false in + List.iter ( + fun { G.app2_name = name } -> + if String.is_prefix name "vmware-tools-libraries-" then +@@ -301,7 +313,7 @@ let convert (g : G.guestfs) inspect source output rcaps = + List.push_front name remove + else if String.is_prefix name "open-vm-tools-" then + List.push_front name remove +- else if name = "open-vm-tools" then ++ else if name = "open-vm-tools" && not has_ubuntu_server then + List.push_front name remove + ) inspect.i_apps; + let libraries = !libraries in +-- +2.24.1 + diff --git a/SOURCES/0008-v2v-linux-canonicalize-module-path-for-arch-detectio.patch b/SOURCES/0008-v2v-linux-canonicalize-module-path-for-arch-detectio.patch new file mode 100644 index 0000000..04f21e3 --- /dev/null +++ b/SOURCES/0008-v2v-linux-canonicalize-module-path-for-arch-detectio.patch @@ -0,0 +1,36 @@ +From 6239ce21ea4d47914aa149cee724e998c287d26c Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Wed, 20 Mar 2019 16:55:05 +0100 +Subject: [PATCH] v2v: linux: canonicalize module path for arch detection + (RHBZ#1690574) + +Kernel modules can be also symlinks to files available outside the +"canonical" module directory; the "file" API, used by the +"file-architecture" API, return the actual type of a file (so symlinks, +block devices, etc), and thus "file-architecture" fails on symlinks. + +To prevent this situation, canonicalize the path of the module picked +for architecture detection: this way, "file-architecture" will act on a +real file. + +(cherry picked from commit 0a093035d485b3c2e66d56541ebe159f1b632ba6) +--- + v2v/linux_kernels.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/linux_kernels.ml b/v2v/linux_kernels.ml +index 3313aabc7..889ec2f2a 100644 +--- a/v2v/linux_kernels.ml ++++ b/v2v/linux_kernels.ml +@@ -189,7 +189,7 @@ let detect_kernels (g : G.guestfs) inspect family bootloader = + *) + let arch = + let any_module = modpath ^ List.hd modules in +- g#file_architecture any_module in ++ g#file_architecture (g#realpath any_module) in + + (* Just return the module names, without path or extension. *) + let modules = List.filter_map ( +-- +2.24.1 + diff --git a/SOURCES/0009-v2v-linux-improve-arch-detection-from-modules-RHBZ-1.patch b/SOURCES/0009-v2v-linux-improve-arch-detection-from-modules-RHBZ-1.patch new file mode 100644 index 0000000..f415237 --- /dev/null +++ b/SOURCES/0009-v2v-linux-improve-arch-detection-from-modules-RHBZ-1.patch @@ -0,0 +1,61 @@ +From 10afd834b5e1787cb2b22fce96de30baf37b5b2b Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Wed, 20 Mar 2019 12:32:02 +0100 +Subject: [PATCH] v2v: linux: improve arch detection from modules + (RHBZ#1690574) + +Try to look for a well known kernel module (so far only virtio, or kvm) +to use for detecting the architecture of a kernel. This way, we can +avoid picking 3rd party modules that cause troubles. + +(cherry picked from commit 363b5e0b4ecebe861a9aafe8bce5a8390b54571c) +--- + v2v/linux_kernels.ml | 30 +++++++++++++++++++++++++++--- + 1 file changed, 27 insertions(+), 3 deletions(-) + +diff --git a/v2v/linux_kernels.ml b/v2v/linux_kernels.ml +index 889ec2f2a..30160f0da 100644 +--- a/v2v/linux_kernels.ml ++++ b/v2v/linux_kernels.ml +@@ -185,11 +185,35 @@ let detect_kernels (g : G.guestfs) inspect family bootloader = + assert (List.length modules > 0); + + (* Determine the kernel architecture by looking at the +- * architecture of an arbitrary kernel module. ++ * architecture of a kernel module. ++ * ++ * To avoid architecture detection issues with 3rd party ++ * modules (RHBZ#1690574), try to pick one of the well ++ * known modules, if available. Otherwise, an arbitrary ++ * module is used. + *) + let arch = +- let any_module = modpath ^ List.hd modules in +- g#file_architecture (g#realpath any_module) in ++ (* Well known kernel modules. *) ++ let candidates = [ "virtio"; "kvm" ] in ++ let all_candidates = List.flatten ( ++ List.map ( ++ fun f -> ++ [ "/" ^ f ^ ".o"; "/" ^ f ^ ".ko"; "/" ^ f ^ ".ko.xz" ] ++ ) candidates ++ ) in ++ let candidate = ++ try ++ List.find ( ++ fun m -> ++ List.exists (String.is_suffix m) all_candidates ++ ) modules ++ with Not_found -> ++ (* No known module found, pick an arbitrary one ++ * (the first). ++ *) ++ List.hd modules in ++ let candidate = modpath ^ candidate in ++ g#file_architecture (g#realpath candidate) in + + (* Just return the module names, without path or extension. *) + let modules = List.filter_map ( +-- +2.24.1 + diff --git a/SOURCES/0010-Use-proper-label-for-nbdkit-sockets.patch b/SOURCES/0010-Use-proper-label-for-nbdkit-sockets.patch new file mode 100644 index 0000000..b5474d3 --- /dev/null +++ b/SOURCES/0010-Use-proper-label-for-nbdkit-sockets.patch @@ -0,0 +1,63 @@ +From 54b63460b7602ac5c68d6e58ab60e7f85877cefc Mon Sep 17 00:00:00 2001 +From: Martin Kletzander +Date: Mon, 27 May 2019 13:30:05 +0200 +Subject: [PATCH] Use proper label for nbdkit sockets + +While svirt_t can be used for sockets it does not always guarantee that it will +be accessible from a virtual machine. The VM might be running under svirt_tcg_t +context which will need a svirt_tcg_t label on the socket in order to access it. + +There is, however, another label, svirt_socket_t, which is accessible from +virt_domain: + + # sesearch -A -s svirt_t -c unix_stream_socket -p connectto + ... + allow virt_domain svirt_socket_t:unix_stream_socket { ... connectto ... }; + ... + +And virt_domain is a type attribute of both svirt_t and svirt_tcg_t: + + # seinfo -x -a virt_domain + Type Attributes: 1 + attribute virt_domain; + svirt_t + svirt_tcg_t + +Resolves: https://bugzilla.redhat.com/1698437 + +Signed-off-by: Martin Kletzander +(cherry picked from commit c2918b8b74506523a723b804d452816a059c5e50) +--- + v2v/input_libvirt_vddk.ml | 2 +- + v2v/output_rhv_upload.ml | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/v2v/input_libvirt_vddk.ml b/v2v/input_libvirt_vddk.ml +index 97c7cb532..567233d58 100644 +--- a/v2v/input_libvirt_vddk.ml ++++ b/v2v/input_libvirt_vddk.ml +@@ -290,7 +290,7 @@ object + add_arg "--newstyle"; (* use newstyle NBD protocol *) + add_arg "--exportname"; add_arg "/"; + if have_selinux then ( (* label the socket so qemu can open it *) +- add_arg "--selinux-label"; add_arg "system_u:object_r:svirt_t:s0" ++ add_arg "--selinux-label"; add_arg "system_u:object_r:svirt_socket_t:s0" + ); + + (* Name of the plugin. Everything following is a plugin parameter. *) +diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml +index 77c39107e..c2a5c72c7 100644 +--- a/v2v/output_rhv_upload.ml ++++ b/v2v/output_rhv_upload.ml +@@ -217,7 +217,7 @@ See also the virt-v2v-output-rhv(1) manual.") + let args = + (* label the socket so qemu can open it *) + if have_selinux then +- args @ ["--selinux-label"; "system_u:object_r:svirt_t:s0"] ++ args @ ["--selinux-label"; "system_u:object_r:svirt_socket_t:s0"] + else args in + args in + +-- +2.24.1 + diff --git a/SOURCES/0011-v2v-start-reading-the-new-libvirt-firmware-autoselec.patch b/SOURCES/0011-v2v-start-reading-the-new-libvirt-firmware-autoselec.patch new file mode 100644 index 0000000..c0dcd97 --- /dev/null +++ b/SOURCES/0011-v2v-start-reading-the-new-libvirt-firmware-autoselec.patch @@ -0,0 +1,45 @@ +From 042554182bcc782527dc74e035e2efaf6eb38aa4 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Mon, 8 Apr 2019 18:23:27 +0200 +Subject: [PATCH] v2v: start reading the new libvirt firmware autoselect + +Starting with 5.2.0, libvirt has a way to select automatically the +firmware for a guest using an attribute of the tag. Hence, use +this information (when available, of course) to flag the firmware used +by the guest. + +(cherry picked from commit fb7983f999004c1f8100776819ea65b21990956d) +--- + v2v/parse_libvirt_xml.ml | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/v2v/parse_libvirt_xml.ml b/v2v/parse_libvirt_xml.ml +index b9970cee8..14cd82afd 100644 +--- a/v2v/parse_libvirt_xml.ml ++++ b/v2v/parse_libvirt_xml.ml +@@ -476,6 +476,13 @@ let parse_libvirt_xml ?conn xml = + done; + List.rev !nics in + ++ (* Firmware. *) ++ let firmware = ++ match xpath_string "/domain/os/@firmware" with ++ | Some "bios" -> BIOS ++ | Some "efi" -> UEFI ++ | None | Some _ -> UnknownFirmware in ++ + (* Check for hostdev devices. (RHBZ#1472719) *) + let () = + let obj = Xml.xpath_eval_expression xpathctx "/domain/devices/hostdev" in +@@ -520,7 +527,7 @@ let parse_libvirt_xml ?conn xml = + s_cpu_model = cpu_model; + s_cpu_topology = cpu_topology; + s_features = features; +- s_firmware = UnknownFirmware; (* XXX until RHBZ#1217444 is fixed *) ++ s_firmware = firmware; + s_display = display; + s_video = video; + s_sound = sound; +-- +2.24.1 + diff --git a/SOURCES/0012-common-mltools-move-the-code-for-machine-readable-up.patch b/SOURCES/0012-common-mltools-move-the-code-for-machine-readable-up.patch new file mode 100644 index 0000000..faa7314 --- /dev/null +++ b/SOURCES/0012-common-mltools-move-the-code-for-machine-readable-up.patch @@ -0,0 +1,96 @@ +From 692a752cf3e552790ada8cc07f937036adaa8bf0 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Thu, 21 Mar 2019 17:16:37 +0100 +Subject: [PATCH] common/mltools: move the code for machine readable up + +Move the code for handling machine readable up in the file, so it can be +used by other functions. + +Only code motion, no behaviour changes. + +(cherry picked from commit 8b06ea0ebc9534e4fda9cc9a33c98f939401af79) +--- + common/mltools/tools_utils.ml | 60 +++++++++++++++++------------------ + 1 file changed, 30 insertions(+), 30 deletions(-) + +diff --git a/common/mltools/tools_utils.ml b/common/mltools/tools_utils.ml +index 24641369e..5a35708cd 100644 +--- a/common/mltools/tools_utils.ml ++++ b/common/mltools/tools_utils.ml +@@ -33,6 +33,36 @@ external c_inspect_decrypt : Guestfs.t -> int64 -> (string * key_store_key) list + external c_set_echo_keys : unit -> unit = "guestfs_int_mllib_set_echo_keys" "noalloc" + external c_set_keys_from_stdin : unit -> unit = "guestfs_int_mllib_set_keys_from_stdin" "noalloc" + ++type machine_readable_fn = { ++ pr : 'a. ('a, unit, string, unit) format4 -> 'a; ++} (* [@@unboxed] *) ++ ++type machine_readable_output_type = ++ | NoOutput ++ | Channel of out_channel ++ | File of string ++let machine_readable_output = ref NoOutput ++let machine_readable_channel = ref None ++let machine_readable () = ++ let chan = ++ if !machine_readable_channel = None then ( ++ let chan = ++ match !machine_readable_output with ++ | NoOutput -> None ++ | Channel chan -> Some chan ++ | File f -> Some (open_out f) in ++ machine_readable_channel := chan ++ ); ++ !machine_readable_channel ++ in ++ match chan with ++ | None -> None ++ | Some chan -> ++ let pr fs = ++ ksprintf (output_string chan) fs ++ in ++ Some { pr } ++ + (* ANSI terminal colours. *) + let istty chan = + Unix.isatty (Unix.descr_of_out_channel chan) +@@ -236,36 +266,6 @@ let human_size i = + ) + ) + +-type machine_readable_fn = { +- pr : 'a. ('a, unit, string, unit) format4 -> 'a; +-} (* [@@unboxed] *) +- +-type machine_readable_output_type = +- | NoOutput +- | Channel of out_channel +- | File of string +-let machine_readable_output = ref NoOutput +-let machine_readable_channel = ref None +-let machine_readable () = +- let chan = +- if !machine_readable_channel = None then ( +- let chan = +- match !machine_readable_output with +- | NoOutput -> None +- | Channel chan -> Some chan +- | File f -> Some (open_out f) in +- machine_readable_channel := chan +- ); +- !machine_readable_channel +- in +- match chan with +- | None -> None +- | Some chan -> +- let pr fs = +- ksprintf (output_string chan) fs +- in +- Some { pr } +- + type cmdline_options = { + getopt : Getopt.t; + ks : key_store; +-- +2.24.1 + diff --git a/SOURCES/0013-common-mltools-make-sure-machine-readable-output-is-.patch b/SOURCES/0013-common-mltools-make-sure-machine-readable-output-is-.patch new file mode 100644 index 0000000..88b744d --- /dev/null +++ b/SOURCES/0013-common-mltools-make-sure-machine-readable-output-is-.patch @@ -0,0 +1,34 @@ +From 61e503d193706c38d58147a2d308faf01948550c Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Fri, 22 Mar 2019 11:36:41 +0100 +Subject: [PATCH] common/mltools: make sure machine readable output is flushed + +Enhance the helper printf function for machine readable output to always +flush after each string: this way, readers of the machine readable +stream can get the output as soon as it is outputted. + +(cherry picked from commit abf1607f46ddc3d829a3688b9499a9bcd2319d19) +--- + common/mltools/tools_utils.ml | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/common/mltools/tools_utils.ml b/common/mltools/tools_utils.ml +index 5a35708cd..ade4cb37f 100644 +--- a/common/mltools/tools_utils.ml ++++ b/common/mltools/tools_utils.ml +@@ -59,7 +59,11 @@ let machine_readable () = + | None -> None + | Some chan -> + let pr fs = +- ksprintf (output_string chan) fs ++ let out s = ++ output_string chan s; ++ flush chan ++ in ++ ksprintf out fs + in + Some { pr } + +-- +2.24.1 + diff --git a/SOURCES/0014-common-mltools-allow-fd-for-machine-readable-output.patch b/SOURCES/0014-common-mltools-allow-fd-for-machine-readable-output.patch new file mode 100644 index 0000000..d93b64e --- /dev/null +++ b/SOURCES/0014-common-mltools-allow-fd-for-machine-readable-output.patch @@ -0,0 +1,87 @@ +From 0dd5c55c62f4e239c7be75852cf8a667be833cf1 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Fri, 22 Mar 2019 12:59:11 +0100 +Subject: [PATCH] common/mltools: allow fd for machine readable output + +Allow to specify a file descriptor for the machine readable output. + +Use the same assumption as done in v2v, i.e. that Unix.file_descr is +simply the int file descriptor. + +(cherry picked from commit 70514dfaf1e45b5ad34f20f3297af9782099cf80) +--- + common/mltools/test-machine-readable.sh | 7 +++++++ + common/mltools/tools_utils.ml | 11 ++++++++++- + lib/guestfs.pod | 5 +++++ + 3 files changed, 22 insertions(+), 1 deletion(-) + +diff --git a/common/mltools/test-machine-readable.sh b/common/mltools/test-machine-readable.sh +index 1162c58e9..824460e6d 100755 +--- a/common/mltools/test-machine-readable.sh ++++ b/common/mltools/test-machine-readable.sh +@@ -65,3 +65,10 @@ test $($t --machine-readable=stream:stdout |& wc -l) -eq 3 + # Output "stream:stderr". + $t --machine-readable=stream:stderr 2>&1 >/dev/null | grep 'machine-readable' + test $($t --machine-readable=stream:stderr 2>&1 >/dev/null | wc -l) -eq 2 ++ ++# Output "fd:". ++fn="$tmpdir/fdfile" ++exec 4>"$fn" ++$t --machine-readable=fd:4 ++exec 4>&- ++test $(cat "$fn" | wc -l) -eq 1 +diff --git a/common/mltools/tools_utils.ml b/common/mltools/tools_utils.ml +index ade4cb37f..35478f39e 100644 +--- a/common/mltools/tools_utils.ml ++++ b/common/mltools/tools_utils.ml +@@ -41,6 +41,7 @@ type machine_readable_output_type = + | NoOutput + | Channel of out_channel + | File of string ++ | Fd of int + let machine_readable_output = ref NoOutput + let machine_readable_channel = ref None + let machine_readable () = +@@ -50,7 +51,10 @@ let machine_readable () = + match !machine_readable_output with + | NoOutput -> None + | Channel chan -> Some chan +- | File f -> Some (open_out f) in ++ | File f -> Some (open_out f) ++ | Fd fd -> ++ (* Note that Unix.file_descr is really just an int. *) ++ Some (Unix.out_channel_of_descr (Obj.magic fd)) in + machine_readable_channel := chan + ); + !machine_readable_channel +@@ -296,6 +300,11 @@ let create_standard_options argspec ?anon_fun ?(key_opts = false) ?(machine_read + | n -> + error (f_"invalid output stream for --machine-readable: %s") fmt in + machine_readable_output := Channel chan ++ | "fd" -> ++ (try ++ machine_readable_output := Fd (int_of_string outname) ++ with Failure _ -> ++ error (f_"invalid output fd for --machine-readable: %s") fmt) + | n -> + error (f_"invalid output for --machine-readable: %s") fmt + ) +diff --git a/lib/guestfs.pod b/lib/guestfs.pod +index 53cece2da..f11028466 100644 +--- a/lib/guestfs.pod ++++ b/lib/guestfs.pod +@@ -3287,6 +3287,11 @@ The possible values are: + + =over 4 + ++=item BI ++ ++The output goes to the specified I, which is a file descriptor ++already opened for writing. ++ + =item BF + + The output goes to the specified F. +-- +2.24.1 + diff --git a/SOURCES/0015-OCaml-tools-output-messages-into-JSON-for-machine-re.patch b/SOURCES/0015-OCaml-tools-output-messages-into-JSON-for-machine-re.patch new file mode 100644 index 0000000..4539ffe --- /dev/null +++ b/SOURCES/0015-OCaml-tools-output-messages-into-JSON-for-machine-re.patch @@ -0,0 +1,514 @@ +From 1b29702cefae8a66c83bc84dd15e7b858af3ab47 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Fri, 22 Mar 2019 16:24:25 +0100 +Subject: [PATCH] OCaml tools: output messages into JSON for machine readable + +When the machine readable mode is enabled, print all the messages +(progress, info, warning, and errors) also as JSON in the machine +readable stream: this way, users can easily parse the status of the +OCaml tool, and report that back. + +The formatting of the current date time into the RFC 3999 format is done +in C, because of the lack of OCaml APIs for this. + +(cherry picked from commit f79129b8dc92470e3a5597daf53c84038bd6859e) +--- + .gitignore | 1 + + common/mltools/Makefile.am | 39 ++++++- + common/mltools/parse_tools_messages_test.py | 118 ++++++++++++++++++++ + common/mltools/test-tools-messages.sh | 28 +++++ + common/mltools/tools_messages_tests.ml | 46 ++++++++ + common/mltools/tools_utils-c.c | 51 +++++++++ + common/mltools/tools_utils.ml | 16 +++ + lib/guestfs.pod | 19 ++++ + 8 files changed, 316 insertions(+), 2 deletions(-) + create mode 100644 common/mltools/parse_tools_messages_test.py + create mode 100755 common/mltools/test-tools-messages.sh + create mode 100644 common/mltools/tools_messages_tests.ml + +diff --git a/.gitignore b/.gitignore +index f2efcdde2..db1dbb7cc 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -147,6 +147,7 @@ Makefile.in + /common/mltools/JSON_tests + /common/mltools/JSON_parser_tests + /common/mltools/machine_readable_tests ++/common/mltools/tools_messages_tests + /common/mltools/tools_utils_tests + /common/mltools/oUnit-* + /common/mlutils/.depend +diff --git a/common/mltools/Makefile.am b/common/mltools/Makefile.am +index 37d10e610..ae78b84b7 100644 +--- a/common/mltools/Makefile.am ++++ b/common/mltools/Makefile.am +@@ -27,6 +27,8 @@ EXTRA_DIST = \ + machine_readable_tests.ml \ + test-getopt.sh \ + test-machine-readable.sh \ ++ test-tools-messages.sh \ ++ tools_messages_tests.ml \ + tools_utils_tests.ml + + SOURCES_MLI = \ +@@ -45,12 +47,12 @@ SOURCES_MLI = \ + + SOURCES_ML = \ + getopt.ml \ ++ JSON.ml \ + tools_utils.ml \ + URI.ml \ + planner.ml \ + registry.ml \ + regedit.ml \ +- JSON.ml \ + JSON_parser.ml \ + curl.ml \ + checksums.ml \ +@@ -196,6 +198,15 @@ machine_readable_tests_CPPFLAGS = \ + machine_readable_tests_BOBJECTS = machine_readable_tests.cmo + machine_readable_tests_XOBJECTS = $(machine_readable_tests_BOBJECTS:.cmo=.cmx) + ++tools_messages_tests_SOURCES = dummy.c ++tools_messages_tests_CPPFLAGS = \ ++ -I. \ ++ -I$(top_builddir) \ ++ -I$(shell $(OCAMLC) -where) \ ++ -I$(top_srcdir)/lib ++tools_messages_tests_BOBJECTS = tools_messages_tests.cmo ++tools_messages_tests_XOBJECTS = $(tools_messages_tests_BOBJECTS:.cmo=.cmx) ++ + # Can't call the following as _OBJECTS because automake gets confused. + if !HAVE_OCAMLOPT + tools_utils_tests_THEOBJECTS = $(tools_utils_tests_BOBJECTS) +@@ -212,6 +223,9 @@ JSON_parser_tests.cmo: OCAMLPACKAGES += $(OCAMLPACKAGES_TESTS) + + machine_readable_tests_THEOBJECTS = $(machine_readable_tests_BOBJECTS) + machine_readable_tests.cmo: OCAMLPACKAGES += $(OCAMLPACKAGES_TESTS) ++ ++tools_messages_tests_THEOBJECTS = $(tools_messages_tests_tests_BOBJECTS) ++tools_messages_tests.cmo: OCAMLPACKAGES += $(OCAMLPACKAGES_TESTS) + else + tools_utils_tests_THEOBJECTS = $(tools_utils_tests_XOBJECTS) + tools_utils_tests.cmx: OCAMLPACKAGES += $(OCAMLPACKAGES_TESTS) +@@ -227,6 +241,9 @@ JSON_parser_tests.cmx: OCAMLPACKAGES += $(OCAMLPACKAGES_TESTS) + + machine_readable_tests_THEOBJECTS = $(machine_readable_tests_XOBJECTS) + machine_readable_tests.cmx: OCAMLPACKAGES += $(OCAMLPACKAGES_TESTS) ++ ++tools_messages_tests_THEOBJECTS = $(tools_messages_tests_XOBJECTS) ++tools_messages_tests.cmx: OCAMLPACKAGES += $(OCAMLPACKAGES_TESTS) + endif + + OCAMLLINKFLAGS = \ +@@ -302,14 +319,32 @@ machine_readable_tests_LINK = \ + $(OCAMLPACKAGES) $(OCAMLPACKAGES_TESTS) \ + $(machine_readable_tests_THEOBJECTS) -o $@ + ++tools_messages_tests_DEPENDENCIES = \ ++ $(tools_messages_tests_THEOBJECTS) \ ++ ../mlstdutils/mlstdutils.$(MLARCHIVE) \ ++ ../mlgettext/mlgettext.$(MLARCHIVE) \ ++ ../mlpcre/mlpcre.$(MLARCHIVE) \ ++ $(MLTOOLS_CMA) \ ++ $(top_srcdir)/ocaml-link.sh ++tools_messages_tests_LINK = \ ++ $(top_srcdir)/ocaml-link.sh -cclib '-lutils -lgnu' -- \ ++ $(OCAMLFIND) $(BEST) $(OCAMLFLAGS) $(OCAMLLINKFLAGS) \ ++ $(OCAMLPACKAGES) $(OCAMLPACKAGES_TESTS) \ ++ $(tools_messages_tests_THEOBJECTS) -o $@ ++ + TESTS_ENVIRONMENT = $(top_builddir)/run --test + + TESTS = \ + test-getopt.sh \ + test-machine-readable.sh ++if HAVE_PYTHON ++TESTS += \ ++ test-tools-messages.sh ++endif + check_PROGRAMS = \ + getopt_tests \ +- machine_readable_tests ++ machine_readable_tests \ ++ tools_messages_tests + + if HAVE_OCAML_PKG_OUNIT + check_PROGRAMS += JSON_tests JSON_parser_tests tools_utils_tests +diff --git a/common/mltools/parse_tools_messages_test.py b/common/mltools/parse_tools_messages_test.py +new file mode 100644 +index 000000000..9dcd6cae6 +--- /dev/null ++++ b/common/mltools/parse_tools_messages_test.py +@@ -0,0 +1,118 @@ ++# Copyright (C) 2019 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. ++ ++import datetime ++import json ++import os ++import sys ++import unittest ++ ++exe = "tools_messages_tests" ++ ++if sys.version_info >= (3, 4): ++ def set_fd_inheritable(fd): ++ os.set_inheritable(fd, True) ++else: ++ def set_fd_inheritable(fd): ++ pass ++ ++ ++if sys.version_info >= (3, 0): ++ def fdopen(fd, mode): ++ return open(fd, mode) ++ ++ def isModuleInstalled(mod): ++ import importlib ++ return bool(importlib.util.find_spec(mod)) ++else: ++ def fdopen(fd, mode): ++ return os.fdopen(fd, mode) ++ ++ def isModuleInstalled(mod): ++ import imp ++ try: ++ imp.find_module(mod) ++ return True ++ except ImportError: ++ return False ++ ++ ++def skipUnlessHasModule(mod): ++ if not isModuleInstalled(mod): ++ return unittest.skip("%s not available" % mod) ++ return lambda func: func ++ ++ ++def iterload(stream): ++ dec = json.JSONDecoder() ++ for line in stream: ++ yield dec.raw_decode(line) ++ ++ ++def loadJsonFromCommand(extraargs): ++ r, w = os.pipe() ++ set_fd_inheritable(r) ++ r = fdopen(r, "r") ++ set_fd_inheritable(w) ++ w = fdopen(w, "w") ++ pid = os.fork() ++ if pid: ++ w.close() ++ l = list(iterload(r)) ++ l = [o[0] for o in l] ++ r.close() ++ return l ++ else: ++ r.close() ++ args = ["tools_messages_tests", ++ "--machine-readable=fd:%d" % w.fileno()] + extraargs ++ os.execvp("./" + exe, args) ++ ++ ++@skipUnlessHasModule('iso8601') ++class TestParseToolsMessages(unittest.TestCase): ++ def check_json(self, json, typ, msg): ++ import iso8601 ++ # Check the type. ++ jsontype = json.pop("type") ++ self.assertEqual(jsontype, typ) ++ # Check the message. ++ jsonmsg = json.pop("message") ++ self.assertEqual(jsonmsg, msg) ++ # Check the timestamp. ++ jsonts = json.pop("timestamp") ++ dt = iso8601.parse_date(jsonts) ++ now = datetime.datetime.now(dt.tzinfo) ++ self.assertGreater(now, dt) ++ # Check there are no more keys left (and thus not previously tested). ++ self.assertEqual(len(json), 0) ++ ++ def test_messages(self): ++ objects = loadJsonFromCommand([]) ++ self.assertEqual(len(objects), 4) ++ self.check_json(objects[0], "message", "Starting") ++ self.check_json(objects[1], "info", "An information message") ++ self.check_json(objects[2], "warning", "Warning: message here") ++ self.check_json(objects[3], "message", "Finishing") ++ ++ def test_error(self): ++ objects = loadJsonFromCommand(["--error"]) ++ self.assertEqual(len(objects), 1) ++ self.check_json(objects[0], "error", "Error!") ++ ++ ++if __name__ == '__main__': ++ unittest.main() +diff --git a/common/mltools/test-tools-messages.sh b/common/mltools/test-tools-messages.sh +new file mode 100755 +index 000000000..0e24d6ce9 +--- /dev/null ++++ b/common/mltools/test-tools-messages.sh +@@ -0,0 +1,28 @@ ++#!/bin/bash - ++# libguestfs ++# Copyright (C) 2019 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. ++ ++# Test the --machine-readable functionality of the module Tools_utils. ++# See also: machine_readable_tests.ml ++ ++set -e ++set -x ++ ++$TEST_FUNCTIONS ++skip_if_skipped ++ ++$PYTHON parse_tools_messages_test.py +diff --git a/common/mltools/tools_messages_tests.ml b/common/mltools/tools_messages_tests.ml +new file mode 100644 +index 000000000..d5f9be89b +--- /dev/null ++++ b/common/mltools/tools_messages_tests.ml +@@ -0,0 +1,46 @@ ++(* ++ * Copyright (C) 2019 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. ++ *) ++ ++(* Test the message output for tools of the module Tools_utils. ++ * The tests are controlled by the test-tools-messages.sh script. ++ *) ++ ++open Printf ++ ++open Std_utils ++open Tools_utils ++open Getopt.OptionName ++ ++let is_error = ref false ++ ++let args = [ ++ [ L "error" ], Getopt.Set is_error, "Only print the error"; ++] ++let usage_msg = sprintf "%s: test the message outputs" prog ++ ++let opthandle = create_standard_options args ~machine_readable:true usage_msg ++let () = ++ Getopt.parse opthandle.getopt; ++ ++ if !is_error then ++ error "Error!"; ++ ++ message "Starting"; ++ info "An information message"; ++ warning "Warning: message here"; ++ message "Finishing" +diff --git a/common/mltools/tools_utils-c.c b/common/mltools/tools_utils-c.c +index c88c95082..b015dcace 100644 +--- a/common/mltools/tools_utils-c.c ++++ b/common/mltools/tools_utils-c.c +@@ -23,6 +23,8 @@ + #include + #include + #include ++#include ++#include + + #include + #include +@@ -37,6 +39,7 @@ + extern value guestfs_int_mllib_inspect_decrypt (value gv, value gpv, value keysv); + extern value guestfs_int_mllib_set_echo_keys (value unitv); + extern value guestfs_int_mllib_set_keys_from_stdin (value unitv); ++extern value guestfs_int_mllib_rfc3999_date_time_string (value unitv); + + /* Interface with the guestfish inspection and decryption code. */ + int echo_keys = 0; +@@ -103,3 +106,51 @@ guestfs_int_mllib_set_keys_from_stdin (value unitv) + keys_from_stdin = 1; + return Val_unit; + } ++ ++value ++guestfs_int_mllib_rfc3999_date_time_string (value unitv) ++{ ++ CAMLparam1 (unitv); ++ char buf[64]; ++ struct timespec ts; ++ struct tm tm; ++ size_t ret; ++ size_t total = 0; ++ ++ if (clock_gettime (CLOCK_REALTIME, &ts) == -1) ++ unix_error (errno, (char *) "clock_gettime", Val_unit); ++ ++ if (localtime_r (&ts.tv_sec, &tm) == NULL) ++ unix_error (errno, (char *) "localtime_r", caml_copy_int64 (ts.tv_sec)); ++ ++ /* Sadly strftime does not support nanoseconds, so what we do is: ++ * - stringify everything before the nanoseconds ++ * - print the nanoseconds ++ * - stringify the rest (i.e. the timezone) ++ * then place ':' between the hours, and the minutes of the ++ * timezone offset. ++ */ ++ ++ ret = strftime (buf, sizeof (buf), "%Y-%m-%dT%H:%M:%S.", &tm); ++ if (ret == 0) ++ unix_error (errno, (char *) "strftime", Val_unit); ++ total += ret; ++ ++ ret = snprintf (buf + total, sizeof (buf) - total, "%09ld", ts.tv_nsec); ++ if (ret == 0) ++ unix_error (errno, (char *) "sprintf", caml_copy_int64 (ts.tv_nsec)); ++ total += ret; ++ ++ ret = strftime (buf + total, sizeof (buf) - total, "%z", &tm); ++ if (ret == 0) ++ unix_error (errno, (char *) "strftime", Val_unit); ++ total += ret; ++ ++ /* Move the timezone minutes one character to the right, moving the ++ * null character too. ++ */ ++ memmove (buf + total - 1, buf + total - 2, 3); ++ buf[total - 2] = ':'; ++ ++ CAMLreturn (caml_copy_string (buf)); ++} +diff --git a/common/mltools/tools_utils.ml b/common/mltools/tools_utils.ml +index 35478f39e..de42df600 100644 +--- a/common/mltools/tools_utils.ml ++++ b/common/mltools/tools_utils.ml +@@ -32,6 +32,7 @@ and key_store_key = + external c_inspect_decrypt : Guestfs.t -> int64 -> (string * key_store_key) list -> unit = "guestfs_int_mllib_inspect_decrypt" + external c_set_echo_keys : unit -> unit = "guestfs_int_mllib_set_echo_keys" "noalloc" + external c_set_keys_from_stdin : unit -> unit = "guestfs_int_mllib_set_keys_from_stdin" "noalloc" ++external c_rfc3999_date_time_string : unit -> string = "guestfs_int_mllib_rfc3999_date_time_string" + + type machine_readable_fn = { + pr : 'a. ('a, unit, string, unit) format4 -> 'a; +@@ -86,12 +87,24 @@ let ansi_magenta ?(chan = stdout) () = + let ansi_restore ?(chan = stdout) () = + if colours () || istty chan then output_string chan "\x1b[0m" + ++let log_as_json msgtype msg = ++ match machine_readable () with ++ | None -> () ++ | Some { pr } -> ++ let json = [ ++ "message", JSON.String msg; ++ "timestamp", JSON.String (c_rfc3999_date_time_string ()); ++ "type", JSON.String msgtype; ++ ] in ++ pr "%s\n" (JSON.string_of_doc ~fmt:JSON.Compact json) ++ + (* Timestamped progress messages, used for ordinary messages when not + * --quiet. + *) + let start_t = Unix.gettimeofday () + let message fs = + let display str = ++ log_as_json "message" str; + if not (quiet ()) then ( + let t = sprintf "%.1f" (Unix.gettimeofday () -. start_t) in + printf "[%6s] " t; +@@ -106,6 +119,7 @@ let message fs = + (* Error messages etc. *) + let error ?(exit_code = 1) fs = + let display str = ++ log_as_json "error" str; + let chan = stderr in + ansi_red ~chan (); + wrap ~chan (sprintf (f_"%s: error: %s") prog str); +@@ -124,6 +138,7 @@ let error ?(exit_code = 1) fs = + + let warning fs = + let display str = ++ log_as_json "warning" str; + let chan = stdout in + ansi_blue ~chan (); + wrap ~chan (sprintf (f_"%s: warning: %s") prog str); +@@ -134,6 +149,7 @@ let warning fs = + + let info fs = + let display str = ++ log_as_json "info" str; + let chan = stdout in + ansi_magenta ~chan (); + wrap ~chan (sprintf (f_"%s: %s") prog str); +diff --git a/lib/guestfs.pod b/lib/guestfs.pod +index f11028466..3c1d635c5 100644 +--- a/lib/guestfs.pod ++++ b/lib/guestfs.pod +@@ -3279,6 +3279,25 @@ Some of the tools support a I<--machine-readable> option, which is + generally used to make the output more machine friendly, for easier + parsing for example. By default, this output goes to stdout. + ++When using the I<--machine-readable> option, the progress, ++information, warning, and error messages are also printed in JSON ++format for easier log tracking. Thus, it is highly recommended to ++redirect the machine-readable output to a different stream. The ++format of these JSON messages is like the following (actually printed ++within a single line, below it is indented for readability): ++ ++ { ++ "message": "Finishing off", ++ "timestamp": "2019-03-22T14:46:49.067294446+01:00", ++ "type": "message" ++ } ++ ++C can be: C for progress messages, C for ++information messages, C for warning messages, and C ++for error message. ++C is the L ++timestamp of the message. ++ + In addition to that, a subset of these tools support an extra string + passed to the I<--machine-readable> option: this string specifies + where the machine-readable output will go. +-- +2.24.1 + diff --git a/SOURCES/0016-OCaml-tools-fix-3999-3339-typo.patch b/SOURCES/0016-OCaml-tools-fix-3999-3339-typo.patch new file mode 100644 index 0000000..2122a42 --- /dev/null +++ b/SOURCES/0016-OCaml-tools-fix-3999-3339-typo.patch @@ -0,0 +1,77 @@ +From 1d4e167ebcf75771957f3ba109354a8217e78004 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Mon, 1 Apr 2019 17:01:44 +0200 +Subject: [PATCH] OCaml tools: fix 3999 -> 3339 typo + +RFC 3339 is the actual RFC for date/time strings. +Typo found by Martin 'eagle eyes' Kletzander. + +Fixes commit f79129b8dc92470e3a5597daf53c84038bd6859e. + +(cherry picked from commit 1086599ad8eeb8be299d5ffbcb2efb1024ff9ab8) +--- + common/mltools/tools_utils-c.c | 4 ++-- + common/mltools/tools_utils.ml | 4 ++-- + lib/guestfs.pod | 2 +- + 3 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/common/mltools/tools_utils-c.c b/common/mltools/tools_utils-c.c +index b015dcace..3b80091c0 100644 +--- a/common/mltools/tools_utils-c.c ++++ b/common/mltools/tools_utils-c.c +@@ -39,7 +39,7 @@ + extern value guestfs_int_mllib_inspect_decrypt (value gv, value gpv, value keysv); + extern value guestfs_int_mllib_set_echo_keys (value unitv); + extern value guestfs_int_mllib_set_keys_from_stdin (value unitv); +-extern value guestfs_int_mllib_rfc3999_date_time_string (value unitv); ++extern value guestfs_int_mllib_rfc3339_date_time_string (value unitv); + + /* Interface with the guestfish inspection and decryption code. */ + int echo_keys = 0; +@@ -108,7 +108,7 @@ guestfs_int_mllib_set_keys_from_stdin (value unitv) + } + + value +-guestfs_int_mllib_rfc3999_date_time_string (value unitv) ++guestfs_int_mllib_rfc3339_date_time_string (value unitv) + { + CAMLparam1 (unitv); + char buf[64]; +diff --git a/common/mltools/tools_utils.ml b/common/mltools/tools_utils.ml +index de42df600..127180225 100644 +--- a/common/mltools/tools_utils.ml ++++ b/common/mltools/tools_utils.ml +@@ -32,7 +32,7 @@ and key_store_key = + external c_inspect_decrypt : Guestfs.t -> int64 -> (string * key_store_key) list -> unit = "guestfs_int_mllib_inspect_decrypt" + external c_set_echo_keys : unit -> unit = "guestfs_int_mllib_set_echo_keys" "noalloc" + external c_set_keys_from_stdin : unit -> unit = "guestfs_int_mllib_set_keys_from_stdin" "noalloc" +-external c_rfc3999_date_time_string : unit -> string = "guestfs_int_mllib_rfc3999_date_time_string" ++external c_rfc3339_date_time_string : unit -> string = "guestfs_int_mllib_rfc3339_date_time_string" + + type machine_readable_fn = { + pr : 'a. ('a, unit, string, unit) format4 -> 'a; +@@ -93,7 +93,7 @@ let log_as_json msgtype msg = + | Some { pr } -> + let json = [ + "message", JSON.String msg; +- "timestamp", JSON.String (c_rfc3999_date_time_string ()); ++ "timestamp", JSON.String (c_rfc3339_date_time_string ()); + "type", JSON.String msgtype; + ] in + pr "%s\n" (JSON.string_of_doc ~fmt:JSON.Compact json) +diff --git a/lib/guestfs.pod b/lib/guestfs.pod +index 3c1d635c5..af944ddb7 100644 +--- a/lib/guestfs.pod ++++ b/lib/guestfs.pod +@@ -3295,7 +3295,7 @@ within a single line, below it is indented for readability): + C can be: C for progress messages, C for + information messages, C for warning messages, and C + for error message. +-C is the L ++C is the L + timestamp of the message. + + In addition to that, a subset of these tools support an extra string +-- +2.24.1 + diff --git a/SOURCES/0017-v2v-remove-extra-nbdkit-bit-from-documentation-RHBZ-.patch b/SOURCES/0017-v2v-remove-extra-nbdkit-bit-from-documentation-RHBZ-.patch new file mode 100644 index 0000000..97c3066 --- /dev/null +++ b/SOURCES/0017-v2v-remove-extra-nbdkit-bit-from-documentation-RHBZ-.patch @@ -0,0 +1,31 @@ +From 18007f645332e6a7c039a6bdb690e0a55f9cd1c7 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Thu, 18 Jul 2019 15:38:53 +0200 +Subject: [PATCH] v2v: remove extra nbdkit bit from documentation + (RHBZ#1723305) + +Since there is no more need to build nbdkit from sources, then there is +no need to set $PATH with a custom build of nbdkit. + +Followup of commit 0704d8eb0bcc8139886eb4291f75a3ca49a91e58. + +(cherry picked from commit 6d251e3828ff94deac7589b5892df174430e01f9) +--- + v2v/virt-v2v-input-vmware.pod | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/v2v/virt-v2v-input-vmware.pod b/v2v/virt-v2v-input-vmware.pod +index b3ebda182..3acdd773e 100644 +--- a/v2v/virt-v2v-input-vmware.pod ++++ b/v2v/virt-v2v-input-vmware.pod +@@ -293,7 +293,6 @@ To import a particular guest from vCenter server or ESXi hypervisor, + use a command like the following, substituting the URI, guest name and + SSL thumbprint: + +- $ export PATH=/path/to/nbdkit-1.1.x:$PATH + $ virt-v2v \ + -ic 'vpx://root@vcenter.example.com/Datacenter/esxi?no_verify=1' \ + -it vddk \ +-- +2.24.1 + diff --git a/SOURCES/0018-v2v-i-vmx-Use-scp-T-option-if-available-to-unbreak-s.patch b/SOURCES/0018-v2v-i-vmx-Use-scp-T-option-if-available-to-unbreak-s.patch new file mode 100644 index 0000000..0ca42b5 --- /dev/null +++ b/SOURCES/0018-v2v-i-vmx-Use-scp-T-option-if-available-to-unbreak-s.patch @@ -0,0 +1,49 @@ +From d74842f209b5461692a2d283d622157862bdc230 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 25 Jul 2019 14:52:42 +0100 +Subject: [PATCH] v2v: -i vmx: Use scp -T option if available to unbreak scp + (RHBZ#1733168). + +Tested using: + +cd v2v +LIBGUESTFS_BACKEND=direct ../run virt-v2v -i vmx -it ssh "ssh://localhost/$PWD/test-v2v-i-vmx-1.vmx" -o null -v -x + +and manually examining the debug output. + +Thanks: Ming Xie, Jakub Jelen. +(cherry picked from commit 7692c31494f7b1d37e380eed9eb99c5952940dbf) +--- + v2v/input_vmx.ml | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/v2v/input_vmx.ml b/v2v/input_vmx.ml +index b169b2537..e3469308d 100644 +--- a/v2v/input_vmx.ml ++++ b/v2v/input_vmx.ml +@@ -61,6 +61,11 @@ let server_of_uri { Xml.uri_server } = + let path_of_uri { Xml.uri_path } = + match uri_path with None -> assert false | Some p -> p + ++let scp_supports_T_option = lazy ( ++ let cmd = "LANG=C scp -T |& grep \"unknown option\"" in ++ shell_command cmd <> 0 ++) ++ + (* 'scp' a remote file into a temporary local file, returning the path + * of the temporary local file. + *) +@@ -68,8 +73,9 @@ let scp_from_remote_to_temporary uri tmpdir filename = + let localfile = tmpdir // filename in + + let cmd = +- sprintf "scp%s%s %s%s:%s %s" ++ sprintf "scp%s%s%s %s%s:%s %s" + (if verbose () then "" else " -q") ++ (if Lazy.force scp_supports_T_option then " -T" else "") + (match port_of_uri uri with + | None -> "" + | Some port -> sprintf " -P %d" port) +-- +2.24.1 + diff --git a/SOURCES/0019-v2v-Allow-Windows-virtio-ISO-to-be-a-block-device-as.patch b/SOURCES/0019-v2v-Allow-Windows-virtio-ISO-to-be-a-block-device-as.patch new file mode 100644 index 0000000..5f1d636 --- /dev/null +++ b/SOURCES/0019-v2v-Allow-Windows-virtio-ISO-to-be-a-block-device-as.patch @@ -0,0 +1,28 @@ +From 4b94dac532dc17cde462479bf90ab2631006b80b Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 4 Jul 2019 15:51:25 +0100 +Subject: [PATCH] v2v: Allow Windows virtio ISO to be a block device as well as + a regular file. + +Thanks: Steven Rosenberg +(cherry picked from commit c22a8b68fe5729d3a8907b41eef287cd9f3a55c0) +--- + v2v/windows_virtio.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/windows_virtio.ml b/v2v/windows_virtio.ml +index 92bf3ec60..a6dc29f2c 100644 +--- a/v2v/windows_virtio.ml ++++ b/v2v/windows_virtio.ml +@@ -330,7 +330,7 @@ and copy_from_virtio_win g inspect srcdir destdir filter missing = + ) paths + ) + ) +- else if is_regular_file virtio_win then ( ++ else if is_regular_file virtio_win || is_block_device virtio_win then ( + debug "windows: copy_from_virtio_win: guest tools source ISO %s" virtio_win; + + try +-- +2.24.1 + diff --git a/SOURCES/0020-v2v-Set-DISKTYPE-2-in-RHV-and-VDSM-meta-files-RHBZ-1.patch b/SOURCES/0020-v2v-Set-DISKTYPE-2-in-RHV-and-VDSM-meta-files-RHBZ-1.patch new file mode 100644 index 0000000..0e7f62b --- /dev/null +++ b/SOURCES/0020-v2v-Set-DISKTYPE-2-in-RHV-and-VDSM-meta-files-RHBZ-1.patch @@ -0,0 +1,46 @@ +From 2eeada3ec57760f57d5da473f32b359c6b55c616 Mon Sep 17 00:00:00 2001 +From: Nir Soffer +Date: Mon, 2 Sep 2019 17:45:13 +0100 +Subject: [PATCH] v2v: Set DISKTYPE=2 in RHV and VDSM meta files + (RHBZ#1746699). + +Added in virt-p2v commit: + + commit e83b6f50af34ce650063ecc520bfabab400e8e73 + Author: Matthew Booth + Date: Fri Mar 26 09:40:20 2010 +0000 + + Add export to RHEV + + Allow guests to be written to a RHEV NFS export storage domain. + + Add 'rhev' output method and -osd command-line option. + Example command line: + + virt-v2v -f virt-v2v.conf -ic 'esx://yellow.rhev.marston/' \ + -o rhev -osd blue:/export/export RHEL3-32 + + This will connect to an ESX server and write the guest 'RHEL3-32' to + blue:/export/export, which is a pre-initialised RHEV export storage domain. + +(cherry picked from commit fcfdbc9420b07e3003df38481afb9ccd22045e1a) +--- + v2v/create_ovf.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/create_ovf.ml b/v2v/create_ovf.ml +index 91ff5198d..9aad5dd15 100644 +--- a/v2v/create_ovf.ml ++++ b/v2v/create_ovf.ml +@@ -501,7 +501,7 @@ let create_meta_files output_alloc sd_uuid image_uuids overlays = + bpf "CTIME=%.0f\n" time; + bpf "MTIME=%.0f\n" time; + bpf "IMAGE=%s\n" image_uuid; +- bpf "DISKTYPE=1\n"; ++ bpf "DISKTYPE=2\n"; + bpf "PUUID=00000000-0000-0000-0000-000000000000\n"; + bpf "LEGALITY=LEGAL\n"; + bpf "POOL_UUID=\n"; +-- +2.24.1 + diff --git a/SOURCES/0021-v2v-rhv-upload-plugin-improve-wait-logic-after-final.patch b/SOURCES/0021-v2v-rhv-upload-plugin-improve-wait-logic-after-final.patch new file mode 100644 index 0000000..48f1eff --- /dev/null +++ b/SOURCES/0021-v2v-rhv-upload-plugin-improve-wait-logic-after-final.patch @@ -0,0 +1,55 @@ +From 41f3e803050b46fd79d8c2e728fc0425da05878c Mon Sep 17 00:00:00 2001 +From: Daniel Erez +Date: Mon, 18 Mar 2019 18:51:26 +0200 +Subject: [PATCH] v2v: rhv-upload-plugin - improve wait logic after finalize + (RHBZ#1680361) + +After invoking transfer_service.finalize, check operation status by +examining DiskStatus. This is done instead of failing after a +predefined timeout regardless the status. + +Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1680361 +Signed-off-by: Richard W.M. Jones +Tested-by: Ilanit Stein +(cherry picked from commit eeabb3fdc7756887b53106f455a7b54309130637) +--- + v2v/rhv-upload-plugin.py | 19 +++++++++++++------ + 1 file changed, 13 insertions(+), 6 deletions(-) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index 2a950c5ed..4d61a089b 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -523,16 +523,23 @@ def close(h): + # waiting for the transfer object to cease to exist, which + # falls through to the exception case and then we can + # continue. +- endt = time.time() + timeout ++ disk_id = disk.id ++ start = time.time() + try: + while True: + time.sleep(1) +- tmp = transfer_service.get() +- if time.time() > endt: +- raise RuntimeError("timed out waiting for transfer " +- "to finalize") ++ disk_service = h['disk_service'] ++ disk = disk_service.get() ++ if disk.status == types.DiskStatus.LOCKED: ++ if time.time() > start + timeout: ++ raise RuntimeError("timed out waiting for transfer " ++ "to finalize") ++ continue ++ if disk.status == types.DiskStatus.OK: ++ debug("finalized after %s seconds" % (time.time() - start)) ++ break + except sdk.NotFoundError: +- pass ++ raise RuntimeError("transfer failed: disk %s not found" % disk_id) + + # Write the disk ID file. Only do this on successful completion. + with builtins.open(params['diskid_file'], 'w') as fp: +-- +2.24.1 + diff --git a/SOURCES/0022-v2v-o-rhv-upload-check-whether-the-cluster-exists.patch b/SOURCES/0022-v2v-o-rhv-upload-check-whether-the-cluster-exists.patch new file mode 100644 index 0000000..41f9370 --- /dev/null +++ b/SOURCES/0022-v2v-o-rhv-upload-check-whether-the-cluster-exists.patch @@ -0,0 +1,61 @@ +From b37ca67f769749b7b3b5d51e171b7cccfa3b5fd2 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Mon, 15 Apr 2019 17:24:42 +0200 +Subject: [PATCH] v2v: -o rhv-upload: check whether the cluster exists + +In the precheck script, check that the target cluster actually exists. +This will avoid errors when creating the VM after the data copying. + +(cherry picked from commit 05e559549dab75f17e147f4a4eafbac868a7aa5d) +--- + v2v/rhv-upload-precheck.py | 10 ++++++++++ + v2v/test-v2v-o-rhv-upload-module/ovirtsdk4/__init__.py | 7 +++++++ + 2 files changed, 17 insertions(+) + +diff --git a/v2v/rhv-upload-precheck.py b/v2v/rhv-upload-precheck.py +index 2798a29dd..b79f91b4a 100644 +--- a/v2v/rhv-upload-precheck.py ++++ b/v2v/rhv-upload-precheck.py +@@ -70,4 +70,14 @@ if len(vms) > 0: + raise RuntimeError("VM already exists with name ‘%s’, id ‘%s’" % + (params['output_name'], vm.id)) + ++# Check whether the specified cluster exists. ++clusters_service = system_service.clusters_service() ++clusters = clusters_service.list( ++ search='name=%s' % params['rhv_cluster'], ++ case_sensitive=True, ++) ++if len(clusters) == 0: ++ raise RuntimeError("The cluster ‘%s’ does not exist" % ++ (params['rhv_cluster'])) ++ + # Otherwise everything is OK, exit with no error. +diff --git a/v2v/test-v2v-o-rhv-upload-module/ovirtsdk4/__init__.py b/v2v/test-v2v-o-rhv-upload-module/ovirtsdk4/__init__.py +index 8d1058d67..cc4224ccd 100644 +--- a/v2v/test-v2v-o-rhv-upload-module/ovirtsdk4/__init__.py ++++ b/v2v/test-v2v-o-rhv-upload-module/ovirtsdk4/__init__.py +@@ -39,6 +39,9 @@ class Connection(object): + return SystemService() + + class SystemService(object): ++ def clusters_service(self): ++ return ClustersService() ++ + def data_centers_service(self): + return DataCentersService() + +@@ -54,6 +57,10 @@ class SystemService(object): + def vms_service(self): + return VmsService() + ++class ClustersService(object): ++ def list(self, search=None, case_sensitive=False): ++ return ["Default"] ++ + class DataCentersService(object): + def list(self, search=None, case_sensitive=False): + return [] +-- +2.24.1 + diff --git a/SOURCES/0023-v2v-o-rhv-upload-split-vmcheck-out-of-precheck.patch b/SOURCES/0023-v2v-o-rhv-upload-split-vmcheck-out-of-precheck.patch new file mode 100644 index 0000000..c231942 --- /dev/null +++ b/SOURCES/0023-v2v-o-rhv-upload-split-vmcheck-out-of-precheck.patch @@ -0,0 +1,264 @@ +From ae560843517da393492418bb61c3dee43e64af2c Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Thu, 12 Sep 2019 13:19:48 +0200 +Subject: [PATCH] v2v: -o rhv-upload: split vmcheck out of precheck + +Split the VM existance check out of the precheck script to a new vmcheck +script, and invoke that in #prepare_targets. Invoke the precheck script +in #precheck, as now it can be run with only values of command line +options. + +This does not change which checks are performed; however, an invalid +cluster name will make virt-v2v fail way earlier (even before connecting +to the source). + +(cherry picked from commit 6499fdc199790619745eee28fcae3421c32c4735) +--- + v2v/Makefile.am | 8 ++- + v2v/output_rhv_upload.ml | 14 +++-- + v2v/output_rhv_upload_precheck_source.mli | 2 +- + v2v/output_rhv_upload_vmcheck_source.mli | 19 ++++++ + v2v/rhv-upload-precheck.py | 12 +--- + v2v/rhv-upload-vmcheck.py | 73 +++++++++++++++++++++++ + 6 files changed, 111 insertions(+), 17 deletions(-) + create mode 100644 v2v/output_rhv_upload_vmcheck_source.mli + create mode 100644 v2v/rhv-upload-vmcheck.py + +diff --git a/v2v/Makefile.am b/v2v/Makefile.am +index 53c137fc6..30f040d3e 100644 +--- a/v2v/Makefile.am ++++ b/v2v/Makefile.am +@@ -26,7 +26,8 @@ BUILT_SOURCES = \ + config.ml \ + output_rhv_upload_createvm_source.ml \ + output_rhv_upload_plugin_source.ml \ +- output_rhv_upload_precheck_source.ml ++ output_rhv_upload_precheck_source.ml \ ++ output_rhv_upload_vmcheck_source.ml + + EXTRA_DIST = \ + $(SOURCES_MLI) $(SOURCES_ML) $(SOURCES_C) \ +@@ -36,6 +37,7 @@ EXTRA_DIST = \ + rhv-upload-createvm.py \ + rhv-upload-plugin.py \ + rhv-upload-precheck.py \ ++ rhv-upload-vmcheck.py \ + v2v_unit_tests.ml \ + virt-v2v.pod \ + virt-v2v-copy-to-local.pod \ +@@ -87,6 +89,7 @@ SOURCES_MLI = \ + output_rhv_upload_createvm_source.mli \ + output_rhv_upload_plugin_source.mli \ + output_rhv_upload_precheck_source.mli \ ++ output_rhv_upload_vmcheck_source.mli \ + output_vdsm.mli \ + parse_ova.mli \ + parse_ovf_from_ova.mli \ +@@ -152,6 +155,7 @@ SOURCES_ML = \ + output_rhv_upload_createvm_source.ml \ + output_rhv_upload_plugin_source.ml \ + output_rhv_upload_precheck_source.ml \ ++ output_rhv_upload_vmcheck_source.ml \ + output_rhv_upload.ml \ + output_vdsm.ml \ + output_openstack.ml \ +@@ -173,6 +177,8 @@ output_rhv_upload_plugin_source.ml: $(srcdir)/rhv-upload-plugin.py + $(srcdir)/embed.sh code $^ $@ + output_rhv_upload_precheck_source.ml: $(srcdir)/rhv-upload-precheck.py + $(srcdir)/embed.sh code $^ $@ ++output_rhv_upload_vmcheck_source.ml: $(srcdir)/rhv-upload-vmcheck.py ++ $(srcdir)/embed.sh code $^ $@ + + if HAVE_OCAML + +diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml +index c2a5c72c7..adcbdf25f 100644 +--- a/v2v/output_rhv_upload.ml ++++ b/v2v/output_rhv_upload.ml +@@ -94,10 +94,13 @@ class output_rhv_upload output_alloc output_conn + + let diskid_file_of_id id = tmpdir // sprintf "diskid.%d" id in + +- (* Create Python scripts for precheck, plugin and create VM. *) ++ (* Create Python scripts for precheck, vmcheck, plugin and create VM. *) + let precheck_script = + Python_script.create ~name:"rhv-upload-precheck.py" + Output_rhv_upload_precheck_source.code in ++ let vmcheck_script = ++ Python_script.create ~name:"rhv-upload-vmcheck.py" ++ Output_rhv_upload_vmcheck_source.code in + let plugin_script = + Python_script.create ~name:"rhv-upload-plugin.py" + Output_rhv_upload_plugin_source.code in +@@ -230,6 +233,9 @@ object + error_unless_nbdkit_working (); + error_unless_nbdkit_python_plugin_working (); + error_unless_output_alloc_sparse (); ++ (* Python code prechecks. *) ++ if Python_script.run_command precheck_script json_params [] <> 0 then ++ error (f_"failed server prechecks, see earlier errors"); + if have_selinux then + error_unless_nbdkit_compiled_with_selinux () + +@@ -251,11 +257,11 @@ object + let json_params = + ("output_name", JSON.String output_name) :: json_params in + +- (* Python code prechecks. These can't run in #precheck because ++ (* Check that the VM does not exist. This can't run in #precheck because + * we need to know the name of the virtual machine. + *) +- if Python_script.run_command precheck_script json_params [] <> 0 then +- error (f_"failed server prechecks, see earlier errors"); ++ if Python_script.run_command vmcheck_script json_params [] <> 0 then ++ error (f_"failed vmchecks, see earlier errors"); + + (* Create an nbdkit instance for each disk and set the + * target URI to point to the NBD socket. +diff --git a/v2v/output_rhv_upload_precheck_source.mli b/v2v/output_rhv_upload_precheck_source.mli +index c1bafa15b..aa33bc548 100644 +--- a/v2v/output_rhv_upload_precheck_source.mli ++++ b/v2v/output_rhv_upload_precheck_source.mli +@@ -1,5 +1,5 @@ + (* virt-v2v +- * Copyright (C) 2018 Red Hat Inc. ++ * Copyright (C) 2019 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 +diff --git a/v2v/output_rhv_upload_vmcheck_source.mli b/v2v/output_rhv_upload_vmcheck_source.mli +new file mode 100644 +index 000000000..c1bafa15b +--- /dev/null ++++ b/v2v/output_rhv_upload_vmcheck_source.mli +@@ -0,0 +1,19 @@ ++(* virt-v2v ++ * Copyright (C) 2018 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. ++ *) ++ ++val code : string +diff --git a/v2v/rhv-upload-precheck.py b/v2v/rhv-upload-precheck.py +index b79f91b4a..d6a58f0fc 100644 +--- a/v2v/rhv-upload-precheck.py ++++ b/v2v/rhv-upload-precheck.py +@@ -1,6 +1,6 @@ + # -*- python -*- + # oVirt or RHV pre-upload checks used by ‘virt-v2v -o rhv-upload’ +-# Copyright (C) 2018 Red Hat Inc. ++# Copyright (C) 2018-2019 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 +@@ -60,16 +60,6 @@ connection = sdk.Connection( + + system_service = connection.system_service() + +-# Find if a virtual machine already exists with that name. +-vms_service = system_service.vms_service() +-vms = vms_service.list( +- search = ("name=%s" % params['output_name']), +-) +-if len(vms) > 0: +- vm = vms[0] +- raise RuntimeError("VM already exists with name ‘%s’, id ‘%s’" % +- (params['output_name'], vm.id)) +- + # Check whether the specified cluster exists. + clusters_service = system_service.clusters_service() + clusters = clusters_service.list( +diff --git a/v2v/rhv-upload-vmcheck.py b/v2v/rhv-upload-vmcheck.py +new file mode 100644 +index 000000000..fbb884b94 +--- /dev/null ++++ b/v2v/rhv-upload-vmcheck.py +@@ -0,0 +1,73 @@ ++# -*- python -*- ++# oVirt or RHV VM existance check used by ‘virt-v2v -o rhv-upload’ ++# Copyright (C) 2018-2019 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. ++ ++import json ++import logging ++import sys ++import time ++ ++from http.client import HTTPSConnection ++from urllib.parse import urlparse ++ ++import ovirtsdk4 as sdk ++import ovirtsdk4.types as types ++ ++# Parameters are passed in via a JSON doc from the OCaml code. ++# Because this Python code ships embedded inside virt-v2v there ++# is no formal API here. ++params = None ++ ++if len(sys.argv) != 2: ++ raise RuntimeError("incorrect number of parameters") ++ ++# Parameters are passed in via a JSON document. ++with open(sys.argv[1], 'r') as fp: ++ params = json.load(fp) ++ ++# What is passed in is a password file, read the actual password. ++with open(params['output_password'], 'r') as fp: ++ output_password = fp.read() ++output_password = output_password.rstrip() ++ ++# Parse out the username from the output_conn URL. ++parsed = urlparse(params['output_conn']) ++username = parsed.username or "admin@internal" ++ ++# Connect to the server. ++connection = sdk.Connection( ++ url = params['output_conn'], ++ username = username, ++ password = output_password, ++ ca_file = params['rhv_cafile'], ++ log = logging.getLogger(), ++ insecure = params['insecure'], ++) ++ ++system_service = connection.system_service() ++ ++# Find if a virtual machine already exists with that name. ++vms_service = system_service.vms_service() ++vms = vms_service.list( ++ search = ("name=%s" % params['output_name']), ++) ++if len(vms) > 0: ++ vm = vms[0] ++ raise RuntimeError("VM already exists with name ‘%s’, id ‘%s’" % ++ (params['output_name'], vm.id)) ++ ++# Otherwise everything is OK, exit with no error. +-- +2.24.1 + diff --git a/SOURCES/0024-v2v-o-rhv-upload-change-precheck-script-to-return-a-.patch b/SOURCES/0024-v2v-o-rhv-upload-change-precheck-script-to-return-a-.patch new file mode 100644 index 0000000..c86a6cd --- /dev/null +++ b/SOURCES/0024-v2v-o-rhv-upload-change-precheck-script-to-return-a-.patch @@ -0,0 +1,53 @@ +From f0f00c5f0ea1a726dd2c8501bcc269211f30e2a8 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Thu, 12 Sep 2019 14:17:36 +0200 +Subject: [PATCH] v2v: -o rhv-upload: change precheck script to return a JSON + +This way it is possible to communicate data from the precheck script +back to virt-v2v. + +For now there are no results, so the resulting JSON is discarded. + +(cherry picked from commit cc6e2a7f9ea53258c2edb758e3ec9beb7baa1fc6) +--- + v2v/output_rhv_upload.ml | 8 +++++++- + v2v/rhv-upload-precheck.py | 6 +++++- + 2 files changed, 12 insertions(+), 2 deletions(-) + +diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml +index adcbdf25f..fd6f2e3e6 100644 +--- a/v2v/output_rhv_upload.ml ++++ b/v2v/output_rhv_upload.ml +@@ -234,8 +234,14 @@ object + error_unless_nbdkit_python_plugin_working (); + error_unless_output_alloc_sparse (); + (* Python code prechecks. *) +- if Python_script.run_command precheck_script json_params [] <> 0 then ++ let precheck_fn = tmpdir // "v2vprecheck.json" in ++ let fd = Unix.openfile precheck_fn [O_WRONLY; O_CREAT] 0o600 in ++ if Python_script.run_command ~stdout_fd:fd ++ precheck_script json_params [] <> 0 then + error (f_"failed server prechecks, see earlier errors"); ++ let json = JSON_parser.json_parser_tree_parse_file precheck_fn in ++ debug "precheck output parsed as: %s" ++ (JSON.string_of_doc ~fmt:JSON.Indented ["", json]); + if have_selinux then + error_unless_nbdkit_compiled_with_selinux () + +diff --git a/v2v/rhv-upload-precheck.py b/v2v/rhv-upload-precheck.py +index d6a58f0fc..de8a66c05 100644 +--- a/v2v/rhv-upload-precheck.py ++++ b/v2v/rhv-upload-precheck.py +@@ -70,4 +70,8 @@ if len(clusters) == 0: + raise RuntimeError("The cluster ‘%s’ does not exist" % + (params['rhv_cluster'])) + +-# Otherwise everything is OK, exit with no error. ++# Otherwise everything is OK, print a JSON with the results. ++results = { ++} ++ ++json.dump(results, sys.stdout) +-- +2.24.1 + diff --git a/SOURCES/0025-v2v-o-rhv-upload-improve-lookup-of-specified-resourc.patch b/SOURCES/0025-v2v-o-rhv-upload-improve-lookup-of-specified-resourc.patch new file mode 100644 index 0000000..75e2a6b --- /dev/null +++ b/SOURCES/0025-v2v-o-rhv-upload-improve-lookup-of-specified-resourc.patch @@ -0,0 +1,169 @@ +From ccd327919ca1fed3e10fdd3567ede0dc8cd5d0c3 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Thu, 12 Sep 2019 15:21:26 +0200 +Subject: [PATCH] v2v: -o rhv-upload: improve lookup of specified resources + (RHBZ#1612653) + +Improve the way the precheck script checks for the specified resources: +- look directly for a data center with the specified storage domain +- get the storage domain object from the storage domains attached to the + data center found +- similarly, look for the specified cluster among the ones attached to + the data center found +When everything is found, return the UUID of the storage domain, and of +the cluster back to virt-v2v, which will store them. + +Similarly, rework the createvm script to directly get the requested +cluster, instead of looking for it once again. Also, since the UUID of +the storage domain is available in virt-v2v already, use it directly +instead of using a placeholder. + +This should fix a number of issues: +- unexisting/unattached storage domains are rejected outright +- the cluster is rejected if not part of the same data center of the + selected storage domain +- renaming the specified storage domain during the data copying will not + cause the conversion to fail (which will still use the specified + storage domain, no matter the new name) + +Based on the hints by Daniel Erez in RHBZ#1612653. + +(cherry picked from commit c49aa4fe01aac82d4776dd2a3524ce16e6deed06) +--- + v2v/output_rhv_upload.ml | 24 +++++++++++++++++++----- + v2v/rhv-upload-createvm.py | 11 ++++------- + v2v/rhv-upload-precheck.py | 30 ++++++++++++++++++++++++------ + 3 files changed, 47 insertions(+), 18 deletions(-) + +diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml +index fd6f2e3e6..19bdfcf05 100644 +--- a/v2v/output_rhv_upload.ml ++++ b/v2v/output_rhv_upload.ml +@@ -227,6 +227,11 @@ See also the virt-v2v-output-rhv(1) manual.") + object + inherit output + ++ (* The storage domain UUID. *) ++ val mutable rhv_storagedomain_uuid = None ++ (* The cluster UUID. *) ++ val mutable rhv_cluster_uuid = None ++ + method precheck () = + Python_script.error_unless_python_interpreter_found (); + error_unless_ovirtsdk4_module_available (); +@@ -242,6 +247,10 @@ object + let json = JSON_parser.json_parser_tree_parse_file precheck_fn in + debug "precheck output parsed as: %s" + (JSON.string_of_doc ~fmt:JSON.Indented ["", json]); ++ rhv_storagedomain_uuid <- ++ Some (JSON_parser.object_get_string "rhv_storagedomain_uuid" json); ++ rhv_cluster_uuid <- ++ Some (JSON_parser.object_get_string "rhv_cluster_uuid" json); + if have_selinux then + error_unless_nbdkit_compiled_with_selinux () + +@@ -388,11 +397,11 @@ If the messages above are not sufficient to diagnose the problem then add the + diskid + ) targets in + +- (* We don't have the storage domain UUID, but instead we write +- * in a magic value which the Python code (which can get it) +- * will substitute. +- *) +- let sd_uuid = "@SD_UUID@" in ++ (* The storage domain UUID. *) ++ let sd_uuid = ++ match rhv_storagedomain_uuid with ++ | None -> assert false ++ | Some uuid -> uuid in + + (* The volume and VM UUIDs are made up. *) + let vol_uuids = List.map (fun _ -> uuidgen ()) targets +@@ -406,6 +415,11 @@ If the messages above are not sufficient to diagnose the problem then add the + OVirt in + let ovf = DOM.doc_to_string ovf in + ++ let json_params = ++ match rhv_cluster_uuid with ++ | None -> assert false ++ | Some uuid -> ("rhv_cluster_uuid", JSON.String uuid) :: json_params in ++ + let ovf_file = tmpdir // "vm.ovf" in + with_open_out ovf_file (fun chan -> output_string chan ovf); + if Python_script.run_command createvm_script json_params [ovf_file] <> 0 +diff --git a/v2v/rhv-upload-createvm.py b/v2v/rhv-upload-createvm.py +index 1d0e8c95d..ed57a9b20 100644 +--- a/v2v/rhv-upload-createvm.py ++++ b/v2v/rhv-upload-createvm.py +@@ -65,17 +65,14 @@ connection = sdk.Connection( + + system_service = connection.system_service() + +-# Get the storage domain UUID and substitute it into the OVF doc. +-sds_service = system_service.storage_domains_service() +-sd = sds_service.list(search=("name=%s" % params['output_storage']))[0] +-sd_uuid = sd.id +- +-ovf = ovf.replace("@SD_UUID@", sd_uuid) ++# Get the cluster. ++cluster = system_service.clusters_service().cluster_service(params['rhv_cluster_uuid']) ++cluster = cluster.get() + + vms_service = system_service.vms_service() + vm = vms_service.add( + types.Vm( +- cluster=types.Cluster(name = params['rhv_cluster']), ++ cluster=cluster, + initialization=types.Initialization( + configuration = types.Configuration( + type = types.ConfigurationType.OVA, +diff --git a/v2v/rhv-upload-precheck.py b/v2v/rhv-upload-precheck.py +index de8a66c05..725a8dc9e 100644 +--- a/v2v/rhv-upload-precheck.py ++++ b/v2v/rhv-upload-precheck.py +@@ -60,18 +60,36 @@ connection = sdk.Connection( + + system_service = connection.system_service() + +-# Check whether the specified cluster exists. +-clusters_service = system_service.clusters_service() +-clusters = clusters_service.list( +- search='name=%s' % params['rhv_cluster'], ++# Check whether there is a datacenter for the specified storage. ++data_centers = system_service.data_centers_service().list( ++ search='storage.name=%s' % params['output_storage'], + case_sensitive=True, + ) ++if len(data_centers) == 0: ++ # The storage domain is not attached to a datacenter ++ # (shouldn't happen, would fail on disk creation). ++ raise RuntimeError("The storage domain ‘%s’ is not attached to a DC" % ++ (params['output_storage'])) ++datacenter = data_centers[0] ++ ++# Get the storage domain. ++storage_domains = connection.follow_link(datacenter.storage_domains) ++storage_domain = [sd for sd in storage_domains if sd.name == params['output_storage']][0] ++ ++# Get the cluster. ++clusters = connection.follow_link(datacenter.clusters) ++clusters = [cluster for cluster in clusters if cluster.name == params['rhv_cluster']] + if len(clusters) == 0: +- raise RuntimeError("The cluster ‘%s’ does not exist" % +- (params['rhv_cluster'])) ++ raise RuntimeError("The cluster ‘%s’ is not part of the DC ‘%s’, " ++ "where the storage domain ‘%s’ is" % ++ (params['rhv_cluster'], datacenter.name, ++ params['output_storage'])) ++cluster = clusters[0] + + # Otherwise everything is OK, print a JSON with the results. + results = { ++ "rhv_storagedomain_uuid": storage_domain.id, ++ "rhv_cluster_uuid": cluster.id, + } + + json.dump(results, sys.stdout) +-- +2.24.1 + diff --git a/SOURCES/0026-v2v-o-rhv-upload-tell-whether-a-SD-actually-exists.patch b/SOURCES/0026-v2v-o-rhv-upload-tell-whether-a-SD-actually-exists.patch new file mode 100644 index 0000000..e14154f --- /dev/null +++ b/SOURCES/0026-v2v-o-rhv-upload-tell-whether-a-SD-actually-exists.patch @@ -0,0 +1,36 @@ +From 5883b1efc1c54742bed7f56f4b1522061321c8f9 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Fri, 13 Sep 2019 12:40:34 +0200 +Subject: [PATCH] v2v: -o rhv-upload: tell whether a SD actually exists + +If there is no DC with the specified storage domain attached to it, it +can mean that the SD does not exist. + +(cherry picked from commit 2b39c27b7f1e72f3a3bf3a616e4576af691beb88) +--- + v2v/rhv-upload-precheck.py | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/v2v/rhv-upload-precheck.py b/v2v/rhv-upload-precheck.py +index 725a8dc9e..1b344ba27 100644 +--- a/v2v/rhv-upload-precheck.py ++++ b/v2v/rhv-upload-precheck.py +@@ -66,6 +66,15 @@ data_centers = system_service.data_centers_service().list( + case_sensitive=True, + ) + if len(data_centers) == 0: ++ storage_domains = system_service.storage_domains_service().list( ++ search='name=%s' % params['output_storage'], ++ case_sensitive=True, ++ ) ++ if len(storage_domains) == 0: ++ # The storage domain does not even exist. ++ raise RuntimeError("The storage domain ‘%s’ does not exist" % ++ (params['output_storage'])) ++ + # The storage domain is not attached to a datacenter + # (shouldn't happen, would fail on disk creation). + raise RuntimeError("The storage domain ‘%s’ is not attached to a DC" % +-- +2.24.1 + diff --git a/SOURCES/0027-v2v-add-output-disk_copied-hook.patch b/SOURCES/0027-v2v-add-output-disk_copied-hook.patch new file mode 100644 index 0000000..d5a0110 --- /dev/null +++ b/SOURCES/0027-v2v-add-output-disk_copied-hook.patch @@ -0,0 +1,76 @@ +From 7baca2397e3e494fa727e63e9a2d34b81b78c298 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Mon, 16 Sep 2019 14:01:14 +0200 +Subject: [PATCH] v2v: add output#disk_copied hook + +Add a simple method in the Output class to do work right after a disk +was successfully copied. + +(cherry picked from commit 74ee936505acf56d01f9b819588e7902a9401e81) +--- + v2v/types.ml | 1 + + v2v/types.mli | 8 ++++++++ + v2v/v2v.ml | 9 ++++++++- + 3 files changed, 17 insertions(+), 1 deletion(-) + +diff --git a/v2v/types.ml b/v2v/types.ml +index 77f879200..714b30014 100644 +--- a/v2v/types.ml ++++ b/v2v/types.ml +@@ -521,6 +521,7 @@ class virtual output = object + method override_output_format (_ : overlay) = (None : string option) + method virtual prepare_targets : source -> (string * overlay) list -> target_buses -> guestcaps -> inspect -> target_firmware -> target_file list + method disk_create = (open_guestfs ())#disk_create ++ method disk_copied (_ : target) (_ : int) (_ : int) = () + method virtual create_metadata : source -> target list -> target_buses -> guestcaps -> inspect -> target_firmware -> unit + method keep_serial_console = true + method install_rhev_apt = false +diff --git a/v2v/types.mli b/v2v/types.mli +index be9406100..f595ab0ef 100644 +--- a/v2v/types.mli ++++ b/v2v/types.mli +@@ -441,6 +441,10 @@ end + │ by running ‘qemu-img convert’. + │ + ▼ ++ output#disk_copied The output mode is notified about the ++ │ successful copy of each disk. ++ │ ++ ▼ + output#create_metadata VM should be created from the metadata + supplied. Also any finalization can + be done here. +@@ -485,6 +489,10 @@ class virtual output : object + (** Called in order to create disks on the target. The method has the + same signature as Guestfs#disk_create. Normally you should {b not} + define this since the default method calls Guestfs#disk_create. *) ++ method disk_copied : target -> int -> int -> unit ++ (** Called after a disk was successfully copied on the target. ++ The second parameter is the index of the copied disk (starting ++ from 0), and the third is the number of disks in total. *) + method virtual create_metadata : source -> target list -> target_buses -> guestcaps -> inspect -> target_firmware -> unit + (** Called after conversion and copying to create metadata and + do any finalization. *) +diff --git a/v2v/v2v.ml b/v2v/v2v.ml +index 277d8f2c7..63e809030 100644 +--- a/v2v/v2v.ml ++++ b/v2v/v2v.ml +@@ -798,7 +798,14 @@ and copy_targets cmdline targets input output = + pc; + if pc < 0. then eprintf " ! ESTIMATE TOO LOW !"; + eprintf "\n%!"; +- ) ++ ); ++ ++ (* Let the output mode know that the disk was copied successfully, ++ * so it can perform any operations without waiting for all the ++ * other disks to be copied (i.e. before the metadata is actually ++ * created). ++ *) ++ output#disk_copied t i nr_disks + ) targets + + (* Update the target_actual_size field in the target structure. *) +-- +2.24.1 + diff --git a/SOURCES/0028-v2v-o-rhv-upload-collect-disks-UUIDs-right-after-cop.patch b/SOURCES/0028-v2v-o-rhv-upload-collect-disks-UUIDs-right-after-cop.patch new file mode 100644 index 0000000..e3426b5 --- /dev/null +++ b/SOURCES/0028-v2v-o-rhv-upload-collect-disks-UUIDs-right-after-cop.patch @@ -0,0 +1,84 @@ +From 9ae4cc6feaf66cf34b9cdf0cf2c251ed7ef61259 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Mon, 16 Sep 2019 14:07:22 +0200 +Subject: [PATCH] v2v: -o rhv-upload: collect disks UUIDs right after copy + +Instead of waiting for the completion of the nbdkit transfers to get the +UUIDs of the disks, use the new #disk_copied hook to do that after each +disk is copied. + +This has almost no behaviour on rhv-upload, except for the --no-copy +mode: +- previously it used to hit the 5 minute timeout while waiting for the + finalization of the first disk +- now it asserts on the different number of collected UUIDs vs the + actual targets; at the moment there is nothing else that can be done, + as this assumption is needed e.g. when creating the OVF file + +(cherry picked from commit 7b93ad6a32f09043bf870202b59bea83d47e0c3a) +--- + v2v/output_rhv_upload.ml | 32 ++++++++++++++++---------------- + 1 file changed, 16 insertions(+), 16 deletions(-) + +diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml +index 19bdfcf05..382ad0d93 100644 +--- a/v2v/output_rhv_upload.ml ++++ b/v2v/output_rhv_upload.ml +@@ -231,6 +231,8 @@ object + val mutable rhv_storagedomain_uuid = None + (* The cluster UUID. *) + val mutable rhv_cluster_uuid = None ++ (* List of disk UUIDs. *) ++ val mutable disks_uuids = [] + + method precheck () = + Python_script.error_unless_python_interpreter_found (); +@@ -379,23 +381,21 @@ If the messages above are not sufficient to diagnose the problem then add the + TargetURI ("json:" ^ JSON.string_of_doc json_params) + ) overlays + +- method create_metadata source targets _ guestcaps inspect target_firmware = +- (* Get the UUIDs of each disk image. These files are written +- * out by the nbdkit plugins on successful finalization of the ++ method disk_copied t i nr_disks = ++ (* Get the UUID of the disk image. This file is written ++ * out by the nbdkit plugin on successful finalization of the + * transfer. + *) +- let nr_disks = List.length targets in +- let image_uuids = +- List.mapi ( +- fun i t -> +- let id = t.target_overlay.ov_source.s_disk_id in +- let diskid_file = diskid_file_of_id id in +- if not (wait_for_file diskid_file finalization_timeout) then +- error (f_"transfer of disk %d/%d failed, see earlier error messages") +- (i+1) nr_disks; +- let diskid = read_whole_file diskid_file in +- diskid +- ) targets in ++ let id = t.target_overlay.ov_source.s_disk_id in ++ let diskid_file = diskid_file_of_id id in ++ if not (wait_for_file diskid_file finalization_timeout) then ++ error (f_"transfer of disk %d/%d failed, see earlier error messages") ++ (i+1) nr_disks; ++ let diskid = read_whole_file diskid_file in ++ disks_uuids <- disks_uuids @ [diskid]; ++ ++ method create_metadata source targets _ guestcaps inspect target_firmware = ++ assert (List.length disks_uuids = List.length targets); + + (* The storage domain UUID. *) + let sd_uuid = +@@ -411,7 +411,7 @@ If the messages above are not sufficient to diagnose the problem then add the + let ovf = + Create_ovf.create_ovf source targets guestcaps inspect + target_firmware output_alloc +- sd_uuid image_uuids vol_uuids vm_uuid ++ sd_uuid disks_uuids vol_uuids vm_uuid + OVirt in + let ovf = DOM.doc_to_string ovf in + +-- +2.24.1 + diff --git a/SOURCES/0029-v2v-o-rhv-upload-add-oo-rhv-disk-uuid-option.patch b/SOURCES/0029-v2v-o-rhv-upload-add-oo-rhv-disk-uuid-option.patch new file mode 100644 index 0000000..350a44e --- /dev/null +++ b/SOURCES/0029-v2v-o-rhv-upload-add-oo-rhv-disk-uuid-option.patch @@ -0,0 +1,201 @@ +From 9d7503382f33a7721378ec586ea718c63a0ec3b6 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Thu, 19 Sep 2019 12:19:09 +0200 +Subject: [PATCH] v2v: -o rhv-upload: add -oo rhv-disk-uuid option + +This way it is possible to override the UUIDs of the uploaded disks, +instead of letting RHV generate them. + +This can be useful to force certain UUIDs, and to specify the disks in +--no-copy mode (which now can be used). + +(cherry picked from commit 537ba8357e44ca3aa8878a2ac98e9476a570d3f4) +--- + v2v/output_rhv_upload.ml | 43 ++++++++++++++++++++++++++++++++----- + v2v/rhv-upload-plugin.py | 2 ++ + v2v/virt-v2v-output-rhv.pod | 24 +++++++++++++++++++++ + 3 files changed, 64 insertions(+), 5 deletions(-) + +diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml +index 382ad0d93..206657a2b 100644 +--- a/v2v/output_rhv_upload.ml ++++ b/v2v/output_rhv_upload.ml +@@ -32,6 +32,7 @@ type rhv_options = { + rhv_cluster : string option; + rhv_direct : bool; + rhv_verifypeer : bool; ++ rhv_disk_uuids : string list option; + } + + let print_output_options () = +@@ -41,6 +42,11 @@ let print_output_options () = + -oo rhv-cluster=CLUSTERNAME Set RHV cluster name. + -oo rhv-direct[=true|false] Use direct transfer mode (default: false). + -oo rhv-verifypeer[=true|false] Verify server identity (default: false). ++ ++You can override the UUIDs of the disks, instead of using autogenerated UUIDs ++after their uploads (if you do, you must supply one for each disk): ++ ++ -oo rhv-disk-uuid=UUID Disk UUID + ") + + let parse_output_options options = +@@ -48,6 +54,7 @@ let parse_output_options options = + let rhv_cluster = ref None in + let rhv_direct = ref false in + let rhv_verifypeer = ref false in ++ let rhv_disk_uuids = ref None in + + List.iter ( + function +@@ -63,6 +70,8 @@ let parse_output_options options = + | "rhv-direct", v -> rhv_direct := bool_of_string v + | "rhv-verifypeer", "" -> rhv_verifypeer := true + | "rhv-verifypeer", v -> rhv_verifypeer := bool_of_string v ++ | "rhv-disk-uuid", v -> ++ rhv_disk_uuids := Some (v :: (Option.default [] !rhv_disk_uuids)) + | k, _ -> + error (f_"-o rhv-upload: unknown output option ‘-oo %s’") k + ) options; +@@ -75,8 +84,9 @@ let parse_output_options options = + let rhv_cluster = !rhv_cluster in + let rhv_direct = !rhv_direct in + let rhv_verifypeer = !rhv_verifypeer in ++ let rhv_disk_uuids = Option.map List.rev !rhv_disk_uuids in + +- { rhv_cafile; rhv_cluster; rhv_direct; rhv_verifypeer } ++ { rhv_cafile; rhv_cluster; rhv_direct; rhv_verifypeer; rhv_disk_uuids } + + let nbdkit_python_plugin = Config.virt_v2v_nbdkit_python_plugin + let pidfile_timeout = 30 +@@ -270,6 +280,16 @@ object + method install_rhev_apt = true + + method prepare_targets source overlays _ _ _ _ = ++ let uuids = ++ match rhv_options.rhv_disk_uuids with ++ | None -> ++ List.map (fun _ -> None) overlays ++ | Some uuids -> ++ if List.length uuids <> List.length overlays then ++ error (f_"the number of ‘-oo rhv-disk-uuid’ parameters passed on the command line has to match the number of guest disk images (for this guest: %d)") ++ (List.length overlays); ++ List.map (fun uuid -> Some uuid) uuids in ++ + let output_name = source.s_name in + let json_params = + ("output_name", JSON.String output_name) :: json_params in +@@ -284,7 +304,7 @@ object + * target URI to point to the NBD socket. + *) + List.map ( +- fun (target_format, ov) -> ++ fun ((target_format, ov), uuid) -> + let id = ov.ov_source.s_disk_id in + let disk_name = sprintf "%s-%03d" output_name id in + let json_params = +@@ -310,6 +330,12 @@ object + let json_params = + ("diskid_file", JSON.String diskid_file) :: json_params in + ++ let json_params = ++ match uuid with ++ | None -> json_params ++ | Some uuid -> ++ ("rhv_disk_uuid", JSON.String uuid) :: json_params in ++ + (* Write the JSON parameters to a file. *) + let json_param_file = tmpdir // sprintf "params%d.json" id in + with_open_out +@@ -379,7 +405,7 @@ If the messages above are not sufficient to diagnose the problem then add the + "file.export", JSON.String "/"; + ] in + TargetURI ("json:" ^ JSON.string_of_doc json_params) +- ) overlays ++ ) (List.combine overlays uuids) + + method disk_copied t i nr_disks = + (* Get the UUID of the disk image. This file is written +@@ -395,7 +421,14 @@ If the messages above are not sufficient to diagnose the problem then add the + disks_uuids <- disks_uuids @ [diskid]; + + method create_metadata source targets _ guestcaps inspect target_firmware = +- assert (List.length disks_uuids = List.length targets); ++ let image_uuids = ++ match rhv_options.rhv_disk_uuids, disks_uuids with ++ | None, [] -> ++ error (f_"there must be ‘-oo rhv-disk-uuid’ parameters passed on the command line to specify the UUIDs of guest disk images (for this guest: %d)") ++ (List.length targets) ++ | Some uuids, _ -> uuids ++ | None, uuids -> uuids in ++ assert (List.length image_uuids = List.length targets); + + (* The storage domain UUID. *) + let sd_uuid = +@@ -411,7 +444,7 @@ If the messages above are not sufficient to diagnose the problem then add the + let ovf = + Create_ovf.create_ovf source targets guestcaps inspect + target_firmware output_alloc +- sd_uuid disks_uuids vol_uuids vm_uuid ++ sd_uuid image_uuids vol_uuids vm_uuid + OVirt in + let ovf = DOM.doc_to_string ovf in + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index 4d61a089b..6ec74a5d4 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -135,6 +135,8 @@ def open(readonly): + disk_format = types.DiskFormat.COW + disk = disks_service.add( + disk = types.Disk( ++ # The ID is optional. ++ id = params.get('rhv_disk_uuid'), + name = params['disk_name'], + description = "Uploaded by virt-v2v", + format = disk_format, +diff --git a/v2v/virt-v2v-output-rhv.pod b/v2v/virt-v2v-output-rhv.pod +index 651f61dae..e840ca78d 100644 +--- a/v2v/virt-v2v-output-rhv.pod ++++ b/v2v/virt-v2v-output-rhv.pod +@@ -9,6 +9,7 @@ virt-v2v-output-rhv - Using virt-v2v to convert guests to oVirt or RHV + [-oo rhv-cafile=FILE] + [-oo rhv-cluster=CLUSTER] + [-oo rhv-direct] ++ [-oo rhv-disk-uuid=UUID ...] + [-oo rhv-verifypeer] + + virt-v2v [-i* options] -o rhv -os [esd:/path|/path] +@@ -104,6 +105,29 @@ F on the oVirt engine. + + Set the RHV Cluster Name. If not given it uses C. + ++=item I<-oo rhv-disk-uuid=>C ++ ++This option can used to manually specify UUIDs for the disks when ++creating the virtual machine. If not specified, the oVirt engine will ++generate random UUIDs for the disks. Please note that: ++ ++=over 4 ++ ++=item * ++ ++you B pass as many I<-oo rhv-disk-uuid=UUID> options as the ++amount of disks in the guest ++ ++=item * ++ ++the specified UUIDs are used as they are, without checking whether ++they are already used by other disks ++ ++=back ++ ++This option is considered advanced, and to be used mostly in ++combination with I<--no-copy>. ++ + =item I<-oo rhv-direct> + + If this option is given then virt-v2v will attempt to directly upload +-- +2.24.1 + diff --git a/SOURCES/0030-v2v-o-rhv-upload-make-oo-rhv-cafile-optional.patch b/SOURCES/0030-v2v-o-rhv-upload-make-oo-rhv-cafile-optional.patch new file mode 100644 index 0000000..6f6de40 --- /dev/null +++ b/SOURCES/0030-v2v-o-rhv-upload-make-oo-rhv-cafile-optional.patch @@ -0,0 +1,87 @@ +From 5ad1e7c160f5fe0d499d8d25116cb0e1692f1e93 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Fri, 27 Sep 2019 13:56:42 +0200 +Subject: [PATCH] v2v: -o rhv-upload: make -oo rhv-cafile optional + +It makes little sense to require the oVirt certificate, especially when +the verification of the connection (-oo rhv-verifypeer) is disabled by +default. The only work done with the certificate in that case is +checking that it is a valid certificate file. + +Hence, make -oo rhv-cafile optional, requiring it only when +-oo rhv-verifypeer is enabled. + +(cherry picked from commit 0a5eaad7db3c9b9a03fa88102a9e6142c855bfd1) +--- + v2v/output_rhv_upload.ml | 16 +++++++++------- + v2v/virt-v2v-output-rhv.pod | 2 ++ + 2 files changed, 11 insertions(+), 7 deletions(-) + +diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml +index 206657a2b..2c8c18732 100644 +--- a/v2v/output_rhv_upload.ml ++++ b/v2v/output_rhv_upload.ml +@@ -28,7 +28,7 @@ open Types + open Utils + + type rhv_options = { +- rhv_cafile : string; ++ rhv_cafile : string option; + rhv_cluster : string option; + rhv_direct : bool; + rhv_verifypeer : bool; +@@ -76,15 +76,13 @@ let parse_output_options options = + error (f_"-o rhv-upload: unknown output option ‘-oo %s’") k + ) options; + +- let rhv_cafile = +- match !rhv_cafile with +- | Some s -> s +- | None -> +- error (f_"-o rhv-upload: must use ‘-oo rhv-cafile’ to supply the path to the oVirt or RHV user’s ‘ca.pem’ file") in ++ let rhv_cafile = !rhv_cafile in + let rhv_cluster = !rhv_cluster in + let rhv_direct = !rhv_direct in + let rhv_verifypeer = !rhv_verifypeer in + let rhv_disk_uuids = Option.map List.rev !rhv_disk_uuids in ++ if rhv_verifypeer && rhv_cafile = None then ++ error (f_"-o rhv-upload: must use ‘-oo rhv-cafile’ to supply the path to the oVirt or RHV user’s ‘ca.pem’ file"); + + { rhv_cafile; rhv_cluster; rhv_direct; rhv_verifypeer; rhv_disk_uuids } + +@@ -92,6 +90,10 @@ let nbdkit_python_plugin = Config.virt_v2v_nbdkit_python_plugin + let pidfile_timeout = 30 + let finalization_timeout = 5*60 + ++let json_optstring = function ++ | Some s -> JSON.String s ++ | None -> JSON.Null ++ + class output_rhv_upload output_alloc output_conn + output_password output_storage + rhv_options = +@@ -200,7 +202,7 @@ See also the virt-v2v-output-rhv(1) manual.") + "output_sparse", JSON.Bool (match output_alloc with + | Sparse -> true + | Preallocated -> false); +- "rhv_cafile", JSON.String rhv_options.rhv_cafile; ++ "rhv_cafile", json_optstring rhv_options.rhv_cafile; + "rhv_cluster", + JSON.String (Option.default "Default" rhv_options.rhv_cluster); + "rhv_direct", JSON.Bool rhv_options.rhv_direct; +diff --git a/v2v/virt-v2v-output-rhv.pod b/v2v/virt-v2v-output-rhv.pod +index e840ca78d..04a894268 100644 +--- a/v2v/virt-v2v-output-rhv.pod ++++ b/v2v/virt-v2v-output-rhv.pod +@@ -101,6 +101,8 @@ The storage domain. + The F file (Certificate Authority), copied from + F on the oVirt engine. + ++This option must be specified if I<-oo rhv-verifypeer> is enabled. ++ + =item I<-oo rhv-cluster=>C + + Set the RHV Cluster Name. If not given it uses C. +-- +2.24.1 + diff --git a/SOURCES/0031-v2v-Fix-default-graphics-driver-for-SUSE-guests.patch b/SOURCES/0031-v2v-Fix-default-graphics-driver-for-SUSE-guests.patch new file mode 100644 index 0000000..b59226b --- /dev/null +++ b/SOURCES/0031-v2v-Fix-default-graphics-driver-for-SUSE-guests.patch @@ -0,0 +1,40 @@ +From 1b409cee748cfb60cc87f8bfa80370048d8dd014 Mon Sep 17 00:00:00 2001 +From: Mike Latimer +Date: Mon, 25 Mar 2019 14:38:00 +0000 +Subject: [PATCH] v2v: Fix default graphics driver for SUSE guests. + +See discussion in this upstream thread: +https://www.redhat.com/archives/libguestfs/2019-February/thread.html#00047 + +Thanks: Mike Latimer, Pino Toscano. +(cherry picked from commit 612f170e6062f2ff74643b6096b7e0765b52cfbd) +--- + v2v/convert_linux.ml | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +diff --git a/v2v/convert_linux.ml b/v2v/convert_linux.ml +index b4b2f24c4..f9e811c8d 100644 +--- a/v2v/convert_linux.ml ++++ b/v2v/convert_linux.ml +@@ -104,7 +104,7 @@ let convert (g : G.guestfs) inspect source output rcaps = + + let video = + match rcaps.rcaps_video with +- | None -> get_display_driver () ++ | None -> QXL + | Some video -> video in + + let block_type = +@@ -783,9 +783,6 @@ let convert (g : G.guestfs) inspect source output rcaps = + else + true + +- and get_display_driver () = +- if family = `SUSE_family then Cirrus else QXL +- + and configure_display_driver video = + let video_driver = match video with QXL -> "qxl" | Cirrus -> "cirrus" in + +-- +2.24.1 + diff --git a/SOURCES/0032-v2v-windows-Add-a-helper-function-for-installing-Pow.patch b/SOURCES/0032-v2v-windows-Add-a-helper-function-for-installing-Pow.patch new file mode 100644 index 0000000..2de879a --- /dev/null +++ b/SOURCES/0032-v2v-windows-Add-a-helper-function-for-installing-Pow.patch @@ -0,0 +1,73 @@ +From bb09f8b1ab0fc3bda654e7d564d5010f9f24f660 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 4 Dec 2018 16:09:42 +0000 +Subject: [PATCH] v2v: windows: Add a helper function for installing Powershell + firstboot scripts. + +(cherry picked from commit e1e9b3845e76a4bb406d16b96283ac38677cd91f) +--- + v2v/Makefile.am | 1 + + v2v/windows.ml | 23 +++++++++++++++++++++++ + v2v/windows.mli | 6 ++++++ + 3 files changed, 30 insertions(+) + +diff --git a/v2v/Makefile.am b/v2v/Makefile.am +index 30f040d3e..6568c9a6b 100644 +--- a/v2v/Makefile.am ++++ b/v2v/Makefile.am +@@ -667,6 +667,7 @@ check_PROGRAMS += v2v_unit_tests var_expander_tests + endif + + v2v_unit_tests_BOBJECTS = \ ++ $(top_builddir)/customize/firstboot.cmo \ + types.cmo \ + uefi.cmo \ + utils.cmo \ +diff --git a/v2v/windows.ml b/v2v/windows.ml +index 23d589b00..d83f77b7f 100644 +--- a/v2v/windows.ml ++++ b/v2v/windows.ml +@@ -45,3 +45,26 @@ and check_app { Guestfs.app2_name = name; + publisher =~ rex_avg_tech + + and (=~) str rex = PCRE.matches rex str ++ ++(* Unfortunately Powershell scripts cannot be directly executed ++ * (unless some system config changes are made which for other ++ * reasons we don't want to do) and so we have to run this via ++ * a regular batch file. ++ *) ++let install_firstboot_powershell g { Types.i_windows_systemroot; i_root } ++ filename code = ++ let tempdir = sprintf "%s/Temp" i_windows_systemroot in ++ g#mkdir_p tempdir; ++ let code = String.concat "\r\n" code ^ "\r\n" in ++ g#write (sprintf "%s/%s" tempdir filename) code; ++ ++ (* Powershell interpreter. Should we check this exists? XXX *) ++ let ps_exe = ++ i_windows_systemroot ^ ++ "\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" in ++ ++ (* Windows path to the Powershell script. *) ++ let ps_path = i_windows_systemroot ^ "\\Temp\\" ^ filename in ++ ++ let fb = sprintf "%s -ExecutionPolicy ByPass -file %s" ps_exe ps_path in ++ Firstboot.add_firstboot_script g i_root filename fb +diff --git a/v2v/windows.mli b/v2v/windows.mli +index 016ef2a78..6db7874b0 100644 +--- a/v2v/windows.mli ++++ b/v2v/windows.mli +@@ -21,3 +21,9 @@ + val detect_antivirus : Types.inspect -> bool + (** Return [true] if anti-virus (AV) software was detected in + this Windows guest. *) ++ ++val install_firstboot_powershell : Guestfs.guestfs -> Types.inspect -> ++ string -> string list -> unit ++(** [install_powershell_firstboot g inspect filename code] installs a ++ Powershell script (the lines of code) as a firstboot script in ++ the Windows VM. *) +-- +2.24.1 + diff --git a/SOURCES/0033-v2v-Copy-static-IP-address-information-over-for-Wind.patch b/SOURCES/0033-v2v-Copy-static-IP-address-information-over-for-Wind.patch new file mode 100644 index 0000000..71b2720 --- /dev/null +++ b/SOURCES/0033-v2v-Copy-static-IP-address-information-over-for-Wind.patch @@ -0,0 +1,423 @@ +From 70e2215cd1f660dbad5a336bb611ad1b9cf1e60d Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 4 Dec 2018 16:09:42 +0000 +Subject: [PATCH] v2v: Copy static IP address information over for Windows + guests (RHBZ#1626503). + +For Linux the guest itself remembers the IP address associated with +each MAC address. Thus it doesn't matter if the interface type +changes (ie. to virtio-net), because as long as we preserve the MAC +address the guest will use the same IP address or the same DHCP +configuration. + +However on Windows this association is not maintained by MAC address. +In fact the MAC address isn't saved anywhere in the guest registry. +(It seems instead this is likely done through PCI device type and +address which we don't record at the moment and is almost impossible +to preserve.) When a guest which doesn't use DHCP is migrated, the +guest sees the brand new virtio-net devices and doesn't know what to +do with them, and meanwhile the right static IPs are still associated +with the old and now-defunct interfaces in the registry. + +We cannot collect the required information from within the guest. +However we can collect it outside the tool by some other means +(eg. using VMware Tools APIs) and present this information to virt-v2v +which then writes it into the Windows guest at firstboot time. + +This commit adds the --mac ..:ip:.. sub-option which creates a +Powershell script to set network adapters at firstboot. An option +such as: + + --mac 00:0c:29:e6:3d:9d:ip:192.168.0.89,192.168.0.1,24,192.168.0.254 + +approximately turns into this script: + + # Wait for the netkvm (virtio-net) driver to become active. + $adapters = @() + While (-Not $adapters) { + Start-Sleep -Seconds 5 + $adapters = Get-NetAdapter -Physical | + Where DriverFileName -eq "netkvm.sys" + } + $mac_address = '00-0c-29-e6-3d-9d' + $ifindex = (Get-NetAdapter -Physical | + Where MacAddress -eq $mac_address).ifIndex + if ($ifindex) { + New-NetIPAddress -InterfaceIndex $ifindex + -IPAddress '192.168.0.89' + -DefaultGateway '192.168.0.1' + -PrefixLength 24 + Set-DnsClientServerAddress -InterfaceIndex $ifindex + -ServerAddresses ('192.168.0.254') + } + +Thanks: Brett Thurber for diagnosing the problem and suggesting paths +towards a fix. + +(cherry picked from commit dfd9fac7435cf2f9293961b6cc1fe316af4feebc) +--- + v2v/cmdline.ml | 41 ++++++++++++++++++----- + v2v/cmdline.mli | 1 + + v2v/convert_linux.ml | 2 +- + v2v/convert_windows.ml | 76 +++++++++++++++++++++++++++++++++++++++++- + v2v/modules_list.ml | 2 +- + v2v/modules_list.mli | 2 +- + v2v/types.ml | 8 +++++ + v2v/types.mli | 9 +++++ + v2v/v2v.ml | 7 ++-- + v2v/virt-v2v.pod | 18 ++++++++++ + 10 files changed, 150 insertions(+), 16 deletions(-) + +diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml +index 4d390f249..686631271 100644 +--- a/v2v/cmdline.ml ++++ b/v2v/cmdline.ml +@@ -40,11 +40,12 @@ type cmdline = { + print_estimate : bool; + print_source : bool; + root_choice : root_choice; ++ static_ips : static_ip list; + ks : Tools_utils.key_store; + } + + (* Matches --mac command line parameters. *) +-let mac_re = PCRE.compile ~anchored:true "([[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}):(network|bridge):(.*)" ++let mac_re = PCRE.compile ~anchored:true "([[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}):(network|bridge|ip):(.*)" + + let parse_cmdline () = + let compressed = ref false in +@@ -97,6 +98,7 @@ let parse_cmdline () = + in + + let network_map = Networks.create () in ++ let static_ips = ref [] in + let add_network str = + match String.split ":" str with + | "", "" -> +@@ -119,11 +121,30 @@ let parse_cmdline () = + if not (PCRE.matches mac_re str) then + error (f_"cannot parse --mac \"%s\" parameter") str; + let mac = PCRE.sub 1 and out = PCRE.sub 3 in +- let vnet_type = +- match PCRE.sub 2 with +- | "network" -> Network | "bridge" -> Bridge +- | _ -> assert false in +- Networks.add_mac network_map mac vnet_type out ++ match PCRE.sub 2 with ++ | "network" -> ++ Networks.add_mac network_map mac Network out ++ | "bridge" -> ++ Networks.add_mac network_map mac Bridge out ++ | "ip" -> ++ let add if_mac_addr if_ip_address if_default_gateway ++ if_prefix_length if_nameservers = ++ List.push_back static_ips ++ { if_mac_addr; if_ip_address; if_default_gateway; ++ if_prefix_length; if_nameservers } ++ in ++ (match String.nsplit "," out with ++ | [] -> ++ error (f_"invalid --mac ip option") ++ | [ip] -> add mac ip None None [] ++ | [ip; gw] -> add mac ip (Some gw) None [] ++ | ip :: gw :: len :: nameservers -> ++ let len = ++ try int_of_string len with ++ | Failure _ -> error (f_"cannot parse --mac ip prefix length field as an integer: %s") len in ++ add mac ip (Some gw) (Some len) nameservers ++ ); ++ | _ -> assert false + in + + let no_trim_warning _ = +@@ -211,8 +232,8 @@ let parse_cmdline () = + s_"Input transport"; + [ L"in-place" ], Getopt.Set in_place, + s_"Only tune the guest in the input VM"; +- [ L"mac" ], Getopt.String ("mac:network|bridge:out", add_mac), +- s_"Map NIC to network or bridge"; ++ [ L"mac" ], Getopt.String ("mac:network|bridge|ip:out", add_mac), ++ s_"Map NIC to network or bridge or assign static IP"; + [ S 'n'; L"network" ], Getopt.String ("in:out", add_network), + s_"Map network ‘in’ to ‘out’"; + [ L"no-copy" ], Getopt.Clear do_copy, +@@ -335,6 +356,7 @@ read the man page virt-v2v(1). + let print_source = !print_source in + let qemu_boot = !qemu_boot in + let root_choice = !root_choice in ++ let static_ips = !static_ips in + + (* No arguments and machine-readable mode? Print out some facts + * about what this binary supports. +@@ -351,6 +373,7 @@ read the man page virt-v2v(1). + pr "in-place\n"; + pr "io/oo\n"; + pr "mac-option\n"; ++ pr "mac-ip-option\n"; + List.iter (pr "input:%s\n") (Modules_list.input_modules ()); + List.iter (pr "output:%s\n") (Modules_list.output_modules ()); + List.iter (pr "convert:%s\n") (Modules_list.convert_modules ()); +@@ -685,7 +708,7 @@ read the man page virt-v2v(1). + { + compressed; debug_overlays; do_copy; in_place; network_map; + output_alloc; output_format; output_name; +- print_estimate; print_source; root_choice; ++ print_estimate; print_source; root_choice; static_ips; + ks = opthandle.ks; + }, + input, output +diff --git a/v2v/cmdline.mli b/v2v/cmdline.mli +index 78601e191..a009e9888 100644 +--- a/v2v/cmdline.mli ++++ b/v2v/cmdline.mli +@@ -30,6 +30,7 @@ type cmdline = { + print_estimate : bool; + print_source : bool; + root_choice : Types.root_choice; ++ static_ips : Types.static_ip list; + ks : Tools_utils.key_store; + } + +diff --git a/v2v/convert_linux.ml b/v2v/convert_linux.ml +index f9e811c8d..1ada36115 100644 +--- a/v2v/convert_linux.ml ++++ b/v2v/convert_linux.ml +@@ -34,7 +34,7 @@ open Linux_kernels + module G = Guestfs + + (* The conversion function. *) +-let convert (g : G.guestfs) inspect source output rcaps = ++let convert (g : G.guestfs) inspect source output rcaps _ = + (*----------------------------------------------------------------------*) + (* Inspect the guest first. We already did some basic inspection in + * the common v2v.ml code, but that has to deal with generic guests +diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml +index 1db3c0ea6..75e609d61 100644 +--- a/v2v/convert_windows.ml ++++ b/v2v/convert_windows.ml +@@ -38,7 +38,7 @@ module G = Guestfs + * time the Windows VM is booted on KVM. + *) + +-let convert (g : G.guestfs) inspect source output rcaps = ++let convert (g : G.guestfs) inspect source output rcaps static_ips = + (*----------------------------------------------------------------------*) + (* Inspect the Windows guest. *) + +@@ -228,6 +228,8 @@ let convert (g : G.guestfs) inspect source output rcaps = + Registry.with_hive_write g inspect.i_windows_software_hive + update_software_hive; + ++ configure_network_interfaces net_driver; ++ + fix_ntfs_heads (); + + fix_win_esp (); +@@ -603,6 +605,78 @@ if errorlevel 3010 exit /b 0 + | None -> + warning (f_"could not find registry key HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion") + ++ and configure_network_interfaces net_driver = ++ (* If we were asked to force network interfaces to have particular ++ * static IP addresses then it is done here by installing a ++ * Powershell script which runs at boot. ++ *) ++ if static_ips <> [] then ( ++ let psh_filename = "v2vnetcf.ps1" in ++ let psh = ref [] in ++ let add = List.push_back psh in ++ ++ add "# Uncomment this line for lots of debug output."; ++ add "# Set-PSDebug -Trace 1"; ++ add ""; ++ ++ (* If virtio-net was added to the registry, we must wait for ++ * it to be installed at runtime. ++ *) ++ if net_driver = Virtio_net then ( ++ add "# Wait for the netkvm (virtio-net) driver to become active."; ++ add "$adapters = @()"; ++ add "While (-Not $adapters) {"; ++ add " Start-Sleep -Seconds 5"; ++ add " $adapters = Get-NetAdapter -Physical | Where DriverFileName -eq \"netkvm.sys\""; ++ add " Write-Host \"adapters = '$adapters'\""; ++ add "}"; ++ add "" ++ ); ++ ++ List.iter ( ++ fun { if_mac_addr; if_ip_address; if_default_gateway; ++ if_prefix_length; if_nameservers } -> ++ add (sprintf "$mac_address = '%s'" ++ (String.replace if_mac_addr ":" "-")); ++ add "$ifindex = (Get-NetAdapter -Physical | Where MacAddress -eq $mac_address).ifIndex"; ++ add "if ($ifindex) {"; ++ ++ add " Write-Host \"setting IP address of adapter at $ifindex\""; ++ ++ (* New-NetIPAddress command *) ++ let args = ref [] in ++ List.push_back args "-InterfaceIndex"; ++ List.push_back args "$ifindex"; ++ List.push_back args "-IPAddress"; ++ List.push_back args (sprintf "'%s'" if_ip_address); ++ (match if_default_gateway with ++ | None -> () ++ | Some gw -> ++ List.push_back args "-DefaultGateway"; ++ List.push_back args (sprintf "'%s'" gw) ++ ); ++ (match if_prefix_length with ++ | None -> () ++ | Some len -> ++ List.push_back args "-PrefixLength"; ++ List.push_back args (string_of_int len) ++ ); ++ let cmd1 = "New-NetIPAddress " ^ String.concat " " !args in ++ add (" " ^ cmd1); ++ ++ (* Set-DnsClientServerAddress command *) ++ if if_nameservers <> [] then ( ++ add (sprintf " Set-DnsClientServerAddress -InterfaceIndex $ifindex -ServerAddresses (%s)" ++ (String.concat "," (List.map (sprintf "'%s'") if_nameservers))) ++ ); ++ add "}"; ++ add "" ++ ) static_ips; ++ ++ (* Install the Powershell script to run at firstboot. *) ++ Windows.install_firstboot_powershell g inspect psh_filename !psh ++ ) (* static_ips <> [] *) ++ + and fix_ntfs_heads () = + (* NTFS hardcodes the number of heads on the drive which created + it in the filesystem header. Modern versions of Windows +diff --git a/v2v/modules_list.ml b/v2v/modules_list.ml +index a0a74aaf2..76b3def5d 100644 +--- a/v2v/modules_list.ml ++++ b/v2v/modules_list.ml +@@ -38,7 +38,7 @@ type inspection_fn = Types.inspect -> bool + + type conversion_fn = + Guestfs.guestfs -> Types.inspect -> Types.source -> Types.output_settings -> +- Types.requested_guestcaps -> Types.guestcaps ++ Types.requested_guestcaps -> Types.static_ip list -> Types.guestcaps + + let convert_modules = ref [] + +diff --git a/v2v/modules_list.mli b/v2v/modules_list.mli +index 3e80d3e23..ad2024755 100644 +--- a/v2v/modules_list.mli ++++ b/v2v/modules_list.mli +@@ -34,7 +34,7 @@ type inspection_fn = Types.inspect -> bool + + type conversion_fn = + Guestfs.guestfs -> Types.inspect -> Types.source -> Types.output_settings -> +- Types.requested_guestcaps -> Types.guestcaps ++ Types.requested_guestcaps -> Types.static_ip list -> Types.guestcaps + + val register_convert_module : inspection_fn -> string -> conversion_fn -> unit + (** [register_convert_module inspect_fn name fn] registers a +diff --git a/v2v/types.ml b/v2v/types.ml +index 714b30014..4ba6117fd 100644 +--- a/v2v/types.ml ++++ b/v2v/types.ml +@@ -506,6 +506,14 @@ type root_choice = AskRoot | SingleRoot | FirstRoot | RootDev of string + + type output_allocation = Sparse | Preallocated + ++type static_ip = { ++ if_mac_addr : string; ++ if_ip_address : string; ++ if_default_gateway : string option; ++ if_prefix_length : int option; ++ if_nameservers : string list; ++} ++ + class virtual input = object + method precheck () = () + method virtual as_options : string +diff --git a/v2v/types.mli b/v2v/types.mli +index f595ab0ef..528d77965 100644 +--- a/v2v/types.mli ++++ b/v2v/types.mli +@@ -361,6 +361,15 @@ type root_choice = AskRoot | SingleRoot | FirstRoot | RootDev of string + type output_allocation = Sparse | Preallocated + (** Type of [-oa] (output allocation) option. *) + ++type static_ip = { ++ if_mac_addr : string; ++ if_ip_address : string; ++ if_default_gateway : string option; ++ if_prefix_length : int option; ++ if_nameservers : string list; ++} ++(** [--mac ..:ip:..] option. *) ++ + (** {2 Input object} + + This is subclassed for the various input [-i] options. +diff --git a/v2v/v2v.ml b/v2v/v2v.ml +index 63e809030..d7a868659 100644 +--- a/v2v/v2v.ml ++++ b/v2v/v2v.ml +@@ -133,7 +133,7 @@ let rec main () = + | In_place -> + rcaps_from_source source in + +- do_convert g inspect source output rcaps in ++ do_convert g inspect source output rcaps cmdline.static_ips in + + g#umount_all (); + +@@ -556,7 +556,7 @@ and estimate_target_size mpstats overlays = + ) + + (* Conversion. *) +-and do_convert g inspect source output rcaps = ++and do_convert g inspect source output rcaps interfaces = + (match inspect.i_product_name with + | "unknown" -> + message (f_"Converting the guest to run on KVM") +@@ -572,7 +572,8 @@ and do_convert g inspect source output rcaps = + debug "picked conversion module %s" conversion_name; + debug "requested caps: %s" (string_of_requested_guestcaps rcaps); + let guestcaps = +- convert g inspect source (output :> Types.output_settings) rcaps in ++ convert g inspect source (output :> Types.output_settings) rcaps ++ interfaces in + debug "%s" (string_of_guestcaps guestcaps); + + (* Did we manage to install virtio drivers? *) +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index 9a555c3be..0642d158f 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -368,6 +368,24 @@ Map source NIC MAC address to a network or bridge. + + See L below. + ++=item B<--mac> aa:bb:cc:dd:ee:ffB<:ip:>ipaddr[,gw[,len[,ns,ns,...]]] ++ ++Force a particular interface (controlled by its MAC address) to have a ++static IP address after boot. ++ ++The fields in the parameter are: C is the IP address. C ++is the optional gateway IP address. C is the subnet mask length ++(an integer). The final parameters are zero or more nameserver IP ++addresses. ++ ++This option can be supplied zero or more times. ++ ++You only need to use this option for certain broken guests such as ++Windows which are unable to preserve MAC to static IP address mappings ++automatically. You don't need to use it if Windows is using DHCP. It ++is currently ignored for Linux guests since they do not have this ++problem. ++ + =item B<--machine-readable> + + =item B<--machine-readable>=format +-- +2.24.1 + diff --git a/SOURCES/0034-New-API-luks_uuid.patch b/SOURCES/0034-New-API-luks_uuid.patch new file mode 100644 index 0000000..55535c2 --- /dev/null +++ b/SOURCES/0034-New-API-luks_uuid.patch @@ -0,0 +1,87 @@ +From bcd376966fedca02a52ad61405e84de931a89899 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Fri, 29 Nov 2019 11:48:59 +0100 +Subject: [PATCH] New API: luks_uuid + +Return the UUID of a LUKS device. + +(cherry picked from commit 206ce8bbf1bc3332dc019e553d17d6a36f74b725) +--- + daemon/luks.c | 25 +++++++++++++++++++++++++ + generator/actions_core.ml | 8 ++++++++ + generator/proc_nr.ml | 1 + + lib/MAX_PROC_NR | 2 +- + 4 files changed, 35 insertions(+), 1 deletion(-) + +diff --git a/daemon/luks.c b/daemon/luks.c +index 5c48a91eb..d631cb100 100644 +--- a/daemon/luks.c ++++ b/daemon/luks.c +@@ -292,3 +292,28 @@ do_luks_kill_slot (const char *device, const char *key, int keyslot) + + return 0; + } ++ ++char * ++do_luks_uuid (const char *device) ++{ ++ const char *argv[MAX_ARGS]; ++ size_t i = 0; ++ ++ ADD_ARG (argv, i, "cryptsetup"); ++ ADD_ARG (argv, i, "luksUUID"); ++ ADD_ARG (argv, i, device); ++ ADD_ARG (argv, i, NULL); ++ ++ char *out = NULL; ++ CLEANUP_FREE char *err = NULL; ++ int r = commandv (&out, &err, (const char * const *) argv); ++ ++ if (r == -1) { ++ reply_with_error ("%s", err); ++ return NULL; ++ } ++ ++ trim (out); ++ ++ return out; ++} +diff --git a/generator/actions_core.ml b/generator/actions_core.ml +index 7b6568b90..deda483a9 100644 +--- a/generator/actions_core.ml ++++ b/generator/actions_core.ml +@@ -9728,4 +9728,12 @@ it is useful when you have added a new device or deleted an + existing device (such as when the C API + is used)." }; + ++ { defaults with ++ name = "luks_uuid"; added = (1, 41, 9); ++ style = RString (RPlainString, "uuid"), [String (Device, "device")], []; ++ optional = Some "luks"; ++ shortdesc = "get the UUID of a LUKS device"; ++ longdesc = "\ ++This returns the UUID of the LUKS device C." }; ++ + ] +diff --git a/generator/proc_nr.ml b/generator/proc_nr.ml +index efa8c5d21..11a557076 100644 +--- a/generator/proc_nr.ml ++++ b/generator/proc_nr.ml +@@ -514,6 +514,7 @@ let proc_nr = [ + 504, "part_get_gpt_attributes"; + 505, "f2fs_expand"; + 506, "lvm_scan"; ++507, "luks_uuid"; + ] + + (* 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 80e3e6eab..055b6671a 100644 +--- a/lib/MAX_PROC_NR ++++ b/lib/MAX_PROC_NR +@@ -1 +1 @@ +-506 ++507 +-- +2.24.1 + diff --git a/SOURCES/0035-options-Fix-segfault-when-multiple-key-parameters-gi.patch b/SOURCES/0035-options-Fix-segfault-when-multiple-key-parameters-gi.patch new file mode 100644 index 0000000..06dbebd --- /dev/null +++ b/SOURCES/0035-options-Fix-segfault-when-multiple-key-parameters-gi.patch @@ -0,0 +1,47 @@ +From 7f12a3ddad2b735dc6d06b7b3ef67aacc57defe2 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 12 Nov 2019 18:15:44 +0000 +Subject: [PATCH] options: Fix segfault when multiple --key parameters given. + +Easily reproducible using: + + $ guestfish --key dev1:key:key1 --key dev2:key:key2 + +causing this stack trace (or others depending on where the memory +corruption was caught): + + Program received signal SIGABRT, Aborted. + 0x00007ffff7905625 in raise () from /lib64/libc.so.6 + (gdb) bt + #0 0x00007ffff7905625 in raise () from /lib64/libc.so.6 + #1 0x00007ffff78ee8d9 in abort () from /lib64/libc.so.6 + #2 0x00007ffff79494af in __libc_message () from /lib64/libc.so.6 + #3 0x00007ffff7950a6c in malloc_printerr () from /lib64/libc.so.6 + #4 0x00007ffff79528d0 in _int_free () from /lib64/libc.so.6 + #5 0x00005555555bdd6e in free_key_store () + #6 0x0000555555589027 in main () + (gdb) quit + +(cherry picked from commit 8c42f772614b44a8cb974afa904ec9f518431ab2 +in libguestfs-common) +--- + common/options/keys.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/common/options/keys.c b/common/options/keys.c +index 7f689866b..f783066ff 100644 +--- a/common/options/keys.c ++++ b/common/options/keys.c +@@ -216,7 +216,8 @@ key_store_import_key (struct key_store *ks, const struct key_store_key *key) + } + assert (ks != NULL); + +- new_keys = realloc (ks->keys, sizeof (*ks->keys) + 1); ++ new_keys = realloc (ks->keys, ++ (ks->nr_keys + 1) * sizeof (struct key_store_key)); + if (!new_keys) + error (EXIT_FAILURE, errno, "realloc"); + +-- +2.24.1 + diff --git a/SOURCES/0036-options-Simplify-selector-parsing-for-key-options.patch b/SOURCES/0036-options-Simplify-selector-parsing-for-key-options.patch new file mode 100644 index 0000000..c7de53d --- /dev/null +++ b/SOURCES/0036-options-Simplify-selector-parsing-for-key-options.patch @@ -0,0 +1,85 @@ +From d2ca3f2f9bd9f26cacef2cf2a38e8ac18484d8e4 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 26 Nov 2019 12:12:45 +0000 +Subject: [PATCH] options: Simplify selector parsing for --key options. + +Refactor this code to use guestfs_int_split_string function which +slightly simplifies it. This should have no effect. + +(cherry picked from commit 530d0beef74d48617717463a5b585f21e2ed62be +in libguestfs-common) +--- + common/options/keys.c | 35 ++++++++++++++--------------------- + 1 file changed, 14 insertions(+), 21 deletions(-) + +diff --git a/common/options/keys.c b/common/options/keys.c +index f783066ff..74b549731 100644 +--- a/common/options/keys.c ++++ b/common/options/keys.c +@@ -153,49 +153,42 @@ get_key (struct key_store *ks, const char *device) + } + + struct key_store * +-key_store_add_from_selector (struct key_store *ks, const char *selector_orig) ++key_store_add_from_selector (struct key_store *ks, const char *selector) + { +- CLEANUP_FREE char *selector = strdup (selector_orig); +- const char *elem; +- char *saveptr; ++ CLEANUP_FREE_STRING_LIST char **fields = ++ guestfs_int_split_string (':', selector); + struct key_store_key key; + +- if (!selector) +- error (EXIT_FAILURE, errno, "strdup"); ++ if (!fields) ++ error (EXIT_FAILURE, errno, "guestfs_int_split_string"); + +- /* 1: device */ +- elem = strtok_r (selector, ":", &saveptr); +- if (!elem) { ++ if (guestfs_int_count_strings (fields) != 3) { + invalid_selector: +- error (EXIT_FAILURE, 0, "invalid selector for --key: %s", selector_orig); ++ error (EXIT_FAILURE, 0, "invalid selector for --key: %s", selector); + } +- key.device = strdup (elem); ++ ++ /* 1: device */ ++ key.device = strdup (fields[0]); + if (!key.device) + error (EXIT_FAILURE, errno, "strdup"); + + /* 2: key type */ +- elem = strtok_r (NULL, ":", &saveptr); +- if (!elem) +- goto invalid_selector; +- else if (STREQ (elem, "key")) ++ if (STREQ (fields[1], "key")) + key.type = key_string; +- else if (STREQ (elem, "file")) ++ else if (STREQ (fields[1], "file")) + key.type = key_file; + else + goto invalid_selector; + + /* 3: actual key */ +- elem = strtok_r (NULL, ":", &saveptr); +- if (!elem) +- goto invalid_selector; + switch (key.type) { + case key_string: +- key.string.s = strdup (elem); ++ key.string.s = strdup (fields[2]); + if (!key.string.s) + error (EXIT_FAILURE, errno, "strdup"); + break; + case key_file: +- key.file.name = strdup (elem); ++ key.file.name = strdup (fields[2]); + if (!key.file.name) + error (EXIT_FAILURE, errno, "strdup"); + break; +-- +2.24.1 + diff --git a/SOURCES/0037-options-Allow-multiple-key-parameters.patch b/SOURCES/0037-options-Allow-multiple-key-parameters.patch new file mode 100644 index 0000000..0f4f23f --- /dev/null +++ b/SOURCES/0037-options-Allow-multiple-key-parameters.patch @@ -0,0 +1,181 @@ +From d3c6f71eed46df3f9ec376359433d9c4b9830860 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 12 Nov 2019 17:50:17 +0000 +Subject: [PATCH] options: Allow multiple --key parameters. + +This allows multiple --key parameters on the command line to match a +single device. For example: + + tool --key /dev/sda1:key:trykey1 --key /dev/sda1:key:trykey2 + +would try "trykey1" and "trykey2" against /dev/sda1. + +(cherry picked from commit c10c8baedb88e7c2988a01b70fc5f81fa8e4885c +in libguestfs-common) +--- + common/options/decrypt.c | 37 +++++++++++++++++++++++++-------- + common/options/keys.c | 45 +++++++++++++++++++++++++++++++--------- + common/options/options.h | 6 ++++-- + 3 files changed, 67 insertions(+), 21 deletions(-) + +diff --git a/common/options/decrypt.c b/common/options/decrypt.c +index 234163d8c..3511d9fe9 100644 +--- a/common/options/decrypt.c ++++ b/common/options/decrypt.c +@@ -26,6 +26,9 @@ + #include + #include + #include ++#include ++#include ++#include + + #include "c-ctype.h" + +@@ -74,21 +77,37 @@ inspect_do_decrypt (guestfs_h *g, struct key_store *ks) + if (partitions == NULL) + exit (EXIT_FAILURE); + +- int need_rescan = 0; +- size_t i; ++ int need_rescan = 0, r; ++ size_t i, j; ++ + for (i = 0; partitions[i] != NULL; ++i) { + CLEANUP_FREE char *type = guestfs_vfs_type (g, partitions[i]); + if (type && STREQ (type, "crypto_LUKS")) { + char mapname[32]; + make_mapname (partitions[i], mapname, sizeof mapname); + +- CLEANUP_FREE char *key = get_key (ks, partitions[i]); +- /* XXX Should we call guestfs_luks_open_ro if readonly flag +- * is set? This might break 'mount_ro'. +- */ +- if (guestfs_luks_open (g, partitions[i], key, mapname) == -1) +- exit (EXIT_FAILURE); +- ++ CLEANUP_FREE_STRING_LIST char **keys = get_keys (ks, partitions[i]); ++ assert (guestfs_int_count_strings (keys) > 0); ++ ++ /* Try each key in turn. */ ++ for (j = 0; keys[j] != NULL; ++j) { ++ /* XXX Should we call guestfs_luks_open_ro if readonly flag ++ * is set? This might break 'mount_ro'. ++ */ ++ guestfs_push_error_handler (g, NULL, NULL); ++ r = guestfs_luks_open (g, partitions[i], keys[j], mapname); ++ guestfs_pop_error_handler (g); ++ if (r == 0) ++ goto opened; ++ } ++ error (EXIT_FAILURE, 0, ++ _("could not find key to open LUKS encrypted %s.\n\n" ++ "Try using --key on the command line.\n\n" ++ "Original error: %s (%d)"), ++ partitions[i], guestfs_last_error (g), ++ guestfs_last_errno (g)); ++ ++ opened: + need_rescan = 1; + } + } +diff --git a/common/options/keys.c b/common/options/keys.c +index 74b549731..782bdb67f 100644 +--- a/common/options/keys.c ++++ b/common/options/keys.c +@@ -121,15 +121,32 @@ read_first_line_from_file (const char *filename) + return ret; + } + +-char * +-get_key (struct key_store *ks, const char *device) ++/* Return the key(s) matching this particular device from the ++ * keystore. There may be multiple. If none are read from the ++ * keystore, ask the user. ++ */ ++char ** ++get_keys (struct key_store *ks, const char *device) + { +- size_t i; ++ size_t i, j, len; ++ char **r; ++ char *s; ++ ++ /* We know the returned list must have at least one element and not ++ * more than ks->nr_keys. ++ */ ++ len = 1; ++ if (ks) ++ len = MIN (1, ks->nr_keys); ++ r = calloc (len+1, sizeof (char *)); ++ if (r == NULL) ++ error (EXIT_FAILURE, errno, "calloc"); ++ ++ j = 0; + + if (ks) { + for (i = 0; i < ks->nr_keys; ++i) { + struct key_store_key *key = &ks->keys[i]; +- char *s; + + if (STRNEQ (key->device, device)) + continue; +@@ -139,17 +156,25 @@ get_key (struct key_store *ks, const char *device) + s = strdup (key->string.s); + if (!s) + error (EXIT_FAILURE, errno, "strdup"); +- return s; ++ r[j++] = s; ++ break; + case key_file: +- return read_first_line_from_file (key->file.name); ++ s = read_first_line_from_file (key->file.name); ++ r[j++] = s; ++ break; + } +- +- /* Key not found in the key store, ask the user for it. */ +- break; + } + } + +- return read_key (device); ++ if (j == 0) { ++ /* Key not found in the key store, ask the user for it. */ ++ s = read_key (device); ++ if (!s) ++ error (EXIT_FAILURE, 0, _("could not read key from user")); ++ r[0] = s; ++ } ++ ++ return r; + } + + struct key_store * +diff --git a/common/options/options.h b/common/options/options.h +index 6fadf1e76..510e8a8a9 100644 +--- a/common/options/options.h ++++ b/common/options/options.h +@@ -104,7 +104,9 @@ struct mp { + + /* A key in the key store. */ + struct key_store_key { +- /* The device this key refers to. */ ++ /* The device this key refers to. There may be multiple matching ++ * devices in the list. ++ */ + char *device; + + enum { +@@ -146,7 +148,7 @@ extern void print_inspect_prompt (void); + + /* in key.c */ + extern char *read_key (const char *param); +-extern char *get_key (struct key_store *ks, const char *device); ++extern char **get_keys (struct key_store *ks, const char *device); + extern struct key_store *key_store_add_from_selector (struct key_store *ks, const char *selector); + extern struct key_store *key_store_import_key (struct key_store *ks, const struct key_store_key *key); + extern void free_key_store (struct key_store *ks); +-- +2.24.1 + diff --git a/SOURCES/0038-options-rename-key.device-as-key.id.patch b/SOURCES/0038-options-rename-key.device-as-key.id.patch new file mode 100644 index 0000000..6bb34c7 --- /dev/null +++ b/SOURCES/0038-options-rename-key.device-as-key.id.patch @@ -0,0 +1,437 @@ +From 3afce3e84c79d7fbca4d6eeb76f237090c5528c9 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Fri, 29 Nov 2019 12:06:20 +0100 +Subject: [PATCH] options: rename key.device as key.id + +In the future it will be also something else other than the device name. + +(cherry picked from commit c863ee5e1df5e1eca7ad6821bd2db3796277a6bd +in libguestfs-common) + +PT: the documentation was amended manually. +--- + cat/virt-cat.pod | 7 ++++--- + cat/virt-log.pod | 7 ++++--- + cat/virt-ls.pod | 7 ++++--- + cat/virt-tail.pod | 7 ++++--- + common/mltools/tools_utils-c.c | 4 ++-- + common/options/keys.c | 8 ++++---- + common/options/options.h | 8 +++++--- + customize/virt-customize.pod | 7 ++++--- + diff/virt-diff.pod | 7 ++++--- + edit/virt-edit.pod | 7 ++++--- + fish/guestfish.pod | 7 ++++--- + fuse/guestmount.pod | 7 ++++--- + get-kernel/virt-get-kernel.pod | 7 ++++--- + inspector/virt-inspector.pod | 7 ++++--- + sparsify/virt-sparsify.pod | 7 ++++--- + sysprep/virt-sysprep.pod | 7 ++++--- + v2v/virt-v2v.pod | 7 ++++--- + 17 files changed, 67 insertions(+), 51 deletions(-) + +diff --git a/cat/virt-cat.pod b/cat/virt-cat.pod +index 745d4a4b6..b0301d636 100644 +--- a/cat/virt-cat.pod ++++ b/cat/virt-cat.pod +@@ -124,15 +124,16 @@ security problem with malicious guests (CVE-2010-3851). + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C can be in one of the following formats: ++the inspection. C must be the libguestfs device name of the LUKS ++device. + + =over 4 + +-=item B<--key> C:key:KEY_STRING ++=item B<--key> C:key:KEY_STRING + + Use the specified C as passphrase. + +-=item B<--key> C:file:FILENAME ++=item B<--key> C:file:FILENAME + + Read the passphrase from F. + +diff --git a/cat/virt-log.pod b/cat/virt-log.pod +index 8de000c5f..0d447b3b5 100644 +--- a/cat/virt-log.pod ++++ b/cat/virt-log.pod +@@ -108,15 +108,16 @@ security problem with malicious guests (CVE-2010-3851). + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C can be in one of the following formats: ++the inspection. C must be the libguestfs device name of the LUKS ++device. + + =over 4 + +-=item B<--key> C:key:KEY_STRING ++=item B<--key> C:key:KEY_STRING + + Use the specified C as passphrase. + +-=item B<--key> C:file:FILENAME ++=item B<--key> C:file:FILENAME + + Read the passphrase from F. + +diff --git a/cat/virt-ls.pod b/cat/virt-ls.pod +index 8d6a9fe37..de02a473d 100644 +--- a/cat/virt-ls.pod ++++ b/cat/virt-ls.pod +@@ -355,15 +355,16 @@ L above. + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C can be in one of the following formats: ++the inspection. C must be the libguestfs device name of the LUKS ++device. + + =over 4 + +-=item B<--key> C:key:KEY_STRING ++=item B<--key> C:key:KEY_STRING + + Use the specified C as passphrase. + +-=item B<--key> C:file:FILENAME ++=item B<--key> C:file:FILENAME + + Read the passphrase from F. + +diff --git a/cat/virt-tail.pod b/cat/virt-tail.pod +index cf8700d1a..f00384f5d 100644 +--- a/cat/virt-tail.pod ++++ b/cat/virt-tail.pod +@@ -126,15 +126,16 @@ security problem with malicious guests (CVE-2010-3851). + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C can be in one of the following formats: ++the inspection. C must be the libguestfs device name of the LUKS ++device. + + =over 4 + +-=item B<--key> C:key:KEY_STRING ++=item B<--key> C:key:KEY_STRING + + Use the specified C as passphrase. + +-=item B<--key> C:file:FILENAME ++=item B<--key> C:file:FILENAME + + Read the passphrase from F. + +diff --git a/common/mltools/tools_utils-c.c b/common/mltools/tools_utils-c.c +index 3b80091c0..6c43b8d74 100644 +--- a/common/mltools/tools_utils-c.c ++++ b/common/mltools/tools_utils-c.c +@@ -57,8 +57,8 @@ guestfs_int_mllib_inspect_decrypt (value gv, value gpv, value keysv) + struct key_store_key key; + + elemv = Field (keysv, 0); +- key.device = strdup (String_val (Field (elemv, 0))); +- if (!key.device) ++ key.id = strdup (String_val (Field (elemv, 0))); ++ if (!key.id) + caml_raise_out_of_memory (); + + v = Field (elemv, 1); +diff --git a/common/options/keys.c b/common/options/keys.c +index 782bdb67f..7c391acde 100644 +--- a/common/options/keys.c ++++ b/common/options/keys.c +@@ -148,7 +148,7 @@ get_keys (struct key_store *ks, const char *device) + for (i = 0; i < ks->nr_keys; ++i) { + struct key_store_key *key = &ks->keys[i]; + +- if (STRNEQ (key->device, device)) ++ if (STRNEQ (key->id, device)) + continue; + + switch (key->type) { +@@ -193,8 +193,8 @@ key_store_add_from_selector (struct key_store *ks, const char *selector) + } + + /* 1: device */ +- key.device = strdup (fields[0]); +- if (!key.device) ++ key.id = strdup (fields[0]); ++ if (!key.id) + error (EXIT_FAILURE, errno, "strdup"); + + /* 2: key type */ +@@ -265,6 +265,6 @@ free_key_store (struct key_store *ks) + free (key->file.name); + break; + } +- free (key->device); ++ free (key->id); + } + } +diff --git a/common/options/options.h b/common/options/options.h +index 510e8a8a9..b83a92b06 100644 +--- a/common/options/options.h ++++ b/common/options/options.h +@@ -104,10 +104,12 @@ struct mp { + + /* A key in the key store. */ + struct key_store_key { +- /* The device this key refers to. There may be multiple matching +- * devices in the list. ++ /* An ID for the device this key refers to. It must be the libguestfs ++ * device name. ++ * ++ * There may be multiple matching devices in the list. + */ +- char *device; ++ char *id; + + enum { + key_string, /* key specified as string */ +diff --git a/customize/virt-customize.pod b/customize/virt-customize.pod +index d1b568040..491606591 100644 +--- a/customize/virt-customize.pod ++++ b/customize/virt-customize.pod +@@ -141,15 +141,16 @@ security problem with malicious guests (CVE-2010-3851). + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C can be in one of the following formats: ++the inspection. C must be the libguestfs device name of the LUKS ++device. + + =over 4 + +-=item B<--key> C:key:KEY_STRING ++=item B<--key> C:key:KEY_STRING + + Use the specified C as passphrase. + +-=item B<--key> C:file:FILENAME ++=item B<--key> C:file:FILENAME + + Read the passphrase from F. + +diff --git a/diff/virt-diff.pod b/diff/virt-diff.pod +index 36ee10ced..22658072d 100644 +--- a/diff/virt-diff.pod ++++ b/diff/virt-diff.pod +@@ -169,15 +169,16 @@ Display file sizes in human-readable format. + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C can be in one of the following formats: ++the inspection. C must be the libguestfs device name of the LUKS ++device. + + =over 4 + +-=item B<--key> C:key:KEY_STRING ++=item B<--key> C:key:KEY_STRING + + Use the specified C as passphrase. + +-=item B<--key> C:file:FILENAME ++=item B<--key> C:file:FILENAME + + Read the passphrase from F. + +diff --git a/edit/virt-edit.pod b/edit/virt-edit.pod +index 3cb3ce6da..5a63cd05f 100644 +--- a/edit/virt-edit.pod ++++ b/edit/virt-edit.pod +@@ -156,15 +156,16 @@ security problem with malicious guests (CVE-2010-3851). + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C can be in one of the following formats: ++the inspection. C must be the libguestfs device name of the LUKS ++device. + + =over 4 + +-=item B<--key> C:key:KEY_STRING ++=item B<--key> C:key:KEY_STRING + + Use the specified C as passphrase. + +-=item B<--key> C:file:FILENAME ++=item B<--key> C:file:FILENAME + + Read the passphrase from F. + +diff --git a/fish/guestfish.pod b/fish/guestfish.pod +index 06644c5b8..ccb57b159 100644 +--- a/fish/guestfish.pod ++++ b/fish/guestfish.pod +@@ -283,15 +283,16 @@ were found. + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C can be in one of the following formats: ++the inspection. C must be the libguestfs device name of the LUKS ++device. + + =over 4 + +-=item B<--key> C:key:KEY_STRING ++=item B<--key> C:key:KEY_STRING + + Use the specified C as passphrase. + +-=item B<--key> C:file:FILENAME ++=item B<--key> C:file:FILENAME + + Read the passphrase from F. + +diff --git a/fuse/guestmount.pod b/fuse/guestmount.pod +index 9319d093c..d9e957b8b 100644 +--- a/fuse/guestmount.pod ++++ b/fuse/guestmount.pod +@@ -249,15 +249,16 @@ mounted on the real virtual machine. + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C can be in one of the following formats: ++the inspection. C must be the libguestfs device name of the LUKS ++device. + + =over 4 + +-=item B<--key> C:key:KEY_STRING ++=item B<--key> C:key:KEY_STRING + + Use the specified C as passphrase. + +-=item B<--key> C:file:FILENAME ++=item B<--key> C:file:FILENAME + + Read the passphrase from F. + +diff --git a/get-kernel/virt-get-kernel.pod b/get-kernel/virt-get-kernel.pod +index 3802412e2..f0ace2d6d 100644 +--- a/get-kernel/virt-get-kernel.pod ++++ b/get-kernel/virt-get-kernel.pod +@@ -92,15 +92,16 @@ security problem with malicious guests (CVE-2010-3851). + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C can be in one of the following formats: ++the inspection. C must be the libguestfs device name of the LUKS ++device. + + =over 4 + +-=item B<--key> C:key:KEY_STRING ++=item B<--key> C:key:KEY_STRING + + Use the specified C as passphrase. + +-=item B<--key> C:file:FILENAME ++=item B<--key> C:file:FILENAME + + Read the passphrase from F. + +diff --git a/inspector/virt-inspector.pod b/inspector/virt-inspector.pod +index 98b278f26..eac9dc3cd 100644 +--- a/inspector/virt-inspector.pod ++++ b/inspector/virt-inspector.pod +@@ -117,15 +117,16 @@ ensure the format is always specified. + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C can be in one of the following formats: ++the inspection. C must be the libguestfs device name of the LUKS ++device. + + =over 4 + +-=item B<--key> C:key:KEY_STRING ++=item B<--key> C:key:KEY_STRING + + Use the specified C as passphrase. + +-=item B<--key> C:file:FILENAME ++=item B<--key> C:file:FILENAME + + Read the passphrase from F. + +diff --git a/sparsify/virt-sparsify.pod b/sparsify/virt-sparsify.pod +index 3f5f9995f..cf7970a5f 100644 +--- a/sparsify/virt-sparsify.pod ++++ b/sparsify/virt-sparsify.pod +@@ -233,15 +233,16 @@ See L below. + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C can be in one of the following formats: ++the inspection. C must be the libguestfs device name of the LUKS ++device. + + =over 4 + +-=item B<--key> C:key:KEY_STRING ++=item B<--key> C:key:KEY_STRING + + Use the specified C as passphrase. + +-=item B<--key> C:file:FILENAME ++=item B<--key> C:file:FILENAME + + Read the passphrase from F. + +diff --git a/sysprep/virt-sysprep.pod b/sysprep/virt-sysprep.pod +index 8d248db94..d7ad7ee33 100644 +--- a/sysprep/virt-sysprep.pod ++++ b/sysprep/virt-sysprep.pod +@@ -189,15 +189,16 @@ security problem with malicious guests (CVE-2010-3851). + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C can be in one of the following formats: ++the inspection. C must be the libguestfs device name of the LUKS ++device. + + =over 4 + +-=item B<--key> C:key:KEY_STRING ++=item B<--key> C:key:KEY_STRING + + Use the specified C as passphrase. + +-=item B<--key> C:file:FILENAME ++=item B<--key> C:file:FILENAME + + Read the passphrase from F. + +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index 0642d158f..8c2867814 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -337,15 +337,16 @@ through VDDK. + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C can be in one of the following formats: ++the inspection. C must be the libguestfs device name of the LUKS ++device. + + =over 4 + +-=item B<--key> C:key:KEY_STRING ++=item B<--key> C:key:KEY_STRING + + Use the specified C as passphrase. + +-=item B<--key> C:file:FILENAME ++=item B<--key> C:file:FILENAME + + Read the passphrase from F. + +-- +2.24.1 + diff --git a/SOURCES/0039-options-allow-a-UUID-as-identifier-for-key.patch b/SOURCES/0039-options-allow-a-UUID-as-identifier-for-key.patch new file mode 100644 index 0000000..68fa58c --- /dev/null +++ b/SOURCES/0039-options-allow-a-UUID-as-identifier-for-key.patch @@ -0,0 +1,313 @@ +From abb0a1dcc6e15130c334713d0716e223e5fc494d Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Fri, 29 Nov 2019 12:07:13 +0100 +Subject: [PATCH] options: allow a UUID as identifier for --key + +This way it is possible to specify the UUID of the LUKS device instead +of the libguestfs device name to decrypt a device during the inspection. + +Make the usage of the new luks_uuid API conditional, so other projects +using the common submodule do not require a libguestfs version bump. + +(cherry picked from commit bb4a2dc17a78b53437896d4215ae82df8e11b788 +in libguestfs-common) + +PT: the documentation was amended manually. +--- + cat/virt-cat.pod | 4 ++-- + cat/virt-log.pod | 4 ++-- + cat/virt-ls.pod | 4 ++-- + cat/virt-tail.pod | 4 ++-- + common/options/decrypt.c | 8 +++++++- + common/options/keys.c | 4 ++-- + common/options/options.h | 6 +++--- + customize/virt-customize.pod | 4 ++-- + diff/virt-diff.pod | 4 ++-- + edit/virt-edit.pod | 4 ++-- + fish/guestfish.pod | 4 ++-- + fuse/guestmount.pod | 4 ++-- + get-kernel/virt-get-kernel.pod | 4 ++-- + inspector/virt-inspector.pod | 4 ++-- + sparsify/virt-sparsify.pod | 4 ++-- + sysprep/virt-sysprep.pod | 4 ++-- + v2v/virt-v2v.pod | 4 ++-- + 17 files changed, 40 insertions(+), 34 deletions(-) + +diff --git a/cat/virt-cat.pod b/cat/virt-cat.pod +index b0301d636..2cea291ac 100644 +--- a/cat/virt-cat.pod ++++ b/cat/virt-cat.pod +@@ -124,8 +124,8 @@ security problem with malicious guests (CVE-2010-3851). + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C must be the libguestfs device name of the LUKS +-device. ++the inspection. C can be either the libguestfs device name, or ++the UUID of the LUKS device. + + =over 4 + +diff --git a/cat/virt-log.pod b/cat/virt-log.pod +index 0d447b3b5..888108d5f 100644 +--- a/cat/virt-log.pod ++++ b/cat/virt-log.pod +@@ -108,8 +108,8 @@ security problem with malicious guests (CVE-2010-3851). + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C must be the libguestfs device name of the LUKS +-device. ++the inspection. C can be either the libguestfs device name, or ++the UUID of the LUKS device. + + =over 4 + +diff --git a/cat/virt-ls.pod b/cat/virt-ls.pod +index de02a473d..307e79395 100644 +--- a/cat/virt-ls.pod ++++ b/cat/virt-ls.pod +@@ -355,8 +355,8 @@ L above. + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C must be the libguestfs device name of the LUKS +-device. ++the inspection. C can be either the libguestfs device name, or ++the UUID of the LUKS device. + + =over 4 + +diff --git a/cat/virt-tail.pod b/cat/virt-tail.pod +index f00384f5d..a804f4cf3 100644 +--- a/cat/virt-tail.pod ++++ b/cat/virt-tail.pod +@@ -126,8 +126,8 @@ security problem with malicious guests (CVE-2010-3851). + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C must be the libguestfs device name of the LUKS +-device. ++the inspection. C can be either the libguestfs device name, or ++the UUID of the LUKS device. + + =over 4 + +diff --git a/common/options/decrypt.c b/common/options/decrypt.c +index 3511d9fe9..683cf5ed4 100644 +--- a/common/options/decrypt.c ++++ b/common/options/decrypt.c +@@ -86,7 +86,13 @@ inspect_do_decrypt (guestfs_h *g, struct key_store *ks) + char mapname[32]; + make_mapname (partitions[i], mapname, sizeof mapname); + +- CLEANUP_FREE_STRING_LIST char **keys = get_keys (ks, partitions[i]); ++#ifdef GUESTFS_HAVE_LUKS_UUID ++ CLEANUP_FREE char *uuid = guestfs_luks_uuid (g, partitions[i]); ++#else ++ const char *uuid = NULL; ++#endif ++ ++ CLEANUP_FREE_STRING_LIST char **keys = get_keys (ks, partitions[i], uuid); + assert (guestfs_int_count_strings (keys) > 0); + + /* Try each key in turn. */ +diff --git a/common/options/keys.c b/common/options/keys.c +index 7c391acde..798315c2e 100644 +--- a/common/options/keys.c ++++ b/common/options/keys.c +@@ -126,7 +126,7 @@ read_first_line_from_file (const char *filename) + * keystore, ask the user. + */ + char ** +-get_keys (struct key_store *ks, const char *device) ++get_keys (struct key_store *ks, const char *device, const char *uuid) + { + size_t i, j, len; + char **r; +@@ -148,7 +148,7 @@ get_keys (struct key_store *ks, const char *device) + for (i = 0; i < ks->nr_keys; ++i) { + struct key_store_key *key = &ks->keys[i]; + +- if (STRNEQ (key->id, device)) ++ if (STRNEQ (key->id, device) && (uuid && STRNEQ (key->id, uuid))) + continue; + + switch (key->type) { +diff --git a/common/options/options.h b/common/options/options.h +index b83a92b06..9b7830220 100644 +--- a/common/options/options.h ++++ b/common/options/options.h +@@ -104,8 +104,8 @@ struct mp { + + /* A key in the key store. */ + struct key_store_key { +- /* An ID for the device this key refers to. It must be the libguestfs +- * device name. ++ /* An ID for the device this key refers to. It can be either the libguestfs ++ * device name, or the UUID. + * + * There may be multiple matching devices in the list. + */ +@@ -150,7 +150,7 @@ extern void print_inspect_prompt (void); + + /* in key.c */ + extern char *read_key (const char *param); +-extern char **get_keys (struct key_store *ks, const char *device); ++extern char **get_keys (struct key_store *ks, const char *device, const char *uuid); + extern struct key_store *key_store_add_from_selector (struct key_store *ks, const char *selector); + extern struct key_store *key_store_import_key (struct key_store *ks, const struct key_store_key *key); + extern void free_key_store (struct key_store *ks); +diff --git a/customize/virt-customize.pod b/customize/virt-customize.pod +index 491606591..5d92486a2 100644 +--- a/customize/virt-customize.pod ++++ b/customize/virt-customize.pod +@@ -141,8 +141,8 @@ security problem with malicious guests (CVE-2010-3851). + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C must be the libguestfs device name of the LUKS +-device. ++the inspection. C can be either the libguestfs device name, or ++the UUID of the LUKS device. + + =over 4 + +diff --git a/diff/virt-diff.pod b/diff/virt-diff.pod +index 22658072d..e67d09101 100644 +--- a/diff/virt-diff.pod ++++ b/diff/virt-diff.pod +@@ -169,8 +169,8 @@ Display file sizes in human-readable format. + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C must be the libguestfs device name of the LUKS +-device. ++the inspection. C can be either the libguestfs device name, or ++the UUID of the LUKS device. + + =over 4 + +diff --git a/edit/virt-edit.pod b/edit/virt-edit.pod +index 5a63cd05f..918fa66f2 100644 +--- a/edit/virt-edit.pod ++++ b/edit/virt-edit.pod +@@ -156,8 +156,8 @@ security problem with malicious guests (CVE-2010-3851). + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C must be the libguestfs device name of the LUKS +-device. ++the inspection. C can be either the libguestfs device name, or ++the UUID of the LUKS device. + + =over 4 + +diff --git a/fish/guestfish.pod b/fish/guestfish.pod +index ccb57b159..f1fdf094d 100644 +--- a/fish/guestfish.pod ++++ b/fish/guestfish.pod +@@ -283,8 +283,8 @@ were found. + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C must be the libguestfs device name of the LUKS +-device. ++the inspection. C can be either the libguestfs device name, or ++the UUID of the LUKS device. + + =over 4 + +diff --git a/fuse/guestmount.pod b/fuse/guestmount.pod +index d9e957b8b..3a02c087c 100644 +--- a/fuse/guestmount.pod ++++ b/fuse/guestmount.pod +@@ -249,8 +249,8 @@ mounted on the real virtual machine. + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C must be the libguestfs device name of the LUKS +-device. ++the inspection. C can be either the libguestfs device name, or ++the UUID of the LUKS device. + + =over 4 + +diff --git a/get-kernel/virt-get-kernel.pod b/get-kernel/virt-get-kernel.pod +index f0ace2d6d..78fe66df4 100644 +--- a/get-kernel/virt-get-kernel.pod ++++ b/get-kernel/virt-get-kernel.pod +@@ -92,8 +92,8 @@ security problem with malicious guests (CVE-2010-3851). + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C must be the libguestfs device name of the LUKS +-device. ++the inspection. C can be either the libguestfs device name, or ++the UUID of the LUKS device. + + =over 4 + +diff --git a/inspector/virt-inspector.pod b/inspector/virt-inspector.pod +index eac9dc3cd..625da876c 100644 +--- a/inspector/virt-inspector.pod ++++ b/inspector/virt-inspector.pod +@@ -117,8 +117,8 @@ ensure the format is always specified. + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C must be the libguestfs device name of the LUKS +-device. ++the inspection. C can be either the libguestfs device name, or ++the UUID of the LUKS device. + + =over 4 + +diff --git a/sparsify/virt-sparsify.pod b/sparsify/virt-sparsify.pod +index cf7970a5f..0767d07e6 100644 +--- a/sparsify/virt-sparsify.pod ++++ b/sparsify/virt-sparsify.pod +@@ -233,8 +233,8 @@ See L below. + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C must be the libguestfs device name of the LUKS +-device. ++the inspection. C can be either the libguestfs device name, or ++the UUID of the LUKS device. + + =over 4 + +diff --git a/sysprep/virt-sysprep.pod b/sysprep/virt-sysprep.pod +index d7ad7ee33..b38c76c70 100644 +--- a/sysprep/virt-sysprep.pod ++++ b/sysprep/virt-sysprep.pod +@@ -189,8 +189,8 @@ security problem with malicious guests (CVE-2010-3851). + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C must be the libguestfs device name of the LUKS +-device. ++the inspection. C can be either the libguestfs device name, or ++the UUID of the LUKS device. + + =over 4 + +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index 8c2867814..25041d0ec 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -337,8 +337,8 @@ through VDDK. + =item B<--key> SELECTOR + + Specify a key for LUKS, to automatically open a LUKS device when using +-the inspection. C must be the libguestfs device name of the LUKS +-device. ++the inspection. C can be either the libguestfs device name, or ++the UUID of the LUKS device. + + =over 4 + +-- +2.24.1 + diff --git a/SOURCES/0040-docs-remove-paragraph-about-VMware-tools-on-Windows-.patch b/SOURCES/0040-docs-remove-paragraph-about-VMware-tools-on-Windows-.patch new file mode 100644 index 0000000..70f6ff0 --- /dev/null +++ b/SOURCES/0040-docs-remove-paragraph-about-VMware-tools-on-Windows-.patch @@ -0,0 +1,82 @@ +From 34b2da989021994389b6392fca06590424b7c975 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Wed, 18 Dec 2019 12:12:26 +0100 +Subject: [PATCH] docs: remove paragraph about VMware tools on Windows + (RHBZ#1785528) + +Starting from libguestfs/virt-v2v 1.39.12, virt-v2v attempts to +uninstall the VMware tools from Windows guests, so there is no need to +remove them manually before the conversion. + +Thanks to: Ming Xie. + +(cherry picked from commit 397b4a90d16f4eb116d55605cbdf3bd844108315 +in virt-v2v) +--- + v2v/virt-v2v-input-vmware.pod | 36 ----------------------------------- + 1 file changed, 36 deletions(-) + +diff --git a/v2v/virt-v2v-input-vmware.pod b/v2v/virt-v2v-input-vmware.pod +index 3acdd773e..16ddb045f 100644 +--- a/v2v/virt-v2v-input-vmware.pod ++++ b/v2v/virt-v2v-input-vmware.pod +@@ -106,18 +106,6 @@ If you find a folder of files called F.vmx>, + F.vmxf>, F.nvram> and one or more F<.vmdk> disk + images, then you can use this method. + +-=head2 VMX: Remove VMware tools from Windows guests +- +-For Windows guests, you should remove VMware tools before conversion. +-Although this is not strictly necessary, and the guest will still be +-able to run, if you don't do this then the converted guest will +-complain on every boot. The tools cannot be removed after conversion +-because the uninstaller checks if it is running on VMware and refuses +-to start (which is also the reason that virt-v2v cannot remove them). +- +-This is not necessary for Linux guests, as virt-v2v is able to remove +-VMware tools. +- + =head2 VMX: Guest must be shut down + + B. If you don't +@@ -319,18 +307,6 @@ Virt-v2v is able to import guests from VMware’s OVA (Open + Virtualization Appliance) files. Only OVAs exported from VMware + vSphere will work. + +-=head2 OVA: Remove VMware tools from Windows guests +- +-For Windows guests, you should remove VMware tools before conversion. +-Although this is not strictly necessary, and the guest will still be +-able to run, if you don't do this then the converted guest will +-complain on every boot. The tools cannot be removed after conversion +-because the uninstaller checks if it is running on VMware and refuses +-to start (which is also the reason that virt-v2v cannot remove them). +- +-This is not necessary for Linux guests, as virt-v2v is able to remove +-VMware tools. +- + =head2 OVA: Create OVA + + To create an OVA in vSphere, use the "Export OVF Template" option +@@ -383,18 +359,6 @@ Virt-v2v uses libvirt for access to vCenter, and therefore the input + mode should be I<-i libvirt>. As this is the default, you don't need + to specify it on the command line. + +-=head2 vCenter: Remove VMware tools from Windows guests +- +-For Windows guests, you should remove VMware tools before conversion. +-Although this is not strictly necessary, and the guest will still be +-able to run, if you don't do this then the converted guest will +-complain on every boot. The tools cannot be removed after conversion +-because the uninstaller checks if it is running on VMware and refuses +-to start (which is also the reason that virt-v2v cannot remove them). +- +-This is not necessary for Linux guests, as virt-v2v is able to remove +-VMware tools. +- + =head2 vCenter: URI + + The libvirt URI of a vCenter server looks something like this: +-- +2.24.1 + diff --git a/SOURCES/0041-mlcustomize-Trim-whitespaces-from-commands-read-from.patch b/SOURCES/0041-mlcustomize-Trim-whitespaces-from-commands-read-from.patch new file mode 100644 index 0000000..c37e2f4 --- /dev/null +++ b/SOURCES/0041-mlcustomize-Trim-whitespaces-from-commands-read-from.patch @@ -0,0 +1,29 @@ +From 3dc8b808bdc992fb72372ece84b45644bef2c206 Mon Sep 17 00:00:00 2001 +From: Martin Kletzander +Date: Mon, 24 Feb 2020 13:12:03 +0100 +Subject: [PATCH] mlcustomize: Trim whitespaces from commands read from file + (RHBZ#1351000) + +The first split does not care about the whole string, it is just trying to get +the command name in front, so triml is just right. + +Signed-off-by: Martin Kletzander +--- + generator/customize.ml | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/generator/customize.ml b/generator/customize.ml +index c278347c1..0b256e2d2 100644 +--- a/generator/customize.ml ++++ b/generator/customize.ml +@@ -873,6 +873,7 @@ let rec argspec () = + pr " ] in + let lines = read_whole_file filename in + let lines = String.lines_split lines in ++ let lines = List.map String.triml lines in + let lines = List.filter ( + fun line -> + String.length line > 0 && line.[0] <> '#' +-- +2.24.1 + diff --git a/SOURCES/0042-openstack-Increase-Cinder-volume-attach-timeout-to-5.patch b/SOURCES/0042-openstack-Increase-Cinder-volume-attach-timeout-to-5.patch new file mode 100644 index 0000000..1fb3f3e --- /dev/null +++ b/SOURCES/0042-openstack-Increase-Cinder-volume-attach-timeout-to-5.patch @@ -0,0 +1,43 @@ +From a4433085bf38719bd22a7cfe507c503885c839f2 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 4 Feb 2020 14:39:39 +0000 +Subject: [PATCH] openstack: Increase Cinder volume attach timeout to 5 minutes + (RHBZ#1685032). + +In some cases we have observed the time taken for a Cinder volume to +attach to the conversion appliance can be longer than the current 60 +seconds. Increase the timeout to 5 minutes. + +Thanks: Ming Xie. + +(cherry picked from commit e2ce290f6e366716f857eeaddc1dc680e5608c80 +in virt-v2v) +--- + v2v/output_openstack.ml | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/v2v/output_openstack.ml b/v2v/output_openstack.ml +index d187f1d5d..bebf9af18 100644 +--- a/v2v/output_openstack.ml ++++ b/v2v/output_openstack.ml +@@ -38,7 +38,7 @@ let openstack_binary = "openstack" + let available_timeout = 300 (* seconds *) + + (* Timeout waiting for Cinder volumes to attach to the appliance. *) +-let attach_timeout = 60 (* seconds *) ++let attach_timeout = 300 (* seconds *) + + (* The -oo options supported by this output method. *) + type os_options = { +@@ -336,7 +336,7 @@ class output_openstack output_conn output_password output_storage + if String.length id > prefix_len then String.sub id 0 prefix_len + else id in + +- with_timeout ++ with_timeout ~sleep:5 + (sprintf (f_"waiting for cinder volume %s to attach to the conversion appliance") id) + attach_timeout + (fun () -> +-- +2.24.1 + diff --git a/SOURCES/0043-v2v-o-rhv-upload-check-for-a-valid-image-transfer-ri.patch b/SOURCES/0043-v2v-o-rhv-upload-check-for-a-valid-image-transfer-ri.patch new file mode 100644 index 0000000..b309cdf --- /dev/null +++ b/SOURCES/0043-v2v-o-rhv-upload-check-for-a-valid-image-transfer-ri.patch @@ -0,0 +1,35 @@ +From d02694e659ebe1ecad29f8461d87eda6a1f8faa2 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Thu, 19 Sep 2019 09:52:41 +0200 +Subject: [PATCH] v2v: -o rhv-upload: check for a valid image transfer right + away + +Check for the INITIALIZING state of the image transfer right away, +without waiting 5 seconds even before the first time: this way, if the +transfer is already in the right state then there is no need to wait. +--- + v2v/rhv-upload-plugin.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index 6ec74a5d4..7f62b4e3b 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -190,13 +190,13 @@ def open(readonly): + # actual transfer can start when its status is "Transferring". + endt = time.time() + timeout + while True: +- time.sleep(5) + transfer = transfer_service.get() + if transfer.phase != types.ImageTransferPhase.INITIALIZING: + break + if time.time() > endt: + raise RuntimeError("timed out waiting for transfer status " + "!= INITIALIZING") ++ time.sleep(5) + + # Now we have permission to start the transfer. + if params['rhv_direct']: +-- +2.24.1 + diff --git a/SOURCES/0044-rhv-upload-Check-status-more-frequently.patch b/SOURCES/0044-rhv-upload-Check-status-more-frequently.patch new file mode 100644 index 0000000..4eefc88 --- /dev/null +++ b/SOURCES/0044-rhv-upload-Check-status-more-frequently.patch @@ -0,0 +1,49 @@ +From 200a365f20d5d8a3ddfe713e9bbe938206e43e9a Mon Sep 17 00:00:00 2001 +From: Nir Soffer +Date: Mon, 18 Nov 2019 01:04:24 +0200 +Subject: [PATCH] rhv-upload: Check status more frequently + +Checking status more frequently save a couple of seconds. Here is +an example flow tested with oVirt upload_disk.py example: + +With 5 seconds wait: + +Created disk in 11.085111 seconds +Created transfer in 1.857502 seconds + +With 1 second wait: + +Created disk in 4.991227 seconds +Created transfer in 1.961243 seconds + +(cherry picked from commit 8816c5db220f518ef70beec7ac543290e3d5c0c7 +in virt-v2v) +--- + v2v/rhv-upload-plugin.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index 7f62b4e3b..f13405df1 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -161,7 +161,7 @@ def open(readonly): + + endt = time.time() + timeout + while True: +- time.sleep(5) ++ time.sleep(1) + disk = disk_service.get() + if disk.status == types.DiskStatus.OK: + break +@@ -196,7 +196,7 @@ def open(readonly): + if time.time() > endt: + raise RuntimeError("timed out waiting for transfer status " + "!= INITIALIZING") +- time.sleep(5) ++ time.sleep(1) + + # Now we have permission to start the transfer. + if params['rhv_direct']: +-- +2.24.1 + diff --git a/SOURCES/0045-rhv-upload-Show-transfer-id-in-error-message.patch b/SOURCES/0045-rhv-upload-Show-transfer-id-in-error-message.patch new file mode 100644 index 0000000..61b35e6 --- /dev/null +++ b/SOURCES/0045-rhv-upload-Show-transfer-id-in-error-message.patch @@ -0,0 +1,31 @@ +From 7fd1c3be6bb744a93eff6ae1a9cfcdd9280cf247 Mon Sep 17 00:00:00 2001 +From: Nir Soffer +Date: Mon, 18 Nov 2019 23:53:46 +0200 +Subject: [PATCH] rhv-upload: Show transfer id in error message + +(cherry picked from commit d4ca9b6ca42d4ad3c717f5c59402ca6ff5d322bb +in virt-v2v) +--- + v2v/rhv-upload-plugin.py | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index f13405df1..9b83d1cfa 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -194,8 +194,10 @@ def open(readonly): + if transfer.phase != types.ImageTransferPhase.INITIALIZING: + break + if time.time() > endt: +- raise RuntimeError("timed out waiting for transfer status " +- "!= INITIALIZING") ++ raise RuntimeError( ++ "timed out waiting for transfer %s status != INITIALIZING" ++ % transfer.id) ++ + time.sleep(1) + + # Now we have permission to start the transfer. +-- +2.24.1 + diff --git a/SOURCES/0046-rhv-upload-Fix-waiting-for-transfer.patch b/SOURCES/0046-rhv-upload-Fix-waiting-for-transfer.patch new file mode 100644 index 0000000..575b378 --- /dev/null +++ b/SOURCES/0046-rhv-upload-Fix-waiting-for-transfer.patch @@ -0,0 +1,89 @@ +From d132157c9e0b6b990cd989662f5499644508de97 Mon Sep 17 00:00:00 2001 +From: Nir Soffer +Date: Thu, 28 Nov 2019 20:36:32 +0200 +Subject: [PATCH] rhv-upload: Fix waiting for transfer + +We were not considering failures while initializing the transfer. In +this case the transfer phase can change to PAUSED_SYSTEM or +FINISHED_FAILURE, and transfer_url will be None, which failed the +upload with a misleading error: + + RuntimeError: direct upload to host not supported, requires + ovirt-engine >= 4.2 and only works when virt-v2v is run within the + oVirt/RHV environment, eg. on an oVirt node + +Change the wait loop to consider all cases: +- Transfer failed and was removed +- Transfer failed and will be removed soon +- Transfer paused by the system (cancel required) +- Unexpected transfer phase (cancel required) +- Timeout waiting for TRANSFERRING state (cancel required) + +Reported-by: Xiaodai Wang + +(cherry picked from commit 40e1844827e4d096b1919a2159f9effc41915a73 +in virt-v2v) +--- + v2v/rhv-upload-plugin.py | 41 +++++++++++++++++++++++++++++++--------- + 1 file changed, 32 insertions(+), 9 deletions(-) + +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index 9b83d1cfa..14d4e37fb 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -185,20 +185,43 @@ def open(readonly): + # Get a reference to the created transfer service. + transfer_service = transfers_service.image_transfer_service(transfer.id) + +- # After adding a new transfer for the disk, the transfer's status +- # will be INITIALIZING. Wait until the init phase is over. The +- # actual transfer can start when its status is "Transferring". ++ # Wait until transfer's phase change from INITIALIZING to TRANSFERRING. On ++ # errors transfer's phase can change to PAUSED_SYSTEM or FINISHED_FAILURE. ++ # If the transfer was paused, we need to cancel it to remove the disk, ++ # otherwise the system will remove the disk and transfer shortly after. ++ + endt = time.time() + timeout + while True: +- transfer = transfer_service.get() +- if transfer.phase != types.ImageTransferPhase.INITIALIZING: ++ time.sleep(1) ++ try: ++ transfer = transfer_service.get() ++ except sdk.NotFoundError: ++ # The system has removed the disk and the transfer. ++ raise RuntimeError("transfer %s was removed" % transfer.id) ++ ++ if transfer.phase == types.ImageTransferPhase.FINISHED_FAILURE: ++ # The system will remove the disk and the transfer soon. ++ raise RuntimeError( ++ "transfer %s has failed" % transfer.id) ++ ++ if transfer.phase == types.ImageTransferPhase.PAUSED_SYSTEM: ++ transfer_service.cancel() ++ raise RuntimeError( ++ "transfer %s was paused by system" % transfer.id) ++ ++ if transfer.phase == types.ImageTransferPhase.TRANSFERRING: + break +- if time.time() > endt: ++ ++ if transfer.phase != types.ImageTransferPhase.INITIALIZING: ++ transfer_service.cancel() + raise RuntimeError( +- "timed out waiting for transfer %s status != INITIALIZING" +- % transfer.id) ++ "unexpected transfer %s phase %s" ++ % (transfer.id, transfer.phase)) + +- time.sleep(1) ++ if time.time() > endt: ++ transfer_service.cancel() ++ raise RuntimeError( ++ "timed out waiting for transfer %s" % transfer.id) + + # Now we have permission to start the transfer. + if params['rhv_direct']: +-- +2.24.1 + diff --git a/SOURCES/0047-v2v-Optimize-convert-for-images-with-small-holes.patch b/SOURCES/0047-v2v-Optimize-convert-for-images-with-small-holes.patch new file mode 100644 index 0000000..400401e --- /dev/null +++ b/SOURCES/0047-v2v-Optimize-convert-for-images-with-small-holes.patch @@ -0,0 +1,84 @@ +From 8d39f6bcf21a7c76e29c270b9304c978bbf2e8ba Mon Sep 17 00:00:00 2001 +From: Nir Soffer +Date: Fri, 1 Nov 2019 22:56:18 +0100 +Subject: [PATCH] v2v: Optimize convert for images with small holes +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +"qemu-img convert" detects zeroes in allocated areas and punch holes in +the destination image. This may save space on the destination image, but +slows down conversion when using outputs such as rhv-upload, which have +very large overhead per requests. + +Using the -S flag, we can treat small areas filled with zeroes as data, +limiting the number of requests, and speeding the operation. + +Here is an example converting Fedora 30 image: + +$ virt-builder fedora-30 -o src.img +... + +$ qemu-img map -f raw --output json src.img | wc -l +213 + +$ qemu-img convert -f raw -O raw -t none -T none src.img dst.img + +$ qemu-img map -f raw --output json dst.img | wc -l +1443 + +$ ls -lhs *.img +1.2G -rw-r--r--. 1 nsoffer nsoffer 6.0G Nov  1 21:48 dst.img +1.2G -rw-r--r--. 1 nsoffer nsoffer 6.0G Nov  1 21:46 src.img + +Qemu did 1443 writes instead of 213 (5.8X). Lets repeat this conversion +with the -S option: + +$ qemu-img convert -f raw -O raw -t none -T none -S 64k src.img dst.img + +$ qemu-img map -f raw --output json dst.img | wc -l +213 + +$ ls -lhs *.img +1.2G -rw-r--r--. 1 nsoffer nsoffer 6.0G Nov  1 21:48 dst.img +1.2G -rw-r--r--. 1 nsoffer nsoffer 6.0G Nov  1 21:46 src.img + +Picking a good value for -S is not easy. Testing show that 64k is best +value for this test image for limiting the number of requests: + +$ for size in 4k 8k 16k 32k 64k; do \ + printf "%5s: " $size; \ + qemu-img convert -f raw -O raw -t none -T none -S $size src.img dst.img; \ + qemu-img map -f raw --output json dst.img | wc -l; \ +done +   4k: 1443 +   8k: 731 +  16k: 521 +  32k: 387 +  64k: 213 + +We need more testing with oVirt to measure the performance improvement +and pick a good value. This should probably be an option, but lets start +with a minimal change. + +(cherry picked from commit 2aa78ade2d48e926b7b04050338ebd8a0c5e3f05 +in virt-v2v) +--- + v2v/v2v.ml | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/v2v/v2v.ml b/v2v/v2v.ml +index d7a868659..a81a2320a 100644 +--- a/v2v/v2v.ml ++++ b/v2v/v2v.ml +@@ -754,6 +754,7 @@ and copy_targets cmdline targets input output = + (if not (quiet ()) then [ "-p" ] else []) @ + [ "-n"; "-f"; "qcow2"; "-O"; t.target_format ] @ + (if cmdline.compressed then [ "-c" ] else []) @ ++ [ "-S"; "64k" ] @ + [ overlay_file; filename ] in + let start_time = gettimeofday () in + if run_command cmd <> 0 then +-- +2.24.1 + diff --git a/SOURCES/0048-v2v-o-rhv-upload-Make-oo-rhv-cafile-optional-in-all-.patch b/SOURCES/0048-v2v-o-rhv-upload-Make-oo-rhv-cafile-optional-in-all-.patch new file mode 100644 index 0000000..adf223a --- /dev/null +++ b/SOURCES/0048-v2v-o-rhv-upload-Make-oo-rhv-cafile-optional-in-all-.patch @@ -0,0 +1,49 @@ +From 49623c945c93b878d13c0539eddf2d625f5aeb3c Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Wed, 15 Jan 2020 11:12:17 +0000 +Subject: [PATCH] v2v: -o rhv-upload: Make -oo rhv-cafile optional in all cases + (RHBZ#1791240). + +This is actually not required, because ovirtsdk4 will use the system's +global trust store if necessary. Therefore we can make it optional in +all cases. + +(cherry picked from commit 65ee9387d4be0e3c5cd214b967fef7a1a8841233 +in virt-v2v) +--- + v2v/output_rhv_upload.ml | 2 -- + v2v/virt-v2v-output-rhv.pod | 5 ++++- + 2 files changed, 4 insertions(+), 3 deletions(-) + +diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml +index 2c8c18732..e1d06867b 100644 +--- a/v2v/output_rhv_upload.ml ++++ b/v2v/output_rhv_upload.ml +@@ -81,8 +81,6 @@ let parse_output_options options = + let rhv_direct = !rhv_direct in + let rhv_verifypeer = !rhv_verifypeer in + let rhv_disk_uuids = Option.map List.rev !rhv_disk_uuids in +- if rhv_verifypeer && rhv_cafile = None then +- error (f_"-o rhv-upload: must use ‘-oo rhv-cafile’ to supply the path to the oVirt or RHV user’s ‘ca.pem’ file"); + + { rhv_cafile; rhv_cluster; rhv_direct; rhv_verifypeer; rhv_disk_uuids } + +diff --git a/v2v/virt-v2v-output-rhv.pod b/v2v/virt-v2v-output-rhv.pod +index 04a894268..4520c9184 100644 +--- a/v2v/virt-v2v-output-rhv.pod ++++ b/v2v/virt-v2v-output-rhv.pod +@@ -101,7 +101,10 @@ The storage domain. + The F file (Certificate Authority), copied from + F on the oVirt engine. + +-This option must be specified if I<-oo rhv-verifypeer> is enabled. ++If I<-oo rhv-verifypeer> is enabled then this option can ++be used to control which CA is used to verify the client’s ++identity. If this option is not used then the system’s ++global trust store is used. + + =item I<-oo rhv-cluster=>C + +-- +2.24.1 + diff --git a/SOURCES/0049-docs-Fix-update-crypto-policies-command-RHBZ-1791257.patch b/SOURCES/0049-docs-Fix-update-crypto-policies-command-RHBZ-1791257.patch new file mode 100644 index 0000000..48722fb --- /dev/null +++ b/SOURCES/0049-docs-Fix-update-crypto-policies-command-RHBZ-1791257.patch @@ -0,0 +1,33 @@ +From 03b67600b98e8af2ea199f8643b2993c1effc60f Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Wed, 15 Jan 2020 10:55:27 +0000 +Subject: [PATCH] docs: Fix update-crypto-policies command (RHBZ#1791257). + +The command as documented was wrong. We need to use the --set option +to change the policy. + +Fixes commit d5cbe7b4bee5dec9e28b1db03e933c97ef6d11e0. +Thanks: Xiaodai Wang + +(cherry picked from commit 0edf419e983fe75daef9eaa7bd0578cbcada2e73 +in virt-v2v) +--- + v2v/virt-v2v-input-xen.pod | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/virt-v2v-input-xen.pod b/v2v/virt-v2v-input-xen.pod +index 4bb5d2dc2..9fd5065f1 100644 +--- a/v2v/virt-v2v-input-xen.pod ++++ b/v2v/virt-v2v-input-xen.pod +@@ -37,7 +37,7 @@ to interoperate with RHEL 5 sshd are disabled. To enable them you may + need to run this command on the conversion server (ie. ssh client), + but read L first: + +- # update-crypto-policies LEGACY ++ # update-crypto-policies --set LEGACY + + =head2 Test libvirt connection to remote Xen host + +-- +2.24.1 + diff --git a/SOURCES/0050-add-versioned-directory-for-guest-agent-on-EL8.patch b/SOURCES/0050-add-versioned-directory-for-guest-agent-on-EL8.patch new file mode 100644 index 0000000..4f34a08 --- /dev/null +++ b/SOURCES/0050-add-versioned-directory-for-guest-agent-on-EL8.patch @@ -0,0 +1,35 @@ +From ebc6680ab1030c763a6c4764f6045734c41f0e7f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Golembiovsk=C3=BD?= +Date: Thu, 16 Jan 2020 16:05:10 +0100 +Subject: [PATCH] add versioned directory for guest agent on EL8 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +There was no source directory for EL8 guest agent (only EL6 and EL7). + +RHBZ#1791802 + +Signed-off-by: Tomáš Golembiovský + +(cherry picked from commit 79dd6a6bbb7e95691be18f54d601318d7d713702 +in virt-v2v) +--- + v2v/windows_virtio.ml | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/v2v/windows_virtio.ml b/v2v/windows_virtio.ml +index a6dc29f2c..7be63a316 100644 +--- a/v2v/windows_virtio.ml ++++ b/v2v/windows_virtio.ml +@@ -192,6 +192,7 @@ and install_linux_tools g inspect = + (match inspect.i_major_version with + | 6 -> Some "el6" + | 7 -> Some "el7" ++ | 8 -> Some "el8" + | _ -> None) + | "sles" | "suse-based" | "opensuse" -> Some "lp151" + | _ -> None in +-- +2.24.1 + diff --git a/SOURCES/0051-v2v-fix-path-to-source-when-copying-files-from-guest.patch b/SOURCES/0051-v2v-fix-path-to-source-when-copying-files-from-guest.patch new file mode 100644 index 0000000..af269e5 --- /dev/null +++ b/SOURCES/0051-v2v-fix-path-to-source-when-copying-files-from-guest.patch @@ -0,0 +1,41 @@ +From 1d0a22aa3f950330b0cf9c5e874642b5a02edf17 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Golembiovsk=C3=BD?= +Date: Fri, 8 Feb 2019 11:44:41 +0100 +Subject: [PATCH] v2v: fix path to source when copying files from guest tools + directory +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The debug message was slightly changed too to better match the similar +message for ISO case. It refers to the root directory instead of the +specific subdirectory inside guest tools. + +Signed-off-by: Tomáš Golembiovský +(cherry picked from commit f4bda5571a36da42bdc800c10f2c85cf20bf5c85) +--- + v2v/windows_virtio.ml | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/v2v/windows_virtio.ml b/v2v/windows_virtio.ml +index 7be63a316..70f0bf09d 100644 +--- a/v2v/windows_virtio.ml ++++ b/v2v/windows_virtio.ml +@@ -309,10 +309,11 @@ and copy_drivers g inspect driverdir = + and copy_from_virtio_win g inspect srcdir destdir filter missing = + let ret = ref [] in + if is_directory virtio_win then ( +- let dir = virtio_win // srcdir in +- debug "windows: copy_from_virtio_win: guest tools source directory %s" dir; ++ debug "windows: copy_from_virtio_win: guest tools source directory %s" ++ virtio_win; + +- if not (is_directory srcdir) then missing () ++ let dir = virtio_win // srcdir in ++ if not (is_directory dir) then missing () + else ( + let cmd = sprintf "cd %s && find -L -type f" (quote dir) in + let paths = external_command cmd in +-- +2.24.1 + diff --git a/SOURCES/0052-v2v-windows-install-QEMU-Guest-Agent-MSI.patch b/SOURCES/0052-v2v-windows-install-QEMU-Guest-Agent-MSI.patch new file mode 100644 index 0000000..27eb48f --- /dev/null +++ b/SOURCES/0052-v2v-windows-install-QEMU-Guest-Agent-MSI.patch @@ -0,0 +1,119 @@ +From c664b50ab691a85d8a827ba51ea767744da548c3 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Golembiovsk=C3=BD?= +Date: Tue, 8 Oct 2019 13:16:38 +0200 +Subject: [PATCH] v2v: windows: install QEMU Guest Agent MSI +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Use firstboot script to install MSI with QEMU-GA from virtio-win ISO or +oVirt/RHV guest tools ISO. + +Signed-off-by: Tomáš Golembiovský +(cherry picked from commit 00b4ed312b0ba179e9901b73c099724c3f6606b4) +--- + v2v/convert_windows.ml | 19 +++++++++++++++++++ + v2v/windows_virtio.ml | 27 +++++++++++++++++++++++++++ + v2v/windows_virtio.mli | 4 ++++ + 3 files changed, 50 insertions(+) + +diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml +index 75e609d61..bdb0092c3 100644 +--- a/v2v/convert_windows.ml ++++ b/v2v/convert_windows.ml +@@ -293,6 +293,13 @@ let convert (g : G.guestfs) inspect source output rcaps static_ips = + if Sys.file_exists tool_path then + configure_vmdp tool_path; + ++ (* Install QEMU Guest Agent unconditionally and warn if missing *) ++ let qemu_ga_files = Windows_virtio.copy_qemu_ga g inspect in ++ if qemu_ga_files <> [] then ++ configure_qemu_ga qemu_ga_files ++ else ++ warning (f_"QEMU Guest Agent MSI not found on tools ISO/directory. You may want to install the guest agent manually after conversion."); ++ + unconfigure_xenpv (); + unconfigure_prltools (); + unconfigure_vmwaretools () +@@ -418,6 +425,18 @@ popd + Firstboot.add_firstboot_script g inspect.i_root + "finish vmdp setup" fb_recover_script + ++ and configure_qemu_ga files = ++ List.iter ( ++ fun msi_path -> ++ let fb_script = "\ ++echo Installing qemu-ga from " ^ msi_path ^ " ++\"\\" ^ msi_path ^ "\" /qn /forcerestart /l+*vx \"%cd%\\qemu-ga.log\" ++" in ++ Firstboot.add_firstboot_script g inspect.i_root ++ ("install " ^ msi_path) fb_script; ++ ) files ++ ++ + and unconfigure_xenpv () = + match xenpv_uninst with + | None -> () (* nothing to be uninstalled *) +diff --git a/v2v/windows_virtio.ml b/v2v/windows_virtio.ml +index 70f0bf09d..ea7e5c02d 100644 +--- a/v2v/windows_virtio.ml ++++ b/v2v/windows_virtio.ml +@@ -296,6 +296,13 @@ and copy_drivers g inspect driverdir = + (fun () -> + error (f_"root directory ‘/’ is missing from the virtio-win directory or ISO.\n\nThis should not happen and may indicate that virtio-win or virt-v2v is broken in some way. Please report this as a bug with a full debug log.")) + ++and copy_qemu_ga g inspect = ++ copy_from_virtio_win g inspect "/" "/" ++ virtio_iso_path_matches_qemu_ga ++ (fun () -> ++ error (f_"root directory ‘/’ is missing from the virtio-win directory or ISO.\n\nThis should not happen and may indicate that virtio-win or virt-v2v is broken in some way. Please report this as a bug with a full debug log.")) ++ ++ + (* Copy all files from virtio_win directory/ISO located in [srcdir] + * subdirectory and all its subdirectories to the [destdir]. The directory + * hierarchy is not preserved, meaning all files will be directly in [destdir]. +@@ -427,6 +434,26 @@ and virtio_iso_path_matches_guest_os path inspect = + + with Not_found -> false + ++(* Given a path of a file relative to the root of the directory tree ++ * with virtio-win drivers, figure out if it's suitable for the ++ * specific Windows flavor of the current guest. ++ *) ++and virtio_iso_path_matches_qemu_ga path inspect = ++ let { i_arch = arch } = inspect in ++ (* Lowercased path, since the ISO may contain upper or lowercase path ++ * elements. ++ *) ++ let lc_name = String.lowercase_ascii (Filename.basename path) in ++ lc_name = "rhev-qga.msi" || ++ match arch, lc_name with ++ | ("i386", "qemu-ga-x86.msi") ++ | ("i386", "qemu-ga-i386.msi") ++ | ("i386", "RHEV-QGA.msi") ++ | ("x86_64", "qemu-ga-x64.msi") ++ | ("x86_64", "qemu-ga-x86_64.msi") ++ | ("x86_64", "RHEV-QGA64.msi") -> true ++ | _ -> false ++ + (* The following function is only exported for unit tests. *) + module UNIT_TESTS = struct + let virtio_iso_path_matches_guest_os = virtio_iso_path_matches_guest_os +diff --git a/v2v/windows_virtio.mli b/v2v/windows_virtio.mli +index ae3b7e865..731dbd6f0 100644 +--- a/v2v/windows_virtio.mli ++++ b/v2v/windows_virtio.mli +@@ -44,6 +44,10 @@ val install_linux_tools : Guestfs.guestfs -> Types.inspect -> unit + (** installs QEMU Guest Agent on Linux guest OS from the driver directory or + driver ISO. It is not fatal if we fail to install the agent. *) + ++val copy_qemu_ga : Guestfs.guestfs -> Types.inspect -> string list ++(** copy MSIs (idealy just one) with QEMU Guest Agent to Windows guest. The ++ MSIs are not installed by this function. *) ++ + (**/**) + + (* The following function is only exported for unit tests. *) +-- +2.24.1 + diff --git a/SOURCES/0053-windows-small-tweaks-of-qemu-ga-firstboot-script.patch b/SOURCES/0053-windows-small-tweaks-of-qemu-ga-firstboot-script.patch new file mode 100644 index 0000000..9827b49 --- /dev/null +++ b/SOURCES/0053-windows-small-tweaks-of-qemu-ga-firstboot-script.patch @@ -0,0 +1,42 @@ +From b5e6c21a8241b3040c772f5ecd93a23a1896dc53 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Golembiovsk=C3=BD?= +Date: Wed, 5 Feb 2020 14:11:36 +0100 +Subject: [PATCH] windows: small tweaks of qemu-ga firstboot script +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +- match log file with script name +- restart manually only after successfull install, this also helps + debugging because we can log the installer return code + +Signed-off-by: Tomáš Golembiovský + +(cherry picked from commit 59f9ff40621240a6eed28c4425d3d69d8b21bc0e +in virt-v2v) +--- + v2v/convert_windows.ml | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml +index bdb0092c3..43c1f85de 100644 +--- a/v2v/convert_windows.ml ++++ b/v2v/convert_windows.ml +@@ -430,7 +430,13 @@ popd + fun msi_path -> + let fb_script = "\ + echo Installing qemu-ga from " ^ msi_path ^ " +-\"\\" ^ msi_path ^ "\" /qn /forcerestart /l+*vx \"%cd%\\qemu-ga.log\" ++\"\\" ^ msi_path ^ "\" /norestart /qn /l+*vx \"%~dpn0.log\" ++set elvl=!errorlevel! ++echo Done installing qemu-ga error_level=!elvl! ++if !elvl! == 0 ( ++ echo Restarting Windows... ++ shutdown /r /f /c \"rebooted by firstboot script\" ++) + " in + Firstboot.add_firstboot_script g inspect.i_root + ("install " ^ msi_path) fb_script; +-- +2.24.1 + diff --git a/SOURCES/0054-windows-fix-detection-of-qemu-ga-installer-on-RHV.patch b/SOURCES/0054-windows-fix-detection-of-qemu-ga-installer-on-RHV.patch new file mode 100644 index 0000000..1dd44dd --- /dev/null +++ b/SOURCES/0054-windows-fix-detection-of-qemu-ga-installer-on-RHV.patch @@ -0,0 +1,43 @@ +From 34305aa93b6107c0aa9efcb1197efae3675a4ffe Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Golembiovsk=C3=BD?= +Date: Wed, 5 Feb 2020 14:11:35 +0100 +Subject: [PATCH] windows: fix detection of qemu-ga installer on RHV +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The detection was incorrectly matching only 32-bit installer on all +architectures. + +Signed-off-by: Tomáš Golembiovský + +(cherry picked from commit 45acf8d0557bee948c035305a6bafc6c9963a467 +in virt-v2v) +--- + v2v/windows_virtio.ml | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/v2v/windows_virtio.ml b/v2v/windows_virtio.ml +index ea7e5c02d..9a7297344 100644 +--- a/v2v/windows_virtio.ml ++++ b/v2v/windows_virtio.ml +@@ -444,14 +444,13 @@ and virtio_iso_path_matches_qemu_ga path inspect = + * elements. + *) + let lc_name = String.lowercase_ascii (Filename.basename path) in +- lc_name = "rhev-qga.msi" || + match arch, lc_name with + | ("i386", "qemu-ga-x86.msi") + | ("i386", "qemu-ga-i386.msi") +- | ("i386", "RHEV-QGA.msi") ++ | ("i386", "rhev-qga.msi") + | ("x86_64", "qemu-ga-x64.msi") + | ("x86_64", "qemu-ga-x86_64.msi") +- | ("x86_64", "RHEV-QGA64.msi") -> true ++ | ("x86_64", "rhev-qga64.msi") -> true + | _ -> false + + (* The following function is only exported for unit tests. *) +-- +2.24.1 + diff --git a/SOURCES/0055-windows-delay-installation-of-qemu-ga-MSI.patch b/SOURCES/0055-windows-delay-installation-of-qemu-ga-MSI.patch new file mode 100644 index 0000000..6e956ea --- /dev/null +++ b/SOURCES/0055-windows-delay-installation-of-qemu-ga-MSI.patch @@ -0,0 +1,67 @@ +From 34a8b1a7115aeb95812ae8ee182055de757f3892 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Golembiovsk=C3=BD?= +Date: Thu, 5 Mar 2020 15:37:13 +0100 +Subject: [PATCH] windows: delay installation of qemu-ga MSI +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Instead of running firstboot script during early boot schedule a task +delayed for 2 minutes. + +During the first boot, after virt-v2v conversion, Windows installs the +drivers injected by virt-v2v. When this installation is finished +Windows enforces some kind of internal reboot. This unfortunately +terminates any running firstboot scripts thus killing the installation +of qemu-ga MSI. + +This is just a best-effort mitigation. It can still happen (e.g. with +slow disk drives) that the drivers are not yet installed when the +delayed installation starts. On the other hand we cannot delay it too +much otherwise we risk that the users logs in and will be doing some +work when the MSI installation starts. After MSI installation finishes +the VM needs to be rebooted which would be annoying if that would happen +under users hands. Although this is not a best fix (that may come later +as it is more complex, e.g. introducing waiting mechanism), the delay as +it is defined works in most cases. And it dramaticaly improves the +situations -- originaly I experienced more than 90% failure rate. + +Signed-off-by: Tomáš Golembiovský + +(cherry picked from commit dc66e78fa37db33e3c7358b7f7c7fa809cf62f9d +in virt-v2v) +--- + v2v/convert_windows.ml | 17 +++++++---------- + 1 file changed, 7 insertions(+), 10 deletions(-) + +diff --git a/v2v/convert_windows.ml b/v2v/convert_windows.ml +index 43c1f85de..088cd33d9 100644 +--- a/v2v/convert_windows.ml ++++ b/v2v/convert_windows.ml +@@ -428,16 +428,13 @@ popd + and configure_qemu_ga files = + List.iter ( + fun msi_path -> +- let fb_script = "\ +-echo Installing qemu-ga from " ^ msi_path ^ " +-\"\\" ^ msi_path ^ "\" /norestart /qn /l+*vx \"%~dpn0.log\" +-set elvl=!errorlevel! +-echo Done installing qemu-ga error_level=!elvl! +-if !elvl! == 0 ( +- echo Restarting Windows... +- shutdown /r /f /c \"rebooted by firstboot script\" +-) +-" in ++ let fb_script = sprintf "\ ++echo Removing any previously scheduled qemu-ga installation ++schtasks.exe /Delete /TN Firstboot-qemu-ga /F ++echo Scheduling delayed installation of qemu-ga from %s ++powershell.exe -command \"$d = (get-date).AddSeconds(120); schtasks.exe /Create /SC ONCE /ST $d.ToString('HH:mm') /SD $d.ToString('MM/dd/yyyy') /RU SYSTEM /TN Firstboot-qemu-ga /TR \\\"C:\\%s /forcerestart /qn /l+*vx C:\\%s.log\\\"\" ++ " ++ msi_path msi_path msi_path in + Firstboot.add_firstboot_script g inspect.i_root + ("install " ^ msi_path) fb_script; + ) files +-- +2.24.1 + diff --git a/SOURCES/0056-RHEL-8-Remove-libguestfs-live-RHBZ-798980.patch b/SOURCES/0056-RHEL-8-Remove-libguestfs-live-RHBZ-798980.patch new file mode 100644 index 0000000..e458c77 --- /dev/null +++ b/SOURCES/0056-RHEL-8-Remove-libguestfs-live-RHBZ-798980.patch @@ -0,0 +1,38 @@ +From f9ceb4fd65f882c9e6aad6310567ce40d19c4070 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Fri, 21 Dec 2012 15:50:11 +0000 +Subject: [PATCH] RHEL 8: Remove libguestfs live (RHBZ#798980). + +This isn't supported in RHEL 8. +--- + lib/launch-unix.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/lib/launch-unix.c b/lib/launch-unix.c +index 4794a7b13..993b83601 100644 +--- a/lib/launch-unix.c ++++ b/lib/launch-unix.c +@@ -37,6 +37,12 @@ + static int + launch_unix (guestfs_h *g, void *datav, const char *sockpath) + { ++ error (g, ++ "launch: In RHEL, only the 'libvirt' or 'direct' method is supported.\n" ++ "In particular, \"libguestfs live\" is not supported."); ++ return -1; ++ ++#if 0 + int r, daemon_sock = -1; + struct sockaddr_un addr; + uint32_t size; +@@ -106,6 +112,7 @@ launch_unix (guestfs_h *g, void *datav, const char *sockpath) + g->conn = NULL; + } + return -1; ++#endif + } + + static int +-- +2.24.1 + diff --git a/SOURCES/0057-RHEL-8-Remove-9p-APIs-from-RHEL-RHBZ-921710.patch b/SOURCES/0057-RHEL-8-Remove-9p-APIs-from-RHEL-RHBZ-921710.patch new file mode 100644 index 0000000..d8d37fd --- /dev/null +++ b/SOURCES/0057-RHEL-8-Remove-9p-APIs-from-RHEL-RHBZ-921710.patch @@ -0,0 +1,372 @@ +From 468bfa7cb5db1294310c0193e51bc5a20092f4ce Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 18 Jul 2013 18:31:53 +0100 +Subject: [PATCH] RHEL 8: Remove 9p APIs from RHEL (RHBZ#921710). + +--- + Makefile.am | 2 +- + daemon/9p.c | 224 -------------------------------------- + daemon/Makefile.am | 1 - + docs/C_SOURCE_FILES | 1 - + generator/actions_core.ml | 21 ---- + generator/proc_nr.ml | 2 - + gobject/Makefile.inc | 2 - + po/POTFILES | 2 - + 8 files changed, 1 insertion(+), 254 deletions(-) + delete mode 100644 daemon/9p.c + +diff --git a/Makefile.am b/Makefile.am +index 0067d7b7b..e9351eadc 100644 +--- a/Makefile.am ++++ b/Makefile.am +@@ -78,7 +78,7 @@ SUBDIRS += tests/xfs + SUBDIRS += tests/charsets + SUBDIRS += tests/xml + SUBDIRS += tests/mount-local +-SUBDIRS += tests/9p ++#SUBDIRS += tests/9p + SUBDIRS += tests/rsync + SUBDIRS += tests/bigdirs + SUBDIRS += tests/disk-labels +diff --git a/daemon/9p.c b/daemon/9p.c +deleted file mode 100644 +index 55644249d..000000000 +--- a/daemon/9p.c ++++ /dev/null +@@ -1,224 +0,0 @@ +-/* libguestfs - the guestfsd daemon +- * Copyright (C) 2011 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. +- */ +- +-#include +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#include "daemon.h" +-#include "actions.h" +- +-#define BUS_PATH "/sys/bus/virtio/drivers/9pnet_virtio" +- +-static char *read_whole_file (const char *filename); +- +-/* https://bugzilla.redhat.com/show_bug.cgi?id=714981#c1 */ +-char ** +-do_list_9p (void) +-{ +- CLEANUP_FREE_STRINGSBUF DECLARE_STRINGSBUF (r); +- +- DIR *dir; +- +- dir = opendir (BUS_PATH); +- if (!dir) { +- perror ("opendir: " BUS_PATH); +- if (errno != ENOENT) { +- reply_with_perror ("opendir: " BUS_PATH); +- return NULL; +- } +- +- /* If this directory doesn't exist, it probably means that +- * the virtio driver isn't loaded. Don't return an error +- * in this case, but return an empty list. +- */ +- if (end_stringsbuf (&r) == -1) +- return NULL; +- +- return take_stringsbuf (&r); +- } +- +- while (1) { +- struct dirent *d; +- +- errno = 0; +- d = readdir (dir); +- if (d == NULL) break; +- +- if (STRPREFIX (d->d_name, "virtio")) { +- CLEANUP_FREE char *mount_tag_path = NULL; +- if (asprintf (&mount_tag_path, BUS_PATH "/%s/mount_tag", +- d->d_name) == -1) { +- reply_with_perror ("asprintf"); +- closedir (dir); +- return NULL; +- } +- +- /* A bit unclear, but it looks like the virtio transport allows +- * the mount tag length to be unlimited (or up to 65536 bytes). +- * See: linux/include/linux/virtio_9p.h +- */ +- CLEANUP_FREE char *mount_tag = read_whole_file (mount_tag_path); +- if (mount_tag == 0) +- continue; +- +- if (add_string (&r, mount_tag) == -1) { +- closedir (dir); +- return NULL; +- } +- } +- } +- +- /* Check readdir didn't fail */ +- if (errno != 0) { +- reply_with_perror ("readdir: /sys/block"); +- closedir (dir); +- return NULL; +- } +- +- /* Close the directory handle */ +- if (closedir (dir) == -1) { +- reply_with_perror ("closedir: /sys/block"); +- return NULL; +- } +- +- /* Sort the tags. */ +- if (r.size > 0) +- sort_strings (r.argv, r.size); +- +- /* NULL terminate the list */ +- if (end_stringsbuf (&r) == -1) +- return NULL; +- +- return take_stringsbuf (&r); +-} +- +-/* Read whole file into dynamically allocated array. If there is an +- * error, DON'T call reply_with_perror, just return NULL. Returns a +- * \0-terminated string. +- */ +-static char * +-read_whole_file (const char *filename) +-{ +- char *r = NULL; +- size_t alloc = 0, size = 0; +- int fd; +- +- fd = open (filename, O_RDONLY|O_CLOEXEC); +- if (fd == -1) { +- perror (filename); +- return NULL; +- } +- +- while (1) { +- alloc += 256; +- char *r2 = realloc (r, alloc); +- if (r2 == NULL) { +- perror ("realloc"); +- free (r); +- close (fd); +- return NULL; +- } +- r = r2; +- +- /* The '- 1' in the size calculation ensures there is space below +- * to add \0 to the end of the input. +- */ +- ssize_t n = read (fd, r + size, alloc - size - 1); +- if (n == -1) { +- fprintf (stderr, "read: %s: %m\n", filename); +- free (r); +- close (fd); +- return NULL; +- } +- if (n == 0) +- break; +- size += n; +- } +- +- if (close (fd) == -1) { +- fprintf (stderr, "close: %s: %m\n", filename); +- free (r); +- return NULL; +- } +- +- r[size] = '\0'; +- +- return r; +-} +- +-/* Takes optional arguments, consult optargs_bitmask. */ +-int +-do_mount_9p (const char *mount_tag, const char *mountpoint, const char *options) +-{ +- CLEANUP_FREE char *mp = NULL, *opts = NULL, *err = NULL; +- struct stat statbuf; +- int r; +- +- ABS_PATH (mountpoint, 0, return -1); +- +- mp = sysroot_path (mountpoint); +- if (!mp) { +- reply_with_perror ("malloc"); +- return -1; +- } +- +- /* Check the mountpoint exists and is a directory. */ +- if (stat (mp, &statbuf) == -1) { +- reply_with_perror ("%s", mountpoint); +- return -1; +- } +- if (!S_ISDIR (statbuf.st_mode)) { +- reply_with_perror ("%s: mount point is not a directory", mountpoint); +- return -1; +- } +- +- /* Add trans=virtio to the options. */ +- if ((optargs_bitmask & GUESTFS_MOUNT_9P_OPTIONS_BITMASK) && +- STRNEQ (options, "")) { +- if (asprintf (&opts, "trans=virtio,%s", options) == -1) { +- reply_with_perror ("asprintf"); +- return -1; +- } +- } +- else { +- opts = strdup ("trans=virtio"); +- if (opts == NULL) { +- reply_with_perror ("strdup"); +- return -1; +- } +- } +- +- r = command (NULL, &err, +- "mount", "-o", opts, "-t", "9p", mount_tag, mp, NULL); +- if (r == -1) { +- reply_with_error ("%s on %s: %s", mount_tag, mountpoint, err); +- return -1; +- } +- +- return 0; +-} +diff --git a/daemon/Makefile.am b/daemon/Makefile.am +index 5d1c222db..a9b40be25 100644 +--- a/daemon/Makefile.am ++++ b/daemon/Makefile.am +@@ -76,7 +76,6 @@ guestfsd_SOURCES = \ + ../common/protocol/guestfs_protocol.h \ + ../common/utils/cleanups.h \ + ../common/utils/guestfs-utils.h \ +- 9p.c \ + acl.c \ + actions.h \ + available.c \ +diff --git a/docs/C_SOURCE_FILES b/docs/C_SOURCE_FILES +index 7f1c60b30..f45e7124d 100644 +--- a/docs/C_SOURCE_FILES ++++ b/docs/C_SOURCE_FILES +@@ -71,7 +71,6 @@ common/windows/windows.h + customize/crypt-c.c + customize/dummy.c + customize/perl_edit-c.c +-daemon/9p.c + daemon/acl.c + daemon/actions.h + daemon/augeas.c +diff --git a/generator/actions_core.ml b/generator/actions_core.ml +index deda483a9..f466600df 100644 +--- a/generator/actions_core.ml ++++ b/generator/actions_core.ml +@@ -6167,27 +6167,6 @@ This returns true iff the device exists and contains all zero bytes. + + Note that for large devices this can take a long time to run." }; + +- { defaults with +- name = "list_9p"; added = (1, 11, 12); +- style = RStringList (RPlainString, "mounttags"), [], []; +- shortdesc = "list 9p filesystems"; +- longdesc = "\ +-List all 9p filesystems attached to the guest. A list of +-mount tags is returned." }; +- +- { defaults with +- name = "mount_9p"; added = (1, 11, 12); +- style = RErr, [String (PlainString, "mounttag"); String (PlainString, "mountpoint")], [OString "options"]; +- camel_name = "Mount9P"; +- shortdesc = "mount 9p filesystem"; +- longdesc = "\ +-Mount the virtio-9p filesystem with the tag C on the +-directory C. +- +-If required, C will be automatically added to the options. +-Any other options required can be passed in the optional C +-parameter." }; +- + { defaults with + name = "list_dm_devices"; added = (1, 11, 15); + style = RStringList (RDevice, "devices"), [], []; +diff --git a/generator/proc_nr.ml b/generator/proc_nr.ml +index 11a557076..1ef5ba0b7 100644 +--- a/generator/proc_nr.ml ++++ b/generator/proc_nr.ml +@@ -295,8 +295,6 @@ let proc_nr = [ + 282, "internal_autosync"; + 283, "is_zero"; + 284, "is_zero_device"; +-285, "list_9p"; +-286, "mount_9p"; + 287, "list_dm_devices"; + 288, "ntfsresize"; + 289, "btrfs_filesystem_resize"; +diff --git a/gobject/Makefile.inc b/gobject/Makefile.inc +index 067f861a9..7afe83c59 100644 +--- a/gobject/Makefile.inc ++++ b/gobject/Makefile.inc +@@ -93,7 +93,6 @@ guestfs_gobject_headers= \ + include/guestfs-gobject/optargs-mksquashfs.h \ + include/guestfs-gobject/optargs-mkswap.h \ + include/guestfs-gobject/optargs-mktemp.h \ +- include/guestfs-gobject/optargs-mount_9p.h \ + include/guestfs-gobject/optargs-mount_local.h \ + include/guestfs-gobject/optargs-ntfsclone_out.h \ + include/guestfs-gobject/optargs-ntfsfix.h \ +@@ -186,7 +185,6 @@ guestfs_gobject_sources= \ + src/optargs-mksquashfs.c \ + src/optargs-mkswap.c \ + src/optargs-mktemp.c \ +- src/optargs-mount_9p.c \ + src/optargs-mount_local.c \ + src/optargs-ntfsclone_out.c \ + src/optargs-ntfsfix.c \ +diff --git a/po/POTFILES b/po/POTFILES +index 79f4b8c56..b99333d0d 100644 +--- a/po/POTFILES ++++ b/po/POTFILES +@@ -58,7 +58,6 @@ customize/crypt-c.c + customize/dummy.c + customize/perl_edit-c.c + customize/test-password.pl +-daemon/9p.c + daemon/acl.c + daemon/augeas.c + daemon/available.c +@@ -291,7 +290,6 @@ gobject/src/optargs-mkfs_btrfs.c + gobject/src/optargs-mksquashfs.c + gobject/src/optargs-mkswap.c + gobject/src/optargs-mktemp.c +-gobject/src/optargs-mount_9p.c + gobject/src/optargs-mount_local.c + gobject/src/optargs-ntfsclone_out.c + gobject/src/optargs-ntfsfix.c +-- +2.24.1 + diff --git a/SOURCES/0058-RHEL-8-Disable-unsupported-remote-drive-protocols-RH.patch b/SOURCES/0058-RHEL-8-Disable-unsupported-remote-drive-protocols-RH.patch new file mode 100644 index 0000000..0e9b8d4 --- /dev/null +++ b/SOURCES/0058-RHEL-8-Disable-unsupported-remote-drive-protocols-RH.patch @@ -0,0 +1,609 @@ +From d20dddb121c5f367cbec71639a64c4fca6737bf2 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Mon, 29 Jul 2013 14:47:56 +0100 +Subject: [PATCH] RHEL 8: Disable unsupported remote drive protocols + (RHBZ#962113). + +This disables support for unsupported remote drive protocols: + + * ftp + * 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 8. +--- + 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(-) + +diff --git a/docs/guestfs-testing.pod b/docs/guestfs-testing.pod +index f558964bf..8f264ed17 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 f1fdf094d..bacb60e0b 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 + +@@ -1145,12 +1145,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. + +@@ -1160,40 +1160,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> +- +-=head2 B<-a tftp://[user@]example.com[:port]/disk.img> +- +-Add a disk located on a remote FTP, HTTP or TFTP server. +- +-The equivalent API command would be: +- +- > 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, and may be C. +- +-The equivalent API command would be: +- +- > 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. +- +-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> +@@ -1228,35 +1194,13 @@ The equivalent API command would be: + + > 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: +- +- > 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 +-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 756df997b..8f84fd31b 100755 +--- a/fish/test-add-uri.sh ++++ b/fish/test-add-uri.sh +@@ -40,14 +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 +- +-# gluster +-$VG guestfish -x -a gluster://example.com/disk 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 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 + $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 + +-# sheepdog +-$VG guestfish -x -a sheepdog:///volume/image 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 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 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 f466600df..3893d0e8d 100644 +--- a/generator/actions_core.ml ++++ b/generator/actions_core.ml +@@ -297,29 +297,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, HTTP or TFTP server. +-The C parameter must also be supplied - see below. +- +-See also: L +- +-=item C +- +-Connect to the GlusterFS 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. +@@ -336,22 +313,6 @@ The C parameter may be supplied. See below. + + See also: L. + +-=item C +- +-Connect to the Sheepdog server. +-The C parameter may also 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 +@@ -362,13 +323,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 +- 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: +@@ -384,10 +340,10 @@ for the protocol is used (see F). + + =item C + +-For the C, 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 82ef30093..3d712c6e4 100644 +--- a/lib/drives.c ++++ b/lib/drives.c +@@ -165,6 +165,7 @@ 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) +@@ -223,6 +224,7 @@ create_drive_gluster (guestfs_h *g, + + return create_drive_non_file (g, data); + } ++#endif /* DISABLED IN RHEL 8 */ + + static int + nbd_port (void) +@@ -291,6 +293,7 @@ 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) +@@ -391,6 +394,7 @@ create_drive_iscsi (guestfs_h *g, + + return create_drive_non_file (g, data); + } ++#endif /* DISABLED IN RHEL 8 */ + + /** + * Create the special F drive. +@@ -826,6 +830,7 @@ 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); +@@ -850,6 +855,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, "nbd")) { + data.protocol = drive_protocol_nbd; + drv = create_drive_nbd (g, &data); +@@ -858,6 +864,7 @@ 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); +@@ -870,6 +877,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 { + error (g, _("unknown protocol ‘%s’"), protocol); + drv = NULL; /*FALLTHROUGH*/ +diff --git a/lib/guestfs.pod b/lib/guestfs.pod +index af944ddb7..58559a6b4 100644 +--- a/lib/guestfs.pod ++++ b/lib/guestfs.pod +@@ -714,70 +714,6 @@ servers. The server string is documented in + L. The C and C parameters are + also optional, and if not given, then no authentication will be used. + +-=head3 FTP, HTTP AND TFTP +- +-Libguestfs can access remote disks over FTP, FTPS, HTTP, HTTPS +-or TFTP 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">, +-C<"https"> or C<"tftp">. +- +-C (the C 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 +-L. +- +-=head3 GLUSTER +- +-Libguestfs can access Gluster disks. +- +-To do this, set the optional C and C parameters of +-L 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 (the C 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. +- +-Note that gluster usually requires the client process (ie. libguestfs) +-to run as B and will give unfathomable errors if it is not +-(eg. "No data available"). +- +-=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. +@@ -840,42 +776,6 @@ L + + =back + +-=head3 SHEEPDOG +- +-Libguestfs can access Sheepdog disks. +- +-To do this, set the optional C and C parameters of +-L 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 may be zero or more server addresses +-(C<"hostname:port">). The format of the server strings is documented +-in L. +- +-=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 e49c69b43..9b1abc4ec 100755 +--- a/tests/disks/test-qemu-drive-libvirt.sh ++++ b/tests/disks/test-qemu-drive-libvirt.sh +@@ -64,34 +64,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 ||: +-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 ||: +-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. + + $guestfish -d pool1 run ||: +diff --git a/tests/disks/test-qemu-drive.sh b/tests/disks/test-qemu-drive.sh +index 19dd60a2f..583e031bd 100755 +--- a/tests/disks/test-qemu-drive.sh ++++ b/tests/disks/test-qemu-drive.sh +@@ -62,45 +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 < +Date: Fri, 19 Sep 2014 13:38:20 +0100 +Subject: [PATCH] RHEL 8: Remove User-Mode Linux (RHBZ#1144197). + +This isn't supported in RHEL 8. +--- + lib/launch-uml.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +diff --git a/lib/launch-uml.c b/lib/launch-uml.c +index da20c17d9..a5e0e8179 100644 +--- a/lib/launch-uml.c ++++ b/lib/launch-uml.c +@@ -44,7 +44,9 @@ struct backend_uml_data { + char umid[UML_UMID_LEN+1]; /* umid=<...> unique ID. */ + }; + ++#if 0 + static void print_vmlinux_command_line (guestfs_h *g, char **argv); ++#endif + + /* Run uml_mkcow to create a COW overlay. */ + static char * +@@ -81,6 +83,7 @@ create_cow_overlay_uml (guestfs_h *g, void *datav, struct drive *drv) + return make_cow_overlay (g, drv->src.u.path); + } + ++#if 0 + /* Test for features which are not supported by the UML backend. + * Possibly some of these should just be warnings, not errors. + */ +@@ -128,10 +131,17 @@ uml_supported (guestfs_h *g) + + return true; + } ++#endif + + static int + launch_uml (guestfs_h *g, void *datav, const char *arg) + { ++ error (g, ++ "launch: In RHEL, only the 'libvirt' or 'direct' method is supported.\n" ++ "In particular, User-Mode Linux (UML) is not supported."); ++ return -1; ++ ++#if 0 + struct backend_uml_data *data = datav; + CLEANUP_FREE_STRINGSBUF DECLARE_STRINGSBUF (cmdline); + int console_sock = -1, daemon_sock = -1; +@@ -491,8 +501,10 @@ launch_uml (guestfs_h *g, void *datav, const char *arg) + } + g->state = CONFIG; + return -1; ++#endif + } + ++#if 0 + /* This is called from the forked subprocess just before vmlinux runs, + * so it can just print the message straight to stderr, where it will + * be picked up and funnelled through the usual appliance event API. +@@ -522,6 +534,7 @@ print_vmlinux_command_line (guestfs_h *g, char **argv) + + fputc ('\n', stderr); + } ++#endif + + static int + shutdown_uml (guestfs_h *g, void *datav, int check_for_errors) +-- +2.24.1 + diff --git a/SOURCES/0060-RHEL-8-v2v-Select-correct-qemu-binary-for-o-qemu-mod.patch b/SOURCES/0060-RHEL-8-v2v-Select-correct-qemu-binary-for-o-qemu-mod.patch new file mode 100644 index 0000000..855372d --- /dev/null +++ b/SOURCES/0060-RHEL-8-v2v-Select-correct-qemu-binary-for-o-qemu-mod.patch @@ -0,0 +1,33 @@ +From 699137c5c84439597757f8c00373ebb53544223b Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Sun, 28 Sep 2014 19:14:43 +0100 +Subject: [PATCH] RHEL 8: v2v: Select correct qemu binary for -o qemu mode + (RHBZ#1147313). + +RHEL 8 does not have qemu-system-x86_64 (etc), and in addition the +qemu binary is located in /usr/libexec. Encode the path to this +binary directly in the script. + +Note that we don't support people running qemu directly like this. +It's just for quick testing of converted VMs, and to help us with +support cases. +--- + v2v/output_qemu.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/output_qemu.ml b/v2v/output_qemu.ml +index 1f6798aaf..8665d7b5c 100644 +--- a/v2v/output_qemu.ml ++++ b/v2v/output_qemu.ml +@@ -81,7 +81,7 @@ object + * module deals with shell and qemu comma quoting. + *) + let cmd = Qemuopts.create () in +- Qemuopts.set_binary_by_arch cmd (Some guestcaps.gcaps_arch); ++ Qemuopts.set_binary cmd "/usr/libexec/qemu-kvm"; + + let flag = Qemuopts.flag cmd + and arg = Qemuopts.arg cmd +-- +2.24.1 + diff --git a/SOURCES/0061-RHEL-8-v2v-Disable-the-qemu-boot-option-RHBZ-1147313.patch b/SOURCES/0061-RHEL-8-v2v-Disable-the-qemu-boot-option-RHBZ-1147313.patch new file mode 100644 index 0000000..7fc57cb --- /dev/null +++ b/SOURCES/0061-RHEL-8-v2v-Disable-the-qemu-boot-option-RHBZ-1147313.patch @@ -0,0 +1,105 @@ +From 839672ac70f58af6ab4a7ff31335efc28b49df57 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 30 Sep 2014 10:50:27 +0100 +Subject: [PATCH] RHEL 8: v2v: Disable the --qemu-boot option (RHBZ#1147313). + +This cannot work because there is no Gtk or SDL output mode +in RHEL 8's qemu-kvm. + +In addition you will have to edit the -display option in the +qemu script. +--- + v2v/cmdline.ml | 3 ++- + v2v/virt-v2v-output-local.pod | 6 ++---- + v2v/virt-v2v.pod | 13 ------------- + 3 files changed, 4 insertions(+), 18 deletions(-) + +diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml +index 686631271..e3578ddcb 100644 +--- a/v2v/cmdline.ml ++++ b/v2v/cmdline.ml +@@ -262,7 +262,6 @@ let parse_cmdline () = + s_"Estimate size of source and stop"; + [ L"print-source" ], Getopt.Set print_source, + s_"Print source and stop"; +- [ L"qemu-boot" ], Getopt.Set qemu_boot, s_"Boot in qemu (-o qemu only)"; + [ L"root" ], Getopt.String ("ask|... ", set_root_choice), + s_"How to choose root filesystem"; + [ L"vddk-config" ], Getopt.String ("filename", set_input_option_compat "vddk-config"), +@@ -640,6 +639,8 @@ read the man page virt-v2v(1). + | Some d when not (is_directory d) -> + error (f_"-os %s: output directory does not exist or is not a directory") d + | Some d -> d in ++ if qemu_boot then ++ error (f_"-o qemu: the --qemu-boot option cannot be used in RHEL"); + Output_qemu.output_qemu os qemu_boot, + output_format, output_alloc + +diff --git a/v2v/virt-v2v-output-local.pod b/v2v/virt-v2v-output-local.pod +index 7c397c0a4..09a11a7b0 100644 +--- a/v2v/virt-v2v-output-local.pod ++++ b/v2v/virt-v2v-output-local.pod +@@ -9,7 +9,7 @@ or libvirt + + virt-v2v [-i* options] -o local -os DIRECTORY + +- virt-v2v [-i* options] -o qemu -os DIRECTORY [--qemu-boot] ++ virt-v2v [-i* options] -o qemu -os DIRECTORY + + virt-v2v [-i* options] -o json -os DIRECTORY + [-oo json-disks-pattern=PATTERN] +@@ -50,12 +50,10 @@ where C is the guest name. + + =item B<-o qemu -os> C + +-=item B<-o qemu -os> C B<--qemu-boot> +- + This converts the guest to files in C. Unlike I<-o local> + above, a shell script is created which contains the raw qemu command + you would need to boot the guest. However the shell script is not +-run, I you also add the I<--qemu-boot> option. ++run. + + =item B<-o json -os> C + +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index 25041d0ec..bd606592b 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -142,11 +142,6 @@ Since F contains the path(s) to the guest disk + image(s) you do not need to specify the name of the disk image on the + command line. + +-To convert a local disk image and immediately boot it in local +-qemu, do: +- +- virt-v2v -i disk disk.img -o qemu -os /var/tmp --qemu-boot +- + =head1 OPTIONS + + =over 4 +@@ -510,9 +505,6 @@ This is similar to I<-o local>, except that a shell script is written + which you can use to boot the guest in qemu. The converted disks and + shell script are written to the directory specified by I<-os>. + +-When using this output mode, you can also specify the I<--qemu-boot> +-option which boots the guest under qemu immediately. +- + =item B<-o> B + + This is the same as I<-o rhv>. +@@ -788,11 +780,6 @@ Print information about the source guest and stop. This option is + useful when you are setting up network and bridge maps. + See L. + +-=item B<--qemu-boot> +- +-When using I<-o qemu> only, this boots the guest immediately after +-virt-v2v finishes. +- + =item B<-q> + + =item B<--quiet> +-- +2.24.1 + diff --git a/SOURCES/0062-RHEL-8-Disable-alternate-Augeas-lenses.patch b/SOURCES/0062-RHEL-8-Disable-alternate-Augeas-lenses.patch new file mode 100644 index 0000000..9d20538 --- /dev/null +++ b/SOURCES/0062-RHEL-8-Disable-alternate-Augeas-lenses.patch @@ -0,0 +1,60 @@ +From e91337be55a8728125de3457dca8f1a998ad18c5 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Fri, 24 Oct 2014 16:33:50 +0100 +Subject: [PATCH] RHEL 8: Disable alternate Augeas lenses. + +These are included in the RHEL augeas package, and therefore not +required. + +See: +https://www.redhat.com/archives/libguestfs/2014-October/msg00220.html +--- + appliance/Makefile.am | 1 - + daemon/augeas.c | 5 ++++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/appliance/Makefile.am b/appliance/Makefile.am +index fc424b1d0..5efc5c036 100644 +--- a/appliance/Makefile.am ++++ b/appliance/Makefile.am +@@ -91,7 +91,6 @@ supermin.d/daemon.tar.gz: ../daemon/guestfsd guestfs_shadow.aug + rm -rf tmp-d + mkdir -p tmp-d$(DAEMON_SUPERMIN_DIR) tmp-d/etc tmp-d/usr/share/guestfs + ln ../daemon/guestfsd tmp-d$(DAEMON_SUPERMIN_DIR)/guestfsd +- ln $(srcdir)/guestfs_shadow.aug tmp-d/usr/share/guestfs/guestfs_shadow.aug + ( cd tmp-d && tar zcf - * ) > $@-t + rm -r tmp-d + mv $@-t $@ +diff --git a/daemon/augeas.c b/daemon/augeas.c +index 453251337..5bbfffa2d 100644 +--- a/daemon/augeas.c ++++ b/daemon/augeas.c +@@ -134,7 +134,7 @@ do_aug_init (const char *root, int flags) + } + + /* Pass AUG_NO_ERR_CLOSE so we can display detailed errors. */ +- aug = aug_init (buf, "/usr/share/guestfs/", flags | AUG_NO_ERR_CLOSE); ++ aug = aug_init (buf, NULL, flags | AUG_NO_ERR_CLOSE); + + if (!aug) { + reply_with_error ("augeas initialization failed"); +@@ -148,6 +148,8 @@ do_aug_init (const char *root, int flags) + return -1; + } + ++ /* We already have the needed lenses in RHEL 8 */ ++#if 0 + if (!augeas_is_version (1, 2, 1)) { + int r = aug_transform (aug, "guestfs_shadow", "/etc/shadow", + 0 /* = included */); +@@ -166,6 +168,7 @@ do_aug_init (const char *root, int flags) + } + } + } ++#endif + + return 0; + } +-- +2.24.1 + diff --git a/SOURCES/0063-RHEL-8-Fix-list-of-supported-sound-cards-to-match-RH.patch b/SOURCES/0063-RHEL-8-Fix-list-of-supported-sound-cards-to-match-RH.patch new file mode 100644 index 0000000..c294d3a --- /dev/null +++ b/SOURCES/0063-RHEL-8-Fix-list-of-supported-sound-cards-to-match-RH.patch @@ -0,0 +1,34 @@ +From 2736193735e3e84d81993ac8464c64381119c679 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Fri, 24 Apr 2015 09:45:41 -0400 +Subject: [PATCH] RHEL 8: Fix list of supported sound cards to match RHEL qemu + (RHBZ#1176493). + +--- + v2v/utils.ml | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/v2v/utils.ml b/v2v/utils.ml +index 74b501f81..21e9c9c15 100644 +--- a/v2v/utils.ml ++++ b/v2v/utils.ml +@@ -51,13 +51,14 @@ let kvm_arch = function + (* Does qemu support the given sound card? *) + let qemu_supports_sound_card = function + | Types.AC97 +- | Types.ES1370 + | Types.ICH6 + | Types.ICH9 + | Types.PCSpeaker ++ -> true ++ | Types.ES1370 + | Types.SB16 + | Types.USBAudio +- -> true ++ -> false + + (* Find the UEFI firmware. *) + let find_uefi_firmware guest_arch = +-- +2.24.1 + diff --git a/SOURCES/0064-RHEL-8-Reject-use-of-libguestfs-winsupport-features-.patch b/SOURCES/0064-RHEL-8-Reject-use-of-libguestfs-winsupport-features-.patch new file mode 100644 index 0000000..b64a2a6 --- /dev/null +++ b/SOURCES/0064-RHEL-8-Reject-use-of-libguestfs-winsupport-features-.patch @@ -0,0 +1,40 @@ +From 9f85ee42bc679642ead93582e3d44e5cf3c30503 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Tue, 7 Jul 2015 09:28:03 -0400 +Subject: [PATCH] RHEL 8: Reject use of libguestfs-winsupport features except + for virt-* tools (RHBZ#1240276). + +--- + generator/c.ml | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/generator/c.ml b/generator/c.ml +index 86f7d89a3..b5bb99f53 100644 +--- a/generator/c.ml ++++ b/generator/c.ml +@@ -1832,6 +1832,22 @@ and generate_client_actions actions () = + check_args_validity c_name style; + trace_call name c_name style; + ++ (* RHEL 8 *) ++ if name = "mount" || name = "mount_ro" || name = "mount_options" || ++ name = "mount_vfs" then ( ++ pr " if (g->program && !STRPREFIX (g->program, \"virt-\")) {\n"; ++ pr " CLEANUP_FREE char *vfs_type = guestfs_vfs_type (g, mountable);\n"; ++ pr " if (vfs_type && STREQ (vfs_type, \"ntfs\")) {\n"; ++ pr " error (g, \"mount: unsupported filesystem type\");\n"; ++ pr " if (trace_flag)\n"; ++ pr " guestfs_int_trace (g, \"%%s = %%s (error)\",\n"; ++ pr " \"%s\", \"-1\");\n" name; ++ pr " return %s;\n" (string_of_errcode errcode); ++ pr " }\n"; ++ pr " }\n"; ++ pr "\n"; ++ ); ++ + (* Calculate the total size of all FileIn arguments to pass + * as a progress bar hint. + *) +-- +2.24.1 + diff --git a/SOURCES/0065-RHEL-8-Fix-tests-for-libguestfs-winsupport.patch b/SOURCES/0065-RHEL-8-Fix-tests-for-libguestfs-winsupport.patch new file mode 100644 index 0000000..24f801a --- /dev/null +++ b/SOURCES/0065-RHEL-8-Fix-tests-for-libguestfs-winsupport.patch @@ -0,0 +1,93 @@ +From a08c766a556bc6f258dc498b0a1a3b17f251ed66 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Sun, 30 Aug 2015 03:21:57 -0400 +Subject: [PATCH] RHEL 8: Fix tests for libguestfs-winsupport. + +It doesn't let us use guestfish for arbitrary Windows edits. +--- + test-data/phony-guests/make-windows-img.sh | 1 + + tests/charsets/test-charset-fidelity.c | 2 ++ + v2v/test-v2v-virtio-win-iso.sh | 8 +++++++- + v2v/test-v2v-windows-conversion.sh | 8 +++++++- + 4 files changed, 17 insertions(+), 2 deletions(-) + +diff --git a/test-data/phony-guests/make-windows-img.sh b/test-data/phony-guests/make-windows-img.sh +index 8676b5ac0..1a88d9fc9 100755 +--- a/test-data/phony-guests/make-windows-img.sh ++++ b/test-data/phony-guests/make-windows-img.sh +@@ -37,6 +37,7 @@ fi + + # Create a disk image. + guestfish < "$script" + :> "$expected" + ++cat >> "$script" < "$response" ++guestfish --ro -a "$d/windows-sda" < "$script" > "$response" + diff -u "$expected" "$response" + + rm -r $d +diff --git a/v2v/test-v2v-windows-conversion.sh b/v2v/test-v2v-windows-conversion.sh +index f1da222a9..ff94fe39b 100755 +--- a/v2v/test-v2v-windows-conversion.sh ++++ b/v2v/test-v2v-windows-conversion.sh +@@ -73,6 +73,12 @@ mktest () + :> "$script" + :> "$expected" + ++cat >> "$script" < "$response" ++guestfish --ro -a "$d/windows-sda" < "$script" > "$response" + diff -u "$expected" "$response" + + # We also update the Registry several times, for firstboot, and (ONLY +-- +2.24.1 + diff --git a/SOURCES/0066-RHEL-8-tests-Disable-daemon-tests-that-require-the-u.patch b/SOURCES/0066-RHEL-8-tests-Disable-daemon-tests-that-require-the-u.patch new file mode 100644 index 0000000..b660f1e --- /dev/null +++ b/SOURCES/0066-RHEL-8-tests-Disable-daemon-tests-that-require-the-u.patch @@ -0,0 +1,28 @@ +From 101d4d7718eb5a53e44de72bc1337c6d3882f314 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Mon, 21 Sep 2015 13:12:43 -0400 +Subject: [PATCH] RHEL 8: tests: Disable daemon tests that require the 'unix' + backend. + +--- + tests/daemon/Makefile.am | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/tests/daemon/Makefile.am b/tests/daemon/Makefile.am +index 053cad3e1..0d723fee4 100644 +--- a/tests/daemon/Makefile.am ++++ b/tests/daemon/Makefile.am +@@ -23,9 +23,7 @@ include $(top_srcdir)/subdir-rules.mk + + check_DATA = captive-daemon.pm + +-TESTS = \ +- test-daemon-start.pl \ +- test-btrfs.pl ++TESTS = + + TESTS_ENVIRONMENT = $(top_builddir)/run --test + +-- +2.24.1 + diff --git a/SOURCES/0067-RHEL-8-v2v-Disable-the-virt-v2v-in-place-option.patch b/SOURCES/0067-RHEL-8-v2v-Disable-the-virt-v2v-in-place-option.patch new file mode 100644 index 0000000..36633b1 --- /dev/null +++ b/SOURCES/0067-RHEL-8-v2v-Disable-the-virt-v2v-in-place-option.patch @@ -0,0 +1,286 @@ +From cff6b6531fe7e2bcb9ae8f022bb38a0cabd218f4 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 14 Jan 2016 11:53:42 -0500 +Subject: [PATCH] RHEL 8: v2v: Disable the virt-v2v --in-place option. + +This disables the virt-v2v --in-place option which we do not +wish to support in RHEL. +(See commit d0069559a939e47e5f29973ed9a69a13f0b58301). +--- + v2v/Makefile.am | 2 - + v2v/cmdline.ml | 8 +-- + v2v/test-v2v-docs.sh | 1 + + v2v/test-v2v-in-place.sh | 108 --------------------------------------- + v2v/virt-v2v.pod | 48 +---------------- + 5 files changed, 7 insertions(+), 160 deletions(-) + delete mode 100755 v2v/test-v2v-in-place.sh + +diff --git a/v2v/Makefile.am b/v2v/Makefile.am +index 6568c9a6b..affa6f7e9 100644 +--- a/v2v/Makefile.am ++++ b/v2v/Makefile.am +@@ -469,7 +469,6 @@ if HAVE_LIBVIRT + TESTS += \ + test-v2v-cdrom.sh \ + test-v2v-floppy.sh \ +- test-v2v-in-place.sh \ + test-v2v-mac.sh \ + test-v2v-networks-and-bridges.sh \ + test-v2v-no-copy.sh \ +@@ -621,7 +620,6 @@ EXTRA_DIST += \ + test-v2v-i-vmx-3.vmx \ + test-v2v-i-vmx-4.vmx \ + test-v2v-i-vmx-5.vmx \ +- test-v2v-in-place.sh \ + test-v2v-it-vddk-io-query.sh \ + test-v2v-machine-readable.sh \ + test-v2v-mac-expected.xml \ +diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml +index e3578ddcb..19c5a269b 100644 +--- a/v2v/cmdline.ml ++++ b/v2v/cmdline.ml +@@ -230,8 +230,7 @@ let parse_cmdline () = + s_"Use password from file to connect to input hypervisor"; + [ M"it" ], Getopt.String ("transport", set_string_option_once "-it" input_transport), + s_"Input transport"; +- [ L"in-place" ], Getopt.Set in_place, +- s_"Only tune the guest in the input VM"; ++ [ L"in-place" ], Getopt.Set in_place, Getopt.hidden_option_description; + [ L"mac" ], Getopt.String ("mac:network|bridge|ip:out", add_mac), + s_"Map NIC to network or bridge or assign static IP"; + [ S 'n'; L"network" ], Getopt.String ("in:out", add_network), +@@ -369,7 +368,6 @@ read the man page virt-v2v(1). + pr "vddk\n"; + pr "colours-option\n"; + pr "vdsm-compat-option\n"; +- pr "in-place\n"; + pr "io/oo\n"; + pr "mac-option\n"; + pr "mac-ip-option\n"; +@@ -544,6 +542,10 @@ read the man page virt-v2v(1). + error (f_"only ‘-it ssh’ can be used here") in + Input_vmx.input_vmx input_transport arg in + ++ (* Prevent use of --in-place option in RHEL. *) ++ if in_place then ++ error (f_"--in-place cannot be used in RHEL"); ++ + (* Common error message. *) + let error_option_cannot_be_used_in_output_mode mode opt = + error (f_"-o %s: %s option cannot be used in this output mode") mode opt +diff --git a/v2v/test-v2v-docs.sh b/v2v/test-v2v-docs.sh +index dfb12bb14..2e45705a3 100755 +--- a/v2v/test-v2v-docs.sh ++++ b/v2v/test-v2v-docs.sh +@@ -26,6 +26,7 @@ $top_srcdir/podcheck.pl virt-v2v.pod virt-v2v \ + --debug-overlay,\ + --ic,\ + --if,\ ++--in-place,\ + --io,\ + --ip,\ + --it,\ +diff --git a/v2v/test-v2v-in-place.sh b/v2v/test-v2v-in-place.sh +deleted file mode 100755 +index 6f7d78f39..000000000 +--- a/v2v/test-v2v-in-place.sh ++++ /dev/null +@@ -1,108 +0,0 @@ +-#!/bin/bash - +-# libguestfs virt-v2v test script +-# Copyright (C) 2014 Red Hat Inc. +-# Copyright (C) 2015 Parallels IP Holdings GmbH. +-# +-# 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. +- +-# Test --in-place. +- +-unset CDPATH +-export LANG=C +-set -e +- +-$TEST_FUNCTIONS +-skip_if_skipped +-skip_if_backend uml +-skip_unless_phony_guest windows.img +- +-img_base="$abs_top_builddir/test-data/phony-guests/windows.img" +- +-export VIRT_TOOLS_DATA_DIR="$top_srcdir/test-data/fake-virt-tools" +-export VIRTIO_WIN="$top_srcdir/test-data/fake-virtio-win" +- +-d=$PWD/test-v2v-in-place.d +-rm -rf $d +-mkdir $d +- +-img="$d/test.qcow2" +-rm -f $img +-qemu-img create -f qcow2 -b $img_base -o compat=1.1,backing_fmt=raw $img +-md5="$(do_md5 $img_base)" +- +-libvirt_xml="$d/test.xml" +-rm -f $libvirt_xml +-n=windows-overlay +-cat > $libvirt_xml < +- +- $n +- 1048576 +- +- hvm +- +- +- +- +- +- +- +- +- +- +- +-EOF +- +-$VG virt-v2v --debug-gc -i libvirt -ic "test://$libvirt_xml" $n --in-place +- +-# Test that the drivers have been copied over into the guest +-script="$d/test.fish" +-expected="$d/expected" +-response="$d/response" +- +-mktest () +-{ +- local cmd="$1" exp="$2" +- +- echo "echo '$cmd'" >> "$script" +- echo "$cmd" >> "$expected" +- +- echo "$cmd" >> "$script" +- echo "$exp" >> "$expected" +-} +- +-:> "$script" +-:> "$expected" +- +-firstboot_dir="/Program Files/Guestfs/Firstboot" +-mktest "is-dir \"$firstboot_dir\"" true +-mktest "is-file \"$firstboot_dir/firstboot.bat\"" true +-mktest "is-dir \"$firstboot_dir/scripts\"" true +-virtio_dir="/Windows/Drivers/VirtIO" +-mktest "is-dir \"$virtio_dir\"" true +-for drv in netkvm qxl vioscsi viostor; do +- for sfx in cat inf sys; do +- mktest "is-file \"$virtio_dir/$drv.$sfx\"" true +- done +-done +- +-guestfish --ro -a "$img" -i < "$script" > "$response" +-diff -u "$expected" "$response" +- +-# Test the base image remained untouched +-test "$md5" = "$(do_md5 $img_base)" +- +-# Clean up. +-rm -r $d +diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod +index bd606592b..092d88635 100644 +--- a/v2v/virt-v2v.pod ++++ b/v2v/virt-v2v.pod +@@ -8,10 +8,6 @@ virt-v2v - Convert a guest to use KVM + [-o mode] [other -o* options] + [guest|filename] + +- virt-v2v --in-place +- [-i mode] [other -i* options] +- [guest|filename] +- + =head1 DESCRIPTION + + Virt-v2v converts a single guest from a foreign hypervisor to run on +@@ -39,9 +35,6 @@ these sides of virt-v2v are documented separately in this manual. + + Virt-v2v normally copies from the input to the output, called "copying + mode". In this case the source guest is always left unchanged. +-In-place conversion (I<--in-place>) only uses the I<-i*> options and +-modifies the source guest in-place. (See L +-below.) + + =head2 Other virt-v2v topics + +@@ -255,20 +248,6 @@ For I<-i disk> only, this specifies the format of the input disk + image. For other input methods you should specify the input + format in the metadata. + +-=item B<--in-place> +- +-Do not create an output virtual machine in the target hypervisor. +-Instead, adjust the guest OS in the source VM to run in the input +-hypervisor. +- +-This mode is meant for integration with other toolsets, which take the +-responsibility of converting the VM configuration, providing for +-rollback in case of errors, transforming the storage, etc. +- +-See L below. +- +-Conflicts with all I<-o *> options. +- + =item B<-io> OPTION=VALUE + + Set input option(s) related to the current input mode or transport. +@@ -1300,7 +1279,7 @@ Minimum free space: 10 MB + =head3 Minimum free space check in the host + + You must have sufficient free space in the host directory used to +-store temporary overlays (except in I<--in-place> mode). To find out ++store temporary overlays. To find out + which directory this is, use: + + $ df -h "`guestfish get-cachedir`" +@@ -1403,31 +1382,6 @@ that instead. + + + +-=head2 In-place conversion +- +-It is also possible to use virt-v2v in scenarios where a foreign VM +-has already been imported into a KVM-based hypervisor, but still needs +-adjustments in the guest to make it run in the new virtual hardware. +- +-In that case it is assumed that a third-party tool has created the +-target VM in the supported KVM-based hypervisor based on the source VM +-configuration and contents, but using virtual devices more appropriate +-for KVM (e.g. virtio storage and network, etc.). +- +-Then, to make the guest OS boot and run in the changed environment, +-one can use: +- +- virt-v2v -ic qemu:///system converted_vm --in-place +- +-Virt-v2v will analyze the configuration of C in the +-C libvirt instance, and apply various fixups to the +-guest OS configuration to make it match the VM configuration. This +-may include installing virtio drivers, configuring the bootloader, the +-mountpoints, the network interfaces, and so on. +- +-Should an error occur during the operation, virt-v2v exits with an +-error code leaving the VM in an undefined state. +- + =head2 Machine readable output + + The I<--machine-readable> option can be used to make the output more +-- +2.24.1 + diff --git a/SOURCES/0068-RHEL-8-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch b/SOURCES/0068-RHEL-8-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch new file mode 100644 index 0000000..7d2b7cc --- /dev/null +++ b/SOURCES/0068-RHEL-8-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch @@ -0,0 +1,26 @@ +From 6ae622c541bdc1128a0a8a6d0cfe7cae29186556 Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Thu, 2 Mar 2017 14:21:37 +0100 +Subject: [PATCH] RHEL 8: v2v: -i disk: force VNC as display (RHBZ#1372671) + +The SDL output mode is not supported in RHEL 8's qemu-kvm. +--- + v2v/input_disk.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/input_disk.ml b/v2v/input_disk.ml +index 8321a2a8c..6bd9f43f8 100644 +--- a/v2v/input_disk.ml ++++ b/v2v/input_disk.ml +@@ -89,7 +89,7 @@ class input_disk input_format disk = object + s_features = [ "acpi"; "apic"; "pae" ]; + s_firmware = UnknownFirmware; (* causes virt-v2v to autodetect *) + s_display = +- Some { s_display_type = Window; s_keymap = None; s_password = None; ++ Some { s_display_type = VNC; s_keymap = None; s_password = None; + s_listen = LNoListen; s_port = None }; + s_video = None; + s_sound = None; +-- +2.24.1 + diff --git a/SOURCES/0069-RHEL-8-v2v-do-not-mention-SUSE-Xen-hosts-RHBZ-143020.patch b/SOURCES/0069-RHEL-8-v2v-do-not-mention-SUSE-Xen-hosts-RHBZ-143020.patch new file mode 100644 index 0000000..a1b494e --- /dev/null +++ b/SOURCES/0069-RHEL-8-v2v-do-not-mention-SUSE-Xen-hosts-RHBZ-143020.patch @@ -0,0 +1,26 @@ +From b60599b78bdf31c289767b01c235580534f52f77 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Wed, 8 Mar 2017 11:03:40 +0100 +Subject: [PATCH] RHEL 8: v2v: do not mention SUSE Xen hosts (RHBZ#1430203) + +They are not supported in RHEL 8. +--- + v2v/virt-v2v-input-xen.pod | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/virt-v2v-input-xen.pod b/v2v/virt-v2v-input-xen.pod +index 9fd5065f1..c3c20a6b6 100644 +--- a/v2v/virt-v2v-input-xen.pod ++++ b/v2v/virt-v2v-input-xen.pod +@@ -10,7 +10,7 @@ virt-v2v-input-xen - Using virt-v2v to convert guests from Xen + =head1 DESCRIPTION + + This page documents how to use L to convert guests from +-RHEL 5 Xen, or SLES and OpenSUSE Xen hosts. ++RHEL 5 Xen hosts. + + =head1 INPUT FROM XEN + +-- +2.24.1 + diff --git a/SOURCES/0070-RHEL-8-v2v-rhv-upload-Remove-restriction-on-oa-spars.patch b/SOURCES/0070-RHEL-8-v2v-rhv-upload-Remove-restriction-on-oa-spars.patch new file mode 100644 index 0000000..a801aac --- /dev/null +++ b/SOURCES/0070-RHEL-8-v2v-rhv-upload-Remove-restriction-on-oa-spars.patch @@ -0,0 +1,91 @@ +From a233d0f924d7c052bbd663a8e1d47fe363de120c Mon Sep 17 00:00:00 2001 +From: "Richard W.M. Jones" +Date: Mon, 14 May 2018 10:16:58 +0100 +Subject: [PATCH] RHEL 8: v2v: rhv-upload: Remove restriction on -oa sparse. + +See: https://bugzilla.redhat.com/show_bug.cgi?id=1565681 +and the v2v-devel private thread "Do we already support migration using FC?" +--- + v2v/output_rhv_upload.ml | 11 +---------- + v2v/rhv-upload-plugin.py | 4 +--- + v2v/virt-v2v-output-rhv.pod | 8 +------- + 3 files changed, 3 insertions(+), 20 deletions(-) + +diff --git a/v2v/output_rhv_upload.ml b/v2v/output_rhv_upload.ml +index e1d06867b..3f078157a 100644 +--- a/v2v/output_rhv_upload.ml ++++ b/v2v/output_rhv_upload.ml +@@ -177,19 +177,11 @@ See also the virt-v2v-output-rhv(1) manual.") + error (f_"nbdkit was compiled without SELinux support. You will have to recompile nbdkit with libselinux-devel installed, or else set SELinux to Permissive mode while doing the conversion.") + in + +- (* Output format/sparse must be raw/sparse. We may be able to +- * lift this limitation in future, but it requires changes on the +- * RHV side. See TODO file for details. XXX +- *) ++ (* Output format must be raw. *) + let error_current_limitation required_param = + error (f_"rhv-upload: currently you must use ‘%s’. This restriction will be loosened in a future version.") required_param + in + +- let error_unless_output_alloc_sparse () = +- if output_alloc <> Sparse then +- error_current_limitation "-oa sparse" +- in +- + (* JSON parameters which are invariant between disks. *) + let json_params = [ + "verbose", JSON.Bool (verbose ()); +@@ -249,7 +241,6 @@ object + error_unless_ovirtsdk4_module_available (); + error_unless_nbdkit_working (); + error_unless_nbdkit_python_plugin_working (); +- error_unless_output_alloc_sparse (); + (* Python code prechecks. *) + let precheck_fn = tmpdir // "v2vprecheck.json" in + let fd = Unix.openfile precheck_fn [O_WRONLY; O_CREAT] 0o600 in +diff --git a/v2v/rhv-upload-plugin.py b/v2v/rhv-upload-plugin.py +index 14d4e37fb..c7f7a5e8b 100644 +--- a/v2v/rhv-upload-plugin.py ++++ b/v2v/rhv-upload-plugin.py +@@ -142,10 +142,8 @@ def open(readonly): + format = disk_format, + initial_size = params['disk_size'], + provisioned_size = params['disk_size'], +- # XXX Ignores params['output_sparse']. +- # Handling this properly will be complex, see: + # https://www.redhat.com/archives/libguestfs/2018-March/msg00177.html +- sparse = True, ++ sparse = params['output_sparse'], + storage_domains = [ + types.StorageDomain( + name = params['output_storage'], +diff --git a/v2v/virt-v2v-output-rhv.pod b/v2v/virt-v2v-output-rhv.pod +index 4520c9184..f6579a48e 100644 +--- a/v2v/virt-v2v-output-rhv.pod ++++ b/v2v/virt-v2v-output-rhv.pod +@@ -5,7 +5,7 @@ virt-v2v-output-rhv - Using virt-v2v to convert guests to oVirt or RHV + =head1 SYNOPSIS + + virt-v2v [-i* options] -o rhv-upload [-oc ENGINE_URL] -os STORAGE +- [-op PASSWORD] [-of raw] ++ [-op PASSWORD] + [-oo rhv-cafile=FILE] + [-oo rhv-cluster=CLUSTER] + [-oo rhv-direct] +@@ -79,12 +79,6 @@ username is not specified then virt-v2v defaults to using + C which is the typical superuser account for oVirt + instances. + +-=item I<-of raw> +- +-Currently you must use I<-of raw> and you cannot use I<-oa preallocated>. +- +-These restrictions will be loosened in a future version. +- + =item I<-op> F + + A file containing a password to be used when connecting to the oVirt +-- +2.24.1 + diff --git a/SOURCES/0071-RHEL-8-use-platform-python.patch b/SOURCES/0071-RHEL-8-use-platform-python.patch new file mode 100644 index 0000000..f2685aa --- /dev/null +++ b/SOURCES/0071-RHEL-8-use-platform-python.patch @@ -0,0 +1,27 @@ +From c5212d2acda7eb21923e376f7c7b0d8ce8a108d1 Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Sun, 16 Dec 2018 16:42:46 +0100 +Subject: [PATCH] RHEL 8: use platform-python + +Use the stable platform-python provided in BaseOS, instead of relying on +some arbitrary version installed by the user. +--- + v2v/python_script.ml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/v2v/python_script.ml b/v2v/python_script.ml +index 3159373a1..f2c00c40f 100644 +--- a/v2v/python_script.ml ++++ b/v2v/python_script.ml +@@ -24,7 +24,7 @@ open Unix_utils + + open Common_gettext.Gettext + +-let python = "python3" (* Defined by PEP 394 *) ++let python = "/usr/libexec/platform-python" + + type script = { + tmpdir : string; (* Temporary directory. *) +-- +2.24.1 + diff --git a/SOURCES/0072-RHEL-8-point-to-KB-for-supported-v2v-hypervisors-gue.patch b/SOURCES/0072-RHEL-8-point-to-KB-for-supported-v2v-hypervisors-gue.patch new file mode 100644 index 0000000..b4dc9a1 --- /dev/null +++ b/SOURCES/0072-RHEL-8-point-to-KB-for-supported-v2v-hypervisors-gue.patch @@ -0,0 +1,125 @@ +From b70c61045e659720ee8f7dbd8eff643a877e8e2f Mon Sep 17 00:00:00 2001 +From: Pino Toscano +Date: Tue, 26 Mar 2019 09:42:25 +0100 +Subject: [PATCH] RHEL 8: point to KB for supported v2v hypervisors/guests + +--- + v2v/virt-v2v-support.pod | 102 ++------------------------------------- + 1 file changed, 4 insertions(+), 98 deletions(-) + +diff --git a/v2v/virt-v2v-support.pod b/v2v/virt-v2v-support.pod +index a22506068..4ec1a07c1 100644 +--- a/v2v/virt-v2v-support.pod ++++ b/v2v/virt-v2v-support.pod +@@ -8,104 +8,10 @@ systems and guests in virt-v2v + This page documents which foreign hypervisors, virtualization + management systems and guest types that L can support. + +-Note this page applies to upstream virt-v2v from +-L and in downstream distributions of virt-v2v +-sometimes features are intentionally removed, or are present but not +-supported. +- +-=head2 Hypervisors (Input) +- +-=over 4 +- +-=item VMware ESXi +- +-Must be managed by VMware vCenter E 5.0 unless VDDK is available. +- +-=item OVA exported from VMware +- +-OVAs from other hypervisors will not work. +- +-=item VMX from VMware +- +-VMX files generated by other hypervisors will not work. +- +-=item RHEL 5 Xen +- +-=item SUSE Xen +- +-=item Citrix Xen +- +-Citrix Xen has not been recently tested. +- +-=item Hyper-V +- +-Not recently tested. Requires that you export the disk or use +-L on Hyper-V. +- +-=item Direct from disk images +- +-Only disk images exported from supported hypervisors, and using +-container formats supported by qemu. +- +-=item Physical machines +- +-Using the L tool. +- +-=back +- +-=head2 Hypervisors (Output) +- +-QEMU and KVM only. +- +-=head2 Virtualization management systems (Output) +- +-=over 4 +- +-=item OpenStack +- +-=item Red Hat Virtualization (RHV) 4.1 and up +- +-=item Local libvirt +- +-And hence L, L, and similar tools. +- +-=item Local disk +- +-=back +- +-=head2 Guests +- +-=over 4 +- +-=item Red Hat Enterprise Linux 3, 4, 5, 6, 7 +- +-=item CentOS 3, 4, 5, 6, 7 +- +-=item Scientific Linux 3, 4, 5, 6, 7 +- +-=item Oracle Linux +- +-=item Fedora +- +-=item SLES 10 and up +- +-=item OpenSUSE 10 and up +- +-=item Debian 6 and up +- +-=item Ubuntu 10.04, 12.04, 14.04, 16.04, and up +- +-=item Windows XP to Windows 10 / Windows Server 2016 +- +-We use Windows internal version numbers, see +-L +- +-Currently NT 5.2 to NT 6.3 are supported. +- +-See L below for additional notes on converting Windows +-guests. +- +-=back ++For more information on supported hypervisors, and guest types in ++RHEL, please consult the following Knowledgebase article on these ++Red Hat Customer Portal: ++L. + + =head2 Guest firmware + +-- +2.24.1 + diff --git a/SOURCES/README-replacement.in b/SOURCES/README-replacement.in new file mode 100644 index 0000000..f264092 --- /dev/null +++ b/SOURCES/README-replacement.in @@ -0,0 +1,38 @@ +Libguestfs is a set of tools and a library for accessing and modifying +guest disk images. For more information see the home page: + + http://libguestfs.org/ + +For discussion, development, patches, etc. please use the mailing +list: + + http://www.redhat.com/mailman/listinfo/libguestfs + +This Red Hat Enterprise Linux package comes with a lot of help and +examples to get you started. + +The first place to start are the manual pages. Type: + + man guestfs + man guestfs-faq + man guestfs-release-notes + man guestfish + man virt-cat # and other virt-* tools + +If you install the libguestfs-devel package, then in the +/usr/share/doc/libguestfs-devel/ directory you will also +find: + + - BUGS: list of open bugs in this version + + - ChangeLog: the detailed list of changes in this version + + - ROADMAP: the roadmap for future versions + + - TODO: ideas for extending libguestfs + + - *.c: example C programs using the API + + - *.xml: example virt-inspector output + + - *.rng: virt-inspector RelaxNG schema diff --git a/SOURCES/brew-overrides.sh b/SOURCES/brew-overrides.sh new file mode 100755 index 0000000..5b72490 --- /dev/null +++ b/SOURCES/brew-overrides.sh @@ -0,0 +1,20 @@ +#!/bin/bash - + +# This script is used when we build libguestfs from brew, as sometimes +# we require packages which are not available in the current version +# of RHEL. Normally these updated packages would be released along +# with libguestfs in the next RHEL, although unfortunately sometimes +# that doesn't happen (eg. RHBZ#1199605). + +set -x + +pkgs=" +" + +for pkg in $pkgs ; do + brew tag-pkg rhel-8.0-temp-override $pkg +done + +for pkg in $pkgs ; do + brew wait-repo rhel-8.0-build --build=$pkg +done diff --git a/SOURCES/copy-patches.sh b/SOURCES/copy-patches.sh new file mode 100755 index 0000000..83737da --- /dev/null +++ b/SOURCES/copy-patches.sh @@ -0,0 +1,55 @@ +#!/bin/bash - + +set -e + +# Maintainer script to copy patches from the git repo to the current +# directory. Use it like this: +# ./copy-patches.sh + +rhel_version=8.0 + +# Check we're in the right directory. +if [ ! -f libguestfs.spec ]; then + echo "$0: run this from the directory containing 'libguestfs.spec'" + exit 1 +fi + +git_checkout=$HOME/d/libguestfs-rhel-$rhel_version +if [ ! -d $git_checkout ]; then + echo "$0: $git_checkout does not exist" + echo "This script is only for use by the maintainer when preparing a" + echo "libguestfs release on RHEL." + exit 1 +fi + +# Get the base version of libguestfs. +version=`grep '^Version:' libguestfs.spec | awk '{print $2}'` +tag="v$version" + +# Remove any existing patches. +git rm -f [0-9]*.patch ||: +rm -f [0-9]*.patch + +# Get the patches. +(cd $git_checkout; rm -f [0-9]*.patch; git format-patch -N $tag) +mv $git_checkout/[0-9]*.patch . + +# Remove any not to be applied. +rm -f *NOT-FOR-RPM*.patch + +# Add the patches. +git add [0-9]*.patch + +# Print out the patch lines. +echo +echo "--- Copy the following text into libguestfs.spec file" +echo + +echo "# Patches." +for f in [0-9]*.patch; do + n=`echo $f | awk -F- '{print $1}'` + echo "Patch$n: $f" +done + +echo +echo "--- End of text" diff --git a/SOURCES/guestfish.sh b/SOURCES/guestfish.sh new file mode 100644 index 0000000..cfd0492 --- /dev/null +++ b/SOURCES/guestfish.sh @@ -0,0 +1,6 @@ +# Guestfish colour prompts. See PROMPT in guestfish(1). +GUESTFISH_PS1='\[\e[1;32m\]>\[\e[0;31m\] ' +GUESTFISH_OUTPUT='\e[0m' +GUESTFISH_RESTORE="$GUESTFISH_OUTPUT" +GUESTFISH_INIT='\e[1;34m' +export GUESTFISH_PS1 GUESTFISH_OUTPUT GUESTFISH_RESTORE GUESTFISH_INIT diff --git a/SOURCES/libguestfs-1.40.2.tar.gz.sig b/SOURCES/libguestfs-1.40.2.tar.gz.sig new file mode 100644 index 0000000..016e22b --- /dev/null +++ b/SOURCES/libguestfs-1.40.2.tar.gz.sig @@ -0,0 +1,17 @@ +-----BEGIN PGP SIGNATURE----- + +iQJFBAABCAAvFiEE93dPsa0HSn6Mh2fqkXOPc+G3aKAFAlxdivwRHHJpY2hAYW5u +ZXhpYS5vcmcACgkQkXOPc+G3aKC8SRAAotTR3nvV2lUeABLn8uiv5CjmeEEm++C4 +754zGkOb7bRSQzcQ12XC0e4WQwcS/fHHSRhT2ABc1VeLn8ehyEEQ3T3NfDpnpaKR +NYolsI3l8iae4QI0wo85/Wb/k7pXg1uWFZ9t286d1e/NYudMEZ6hiVXsUNlSu0lR +rU5Xr/XGDV01Vlalo1qcVI1p3b3zBFGcNLv5Myc0+Q+RWVYcyrm270VJYmD0OOnh +zzRgb1fBW4rVIbYEhmmhNgbL3758Qaef/jsTxU/tH83LOdJUpxWYvLD7ec3DzsHr +xcNgDCZxCtn4ObdfxJGzVbWO96nmVPxNnVMeDol+PDsrVkQnpSPMPrU/oth5Xh19 ++JeP22SSDahCIbO9YlL3AoA3l1gpLq2f9yTz9JIHm4ytBZmQPD8QU2KBQFsz+/ZE +Gulc0j/3mzlRyoesuVGb79OWBfSDCHittKVFPXqokzNu0jWZVd7GxfJ2DQqUprJd +eK4LDJpInS+Vdohjko8uuC9AfGB68hWbuazjdWLhTNQb3/8EzX5Xu2N88xlWuBQK +HRu8NPp601uI6qdjj38VUXGY5BryDIJdvqf5hoRNe/2scf3OomaMpdck59gLT4LB +/yaNbfPSRenXQ1IM3mU9Opktvm48cpJQ8B80OEmWenhhjXrHrgplVNkXK7inZ7vu +TKia/N90ugY= +=kgC8 +-----END PGP SIGNATURE----- diff --git a/SOURCES/yum.conf.in b/SOURCES/yum.conf.in new file mode 100644 index 0000000..d5e30d0 --- /dev/null +++ b/SOURCES/yum.conf.in @@ -0,0 +1,17 @@ +[main] +cachedir=@PWD@/cachedir +debuglevel=1 +logfile=@PWD@/yum.log +retries=20 +obsoletes=1 +gpgcheck=0 +assumeyes=1 +reposdir=/dev/null +modulesdir=@PWD@/modules + +[local] +name=local +baseurl=file://@PWD@/repo +failovermethod=priority +enabled=1 +gpgcheck=0 diff --git a/SPECS/libguestfs.spec b/SPECS/libguestfs.spec new file mode 100644 index 0000000..8312104 --- /dev/null +++ b/SPECS/libguestfs.spec @@ -0,0 +1,4096 @@ +%global _hardened_build 1 + +# Architectures that we run the basic sanity-check test. +# +# The full test suite is done after the package has been built. Here +# we only do a sanity check that kernel/qemu/libvirt/appliance is not +# broken. To perform the full test suite, see instructions here: +# https://www.redhat.com/archives/libguestfs/2015-September/msg00078.html +# +# Currently the basic sanity check is *broken* on: +# +# (none) +%global test_arches aarch64 %{power64} s390x x86_64 + +# Architectures where virt-v2v is shipped. +# +# not on aarch64 because it is not useful there +# not on %%{power64} because of RHBZ#1287826 +# not on s390x because it is not useful there +%global v2v_arches x86_64 + +# Architectures where the benchmarking tools are shipped. +%global benchmark_arches aarch64 x86_64 + +# Trim older changelog entries. +# https://lists.fedoraproject.org/pipermail/devel/2013-April/thread.html#181627 +%global _changelog_trimtime %(date +%s -d "2 years ago") + +# Verify tarball signature with GPGv2 (only possible for stable branches). +%global verify_tarball_signature 1 + +# Filter perl provides. +%{?perl_default_filter} + +Summary: Access and modify virtual machine disk images +Name: libguestfs +Epoch: 1 +Version: 1.40.2 +Release: 22%{?dist} +License: LGPLv2+ + +# Source and patches. +URL: http://libguestfs.org/ +Source0: http://libguestfs.org/download/1.40-stable/%{name}-%{version}.tar.gz +%if 0%{verify_tarball_signature} +Source1: http://libguestfs.org/download/1.40-stable/%{name}-%{version}.tar.gz.sig +%endif + +ExclusiveArch: x86_64 %{power64} aarch64 s390x + +# RHEL 8 git repository is: +# https://github.com/libguestfs/libguestfs/tree/rhel-8.0 +# Use 'copy-patches.sh' to copy the patches from the git repo +# to the current directory. + +# Patches. +Patch0001: 0001-common-mlpcre-add-offset-flag-for-PCRE.matches.patch +Patch0002: 0002-v2v-add-Var_expander.patch +Patch0003: 0003-v2v-add-o-json-output-mode.patch +Patch0004: 0004-inspect-fix-icon-of-RHEL.patch +Patch0005: 0005-v2v-warn-when-the-guest-has-direct-network-interface.patch +Patch0006: 0006-v2v-update-documentation-on-nbdkit-RHBZ-1605242.patch +Patch0007: 0007-v2v-linux-do-not-uninstall-open-vm-tools-w-ubuntu-se.patch +Patch0008: 0008-v2v-linux-canonicalize-module-path-for-arch-detectio.patch +Patch0009: 0009-v2v-linux-improve-arch-detection-from-modules-RHBZ-1.patch +Patch0010: 0010-Use-proper-label-for-nbdkit-sockets.patch +Patch0011: 0011-v2v-start-reading-the-new-libvirt-firmware-autoselec.patch +Patch0012: 0012-common-mltools-move-the-code-for-machine-readable-up.patch +Patch0013: 0013-common-mltools-make-sure-machine-readable-output-is-.patch +Patch0014: 0014-common-mltools-allow-fd-for-machine-readable-output.patch +Patch0015: 0015-OCaml-tools-output-messages-into-JSON-for-machine-re.patch +Patch0016: 0016-OCaml-tools-fix-3999-3339-typo.patch +Patch0017: 0017-v2v-remove-extra-nbdkit-bit-from-documentation-RHBZ-.patch +Patch0018: 0018-v2v-i-vmx-Use-scp-T-option-if-available-to-unbreak-s.patch +Patch0019: 0019-v2v-Allow-Windows-virtio-ISO-to-be-a-block-device-as.patch +Patch0020: 0020-v2v-Set-DISKTYPE-2-in-RHV-and-VDSM-meta-files-RHBZ-1.patch +Patch0021: 0021-v2v-rhv-upload-plugin-improve-wait-logic-after-final.patch +Patch0022: 0022-v2v-o-rhv-upload-check-whether-the-cluster-exists.patch +Patch0023: 0023-v2v-o-rhv-upload-split-vmcheck-out-of-precheck.patch +Patch0024: 0024-v2v-o-rhv-upload-change-precheck-script-to-return-a-.patch +Patch0025: 0025-v2v-o-rhv-upload-improve-lookup-of-specified-resourc.patch +Patch0026: 0026-v2v-o-rhv-upload-tell-whether-a-SD-actually-exists.patch +Patch0027: 0027-v2v-add-output-disk_copied-hook.patch +Patch0028: 0028-v2v-o-rhv-upload-collect-disks-UUIDs-right-after-cop.patch +Patch0029: 0029-v2v-o-rhv-upload-add-oo-rhv-disk-uuid-option.patch +Patch0030: 0030-v2v-o-rhv-upload-make-oo-rhv-cafile-optional.patch +Patch0031: 0031-v2v-Fix-default-graphics-driver-for-SUSE-guests.patch +Patch0032: 0032-v2v-windows-Add-a-helper-function-for-installing-Pow.patch +Patch0033: 0033-v2v-Copy-static-IP-address-information-over-for-Wind.patch +Patch0034: 0034-New-API-luks_uuid.patch +Patch0035: 0035-options-Fix-segfault-when-multiple-key-parameters-gi.patch +Patch0036: 0036-options-Simplify-selector-parsing-for-key-options.patch +Patch0037: 0037-options-Allow-multiple-key-parameters.patch +Patch0038: 0038-options-rename-key.device-as-key.id.patch +Patch0039: 0039-options-allow-a-UUID-as-identifier-for-key.patch +Patch0040: 0040-docs-remove-paragraph-about-VMware-tools-on-Windows-.patch +Patch0041: 0041-mlcustomize-Trim-whitespaces-from-commands-read-from.patch +Patch0042: 0042-openstack-Increase-Cinder-volume-attach-timeout-to-5.patch +Patch0043: 0043-v2v-o-rhv-upload-check-for-a-valid-image-transfer-ri.patch +Patch0044: 0044-rhv-upload-Check-status-more-frequently.patch +Patch0045: 0045-rhv-upload-Show-transfer-id-in-error-message.patch +Patch0046: 0046-rhv-upload-Fix-waiting-for-transfer.patch +Patch0047: 0047-v2v-Optimize-convert-for-images-with-small-holes.patch +Patch0048: 0048-v2v-o-rhv-upload-Make-oo-rhv-cafile-optional-in-all-.patch +Patch0049: 0049-docs-Fix-update-crypto-policies-command-RHBZ-1791257.patch +Patch0050: 0050-add-versioned-directory-for-guest-agent-on-EL8.patch +Patch0051: 0051-v2v-fix-path-to-source-when-copying-files-from-guest.patch +Patch0052: 0052-v2v-windows-install-QEMU-Guest-Agent-MSI.patch +Patch0053: 0053-windows-small-tweaks-of-qemu-ga-firstboot-script.patch +Patch0054: 0054-windows-fix-detection-of-qemu-ga-installer-on-RHV.patch +Patch0055: 0055-windows-delay-installation-of-qemu-ga-MSI.patch +Patch0056: 0056-RHEL-8-Remove-libguestfs-live-RHBZ-798980.patch +Patch0057: 0057-RHEL-8-Remove-9p-APIs-from-RHEL-RHBZ-921710.patch +Patch0058: 0058-RHEL-8-Disable-unsupported-remote-drive-protocols-RH.patch +Patch0059: 0059-RHEL-8-Remove-User-Mode-Linux-RHBZ-1144197.patch +Patch0060: 0060-RHEL-8-v2v-Select-correct-qemu-binary-for-o-qemu-mod.patch +Patch0061: 0061-RHEL-8-v2v-Disable-the-qemu-boot-option-RHBZ-1147313.patch +Patch0062: 0062-RHEL-8-Disable-alternate-Augeas-lenses.patch +Patch0063: 0063-RHEL-8-Fix-list-of-supported-sound-cards-to-match-RH.patch +Patch0064: 0064-RHEL-8-Reject-use-of-libguestfs-winsupport-features-.patch +Patch0065: 0065-RHEL-8-Fix-tests-for-libguestfs-winsupport.patch +Patch0066: 0066-RHEL-8-tests-Disable-daemon-tests-that-require-the-u.patch +Patch0067: 0067-RHEL-8-v2v-Disable-the-virt-v2v-in-place-option.patch +Patch0068: 0068-RHEL-8-v2v-i-disk-force-VNC-as-display-RHBZ-1372671.patch +Patch0069: 0069-RHEL-8-v2v-do-not-mention-SUSE-Xen-hosts-RHBZ-143020.patch +Patch0070: 0070-RHEL-8-v2v-rhv-upload-Remove-restriction-on-oa-spars.patch +Patch0071: 0071-RHEL-8-use-platform-python.patch +Patch0072: 0072-RHEL-8-point-to-KB-for-supported-v2v-hypervisors-gue.patch + +# Use git for patch management. +BuildRequires: git + +# Run autotools after applying the patches. +BuildRequires: autoconf, automake, libtool, gettext-devel + +# Replacement README file for RHEL users. +Source4: README-replacement.in + +# Guestfish colour prompts. +Source5: guestfish.sh + +# Used to build the supermin appliance in Koji. +Source6: yum.conf.in + +# Keyring used to verify tarball signature. +%if 0%{verify_tarball_signature} +Source7: libguestfs.keyring +%endif + +# RHSRVANY and RHEV-APT, used for Windows virt-v2v conversions. +# RHSRVANY is built from source under Fedora from +# mingw32-srvany-1.0-15.20150115gitfd659e77.fc23.noarch +# RHEV-APT is taken from the RHEV Tools CD +# See https://bugzilla.redhat.com/show_bug.cgi?id=1186850 +Source96: rhsrvany.exe +Source97: RHEV-Application-Provisioning-Tool.exe_4.43-3 + +Source98: brew-overrides.sh +Source99: copy-patches.sh + +# Basic build requirements for the library and virt tools. +BuildRequires: gcc, gcc-c++ +BuildRequires: rpcgen +BuildRequires: libtirpc-devel +BuildRequires: supermin-devel >= 5.1.16-2 +BuildRequires: hivex-devel >= 1.3.10-5.8.el7 +BuildRequires: ocaml-hivex-devel +BuildRequires: perl(Pod::Simple) +BuildRequires: perl(Pod::Man) +BuildRequires: /usr/bin/pod2text +BuildRequires: po4a +BuildRequires: augeas-devel +BuildRequires: readline-devel +BuildRequires: genisoimage +BuildRequires: libxml2-devel +BuildRequires: createrepo_c +BuildRequires: glibc-static +BuildRequires: libselinux-utils +BuildRequires: libselinux-devel +BuildRequires: fuse, fuse-devel +BuildRequires: pcre-devel +BuildRequires: file-devel +BuildRequires: libvirt-devel +BuildRequires: gperf +BuildRequires: flex +BuildRequires: bison +BuildRequires: libdb-utils +BuildRequires: cpio +BuildRequires: libconfig-devel +BuildRequires: xz-devel +BuildRequires: zip +BuildRequires: unzip +BuildRequires: systemd-units +BuildRequires: netpbm-progs +BuildRequires: icoutils +# RHBZ#1710713 (RHBZ#1661940) +BuildRequires: libvirt-daemon-kvm >= 5.3.0 +BuildRequires: libacl-devel +BuildRequires: libcap-devel +BuildRequires: jansson-devel +BuildRequires: systemd-devel +BuildRequires: bash-completion +BuildRequires: /usr/bin/ping +BuildRequires: /usr/bin/wget +BuildRequires: curl +BuildRequires: xz +BuildRequires: /usr/bin/qemu-img +BuildRequires: perl(Win::Hivex) +BuildRequires: perl(Win::Hivex::Regedit) +%if 0%{verify_tarball_signature} +BuildRequires: gnupg2 +%endif + +# For language bindings. +# Build using OCaml with fix for CVE-2015-8869. +BuildRequires: ocaml >= 4.01.0-22.7.el7 +BuildRequires: ocaml-ocamldoc +# Make sure to get the performance fix for findlib. +BuildRequires: ocaml-findlib-devel >= 1.3.3-7.el7 +BuildRequires: ocaml-gettext-devel +BuildRequires: lua +BuildRequires: lua-devel +BuildRequires: perl-devel +BuildRequires: perl-generators +BuildRequires: perl-macros +BuildRequires: perl(Sys::Virt) +BuildRequires: perl(Test::More) +BuildRequires: perl(Test::Pod) >= 1.00 +BuildRequires: perl(Test::Pod::Coverage) >= 1.00 +BuildRequires: perl(Module::Build) +BuildRequires: perl(ExtUtils::CBuilder) +BuildRequires: perl(Locale::TextDomain) +BuildRequires: python3-devel +BuildRequires: python3-libvirt +BuildRequires: ruby-devel +BuildRequires: rubygem-rake +BuildRequires: rubygem(rdoc) +BuildRequires: rubygem(test-unit) +BuildRequires: ruby-irb +BuildRequires: java-1.8.0-openjdk +BuildRequires: java-1.8.0-openjdk-devel +BuildRequires: jpackage-utils +BuildRequires: glib2-devel +BuildRequires: gobject-introspection-devel +BuildRequires: gjs + +# Build requirements for the appliance. +# +# Get the initial list by doing: +# for f in `cat appliance/packagelist`; do echo $f; done | sort -u +# However you have to edit the list down to packages which exist in +# current RHEL, since supermin ignores non-existent packages. +BuildRequires: acl attr augeas-libs bash binutils bzip2 coreutils cpio cryptsetup curl dhclient diffutils dosfstools e2fsprogs file findutils gawk gdisk genisoimage gfs2-utils grep gzip hivex iproute iputils jansson kernel kmod kpartx less libcap libselinux libxml2 lsof lsscsi lvm2 lzop mdadm openssh-clients parted pciutils pcre policycoreutils procps psmisc qemu-img rsync scrub sed squashfs-tools strace systemd tar udev util-linux vim-minimal which xfsprogs xz +%ifarch %{ix86} x86_64 +BuildRequires: syslinux syslinux-extlinux +%endif + +# For building the appliance. +Requires: supermin >= 5.1.16-2 + +# The daemon dependencies are not included automatically, because it +# is buried inside the appliance, so list them here. +Requires: augeas-libs%{?_isa} +Requires: libacl%{?_isa} +Requires: libcap%{?_isa} +Requires: hivex%{?_isa} >= 1.3.10-5.8.el7 +Requires: pcre%{?_isa} +Requires: libselinux%{?_isa} +Requires: systemd-libs%{?_isa} +Requires: yajl%{?_isa} + +# RHBZ#1211321 +Requires: kernel + +# Older lvmetad "forgets" VGs if you change their UUID. libguestfs +# since 1.34 enables lvmetad. So we must ensure we have new enough +# LVM: +Requires: lvm2 >= 7:2.02.166-1.el7 + +# For core inspection API. +Requires: libdb-utils + +# For core mount-local (FUSE) API. +Requires: fuse + +# For core disk-create API. +Requires: /usr/bin/qemu-img + +# For libvirt backend. +# RHBZ#1500870, RHBZ#1501239, RHBZ#1508299 +Requires: libvirt-daemon-kvm >= 5.3.0 +%ifarch aarch64 +Requires: edk2-aarch64 +%endif + +# https://fedoraproject.org/wiki/Packaging:No_Bundled_Libraries#Packages_granted_exceptions +Provides: bundled(gnulib) + +# Conflicts with libguestfs-winsupport from RHEL 7.0. You need to +# use the RHEL 7.2+ package. +Conflicts: libguestfs-winsupport < 7.2 + + +%description +Libguestfs is a library for accessing and modifying virtual machine +disk images. http://libguestfs.org + +It can be used to make batch configuration changes to guests, get +disk used/free statistics (virt-df), migrate between hypervisors +(virt-p2v, virt-v2v), perform backups and guest clones, change +registry/UUID/hostname info, build guests from scratch (virt-builder) +and much more. + +Libguestfs uses Linux kernel and qemu code, and can access any type of +guest filesystem that Linux and qemu can, including but not limited +to: ext2/3/4, FAT and NTFS, LVM, many different disk partition +schemes, qcow, qcow2, vmdk. + +Libguestfs for Red Hat Enterprise Linux is split into several subpackages. +The basic subpackages are: + + libguestfs C library + libguestfs-tools virt-* tools, guestfish and guestmount (FUSE) + libguestfs-tools-c only the subset of virt tools written in C + (for reduced dependencies) + virt-v2v convert virtual machines to run on KVM (V2V) + virt-p2v-maker convert physical machines to run on KVM (P2V) + virt-dib safe and secure diskimage-builder replacement + +For enhanced features, install: + + libguestfs-gfs2 adds Global Filesystem (GFS2) support + libguestfs-inspect-icons adds support for inspecting guest icons + libguestfs-rescue enhances virt-rescue shell with more tools + libguestfs-rsync rsync to/from guest filesystems + libguestfs-xfs adds XFS support + +For developers: + + libguestfs-devel C/C++ header files and library + libguestfs-benchmarking Benchmarking utilities + +Language bindings: + + libguestfs-gobject-devel GObject bindings and GObject Introspection + libguestfs-java-devel Java bindings + lua-guestfs Lua bindings + ocaml-libguestfs-devel OCaml bindings + perl-Sys-Guestfs Perl bindings + python3-libguestfs Python 3 bindings + ruby-libguestfs Ruby bindings + + +%ifarch %{benchmark_arches} +%package benchmarking +Summary: Benchmarking utilities for %{name} +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} + + +%description benchmarking +%{name}-benchmarking contains utilities for benchmarking and +performance analysis of %{name}, and also for general +understanding of the performance of the kernel and qemu when booting +small appliances. +%endif + + +%package devel +Summary: Development tools and libraries for %{name} +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} +Requires: pkgconfig + +# For libguestfs-make-fixed-appliance. +Requires: xz +Requires: %{name}-tools-c = %{epoch}:%{version}-%{release} + + +%description devel +%{name}-devel contains development tools and libraries +for %{name}. + + +%package gfs2 +Summary: GFS2 support for %{name} +License: LGPLv2+ +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} + +%description gfs2 +This adds GFS2 support to %{name}. Install it if you want to process +disk images containing GFS2. + + +%package rescue +Summary: Additional tools for virt-rescue +License: LGPLv2+ +Requires: %{name}-tools-c = %{epoch}:%{version}-%{release} + +%description rescue +This adds additional tools to use inside the virt-rescue shell, +such as ssh, network utilities, editors and debugging utilities. + + +%package rsync +Summary: rsync support for %{name} +License: LGPLv2+ +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} + +%description rsync +This adds rsync support to %{name}. Install it if you want to use +rsync to upload or download files into disk images. + + +%package xfs +Summary: XFS support for %{name} +License: LGPLv2+ +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} + +%description xfs +This adds XFS support to %{name}. Install it if you want to process +disk images containing XFS. + + +%package inspect-icons +Summary: Additional dependencies for inspecting guest icons +License: LGPLv2+ +BuildArch: noarch +Requires: %{name} = %{epoch}:%{version}-%{release} + +Requires: netpbm-progs +Requires: icoutils + + +%description inspect-icons +%{name}-inspect-icons is a metapackage that pulls in additional +dependencies required by libguestfs to pull icons out of non-Linux +guests. Install this package if you want libguestfs to be able to +inspect non-Linux guests and display icons from them. + +The only reason this is a separate package is to avoid core libguestfs +having to depend on Perl. See https://bugzilla.redhat.com/1194158 + + +%package tools-c +Summary: System administration tools for virtual machines +License: GPLv2+ +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} + +# For guestfish: +#Requires: /usr/bin/emacs #theoretically, but too large +Requires: /usr/bin/hexedit +Requires: /usr/bin/less +Requires: /usr/bin/man +Requires: /usr/bin/vi + +# For virt-builder: +Requires: gnupg2 +Requires: xz +#Requires: nbdkit, nbdkit-plugin-xz +Requires: curl + +# For virt-builder-repository: +Suggests: osinfo-db + +# Some Fedora, and all RHEL 7, use XFS: +Recommends: libguestfs-xfs + +# For virt-edit and virt-customize: +Suggests: perl + + +%description tools-c +This package contains miscellaneous system administrator command line +tools for virtual machines. + +Note that you should install %{name}-tools (which pulls in +this package). This package is only used directly when you want +to avoid dependencies on Perl. + + +%package tools +Summary: System administration tools for virtual machines +License: GPLv2+ +BuildArch: noarch +Requires: %{name} = %{epoch}:%{version}-%{release} +Requires: %{name}-tools-c = %{epoch}:%{version}-%{release} + +# NB: Only list deps here which are not picked up automatically. +Requires: perl(Sys::Virt) +Requires: perl(Win::Hivex) >= 1.2.7 + + +%description tools +This package contains miscellaneous system administrator command line +tools for virtual machines. + +Guestfish is the Filesystem Interactive SHell, for accessing and +modifying virtual machine disk images from the command line and shell +scripts. + +The guestmount command lets you mount guest filesystems on the host +using FUSE and %{name}. + +Virt-alignment-scan scans virtual machines looking for partition +alignment problems. + +Virt-builder is a command line tool for rapidly making disk images +of popular free operating systems. + +Virt-cat is a command line tool to display the contents of a file in a +virtual machine. + +Virt-copy-in and virt-copy-out are command line tools for uploading +and downloading files and directories to and from virtual machines. + +Virt-customize is a command line tool for customizing virtual machine +disk images. + +Virt-df is a command line tool to display free space on virtual +machine filesystems. Unlike other tools, it doesn’t just display the +amount of space allocated to a virtual machine, but can look inside +the virtual machine to see how much space is really being used. It is +like the df(1) command, but for virtual machines, except that it also +works for Windows virtual machines. + +Virt-diff shows the differences between virtual machines. + +Virt-edit is a command line tool to edit the contents of a file in a +virtual machine. + +Virt-filesystems is a command line tool to display the filesystems, +partitions, block devices, LVs, VGs and PVs found in a disk image +or virtual machine. It replaces the deprecated programs +virt-list-filesystems and virt-list-partitions with a much more +capable tool. + +Virt-format is a command line tool to erase and make blank disks. + +Virt-get-kernel extracts a kernel/initrd from a disk image. + +Virt-inspector examines a virtual machine and tries to determine the +version of the OS, the kernel version, what drivers are installed, +whether the virtual machine is fully virtualized (FV) or +para-virtualized (PV), what applications are installed and more. + +Virt-log is a command line tool to display the log files from a +virtual machine. + +Virt-ls is a command line tool to list out files in a virtual machine. + +Virt-make-fs is a command line tool to build a filesystem out of +a collection of files or a tarball. + +Virt-rescue provides a rescue shell for making interactive, +unstructured fixes to virtual machines. + +Virt-resize can resize existing virtual machine disk images. + +Virt-sparsify makes virtual machine disk images sparse (thin-provisioned). + +Virt-sysprep lets you reset or unconfigure virtual machines in +preparation for cloning them. + +Virt-tail follows (tails) a log file within a guest, like 'tail -f'. + +Virt-tar-in and virt-tar-out are archive, backup and upload tools +for virtual machines. These replace the deprecated program virt-tar. + +Virt-win-reg lets you look at and modify the Windows Registry of +Windows virtual machines. + + +%package -n virt-dib +Summary: Safe and secure diskimage-builder replacement +License: GPLv2+ + +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} + + +%description -n virt-dib +Virt-dib is a safe and secure alternative to the OpenStack +diskimage-builder command. It is compatible with most +diskimage-builder elements. + + +%ifarch %{v2v_arches} +%package -n virt-v2v +Summary: Convert a virtual machine to run on KVM +License: GPLv2+ + +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} +Requires: %{name}-tools-c = %{epoch}:%{version}-%{release} +# First version that added support for ssh, curl, json: URLs. +# (RHBZ#1226683, RHBZ#1226684, RHBZ#1226697). +Requires: qemu-kvm >= 1.5.3-92.el7 + +# For Windows conversions. +Requires: libguestfs-winsupport >= 7.2 + +Requires: gawk +Requires: gzip +Requires: unzip +Requires: curl +Requires: /usr/bin/virsh + +# Ensure the UEFI firmware is available, to properly convert +# EFI guests (RHBZ#1429643). +%ifarch x86_64 +Requires: edk2-ovmf +%endif +%ifarch aarch64 +Requires: edk2-aarch64 +%endif + +# Needed for -it vddk, and -o rhv-upload. +Requires: nbdkit +Requires: nbdkit-python-plugin +Requires: nbdkit-vddk-plugin +Requires: platform-python + + +%description -n virt-v2v +Virt-v2v converts virtual machines from non-KVM hypervisors +to run under KVM. + +To convert physical machines, see the virt-p2v-maker package. +%endif + + +%package bash-completion +Summary: Bash tab-completion scripts for %{name} tools +BuildArch: noarch +Requires: bash-completion >= 2.0 +Requires: %{name}-tools-c = %{epoch}:%{version}-%{release} + + +%description bash-completion +Install this package if you want intelligent bash tab-completion +for guestfish, guestmount and various virt-* tools. + + +%package -n ocaml-%{name} +Summary: OCaml bindings for %{name} +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} + + +%description -n ocaml-%{name} +ocaml-%{name} contains OCaml bindings for %{name}. + +This is for toplevel and scripting access only. To compile OCaml +programs which use %{name} you will also need ocaml-%{name}-devel. + + +%package -n ocaml-%{name}-devel +Summary: OCaml bindings for %{name} +Requires: ocaml-%{name}%{?_isa} = %{epoch}:%{version}-%{release} + + +%description -n ocaml-%{name}-devel +ocaml-%{name}-devel contains development libraries +required to use the OCaml bindings for %{name}. + + +%package -n perl-Sys-Guestfs +Summary: Perl bindings for %{name} (Sys::Guestfs) +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} +Requires: perl(:MODULE_COMPAT_%(eval "`%{__perl} -V:version`"; echo $version)) + + +%description -n perl-Sys-Guestfs +perl-Sys-Guestfs contains Perl bindings for %{name} (Sys::Guestfs). + + +%package -n python3-%{name} +Summary: Python 3 bindings for %{name} +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} +%{?python_provide:%python_provide python3-%{name}} + + +%description -n python3-%{name} +python3-%{name} contains Python 3 bindings for %{name}. + + +%package -n ruby-%{name} +Summary: Ruby bindings for %{name} +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} +Requires: ruby(release) +Requires: ruby +Provides: ruby(guestfs) = %{version} + +%description -n ruby-%{name} +ruby-%{name} contains Ruby bindings for %{name}. + + +%package java +Summary: Java bindings for %{name} +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} +Requires: java-headless >= 1.7.0 +Requires: jpackage-utils + +%description java +%{name}-java contains Java bindings for %{name}. + +If you want to develop software in Java which uses %{name}, then +you will also need %{name}-java-devel. + + +%package java-devel +Summary: Java development package for %{name} +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} +Requires: %{name}-java = %{epoch}:%{version}-%{release} + +%description java-devel +%{name}-java-devel contains the tools for developing Java software +using %{name}. + +See also %{name}-javadoc. + + +%package javadoc +Summary: Java documentation for %{name} +BuildArch: noarch +Requires: %{name} = %{epoch}:%{version}-%{release} +Requires: %{name}-java = %{epoch}:%{version}-%{release} +Requires: jpackage-utils + +%description javadoc +%{name}-javadoc contains the Java documentation for %{name}. + + +%package -n lua-guestfs +Summary: Lua bindings for %{name} +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} +Requires: lua + +%description -n lua-guestfs +lua-guestfs contains Lua bindings for %{name}. + + +%package gobject +Summary: GObject bindings for %{name} +Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} + +%description gobject +%{name}-gobject contains GObject bindings for %{name}. + +To develop software against these bindings, you need to install +%{name}-gobject-devel. + + +%package gobject-devel +Summary: GObject bindings for %{name} +Requires: %{name}-gobject = %{epoch}:%{version}-%{release} + +Provides: libguestfs-gobject-doc = %{epoch}:%{version}-%{release} +Obsoletes: libguestfs-gobject-doc < %{epoch}:%{version}-%{release} + +%description gobject-devel +%{name}-gobject contains GObject bindings for %{name}. + +This package is needed if you want to write software using the +GObject bindings. It also contains GObject Introspection information. + + +%package man-pages-ja +Summary: Japanese (ja) man pages for %{name} +BuildArch: noarch +Requires: %{name} = %{epoch}:%{version}-%{release} + +%description man-pages-ja +%{name}-man-pages-ja contains Japanese (ja) man pages +for %{name}. + + +%package man-pages-uk +Summary: Ukrainian (uk) man pages for %{name} +BuildArch: noarch +Requires: %{name} = %{epoch}:%{version}-%{release} + +%description man-pages-uk +%{name}-man-pages-uk contains Ukrainian (uk) man pages +for %{name}. + + +%prep +%if 0%{verify_tarball_signature} +tmphome="$(mktemp -d)" +gpgv2 --homedir "$tmphome" --keyring %{SOURCE7} %{SOURCE1} %{SOURCE0} +%endif +%setup -q + +# 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 +# the directory is on NFS (no SELinux labels) or if SELinux is +# disabled, hence the tests. +if [ "$(stat -f -L -c %T .)" != "nfs" ] && \ + [ "$(getenforce | tr '[A-Z]' '[a-z]')" != "disabled" ]; then + chcon --reference=/tmp tmp +fi + +# Use git to manage patches. +# http://rwmj.wordpress.com/2011/08/09/nice-rpm-git-patch-management-trick/ +git init +git config user.email "libguestfs@redhat.com" +git config user.name "libguestfs" +git add . +git commit -a -q -m "%{version} baseline" +git am %{patches} + +# Patches affect Makefile.am and configure.ac, so rerun autotools. +autoreconf -fi + +# Replace developer-centric README that ships with libguestfs, with +# our replacement file. +mv README README.orig +sed 's/@VERSION@/%{version}/g' < %{SOURCE4} > README + + +%build +# 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 + extra= +else + mkdir cachedir repo + # -n 1 because of RHBZ#980502. + find /var/cache/{dnf,yum} -type f -name '*.rpm' -print0 | \ + xargs -0 -n 1 cp -t repo + createrepo_c repo + sed -e "s|@PWD@|$(pwd)|" %{SOURCE6} > yum.conf + extra=--with-supermin-packager-config=$(pwd)/yum.conf +fi + +export QEMU=/usr/libexec/qemu-kvm +export PYTHON=%{__python3} + +%{configure} \ + --with-default-backend=libvirt \ + --with-extra="rhel=%{rhel},release=%{release},libvirt" \ + --with-qemu="qemu-kvm qemu-system-%{_build_arch} qemu" \ + --disable-php \ + --disable-haskell \ + --disable-erlang \ + --disable-golang \ + --with-gtk=no \ + $extra + +# Building index-parse.c by hand works around a race condition in the +# autotools cruft, where two or more copies of yacc race with each +# other, resulting in a corrupted file. +# +# 'INSTALLDIRS' ensures that Perl and Ruby libs are installed in the +# vendor dir not the site dir. +make -j1 -C builder index-parse.c +make V=1 INSTALLDIRS=vendor %{?_smp_mflags} + + +%check + +%ifarch %{test_arches} +export LIBGUESTFS_DEBUG=1 +export LIBGUESTFS_TRACE=1 +export LIBVIRT_DEBUG=1 + +if ! make quickcheck QUICKCHECK_TEST_TOOL_ARGS="-t 1200"; then + cat $HOME/.cache/libvirt/qemu/log/* + exit 1 +fi +%endif + + +%install +# This file is creeping over 1 MB uncompressed, and since it is +# included in the -devel subpackage, compress it to reduce +# installation size. +gzip -9 ChangeLog + +# '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 + +# Delete static libraries. +rm $( find $RPM_BUILD_ROOT -name '*.a' | grep -v /ocaml/ ) + +# Delete libtool files. +find $RPM_BUILD_ROOT -name '*.la' -delete + +# Delete some bogus Perl files. +find $RPM_BUILD_ROOT -name perllocal.pod -delete +find $RPM_BUILD_ROOT -name .packlist -delete +find $RPM_BUILD_ROOT -name '*.bs' -delete +find $RPM_BUILD_ROOT -name 'bindtests.pl' -delete + +# Remove obsolete binaries (RHBZ#947438). +rm $RPM_BUILD_ROOT%{_bindir}/virt-list-filesystems +rm $RPM_BUILD_ROOT%{_bindir}/virt-list-partitions +rm $RPM_BUILD_ROOT%{_bindir}/virt-tar +rm $RPM_BUILD_ROOT%{_mandir}/man1/virt-list-filesystems.1* +rm $RPM_BUILD_ROOT%{_mandir}/man1/virt-list-partitions.1* +rm $RPM_BUILD_ROOT%{_mandir}/man1/virt-tar.1* + +# Don't use versioned jar file (RHBZ#1022133). +# See: https://bugzilla.redhat.com/show_bug.cgi?id=1022184#c4 +mv $RPM_BUILD_ROOT%{_datadir}/java/%{name}-%{version}.jar \ + $RPM_BUILD_ROOT%{_datadir}/java/%{name}.jar + +# Move installed documentation back to the source directory so +# we can install it using a %%doc rule. +mv $RPM_BUILD_ROOT%{_docdir}/libguestfs installed-docs +gzip --best installed-docs/*.xml + +# Split up the monolithic packages file in the supermin appliance so +# we can install dependencies in subpackages. +pushd $RPM_BUILD_ROOT%{_libdir}/guestfs/supermin.d +function move_to +{ + if ! grep -Esq "^$1$" packages; then + echo "move_to $1: package name not found in packages file" + exit 1 + fi + grep -Ev "^$1$" < packages > packages-t + mv packages-t packages + echo "$1" >> "$2" +} +move_to curl zz-packages-dib +move_to kpartx zz-packages-dib +move_to qemu-img zz-packages-dib +move_to which zz-packages-dib +move_to gfs2-utils zz-packages-gfs2 +move_to iputils zz-packages-rescue +move_to lsof zz-packages-rescue +move_to openssh-clients zz-packages-rescue +move_to pciutils zz-packages-rescue +move_to strace zz-packages-rescue +move_to vim-minimal zz-packages-rescue +move_to rsync zz-packages-rsync +move_to xfsprogs zz-packages-xfs +popd + +# If there is a bogus dependency on kernel-*, rename it to 'kernel' +# instead. This can happen for various reasons: +# - DNF picks kernel-debug instead of kernel. +# - Version of kernel-rt in brew > version of kernel. +# On all known architectures, depending on 'kernel' should +# mean "we need a kernel". +pushd $RPM_BUILD_ROOT%{_libdir}/guestfs/supermin.d +sed 's/^kernel-.*/kernel/' < packages > packages-t +mv packages-t packages +popd + +# Guestfish colour prompts. +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/profile.d +install -m 0644 %{SOURCE5} $RPM_BUILD_ROOT%{_sysconfdir}/profile.d + +# Virt-tools data directory. +mkdir -p $RPM_BUILD_ROOT%{_datadir}/virt-tools +cp %{SOURCE96} $RPM_BUILD_ROOT%{_datadir}/virt-tools/rhsrvany.exe +cp %{SOURCE97} $RPM_BUILD_ROOT%{_datadir}/virt-tools/rhev-apt.exe + +%ifnarch %{v2v_arches} +rm $RPM_BUILD_ROOT%{_bindir}/virt-v2v* +rm $RPM_BUILD_ROOT%{_mandir}/man1/virt-v2v* +rm -r $RPM_BUILD_ROOT%{_datadir}/virt-tools +%endif + +# Delete the v2v test harness. (This might or might not exist +# depending on extra BRs installed when the package is built, so use +# '-f' option here.) +rm -rf $RPM_BUILD_ROOT%{_libdir}/ocaml/v2v_test_harness +rm -rf $RPM_BUILD_ROOT%{_libdir}/ocaml/stublibs/dllv2v_test_harness* +rm -f $RPM_BUILD_ROOT%{_mandir}/man1/virt-v2v-test-harness.1* + +# Remove the .gitignore file from ocaml/html which will be copied to docdir. +rm ocaml/html/.gitignore + +# Delete virt-p2v bash completion files, as virt-p2v was moved +# to its own source. +rm $RPM_BUILD_ROOT%{_datadir}/bash-completion/completions/virt-p2v-* + +%ifarch %{benchmark_arches} +# Copy the benchmarking tools and man pages, since upstream doesn't +# install them by default. NB Don't install the libtool wrapper scripts. +libtool --mode=install install -m 0755 utils/boot-analysis/boot-analysis $RPM_BUILD_ROOT%{_bindir}/libguestfs-boot-analysis +libtool --mode=install install -m 0755 utils/boot-benchmark/boot-benchmark $RPM_BUILD_ROOT%{_bindir}/libguestfs-boot-benchmark +install -m 0755 utils/boot-benchmark/boot-benchmark-range.pl $RPM_BUILD_ROOT%{_bindir}/libguestfs-boot-benchmark-range.pl +install -m 0644 utils/boot-analysis/boot-analysis.1 $RPM_BUILD_ROOT%{_mandir}/man1/libguestfs-boot-analysis.1 +install -m 0644 utils/boot-benchmark/boot-benchmark.1 $RPM_BUILD_ROOT%{_mandir}/man1/libguestfs-boot-benchmark.1 +%endif + +# Find locale files. +%find_lang %{name} + + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig + +%post java -p /sbin/ldconfig + +%postun java -p /sbin/ldconfig + + +%files -f %{name}.lang +%doc COPYING README +%{_bindir}/libguestfs-test-tool +%{_libdir}/guestfs/ +%exclude %{_libdir}/guestfs/supermin.d/zz-packages-* +%{_libdir}/libguestfs.so.* +%{_mandir}/man1/guestfs-faq.1* +%{_mandir}/man1/guestfs-performance.1* +%{_mandir}/man1/guestfs-recipes.1* +%{_mandir}/man1/guestfs-release-notes.1* +%{_mandir}/man1/guestfs-security.1* +%{_mandir}/man1/libguestfs-test-tool.1* + + +%ifarch %{benchmark_arches} +%files benchmarking +%{_bindir}/libguestfs-boot-analysis +%{_bindir}/libguestfs-boot-benchmark +%{_bindir}/libguestfs-boot-benchmark-range.pl +%{_mandir}/man1/libguestfs-boot-analysis.1* +%{_mandir}/man1/libguestfs-boot-benchmark.1* +%endif + + +%files devel +%doc AUTHORS BUGS ChangeLog.gz HACKING TODO README +%doc examples/*.c +%doc installed-docs/* +%{_libdir}/libguestfs.so +%{_sbindir}/libguestfs-make-fixed-appliance +%{_mandir}/man1/guestfs-building.1* +%{_mandir}/man1/guestfs-hacking.1* +%{_mandir}/man1/guestfs-internals.1* +%{_mandir}/man1/guestfs-testing.1* +%{_mandir}/man1/libguestfs-make-fixed-appliance.1* +%{_mandir}/man3/guestfs.3* +%{_mandir}/man3/guestfs-examples.3* +%{_mandir}/man3/libguestfs.3* +%{_includedir}/guestfs.h +%{_libdir}/pkgconfig/libguestfs.pc + +%files gfs2 +%{_libdir}/guestfs/supermin.d/zz-packages-gfs2 + +%files rsync +%{_libdir}/guestfs/supermin.d/zz-packages-rsync + +%files rescue +%{_libdir}/guestfs/supermin.d/zz-packages-rescue + +%files xfs +%{_libdir}/guestfs/supermin.d/zz-packages-xfs + + +%files inspect-icons +# no files + + +%files tools-c +%doc README +%config(noreplace) %{_sysconfdir}/libguestfs-tools.conf +%{_sysconfdir}/virt-builder +%dir %{_sysconfdir}/xdg/virt-builder +%dir %{_sysconfdir}/xdg/virt-builder/repos.d +%config %{_sysconfdir}/xdg/virt-builder/repos.d/* +%config %{_sysconfdir}/profile.d/guestfish.sh +%{_mandir}/man5/libguestfs-tools.conf.5* +%{_bindir}/guestfish +%{_mandir}/man1/guestfish.1* +%{_bindir}/guestmount +%{_mandir}/man1/guestmount.1* +%{_bindir}/guestunmount +%{_mandir}/man1/guestunmount.1* +%{_bindir}/virt-alignment-scan +%{_mandir}/man1/virt-alignment-scan.1* +%{_bindir}/virt-builder +%{_mandir}/man1/virt-builder.1* +%{_bindir}/virt-builder-repository +%{_mandir}/man1/virt-builder-repository.1* +%{_bindir}/virt-cat +%{_mandir}/man1/virt-cat.1* +%{_bindir}/virt-copy-in +%{_mandir}/man1/virt-copy-in.1* +%{_bindir}/virt-copy-out +%{_mandir}/man1/virt-copy-out.1* +%{_bindir}/virt-customize +%{_mandir}/man1/virt-customize.1* +%{_bindir}/virt-df +%{_mandir}/man1/virt-df.1* +%{_bindir}/virt-diff +%{_mandir}/man1/virt-diff.1* +%{_bindir}/virt-edit +%{_mandir}/man1/virt-edit.1* +%{_bindir}/virt-filesystems +%{_mandir}/man1/virt-filesystems.1* +%{_bindir}/virt-format +%{_mandir}/man1/virt-format.1* +%{_bindir}/virt-get-kernel +%{_mandir}/man1/virt-get-kernel.1* +%{_bindir}/virt-index-validate +%{_mandir}/man1/virt-index-validate.1* +%{_bindir}/virt-inspector +%{_mandir}/man1/virt-inspector.1* +%{_bindir}/virt-log +%{_mandir}/man1/virt-log.1* +%{_bindir}/virt-ls +%{_mandir}/man1/virt-ls.1* +%{_bindir}/virt-make-fs +%{_mandir}/man1/virt-make-fs.1* +%{_bindir}/virt-rescue +%{_mandir}/man1/virt-rescue.1* +%{_bindir}/virt-resize +%{_mandir}/man1/virt-resize.1* +%{_bindir}/virt-sparsify +%{_mandir}/man1/virt-sparsify.1* +%{_bindir}/virt-sysprep +%{_mandir}/man1/virt-sysprep.1* +%{_bindir}/virt-tail +%{_mandir}/man1/virt-tail.1* +%{_bindir}/virt-tar-in +%{_mandir}/man1/virt-tar-in.1* +%{_bindir}/virt-tar-out +%{_mandir}/man1/virt-tar-out.1* + + +%files tools +%doc README +%{_bindir}/virt-win-reg +%{_mandir}/man1/virt-win-reg.1* + + +%files -n virt-dib +%doc COPYING README +%{_bindir}/virt-dib +%{_mandir}/man1/virt-dib.1* +%{_libdir}/guestfs/supermin.d/zz-packages-dib + + +%ifarch %{v2v_arches} +%files -n virt-v2v +%doc COPYING README +%{_bindir}/virt-v2v +%{_bindir}/virt-v2v-copy-to-local +%{_mandir}/man1/virt-v2v.1* +%{_mandir}/man1/virt-v2v-copy-to-local.1* +%{_mandir}/man1/virt-v2v-input-vmware.1* +%{_mandir}/man1/virt-v2v-input-xen.1* +%{_mandir}/man1/virt-v2v-output-local.1* +%{_mandir}/man1/virt-v2v-output-openstack.1* +%{_mandir}/man1/virt-v2v-output-rhv.1* +%{_mandir}/man1/virt-v2v-support.1* +%{_datadir}/virt-tools +%endif + + +%files bash-completion +%dir %{_datadir}/bash-completion/completions +%{_datadir}/bash-completion/completions/guestfish +%{_datadir}/bash-completion/completions/guestmount +%{_datadir}/bash-completion/completions/guestunmount +%{_datadir}/bash-completion/completions/libguestfs-test-tool +%{_datadir}/bash-completion/completions/virt-* + + +%files -n ocaml-%{name} +%{_libdir}/ocaml/guestfs +%exclude %{_libdir}/ocaml/guestfs/*.a +%exclude %{_libdir}/ocaml/guestfs/*.cmxa +%exclude %{_libdir}/ocaml/guestfs/*.cmx +%exclude %{_libdir}/ocaml/guestfs/*.mli +%{_libdir}/ocaml/stublibs/dllmlguestfs.so +%{_libdir}/ocaml/stublibs/dllmlguestfs.so.owner + + +%files -n ocaml-%{name}-devel +%doc ocaml/examples/*.ml ocaml/html +%{_libdir}/ocaml/guestfs/*.a +%{_libdir}/ocaml/guestfs/*.cmxa +%{_libdir}/ocaml/guestfs/*.cmx +%{_libdir}/ocaml/guestfs/*.mli +%{_mandir}/man3/guestfs-ocaml.3* + + +%files -n perl-Sys-Guestfs +%doc perl/examples/*.pl +%{perl_vendorarch}/* +%{_mandir}/man3/Sys::Guestfs.3pm* +%{_mandir}/man3/guestfs-perl.3* + + +%files -n python3-%{name} +%doc python/examples/*.py +%{python3_sitearch}/libguestfsmod*.so +%{python3_sitearch}/guestfs.py +%{python3_sitearch}/__pycache__/guestfs*.py* +%{_mandir}/man3/guestfs-python.3* + + +%files -n ruby-%{name} +%doc ruby/examples/*.rb +%doc ruby/doc/site/* +%{ruby_vendorlibdir}/guestfs.rb +%{ruby_vendorarchdir}/_guestfs.so +%{_mandir}/man3/guestfs-ruby.3* + + +%files java +%{_libdir}/libguestfs_jni*.so.* +%{_datadir}/java/*.jar + + +%files java-devel +%doc java/examples/*.java +%{_libdir}/libguestfs_jni*.so +%{_mandir}/man3/guestfs-java.3* + + +%files javadoc +%{_javadocdir}/%{name} + + +%files -n lua-guestfs +%doc lua/examples/*.lua +%doc lua/examples/LICENSE +%{_libdir}/lua/*/guestfs.so +%{_mandir}/man3/guestfs-lua.3* + + +%files gobject +%{_libdir}/libguestfs-gobject-1.0.so.0* +%{_libdir}/girepository-1.0/Guestfs-1.0.typelib + + +%files gobject-devel +%{_libdir}/libguestfs-gobject-1.0.so +%{_includedir}/guestfs-gobject.h +%dir %{_includedir}/guestfs-gobject +%{_includedir}/guestfs-gobject/*.h +%{_datadir}/gir-1.0/Guestfs-1.0.gir +%{_libdir}/pkgconfig/libguestfs-gobject-1.0.pc +%{_mandir}/man3/guestfs-gobject.3* + + +%files man-pages-ja +%lang(ja) %{_mandir}/ja/man1/*.1* +%lang(ja) %{_mandir}/ja/man3/*.3* +%lang(ja) %{_mandir}/ja/man5/*.5* + + +%files man-pages-uk +%lang(uk) %{_mandir}/uk/man1/*.1* +%lang(uk) %{_mandir}/uk/man3/*.3* +%lang(uk) %{_mandir}/uk/man5/*.5* + + +%changelog +* Mon Apr 27 2020 Danilo C. L. de Paula - 1.40.2 +- Resolves: bz#1810193 + (Upgrade components in virt:rhel module:stream for RHEL-8.3 release) + +* Tue Dec 10 2019 Pino Toscano - 1:1.38.4-15 +- Stop building virt-p2v-maker, as it will be built by its own source + resolves: rhbz#1777924 + +* Thu Aug 08 2019 Pino Toscano - 1:1.38.4-14 +- v2v: use -T as argument of scp when copying vmx files via ssh + resolves: rhbz#1738886 + +* Fri Jun 28 2019 Danilo de Paula +- Rebuild all virt packages to fix RHEL's upgrade path +- Resolves: rhbz#1695587 + (Ensure modular RPM upgrade path) + +* Wed Jun 05 2019 Pino Toscano - 1:1.38.4-12 +- v2v: update nbdkit information in documentation + resolves: rhbz#1651115 +- v2v: use proper SELinux label for nbdkit sockets + resolves: rhbz#1717088 + +* Thu Apr 11 2019 Pino Toscano - 1:1.38.4-11 +- Use a better icon for RHEL 7+ guests + resolves: rhbz#1679483 +- Fix inspection of partition-less devices + resolves: rhbz#1679966 +- v2v: ship a newer version of rhev-apt.exe + resolves: rhbz#1688062 + +* Wed Jan 23 2019 Pino Toscano - 1:1.38.4-10 +- Rebase to libguestfs 1.38.4 in RHEL 8.0. + +* Mon Jan 22 2018 Pino Toscano - 1:1.36.10-6 +- Rebase to libguestfs 1.36.10 in RHEL 7.5. + resolves: rhbz#1472272 +- Build against OCaml 4.05 + resolves: rhbz#1447981 +- Enable the copyonread flag when running the appliance using libvirt. + resolves: rhbz#1466563 +- Make sure kernel-rt is never used as Requires. + resolves: rhbz#1471651 +- v2v: disable unconfiguration of manually installed VMware tools. + resolves: rhbz#1477905 +- v2v: prefer pigz or pxz for uncompressing OVA files, if available + resolves: rhbz#1448739 +- resize: handle empty UUIDs for swap partitions + resolves: rhbz#1482737 +- v2v: remove mention of --dcpath in an error message + resolves: rhbz#1486197 +- Disables the QEMU image file locking when opening disks as read-only + resolves: rhbz#1417306 + resolves: rhbz#1503497 +- Briefly document the format used for URIs + resolves: rhbz#1450325 +- v2v: deal with grub2 configurations without a default set + resolves: rhbz#1472288 +- v2v: warn when a guest has passthrough devices + resolves: rhbz#1472719 +- v2v: fix three regular expressions + resolves: rhbz#1494555 +- v2v: enable conversion of full-disk LUKS-encrypted Linux guests + resolves: rhbz#1451665 +- v2v: new 'vddk' import method + resolves: rhbz#1477912 + resolves: rhbz#1513884 +- Enable libguestfs to work on z Systems + resolves: rhbz#1479526 +- p2v: fx check for sudo requiring a password + resolves: rhbz#1500673 +- v2v: handle disks with snapshots in vCenter + resolves: rhbz#1172425 +- rescue: backport improved version + resolves: rhbz#1438710 +- v2v: improve bootloader detection + resolves: rhbz#1508299 +- v2v: parse MAC address of network interfaces in OVF files + resolves: rhbz#1506572 +- Unconditionally depend on libvirt-daemon-kvm >= 3.9.0-1, which will always + pull the right qemu-kvm too, and thus remove the unversioned dependencies + on it + resolves: rhbz#1500870 +- v2v: fix RPM file owned test + resolves: rhbz#1503958 +- Do not open read-only disks using in the libvirt backend + resolves: rhbz#1518517 +- v2v: handle better when grubby does not report any default kernel + resolves: rhbz#1519204 +- v2v: enhance vmx import method to access via SSH + resolves: rhbz#1523767 +- builder: fix caching of templates when using --cache-all-templates + resolves: rhbz#1523650 + +* Thu Jun 22 2017 Pino Toscano - 1:1.36.3-6 +- Rebase to libguestfs 1.36 in RHEL 7.4. + resolves: rhbz#1359086 +- v2v: always use names for libvirt pools + resolves: rhbz#1141631 +- v2v: correctly find GRUB in RHEL UEFI guests +- v2v: uninstall VMware tools packages from guests + resolves: rhbz#1155150 +- v2v: install RHEV-APT only when using -o rhev/-o vdsm + resolves: rhbz#1161019 +- New API: btrfs-filesystem-show + resolves: rhbz#1164765 +- p2v: always enable debugging when running virt-v2v + resolves: rhbz#1167623 +- libguestfs prefers virtio-pci on aarch64 + resolves: rhbz#1237250 +- v2v: make sure to copy all the driver files on Windows + resolves: rhbz#1255610 +- Better tolerate corrupted Windows hivex; bump the hivex BuildRequires and + Requires to >= 1.3.10-5.8.el7 + resolves: rhbz#1311890 +- v2v: ignore all the environment variables for proxy when exporting from + vCenter + resolves: rhbz#1354507 +- virt-sysprep can deal with full-LUKS encrypted guests + resolves: rhbz#1362649 +- All the tools have bash completion scripts. + resolves: rhbz#1367738 +- v2v: do not remove Processor and Intelppm nodes in Windows guests + resolves: rhbz#1372668 +- Fix SELinux relabelling in old RHEL 6 guests, by adjusting a broken + regular expression in file_contexts file + resolves: rhbz#1374232 +- v2v: set all the properties on creation when exporting to Glance + resolves: rhbz#1374405 +- v2v: set hw_video_model when exporting to Glance + resolves: rhbz#1374651 +- v2v: fix OVA conversion as root using the libvirt backend + resolves: rhbz#1375157 +- Various improvements and fixes to the documentation + resolves: rhbz#1377081 + resolves: rhbz#1390876 + resolves: rhbz#1398070 + resolves: rhbz#1425306 +- v2v: support and + resolves: rhbz#1378022 +- v2v: allow libvirt >= 2.1.0 for vCenter conversions + resolves: rhbz#1379240 +- p2v: enable mnemonics in the GUI + resolves: rhbz#1379289 +- Split virt-p2v, and the tools for it, in an own package: virt-p2v-maker + resolves: rhbz#1382275 +- Correctly parse mount options in btrfs entries in /etc/fstab. + resolves: rhbz#1383517 +- Read secrets from libvirt domains, when inspecting them + resolves: rhbz#1392798 +- v2v: add --vdsm-compat=1.1 flag for VDSM + resolves: rhbz#1400205 +- Fix inspection with UsrMove and /usr in a separate partition + resolves: rhbz#1401474 +- v2v: improve import compatibility with OVAs produced by AWS + resolves: rhbz#1402301 +- resize: allow URIs for the output disk + resolves: rhbz#1404182 +- Disable EDD when launching the appliance + resolves: rhbz#1404287 +- v2v: increase the memory allocated to the appliance + resolves: rhbz#1418283 +- p2v: switch from GTK+ 2 to GTK+ 3 +- p2v: add dbus-devel as BuildRequires to disable suspension during the + conversion +- libguestfs-java: bump the java-headless Require to >= 1.7.0, matching the + Build-Require, and the generated bytecode + resolves: rhbz#1364518 +- Do not try to use/write to /var/cache/yum & /var/log/yum.log +- Bump ocaml-findlib-devel BuildRequires to >= 1.3.3-7.el7, because of + RHBZ#1403897 +- v2v: remove --dcpath & --dcPath from --help output too + resolves: rhbz#1429430 +- v2v: force VNC as display for -i disk, as SDL is not supported + resolves: rhbz#1372671 +- v2v, p2v: rename rhvm network to ovirtmgmt + resolves: rhbz#1429491 +- v2v: when exporting to local disk, check that UEFI firmware is installed + before conversion + resolves: rhbz#1429506 +- dib: actually generate SHA256 checksums when using --checksum + resolves: rhbz#1430184 +- v2v: do not mention SUSE Xen hosts as supported + resolves: rhbz#1430203 +- v2v: depend on OVMF/AAVMF, for converting EFI guests + resolves: rhbz#1429643 +- v2v: use absolute path when using an OVA as backing file + resolves: rhbz#1430680 +- v2v: support Debian/Ubuntu guests + resolves: rhbz#1387213 +- sysprep: remove DHCP_HOSTNAME entries + resolves: rhbz#1427529 +- v2v: avoid repeated "run virt-v2v -v -x" message on error + resolves: rhbz#1167623 +- bash-completion: add script for virt-v2v-copy-to-local + resolves: rhbz#1367738 +- v2v: fix virtio block driver installation for Windows 10 and Windows 2016 + resolves: rhbz#1434737 +- Replace the libosinfo dependency with osinfo-db, since we are only using + the osinfo database. +- v2v: fix virtio driver installation for Windows 8 UEFI + resolves: rhbz#1431579 +- v2v: new 'vmx' import method + resolves: rhbz#1441197 +- v2v: properly identify Windows 2016 guests when exporting them to RHV-M + resolves: rhbz#1447202 +- Run pvresize in non-interactive mode + resolves: rhbz#1460692 +- resize: make sure the input disk is read-only + resolves: rhbz#1463714 +- Switch qemu-kvm-rhev dependency to qemu-kvm on aarch64 + resolves: rhbz#1463646 + +* Tue Aug 30 2016 Richard W.M. Jones - 1:1.32.7-3 +- Rebase to libguestfs 1.32 in RHEL 7.3 + resolves: rhbz#1218766 +- The full tests are now run after the package has been built. +- New tool and subpackage: virt-dib (safe diskimage-builder replacement). +- New subpackage libguestfs-inspect-icons to reduce dependencies of main pkg + (see https://bugzilla.redhat.com/1194158). +- New tool: virt-get-kernel. +- Depend on java-headless instead of full java. +- New tool: virt-v2v-copy-to-local. +- Disable virt-v2v subpackage on ppc64 etc + resolves: rhbz#1287826 +- v2v: Remove VirtualBox Additions correctly + resolves: rhbz#1296606 +- Add clearer warnings sections to all man pages + resolves: rhbz#1293527 +- v2v: Disable the --in-place option. +- v2v: Support conversion of Windows > 7 + resolves: rhbz#1190669 +- Add code to verify tarball signatures. +- General performance improvements. +- v2v: Prevent duplicate -b, -n, -oa options + resolves: rhbz#1326266 + resolves: rhbz#1325825 +- v2v: Unquote UUID and LABEL in fstab (util-linux 1335671) +- v2v: Fix alignment issues in treeviews in conversion dialog + resolves: rhbz#1340407 +- p2v: spinner should be hidden when it stops spinning + resolves: rhbz#1341564 +- p2v: ethtool command is not supported on p2v client + resolves: rhbz#1341608 +- p2v: Add ifconfig command to ISO + resolves: rhbz#1342447 +- p2v: Warn if virt-p2v-make-disk used on a partition + resolves: rhbz#1342337 +- Build using OCaml with fix for CVE-2015-8869. + resolves: rhbz#1343101 +- customize: Add --uninstall option (upstream 1343375) +- p2v: Document permissions on id_rsa file + resolves: rhbz#1343414 +- p2v: Print full curl error message + resolves: rhbz#1343423 +- get-kernel: Fix --format auto + resolves: rhbz#1341984 +- v2v: Provide better information to RHEV-M + resolves: rhbz#1342398 +- customize: Give an error if --truncate-recursive path does not exist + resolves: rhbz#1345809 +- sysprep: Add --network option so that --install option can be used + resolves: rhbz#1345813 +- p2v: Print proper error if incorrect password is given + resolves: rhbz#1227599 +- p2v: Print ssh error if incorrect hostname is given + resolves: rhbz#1167916 +- p2v: Display progress of operation in non-GUI mode + resolves: rhbz#1229386 +- p2v: Add a dialog confirming the user really means to cancel + resolves: rhbz#1340464 +- p2v: log window should process colour escapes and backspaces + resolves: rhbz#1314244 +- v2v: Fix installation of virtio drivers with *.dll files + resolves: rhbz#1311373 +- p2v: Improve error message when ssh login to conversion server fails + resolves: rhbz#1348900 +- v2v: Remove --dcpath parameter from manual + resolves: rhbz#1315237 +- v2v: Fix conversion of guests with floppy drives + resolves: rhbz#1309706 +- p2v: Better error when sudo requires a password + resolves: rhbz#1340809 +- v2v: Refuse to convert if there is < 1GB free in temporary directory + resolves: rhbz#1316479 +- inspection: Get Windows drive letters for GPT disks + resolves: rhbz#1349237 +- p2v: Add disk utils and display serial number of disks + resolves: rhbz#855058 +- p2v: Fix timeout error when connecting to unresponsive ssh server + resolves: rhbz#1350363 +- Remove external dependency generator. Use supermin RPM deps instead. + related: rhbz#1309796 +- p2v: Flush messages to the journal immediately + resolves: rhbz#1229386 +- customize: Fix --install on ppc64le + resolves: rhbz#1264835 +- lib: Fix finding icons in Windows 7 64 bit guests + resolevs: rhbz#1352761 +- v2v: Add virsh --quiet flag when running virt-v2v --quiet + resolves: rhbz#1358142 +- lib: Fix inspection of ISOs with latest libosinfo + resolves: rhbz#1359652 +- dib: Fix run_command exit handlers on failure + resolves: rhbz#1362357 +- dib: Rework run of extra-data.d hooks + resolves: rhbz#1362354 +- Miscellaneous fixes to man pages and --help output + resolves: rhbz#1362668 +- lib: Specify backing format for read-only files + resolves: rhbz#1354335 +- Fix --selinux-relabel option + resolves: rhbz#1362669 +- sparsify: Fix --in-place option with UEFI guest + resolves: rhbz#1364347 +- p2v: Use latest linux-firmware in ISO + resolves: rhbz#1364419 +- v2v: Fix guest name when using -i disk + resolves: rhbz#1365005 +- p2v: Fix GUI message. +- v2v: Make fstrim message clearer + resolves: rhbz#1366456 +- v2v: Fix conversion of UEFI guests when Secure Boot OVMF installed + resolves: rhbz#1367615 +- lib: Fix assert-fail if port is missing in libvirt XML + resolves: rhbz#1370424 + +* Mon Sep 14 2015 Richard W.M. Jones - 1:1.28.1-1.55 +- Fix previous commit by applying the patch this time (1243493) + +* Sun Sep 13 2015 Richard W.M. Jones - 1:1.28.1-1.54 +- v2v: Permit libguestfs-winsupport to be used by virt-win-reg and + virt-inspector (1243493) + +* Thu Sep 10 2015 Richard W.M. Jones - 1:1.28.1-1.53 +- v2v: Error if certain options appear twice on the command line (1261242) +- v2v: Add --dcpath parameter to allow dcPath to be overridden (1256823) +- v2v: Partially revert: Fix OVF XML to enable qxl display (1260590) +- v2v: Detect AVG Technologies as AV software (1261436) + resolves: rhbz#1261281 + +* Tue Sep 8 2015 Richard W.M. Jones - 1:1.28.1-1.52 +- v2v: Warn if Group Policy or AV software may result in 7B boot failure + (1260689) +- v2v: Fix OVF XML to enable qxl display + resolves: rhbz#1260590 + +* Tue Sep 1 2015 Richard W.M. Jones - 1:1.28.1-1.51 +- v2v: Fix handling of extra slashes in dcPath calculation + resolves: rhbz#1258342 rhbz#1256823 +- v2v: Fix -oa preallocation option + resolves: rhbz#1251909 + +* Sun Aug 30 2015 Richard W.M. Jones - 1:1.28.1-1.50 +- v2v: + * When debugging, dump OVF to stderr. + * Ignore missing kernels from grub + resolves: rhbz#1230412 + * Calculate VMware dcPath correctly (1256823) + * Map empty VMware network or bridge name to default (1257895) +- p2v: + * Wait for network to come online before testing connection + resolves: rhbz#1256222 +- Fix tests to run correctly with libguestfs-winsupport 7.2. + +* Wed Aug 05 2015 Richard W.M. Jones - 1:1.28.1-1.49 +- p2v: Closing incoming ports on the virt-p2v ISO + resolves: rhbz#1248678 + +* Tue Jul 28 2015 Richard W.M. Jones - 1:1.28.1-1.48 +- v2v: Include lsof in base appliance + resolves: rhbz#1246032 + +* Thu Jul 23 2015 Richard W.M. Jones - 1:1.28.1-1.47 +- v2v: Work around 'umount: /sysroot: target is busy' + resolves: rhbz#1246032 +- v2v: Permit libguestfs-winsupport to be used by virt-win-reg and + virt-inspector + resolves: rhbz#1243493 + +* Tue Jul 7 2015 Richard W.M. Jones - 1:1.28.1-1.46 +- v2v: Refuse to convert Windows > 7 + reverts: rhbz#1190669 +- v2v: Depend directly on libguestfs-xfs + resolves: rhbz#1240275 +- v2v: Inclusion of libguestfs-winsupport in RHEL 7.2 + resolves: rhbz#1240274, rhbz#1240276 + +* Mon Jul 6 2015 Richard W.M. Jones - 1:1.28.1-1.44 +- v2v: Fix error message when grub.conf is malformed + resolves: rhbz#1239053 +- v2v: Various fixes to conversion of UEFI systems + resolves: rhbz#1184690 + +* Thu Jul 2 2015 Richard W.M. Jones - 1:1.28.1-1.43 +- virt-sysprep: Don't delete /var/spool/at/.SEQ + resolves: rhbz#1238579 + +* Wed Jul 1 2015 Richard W.M. Jones - 1:1.28.1-1.42 +- v2v: Fix installation of virtio drivers in Windows 2008 and 2008 R2 + resolves: rhbz#1237869 + related: rhbz#1234351 + +* Tue Jun 30 2015 Richard W.M. Jones - 1:1.28.1-1.41 +- v2v: Extend the timeout when converting from VMware + resolves: rhbz#1146007 +- v2v: Fix memory safety when freeing libxml2 objects. +- v2v: Add comment to OVF output if actual_size field is estimated. + +* Thu Jun 25 2015 Richard W.M. Jones - 1:1.28.1-1.40 +- v2v: Disable support for Windows > 7. + reverts: rhbz#1190669 +- v2v: Add support for getting drivers from virtio-win ISO + resolves: rhbz#1234351 + +* Tue Jun 16 2015 Richard W.M. Jones - 1:1.28.1-1.39 +- v2v: Depend on qemu-kvm instead of qemu-kvm-rhev (except on aarch64/power). +- v2v: Don't fail if one of the input disks is blank + resolves: rhbz#1232192 +- p2v: Fix parsing of p2v.memory parameter (1229262). + +* Tue Jun 09 2015 Richard W.M. Jones - 1:1.28.1-1.38 +- p2v: Set conversion status when conversion is cancelled + resolves: rhbz#1226794 +- p2v: Fix kernel command line parsing + resolves: rhbz#1229340 +- p2v: In command line mode, power off machine after conversion + resolves: rhbz#1229385 +- Fix for rebased systemd in RHEL 7.2. + +* Fri May 29 2015 Richard W.M. Jones - 1:1.28.1-1.37 +- ppc64le: Rebuild with fixed OCaml compiler + resolves: rhbz#1224676, rhbz#1224675 +- Fix virt-sparsify on qcow2 files when using qemu-kvm + resolves: rhbz#1225467 +- Remove some perl dependencies which are no longer actually used. +- Further attempts to fix qemu-kvm dependency on aarch64, ppc64le + resolves: rhbz#1177910 + +* Tue May 19 2015 Richard W.M. Jones - 1:1.28.1-1.36 +- p2v: Fix network in virt-p2v appliance + resolves: rhbz#1222975 +- p2v: Display network card MAC and vendor in conversion dialog (855059). +- p2v: More fixes to Add Network Connection dialog + related: rhbz#1167921 +- virt-builder: Fix --selinux-relabel flag on cross-arch builds + resolves: rhbz#1222993 + +* Tue May 12 2015 Richard W.M. Jones - 1:1.28.1-1.35 +- Further attempts to fix qemu-kvm dependency on aarch64, ppc64, ppc64le + resolves: rhbz#1177910 +- v2v: Fix memory leak in earlier fix for bug 889082 + resolves: rhbz#889082 + +* Mon May 11 2015 Richard W.M. Jones - 1:1.28.1-1.33 +- p2v: Add restrictions for vCPUs and memory in client + resolves: rhbz#823758 +- v2v: Check if guest with same name already exists in libvirt + resolves: rhbz#889082 +- p2v: Add Network Connection dialog + resolves: rhbz#1167921 +- v2v: Fix list of operating system variants passed to RHEV + resolves: rhbz#1219857, rhbz#1213324, rhbz#1213691 +- ppc64: Remove part of temporary workaround + related: rhbz#1177910 + +* Thu Apr 30 2015 Richard W.M. Jones - 1:1.28.1-1.32 +- v2v: Support conversion of EFI guests + resolves: rhbz#1184690 + +* Tue Apr 28 2015 Richard W.M. Jones - 1:1.28.1-1.31 +- v2v: Keep listen address for VNC (updated fix) + resolves: rhbz#1174073 + +* Fri Apr 24 2015 Richard W.M. Jones - 1:1.28.1-1.29 +- v2v: Convert sound card of guests + resolves: rhbz#1176493 + +* Mon Apr 20 2015 Richard W.M. Jones - 1:1.28.1-1.28 +- Remove 'ssh:' URLs from documentation + resolves: rhbz#1212677 +- libguestfs-tools-c 'provides' guestfish + (NB: will be removed in RHEL 8, use 'Requires: /usr/bin/guestfish' instead) + resolves: rhbz#1212002 +- v2v: Fix: warning: unknown guest operating system: windows when converting + to RHEV targets + resolves: rhbz#1213324 +- v2v: Fix: warning: fstrim: fstrim: /sysroot/: FITRIM ioctl failed + resolves: rhbz#1168144 + +* Thu Apr 16 2015 Richard W.M. Jones - 1:1.28.1-1.26 +- v2v: Keep listen address for VNC + resolves: rhbz#1174073 +- v2v: Preserve display port configuration when converting guests +- v2v: Support conversion of guests with disk type volume + resolves: rhbz#1146832 +- v2v: Initial support for gzipped ova imports. + related: rhbz#1186800 + +* Mon Apr 13 2015 Richard W.M. Jones - 1:1.28.1-1.25 +- Enable rbd (Ceph) support. +- rbd: Implement drive secrets + resolves: rhbz#1159030 +- virt-resize: Fix 'no space left on device' when resizing extended partition + resolves: rhbz#1172660 +- v2v: Update RHEV-APT to latest + resolves: rhbz#1186850 +- v2v: Update rhsrvany.exe to latest + resolves: rhbz#1187231 +- Drop dependency on selinux-policy + resolves: rhbz#1196705 +- Depend on fuse + resolves: rhbz#1201507 +- v2v: Allow configurable location for virtio drivers [1209225] +- Various fixes for setting long labels + resolves: rhbz#1164708 +- Fix mknod APIs not stripping permission bits from mode + resolves: rhbz#1182463 +- Allow LIBGUESTFS_TRACE=0, LIBGUESTFS_DEBUG=true etc + resolves: rhbz#1175196 +- Fix typo in description of ping-daemon API + resolves: rhbz#1175676 +- Disable gfs2 subpackage on !x86-64 [1211333] + +* Mon Apr 13 2015 Richard W.M. Jones - 1:1.28.1-1.24 +- Open RHEL 7.2 branch. +- Import brew-overrides.sh into dist-git. +- copy-patches.sh: Relax arbitrary requirement to split patches into + backports and RHEL 7 specific patches. +- v2v: Add --vdsm-ovf-output option + resolves: rhbz#1176598 +- v2v: Fix -o vdsm to work with multiple data domains + resolves: rhbz#1176591 +- v2v: Support conversions of Windows >= 8 + resolves: rhbz#1190669 +- v2v: Document that vCenter >= 5.0 is required + resolves: rhbz#1174200 + +* Thu Feb 5 2015 Richard W.M. Jones - 1:1.28.1-1.23 +- Fix virt-resize (and hence virt-builder --size) on guests using + UEFI bootloaders. + +* Mon Jan 26 2015 Richard W.M. Jones - 1:1.28.1-1.22 +- aarch64: Increase default appliance memory size. +- Make gfs2-utils conditional on x86, as it will not be supported on ARM. +- inspection: aarch64: Backport fix for inspection of EFI guests. + +* Fri Jan 23 2015 Richard W.M. Jones - 1:1.28.1-1.20 +- aarch64: Depend on AAVMF package. + +* Thu Jan 22 2015 Richard W.M. Jones - 1:1.28.1-1.19 +- aarch64: Add support for AAVMF + resolves: rhbz#1184504 + +* Mon Dec 15 2014 Richard W.M. Jones - 1:1.28.1-1.18 +- v2v: Copy graphics password from source to destination + resolves: rhbz#1174123 +- p2v: Allow ports to be reused and specify source port number + resolves: rhbz#1167774 +- p2v: Fix "Conversion was successful" dialog appearing on failure + resolves: rhbz#1167601 + +* Wed Dec 10 2014 Richard W.M. Jones - 1:1.28.1-1.17 +- v2v: Fix modifications to default kernel for legacy grub. + resolves: rhbz#1170073 + +* Mon Dec 8 2014 Richard W.M. Jones - 1:1.28.1-1.16 +- p2v: Wait for qemu-nbd to start up before starting virt-v2v + resolves: rhbz#1167774 + +* Fri Dec 5 2014 Richard W.M. Jones - 1:1.28.1-1.15 +- v2v: Document Windows Group Policy problems causing 0x0000007B BSOD + resolves: rhbz#1161333 +- v2v: Fix conversion of RHEL 3 guests + resolves: rhbz#1171130 +- v2v: Fix conversion of RHEL 4 guests that use epoch + resolves: rhbz#1170685 +- v2v: Favour non-debug kernels over debug kernels + resolves: rhbz#1170073 +- p2v: Fix kickstart for virt-p2v + resolves: rhbz#1168632 +- Fixed some documentation mistakes. + +* Thu Nov 27 2014 Richard W.M. Jones - 1:1.28.1-1.14 +- p2v: Add Reboot button to the GUI + resolves: rhbz#1165564 +- p2v: Fixes to 'Cancel Conversion' button + resolves: rhbz#1165569 +- v2v: -i ova: Remove incorrect warning for disks with no parent controller + resolves: rhbz#1167302 +- resize: Capture errors from ntfsresize + resolves: rhbz#1166618 + +* Thu Nov 20 2014 Richard W.M. Jones - 1:1.28.1-1.13 +- v2v: Fix device mapping of /boot/grub2/device.map + resolves: rhbz#1165975 +- v2v: Fix 'no volume groups found' because of old LVM cache file + resolves: rhbz#1164853 + +* Tue Nov 18 2014 Richard W.M. Jones - 1:1.28.1-1.12 +- v2v: Fix device remapping for RHEL guests + resolves: rhbz#1151725 + +* Mon Nov 17 2014 Richard W.M. Jones - 1:1.28.1-1.11 +- Fix inspect-get-icon on RHEL 7 guests + resolves: rhbz#1164619 +- Fix description of set-append (append) and get-append commands + resolves: rhbz#1164732 +- Fix small typo in release notes. + resolves: rhbz#1164697 + +* Thu Nov 13 2014 Richard W.M. Jones - 1:1.28.1-1.10 +- v2v: -o glance: Fix metadata for disk type and NIC + resolves: rhbz#1161575 +- check xfs label lengths + resolves: rhbz#1162966 + +* Thu Nov 6 2014 Richard W.M. Jones - 1:1.28.1-1.9 +- v2v: Fix kernel detection when multiple kernels are installed + resolves: rhbz#1161250 + +* Thu Nov 6 2014 Richard W.M. Jones - 1:1.28.1-1.8 +- p2v: Explain in the man page why the virt-p2v ISO is used. +- p2v: Ensure we are using virt-v2v >= 1.28. +- v2v: Add bounds check to Xml.xpathobj_node function. +- v2v: Ensure --bridge and --network args are documented correctly in --help +- v2v: -i libvirt vcenter: Change 'esx:' to 'vcenter:' in errors/warnings. +- v2v: Ignore small filesystems when checking for sufficient free space. +- v2v: Document minimum free filesystem space requirements. + related: rhbz#1021149 +- customize: firstboot: make sure to run Linux scripts only once + resolves: rhbz#1160043 +- customize: firstboot: fix Linux log output + resolves: rhbz#1160199 + +* Mon Nov 3 2014 Richard W.M. Jones - 1:1.28.1-1.7 +- guestfish: Fix tab completion of filenames on XFS and elsewhere + resolves: rhbz#1153844 +- v2v: Ensure are set in output so ACPI etc works + resolves: rhbz#1159258 +- v2v: Add --password-file parameter + resolves: rhbz#1158526 + +* Wed Oct 29 2014 Richard W.M. Jones - 1:1.28.1-1.6 +- p2v: Add firmware and usb-storage module to virt-p2v-make-disk. + resolves: rhbz#1157691 + +* Fri Oct 24 2014 Richard W.M. Jones - 1:1.28.1-1.5 +- virt-sysprep & virt-customize: Fix password setting problems + resolves: rhbz#1141626, rhbz#1147065 +- virt-inspector: document that -a option can take a URI + resolves: rhbz#1156301 +- bash-completion: use symlinks instead of copying files + resolves: rhbz#1156298 + +* Thu Oct 23 2014 Richard W.M. Jones - 1:1.28.1-1.4 +- v2v: Fix handling of relative paths in -i ova + resolves: rhbz#1155121 +- v2v: disable uninstallation of VMware drivers on Linux for RHEL 7.1 + resolves: rhbz#1155610 + +* Wed Oct 22 2014 Richard W.M. Jones - 1:1.28.1-1.3 +- v2v: Fix conversion from NBD sources + resolves: rhbz#1153589 +- v2v: BR zip and unzip, and require unzip, for ZIP support in -i ova mode + related: rhbz#1152998 + +* Mon Oct 20 2014 Richard W.M. Jones - 1:1.28.1-1.2 +- v2v: Add support for ZIP and *.vmdk.gz to -i ova + resolves: rhbz#1152998 +- virt-ls: Add a field for directory files when using --csv option + resolves: rhbz#1151900 +- v2v: Mitigate hangs when run against a very slow VMware vCenter server + resolves: rhbz#1153589 +- cat, diff: Avoid double slashes in paths + resolves: rhbz#1151910 + +* Sat Oct 18 2014 Richard W.M. Jones - 1:1.28.1-1.1 +- Final rebase to stable libguestfs branch 1.28. + resolves: rhbz#1021149 +- Drop dist tag for BuildRequires, so it builds on ppc64le. + resolves: rhbz#1149640 +- Make sure we require the latest libvirt, so virt-v2v can access ESX. +- Fix guestfish colour prompts when using white-on-black terminal + resolves: rhbz#1144201 +- Disable libguestfs UML backend mode + resolves: rhbz#1144197 +- Enable ppc64, ppc64le and aarch64. + On ppc64 we currently have to disable build-time testing of qemu. + resolves: rhbz#1125575 +- Remove unnecessary BR for libnl3 in RHEL < 7.1. +- Integrate changes from Rawhide. +- Add workaround for buggy libvirt 1.2.8. +- Move virt-v2v into a separate subpackage and make it depend on qemu-kvm-rhev. +- Add rhsrvany and RHEV Application Provisioning Tool to virt-v2v. +- Change Fedora -> RHEL in description. +- Disable some more protocol tests. +- Enable tests. +- Enable guestfish colour prompts. +- Add new tool virt-log. +- Enabling bash-completions subpackage means we need to BR bash-completion. +- Package libguestfs 1.27/1.28 for RHEL 7.1. +- Enable bash-completion. + +* Mon Mar 3 2014 Richard W.M. Jones - 1:1.22.6-22 +- Fix Ruby bindings + resolves: rhbz#1072079 + +* Wed Feb 12 2014 Richard W.M. Jones - 1:1.22.6-21 +- Fix segfault in guestfs_list_filesystems when presented with a + corrupt btrfs filesystem + resolves: rhbz#1064008 + +* Tue Feb 11 2014 Richard W.M. Jones - 1:1.22.6-20 +- Valid GUIDs when used as parameter to part-set-gpt-type + resolves: rhbz#1008417 + +* Wed Feb 05 2014 Richard W.M. Jones - 1:1.22.6-19 +- Fix placement of *.py[co] files + resolves: rhbz#1061155 +- Remove bogus license file from daemon + resolves: rhbz#1061160 +- Prevent virt-sparsify from overwriting block or char devices + resolves: rhbz#1056556 +- mount-local should give a clearer error if root is not mounted + resolves: rhbz#1057492 + +* Fri Dec 27 2013 Daniel Mach - 1:1.22.6-18 +- Mass rebuild 2013-12-27 + +* Thu Dec 05 2013 Richard W.M. Jones - 1:1.22.6-17 +- Rebuild for updated procps SONAME. + resolves: rhbz#1037795 + +* Wed Nov 20 2013 Richard W.M. Jones - 1:1.22.6-16 +- Allow virt-win-reg command to work with URIs + resolves: rhbz#912193 + +* Thu Oct 31 2013 Richard W.M. Jones - 1:1.22.6-15 +- Add libguestfs-tools.conf(5) man page + resolves: rhbz#1019891 +- Drop PHP bindings + resolves: rhbz#1020021 +- Disable Haskell & Erlang (in case someone has these dependencies + installed and tries to rebuild the package). + +* Wed Oct 16 2013 Richard W.M. Jones - 1:1.22.6-12 +- Backport: "daemon: Fix xfs_info parser because of new format." + which is required to fix libguestfs tests. + related: rhbz#1019503 + +* Wed Oct 16 2013 Richard W.M. Jones - 1:1.22.6-11 +- Further fixes for kvmclock + resolves: rhbz#998109 +- Document that blockdev-setbsz is deprecated and should not be used + resolves: rhbz#1016465 + +* Wed Oct 16 2013 Richard W.M. Jones - 1:1.22.6-10 +- Fix CVE-2013-4419: insecure temporary directory handling for + guestfish's network socket + resolves: rhbz#1019503 + +* Thu Sep 26 2013 Richard W.M. Jones - 1:1.22.6-9 +- Use 'host-passthrough' instead of 'host-model' (RHBZ#1011922) +- Fix mount-loop failed to setup loop device: No such file or directory + resolves: rhbz#1011907 + +* Fri Sep 13 2013 Richard W.M. Jones - 1:1.22.6-8 +- Backport 'cachemode' property of 'add_drive' + resolves: rhbz#1003291 +- Improve error reporting from aug_init + related: rhbz# 1003685 + +* Thu Aug 29 2013 Richard W.M. Jones - 1:1.22.6-5 +- Various fixes to tar-out 'excludes' + resolves: rhbz#1001875 +- Document use of glob + rsync-out + resolves: rhbz#1001876 +- Document mke2fs blockscount + resolves: rhbz#1002032 +- Fix virt-format MBR partition type byte, add --label option to + virt-format and virt-make-fs, and allow labels to be set on DOS filesystems + resolves: rhbz#1000428 +- Fix javadoc location to use _javadocdir macro. +- Call ldconfig in java post and postun scripts. +- Do not explicitly depend on perl-devel. +- Compress the ChangeLog and *.xml files in devel package. +- Create new subpackage gobject-doc for the huge HTML documentation. +- Make javadoc, gobject-doc, bash-completion, man-pages-*, tools packages + 'noarch'. +- Enable gzip-compressed appliance. +- Note this requires supermin >= 4.1.4. + +* Tue Aug 27 2013 Richard W.M. Jones - 1:1.22.6-4 +- New upstream stable version 1.22.6. + resolves: rhbz#995712, rhbz#998750, rhbz#998485 +- Backport set-UUID API and related + resolves: rhbz#995176 +- Enable kvmclock + resolves: rhbz#998109 +- Add upstream APIs guestfs_add_drive_scratch, guestfs_remount. + +* Tue Jul 30 2013 Richard W.M. Jones - 1:1.22.5-3 +- Backport support for virt-sysprep -a URI option + resolves: rhbz#968785 + +* Mon Jul 29 2013 Richard W.M. Jones - 1:1.22.5-2 +- New upstream stable version 1.22.5. +- Fix virt-sysprep --firstboot option + resolves: rhbz#988862 +- Disable unsupported remote drives + resolves: rhbz#962113 +- cap-get-file returns empty string instead of error if no capabilities + resolves: rhbz#989356 + +* Fri Jul 19 2013 Richard W.M. Jones - 1:1.22.4-2 +- New upstream stable version 1.22.4. +- Move virt-sysprep to libguestfs-tools-c package + resolves: rhbz#975573 +- Remove 9p APIs from RHEL + resolves: rhbz#921710 +- Reenable swapon test + resolves: rhbz#911674 +- Reenable file architecture test + resolves: rhbz#911678 +- Fix mkfs blocksize option when using xfs + resolves: rhbz#976250 +- Fix double-free when kernel link fails during launch + resolves: rhbz#983691 +- Fix disk-format "JSON parse error" when target file does not exist + resolves: rhbz#980338 +- Fix documentation for acl-set-file + resolves: rhbz#985856 +- libguestfs-devel should depend on full ENVR of libguestfs-tools-c. +- Require /usr/bin/vi instead of /bin/vi for UsrMove. + +* Mon Jun 3 2013 Richard W.M. Jones - 1:1.22.2-1 +- New upstream version 1.22.2. +- Do not need to remove guestfsd man page, since libguestfs no longer + installs it. + +* Mon May 20 2013 Daniel Mach - 1:1.21.33-1.1.el7 +- Rebuild for cyrus-sasl + +* Mon Apr 29 2013 Richard W.M. Jones - 1:1.21.33-1.el7 +- New upstream version 1.21.33. +- Rebuild for renamed Kerberos library. + resolves: rhbz#957616 +- Skip gnulib tests which fail. +- Skip NBD test since there is no NBD in RHEL. + +* Wed Apr 17 2013 Richard W.M. Jones - 1:1.21.31-1.el7.1 +- Rebase RHEL 7 onto libguestfs 1.21. +- Update spec file from Rawhide. + +* Tue Apr 9 2013 Richard W.M. Jones - 1:1.20.5-4 +- In RHEL 7, 'ruby(abi)' has been replaced by 'ruby(release)' + and the version of the ruby ABI/release is now 2.0.0. + +* Fri Apr 5 2013 Richard W.M. Jones - 1:1.20.5-3 +- Remove man pages of deprecated programs. + +* Tue Apr 2 2013 Richard W.M. Jones - 1:1.20.5-2 +- Remove deprecated programs virt-tar, virt-list-filesystems and + virt-list-partitions from RHEL 7. + +* Sun Mar 31 2013 Richard W.M. Jones - 1:1.20.5-1 +- New upstream version 1.20.5. +- Remove ruby vendor patch. +- Set INSTALLDIRS=vendor on both make and make install rules. + +* Tue Mar 5 2013 Richard W.M. Jones - 1:1.20.3-1 +- New upstream version 1.20.3. + +* Fri Feb 15 2013 Richard W.M. Jones - 1:1.20.2-1 +- New upstream version 1.20.2. +- Synchronize list of tests to be skipped with local list. +- Use openjdk instead of java (GCJ). +- Add BRs: libcap. +- Ship the gobject pkgconfig file. + +* Mon Feb 11 2013 Richard W.M. Jones - 1:1.20.1-7 +- 'febootstrap' has been renamed 'supermin'. + resolves: rhbz#909573 + +* Sat Jan 19 2013 Richard W.M. Jones - 1:1.20.1-6 +- Add explicit BR on seabios-bin to work around RHBZ#901542. + +* Fri Jan 18 2013 Richard W.M. Jones - 1:1.20.1-5 +- Bump and rebuild. + +* Fri Dec 21 2012 Richard W.M. Jones - 1:1.20.1-4 +- Go over all non-upstream patches from RHEL 6 and add appropriate ones + to RHEL 7: + * Emphasize libguestfs-winsupport. + * Remove libguestfs-live ('unix' attach-method). + * Exclude iptables. + * Ignore /etc/release file if /etc/redhat-release file exists. + resolves: rhbz#889536, rhbz#889537, rhbz#889538, rhbz#873219 +- Do not number patches. + +* Thu Dec 20 2012 Richard W.M. Jones - 1:1.20.1-3 +- New upstream version 1.20.1. + +* Tue Dec 18 2012 Richard W.M. Jones - 1:1.20.0-5 +- Remove RHEL-conditionals, since I have branched spec file for RHEL 7. +- Add BR gdisk. +- Change to using git to manage patches. +- Add copy-patches.sh script. +- Disable libguestfs live (RHEL only). +- "Fedora" -> "RHEL" in replacement README file. +- "fedora" -> "rhel" in version extra field. + +* Mon Dec 17 2012 Richard W.M. Jones - 1:1.20.0-2 +- Use 'make check -k' so we get to see all test failures at once. +- For RHEL 7: + * Do not depend on perl(Expect) (only needed to test virt-rescue). + * Depend on /usr/bin/qemu-img instead of qemu-img package, since the + package name (but not the binary) is different in RHEL 7. + * Add workaround for libvirt/KVM bug RHBZ#878406. + * Do not depend on libvirt-daemon-qemu. + * Do not depend on libldm (not yet in RHEL 7: RHBZ#887894). + +* Thu Dec 13 2012 Richard W.M. Jones - 1:1.20.0-1 +- New upstream version 1.20.0. +- New source URL for this branch. +- Reconcile upstream packagelist, BRs and Requires lists. +- Requires newest SELinux policy so that SVirt works. +- Fix patch 2. Actually, remove and replace with a small script. + +* Sat Dec 01 2012 Richard W.M. Jones - 1:1.19.66-1 +- New upstream version 1.19.66. + +* Fri Nov 30 2012 Richard W.M. Jones - 1:1.19.65-2 +- Add a hack to work around glibc header bug . + +* Thu Nov 29 2012 Richard W.M. Jones - 1:1.19.65-1 +- New upstream version 1.19.65. + +* Sat Nov 24 2012 Richard W.M. Jones - 1:1.19.64-1 +- New upstream version 1.19.64. + +* Sat Nov 24 2012 Richard W.M. Jones - 1:1.19.63-3 +- Re-add: Non-upstream patch to add the noapic flag on the kernel + command line on i386 only. This works around a bug in 32-bit qemu, + https://bugzilla.redhat.com/show_bug.cgi?id=857026 + +* Fri Nov 23 2012 Richard W.M. Jones - 1:1.19.63-2 +- Remove non-upstream patch designed to work around + https://bugzilla.redhat.com/show_bug.cgi?id=857026 + to see if this has been fixed. +- Re-enable tests on i686 to see if + https://bugzilla.redhat.com/show_bug.cgi?id=870042 + has been fixed. + +* Fri Nov 23 2012 Richard W.M. Jones - 1:1.19.63-1 +- New upstream version 1.19.63. + +* Tue Nov 20 2012 Richard W.M. Jones - 1:1.19.62-1 +- New upstream version 1.19.62. + +* Mon Nov 19 2012 Richard W.M. Jones - 1:1.19.61-1 +- New upstream version 1.19.61. + +* Sat Nov 17 2012 Richard W.M. Jones - 1:1.19.60-2 +- Remove Lua bogus libtool *.la file. + +* Sat Nov 17 2012 Richard W.M. Jones - 1:1.19.60-1 +- New upstream version 1.19.60. + +* Tue Nov 13 2012 Richard W.M. Jones - 1:1.19.59-1 +- New upstream version 1.19.59. + +* Sat Nov 10 2012 Richard W.M. Jones - 1:1.19.58-1 +- New upstream version 1.19.58. + +* Thu Nov 08 2012 Richard W.M. Jones - 1:1.19.57-1 +- New upstream version 1.19.57. + +* Tue Nov 06 2012 Richard W.M. Jones - 1:1.19.56-3 +- Add upstream patch to disable virt-format test, and disable + it because wipefs utility is broken. + +* Sat Nov 03 2012 Richard W.M. Jones - 1:1.19.56-2 +- Add upstream patch to fix wipefs test. + +* Fri Nov 02 2012 Richard W.M. Jones - 1:1.19.56-1 +- New upstream version 1.19.56. + +* Tue Oct 30 2012 Richard W.M. Jones - 1:1.19.55-1 +- New upstream version 1.19.55. + +* Mon Oct 29 2012 Richard W.M. Jones - 1:1.19.54-1 +- New upstream version 1.19.54. + +* Wed Oct 24 2012 Richard W.M. Jones - 1:1.19.53-3 +- Disable tests on ix86 because qemu/kernel is broken (RHBZ#870042). + +* Wed Oct 24 2012 Richard W.M. Jones - 1:1.19.53-2 +- Add upstream patch to fix guestfish tests. + +* Fri Oct 19 2012 Richard W.M. Jones - 1:1.19.53-1 +- New upstream version 1.19.53. + +* Sun Oct 14 2012 Richard W.M. Jones - 1:1.19.52-1 +- New upstream version 1.19.52. + +* Thu Oct 11 2012 Richard W.M. Jones - 1:1.19.51-1 +- New upstream version 1.19.51. + +* Thu Oct 11 2012 Petr Pisar - 1:1.19.50-2 +- Correct perl dependencies + +* Thu Oct 11 2012 Richard W.M. Jones - 1:1.19.50-1 +- New upstream version 1.19.50. + +* Wed Oct 10 2012 Richard W.M. Jones - 1:1.19.49-3 +- Upstream patch to workaround btrfs problems with kernel 3.7.0. + +* Tue Oct 09 2012 Richard W.M. Jones - 1:1.19.49-2 +- Install all libguestfs-live-service udev rules into /usr/lib/udev/rules.d. + +* Tue Oct 09 2012 Richard W.M. Jones - 1:1.19.49-1 +- New upstream version 1.19.49. + +* Sun Oct 07 2012 Richard W.M. Jones - 1:1.19.48-1 +- New upstream version 1.19.48. + +* Mon Oct 01 2012 Richard W.M. Jones - 1:1.19.46-1 +- New upstream version 1.19.46. + +* Wed Sep 26 2012 Richard W.M. Jones - 1:1.19.45-1 +- New upstream version 1.19.45. + +* Tue Sep 25 2012 Richard W.M. Jones - 1:1.19.44-2 +- Enable sVirt (NB: requires libvirt >= 0.10.2-3, selinux-policy >= 3.11.1-23). +- Add upstream patch to label the custom $TMPDIR used in test-launch-race. + +* Mon Sep 24 2012 Richard W.M. Jones - 1:1.19.44-1 +- New upstream version 1.19.44. + +* Sat Sep 22 2012 Richard W.M. Jones - 1:1.19.43-1 +- New upstream version 1.19.43. + +* Tue Sep 18 2012 Richard W.M. Jones - 1:1.19.42-2 +- New upstream version 1.19.42. +- Rebase sVirt (disable) patch. + +* Sun Sep 16 2012 Richard W.M. Jones - 1:1.19.41-1 +- New upstream version 1.19.41. + +* Fri Sep 14 2012 Richard W.M. Jones - 1:1.19.40-3 +- Add (non-upstream) patch to add the noapic flag on the kernel + command line on i386 only. This works around a bug in 32-bit qemu. + +* Wed Sep 12 2012 Richard W.M. Jones - 1:1.19.40-2 +- Enable tests because RHBZ#853408 has been fixed in qemu-1.2.0-3.fc18. + +* Wed Sep 05 2012 Richard W.M. Jones - 1:1.19.40-1 +- New upstream version 1.19.40. + +* Tue Sep 04 2012 Richard W.M. Jones - 1:1.19.39-1 +- New upstream version 1.19.39. + +* Mon Sep 03 2012 Richard W.M. Jones - 1:1.19.38-1 +- New upstream version 1.19.38. + +* Fri Aug 31 2012 Richard W.M. Jones - 1:1.19.37-1 +- New upstream version 1.19.37. + +* Thu Aug 30 2012 Richard W.M. Jones - 1:1.19.36-2 +- New upstream version 1.19.36. +- Require libvirt-daemon-qemu (for libvirt attach method). + +* Thu Aug 30 2012 Richard W.M. Jones - 1:1.19.36-1 +- Switch to using libvirt as the backend for running the appliance. See: + https://www.redhat.com/archives/libguestfs/2012-August/msg00070.html +- Use configure RPM macro instead of ./configure. + +* Wed Aug 29 2012 Richard W.M. Jones - 1:1.19.35-1 +- New upstream version 1.19.35. + +* Wed Aug 29 2012 Richard W.M. Jones - 1:1.19.34-2 +- Add upstream patch to fix Perl bindtests on 32 bit. + +* Tue Aug 28 2012 Richard W.M. Jones - 1:1.19.34-1 +- New upstream version 1.19.34. + +* Tue Aug 28 2012 Richard W.M. Jones - 1:1.19.33-1 +- New upstream version 1.19.33. + +* Mon Aug 27 2012 Richard W.M. Jones - 1:1.19.33-3 +- Fix Perl examples directory so we only include the examples. +- Add Java examples to java-devel RPM. + +* Tue Aug 21 2012 Richard W.M. Jones - 1:1.19.33-2 +- New upstream version 1.19.33. +- Reenable tests. + +* Sat Aug 18 2012 Richard W.M. Jones - 1:1.19.32-1 +- New upstream version 1.19.32. + +* Wed Aug 15 2012 Richard W.M. Jones - 1:1.19.31-1 +- New upstream version 1.19.31. + +* Tue Aug 14 2012 Richard W.M. Jones - 1:1.19.30-1 +- New upstream version 1.19.30. + +* Sat Aug 11 2012 Richard W.M. Jones - 1:1.19.29-2 +- New upstream version 1.19.29. +- Remove RELEASE NOTES from doc section, and add equivalent man page. + +* Fri Aug 10 2012 Richard W.M. Jones - 1:1.19.28-4 +- Bump and rebuild. + +* Thu Aug 02 2012 Richard W.M. Jones - 1:1.19.28-3 +- New upstream version 1.19.28. +- Update libguestfs-find-requires to generate ordinary lib dependencies. + +* Wed Aug 1 2012 Richard W.M. Jones - 1:1.19.27-2 +- Disable tests because of RHBZ#844485. + +* Mon Jul 30 2012 Richard W.M. Jones - 1:1.19.27-1 +- New upstream version 1.19.27. + +* Thu Jul 26 2012 Richard W.M. Jones - 1:1.19.26-2 +- Remove old RPM-isms like defattr. +- Add upstream patches to fix use of 'run' script in tests. + +* Thu Jul 26 2012 Richard W.M. Jones - 1:1.19.26-1 +- New upstream version 1.19.26. + +* Tue Jul 24 2012 Richard W.M. Jones - 1:1.19.25-1 +- New upstream version 1.19.25. + +* Mon Jul 23 2012 Richard W.M. Jones - 1:1.19.24-1 +- New upstream version 1.19.24. + +* Sun Jul 22 2012 Richard W.M. Jones - 1:1.19.23-1 +- New upstream version 1.19.23. + +* Thu Jul 19 2012 Richard W.M. Jones - 1:1.19.22-2 +- Add upstream patch to skip mount-local test if /dev/fuse not writable. + +* Thu Jul 19 2012 Richard W.M. Jones - 1:1.19.22-1 +- New upstream version 1.19.22. + +* Wed Jul 18 2012 Richard W.M. Jones - 1:1.19.21-1 +- New upstream version 1.19.21. + +* Tue Jul 17 2012 Richard W.M. Jones - 1:1.19.20-1 +- New upstream version 1.19.20. + +* Mon Jul 16 2012 Richard W.M. Jones - 1:1.19.19-1 +- New upstream version 1.19.19. + +* Tue Jul 10 2012 Petr Pisar - 1:1.19.18-2 +- Perl 5.16 rebuild + +* Mon Jul 09 2012 Richard W.M. Jones - 1:1.19.18-1 +- New upstream version 1.19.18. + +* Fri Jul 06 2012 Richard W.M. Jones - 1:1.19.17-1 +- New upstream version 1.19.17. + +* Wed Jul 04 2012 Richard W.M. Jones - 1:1.19.16-1 +- New upstream version 1.19.16. + +* Fri Jun 29 2012 Richard W.M. Jones - 1:1.19.15-1 +- New upstream version 1.19.15. + +* Thu Jun 28 2012 Richard W.M. Jones - 1:1.19.14-1 +- New upstream version 1.19.14. + +* Wed Jun 27 2012 Richard W.M. Jones - 1:1.19.13-2 +- New upstream version 1.19.13. +- Add upstream patch to fix GObject/Javascript tests. + +* Tue Jun 26 2012 Richard W.M. Jones - 1:1.19.12-1 +- New upstream version 1.19.12. + +* Mon Jun 25 2012 Richard W.M. Jones - 1:1.19.11-1 +- New upstream version 1.19.11. + +* Fri Jun 22 2012 Richard W.M. Jones - 1:1.19.10-1 +- New upstream version 1.19.10. + +* Mon Jun 18 2012 Richard W.M. Jones - 1:1.19.9-1 +- New upstream version 1.19.9. + +* Thu Jun 14 2012 Richard W.M. Jones - 1:1.19.8-1 +- New upstream version 1.19.8. + +* Thu Jun 14 2012 Richard W.M. Jones - 1:1.19.7-2 +- New upstream version 1.19.7. +- Require febotstrap >= 3.17. + +* Tue Jun 12 2012 Richard W.M. Jones - 1:1.19.6-2 +- Require febootstrap >= 3.16. + +* Tue Jun 12 2012 Richard W.M. Jones - 1:1.19.6-1 +- New upstream version 1.19.6. + +* Tue Jun 12 2012 Richard W.M. Jones - 1:1.19.6-1 +- New upstream version 1.19.6. +- This version defaults to using virtio-scsi. +- Requires qemu >= 1.0. +- Requires febootstrap >= 3.15. + +* Mon Jun 11 2012 Petr Pisar - 1:1.19.5-2 +- Perl 5.16 rebuild + +* Sat Jun 09 2012 Richard W.M. Jones - 1:1.19.5-1 +- New upstream version 1.19.5. + +* Thu Jun 07 2012 Richard W.M. Jones - 1:1.19.4-1 +- New upstream version 1.19.4. + +* Fri Jun 01 2012 Richard W.M. Jones - 1:1.19.3-2 +- New upstream version 1.19.3. +- Remove patches which are now upstream. + +* Tue May 29 2012 Richard W.M. Jones - 1:1.19.2-3 +- Remove obsolete list of bugs in make check rule. +- Remove some obsolete test workarounds. +- Disable i386 tests (because of RHBZ#825944). + +* Mon May 28 2012 Richard W.M. Jones - 1:1.19.2-2 +- Include patches to fix udev. + +* Mon May 28 2012 Richard W.M. Jones - 1:1.19.2-1 +- New upstream version 1.19.2. + +* Sat May 26 2012 Richard W.M. Jones - 1:1.19.1-1 +- New upstream version 1.19.1. + +* Mon May 21 2012 Richard W.M. Jones - 1:1.19.0-1 +- New upstream version 1.19.0. + +* Thu May 17 2012 Richard W.M. Jones - 1:1.17.43-1 +- New upstream version 1.17.43. + +* Thu May 17 2012 Richard W.M. Jones - 1:1.17.42-4 +- On RHEL 7 only, remove reiserfs-utils, zerofree. + +* Thu May 17 2012 Richard W.M. Jones - 1:1.17.42-3 +- On RHEL 7 only, remove nilfs-utils. + +* Tue May 15 2012 Richard W.M. Jones - 1:1.17.42-2 +- Bundled gnulib (RHBZ#821767). + +* Mon May 14 2012 Richard W.M. Jones - 1:1.17.42-1 +- New upstream version 1.17.42. + +* Fri May 11 2012 Richard W.M. Jones - 1:1.17.41-1 +- New upstream version 1.17.41. + +* Tue May 08 2012 Richard W.M. Jones - 1:1.17.40-1 +- New upstream version 1.17.40. + +* Tue May 8 2012 Richard W.M. Jones - 1:1.17.39-3 +- Disable hfsplus-tools on RHEL 7. + +* Thu May 03 2012 Richard W.M. Jones - 1:1.17.39-2 +- BR perl-XML-XPath to run the new XML test. + +* Thu May 03 2012 Richard W.M. Jones - 1:1.17.39-1 +- New upstream version 1.17.39. + +* Wed May 02 2012 Richard W.M. Jones - 1:1.17.38-3 +- Remove explicit runtime deps for old virt-sysprep. +- Add explicit runtime dep on fuse (RHBZ#767852, thanks Pádraig Brady). +- Remove explicit versioned dep on glibc. + +* Tue May 1 2012 Peter Robinson - 1:1.17.38-2 +- Update supported filesystems for ARM + +* Tue May 01 2012 Richard W.M. Jones - 1:1.17.38-1 +- New upstream version 1.17.38. + +* Tue May 01 2012 Richard W.M. Jones - 1:1.17.37-2 +- Add guestfs-faq(1) (FAQ is now a man page). + +* Tue May 01 2012 Richard W.M. Jones - 1:1.17.37-1 +- New upstream version 1.17.37. + +* Fri Apr 27 2012 Richard W.M. Jones - 1:1.17.36-2 +- Add upstream patch to fix installation of gobject headers. + +* Thu Apr 26 2012 Richard W.M. Jones - 1:1.17.36-1 +- New upstream version 1.17.36. + +* Thu Apr 26 2012 Richard W.M. Jones - 1:1.17.35-1 +- New upstream version 1.17.35. + +* Tue Apr 24 2012 Richard W.M. Jones - 1:1.17.34-1 +- New upstream version 1.17.34. + +* Mon Apr 23 2012 Richard W.M. Jones - 1:1.17.33-1 +- New upstream version 1.17.33. + +* Tue Apr 17 2012 Richard W.M. Jones - 1:1.17.32-1 +- New upstream version 1.17.32. + +* Mon Apr 16 2012 Richard W.M. Jones - 1:1.17.31-1 +- New upstream version 1.17.31. + +* Fri Apr 13 2012 Richard W.M. Jones - 1:1.17.30-1 +- New upstream version 1.17.30. + +* Thu Apr 12 2012 Richard W.M. Jones - 1:1.17.29-1 +- New upstream version 1.17.29. + +* Thu Apr 12 2012 Richard W.M. Jones - 1:1.17.28-2 +- Enable ruby 1.9 patch in RHEL 7 (RHBZ#812139). + +* Thu Apr 12 2012 Richard W.M. Jones - 1:1.17.28-1 +- New upstream version 1.17.28. + +* Wed Apr 11 2012 Richard W.M. Jones - 1:1.17.27-2 +- Add guestfs-performance(1) manual page. + +* Tue Apr 10 2012 Richard W.M. Jones - 1:1.17.27-1 +- New upstream version 1.17.27. + +* Tue Apr 03 2012 Richard W.M. Jones - 1:1.17.26-1 +- New upstream version 1.17.26. + +* Mon Apr 02 2012 Richard W.M. Jones - 1:1.17.25-1 +- New upstream version 1.17.25. + +* Sun Apr 01 2012 Richard W.M. Jones - 1:1.17.24-1 +- New upstream version 1.17.24. + +* Sun Apr 01 2012 Richard W.M. Jones - 1:1.17.23-1 +- New upstream version 1.17.23. + +* Thu Mar 29 2012 Richard W.M. Jones - 1:1.17.22-2 +- Include all gobject header files. +- Include gtk-doc, and depend on the gtk-doc package at runtime. + +* Thu Mar 29 2012 Richard W.M. Jones - 1:1.17.22-1 +- New upstream version 1.17.22. + +* Thu Mar 29 2012 Richard W.M. Jones - 1:1.17.21-2 +- Bump and rebuild. + +* Wed Mar 21 2012 Richard W.M. Jones - 1:1.17.21-1 +- New upstream version 1.17.21. + +* Mon Mar 19 2012 Richard W.M. Jones - 1:1.17.20-3 +- Reenable LUKS, since RHBZ#804345 is reported to be fixed. + +* Sun Mar 18 2012 Richard W.M. Jones - 1:1.17.20-2 +- Disable LUKS tests because LUKS is broken in Rawhide (RHBZ#804345). + +* Sat Mar 17 2012 Richard W.M. Jones - 1:1.17.20-1 +- New upstream version 1.17.20. + +* Sat Mar 17 2012 Richard W.M. Jones - 1:1.17.19-2 +- Add libguestfs-make-fixed-appliance (with man page). + +* Fri Mar 16 2012 Richard W.M. Jones - 1:1.17.19-1 +- New upstream version 1.17.19. + +* Thu Mar 15 2012 Richard W.M. Jones - 1:1.17.18-1 +- New upstream version 1.17.18. + +* Wed Mar 14 2012 Richard W.M. Jones - 1:1.17.17-1 +- New upstream version 1.17.17. + +* Wed Mar 14 2012 Richard W.M. Jones - 1:1.17.16-2 +- Bump and rebuild. + +* Tue Mar 13 2012 Richard W.M. Jones - 1:1.17.16-1 +- New upstream version 1.17.16. + +* Mon Mar 12 2012 Richard W.M. Jones - 1:1.17.15-1 +- New upstream version 1.17.15. + +* Fri Mar 09 2012 Richard W.M. Jones - 1:1.17.14-1 +- New upstream version 1.17.14. + +* Thu Mar 08 2012 Richard W.M. Jones - 1:1.17.13-1 +- New upstream version 1.17.13. + +* Thu Mar 08 2012 Richard W.M. Jones - 1:1.17.12-2 +- Enable Japanese man pages, since these are in a better state upstream. + +* Wed Mar 07 2012 Richard W.M. Jones - 1:1.17.12-1 +- New upstream version 1.17.12. + +* Wed Mar 07 2012 Richard W.M. Jones - 1:1.17.11-2 +- Require netpbm-progs, icoutils. These are needed for icon generation + during inspection, but were not being pulled in before. + +* Mon Mar 05 2012 Richard W.M. Jones - 1:1.17.11-1 +- New upstream version 1.17.11. + +* Sat Mar 03 2012 Richard W.M. Jones - 1:1.17.10-2 +- New upstream version 1.17.10. +- Rebase Ruby patch against new libguestfs. + +* Wed Feb 29 2012 Richard W.M. Jones - 1:1.17.9-1 +- New upstream version 1.17.9. + +* Wed Feb 15 2012 Richard W.M. Jones - 1:1.17.8-1 +- New upstream version 1.17.8. + +* Mon Feb 13 2012 Richard W.M. Jones - 1:1.17.7-1 +- New upstream version 1.17.7. + +* Fri Feb 10 2012 Richard W.M. Jones - 1:1.17.6-1 +- +BR ruby-irb. +- Make virtio unconditional. It's been a very long time since disabling + virtio was a good idea. +- Disable some packages not available in RHEL 7. +- New upstream version 1.17.6. + +* Fri Feb 10 2012 Petr Pisar - 1:1.17.5-3 +- Rebuild against PCRE 8.30 + +* Thu Feb 9 2012 Richard W.M. Jones - 1:1.17.5-2 +- Rebuild with ruby(abi) = 1.9.1. + +* Wed Feb 8 2012 Richard W.M. Jones - 1:1.17.5-1 +- New upstream version 1.17.5. +- Remove usrmove workaround patch, now upstream. + +* Wed Feb 8 2012 Richard W.M. Jones - 1:1.17.4-8 +- Further Ruby 1.9 changes. + +* Tue Feb 07 2012 Richard W.M. Jones - 1:1.17.4-7 +- Bump and rebuild for Ruby update. + +* Mon Feb 6 2012 Richard W.M. Jones - 1:1.17.4-6 +- Add workaround for usrmove in Fedora. + +* Wed Feb 1 2012 Richard W.M. Jones - 1:1.17.4-1 +- New upstream version 1.17.4. +- Remove patch now upstream. + +* Sat Jan 28 2012 Richard W.M. Jones - 1:1.17.3-2 +- New upstream version 1.17.3. +- Remove patch now upstream. +- Add upstream patch to fix OCaml bytecode compilation. + +* Fri Jan 27 2012 Richard W.M. Jones - 1:1.17.2-3 +- Upstream patch to work with udev >= 176. + +* Thu Jan 26 2012 Richard W.M. Jones - 1:1.17.2-2 +- New upstream version 1.17.2. +- Use libdb-utils instead of old db4-utils. +- net-tools is no longer used; replaced by iproute (RHBZ#784647). +- Try re-enabling tests on i686. + +* Tue Jan 24 2012 Richard W.M. Jones - 1:1.17.1-1 +- New upstream version 1.17.1. + +* Mon Jan 23 2012 Richard W.M. Jones - 1:1.16.0-1 +- New upstream version 1.16.0. +- Remove patches which are now upstream. +- GObject: Move *.typelib file to base gobject package. + +* Sun Jan 22 2012 Richard W.M. Jones - 1:1.15.19-1 +- New upstream version 1.15.19. +- +BR psmisc for the appliance. +- Includes GObject bindings in libguestfs-gobject and + libguestfs-gobject-devel subpackages. +- Include upstream patches for PHP 5.4. + +* Thu Jan 19 2012 Richard W.M. Jones - 1:1.15.18-1 +- New upstream version 1.15.18. + +* Wed Jan 18 2012 Richard W.M. Jones - 1:1.15.17-1 +- New upstream version 1.15.17. +- New tool: virt-format. + +* Tue Jan 10 2012 Richard W.M. Jones - 1:1.15.16-1 +- New upstream version 1.15.16. + +* Sun Jan 8 2012 Richard W.M. Jones - 1:1.15.15-2 +- New upstream version 1.15.15. +- Updated gnulib fixes builds with gcc 4.7. +- Rebuild for OCaml 3.12.1. +- Add explicit BR perl-hivex, required for various Perl virt tools. + +* Fri Dec 23 2011 Richard W.M. Jones - 1:1.15.14-1 +- New upstream version 1.15.14. +- Remove three patches, now upstream. + +* Thu Dec 22 2011 Richard W.M. Jones - 1:1.15.13-4 +- New upstream version 1.15.13. +- Fixes Security: Mitigate possible privilege escalation via SG_IO ioctl + (CVE-2011-4127, RHBZ#757071). +- Add three upstream patches to fix 'make check'. + +* Thu Dec 22 2011 Richard W.M. Jones - 1:1.15.12-1 +- New upstream version 1.15.12. + +* Fri Dec 9 2011 Richard W.M. Jones - 1:1.15.11-1 +- New upstream version 1.15.11. + +* Tue Dec 6 2011 Richard W.M. Jones - 1:1.15.10-1 +- New upstream version 1.15.10. +- Remove patch, now upstream. + +* Sat Dec 3 2011 Richard W.M. Jones - 1:1.15.9-2 +- New upstream version 1.15.9. +- Add upstream patch to fix Augeas library detection. +- Appliance explicitly requires libxml2 (because Augeas >= 0.10 requires it), + although it was implicitly included already. + +* Tue Nov 29 2011 Richard W.M. Jones - 1:1.15.8-1 +- New upstream version 1.15.8. + +* Tue Nov 29 2011 Richard W.M. Jones - 1:1.15.7-1 +- New upstream version 1.15.7. + +* Thu Nov 24 2011 Richard W.M. Jones - 1:1.15.6-1 +- New upstream version 1.15.6. + +* Mon Nov 21 2011 Richard W.M. Jones - 1:1.15.5-1 +- New upstream version 1.15.5. +- Add guestfs-testing(1) man page. + +* Thu Nov 17 2011 Richard W.M. Jones - 1:1.15.4-2 +- New upstream version 1.15.4. +- Remove patch which is now upstream. +- libguestfs_jni.a is no longer built. + +* Fri Nov 11 2011 Richard W.M. Jones - 1:1.15.3-3 +- Add upstream patch to disable part of virt-df test. + +* Thu Nov 10 2011 Richard W.M. Jones - 1:1.15.3-1 +- New upstream version 1.15.3. +- Fix list of BuildRequires so they precisely match the appliance. + +* Thu Nov 3 2011 Richard W.M. Jones - 1:1.15.2-1 +- New upstream version 1.15.2. +- ocaml-pcre is no longer required for virt-resize. +- xmlstarlet is no longer required for virt-sysprep. + +* Tue Nov 1 2011 Richard W.M. Jones - 1:1.15.1-1 +- New upstream version 1.15.1. + +* Fri Oct 28 2011 Richard W.M. Jones - 1:1.15.0-1 +- Stable branch 1.14.0 was released. This is the new development + branch version 1.15.0. + +* Wed Oct 26 2011 Richard W.M. Jones - 1:1.13.26-1 +- New upstream version 1.13.26. + +* Wed Oct 26 2011 Richard W.M. Jones - 1:1.13.25-1 +- New upstream version 1.13.25. + +* Mon Oct 24 2011 Richard W.M. Jones - 1:1.13.24-1 +- New upstream version 1.13.24. +- This version includes upstream workarounds for broken qemu, so both + non-upstream patches have now been removed from Fedora. + +* Fri Oct 21 2011 Marcela Mašláňová - 1:1.13.23-1.1 +- rebuild with new gmp without compat lib + +* Thu Oct 20 2011 Richard W.M. Jones - 1:1.13.23-1 +- New upstream version 1.13.23. + +* Wed Oct 19 2011 Richard W.M. Jones - 1:1.13.22-2 +- New upstream version 1.13.22. +- Remove 3x upstream patches. +- Renumber the two remaining non-upstream patches as patch0, patch1. +- Rebase patch1. + +* Mon Oct 17 2011 Richard W.M. Jones - 1:1.13.21-4 +- Add upstream patch to skip FUSE tests if there is no /dev/fuse. + This allows us also to remove the Fedora-specific patch which + disabled these tests before. + +* Sat Oct 15 2011 Richard W.M. Jones - 1:1.13.21-3 +- Add upstream patch to fix virt-sysprep test. + +* Fri Oct 14 2011 Richard W.M. Jones - 1:1.13.21-2 +- New upstream version 1.13.21. +- Move virt-sysprep to libguestfs-tools, to avoid pulling in extra + dependencies for RHEV-H. This tool is not likely to be useful + for RHEV-H in its current form anyway. +- Change BR cryptsetup-luks -> cryptsetup since that package changed. + +* Wed Oct 12 2011 Peter Schiffer - 1:1.13.20-1.1 +- rebuild with new gmp + +* Tue Oct 11 2011 Richard W.M. Jones - 1:1.13.20-1 +- New upstream version 1.13.20. + +* Sat Oct 8 2011 Richard W.M. Jones - 1:1.13.19-1 +- New upstream version 1.13.19. +- New tool: virt-sysprep. +- Remove the old guestfish and libguestfs-mount packages, and put these + tools into libguestfs-tools. This change is long overdue, but is also + necessitated by the new virt-sysprep tool. This new tool would pull + in guestfish anyway, so having separate packages makes no sense. +- Remove old obsoletes for virt-cat, virt-df, virt-df2 and virt-inspector, + since those packages existed only in much older Fedora. + +* Wed Oct 5 2011 Richard W.M. Jones - 1:1.13.18-1 +- New upstream version 1.13.18. +- New tool: virt-alignment-scan. + +* Tue Oct 4 2011 Richard W.M. Jones - 1:1.13.17-1 +- New upstream version 1.13.17. +- New tool: virt-sparsify. + +* Sat Oct 1 2011 Richard W.M. Jones - 1:1.13.16-1 +- New upstream version 1.13.16. + +* Thu Sep 29 2011 Richard W.M. Jones - 1:1.13.15-2 +- Rearrange description to make it clearer. +- virt-resize was written in OCaml. Move it to libguestfs-tools-c + subpackage since it doesn't require Perl. + +* Wed Sep 28 2011 Richard W.M. Jones - 1:1.13.15-1 +- New upstream version 1.13.15. +- Add lzop program to the appliance (for compress-out API). +- Remove upstream patch. + +* Mon Sep 26 2011 Richard W.M. Jones - 1:1.13.14-2 +- Upstream patch to fix timer check failures during boot (RHBZ#502058). + +* Sat Sep 24 2011 Richard W.M. Jones - 1:1.13.14-1 +- New upstream version 1.13.14. + +* Wed Sep 21 2011 Richard W.M. Jones - 1:1.13.13-1 +- Add Erlang bindings in erlang-libguestfs subpackage. +- Remove upstream patch. + +* Fri Sep 16 2011 Richard W.M. Jones - 1:1.13.12-4 +- Don't require grub. See RHBZ#737261. +- Note this (hopefully temporarily) breaks guestfs_grub_install API. +- Include upstream patch to add guestfs_grub_install into an optional group. + +* Wed Sep 14 2011 Richard W.M. Jones - 1:1.13.12-1 +- New upstream version 1.13.12. + +* Thu Sep 1 2011 Richard W.M. Jones - 1:1.13.11-1 +- New upstream version 1.13.11. + +* Tue Aug 30 2011 Richard W.M. Jones - 1:1.13.10-2 +- Remove MAKEDEV dependency (RHBZ#727247). + +* Sun Aug 28 2011 Richard W.M. Jones - 1:1.13.10-1 +- New upstream version 1.13.10. + +* Fri Aug 26 2011 Richard W.M. Jones - 1:1.13.9-1 +- New upstream version 1.13.9. + +* Fri Aug 26 2011 Richard W.M. Jones - 1:1.13.8-1 +- New upstream version 1.13.8. +- Static python library is no longer built, so don't rm it. + +* Tue Aug 23 2011 Richard W.M. Jones - 1:1.13.7-1 +- New upstream version 1.13.7. +- configure --with-extra version string contains Fedora release. +- Build with make V=1 to display full compile commands. +- Remove /usr/sbin PATH setting, not used for a very long time. + +* Fri Aug 19 2011 Richard W.M. Jones - 1:1.13.6-2 +- New upstream version 1.13.6. +- Rebase non-upstream patch to fix qemu -machine option. + +* Wed Aug 17 2011 Richard W.M. Jones - 1:1.13.5-1 +- New upstream version 1.13.5. + +* Thu Aug 11 2011 Richard W.M. Jones - 1:1.13.4-1 +- New upstream version 1.13.4. + +* Mon Aug 8 2011 Richard W.M. Jones - 1:1.13.3-4 +- New upstream version 1.13.3. +- 'test-getlogin_r.c:55: assertion failed' test must now be fixed in + gnulib/tests directory instead of daemon/tests (the latter directory + no longer exists). +- Only run testsuite on x86_64 because of qemu bug. + +* Tue Aug 2 2011 Richard W.M. Jones - 1:1.13.2-3 +- Switch Rawhide to use the new development branch (1.13). +- New upstream version 1.13.2. +- Remove upstream patch. +- Ensure config.log is printed, even in the error case. + +* Tue Jul 26 2011 Richard W.M. Jones - 1:1.12.1-4 +- New upstream stable branch version 1.12.1. +- Remove 5 x upstream patches. +- Add non-upstream patch to deal with broken qemu -machine option. +- Add upstream patch to fix segfault in OCaml bindings. + +* Tue Jul 26 2011 Richard W.M. Jones - 1:1.12.0-11 +- Bump and rebuild. + +* Fri Jul 22 2011 Richard W.M. Jones - 1:1.12.0-10 +- Rebuild against fixed hivex 1.2.7-7 in dist-f16-perl. + +* Thu Jul 21 2011 Richard W.M. Jones - 1:1.12.0-9 +- Attempt rebuild in dist-f16-perl. + +* Thu Jul 21 2011 Petr Sabata - 1:1.12.0-8 +- Perl mass rebuild + +* Thu Jul 21 2011 Richard W.M. Jones - 1:1.12.0-4 +- Disable tests, use quickcheck, because of RHBZ#723555, RHBZ#723822. + +* Wed Jul 20 2011 Richard W.M. Jones - 1:1.12.0-2 +- Readd patch to fix virtio-serial test for qemu 0.15. + +* Wed Jul 20 2011 Richard W.M. Jones - 1:1.12.0-1 +- New stable version 1.12.0 for Fedora 16. +- Remove upstream patch. +- Disable tests on i686 (because of RHBZ#723555). + +* Wed Jul 20 2011 Petr Sabata - 1:1.11.20-3 +- Perl mass rebuild + +* Tue Jul 19 2011 Richard W.M. Jones - 1:1.11.20-2 +- Add upstream patch to fix virtio-serial test for qemu 0.15. + +* Tue Jul 19 2011 Richard W.M. Jones - 1:1.11.20-1 +- New upstream version 1.11.20. +- Replace standard README file with one suited for Fedora. +- Add guestfs-java(3) manpage to libguestfs-java-devel package. + +* Mon Jul 18 2011 Richard W.M. Jones - 1:1.11.19-1 +- New upstream version 1.11.19. +- Remove upstream patch. +- Add Ukrainian (uk) man pages subpackage. + +* Fri Jul 15 2011 Richard W.M. Jones - 1:1.11.18-2 +- Add upstream patch to fix regression test. + +* Fri Jul 15 2011 Richard W.M. Jones - 1:1.11.18-1 +- New upstream version 1.11.18. +- Force febootstrap >= 3.7 which contains a fix for latest Rawhide. +- Use --enable-install-daemon to install guestfsd. + +* Thu Jul 14 2011 Richard W.M. Jones - 1:1.11.17-1 +- New upstream version 1.11.17. + +* Wed Jul 13 2011 Richard W.M. Jones - 1:1.11.16-1 +- New upstream version 1.11.16. + +* Tue Jul 12 2011 Richard W.M. Jones - 1:1.11.15-1 +- New upstream version 1.11.15. + +* Wed Jul 6 2011 Richard W.M. Jones - 1:1.11.14-1 +- New upstream version 1.11.14. + +* Wed Jul 6 2011 Richard W.M. Jones - 1:1.11.13-3 +- Further updates to libguestfs-live-service after feedback from + Dan Berrange and Lennart Poettering. + +* Tue Jul 5 2011 Richard W.M. Jones - 1:1.11.13-2 +- Add libguestfs-live-service subpackage. This can be installed in + virtual machines in order to enable safe editing of files in running + guests (eg. guestfish --live). + +* Thu Jun 30 2011 Richard W.M. Jones - 1:1.11.13-1 +- New upstream version 1.11.13. + +* Wed Jun 29 2011 Richard W.M. Jones - 1:1.11.12-3 +- Bump and rebuild for parted 3.0. +- Depend on fixed parted >= 3.0-2. + +* Tue Jun 28 2011 Richard W.M. Jones - 1:1.11.12-1 +- New upstream version 1.11.12. + +* Tue Jun 21 2011 Richard W.M. Jones - 1:1.11.11-1 +- New upstream version 1.11.11. + +* Mon Jun 20 2011 Richard W.M. Jones - 1:1.11.10-3 +- Temporarily stop setting CCFLAGS in perl subdirectory. + See: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=628522 + +* Fri Jun 17 2011 Marcela Mašláňová - 1:1.11.10-2 +- Perl mass rebuild + +* Fri Jun 10 2011 Richard W.M. Jones - 1:1.11.10-1 +- New upstream version 1.11.10. +- Enable tests since fix for RHBZ#710921 is in Rawhide kernel package. + +* Fri Jun 10 2011 Marcela Mašláňová - 1:1.11.9-8 +- Perl 5.14 mass rebuild + +* Sun Jun 5 2011 Richard W.M. Jones - 1:1.11.9-7 +- Build against new parted. +- Disable tests on i686 because of RHBZ#710921. +- Remove recipes/ doc directory. This is no longer present because it + was replaced by a guestfs-recipes(1) man page. + +* Sat Jun 4 2011 Richard W.M. Jones - 1:1.11.9-1 +- New upstream version 1.11.9. + +* Wed May 18 2011 Richard W.M. Jones - 1:1.11.8-1 +- New upstream version 1.11.8. +- "zero" command test is fixed now, so we don't need to skip it. + +* Tue May 17 2011 Richard W.M. Jones - 1:1.11.7-3 +- New upstream version 1.11.7. +- Depends on hivex >= 1.2.7. +- Remove upstream patch. +- Skip test of "zero" command (RHBZ#705499). + +* Mon May 9 2011 Richard W.M. Jones - 1:1.11.5-2 +- configure: Use Python platform-dependent site-packages. + +* Mon May 9 2011 Richard W.M. Jones - 1:1.11.5-1 +- New upstream version 1.11.5. +- virt-edit has been rewritten in C, therefore this tool has been moved + into the libguestfs-tools-c package. + +* Sun May 8 2011 Richard W.M. Jones - 1:1.11.4-1 +- New upstream version 1.11.4. + +* Fri Apr 22 2011 Richard W.M. Jones - 1:1.11.3-1 +- New upstream version 1.11.3. + +* Mon Apr 18 2011 Richard W.M. Jones - 1:1.11.2-1 +- New upstream version 1.11.2. +- Fixes Python bindings when used in Python threads. +- Remove upstream patch. + +* Sat Apr 16 2011 Richard W.M. Jones - 1:1.11.1-2 +- New upstream version 1.11.1. +- Add upstream patch so we don't depend on libtool. + +* Fri Apr 15 2011 Richard W.M. Jones - 1:1.11.0-2 +- Bump and rebuild. + +* Tue Apr 12 2011 Richard W.M. Jones - 1:1.11.0-1 +- New upstream development branch 1.11.0. +- New Source URL. +- Remove patches which are now upstream. + +* Sun Apr 10 2011 Richard W.M. Jones - 1:1.9.18-4 +- Include further fixes to virt-resize from upstream. + +* Sat Apr 9 2011 Richard W.M. Jones - 1:1.9.18-2 +- New upstream version 1.9.18. +- Requires ocaml-pcre for new virt-resize. +- Remove libguestfs-test-tool-helper program which is no longer used. +- Include upstream fix for virt-resize build. + +* Wed Apr 6 2011 Richard W.M. Jones - 1:1.9.17-2 +- Remove partially translated Ukrainian manpages. + +* Tue Apr 5 2011 Richard W.M. Jones - 1:1.9.17-1 +- New upstream version 1.9.17. + +* Fri Apr 1 2011 Richard W.M. Jones - 1:1.9.16-1 +- New upstream version 1.9.16. + +* Fri Apr 1 2011 Richard W.M. Jones - 1:1.9.15-1 +- New upstream version 1.9.15. +- Add BR libconfig-devel. +- Add /etc/libguestfs-tools.conf (config file for guestfish, guestmount, + virt-rescue; in future for other tools as well). + +* Mon Mar 28 2011 Richard W.M. Jones - 1:1.9.14-1 +- New upstream version 1.9.14. +- Include 'acl' as BR so virt-rescue gets getfacl and setfacl programs. + +* Mon Mar 28 2011 Richard W.M. Jones - 1:1.9.13-2 +- Include 'attr' as BR (required for getfattr, setfattr programs in + virt-rescue). + +* Thu Mar 24 2011 Richard W.M. Jones - 1:1.9.13-1 +- New upstream version 1.9.13. + +* Fri Mar 18 2011 Richard W.M. Jones - 1:1.9.12-1 +- New upstream version 1.9.12. + +* Wed Mar 16 2011 Richard W.M. Jones - 1:1.9.11-2 +- Add runtime requires on minimum glibc because of newly readable binaries. + +* Tue Mar 15 2011 Richard W.M. Jones - 1:1.9.11-1 +- New upstream version 1.9.11. +- Add generated Ruby documentation (rdoc). + +* Tue Mar 8 2011 Richard W.M. Jones - 1:1.9.10-1 +- New upstream version 1.9.10. +- Remove patches (now upstream). + +* Fri Mar 4 2011 Richard W.M. Jones - 1:1.9.9-2 +- Include upstream patches to fix virt-make-fs with qemu-img 0.14. + +* Fri Mar 4 2011 Richard W.M. Jones - 1:1.9.9-1 +- New upstream version 1.9.9. + +* Tue Feb 08 2011 Fedora Release Engineering - 1:1.9.8-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Sun Feb 6 2011 Richard W.M. Jones - 1:1.9.8-1 +- New upstream version 1.9.8. + +* Sun Feb 6 2011 Richard W.M. Jones - 1:1.9.7-7 +- Rebuild against rpm-4.9.0-0.beta1.6.fc15 to fix OCaml deps. See discussion: + http://lists.fedoraproject.org/pipermail/devel/2011-February/148398.html + +* Wed Feb 2 2011 Richard W.M. Jones - 1:1.9.7-6 +- Add temporary non-upstream patch to fix /etc/mtab. + See: https://www.redhat.com/archives/libguestfs/2011-February/msg00006.html +- Add fix for regressions/rhbz557655.sh so it works when tracing is enabled. +- Add guestfs-perl(3) man page. + +* Tue Feb 1 2011 Richard W.M. Jones - 1:1.9.7-3 +- Enable trace in 'make check' section. + +* Sun Jan 30 2011 Richard W.M. Jones - 1:1.9.7-1 +- New upstream version 1.9.7. + +* Wed Jan 26 2011 Richard W.M. Jones - 1:1.9.6-2 +- Bump and rebuild. + +* Sat Jan 22 2011 Richard W.M. Jones - 1:1.9.6-1 +- New upstream version 1.9.6. + +* Tue Jan 18 2011 Richard W.M. Jones - 1:1.9.5-1 +- New upstream version 1.9.5. + +* Sat Jan 15 2011 Richard W.M. Jones - 1:1.9.4-1 +- New upstream version 1.9.4. + +* Fri Jan 14 2011 Richard W.M. Jones - 1:1.9.3-2 +- Only runtime require febootstrap-supermin-helper (not whole of + febootstrap). + +* Tue Jan 11 2011 Richard W.M. Jones - 1:1.9.3-1 +- New upstream version 1.9.3. + +* Wed Jan 05 2011 Richard W.M. Jones - 1:1.9.2-2 +- Bump and rebuild. + +* Mon Jan 3 2011 Richard W.M. Jones - 1:1.9.2-1 +- New upstream version 1.9.2. +- New tools: virt-copy-in, virt-copy-out, virt-tar-in, virt-tar-out. + These are just shell script wrappers around guestfish so they are + included in the guestfish package. + +* Fri Dec 31 2010 Richard W.M. Jones - 1:1.9.1-1 +- New upstream version 1.9.1. + +* Tue Dec 21 2010 Richard W.M. Jones - 1:1.9.0-2 +- Bump and rebuild. + +* Sun Dec 19 2010 Richard W.M. Jones - 1:1.9.0-1 +- New upstream development branch 1.9.0. +- Include ROADMAP in devel package. + +* Thu Dec 16 2010 Richard Jones - 1:1.7.24-1 +- New upstream version 1.7.24. +- Adds getxattr/lgetxattr APIs to support guestfs-browser. + +* Sat Dec 11 2010 Richard Jones - 1:1.7.23-1 +- New upstream version 1.7.23. + +* Sat Dec 11 2010 Richard Jones - 1:1.7.22-1 +- New upstream version 1.7.22. +- Depend on febootstrap 3.3 which fixes the checksum stability problem. + +* Fri Dec 10 2010 Richard Jones - 1:1.7.21-1 +- New upstream version 1.7.21. + +* Tue Dec 7 2010 Richard Jones - 1:1.7.20-1 +- New upstream version 1.7.20. +- Remove patches which are upstream. + +* Tue Dec 7 2010 Richard Jones - 1:1.7.19-15 +- Rebuild appliance with febootstrap 3.1-5 because we accidentally + reopened RHBZ#654638. + +* Mon Dec 6 2010 Richard Jones - 1:1.7.19-14 +- Rebuild appliance properly using febootstrap 3.1 and alternate yum repo. + +* Sun Dec 5 2010 Richard Jones - 1:1.7.19-1 +- New upstream development version 1.7.19. +- Appliance building in this version has been substantially rewritten + and this requires febootstrap >= 3.0 to build. +- createrepo no longer required. +- Supermin appliance is the default. + +* Wed Dec 1 2010 Richard Jones - 1:1.7.18-1 +- New upstream development version 1.7.18. + +* Tue Nov 30 2010 Richard Jones - 1:1.7.17-1 +- New upstream development version 1.7.17. + +* Fri Nov 26 2010 Richard Jones - 1:1.7.16-1 +- New upstream development version 1.7.16. +- guestfish no longer requires pod2text, hence no longer requires perl. +- Require febootstrap >= 2.11. + +* Fri Nov 26 2010 Richard Jones - 1:1.7.15-2 +- New upstream development version 1.7.15. +- Split out new libguestfs-tools-c package from libguestfs-tools. + . This is so that the -tools-c package can be pulled in by people + wanting to avoid a dependency on Perl, while -tools pulls in everything + as before. + . The C tools currently are: cat, df, filesystems, fish, inspector, ls, + mount, rescue. + . guestfish still requires pod2text which requires perl. This will be + rectified in the next release. + . libguestfs-tools no longer pulls in guestfish. +- guestfish also depends on: less, man, vi +- Add BR db4-utils (although since RPM needs it, it not really necessary). +- Runtime requires on db4-utils should be on core lib, not tools package. +- Change all "Requires: perl-Foo" to "Requires: perl(Foo)". + +* Thu Nov 25 2010 Richard Jones - 1:1.7.14-1 +- New upstream development version 1.7.14. + +* Wed Nov 24 2010 Richard Jones - 1:1.7.13-3 +- New upstream development version 1.7.13. +- New manual pages containing example code. +- Ship examples for C, OCaml, Ruby, Python. +- Don't ship HTML versions of man pages. +- Rebase no-fuse-test patch to latest version. + +* Tue Nov 23 2010 Richard Jones - 1:1.7.12-1 +- New upstream development version 1.7.12. +- New tool: virt-filesystems. virt-list-filesystems and virt-list-partitions + are deprecated, but still included in the package. + +* Wed Nov 17 2010 Richard Jones - 1:1.7.11-1 +- New upstream development version 1.7.11. +- Fix Source0 URL which had pointed to the 1.5 directory. +- virt-inspector is not a dependency of guestmount. + +* Wed Nov 17 2010 Richard Jones - 1:1.7.10-1 +- New upstream development version 1.7.10. + +* Tue Nov 16 2010 Richard Jones - 1:1.7.9-1 +- New upstream development version 1.7.9. + +* Mon Nov 15 2010 Richard Jones - 1:1.7.8-1 +- New upstream development version 1.7.8. +- Add Obsoletes so perl-Sys-Guestfs overrides perl-libguestfs (RHBZ#652587). + +* Mon Nov 15 2010 Richard Jones - 1:1.7.7-1 +- New upstream development version 1.7.7. +- Rename perl-libguestfs as perl-Sys-Guestfs (RHBZ#652587). + +* Sat Nov 13 2010 Richard Jones - 1:1.7.6-1 +- New upstream development version 1.7.6. + +* Sat Nov 13 2010 Richard Jones - 1:1.7.5-2 +- New upstream development version 1.7.5. +- Remove hand-installation of Ruby bindings. +- Remove upstream patch. + +* Thu Nov 11 2010 Richard Jones - 1:1.7.4-2 +- New upstream development version 1.7.4. +- ocaml-xml-light is no longer required. +- Remove guestfs-actions.h and guestfs-structs.h. Libguestfs now + only exports a single header file. +- Add patch to fix broken Perl test. +- Remove workaround for RHBZ#563103. + +* Mon Nov 8 2010 Richard Jones - 1:1.7.3-1 +- New upstream development version 1.7.3. +- Add AUTHORS file from tarball. + +* Fri Nov 5 2010 Richard Jones - 1:1.7.2-1 +- New upstream development version 1.7.2. +- Add requires ruby to ruby-libguestfs package. + +* Wed Nov 3 2010 Richard Jones - 1:1.7.1-1 +- New upstream development version 1.7.1. +- Add BR gperf. + +* Tue Nov 2 2010 Richard Jones - 1:1.7.0-1 +- New upstream development branch and version 1.7.0. + +* Fri Oct 29 2010 Richard Jones - 1:1.5.26-1 +- New upstream development version 1.5.26. + +* Thu Oct 28 2010 Richard Jones - 1:1.5.25-1 +- New upstream development version 1.5.25. +- Rewritten virt-inspector. +- Requires febootstrap >= 2.10. +- New virt-inspector requires db_dump program. + +* Wed Oct 27 2010 Richard Jones - 1:1.5.24-2 +- Attempt to run tests. + +* Wed Oct 27 2010 Richard Jones - 1:1.5.24-1 +- New upstream development version 1.5.24. + +* Sat Oct 23 2010 Richard Jones - 1:1.5.23-1 +- Fix for libguestfs: missing disk format specifier when adding a disk + (RHBZ#642934, CVE-2010-3851). + +* Tue Oct 19 2010 Richard Jones - 1:1.5.22-1 +- New upstream development version 1.5.22. + +* Sat Oct 9 2010 Richard Jones - 1:1.5.21-2 +- guestfish no longer requires virt-inspector. + +* Fri Oct 1 2010 Richard Jones - 1:1.5.21-1 +- New upstream development version 1.5.21. + +* Sun Sep 26 2010 Richard Jones - 1:1.5.20-1 +- New upstream development version 1.5.20. + +* Wed Sep 22 2010 Richard Jones - 1:1.5.18-1 +- New upstream development version 1.5.18. +- Note that guestfish '-a' and '-d' options were broken in 1.5.17, so + upgrading to this version is highly recommended. + +* Tue Sep 21 2010 Richard Jones - 1:1.5.17-1 +- New upstream development version 1.5.17. + +* Wed Sep 15 2010 Richard Jones - 1:1.5.16-1 +- New upstream development version 1.5.16. + +* Wed Sep 15 2010 Richard Jones - 1:1.5.15-1 +- New upstream development version 1.5.15. + +* Tue Sep 14 2010 Richard Jones - 1:1.5.14-1 +- New upstream development version 1.5.14. + +* Mon Sep 13 2010 Richard Jones - 1:1.5.13-1 +- New upstream version 1.5.13. +- Removed the patch workaround for RHBZ#630583. The same workaround + is now upstream (the bug is not fixed). + +* Sat Sep 11 2010 Richard Jones - 1:1.5.12-1 +- New upstream version 1.5.12. + +* Fri Sep 10 2010 Richard Jones - 1:1.5.11-1 +- New upstream version 1.5.11. +- Note: fixes a serious bug in guestfish 'copy-out' command. + +* Thu Sep 9 2010 Richard Jones - 1:1.5.10-1 +- New upstream version 1.5.10. + +* Wed Sep 8 2010 Richard Jones - 1:1.5.9-2 +- Disable tests, still failing because of RHBZ#630777. + +* Wed Sep 8 2010 Richard Jones - 1:1.5.9-1 +- New upstream version 1.5.9. + +* Mon Sep 6 2010 Richard Jones - 1:1.5.8-2 +- Add patch to work around RHBZ#630583 and reenable tests. + +* Sat Sep 4 2010 Richard Jones - 1:1.5.8-1 +- New upstream version 1.5.8. +- Add BR po4a for translations of man pages. +- Add PHP bindings. +- Remove partially-translated Japanese webpages. + +* Wed Sep 1 2010 Richard Jones - 1:1.5.7-1 +- New upstream version 1.5.7. +- 'debug' command is enabled by default now. + +* Fri Aug 27 2010 Richard Jones - 1:1.5.6-1 +- New upstream version 1.5.6. + +* Fri Aug 27 2010 Richard Jones - 1:1.5.5-2 +- Use bug-fixed febootstrap 2.9. + +* Thu Aug 26 2010 Richard Jones - 1:1.5.5-1 +- New upstream version 1.5.5. + +* Tue Aug 24 2010 Richard Jones - 1:1.5.4-2 +- Disable tests again, because the Rawhide kernel still won't boot. + +* Tue Aug 24 2010 Richard Jones - 1:1.5.4-1 +- New upstream development version 1.5.4. +- Now requires febootstrap >= 2.8 and qemu >= 0.12. +- Re-enable tests because RHBZ#624854 is supposed to be fixed. +- Upstream Source URL has changed. + +* Wed Aug 18 2010 Richard Jones - 1:1.5.3-2 +- Disable tests because of RHBZ#624854. + +* Tue Aug 17 2010 Richard Jones - 1:1.5.3-1 +- New upstream development version 1.5.3. + +* Wed Aug 11 2010 Richard Jones - 1:1.5.2-6 +- Bump and rebuild. + +* Thu Aug 05 2010 Richard Jones - 1:1.5.2-5 +- Bump and rebuild. + +* Fri Jul 23 2010 David Malcolm - 1:1.5.2-4 +- Rebuilt for https://fedoraproject.org/wiki/Features/Python_2.7/MassRebuild + +* Fri Jul 23 2010 David Malcolm - 1:1.5.2-3 +- Rebuilt for https://fedoraproject.org/wiki/Features/Python_2.7/MassRebuild + +* Thu Jul 22 2010 Richard W.M. Jones - 1:1.5.2-2 +- New upstream development version 1.5.2. +- +BuildRequires: cryptsetup-luks. + +* Wed Jul 21 2010 Richard W.M. Jones - 1:1.5.1-1 +- New upstream development version 1.5.1. + +* Tue Jul 20 2010 Richard W.M. Jones - 1:1.5.0-7 +- Requires binutils (RHBZ#616437). + +* Mon Jul 19 2010 Richard W.M. Jones - 1:1.5.0-6 +- Fix libguestfs-find-requires.sh for new location of hostfiles (RHBZ#615946). + +* Thu Jul 8 2010 Richard W.M. Jones - 1:1.5.0-5 +- Include RELEASE-NOTES in devel package. + +* Thu Jul 8 2010 Richard W.M. Jones - 1:1.5.0-4 +- New development branch 1.5.0. +- Remove two upstream patches. +- Work around permanently broken test-getlogin_r Gnulib test. + +* Mon Jun 28 2010 Richard W.M. Jones - 1:1.3.21-4 +- Explicitly depend on e2fsprogs. +- Add patch to add e2fsprogs to the appliance. +- Add patch to fix GFS kernel module problem. + +* Fri Jun 25 2010 Mamoru Tasaka - 1:1.3.21-2 +- Rebuild + +* Wed Jun 16 2010 Richard W.M. Jones - 1:1.3.21-1 +- New upstream version 1.3.21. + +* Tue Jun 8 2010 Richard W.M. Jones - 1:1.3.20-1 +- New upstream version 1.3.20. +- Since upstream commit a043b6854a0c4 we don't need to run make install + twice. + +* Fri Jun 4 2010 Richard W.M. Jones - 1:1.3.19-1 +- New upstream version 1.3.19. + +* Wed Jun 2 2010 Richard W.M. Jones - 1:1.3.18-1 +- New upstream version 1.3.18. + +* Thu May 27 2010 Richard W.M. Jones - 1:1.3.17-1 +- New upstream version 1.3.17. +- Change repo name to 'fedora-14'. + +* Wed May 26 2010 Richard W.M. Jones - 1:1.3.16-6 +- Co-own bash_completion.d directory. + +* Tue May 25 2010 Richard W.M. Jones - 1:1.3.16-4 +- New upstream version 1.3.16. +- Add guestfish bash tab completion script. + +* Mon May 24 2010 Richard W.M. Jones - 1:1.3.14-1 +- New upstream version 1.3.14. + +* Sun May 16 2010 Richard W.M. Jones - 1:1.3.13-1 +- New upstream version 1.3.13. +- Add BUGS to documentation. +- Force update of hivex dependency to 1.2.2 since it contains + important registry import fixes. +- Remove patch1, now upstream. + +* Fri May 14 2010 Richard W.M. Jones - 1:1.3.12-3 +- Backport supermin build fix from upstream. +- Further changes required for new layout of supermin appliance. + +* Fri May 14 2010 Richard W.M. Jones - 1:1.3.12-1 +- New upstream version 1.3.12. +- febootstrap >= 2.7 is required at compile time and at runtime (at runtime + because of the new febootstrap-supermin-helper). +- Bugs fixed: 591155 591250 576879 591142 588651 507810 521674 559963 516096. + +* Sat May 8 2010 Richard W.M. Jones - 1:1.3.11-1 +- New upstream version 1.3.11. + +* Fri May 7 2010 Richard W.M. Jones - 1:1.3.10-2 +- New upstream version 1.3.10. + +* Thu May 06 2010 Richard W.M. Jones - 1:1.3.9-2 +- Bump and rebuild against updated libconfig + +* Fri Apr 30 2010 Richard W.M. Jones - 1:1.3.9-1 +- New upstream version 1.3.9. + +* Thu Apr 29 2010 Marcela Maslanova - 1:1.3.8-2 +- Mass rebuild with perl-5.12.0 + +* Tue Apr 27 2010 Richard W.M. Jones - 1:1.3.8-1 +- New upstream version 1.3.8. + +* Fri Apr 23 2010 Richard W.M. Jones - 1:1.3.7-1 +- New upstream version 1.3.7. +- NOTE: fixes a segfault in guestfish 1.3.6 when using the -a option. + +* Thu Apr 22 2010 Richard W.M. Jones - 1:1.3.6-1 +- New upstream version 1.3.6. + +* Mon Apr 19 2010 Richard W.M. Jones - 1:1.3.5-1 +- New upstream version 1.3.5. + +* Sat Apr 17 2010 Richard W.M. Jones - 1:1.3.4-1 +- New upstream version 1.3.4. + +* Sun Apr 11 2010 Richard W.M. Jones - 1:1.3.3-1 +- New upstream version 1.3.3. +- New virt-resize option --LV-expand. +- New API: lvresize-free. +- Fixes RHBZ#581501. + +* Sun Apr 11 2010 Richard W.M. Jones - 1:1.3.2-3 +- Disable checksum-device test. + +* Sat Apr 10 2010 Richard W.M. Jones - 1:1.3.2-2 +- Bump and rebuild. + +* Sat Apr 10 2010 Richard W.M. Jones - 1:1.3.2-1 +- New upstream version 1.3.2. +- New APIs: checksum-device, part-del, part-get-bootable, part-get-mbr-id, + part-set-mbr-id, vgscan, ntfsresize, txz-in, txz-out. +- Enhanced/fixed virt-resize tool. +- Enhanced virt-list-partitions tool. +- Fixes: 580016, 580650, 579155, 580556. + +* Sat Apr 10 2010 Richard W.M. Jones - 1:1.3.1-4 +- Bump and rebuild. + +* Thu Apr 8 2010 Richard W.M. Jones - 1:1.3.1-3 +- Runtime requires should only be on libguestfs-tools subpackage. + +* Thu Apr 8 2010 Richard W.M. Jones - 1:1.3.1-2 +- Missing BR on qemu-img package. + +* Thu Apr 8 2010 Richard W.M. Jones - 1:1.3.1-1 +- New upstream version 1.3.1. +- For explanation of apparently large version jump, see: + https://www.redhat.com/archives/libguestfs/2010-April/msg00057.html +- New tool: virt-make-fs. +- New API: guestfs_zero_device. +- Fixes RHBZ#580246 (tar-in command hangs if uploading more than + available space) +- Fixes RHBZ#579664 (guestfish doesn't report error when there is not + enough space for image allocation) +- +BR perl-String-ShellQuote (for virt-make-fs). + +* Tue Mar 30 2010 Richard W.M. Jones - 1:1.0.89-1 +- New upstream version 1.0.89. +- Improved version of virt-win-reg. +- Many smaller bugfixes. +- Requires hivex >= 1.2.1. +- Remove TERM=dumb patch which is now upstream. + +* Tue Mar 30 2010 Richard W.M. Jones - 1:1.0.88-7 +- Backport of TERM=dumb patch from upstream. +- Workaround failure caused by RHBZ#575734. +- Workaround unknown failure of test_swapon_label_0. + +* Tue Mar 30 2010 Richard W.M. Jones - 1:1.0.88-5 +- Attempted workaround for RHBZ#563103, so we can reenable tests. + +* Fri Mar 26 2010 Richard W.M. Jones - 1:1.0.88-2 +- Remember to check in the new sources. + +* Fri Mar 26 2010 Richard W.M. Jones - 1:1.0.88-1 +- New upstream version 1.0.88. +- Mainly small bugfixes. +- Update Spanish translation of libguestfs (RHBZ#576876). +- Use ext4 dev tools on RHEL 5 (RHBZ#576688). +- Add support for minix filesystem (RHBZ#576689). + +* Fri Mar 26 2010 Richard W.M. Jones - 1:1.0.87-2 +- Add vim-minimal to BR, it is now required by the appliance. + +* Tue Mar 23 2010 Richard W.M. Jones - 1:1.0.87-1 +- New upstream version 1.0.87. +- New tools: virt-resize and virt-list-partitions. +- New APIs: guestfs_copy_size; APIs for querying the relationship between + LVM objects. +- Add vim to the virt-rescue appliance. + +* Fri Mar 12 2010 Richard W.M. Jones - 1:1.0.86-1 +- New upstream version 1.0.86. +- libguestfs-supermin-helper rewritten in C (from shell), reduces + appliance boot time by 2-3 seconds. +- Fix parsing of integers in guestfish on 32 bit platforms (RHBZ#569757 + and RHBZ#567567). +- Enhance virt-inspector output for Windows guests. +- Add product_name field to virt-inspector output for all guests. +- Weaken dependencies on libntfs-3g.so, don't include SONAME in dep. +- Remove false dependency on libply (plymouth libraries). +- Spanish translation (RHBZ#570181). +- Fix bash regexp quoting bug. + +* Fri Mar 12 2010 Richard W.M. Jones - 1:1.0.85-4 +- Bump and rebuild. + +* Thu Mar 11 2010 Richard W.M. Jones - 1:1.0.85-3 +- Bump and rebuild. + +* Sat Mar 06 2010 Richard W.M. Jones - 1:1.0.85-2 +- Bump and rebuild. + +* Mon Mar 1 2010 Richard W.M. Jones - 1:1.0.85-1 +- New upstream version 1.0.85. +- Remove hivex, now a separate upstream project and package. +- Remove supermin quoting patch, now upstream. + +* Mon Mar 1 2010 Richard W.M. Jones - 1:1.0.84-6 +- Fix quoting in supermin-split script (RHBZ#566511). +- Don't include bogus './builddir' entries in supermin hostfiles + (RHBZ#566512). + +* Mon Feb 22 2010 Richard W.M. Jones - 1:1.0.84-4 +- Don't include generator.ml in rpm. It's 400K and almost no one will need it. +- Add comments to spec file about how repo building works. +- Whitespace changes in the spec file. + +* Mon Feb 22 2010 Richard W.M. Jones - 1:1.0.84-3 +- Bump and rebuild. + +* Tue Feb 16 2010 Richard W.M. Jones - 1:1.0.84-2 +- Bump and rebuild. + +* Fri Feb 12 2010 Richard W.M. Jones - 1:1.0.84-1 +- New upstream version 1.0.84. + +* Fri Feb 12 2010 Richard W.M. Jones - 1:1.0.83-8 +- Bump and rebuild. + +* Thu Feb 11 2010 Richard W.M. Jones - 1.0.83-7 +- Disable tests. These fail in Koji (on RHEL 5 kernel) because of a + bug in preadv/pwritev emulation in glibc (RHBZ#563103). + +* Tue Feb 9 2010 Matthew Booth - 1.0.83-6 +- Change buildnonet to buildnet +- Allow buildnet, mirror, updates, virtio and runtests to be configured by user + macros. + +* Mon Feb 8 2010 Richard W.M. Jones - 1.0.83-5 +- libguestfs-tools should require perl-XML-Writer (RHBZ#562858). + +* Mon Feb 8 2010 Richard W.M. Jones - 1.0.83-4 +- Use virtio for block device access (RHBZ#509383 is fixed). + +* Fri Feb 5 2010 Richard W.M. Jones - 1.0.83-3 +- Rebuild: possible timing-related build problem in Koji. + +* Fri Feb 5 2010 Richard W.M. Jones - 1.0.83-2 +- New upstream release 1.0.83. +- This release fixes: + Add Marathi translations (RHBZ#561671). + Polish translations (RHBZ#502533). + Add Gujarti translations (Sweta Kothari) (RHBZ#560918). + Update Oriya translations (thanks Manoj Kumar Giri) (RHBZ#559498). + Set locale in C programs so l10n works (RHBZ#559962). + Add Tamil translation (RHBZ#559877) (thanks to I.Felix) + Update Punjabi translation (RHBZ#559480) (thanks Jaswinder Singh) +- There are significant fixes to hive file handling. +- Add hivexsh and manual page. +- Remove two patches, now upstream. + +* Sun Jan 31 2010 Richard W.M. Jones - 1:1.0.82-7 +- Bump and rebuild. + +* Fri Jan 29 2010 Richard W.M. Jones - 1.0.82-6 +- Backport a better fix for RHBZ557655 test from upstream. +- Backport fix for unreadable yum.log from upstream. + +* Thu Jan 28 2010 Richard W.M. Jones - 1.0.82-3 +- Backport RHBZ557655 test fix from upstream. + +* Thu Jan 28 2010 Richard W.M. Jones - 1.0.82-1 +- New upstream version 1.0.82. This includes the two patches + we were carrying, so those are now removed. +- This release fixes: + RHBZ#559498 (Oriya translation). + RHBZ#559480 (Punjabi translation). + RHBZ#558593 (Should prevent corruption by multilib). + RHBZ#559237 (Telugu translation). + RHBZ#557655 (Use xstrtol/xstrtoll to parse integers in guestfish). + RHBZ#557195 (Missing crc kernel modules for recent Linux). +- In addition this contains numerous fixes to the hivex library + for parsing Windows Registry files, making hivex* and virt-win-reg + more robust. +- New API call 'filesize'. + +* Thu Jan 28 2010 Richard W.M. Jones - 1.0.81-8 +- Backport special handling of libgcc_s.so. +- Backport unreadable files patch from RHEL 6 / upstream. + +* Fri Jan 22 2010 Richard W.M. Jones - 1.0.81-5 +- Require febootstrap >= 2.6 (RHBZ#557262). + +* Thu Jan 21 2010 Richard W.M. Jones - 1.0.81-4 +- Rebuild for unannounced soname bump (libntfs-3g.so). + +* Fri Jan 15 2010 Richard W.M. Jones - 1.0.81-3 +- Rebuild for unannounced soname bump (libplybootsplash.so). + +* Thu Jan 14 2010 Richard W.M. Jones - 1.0.81-2 +- Rebuild for broken dependency (iptables soname bump). + +* Wed Jan 13 2010 Richard W.M. Jones - 1.0.81-1 +- New upstream version 1.0.81. +- Remove two upstream patches. +- virt-inspector: Make RPM application data more specific (RHBZ#552718). + +* Tue Jan 12 2010 Richard W.M. Jones - 1.0.80-14 +- Reenable tests because RHBZ#553689 is fixed. + +* Tue Jan 12 2010 Richard W.M. Jones - 1.0.80-13 +- Rebuild because of libparted soname bump (1.9 -> 2.1). + +* Fri Jan 8 2010 Richard W.M. Jones - 1.0.80-12 +- qemu in Rawhide is totally broken (RHBZ#553689). Disable tests. + +* Thu Jan 7 2010 Richard W.M. Jones - 1.0.80-11 +- Remove gfs-utils (deprecated and removed from Fedora 13 by the + upstream Cluster Suite developers). +- Include patch to fix regression in qemu -serial stdio option. + +* Tue Dec 29 2009 Richard W.M. Jones - 1.0.80-10 +- Remove some debugging statements which were left in the requires + script by accident. + +* Mon Dec 21 2009 Richard W.M. Jones - 1.0.80-9 +- Generate additional requires for supermin (RHBZ#547496). + +* Fri Dec 18 2009 Richard W.M. Jones - 1.0.80-3 +- Work around udevsettle command problem (RHBZ#548121). +- Enable tests. + +* Wed Dec 16 2009 Richard W.M. Jones - 1.0.80-2 +- Disable tests because of RHBZ#548121. + +* Wed Dec 16 2009 Richard W.M. Jones - 1.0.80-1 +- New upstream release 1.0.80. +- New Polish translations (RHBZ#502533). +- Give a meaningful error if no usable kernels are found (RHBZ#539746). +- New tool: virt-list-filesystems + +* Fri Dec 4 2009 Stepan Kasal - 1:1.0.79-3 +- rebuild against perl 5.10.1 + +* Wed Nov 18 2009 Richard W.M. Jones - 1.0.79-2 +- New upstream release 1.0.79. +- Adds FUSE test script and multiple fixes for FUSE (RHBZ#538069). +- Fix virt-df in Xen (RHBZ#538041). +- Improve speed of supermin appliance. +- Disable FUSE-related tests because Koji doesn't currently allow them. + fuse: device not found, try 'modprobe fuse' first + +* Tue Nov 10 2009 Richard W.M. Jones - 1.0.78-2 +- New upstream release 1.0.78. +- Many more filesystem types supported by this release - add them + as dependencies. + +* Tue Nov 3 2009 Richard W.M. Jones - 1.0.77-1 +- New upstream release 1.0.77. +- Support for mounting guest in host using FUSE (guestmount command). +- hivex*(1) man pages should be in main package, not -devel, since + they are user commands. +- libguestfs-tools: Fix "self-obsoletion" issue raised by rpmlint. +- perl: Remove bogus script Sys/bindtests.pl. + +* Thu Oct 29 2009 Richard W.M. Jones - 1.0.75-2 +- New upstream release 1.0.75. +- New library: libhivex. +- New tools: virt-win-reg, hivexml, hivexget. +- Don't require chntpw. +- Add BR libxml2-devel, accidentally omitted before. + +* Tue Oct 20 2009 Richard W.M. Jones - 1.0.74-1 +- New upstream release 1.0.74. +- New API call: guestfs_find0. +- New tools: virt-ls, virt-tar. + +* Wed Oct 14 2009 Richard W.M. Jones - 1.0.73-1 +- New upstream release 1.0.73. +- OCaml library now depends on xml-light. +- Deal with installed documentation. + +* Tue Sep 29 2009 Richard W.M. Jones - 1.0.72-2 +- Force rebuild. + +* Wed Sep 23 2009 Richard W.M. Jones - 1.0.72-1 +- New upstream release 1.0.72. +- New tools: virt-edit, virt-rescue. +- Combine virt-cat, virt-df, virt-edit, virt-inspector and virt-rescue + into a single package called libguestfs-tools. + +* Tue Sep 22 2009 Richard W.M. Jones - 1.0.71-2 +- New upstream release 1.0.71. + +* Fri Sep 18 2009 Richard W.M. Jones - 1.0.70-2 +- Perl bindings require perl-XML-XPath (fixed RHBZ#523547). + +* Tue Sep 15 2009 Richard W.M. Jones - 1.0.70-1 +- New upstream release 1.0.70. +- Fixes build problem related to old version of GNU gettext. + +* Tue Sep 15 2009 Richard W.M. Jones - 1.0.69-1 +- New upstream release 1.0.69. +- Reenable the tests (because RHBZ#516543 is supposed to be fixed). +- New main loop code should fix RHBZ#501888, RHBZ#504418. +- Add waitpid along guestfs_close path (fixes RHBZ#518747). + +* Wed Aug 19 2009 Richard W.M. Jones - 1.0.68-2 +- New upstream release 1.0.68. +- BR genisoimage. + +* Thu Aug 13 2009 Richard W.M. Jones - 1.0.67-2 +- New upstream release 1.0.67. + +* Fri Aug 7 2009 Richard W.M. Jones - 1.0.66-5 +- Set network interface to ne2k_pci (workaround for RHBZ#516022). +- Rerun autoconf because patch touches configure script. + +* Thu Aug 6 2009 Richard W.M. Jones - 1.0.66-1 +- New upstream release 1.0.66. + +* Wed Jul 29 2009 Richard W.M. Jones - 1.0.65-1 +- New upstream release 1.0.65. +- Add Obsoletes for virt-df2 (RHBZ#514309). +- Disable tests because of ongoing TCG problems with newest qemu in Rawhide. + +* Thu Jul 23 2009 Richard W.M. Jones - 1.0.64-3 +- RHBZ#513249 bug in qemu is now fixed, so try to rebuild and run tests. +- However RHBZ#503236 still prevents us from testing on i386. + +* Thu Jul 23 2009 Richard W.M. Jones - 1.0.64-1 +- New upstream release 1.0.64. +- New tool 'libguestfs-test-tool'. + +* Wed Jul 15 2009 Richard W.M. Jones - 1.0.61-1 +- New upstream release 1.0.61. +- New tool / subpackage 'virt-cat'. +- New BR perl-libintl. + +* Wed Jul 15 2009 Richard W.M. Jones - 1.0.60-2 +- Fix runtime Requires so they use epoch correctly. + +* Tue Jul 14 2009 Richard W.M. Jones - 1.0.60-1 +- New upstream release 1.0.60. + +* Fri Jul 10 2009 Richard W.M. Jones - 1.0.58-2 +- New upstream release 1.0.58. + +* Fri Jul 10 2009 Richard W.M. Jones - 1.0.57-1 +- New upstream release 1.0.57. +- New tool virt-df (obsoletes existing package with this name). +- RHBZ#507066 may be fixed, so reenable tests. + +* Tue Jul 7 2009 Richard W.M. Jones - 1.0.56-2 +- New upstream release 1.0.56. +- Don't rerun generator. + +* Thu Jul 2 2009 Richard W.M. Jones - 1.0.55-1 +- New upstream release 1.0.55. +- New manual page libguestfs(3). + +* Mon Jun 29 2009 Richard W.M. Jones - 1.0.54-2 +- New upstream release 1.0.54. +- +BR perl-XML-Writer. + +* Wed Jun 24 2009 Richard W.M. Jones - 1.0.53-1 +- New upstream release 1.0.53. +- Disable all tests (because of RHBZ#507066). + +* Wed Jun 24 2009 Richard W.M. Jones - 1.0.52-1 +- New upstream release 1.0.52. + +* Mon Jun 22 2009 Richard W.M. Jones - 1.0.51-1 +- New upstream release 1.0.51. +- Removed patches which are now upstream. + +* Sat Jun 20 2009 Richard W.M. Jones - 1.0.49-5 +- Remove workaround for RHBZ#507007, since bug is now fixed. +- Pull in upstream patch to fix pclose checking + (testing as possible fix for RHBZ#507066). +- Pull in upstream patch to check waitpid return values + (testing as possible fix for RHBZ#507066). + +* Fri Jun 19 2009 Richard W.M. Jones - 1.0.49-2 +- New upstream release 1.0.49. +- Add workaround for RHBZ#507007. + +* Tue Jun 16 2009 Richard W.M. Jones - 1.0.48-2 +- Accidentally omitted the supermin image from previous version. + +* Tue Jun 16 2009 Richard W.M. Jones - 1.0.48-1 +- New upstream release 1.0.48. +- Should fix all the brokenness from 1.0.47. +- Requires febootstrap >= 2.3. + +* Mon Jun 15 2009 Richard W.M. Jones - 1.0.47-2 +- New upstream release 1.0.47. +- Enable experimental supermin appliance build. +- Fix path to appliance. + +* Fri Jun 12 2009 Richard W.M. Jones - 1.0.45-2 +- New upstream release 1.0.45. + +* Wed Jun 10 2009 Richard W.M. Jones - 1.0.44-2 +- Disable ppc/ppc64 tests again because of RHBZ#505109. + +* Wed Jun 10 2009 Richard W.M. Jones - 1.0.44-1 +- New upstream version 1.0.44. +- Try enabling tests on ppc & ppc64 since it looks like the bug(s?) + in qemu which might have caused them to fail have been fixed. + +* Tue Jun 9 2009 Richard W.M. Jones - 1.0.43-1 +- New upstream version 1.0.43. +- New upstream URL. +- Requires chntpw program. + +* Sat Jun 6 2009 Richard W.M. Jones - 1.0.42-1 +- New upstream version 1.0.42. + +* Thu Jun 4 2009 Richard W.M. Jones - 1.0.41-1 +- New upstream version 1.0.41. +- Fixes a number of regressions in RHBZ#503169. + +* Thu Jun 4 2009 Richard W.M. Jones - 1.0.40-1 +- New upstream version 1.0.40. + +* Thu Jun 4 2009 Richard W.M. Jones - 1.0.39-1 +- New upstream version 1.0.39. +- Fixes: + . libguestfs /dev is too sparse for kernel installation/upgrade (RHBZ#503169) + . OCaml bindings build failure (RHBZ#502309) + +* Tue Jun 2 2009 Richard W.M. Jones - 1.0.38-2 +- Disable tests on ix86 because of RHBZ#503236. + +* Tue Jun 2 2009 Richard W.M. Jones - 1.0.38-1 +- New upstream version 1.0.38. + +* Fri May 29 2009 Richard W.M. Jones - 1.0.37-1 +- New upstream version 1.0.37. +- Fixes: + . "mkdir-p" should not throw errors on preexisting directories (RHBZ#503133) + . cramfs and squashfs modules should be available in libguestfs appliances + (RHBZ#503135) + +* Thu May 28 2009 Richard W.M. Jones - 1.0.36-2 +- New upstream version 1.0.36. +- Rerun the generator in prep section. + +* Thu May 28 2009 Richard W.M. Jones - 1.0.35-1 +- New upstream version 1.0.35. +- Fixes multiple bugs in bindings parameters (RHBZ#501892). + +* Wed May 27 2009 Richard W.M. Jones - 1.0.34-1 +- New upstream version 1.0.34. + +* Wed May 27 2009 Richard W.M. Jones - 1.0.33-1 +- New upstream version 1.0.33. +- --with-java-home option is no longer required. +- Upstream contains potential fixes for: + 501878 built-in commands like 'alloc' and 'help' don't autocomplete + 501883 javadoc messed up in libguestfs java documentation + 501885 Doesn't detect missing Java, --with-java-home=no should not be needed + 502533 Polish translation of libguestfs + n/a Allow more ext filesystem kmods (Charles Duffy) + +* Tue May 26 2009 Richard W.M. Jones - 1.0.32-2 +- New upstream version 1.0.32. +- Use %%find_lang macro. + +* Sat May 23 2009 Richard W.M. Jones - 1.0.31-1 +- Rebuild for OCaml 3.11.1. +- New upstream version 1.0.31. + +* Thu May 21 2009 Richard Jones - 1.0.30-1 +- New upstream version 1.0.30. Now includes test-bootbootboot.sh script. + +* Thu May 21 2009 Richard Jones - 1.0.29-3 +- New upstream version 1.0.29 (fixes RHBZ#502007 RHBZ#502018). +- This should allow us to enable tests for i386 and x86-64. +- Added test-bootbootboot.sh script which was missed from 1.0.29 tarball. +- Pass kernel noapic flag to workaround RHBZ#502058. + +* Thu May 21 2009 Richard Jones - 1.0.28-1 +- New upstream version 1.0.28. Nothing has visibly changed, but + the source has been gettextized and we want to check that doesn't + break anything. + +* Thu May 21 2009 Richard Jones - 1.0.27-3 +- Change requirement from qemu -> qemu-kvm (RHBZ#501761). + +* Tue May 19 2009 Richard Jones - 1.0.27-2 +- New upstream version 1.0.27. + +* Mon May 18 2009 Richard Jones - 1.0.26-6 +- Experimentally try to reenable ppc and ppc64 builds. +- Note BZ numbers which are causing tests to fail. + +* Mon May 18 2009 Richard Jones - 1.0.26-1 +- New upstream version 1.0.26. + +* Tue May 12 2009 Richard Jones - 1.0.25-4 +- New upstream version 1.0.25. +- Enable debugging when running the tests. +- Disable tests - don't work correctly in Koji. + +* Tue May 12 2009 Richard Jones - 1.0.24-1 +- New upstream version 1.0.24. +- BRs glibc-static for the new command tests. +- Enable tests. + +* Mon May 11 2009 Richard Jones - 1.0.23-2 +- New upstream version 1.0.23. +- Don't try to use updates during build. + +* Fri May 8 2009 Richard Jones - 1.0.21-3 +- New upstream version 1.0.21. + +* Thu May 7 2009 Richard Jones - 1.0.20-2 +- New upstream version 1.0.20. + +* Thu May 7 2009 Richard Jones - 1.0.19-1 +- New upstream version 1.0.19. + +* Tue Apr 28 2009 Richard Jones - 1.0.15-1 +- New upstream version 1.0.15. + +* Fri Apr 24 2009 Richard Jones - 1.0.12-1 +- New upstream version 1.0.12. + +* Wed Apr 22 2009 Richard Jones - 1.0.6-1 +- New upstream version 1.0.6. + +* Mon Apr 20 2009 Richard Jones - 1.0.2-1 +- New upstream version 1.0.2. + +* Thu Apr 16 2009 Richard Jones - 0.9.9-12 +- Multiple fixes to get it to scratch build in Koji. + +* Sat Apr 4 2009 Richard Jones - 0.9.9-1 +- Initial build.