From 82ddc2d25e1bffbb5932492f25f45ada2aaeb67a Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Sat, 26 Oct 2013 11:40:48 +0100
Subject: [PATCH] builder: Add --write option to write a literal file.
(cherry picked from commit 0520aa3c42fbb174be37ef75b19390855d225897)
---
builder/builder.ml | 9 ++++++++-
builder/cmdline.ml | 17 ++++++++++++++++-
builder/test-virt-builder.sh | 1 +
builder/virt-builder.pod | 9 +++++++++
4 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/builder/builder.ml b/builder/builder.ml
index 0c8f3b1..c765610 100644
--- a/builder/builder.ml
+++ b/builder/builder.ml
@@ -38,7 +38,7 @@ let main () =
attach, cache, check_signature, curl, debug, delete, edit, fingerprint,
firstboot, run, format, gpg, hostname, install, list_long, mkdirs,
network, output, password_crypto, quiet, root_password, scrub,
- scrub_logfile, size, source, sync, upload =
+ scrub_logfile, size, source, sync, upload, writes =
parse_cmdline () in
(* Timestamped messages in ordinary, non-debug non-quiet mode. *)
@@ -582,6 +582,13 @@ exec >>%s 2>&1
g#mkdir_p dir
) mkdirs;
+ (* Write files. *)
+ List.iter (
+ fun (file, content) ->
+ msg (f_"Writing: %s") file;
+ g#write file content
+ ) writes;
+
(* Upload files. *)
List.iter (
fun (file, dest) ->
diff --git a/builder/cmdline.ml b/builder/cmdline.ml
index 36c63a2..6611fad 100644
--- a/builder/cmdline.ml
+++ b/builder/cmdline.ml
@@ -184,6 +184,19 @@ let parse_cmdline () =
upload := (file, dest) :: !upload
in
+ let writes = ref [] in
+ let add_write arg =
+ let i =
+ try String.index arg ':'
+ with Not_found ->
+ eprintf (f_"%s: invalid --write format, see the man page.\n") prog;
+ exit 1 in
+ let len = String.length arg in
+ let file = String.sub arg 0 i in
+ let content = String.sub arg (i+1) (len-(i+1)) in
+ writes := (file, content) :: !writes
+ in
+
let ditto = " -\"-" in
let argspec = Arg.align [
"--attach", Arg.String attach_disk, "iso" ^ " " ^ s_"Attach data disk/ISO during install";
@@ -245,6 +258,7 @@ let parse_cmdline () =
"--verbose", Arg.Set debug, ditto;
"-V", Arg.Unit display_version, " " ^ s_"Display version and exit";
"--version", Arg.Unit display_version, ditto;
+ "--write", Arg.String add_write, "file:content" ^ " " ^ s_"Write file";
] in
long_options := argspec;
@@ -298,6 +312,7 @@ read the man page virt-builder(1).
let source = !source in
let sync = !sync in
let upload = List.rev !upload in
+ let writes = List.rev !writes in
(* Check options. *)
let arg =
@@ -353,4 +368,4 @@ read the man page virt-builder(1).
attach, cache, check_signature, curl, debug, delete, edit, fingerprint,
firstboot, run, format, gpg, hostname, install, list_long, mkdirs,
network, output, password_crypto, quiet, root_password, scrub,
- scrub_logfile, size, source, sync, upload
+ scrub_logfile, size, source, sync, upload, writes
diff --git a/builder/test-virt-builder.sh b/builder/test-virt-builder.sh
index c69774c..6296d16 100755
--- a/builder/test-virt-builder.sh
+++ b/builder/test-virt-builder.sh
@@ -55,6 +55,7 @@ $VG ./virt-builder phony-fedora \
--hostname test.example.com \
--root-password password:123456 \
--mkdir /etc/foo/bar/baz \
+ --write '/etc/foo/bar/baz/foo:Hello World' \
--upload Makefile:/Makefile \
--upload Makefile:/etc/foo/bar/baz \
--delete /Makefile \
diff --git a/builder/virt-builder.pod b/builder/virt-builder.pod
index 55dba90..f795e7a 100644
--- a/builder/virt-builder.pod
+++ b/builder/virt-builder.pod
@@ -19,6 +19,7 @@ virt-builder - Build virtual machine images quickly
[--hostname HOSTNAME]
[--install PKG,[PKG...]]
[--mkdir DIR]
+ [--write FILE:CONTENT]
[--upload FILE:DEST]
[--edit FILE:EXPR]
[--delete FILE] [--scrub FILE]
@@ -583,6 +584,10 @@ your bug report.
Display version number and exit.
+=item B<--write> FILE:CONTENT
+
+Write C<CONTENT> to C<FILE>.
+
=back
=head1 REFERENCE
@@ -768,6 +773,10 @@ Directories are created (I<--mkdir>).
=item *
+Files are written (I<--write>).
+
+=item *
+
Files are uploaded (I<--upload>).
=item *
--
1.8.3.1