[libguestfs/f20] Backport more virt-builder patches from upstream to Fedora.
Richard W.M. Jones
rjones at fedoraproject.org
Sun Jan 12 18:48:25 UTC 2014
commit 1a341151a44137d776ce713c5334e58db96803b5
Author: Richard W.M. Jones <rjones at redhat.com>
Date: Sun Jan 12 18:19:48 2014 +0000
Backport more virt-builder patches from upstream to Fedora.
0039-builder-Add-CirrOS-0.3.1-disk-image.patch | 133 +++++++
...e-in-man-page-how-to-specify-size-in-byte.patch | 27 ++
...lder-Pass-prog-global-program-name-around.patch | 164 +++++++++
...ibrary-function-to-run-external-command-a.patch | 85 +++++
0043-builder-Fix-handling-of-size-parameter.patch | 96 +++++
...h-Provide-a-friendlier-wrapper-around-vir.patch | 122 +++++++
...-regression-test-of-libvirt-authenticatio.patch | 303 ++++++++++++++++
...-regression-test-for-libvirt-authenticati.patch | 265 ++++++++++++++
...lder-Add-timezone-option-to-set-timezone-.patch | 363 ++++++++++++++++++++
...cs-Remove-confusing-reference-to-timezone.patch | 27 ++
...er-Document-how-to-change-keyboard-layout.patch | 69 ++++
...t-install-packages-in-the-same-order-as-o.patch | 31 ++
...d-link-option-for-creating-symbolic-links.patch | 147 ++++++++
...ument-how-to-change-the-language-locale-o.patch | 55 +++
...ument-how-to-set-up-local-mirrors-for-per.patch | 86 +++++
...ument-that-SELinux-guests-will-reboot-for.patch | 37 ++
...ument-how-to-set-Japanese-language-suppor.patch | 59 ++++
0056-builder-Fix-virt-builder-test.patch | 40 +++
...site-Add-CirrOS-signature-file-to-EXTRA_D.patch | 27 ++
libguestfs.spec | 24 ++-
20 files changed, 2159 insertions(+), 1 deletions(-)
---
diff --git a/0039-builder-Add-CirrOS-0.3.1-disk-image.patch b/0039-builder-Add-CirrOS-0.3.1-disk-image.patch
new file mode 100644
index 0000000..e130b95
--- /dev/null
+++ b/0039-builder-Add-CirrOS-0.3.1-disk-image.patch
@@ -0,0 +1,133 @@
+From 406ee778aab64122ef55c27568671fc16e5259b4 Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Sat, 4 Jan 2014 12:37:40 +0000
+Subject: [PATCH] builder: Add CirrOS 0.3.1 disk image.
+
+(cherry picked from commit 40b88fdbc76515fd21b33f54587c7f4f7b6e9715)
+---
+ builder/website/cirros-0.3.1.xz.sig | 17 ++++++++++++++
+ builder/website/index | 19 +++++++++++++++
+ builder/website/index.asc | 47 ++++++++++++++++++++++++++-----------
+ 3 files changed, 69 insertions(+), 14 deletions(-)
+ create mode 100644 builder/website/cirros-0.3.1.xz.sig
+
+diff --git a/builder/website/cirros-0.3.1.xz.sig b/builder/website/cirros-0.3.1.xz.sig
+new file mode 100644
+index 0000000..973d86c
+--- /dev/null
++++ b/builder/website/cirros-0.3.1.xz.sig
+@@ -0,0 +1,17 @@
++-----BEGIN PGP SIGNATURE-----
++Version: GnuPG v1
++
++iQIcBAABAgAGBQJSx//LAAoJEJFzj3Pht2igtekP/11RH1POvryBWsmtjgwviPJV
++P8eIGuUBy38BYbEO0jBWTsT6CAfwOCtyUUMWCBPJ3meoRd4C5AGWHUS5F6z6fZWq
++Qo+LU1BfPWDa3TMXP9TybexUCI6cIBMlbzbwkSE/fR2JDwl3K58ZWUrI1rxfKKNJ
++CM8rcpLVVP19sAiurndqiIU43bEOS7UwKhBYr1LtNQndpaDH2l+9XnC/HlOrAKgR
++H/X9GgscJ43MtA3VPY140RKgZ716c/zznd2yLXrXIJ9JJ9DsoPsooZ6cZSoxDl2E
++Y16lnQyAcDySPY+NZluQ6xvtk4JiDWxLFqdXMksRtUb14D91bJ2okhjtztg5yuLh
++tC1aNiwcZaDynjXec4SnB+06oPZGstO6uPotasb9sBH/Prm1mv1A4jLwwMTOjSLT
++svZ2/xy83lZqBBwU2oFTiSL+hSS3zTm8X0JaInZJPXlgDOTrdKb7UlzVEJ6SqOZo
++4omjaYnHWIe9H2SPxCH/7/DC9WW1K9fuxkIEjvqbxTC3n/6WziK2Aq2k5s1Aq0Yy
++Z0am0Xhi169V8s8BaLFWiHGi/VlCd81/q2bg+3qCZcWE4zonEZDZSNrL1FtDtHRj
++Cgzo0su2LYHhdt0+2QYnAfUJN7Q5kGA1apWrmVI2cvvDpx0eHsFKLcdJnzOntabv
++fI+rI2o+Lhp1DW7ywVzl
++=KKLo
++-----END PGP SIGNATURE-----
+diff --git a/builder/website/index b/builder/website/index
+index 648d890..32cc402 100644
+--- a/builder/website/index
++++ b/builder/website/index
+@@ -21,6 +21,25 @@ notes=CentOS 6.5
+ Note that `virt-builder centos-6' will always install the latest
+ 6.x release.
+
++[cirros-0.3.1]
++name=CirrOS 0.3.1
++file=cirros-0.3.1.xz
++sig=cirros-0.3.1.xz.sig
++checksum=096209f00eb62d5722accf3d22ca3a4ee5baaac6d7d4ce0be93b56bbd1c8ab2e3eb4f5db1deffcb570e2c3d41f4d721798a1c499675346cee9546554a4b10388
++format=raw
++size=41126400
++compressed_size=11419004
++expand=/dev/sda1
++notes=CirrOS 0.3.1
++
++ CirrOS is a commonly used test image, ideal because it is very
++ small and boots into a minimally usable Linux system.
++
++ Note this is not a real Linux distribution, and several virt-builder
++ features such as installing packages will not (and cannot) work.
++
++ This CirrOS image comes from https://launchpad.net/cirros
++
+ [debian-6]
+ name=Debian 6 (Squeeze)
+ osinfo=debian6
+diff --git a/builder/website/index.asc b/builder/website/index.asc
+index c826d4a..b2291ca 100644
+--- a/builder/website/index.asc
++++ b/builder/website/index.asc
+@@ -24,6 +24,25 @@ notes=CentOS 6.5
+ Note that `virt-builder centos-6' will always install the latest
+ 6.x release.
+
++[cirros-0.3.1]
++name=CirrOS 0.3.1
++file=cirros-0.3.1.xz
++sig=cirros-0.3.1.xz.sig
++checksum=096209f00eb62d5722accf3d22ca3a4ee5baaac6d7d4ce0be93b56bbd1c8ab2e3eb4f5db1deffcb570e2c3d41f4d721798a1c499675346cee9546554a4b10388
++format=raw
++size=41126400
++compressed_size=11419004
++expand=/dev/sda1
++notes=CirrOS 0.3.1
++
++ CirrOS is a commonly used test image, ideal because it is very
++ small and boots into a minimally usable Linux system.
++
++ Note this is not a real Linux distribution, and several virt-builder
++ features such as installing packages will not (and cannot) work.
++
++ This CirrOS image comes from https://launchpad.net/cirros
++
+ [debian-6]
+ name=Debian 6 (Squeeze)
+ osinfo=debian6
+@@ -252,19 +271,19 @@ notes=Ubuntu 13.10 (Saucy).
+
+ --firstboot-command "dpkg-reconfigure openssh-server"
+ -----BEGIN PGP SIGNATURE-----
+-Version: GnuPG v1.4.15 (GNU/Linux)
++Version: GnuPG v1
+
+-iQIcBAEBAgAGBQJSsHIWAAoJEJFzj3Pht2igj4YQAJldrmQcSGYQkewurpJXd6IX
+-+HVUPZPLSc1w5Wdba7+ayYisUGpcXbdYlsNIEgO3W503YDT7HhsfVJojlY2PiBrl
+-d1oMpFxupDYfcLllFhaVvgqqT3gK/xVCOyNhzZjWhC4vJrJjfJDFrkh8f6I0xNeI
+-gzU3nwJ5aB8Ip9MG0oJqaRtL8b2wvMcdpv2BkIQCScCHPNIr8G5XYHbj+8ur2rlq
+-7I1Q4p5P0S0+uBUHA4vQt+lNi3DuXJjfrqZTSkYtMmMxtbfH+ReswN3NfPaU2iVW
+-BiUmGn8mMmLndOnfYF1mDdzByznSYQBfmQEJVrrUZQtL8jUjeEOfVURMIxd6iuly
+-COU1eJ53qTuYZV/PuHJgFS1BV03icT2I/Yk7WowWsbIWZgqKhEf8HpskZh7UoSqD
+-LSxYdqV8cYnKjXqL2WLk+2/V0Nul5ceIYO6fGHjz/EuS4T7vjyMC+DaoItLuC1IR
+-55P7Xksw0hLXKPmOkfPObStPfBG/+lZyOaf1OjC/yFfCUc054kvL1Q0QXMBXuw1R
+-e3Suc2CVSDp3AWSJi4a7kSH1GqyMfFF6FSuSd3Vbp3MC2N/iHk/PIs1uR/ogO0oR
+-4ESXH30RJBfDa00LkoNabBs97AqmYrh8lqIi0XqEiJvJaeR/LR5uLyVpbynvU3r4
+-LCE8XQ8F06ZKkg8JBksF
+-=15Z8
++iQIcBAEBAgAGBQJSx/+uAAoJEJFzj3Pht2igUzQP/2ssVh9l6TL7vd9z13rbernd
++fsxcTwV/2Vpv2qUVbxuCOZj1uFxkRb+CVk6kRaLKrGYH/bNROJitn6FieHM7lf09
++0vd/vEj7Ie9pATxMzFoEy+M8sSJAXTVH2k8OjGhpOuevSswb/JQx23L/KdGa/ERu
++X9ZRpsNTaJ/xDOx9tZt/YbWP/SesF8G/LWFG30ULRH8S5jqPUb/DS2k1sgZjCeUk
++kawf7/kLzPTuH51YpjZGHDgCIOoyRQORtZDmcaMWFcEVyvoyvMMnK0vsq7mvzvhO
++FYqq+32TadS9cLC1O0R6rQxQALmFMuZCd/O2XO6E8mMMeLHS7ooCjdoxl4ospecf
++9NefsIXAcHk69hT3EBZflxCkZT5H7rXIAsrDfoK0p3259vgBh8qiYaC7v3RLbJBy
++ZICixl9s5KcizI/GU5qZ2/eYXDnsrYRXOFNtKltwe+PeGDDVokmoILMupvAuci1i
++e52rxe0jHPsdoJGdAtS61/8jnpL5MbCSbImjZroaWic4NSv9L1klElTNc2cRRQN8
++rS/7P7zmBdno8/Ft/UWVePaS4x0BN/JWbe3SgmWjAuw7gYCVh6FPq/paUyKa6p93
++ZA+UziEXDxUvE6YNPjjwR1n1X9qqkNTyMu3fL3KyaPc3VfCfPKYmfOfzxhcXA/Ou
++9LVnGbZKRdOke5wJ572Z
++=fOtX
+ -----END PGP SIGNATURE-----
+--
+1.8.4.2
+
diff --git a/0040-builder-Note-in-man-page-how-to-specify-size-in-byte.patch b/0040-builder-Note-in-man-page-how-to-specify-size-in-byte.patch
new file mode 100644
index 0000000..b07e1e8
--- /dev/null
+++ b/0040-builder-Note-in-man-page-how-to-specify-size-in-byte.patch
@@ -0,0 +1,27 @@
+From 105aa91d38a8817a3be6540a4571780394b7387e Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Tue, 7 Jan 2014 14:52:08 +0000
+Subject: [PATCH] builder: Note in man page how to specify size in bytes.
+
+(cherry picked from commit ac41f616db35921074a4909524b9bc1a2bd2406d)
+---
+ builder/virt-builder.pod | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/builder/virt-builder.pod b/builder/virt-builder.pod
+index 09315e4..c3f685c 100644
+--- a/builder/virt-builder.pod
++++ b/builder/virt-builder.pod
+@@ -560,6 +560,9 @@ output is a file, then the size is the same as the template. If the
+ output is a device, partition, etc then the size of that device is
+ used.
+
++To specify size in bytes, the number must be followed by the lowercase
++letter I<b>, eg: S<C<--size 10737418240b>>.
++
+ =item B<--smp> N
+
+ Enable N E<ge> 2 virtual CPUs for I<--run> scripts to use.
+--
+1.8.4.2
+
diff --git a/0041-builder-Pass-prog-global-program-name-around.patch b/0041-builder-Pass-prog-global-program-name-around.patch
new file mode 100644
index 0000000..baed601
--- /dev/null
+++ b/0041-builder-Pass-prog-global-program-name-around.patch
@@ -0,0 +1,164 @@
+From 3b82395206dd43033624b8afab6df3f2194ca06c Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Tue, 7 Jan 2014 17:30:20 +0000
+Subject: [PATCH] builder: Pass ~prog global (program name) around.
+
+(cherry picked from commit 3e802605b52dccd2574353d5aff220de8d8eb3b8)
+---
+ builder/builder.ml | 8 ++++----
+ builder/downloader.ml | 17 +++++++++--------
+ builder/downloader.mli | 2 +-
+ builder/index_parser.ml | 4 ++--
+ builder/index_parser.mli | 2 +-
+ 5 files changed, 17 insertions(+), 16 deletions(-)
+
+diff --git a/builder/builder.ml b/builder/builder.ml
+index 07c2b02..0f8e069 100644
+--- a/builder/builder.ml
++++ b/builder/builder.ml
+@@ -138,7 +138,7 @@ let main () =
+ fun (source, fingerprint) ->
+ let sigchecker =
+ Sigchecker.create ~debug ~gpg ~fingerprint ~check_signature in
+- Index_parser.get_index ~debug ~downloader ~sigchecker source
++ Index_parser.get_index ~prog ~debug ~downloader ~sigchecker source
+ ) sources
+ ) in
+
+@@ -178,7 +178,7 @@ let main () =
+ let template = name, revision in
+ msg (f_"Downloading: %s") file_uri;
+ let progress_bar = not quiet in
+- ignore (Downloader.download downloader ~template ~progress_bar
++ ignore (Downloader.download ~prog downloader ~template ~progress_bar
+ file_uri)
+ ) index;
+ exit 0
+@@ -218,7 +218,7 @@ let main () =
+ let template = arg, revision in
+ msg (f_"Downloading: %s") file_uri;
+ let progress_bar = not quiet in
+- Downloader.download downloader ~template ~progress_bar file_uri in
++ Downloader.download ~prog downloader ~template ~progress_bar file_uri in
+ if delete_on_exit then unlink_on_exit template;
+ template in
+
+@@ -236,7 +236,7 @@ let main () =
+ | { Index_parser.signature_uri = None } -> None
+ | { Index_parser.signature_uri = Some signature_uri } ->
+ let sigfile, delete_on_exit =
+- Downloader.download downloader signature_uri in
++ Downloader.download ~prog downloader signature_uri in
+ if delete_on_exit then unlink_on_exit sigfile;
+ Some sigfile in
+
+diff --git a/builder/downloader.ml b/builder/downloader.ml
+index 918227e..442a011 100644
+--- a/builder/downloader.ml
++++ b/builder/downloader.ml
+@@ -43,19 +43,19 @@ let create ~debug ~curl ~cache = {
+ cache = cache;
+ }
+
+-let rec download t ?template ?progress_bar uri =
++let rec download ~prog t ?template ?progress_bar uri =
+ match template with
+ | None -> (* no cache, simple download *)
+ (* Create a temporary name. *)
+ let tmpfile = Filename.temp_file "vbcache" ".txt" in
+- download_to t ?progress_bar uri tmpfile;
++ download_to ~prog t ?progress_bar uri tmpfile;
+ (tmpfile, true)
+
+ | Some (name, revision) ->
+ match t.cache with
+ | None ->
+ (* Not using the cache at all? *)
+- download t ?progress_bar uri
++ download t ~prog ?progress_bar uri
+
+ | Some cachedir ->
+ let filename = cache_of_name cachedir name revision in
+@@ -64,11 +64,11 @@ let rec download t ?template ?progress_bar uri =
+ * If not, download it.
+ *)
+ if not (Sys.file_exists filename) then
+- download_to t ?progress_bar uri filename;
++ download_to ~prog t ?progress_bar uri filename;
+
+ (filename, false)
+
+-and download_to t ?(progress_bar = false) uri filename =
++and download_to ~prog t ?(progress_bar = false) uri filename =
+ (* Get the status code first to ensure the file exists. *)
+ let cmd = sprintf "%s%s -g -o /dev/null -I -w '%%{http_code}' %s"
+ t.curl
+@@ -99,8 +99,8 @@ and download_to t ?(progress_bar = false) uri filename =
+ | _ -> false
+ in
+ if bad_status_code status_code then (
+- eprintf (f_"virt-builder: failed to download %s: HTTP status code %s\n")
+- uri status_code;
++ eprintf (f_"%s: failed to download %s: HTTP status code %s\n")
++ prog uri status_code;
+ exit 1
+ );
+
+@@ -120,7 +120,8 @@ and download_to t ?(progress_bar = false) uri filename =
+ if t.debug then eprintf "%s\n%!" cmd;
+ let r = Sys.command cmd in
+ if r <> 0 then (
+- eprintf (f_"virt-builder: curl (download) command failed downloading '%s'\n") uri;
++ eprintf (f_"%s: curl (download) command failed downloading '%s'\n")
++ prog uri;
+ exit 1
+ );
+
+diff --git a/builder/downloader.mli b/builder/downloader.mli
+index 8cb7404..62d500d 100644
+--- a/builder/downloader.mli
++++ b/builder/downloader.mli
+@@ -32,7 +32,7 @@ type t
+ val create : debug:bool -> curl:string -> cache:string option -> t
+ (** Create the abstract type. *)
+
+-val download : t -> ?template:(string*int) -> ?progress_bar:bool -> uri -> (filename * bool)
++val download : prog:string -> t -> ?template:(string*int) -> ?progress_bar:bool -> uri -> (filename * bool)
+ (** Download the URI, returning the downloaded filename and a
+ temporary file flag. The temporary file flag is [true] iff
+ the downloaded file is temporary and should be deleted by the
+diff --git a/builder/index_parser.ml b/builder/index_parser.ml
+index fb47e50..453a3a1 100644
+--- a/builder/index_parser.ml
++++ b/builder/index_parser.ml
+@@ -106,7 +106,7 @@ and field = string * string (* key + value *)
+ (* Calls yyparse in the C code. *)
+ external parse_index : string -> sections = "virt_builder_parse_index"
+
+-let get_index ~debug ~downloader ~sigchecker source =
++let get_index ~prog ~debug ~downloader ~sigchecker source =
+ let corrupt_file () =
+ eprintf (f_"\nThe index file downloaded from '%s' is corrupt.\nYou need to ask the supplier of this file to fix it and upload a fixed version.\n")
+ source;
+@@ -115,7 +115,7 @@ let get_index ~debug ~downloader ~sigchecker source =
+
+ let rec get_index () =
+ (* Get the index page. *)
+- let tmpfile, delete_tmpfile = Downloader.download downloader source in
++ let tmpfile, delete_tmpfile = Downloader.download ~prog downloader source in
+
+ (* Check index file signature (also verifies it was fully
+ * downloaded and not corrupted in transit).
+diff --git a/builder/index_parser.mli b/builder/index_parser.mli
+index 0b6317d..54f1807 100644
+--- a/builder/index_parser.mli
++++ b/builder/index_parser.mli
+@@ -35,4 +35,4 @@ and entry = {
+ sigchecker : Sigchecker.t;
+ }
+
+-val get_index : debug:bool -> downloader:Downloader.t -> sigchecker:Sigchecker.t -> string -> index
++val get_index : prog:string -> debug:bool -> downloader:Downloader.t -> sigchecker:Sigchecker.t -> string -> index
+--
+1.8.4.2
+
diff --git a/0042-mllib-Add-library-function-to-run-external-command-a.patch b/0042-mllib-Add-library-function-to-run-external-command-a.patch
new file mode 100644
index 0000000..cc7298d
--- /dev/null
+++ b/0042-mllib-Add-library-function-to-run-external-command-a.patch
@@ -0,0 +1,85 @@
+From 91ff15fb954b3cee51384a72c9771149f256719b Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Tue, 7 Jan 2014 17:30:57 +0000
+Subject: [PATCH] mllib: Add library function to run external command and slurp
+ up the output.
+
+This also changes a couple of functions to use this new library
+function.
+
+(cherry picked from commit a403febb8c43bf573c2354c39df22a29cf8863d8)
+---
+ builder/downloader.ml | 19 ++++---------------
+ mllib/common_utils.ml | 16 +++++++++++++---
+ 2 files changed, 17 insertions(+), 18 deletions(-)
+
+diff --git a/builder/downloader.ml b/builder/downloader.ml
+index 442a011..77f48ae 100644
+--- a/builder/downloader.ml
++++ b/builder/downloader.ml
+@@ -75,23 +75,12 @@ and download_to ~prog t ?(progress_bar = false) uri filename =
+ (if t.debug then "" else " -s -S")
+ (quote uri) in
+ if t.debug then eprintf "%s\n%!" cmd;
+- let chan = open_process_in cmd in
+- let status_code = input_line chan in
+- let stat = close_process_in chan in
+- (match stat with
+- | WEXITED 0 -> ()
+- | WEXITED i ->
+- eprintf (f_"virt-builder: curl (download) command failed downloading '%s'\n") uri;
+- exit 1
+- | WSIGNALED i ->
+- eprintf (f_"virt-builder: external command '%s' killed by signal %d\n")
+- cmd i;
+- exit 1
+- | WSTOPPED i ->
+- eprintf (f_"virt-builder: external command '%s' stopped by signal %d\n")
+- cmd i;
++ let lines = external_command ~prog cmd in
++ if List.length lines < 1 then (
++ eprintf (f_"%s: unexpected output from curl command, enable debug and look at previous messages\n") prog;
+ exit 1
+ );
++ let status_code = List.hd lines in
+ let bad_status_code = function
+ | "" -> true
+ | s when s.[0] = '4' -> true (* 4xx *)
+diff --git a/mllib/common_utils.ml b/mllib/common_utils.ml
+index 80c5aca..3943417 100644
+--- a/mllib/common_utils.ml
++++ b/mllib/common_utils.ml
+@@ -332,10 +332,13 @@ let display_long_options () =
+ ) !long_options;
+ exit 0
+
+-let uuidgen ~prog () =
+- let cmd = "uuidgen -r" in
++(* Run an external command, slurp up the output as a list of lines. *)
++let external_command ~prog cmd =
+ let chan = Unix.open_process_in cmd in
+- let uuid = input_line chan in
++ let lines = ref [] in
++ (try while true do lines := input_line chan :: !lines done
++ with End_of_file -> ());
++ let lines = List.rev !lines in
+ let stat = Unix.close_process_in chan in
+ (match stat with
+ | Unix.WEXITED 0 -> ()
+@@ -346,6 +349,13 @@ let uuidgen ~prog () =
+ | Unix.WSTOPPED i ->
+ error ~prog (f_"external command '%s' stopped by signal %d") cmd i
+ );
++ lines
++
++(* Run uuidgen to return a random UUID. *)
++let uuidgen ~prog () =
++ let lines = external_command ~prog "uuidgen -r" in
++ assert (List.length lines >= 1);
++ let uuid = List.hd lines in
+ let len = String.length uuid in
+ let uuid, len =
+ if len > 0 && uuid.[len-1] = '\n' then
+--
+1.8.4.2
+
diff --git a/0043-builder-Fix-handling-of-size-parameter.patch b/0043-builder-Fix-handling-of-size-parameter.patch
new file mode 100644
index 0000000..da887fc
--- /dev/null
+++ b/0043-builder-Fix-handling-of-size-parameter.patch
@@ -0,0 +1,96 @@
+From f60ef10973d1bdc0df93603d5667d0528eeb0dd0 Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Tue, 7 Jan 2014 17:32:04 +0000
+Subject: [PATCH] builder: Fix handling of --size parameter.
+
+It now matches the documentation:
+
+ "Select the size of the output disk, [...]
+
+ Virt-builder will resize filesystems inside the disk image
+ automatically.
+
+ If the size is not specified, then one of two things happens. If
+ the output is a file, then the size is the same as the template. If
+ the output is a device, partition, etc then the size of that device
+ is used."
+
+This also adds checks to make sure that users don't try to shrink a
+disk (which is not possible), and they don't try to resize larger than
+the output block device.
+
+(cherry picked from commit 06f7bea14883c4903c58077757179341c0e1471a)
+---
+ builder/builder.ml | 43 ++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 34 insertions(+), 9 deletions(-)
+
+diff --git a/builder/builder.ml b/builder/builder.ml
+index 0f8e069..f007b46 100644
+--- a/builder/builder.ml
++++ b/builder/builder.ml
+@@ -261,9 +261,6 @@ let main () =
+ format_tag @ compression_tag in
+
+ (* Planner: Goal. *)
+- let output_size =
+- let { Index_parser.size = default_size } = entry in
+- match size with None -> default_size | Some size -> size in
+ let output_filename, output_format =
+ match output, format with
+ | None, None -> sprintf "%s.img" arg, "raw"
+@@ -271,18 +268,46 @@ let main () =
+ | None, Some format -> sprintf "%s.%s" arg format, format
+ | Some output, None -> output, "raw"
+ | Some output, Some format -> output, format in
+- let output_is_block_dev = is_block_device output_filename in
+-
+- if output_is_block_dev && size <> None then (
+- eprintf (f_"%s: you cannot use --size option with block devices\n") prog;
+- exit 1
+- );
+
+ if is_char_device output_filename then (
+ eprintf (f_"%s: cannot output to a character device or /dev/null\n") prog;
+ exit 1
+ );
+
++ let blockdev_getsize64 dev =
++ let cmd = sprintf "blockdev --getsize64 %s" (quote dev) in
++ let lines = external_command ~prog cmd in
++ assert (List.length lines >= 1);
++ Int64.of_string (List.hd lines)
++ in
++ let output_is_block_dev, blockdev_size =
++ let b = is_block_device output_filename in
++ let sz = if b then blockdev_getsize64 output_filename else 0L in
++ b, sz in
++
++ let output_size =
++ let { Index_parser.size = original_image_size } = entry in
++
++ let size =
++ match size with
++ | Some size -> size
++ (* --size parameter missing, output to file: use original image size *)
++ | None when not output_is_block_dev -> original_image_size
++ (* --size parameter missing, block device: use block device size *)
++ | None -> blockdev_size in
++
++ if size < original_image_size then (
++ eprintf (f_"%s: images cannot be shrunk, the output size is too small for this image. Requested size = %s, minimum size = %s\n")
++ prog (human_size size) (human_size original_image_size);
++ exit 1
++ )
++ else if output_is_block_dev && output_format = "raw" && size > blockdev_size then (
++ eprintf (f_"%s: output size is too large for this block device. Requested size = %s, output block device = %s, output block device size = %s\n")
++ prog (human_size size) output_filename (human_size blockdev_size);
++ exit 1
++ );
++ size in
++
+ let goal =
+ (* MUST *)
+ let goal_must = [
+--
+1.8.4.2
+
diff --git a/0044-libvirt-auth-Provide-a-friendlier-wrapper-around-vir.patch b/0044-libvirt-auth-Provide-a-friendlier-wrapper-around-vir.patch
new file mode 100644
index 0000000..181b3f1
--- /dev/null
+++ b/0044-libvirt-auth-Provide-a-friendlier-wrapper-around-vir.patch
@@ -0,0 +1,122 @@
+From 816462383a0cc7827177e97bbe4de775950b1aac Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Thu, 2 Jan 2014 12:20:18 +0000
+Subject: [PATCH] libvirt-auth: Provide a friendlier wrapper around
+ virConnectAuthPtrDefault (RHBZ#1044014).
+
+(cherry picked from commit 4125064554c8cb1b96680e24e49d74ee6024f761)
+---
+ src/guestfs-internal.h | 1 +
+ src/libvirt-auth.c | 55 +++++++++++++++++++++++++++++++++++++++++---------
+ 2 files changed, 46 insertions(+), 10 deletions(-)
+
+diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h
+index 8888603..a1f3f02 100644
+--- a/src/guestfs-internal.h
++++ b/src/guestfs-internal.h
+@@ -469,6 +469,7 @@ struct guestfs_h
+ unsigned int nr_supported_credentials;
+ int supported_credentials[NR_CREDENTIAL_TYPES];
+ const char *saved_libvirt_uri; /* Doesn't need to be freed. */
++ bool wrapper_warning_done;
+ unsigned int nr_requested_credentials;
+ virConnectCredentialPtr requested_credentials;
+ #endif
+diff --git a/src/libvirt-auth.c b/src/libvirt-auth.c
+index fb18f8a..f8ed1b1 100644
+--- a/src/libvirt-auth.c
++++ b/src/libvirt-auth.c
+@@ -20,6 +20,7 @@
+
+ #include <stdio.h>
+ #include <stdlib.h>
++#include <stdbool.h>
+
+ #ifdef HAVE_LIBVIRT
+ #include <libvirt/libvirt.h>
+@@ -147,6 +148,34 @@ libvirt_auth_callback (virConnectCredentialPtr cred,
+ return 0;
+ }
+
++/* Libvirt provides a default authentication handler. However it is
++ * confusing to end-users
++ * (https://bugzilla.redhat.com/show_bug.cgi?id=1044014#c0).
++ *
++ * Unfortunately #1 the libvirt handler cannot easily be modified to
++ * make it non-confusing, but unfortunately #2 we have to actually
++ * call it because it handles all the policykit crap.
++ *
++ * Therefore we add a wrapper around it here.
++ */
++static int
++libvirt_auth_default_wrapper (virConnectCredentialPtr cred,
++ unsigned int ncred,
++ void *gv)
++{
++ guestfs_h *g = gv;
++
++ if (!g->wrapper_warning_done) {
++ printf (_("libvirt needs authentication to connect to libvirt URI %s\n"
++ "(see also: http://libvirt.org/auth.html http://libvirt.org/uri.html)\n"),
++ g->saved_libvirt_uri ? g->saved_libvirt_uri : "NULL");
++ g->wrapper_warning_done = true;
++ }
++
++ return virConnectAuthPtrDefault->cb (cred, ncred,
++ virConnectAuthPtrDefault->cbdata);
++}
++
+ static int
+ exists_libvirt_auth_event (guestfs_h *g)
+ {
+@@ -165,31 +194,37 @@ guestfs___open_libvirt_connection (guestfs_h *g, const char *uri,
+ unsigned int flags)
+ {
+ virConnectAuth authdata;
+- virConnectAuthPtr authdataptr;
+ virConnectPtr conn;
++ const char *authtype;
++
++ g->saved_libvirt_uri = uri;
++ g->wrapper_warning_done = false;
+
+ /* Did the caller register a GUESTFS_EVENT_LIBVIRT_AUTH event and
+ * call guestfs_set_libvirt_supported_credentials?
+ */
+ if (g->nr_supported_credentials > 0 && exists_libvirt_auth_event (g)) {
++ authtype = "custom";
+ memset (&authdata, 0, sizeof authdata);
+ authdata.credtype = g->supported_credentials;
+ authdata.ncredtype = g->nr_supported_credentials;
+ authdata.cb = libvirt_auth_callback;
+ authdata.cbdata = g;
+- authdataptr = &authdata;
+- g->saved_libvirt_uri = uri;
+ }
+- else
+- authdataptr = virConnectAuthPtrDefault;
++ else {
++ /* Wrapper around libvirt's virConnectAuthPtrDefault, see comment
++ * above.
++ */
++ authtype = "default+wrapper";
++ authdata = *virConnectAuthPtrDefault;
++ authdata.cb = libvirt_auth_default_wrapper;
++ authdata.cbdata = g;
++ }
+
+ debug (g, "opening libvirt handle: URI = %s, auth = %s, flags = %u",
+- uri ? uri : "NULL",
+- authdataptr == virConnectAuthPtrDefault
+- ? "virConnectAuthPtrDefault" : "<virConnectAuth *>",
+- flags);
++ uri ? uri : "NULL", authtype, flags);
+
+- conn = virConnectOpenAuth (uri, authdataptr, flags);
++ conn = virConnectOpenAuth (uri, &authdata, flags);
+
+ if (conn)
+ debug (g, "successfully opened libvirt handle: conn = %p", conn);
+--
+1.8.4.2
+
diff --git a/0045-tests-Add-a-regression-test-of-libvirt-authenticatio.patch b/0045-tests-Add-a-regression-test-of-libvirt-authenticatio.patch
new file mode 100644
index 0000000..f3ddba1
--- /dev/null
+++ b/0045-tests-Add-a-regression-test-of-libvirt-authenticatio.patch
@@ -0,0 +1,303 @@
+From 4f769c49cbd8e89f0e143b153357725327fb69d5 Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Wed, 8 Jan 2014 19:36:00 +0000
+Subject: [PATCH] tests: Add a regression test of libvirt authentication
+ events.
+
+This requires a change to libvirt (in libvirt >= 1.2.1), see:
+
+https://www.redhat.com/archives/libvir-list/2014-January/msg00378.html
+(cherry picked from commit 873db60c0e52893a38c374d867d0a305e5419d6a)
+---
+ .gitignore | 1 +
+ tests/events/Makefile.am | 36 ++++--
+ tests/events/libvirt-auth.xml | 22 ++++
+ tests/events/test-libvirt-auth-callbacks.c | 185 +++++++++++++++++++++++++++++
+ 4 files changed, 237 insertions(+), 7 deletions(-)
+ create mode 100644 tests/events/libvirt-auth.xml
+ create mode 100644 tests/events/test-libvirt-auth-callbacks.c
+
+diff --git a/.gitignore b/.gitignore
+index b967dbd..b44af29 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -461,6 +461,7 @@ Makefile.in
+ /tests/data/initrd-x86_64.img.gz
+ /tests/data/test-grep.txt.gz
+ /tests/data/test.iso
++/tests/events/test-libvirt-auth-callbacks
+ /tests/guests/blank-*.img
+ /tests/guests/debian.img
+ /tests/guests/fedora.img
+diff --git a/tests/events/Makefile.am b/tests/events/Makefile.am
+index 9f6e5aa..9751edc 100644
+--- a/tests/events/Makefile.am
++++ b/tests/events/Makefile.am
+@@ -1,5 +1,5 @@
+ # libguestfs
+-# Copyright (C) 2013 Red Hat Inc.
++# Copyright (C) 2013-2014 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
+@@ -17,10 +17,32 @@
+
+ include $(top_srcdir)/subdir-rules.mk
+
+-TESTS = \
+- test-console-debug.pl
+-
+-TESTS_ENVIRONMENT = $(top_builddir)/run --test
+-
+ EXTRA_DIST = \
+- $(TESTS)
++ test-console-debug.pl \
++ libvirt-auth.xml
++
++TESTS_ENVIRONMENT = $(top_builddir)/run --test
++
++check_PROGRAMS =
++
++TESTS = test-console-debug.pl
++
++if HAVE_LIBVIRT
++TESTS += test-libvirt-auth-callbacks
++check_PROGRAMS += test-libvirt-auth-callbacks
++
++test_libvirt_auth_callbacks_SOURCES = test-libvirt-auth-callbacks.c
++test_libvirt_auth_callbacks_CPPFLAGS = \
++ -I$(top_srcdir)/gnulib/lib -I$(top_builddir)/gnulib/lib \
++ -I$(top_srcdir)/src -I$(top_builddir)/src
++test_libvirt_auth_callbacks_CFLAGS = \
++ $(WARN_CFLAGS) $(WERROR_CFLAGS) \
++ $(GPROF_CFLAGS) $(GCOV_CFLAGS) \
++ $(LIBVIRT_CFLAGS)
++test_libvirt_auth_callbacks_LDADD = \
++ $(top_builddir)/src/libutils.la \
++ $(top_builddir)/src/libguestfs.la \
++ $(LIBVIRT_LIBS) \
++ $(LIBXML2_LIBS) \
++ $(top_builddir)/gnulib/lib/libgnu.la
++endif
+diff --git a/tests/events/libvirt-auth.xml b/tests/events/libvirt-auth.xml
+new file mode 100644
+index 0000000..d138d4d
+--- /dev/null
++++ b/tests/events/libvirt-auth.xml
+@@ -0,0 +1,22 @@
++<node>
++ <domain type='test'>
++ <name>test</name>
++ <memory>1048576</memory>
++ <os>
++ <type>hvm</type>
++ <boot dev='hd'/>
++ </os>
++ <devices>
++ <disk type='file' device='disk'>
++ <driver name='qemu'/>
++ <source file='/dev/null'/>
++ <target dev='vda' bus='virtio'/>
++ </disk>
++ </devices>
++ </domain>
++
++ <auth>
++ <user password="123456">rich</user>
++ <user>jane</user>
++ </auth>
++</node>
+diff --git a/tests/events/test-libvirt-auth-callbacks.c b/tests/events/test-libvirt-auth-callbacks.c
+new file mode 100644
+index 0000000..7c26bbe
+--- /dev/null
++++ b/tests/events/test-libvirt-auth-callbacks.c
+@@ -0,0 +1,185 @@
++/* libguestfs
++ * Copyright (C) 2014 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 <config.h>
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++
++#include <libvirt/libvirt.h>
++
++#include "guestfs.h"
++#include "guestfs-internal-frontend.h"
++
++#define EXPECT_OK 1
++#define EXPECT_FAIL -1
++
++struct auth_data {
++ const char *username;
++ const char *password;
++};
++
++static void do_test (const char *prog, const char *libvirt_uri, const struct auth_data *auth_data, int expected);
++static void auth_callback (guestfs_h *g, void *opaque, uint64_t event, int event_handle, int flags, const char *buf, size_t buf_len, const uint64_t *array, size_t array_len);
++
++int
++main (int argc, char *argv[])
++{
++ unsigned long ver;
++ const char *srcdir;
++ char *cwd;
++ char *test_uri;
++
++ virInitialize ();
++
++ /* Check that the version of libvirt we are linked against
++ * supports the new test-driver auth feature.
++ */
++ virGetVersion (&ver, NULL, NULL);
++ if (ver < 1002001) {
++ fprintf (stderr, "%s: test skipped because libvirt is too old (%lu)\n",
++ argv[0], ver);
++ exit (77);
++ }
++
++ /* $srcdir must have been passed (by automake). */
++ srcdir = getenv ("srcdir");
++ if (!srcdir) {
++ fprintf (stderr,
++ "%s: environment variable $srcdir is not defined.\n"
++ "Normally it is defined by automake. If you are running the\n"
++ "tests directly, set $srcdir to point to the source tests/events\n"
++ "directory.\n", argv[0]);
++ exit (EXIT_FAILURE);
++ }
++
++ cwd = get_current_dir_name ();
++ if (cwd == NULL) {
++ perror ("get_current_dir_name");
++ exit (EXIT_FAILURE);
++ }
++
++ if (asprintf (&test_uri, "test://%s/%s/libvirt-auth.xml", cwd, srcdir) == -1) {
++ perror ("asprintf");
++ exit (EXIT_FAILURE);
++ }
++
++ free (cwd);
++
++ /* Perform the tests. */
++ struct auth_data ad1 = { .username = "rich", .password = "123456" };
++ do_test (argv[0], test_uri, &ad1, EXPECT_OK);
++ struct auth_data ad2 = { .username = "rich", .password = "654321" };
++ do_test (argv[0], test_uri, &ad2, EXPECT_FAIL);
++ struct auth_data ad3 = { .username = "jane", .password = NULL };
++ do_test (argv[0], test_uri, &ad3, EXPECT_OK);
++ struct auth_data ad4 = { .username = "nouser", .password = "123456" };
++ do_test (argv[0], test_uri, &ad4, EXPECT_FAIL);
++
++ free (test_uri);
++ exit (EXIT_SUCCESS);
++}
++
++static void
++do_test (const char *prog, const char *libvirt_uri,
++ const struct auth_data *auth_data,
++ int expected)
++{
++ guestfs_h *g;
++ const char *creds[] =
++ { "authname", "passphrase", "noechoprompt", NULL };
++ int r, eh;
++
++ g = guestfs_create ();
++ if (!g)
++ exit (EXIT_FAILURE);
++
++ r = guestfs_set_libvirt_supported_credentials (g, (char **) creds);
++ if (r == -1)
++ exit (EXIT_FAILURE);
++
++ eh = guestfs_set_event_callback (g, auth_callback,
++ GUESTFS_EVENT_LIBVIRT_AUTH, 0,
++ (void *) auth_data);
++ if (eh == -1)
++ exit (EXIT_FAILURE);
++
++ r = guestfs_add_domain (g, "test",
++ GUESTFS_ADD_DOMAIN_LIBVIRTURI, libvirt_uri,
++ GUESTFS_ADD_DOMAIN_READONLY, 1,
++ -1);
++ if (r != expected) {
++ fprintf (stderr,
++ "%s: test failed: u=%s p=%s: got %d expected %d\n",
++ prog, auth_data->username, auth_data->password ? : "(none)",
++ r, expected);
++ exit (EXIT_FAILURE);
++ }
++
++ guestfs_close (g);
++}
++
++static void
++auth_callback (guestfs_h *g, void *opaque,
++ uint64_t event, int event_handle,
++ int flags,
++ const char *buf, size_t buf_len,
++ const uint64_t *array, size_t array_len)
++{
++ CLEANUP_FREE_STRING_LIST char **creds = NULL;
++ const struct auth_data *auth_data = opaque;
++ size_t i;
++ int r;
++ const char *reply;
++ size_t len;
++
++ /* Ask libguestfs what credentials libvirt is demanding. */
++ creds = guestfs_get_libvirt_requested_credentials (g);
++ if (creds == NULL)
++ exit (EXIT_FAILURE);
++
++ /* Try to answer from the authentication data. */
++ for (i = 0; creds[i] != NULL; ++i) {
++ if (STREQ (creds[i], "authname")) {
++ reply = auth_data->username;
++ len = strlen (reply);
++ }
++ else if (STREQ (creds[i], "passphrase") ||
++ STREQ (creds[i], "noechoprompt")) {
++ if (!auth_data->password) {
++ fprintf (stderr, "test failed: libvirt asked for a password, but auth_data->password == NULL\n");
++ exit (EXIT_FAILURE);
++ }
++
++ reply = auth_data->password;
++ len = strlen (reply);
++ }
++ else {
++ fprintf (stderr, "test failed: libvirt asked for '%s' which is not in creds list\n(This is probably a libvirt bug)\n",
++ creds[i]);
++ exit (EXIT_FAILURE);
++ }
++
++ r = guestfs_set_libvirt_requested_credential (g, i,
++ reply, len);
++ if (r == -1)
++ exit (EXIT_FAILURE);
++ }
++}
+--
+1.8.4.2
+
diff --git a/0046-tests-Add-a-regression-test-for-libvirt-authenticati.patch b/0046-tests-Add-a-regression-test-for-libvirt-authenticati.patch
new file mode 100644
index 0000000..5583398
--- /dev/null
+++ b/0046-tests-Add-a-regression-test-for-libvirt-authenticati.patch
@@ -0,0 +1,265 @@
+From d4938044d2be6f8ed90022fb7ca9378378f2604b Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Wed, 8 Jan 2014 20:22:21 +0000
+Subject: [PATCH] tests: Add a regression test for libvirt authentication
+ (RHBZ#1044014).
+
+This tests the virConnectAuthPtrDefault wrapper path.
+
+(cherry picked from commit 746a0b1f19667606ee63c8d3ab6a75531a8bd71c)
+---
+ .gitignore | 2 ++
+ tests/regressions/Makefile.am | 29 +++++++++++++++-
+ tests/regressions/rhbz1044014.c | 69 ++++++++++++++++++++++++++++++++++++++
+ tests/regressions/rhbz1044014.in | 1 +
+ tests/regressions/rhbz1044014.sh | 70 +++++++++++++++++++++++++++++++++++++++
+ tests/regressions/rhbz1044014.xml | 5 +++
+ 6 files changed, 175 insertions(+), 1 deletion(-)
+ create mode 100644 tests/regressions/rhbz1044014.c
+ create mode 100644 tests/regressions/rhbz1044014.in
+ create mode 100755 tests/regressions/rhbz1044014.sh
+ create mode 100644 tests/regressions/rhbz1044014.xml
+
+diff --git a/.gitignore b/.gitignore
+index b44af29..90cd68b 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -483,6 +483,8 @@ Makefile.in
+ /tests/regressions/rhbz501893
+ /tests/regressions/rhbz790721
+ /tests/regressions/rhbz914931
++/tests/regressions/rhbz1044014
++/tests/regressions/rhbz1044014.out
+ /tests/rsync/rsyncd.pid
+ /tests/syslinux/extlinux-guest.img
+ /tests/syslinux/syslinux-guest.img
+diff --git a/tests/regressions/Makefile.am b/tests/regressions/Makefile.am
+index 1b0fb69..8051c14 100644
+--- a/tests/regressions/Makefile.am
++++ b/tests/regressions/Makefile.am
+@@ -36,6 +36,10 @@ TESTS = \
+ rhbz1001875.sh \
+ test-noexec-stack.pl
+
++if HAVE_LIBVIRT
++TESTS += rhbz1044014.sh
++endif
++
+ tests_not_run = \
+ rhbz727178.sh \
+ rhbz909624.sh
+@@ -49,6 +53,10 @@ check_PROGRAMS = \
+ rhbz790721 \
+ rhbz914931
+
++if HAVE_LIBVIRT
++check_PROGRAMS += rhbz1044014
++endif
++
+ rhbz501893_SOURCES = rhbz501893.c
+ rhbz501893_CPPFLAGS = \
+ -I$(top_srcdir)/src -I$(top_builddir)/src
+@@ -79,11 +87,30 @@ rhbz914931_CFLAGS = \
+ rhbz914931_LDADD = \
+ $(top_builddir)/src/libguestfs.la
+
++if HAVE_LIBVIRT
++rhbz1044014_SOURCES = rhbz1044014.c
++rhbz1044014_CPPFLAGS = \
++ -I$(top_srcdir)/gnulib/lib -I$(top_builddir)/gnulib/lib \
++ -I$(top_srcdir)/src -I$(top_builddir)/src
++rhbz1044014_CFLAGS = \
++ $(WARN_CFLAGS) $(WERROR_CFLAGS) \
++ $(GPROF_CFLAGS) $(GCOV_CFLAGS) \
++ $(LIBVIRT_CFLAGS)
++rhbz1044014_LDADD = \
++ $(top_builddir)/src/libutils.la \
++ $(top_builddir)/src/libguestfs.la \
++ $(LIBVIRT_LIBS) \
++ $(LIBXML2_LIBS) \
++ $(top_builddir)/gnulib/lib/libgnu.la
++endif
++
+ EXTRA_DIST = \
+ $(TESTS) \
+ $(tests_not_run) \
+ rhbz557655-expected.stdout \
+- rhbz557655-expected.stderr
++ rhbz557655-expected.stderr \
++ rhbz1044014.in \
++ rhbz1044014.xml
+
+ check-slow:
+ $(MAKE) TESTS="rhbz909624.sh" check
+diff --git a/tests/regressions/rhbz1044014.c b/tests/regressions/rhbz1044014.c
+new file mode 100644
+index 0000000..18ce4a7
+--- /dev/null
++++ b/tests/regressions/rhbz1044014.c
+@@ -0,0 +1,69 @@
++/* libguestfs
++ * Copyright (C) 2014 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.
++ */
++
++/* Regression test for RHBZ#1044014.
++ *
++ * The only reason to write this in C is so we can easily check the
++ * version of libvirt >= 1.2.1. In the future when we can assume a
++ * newer libvirt, we can just have the main rhbz1044014.sh script set
++ * some environment variables and use guestfish.
++ */
++
++#include <config.h>
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++#include <errno.h>
++
++#include <libvirt/libvirt.h>
++
++#include "guestfs.h"
++#include "guestfs-internal-frontend.h"
++
++int
++main (int argc, char *argv[])
++{
++ unsigned long ver;
++ guestfs_h *g;
++
++ virInitialize ();
++
++ /* Check that the version of libvirt we are linked against
++ * supports the new test-driver auth feature.
++ */
++ virGetVersion (&ver, NULL, NULL);
++ if (ver < 1002001) {
++ fprintf (stderr, "%s: test skipped because libvirt is too old (%lu)\n",
++ argv[0], ver);
++ exit (77);
++ }
++
++ g = guestfs_create ();
++ if (!g)
++ exit (EXIT_FAILURE);
++
++ /* This will ask the user for credentials. It will also fail
++ * (expectedly) because the test driver does not support qemu/KVM.
++ */
++ guestfs_launch (g);
++
++ guestfs_close (g);
++ exit (EXIT_SUCCESS);
++}
+diff --git a/tests/regressions/rhbz1044014.in b/tests/regressions/rhbz1044014.in
+new file mode 100644
+index 0000000..3f382dd
+--- /dev/null
++++ b/tests/regressions/rhbz1044014.in
+@@ -0,0 +1 @@
++rich
+diff --git a/tests/regressions/rhbz1044014.sh b/tests/regressions/rhbz1044014.sh
+new file mode 100755
+index 0000000..f1e458c
+--- /dev/null
++++ b/tests/regressions/rhbz1044014.sh
+@@ -0,0 +1,70 @@
++#!/bin/bash -
++# libguestfs
++# Copyright (C) 2014 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.
++
++# Regression test for:
++# https://bugzilla.redhat.com/show_bug.cgi?id=1044014
++
++set -e
++export LANG=C
++
++if [ -n "$SKIP_TEST_RHBZ1044014_SH" ]; then
++ echo "$0: test skipped because environment variable is set."
++ exit 77
++fi
++
++# Check we are running against the libvirt backend.
++backend="$(../../fish/guestfish get-backend)"
++if [[ ! ( "$backend" =~ ^libvirt ) ]]; then
++ echo "$0: test skipped because backend ($backend) is not libvirt."
++ exit 77
++fi
++
++# Set the backend to the test driver.
++export LIBGUESTFS_BACKEND="libvirt:test://$(pwd)/$srcdir/rhbz1044014.xml"
++
++rm -f rhbz1044014.out
++
++./rhbz1044014 < $srcdir/rhbz1044014.in > rhbz1044014.out 2>&1 || {
++ r=$?
++ if [ $r -ne 0 ]; then
++ cat rhbz1044014.out
++ exit $r
++ fi
++}
++
++# We are expecting this message to be printed (see commit which fixed
++# RHBZ#1044014).
++grep "libvirt needs authentication to connect to libvirt URI" rhbz1044014.out || {
++ echo "$0: expecting to see message from commit which fixed RHBZ#1044014"
++ echo
++ echo "actual output was:"
++ echo
++ cat rhbz1044014.out
++ exit 1
++}
++
++# This is the error we are expecting to see. If we see it then it
++# indicates that authentication was successful.
++grep "error: libvirt hypervisor doesn't support qemu or KVM" rhbz1044014.out || {
++ echo "$0: unexpected output:"
++ echo
++ cat rhbz1044014.out
++ exit 1
++}
++
++rm rhbz1044014.out
+diff --git a/tests/regressions/rhbz1044014.xml b/tests/regressions/rhbz1044014.xml
+new file mode 100644
+index 0000000..72feaf4
+--- /dev/null
++++ b/tests/regressions/rhbz1044014.xml
+@@ -0,0 +1,5 @@
++<node>
++ <auth>
++ <user>rich</user>
++ </auth>
++</node>
+--
+1.8.4.2
+
diff --git a/0047-sysprep-builder-Add-timezone-option-to-set-timezone-.patch b/0047-sysprep-builder-Add-timezone-option-to-set-timezone-.patch
new file mode 100644
index 0000000..83355cf
--- /dev/null
+++ b/0047-sysprep-builder-Add-timezone-option-to-set-timezone-.patch
@@ -0,0 +1,363 @@
+From 441fc2a889d8e1196f2f364f66e465b67984a828 Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Fri, 10 Jan 2014 12:12:30 +0000
+Subject: [PATCH] sysprep, builder: Add --timezone option to set timezone of
+ guest.
+
+You can use it like this:
+
+ virt-sysprep --timezone Europe/London ...
+ virt-builder --timezone Europe/London ...
+
+(cherry picked from commit dd1bfea513658368afd3728e0c5bf8ab6041cd1f)
+---
+ builder/Makefile.am | 1 +
+ builder/builder.ml | 12 ++++++-
+ builder/cmdline.ml | 9 ++++-
+ builder/test-virt-builder.sh | 1 +
+ builder/virt-builder.pod | 8 ++++-
+ mllib/Makefile.am | 3 ++
+ mllib/timezone.ml | 39 +++++++++++++++++++++
+ mllib/timezone.mli | 22 ++++++++++++
+ po/POTFILES-ml | 2 ++
+ sysprep/Makefile.am | 2 ++
+ sysprep/sysprep_operation_timezone.ml | 66 +++++++++++++++++++++++++++++++++++
+ 11 files changed, 162 insertions(+), 3 deletions(-)
+ create mode 100644 mllib/timezone.ml
+ create mode 100644 mllib/timezone.mli
+ create mode 100644 sysprep/sysprep_operation_timezone.ml
+
+diff --git a/builder/Makefile.am b/builder/Makefile.am
+index 3f35cc6..fc4c552 100644
+--- a/builder/Makefile.am
++++ b/builder/Makefile.am
+@@ -69,6 +69,7 @@ OBJECTS = \
+ $(top_builddir)/mllib/urandom.cmx \
+ $(top_builddir)/mllib/random_seed.cmx \
+ $(top_builddir)/mllib/hostname.cmx \
++ $(top_builddir)/mllib/timezone.cmx \
+ $(top_builddir)/mllib/firstboot.cmx \
+ $(top_builddir)/mllib/crypt-c.o \
+ $(top_builddir)/mllib/crypt.cmx \
+diff --git a/builder/builder.ml b/builder/builder.ml
+index f007b46..90300a3 100644
+--- a/builder/builder.ml
++++ b/builder/builder.ml
+@@ -39,7 +39,8 @@ let main () =
+ attach, cache, check_signature, curl, debug, delete, edit,
+ firstboot, run, format, gpg, hostname, install, list_long, memsize, mkdirs,
+ network, output, password_crypto, quiet, root_password, scrub,
+- scrub_logfile, size, smp, sources, sync, update, upload, writes =
++ scrub_logfile, size, smp, sources, sync, timezone, update, upload,
++ writes =
+ parse_cmdline () in
+
+ (* Timestamped messages in ordinary, non-debug non-quiet mode. *)
+@@ -619,6 +620,15 @@ let main () =
+ eprintf (f_"%s: warning: hostname could not be set for this type of guest\n%!") prog
+ );
+
++ (* Set the timezone. *)
++ (match timezone with
++ | None -> ()
++ | Some timezone ->
++ msg (f_"Setting the timezone: %s") timezone;
++ if not (Timezone.set_timezone ~prog g root timezone) then
++ eprintf (f_"%s: warning: timezone could not be set for this type of guest\n%!") prog
++ );
++
+ (* Root password.
+ * Note 'None' means that we randomize the root password.
+ *)
+diff --git a/builder/cmdline.ml b/builder/cmdline.ml
+index c6a3cd8..99412bb 100644
+--- a/builder/cmdline.ml
++++ b/builder/cmdline.ml
+@@ -169,6 +169,10 @@ let parse_cmdline () =
+ let add_source arg = sources := arg :: !sources in
+
+ let sync = ref true in
++
++ let timezone = ref None in
++ let set_timezone s = timezone := Some s in
++
+ let update = ref false in
+
+ let upload = ref [] in
+@@ -260,6 +264,7 @@ let parse_cmdline () =
+ "--smp", Arg.Int set_smp, "vcpus" ^ " " ^ s_"Set number of vCPUs";
+ "--source", Arg.String add_source, "URL" ^ " " ^ s_"Set source URL";
+ "--no-sync", Arg.Clear sync, " " ^ s_"Do not fsync output file on exit";
++ "--timezone",Arg.String set_timezone, "timezone" ^ " " ^ s_"Set the default timezone";
+ "--update", Arg.Set update, " " ^ s_"Update core packages";
+ "--upload", Arg.String add_upload, "file:dest" ^ " " ^ s_"Upload file to dest";
+ "-v", Arg.Set debug, " " ^ s_"Enable debugging messages";
+@@ -321,6 +326,7 @@ read the man page virt-builder(1).
+ let smp = !smp in
+ let sources = List.rev !sources in
+ let sync = !sync in
++ let timezone = !timezone in
+ let update = !update in
+ let upload = List.rev !upload in
+ let writes = List.rev !writes in
+@@ -421,4 +427,5 @@ read the man page virt-builder(1).
+ attach, cache, check_signature, curl, debug, delete, edit,
+ firstboot, run, format, gpg, hostname, install, list_long, memsize, mkdirs,
+ network, output, password_crypto, quiet, root_password, scrub,
+- scrub_logfile, size, smp, sources, sync, update, upload, writes
++ scrub_logfile, size, smp, sources, sync, timezone, update, upload,
++ writes
+diff --git a/builder/test-virt-builder.sh b/builder/test-virt-builder.sh
+index 438f2e9..8d2766a 100755
+--- a/builder/test-virt-builder.sh
++++ b/builder/test-virt-builder.sh
+@@ -53,6 +53,7 @@ $VG ./virt-builder phony-fedora \
+ -v --no-cache --no-check-signature $no_network \
+ -o $output --size 2G --format $format \
+ --hostname test.example.com \
++ --timezone Europe/London \
+ --root-password password:123456 \
+ --mkdir /etc/foo/bar/baz \
+ --write '/etc/foo/bar/baz/foo:Hello World' \
+diff --git a/builder/virt-builder.pod b/builder/virt-builder.pod
+index c3f685c..a703346 100644
+--- a/builder/virt-builder.pod
++++ b/builder/virt-builder.pod
+@@ -17,6 +17,7 @@ virt-builder - Build virtual machine images quickly
+ [--attach ISOFILE]
+ [--root-password SELECTOR]
+ [--hostname HOSTNAME]
++ [--timezone TIMEZONE]
+ [--update]
+ [--install PKG,[PKG...]]
+ [--mkdir DIR]
+@@ -583,6 +584,11 @@ Note that you should not point I<--source> to sources that you don't
+ trust (unless the source is signed by someone you do trust). See also
+ the I<--no-network> option.
+
++=item B<--timezone> TIMEZONE
++
++Set the default timezone of the guest to C<TIMEZONE>. Use a location
++string like C<Europe/London>
++
+ =item B<--update>
+
+ Do the equivalent of C<yum update>, C<apt-get upgrade>, or whatever
+@@ -834,7 +840,7 @@ A new random seed is generated for the guest.
+
+ =item *
+
+-The hostname is set (I<--hostname>).
++The hostname and timezone are set (I<--hostname>, I<--timezone>).
+
+ =item *
+
+diff --git a/mllib/Makefile.am b/mllib/Makefile.am
+index 67027d2..5568e02 100644
+--- a/mllib/Makefile.am
++++ b/mllib/Makefile.am
+@@ -47,6 +47,8 @@ SOURCES = \
+ progress.ml \
+ random_seed.mli \
+ random_seed.ml \
++ timezone.mli \
++ timezone.ml \
+ tty-c.c \
+ tTY.mli \
+ tTY.ml \
+@@ -77,6 +79,7 @@ OBJECTS = \
+ urandom.cmx \
+ random_seed.cmx \
+ hostname.cmx \
++ timezone.cmx \
+ firstboot.cmx \
+ tTY.cmx \
+ fsync.cmx \
+diff --git a/mllib/timezone.ml b/mllib/timezone.ml
+new file mode 100644
+index 0000000..8b302d9
+--- /dev/null
++++ b/mllib/timezone.ml
+@@ -0,0 +1,39 @@
++(* Set timezone in virt-sysprep and virt-builder.
++ * Copyright (C) 2014 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 Common_utils
++
++open Printf
++
++let set_timezone ~prog (g : Guestfs.guestfs) root timezone =
++ let typ = g#inspect_get_type root in
++
++ match typ with
++ (* Every known Linux has /etc/localtime be either a copy of or a
++ * symlink to a timezone file in /usr/share/zoneinfo.
++ * Even systemd didn't fuck this up.
++ *)
++ | "linux" ->
++ let target = sprintf "/usr/share/zoneinfo/%s" timezone in
++ if not (g#exists target) then
++ error ~prog "timezone '%s' does not exist, use a location like 'Europe/London'" timezone;
++ g#ln_sf target "/etc/localtime";
++ true
++
++ | _ ->
++ false
+diff --git a/mllib/timezone.mli b/mllib/timezone.mli
+new file mode 100644
+index 0000000..ad0d4b2
+--- /dev/null
++++ b/mllib/timezone.mli
+@@ -0,0 +1,22 @@
++(* Set timezone in virt-sysprep and virt-builder.
++ * Copyright (C) 2014 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 set_timezone : prog:string -> Guestfs.guestfs -> string -> string -> bool
++(** [set_timezone ~prog g root "Europe/London"] sets the default timezone
++ of the guest. Returns [true] if it was able to set the
++ timezone or [false] if not. *)
+diff --git a/po/POTFILES-ml b/po/POTFILES-ml
+index 8ae6ea9..4c69258 100644
+--- a/po/POTFILES-ml
++++ b/po/POTFILES-ml
+@@ -21,6 +21,7 @@ mllib/planner.ml
+ mllib/progress.ml
+ mllib/random_seed.ml
+ mllib/tTY.ml
++mllib/timezone.ml
+ mllib/uRI.ml
+ mllib/urandom.ml
+ resize/resize.ml
+@@ -62,6 +63,7 @@ sysprep/sysprep_operation_smolt_uuid.ml
+ sysprep/sysprep_operation_ssh_hostkeys.ml
+ sysprep/sysprep_operation_ssh_userdir.ml
+ sysprep/sysprep_operation_sssd_db_log.ml
++sysprep/sysprep_operation_timezone.ml
+ sysprep/sysprep_operation_tmp_files.ml
+ sysprep/sysprep_operation_udev_persistent_net.ml
+ sysprep/sysprep_operation_user_account.ml
+diff --git a/sysprep/Makefile.am b/sysprep/Makefile.am
+index 621d2b6..835d4a6 100644
+--- a/sysprep/Makefile.am
++++ b/sysprep/Makefile.am
+@@ -65,6 +65,7 @@ operations = \
+ ssh_hostkeys \
+ ssh_userdir \
+ sssd_db_log \
++ timezone \
+ tmp_files \
+ udev_persistent_net \
+ user_account \
+@@ -92,6 +93,7 @@ OBJECTS = \
+ $(top_builddir)/mllib/password.cmx \
+ $(top_builddir)/mllib/random_seed.cmx \
+ $(top_builddir)/mllib/hostname.cmx \
++ $(top_builddir)/mllib/timezone.cmx \
+ $(top_builddir)/mllib/firstboot.cmx \
+ $(top_builddir)/mllib/config.cmx \
+ sysprep_operation.cmx \
+diff --git a/sysprep/sysprep_operation_timezone.ml b/sysprep/sysprep_operation_timezone.ml
+new file mode 100644
+index 0000000..7557f44
+--- /dev/null
++++ b/sysprep/sysprep_operation_timezone.ml
+@@ -0,0 +1,66 @@
++(* virt-sysprep
++ * Copyright (C) 2014 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 Common_utils
++open Sysprep_operation
++open Common_gettext.Gettext
++
++module G = Guestfs
++
++let timezone = ref None
++
++let timezone_perform (g : Guestfs.guestfs) root =
++ match !timezone with
++ | None -> []
++ | Some tz ->
++ if Timezone.set_timezone ~prog g root tz then [ `Created_files ] else []
++
++let op = {
++ defaults with
++ name = "timezone";
++ enabled_by_default = true;
++ heading = s_"Change the default timezone of the guest";
++
++ pod_description = Some (s_"\
++This operation changes the default timezone of the guest to the value
++given in the I<--timezone> parameter.
++
++If the I<--timezone> parameter is not given, then the timezone is not
++changed.
++
++This parameter affects the default timezone that users see when they log
++in, but they can still change their timezone per-user account.");
++
++ pod_notes = Some (s_"\
++Currently this can only set the timezone on Linux guests.");
++
++ extra_args = [
++ let set_timezone str = timezone := Some str in
++ { extra_argspec = "--timezone", Arg.String set_timezone, s_"timezone" ^ " " ^ s_"New timezone";
++ extra_pod_argval = Some "TIMEZONE";
++ extra_pod_description = s_"\
++Change the timezone. Use a location string such as C<Europe/London>"
++ }
++ ];
++
++ perform_on_filesystems = Some timezone_perform;
++}
++
++let () = register_operation op
+--
+1.8.4.2
+
diff --git a/0048-builder-docs-Remove-confusing-reference-to-timezone.patch b/0048-builder-docs-Remove-confusing-reference-to-timezone.patch
new file mode 100644
index 0000000..5a456f8
--- /dev/null
+++ b/0048-builder-docs-Remove-confusing-reference-to-timezone.patch
@@ -0,0 +1,27 @@
+From 7317d80d502a8e26321aaed11290ff10b953d59b Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Fri, 10 Jan 2014 13:47:05 +0000
+Subject: [PATCH] builder: docs: Remove confusing reference to timezone.
+
+(cherry picked from commit 1e1b027c1b7c592ae8f04bcef8ffe93b7f2841d4)
+---
+ builder/virt-builder.pod | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/builder/virt-builder.pod b/builder/virt-builder.pod
+index a703346..6db3dd9 100644
+--- a/builder/virt-builder.pod
++++ b/builder/virt-builder.pod
+@@ -1233,8 +1233,8 @@ least one character of whitespace (even on blank lines):
+ notes=This image was prepared using
+ the following kickstart script:
+ <-- one space at beginning of line
+- timezone Europe/London
+ part /boot --fstype ext3
++ ...
+
+ =item C<hidden=true>
+
+--
+1.8.4.2
+
diff --git a/0049-builder-Document-how-to-change-keyboard-layout.patch b/0049-builder-Document-how-to-change-keyboard-layout.patch
new file mode 100644
index 0000000..fafd728
--- /dev/null
+++ b/0049-builder-Document-how-to-change-keyboard-layout.patch
@@ -0,0 +1,69 @@
+From cace864fa0bd50a00aeb6df62bb34cf441d25281 Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Fri, 10 Jan 2014 14:21:17 +0000
+Subject: [PATCH] builder: Document how to change keyboard layout.
+
+This is too complex to implement directly in virt-builder.
+
+Instead we just document how to do it for some common Linux distros
+using --run-command, --edit etc.
+
+(cherry picked from commit 8ae6b6c9ff855f5eaf3f16188b1bcb4ddba095c5)
+---
+ builder/virt-builder.pod | 40 ++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 40 insertions(+)
+
+diff --git a/builder/virt-builder.pod b/builder/virt-builder.pod
+index 6db3dd9..f81c556 100644
+--- a/builder/virt-builder.pod
++++ b/builder/virt-builder.pod
+@@ -779,6 +779,46 @@ The above command will create an C<rjones> account with no password,
+ and force the user to set a password when they first log in. There
+ are other ways to manage passwords, see L<useradd(8)> for details.
+
++=head2 KEYBOARD LAYOUT
++
++Because there are so many different ways to set the keyboard layout in
++Linux distributions, virt-builder does not yet attempt to have a
++simple command line option. This section describes how to set the
++keyboard for some common Linux distributions.
++
++=head3 Keyboard layout with systemd
++
++For distros that use systemd C<localectl>, use a command like this:
++
++ virt-builder fedora-20 \
++ --firstboot-command 'localectl set-keymap uk'
++
++See L<localectl(1)> and
++L<https://www.happyassassin.net/2013/11/23/keyboard-layouts-in-fedora-20-and-previously/>
++for more details.
++
++=head3 Keyboard layout using C</etc/sysconfig/keyboard>
++
++For RHEL E<le> 6, Fedora E<le> 18 and similar, upload or modify the
++keyboard configuration file using the I<--upload>, I<--write> or
++I<--edit> options. For example:
++
++ virt-builder centos-6 \
++ --edit '/etc/sysconfig/keyboard: s/^KEYTABLE=.*/KEYTABLE="uk"/'
++
++The format of this file can be found documented in many places online.
++
++=head3 Keyboard layout with Debian-derived distros
++
++For Debian-derived distros using C</etc/default/keyboard>, upload or
++modify the keyboard file using the I<--upload>, I<--write> or
++I<--edit> options. For example:
++
++ virt-builder debian-7 \
++ --edit '/etc/default/keyboard: s/^XKBLAYOUT=.*/XKBLAYOUT="gb"/'
++
++See L<https://wiki.debian.org/Keyboard>.
++
+ =head2 LOG FILE
+
+ Scripts and package installation that runs at build time (I<--run>,
+--
+1.8.4.2
+
diff --git a/0050-builder-List-install-packages-in-the-same-order-as-o.patch b/0050-builder-List-install-packages-in-the-same-order-as-o.patch
new file mode 100644
index 0000000..18e101e
--- /dev/null
+++ b/0050-builder-List-install-packages-in-the-same-order-as-o.patch
@@ -0,0 +1,31 @@
+From 46461012e3fb5a1672346abdff7c16ea2786ee93 Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Fri, 10 Jan 2014 17:04:28 +0000
+Subject: [PATCH] builder: List --install packages in the same order as on the
+ command line.
+
+Previously the list was reversed. Note this doesn't have any effect
+on how the packages are installed since the guest package manager
+doesn't care about the order.
+
+(cherry picked from commit 39bc959c5b3a972e9a12921e002f27aaab2cd5ff)
+---
+ builder/cmdline.ml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/builder/cmdline.ml b/builder/cmdline.ml
+index 99412bb..813fbd8 100644
+--- a/builder/cmdline.ml
++++ b/builder/cmdline.ml
+@@ -311,7 +311,7 @@ read the man page virt-builder(1).
+ let format = match !format with "" -> None | s -> Some s in
+ let gpg = !gpg in
+ let hostname = !hostname in
+- let install = !install in
++ let install = List.rev !install in
+ let list_long = !list_long in
+ let memsize = !memsize in
+ let mkdirs = List.rev !mkdirs in
+--
+1.8.4.2
+
diff --git a/0051-builder-Add-link-option-for-creating-symbolic-links.patch b/0051-builder-Add-link-option-for-creating-symbolic-links.patch
new file mode 100644
index 0000000..36bbb3f
--- /dev/null
+++ b/0051-builder-Add-link-option-for-creating-symbolic-links.patch
@@ -0,0 +1,147 @@
+From 289e050b75532cce6bfb9d75a8646f02b189b44f Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Fri, 10 Jan 2014 21:18:07 +0000
+Subject: [PATCH] builder: Add --link option for creating symbolic links.
+
+This is useful for configuring systemd services.
+
+(cherry picked from commit 6d4ac696e54902baf7d76de527b3df3d66c7dfa1)
+---
+ builder/builder.ml | 13 ++++++++++++-
+ builder/cmdline.ml | 16 +++++++++++++++-
+ builder/test-virt-builder.sh | 2 ++
+ builder/virt-builder.pod | 12 ++++++++++++
+ 4 files changed, 41 insertions(+), 2 deletions(-)
+
+diff --git a/builder/builder.ml b/builder/builder.ml
+index 90300a3..16ffa7a 100644
+--- a/builder/builder.ml
++++ b/builder/builder.ml
+@@ -37,7 +37,8 @@ let main () =
+ (* Command line argument parsing - see cmdline.ml. *)
+ let mode, arg,
+ attach, cache, check_signature, curl, debug, delete, edit,
+- firstboot, run, format, gpg, hostname, install, list_long, memsize, mkdirs,
++ firstboot, run, format, gpg, hostname, install, list_long, links,
++ memsize, mkdirs,
+ network, output, password_crypto, quiet, root_password, scrub,
+ scrub_logfile, size, smp, sources, sync, timezone, update, upload,
+ writes =
+@@ -837,6 +838,16 @@ exec >>%s 2>&1
+ g#rm_rf file
+ ) delete;
+
++ (* Symbolic links. *)
++ List.iter (
++ fun (target, links) ->
++ List.iter (
++ fun link ->
++ msg (f_"Linking: %s -> %s") link target;
++ g#ln_sf target link
++ ) links
++ ) links;
++
+ (* Scrub files. *)
+ List.iter (
+ fun file ->
+diff --git a/builder/cmdline.ml b/builder/cmdline.ml
+index 813fbd8..58e8a6b 100644
+--- a/builder/cmdline.ml
++++ b/builder/cmdline.ml
+@@ -117,6 +117,17 @@ let parse_cmdline () =
+ install := pkgs @ !install
+ in
+
++ let links = ref [] in
++ let add_link arg =
++ let target, lns =
++ match string_nsplit ":" arg with
++ | [] | [_] ->
++ eprintf (f_"%s: invalid --link format, see the man page.\n") prog;
++ exit 1
++ | target :: lns -> target, lns in
++ links := (target, lns) :: !links
++ in
++
+ let list_long = ref false in
+
+ let memsize = ref None in
+@@ -237,6 +248,7 @@ let parse_cmdline () =
+ "--gpg", Arg.Set_string gpg, "gpg" ^ " " ^ s_"Set GPG binary/command";
+ "--hostname", Arg.String set_hostname, "hostname" ^ " " ^ s_"Set the hostname";
+ "--install", Arg.String add_install, "pkg,pkg" ^ " " ^ s_"Add package(s) to install";
++ "--link", Arg.String add_link, "target:link.." ^ " " ^ s_"Create symbolic links";
+ "-l", Arg.Unit list_mode, " " ^ s_"List available templates";
+ "--list", Arg.Unit list_mode, ditto;
+ "--long", Arg.Set list_long, ditto;
+@@ -313,6 +325,7 @@ read the man page virt-builder(1).
+ let hostname = !hostname in
+ let install = List.rev !install in
+ let list_long = !list_long in
++ let links = List.rev !links in
+ let memsize = !memsize in
+ let mkdirs = List.rev !mkdirs in
+ let network = !network in
+@@ -425,7 +438,8 @@ read the man page virt-builder(1).
+
+ mode, arg,
+ attach, cache, check_signature, curl, debug, delete, edit,
+- firstboot, run, format, gpg, hostname, install, list_long, memsize, mkdirs,
++ firstboot, run, format, gpg, hostname, install, list_long, links,
++ memsize, mkdirs,
+ network, output, password_crypto, quiet, root_password, scrub,
+ scrub_logfile, size, smp, sources, sync, timezone, update, upload,
+ writes
+diff --git a/builder/test-virt-builder.sh b/builder/test-virt-builder.sh
+index 8d2766a..47d20a4 100755
+--- a/builder/test-virt-builder.sh
++++ b/builder/test-virt-builder.sh
+@@ -60,6 +60,8 @@ $VG ./virt-builder phony-fedora \
+ --upload Makefile:/Makefile \
+ --upload Makefile:/etc/foo/bar/baz \
+ --delete /Makefile \
++ --link /etc/foo/bar/baz/foo:/foo \
++ --link /etc/foo/bar/baz/foo:/foo1:/foo2:/foo3 \
+ --firstboot Makefile --firstboot-command 'echo "hello"' \
+ --firstboot-install "minicom,inkscape"
+
+diff --git a/builder/virt-builder.pod b/builder/virt-builder.pod
+index f81c556..584a0e0 100644
+--- a/builder/virt-builder.pod
++++ b/builder/virt-builder.pod
+@@ -23,6 +23,7 @@ virt-builder - Build virtual machine images quickly
+ [--mkdir DIR]
+ [--write FILE:CONTENT]
+ [--upload FILE:DEST]
++ [--link TARGET:LINK[:LINK]]
+ [--edit FILE:EXPR]
+ [--delete FILE] [--scrub FILE]
+ [--run SCRIPT] [--run-command 'CMD ARGS ...']
+@@ -353,6 +354,13 @@ L</INSTALLING PACKAGES>.
+
+ See also I<--update>.
+
++=item B<--link TARGET:LINK>
++
++=item B<--link TARGET:LINK[:LINK...]>
++
++Create symbolic link(s) in the guest, starting at C<LINK> and
++pointing at C<TARGET>.
++
+ =item B<-l>
+
+ =item B<--list>
+@@ -916,6 +924,10 @@ Files are deleted (I<--delete>, I<--scrub>).
+
+ =item *
+
++Symbolic links are created (I<--link).
++
++=item *
++
+ Firstboot scripts are installed (I<--firstboot>,
+ I<--firstboot-command>, I<--firstboot-install>).
+
+--
+1.8.4.2
+
diff --git a/0052-builder-Document-how-to-change-the-language-locale-o.patch b/0052-builder-Document-how-to-change-the-language-locale-o.patch
new file mode 100644
index 0000000..715ee48
--- /dev/null
+++ b/0052-builder-Document-how-to-change-the-language-locale-o.patch
@@ -0,0 +1,55 @@
+From 67d5d90d6d5f8a983ddd39616f0e2d43ba4e326d Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Fri, 10 Jan 2014 19:48:28 +0000
+Subject: [PATCH] builder: Document how to change the language/locale of a new
+ guest.
+
+(cherry picked from commit 7e8ad13e863a5c87e3da47288bcecdb88ca0e4cb)
+---
+ builder/virt-builder.pod | 30 ++++++++++++++++++++++++++++++
+ 1 file changed, 30 insertions(+)
+
+diff --git a/builder/virt-builder.pod b/builder/virt-builder.pod
+index 584a0e0..031f3d7 100644
+--- a/builder/virt-builder.pod
++++ b/builder/virt-builder.pod
+@@ -827,6 +827,36 @@ I<--edit> options. For example:
+
+ See L<https://wiki.debian.org/Keyboard>.
+
++=head2 LANGUAGE
++
++Most Linux distributions support multiple locale settings so that you
++can have guest messages printed in another language such as Russian.
++However there is no single setting which controls this, since extra
++packages may need to be installed to support console and X fonts and
++keyboard input methods. The packages required, and their
++configuration is highly distro-specific, and it is outside the scope
++of virt-builder to do this.
++
++=begin comment
++
++This section contains examples for some common Linux distributions.
++
++=head3 Setting Japanese in Fedora 20
++
++XXX This does not work.
++
++ virt-builder fedora-20 \
++ --size 20G \
++ --update \
++ --install @gnome-desktop --install @japanese-support \
++ --firstboot-command 'localectl set-locale LANG=ja_JP.utf8' \
++ --firstboot-command 'localectl set-keymap jp' \
++ --firstboot-command 'systemctl enable gdm.service' \
++ --firstboot-command 'systemctl start gdm.service' \
++ --link /usr/lib/systemd/system/graphical.target:/etc/systemd/system/default.target
++
++=end comment
++
+ =head2 LOG FILE
+
+ Scripts and package installation that runs at build time (I<--run>,
+--
+1.8.4.2
+
diff --git a/0053-builder-Document-how-to-set-up-local-mirrors-for-per.patch b/0053-builder-Document-how-to-set-up-local-mirrors-for-per.patch
new file mode 100644
index 0000000..91ca3f5
--- /dev/null
+++ b/0053-builder-Document-how-to-set-up-local-mirrors-for-per.patch
@@ -0,0 +1,86 @@
+From 20adf1506b99ae4c7a2ed901e6d14ba83e017325 Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Fri, 10 Jan 2014 19:49:02 +0000
+Subject: [PATCH] builder: Document how to set up local mirrors for performance
+ and reliability.
+
+(cherry picked from commit f40e44c2f97a7fa17e6078d958ae2779b7ca83c7)
+---
+ builder/virt-builder.pod | 52 +++++++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 49 insertions(+), 3 deletions(-)
+
+diff --git a/builder/virt-builder.pod b/builder/virt-builder.pod
+index 031f3d7..000dfae 100644
+--- a/builder/virt-builder.pod
++++ b/builder/virt-builder.pod
+@@ -1410,6 +1410,8 @@ The index is always encoded in UTF-8.
+
+ =head2 CACHING
+
++=head3 Caching templates
++
+ Since the templates are usually very large, downloaded templates are
+ cached in the user's home directory.
+
+@@ -1434,11 +1436,55 @@ To disable the template cache, use I<--no-cache>.
+ Only templates are cached. The index and detached digital signatures
+ are not cached.
+
++=head3 Caching packages
++
+ Virt-builder uses L<curl(1)> to download files and it also uses the
+ current C<http_proxy> (etc) settings when installing packages
+-(I<--install>, I<--update>). You may therefore want to set those
+-environment variables in order to maximize the amount of local caching
+-that happens. See L</ENVIRONMENT VARIABLES> and L<curl(1)>.
++(I<--install>, I<--update>).
++
++You may therefore want to set those environment variables in order to
++maximize the amount of local caching that happens. See
++L</ENVIRONMENT VARIABLES> and L<curl(1)>.
++
++=head3 Local mirrors
++
++To increase both speed and reliability of installing packages, you can
++set up a local mirror of the target distribution, and point the guest
++package manager at that.
++
++Because of the order in which each phase of installation happens, you
++cannot use I<--write> (to point the package manager at a repo)
++followed by I<--install> (to install from that repo). The I<--write>
++and I<--install> steps run in the opposite order, regardless of their
++order on the command line. You have to do this using I<--run-command>
++instead of I<--install>.
++
++=head4 Using a local mirror with Fedora
++
++To install a Fedora guest using a local mirror:
++
++ virt-builder fedora 20 \
++ --edit '/etc/yum.repos.d/fedora.repo:
++ s{.*baseurl=.*}{baseurl=http://example.com/mirror/};
++ s{.*metalink=.*}{};
++ ' \
++ --edit '/etc/yum.repos.d/fedora-updates.repo:
++ s{.*baseurl=.*}{baseurl=http://example.com/mirror-updates/};
++ s{.*metalink=.*}{};
++ ' \
++ --run-command 'yum -y update' \
++ --run-command 'yum -y install pkg1 pkg2 ...'
++
++=head4 Using a local mirror with Debian
++
++Assuming that you are using C<apt-proxy> to mirror the repository, you
++should create a new C<sources.list> file to point to your proxy (see
++L<https://help.ubuntu.com/community/AptProxy>) and then do:
++
++ virt-builder fedora 20 \
++ --upload sources.list:/etc/apt/sources.list \
++ --run-command 'apt-get -y update' \
++ --run-command 'apt-get -y install pkg1 pkg2 ...'
+
+ =head2 DIGITAL SIGNATURES
+
+--
+1.8.4.2
+
diff --git a/0054-builder-Document-that-SELinux-guests-will-reboot-for.patch b/0054-builder-Document-that-SELinux-guests-will-reboot-for.patch
new file mode 100644
index 0000000..26c4b54
--- /dev/null
+++ b/0054-builder-Document-that-SELinux-guests-will-reboot-for.patch
@@ -0,0 +1,37 @@
+From 23c4148eed3193660f173baad89a7e1ce582248b Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Fri, 10 Jan 2014 21:17:09 +0000
+Subject: [PATCH] builder: Document that SELinux guests will reboot for
+ autorelabel.
+
+(cherry picked from commit a8c9aedd51a88b3e08d6cc2580053d44b11f716b)
+---
+ builder/virt-builder.pod | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/builder/virt-builder.pod b/builder/virt-builder.pod
+index 000dfae..c1adfa8 100644
+--- a/builder/virt-builder.pod
++++ b/builder/virt-builder.pod
+@@ -1607,6 +1607,18 @@ fixed in a future version.
+ The qcow2 output format is not supported by UML. You can only create
+ raw-format guests.
+
++=head2 SELINUX
++
++Guests which use SELinux (such as Fedora and Red Hat Enterprise Linux)
++require that each file has a correct SELinux label.
++
++Since virt-builder does not know how to give new files a correct
++label, it touches C</.autorelabel> in the guest and relies on the
++guest to relabel itself at first boot.
++
++This usually means that these guests will reboot themselves once the
++first time you use them. This is normal, and harmless.
++
+ =head1 ENVIRONMENT VARIABLES
+
+ For other environment variables which affect all libguestfs programs,
+--
+1.8.4.2
+
diff --git a/0055-builder-Document-how-to-set-Japanese-language-suppor.patch b/0055-builder-Document-how-to-set-Japanese-language-suppor.patch
new file mode 100644
index 0000000..0e61be3
--- /dev/null
+++ b/0055-builder-Document-how-to-set-Japanese-language-suppor.patch
@@ -0,0 +1,59 @@
+From bf1c985746c136b39ed0a60817242731a09d2a19 Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Sun, 12 Jan 2014 17:06:02 +0000
+Subject: [PATCH] builder: Document how to set Japanese language support in
+ Fedora 20.
+
+This updates/fixes commit 7e8ad13e863a5c87e3da47288bcecdb88ca0e4cb.
+
+(cherry picked from commit fcdea83c6b9dc94a565a819a9f42e0c4721166e8)
+---
+ builder/virt-builder.pod | 18 +++++++-----------
+ 1 file changed, 7 insertions(+), 11 deletions(-)
+
+diff --git a/builder/virt-builder.pod b/builder/virt-builder.pod
+index c1adfa8..f7eb9e9 100644
+--- a/builder/virt-builder.pod
++++ b/builder/virt-builder.pod
+@@ -831,31 +831,27 @@ See L<https://wiki.debian.org/Keyboard>.
+
+ Most Linux distributions support multiple locale settings so that you
+ can have guest messages printed in another language such as Russian.
++
+ However there is no single setting which controls this, since extra
+-packages may need to be installed to support console and X fonts and
++packages may need to be installed to support console and X fonts, and
+ keyboard input methods. The packages required, and their
+ configuration is highly distro-specific, and it is outside the scope
+ of virt-builder to do this.
+
+-=begin comment
+-
+ This section contains examples for some common Linux distributions.
+
+ =head3 Setting Japanese in Fedora 20
+
+-XXX This does not work.
+-
+ virt-builder fedora-20 \
+ --size 20G \
+ --update \
+- --install @gnome-desktop --install @japanese-support \
++ --install @japanese-support \
++ --install @xfce \
++ --install xorg-x11-server-Xorg,xorg-x11-drivers,rsyslog \
++ --link /usr/lib/systemd/system/graphical.target:/etc/systemd/system/default.target \
+ --firstboot-command 'localectl set-locale LANG=ja_JP.utf8' \
+ --firstboot-command 'localectl set-keymap jp' \
+- --firstboot-command 'systemctl enable gdm.service' \
+- --firstboot-command 'systemctl start gdm.service' \
+- --link /usr/lib/systemd/system/graphical.target:/etc/systemd/system/default.target
+-
+-=end comment
++ --firstboot-command 'systemctl isolate graphical.target'
+
+ =head2 LOG FILE
+
+--
+1.8.4.2
+
diff --git a/0056-builder-Fix-virt-builder-test.patch b/0056-builder-Fix-virt-builder-test.patch
new file mode 100644
index 0000000..db00860
--- /dev/null
+++ b/0056-builder-Fix-virt-builder-test.patch
@@ -0,0 +1,40 @@
+From d3dcc80c16b3731fefcde76659661b44b1bb881b Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Sun, 12 Jan 2014 17:49:48 +0000
+Subject: [PATCH] builder: Fix virt-builder test.
+
+Add Europe/London timezone to phony Fedora guest.
+
+This fixes commit dd1bfea513658368afd3728e0c5bf8ab6041cd1f.
+
+(cherry picked from commit 7500ae3f75f4650c18f2a8433c6b5edcca6e88a6)
+---
+ tests/guests/guest-aux/make-fedora-img.pl | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/tests/guests/guest-aux/make-fedora-img.pl b/tests/guests/guest-aux/make-fedora-img.pl
+index 7c96eb8..0537bd2 100755
+--- a/tests/guests/guest-aux/make-fedora-img.pl
++++ b/tests/guests/guest-aux/make-fedora-img.pl
+@@ -1,6 +1,6 @@
+ #!/usr/bin/perl
+ # libguestfs
+-# Copyright (C) 2010-2012 Red Hat Inc.
++# Copyright (C) 2010-2014 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
+@@ -201,6 +201,10 @@ $g->mkdir ('/bin');
+ $g->mkdir ('/etc');
+ $g->mkdir ('/etc/sysconfig');
+ $g->mkdir ('/usr');
++$g->mkdir ('/usr/share');
++$g->mkdir ('/usr/share/zoneinfo');
++$g->mkdir ('/usr/share/zoneinfo/Europe');
++$g->touch ('/usr/share/zoneinfo/Europe/London');
+ $g->mkdir_p ('/var/lib/rpm');
+ $g->mkdir_p ('/var/log/journal');
+
+--
+1.8.4.2
+
diff --git a/0057-builder-website-Add-CirrOS-signature-file-to-EXTRA_D.patch b/0057-builder-website-Add-CirrOS-signature-file-to-EXTRA_D.patch
new file mode 100644
index 0000000..d470e9b
--- /dev/null
+++ b/0057-builder-website-Add-CirrOS-signature-file-to-EXTRA_D.patch
@@ -0,0 +1,27 @@
+From ceef6f1e6e8d8c23d6fa859caf0c1565ced628a9 Mon Sep 17 00:00:00 2001
+From: "Richard W.M. Jones" <rjones at redhat.com>
+Date: Sun, 12 Jan 2014 18:06:26 +0000
+Subject: [PATCH] builder/website: Add CirrOS signature file to EXTRA_DIST.
+
+This fixes commit 40b88fdbc76515fd21b33f54587c7f4f7b6e9715.
+
+(cherry picked from commit ed43cc12c4492510e38eee9c7f8a5076956e4066)
+---
+ builder/website/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/builder/website/Makefile.am b/builder/website/Makefile.am
+index dff186f..a5b1bcf 100644
+--- a/builder/website/Makefile.am
++++ b/builder/website/Makefile.am
+@@ -27,6 +27,7 @@ EXTRA_DIST = \
+ index.asc \
+ centos.sh \
+ centos-*.xz.sig \
++ cirros-*.xz.sig \
+ debian.preseed \
+ debian.sh \
+ debian-*.xz.sig \
+--
+1.8.4.2
+
diff --git a/libguestfs.spec b/libguestfs.spec
index 81eae9d..f994a55 100644
--- a/libguestfs.spec
+++ b/libguestfs.spec
@@ -12,7 +12,7 @@ Summary: Access and modify virtual machine disk images
Name: libguestfs
Epoch: 1
Version: 1.24.4
-Release: 1%{?dist}
+Release: 2%{?dist}
License: LGPLv2+
# Source and patches.
@@ -63,6 +63,25 @@ Patch0035: 0035-builder-Refuse-to-write-to-a-char-device-or-dev-null.patch
Patch0036: 0036-builder-Remove-blank-line.patch
Patch0037: 0037-builder-Add-update-option-to-update-template-core-pa.patch
Patch0038: 0038-launch-libvirt-Don-t-default-to-using-NULL-for-libvi.patch
+Patch0039: 0039-builder-Add-CirrOS-0.3.1-disk-image.patch
+Patch0040: 0040-builder-Note-in-man-page-how-to-specify-size-in-byte.patch
+Patch0041: 0041-builder-Pass-prog-global-program-name-around.patch
+Patch0042: 0042-mllib-Add-library-function-to-run-external-command-a.patch
+Patch0043: 0043-builder-Fix-handling-of-size-parameter.patch
+Patch0044: 0044-libvirt-auth-Provide-a-friendlier-wrapper-around-vir.patch
+Patch0045: 0045-tests-Add-a-regression-test-of-libvirt-authenticatio.patch
+Patch0046: 0046-tests-Add-a-regression-test-for-libvirt-authenticati.patch
+Patch0047: 0047-sysprep-builder-Add-timezone-option-to-set-timezone-.patch
+Patch0048: 0048-builder-docs-Remove-confusing-reference-to-timezone.patch
+Patch0049: 0049-builder-Document-how-to-change-keyboard-layout.patch
+Patch0050: 0050-builder-List-install-packages-in-the-same-order-as-o.patch
+Patch0051: 0051-builder-Add-link-option-for-creating-symbolic-links.patch
+Patch0052: 0052-builder-Document-how-to-change-the-language-locale-o.patch
+Patch0053: 0053-builder-Document-how-to-set-up-local-mirrors-for-per.patch
+Patch0054: 0054-builder-Document-that-SELinux-guests-will-reboot-for.patch
+Patch0055: 0055-builder-Document-how-to-set-Japanese-language-suppor.patch
+Patch0056: 0056-builder-Fix-virt-builder-test.patch
+Patch0057: 0057-builder-website-Add-CirrOS-signature-file-to-EXTRA_D.patch
# Add any non-git patches here.
# Use git for patch management.
@@ -1054,6 +1073,9 @@ mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/run/libguestfs
%changelog
+* Sun Jan 12 2014 Richard W.M. Jones <rjones at redhat.com> - 1:1.24.4-2
+- Backport more virt-builder patches from upstream to Fedora.
+
* Fri Jan 3 2014 Richard W.M. Jones <rjones at redhat.com> - 1:1.24.4-1
- New stable branch version 1.24.4.
- Fix source URL.
More information about the scm-commits
mailing list