From 47455b13d2defac1654d3ba5e28026be72ecbe39 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Tue, 9 Jun 2015 17:06:33 +0100 Subject: [PATCH] p2v: Add p2v.pre, p2v.post, p2v.fail commands (RHBZ#1229385). The default p2v.post command, when run from the ISO, is to poweroff the machine after successful conversion. (cherry picked from commit b45f6a04359b4b64256b7b21a04416fa772c9423) --- p2v/kernel.c | 43 +++++++++++++++++++++++++++++++++++++++++++ p2v/test-virt-p2v.sh | 2 +- p2v/virt-p2v.pod | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+), 1 deletion(-) diff --git a/p2v/kernel.c b/p2v/kernel.c index 88d18bd..d7664d5 100644 --- a/p2v/kernel.c +++ b/p2v/kernel.c @@ -29,16 +29,23 @@ #include #include #include +#include +#include #include "p2v.h" static void notify_ui_callback (int type, const char *data); +static void run_command (int verbose, const char *stage, const char *command); void kernel_configuration (struct config *config, char **cmdline, int cmdline_source) { const char *p; + p = get_cmdline_key (cmdline, "p2v.pre"); + if (p) + run_command (config->verbose, "p2v.pre", p); + p = get_cmdline_key (cmdline, "p2v.server"); assert (p); /* checked by caller */ free (config->server); @@ -193,8 +200,21 @@ kernel_configuration (struct config *config, char **cmdline, int cmdline_source) fprintf (stderr, "%s: error during conversion: %s\n", guestfs_int_program_name, err); + + p = get_cmdline_key (cmdline, "p2v.fail"); + if (p) + run_command (config->verbose, "p2v.fail", p); + exit (EXIT_FAILURE); } + + p = get_cmdline_key (cmdline, "p2v.post"); + if (!p) { + if (geteuid () == 0 && cmdline_source == CMDLINE_SOURCE_PROC_CMDLINE) + p = "poweroff"; + } + if (p) + run_command (config->verbose, "p2v.post", p); } static void @@ -218,3 +238,26 @@ notify_ui_callback (int type, const char *data) guestfs_int_program_name, type, data); } } + +static void +run_command (int verbose, const char *stage, const char *command) +{ + int r; + + if (STREQ (command, "")) + return; + + if (verbose) + printf ("%s\n", command); + + r = system (command); + if (r == -1) { + perror ("system"); + exit (EXIT_FAILURE); + } + if ((WIFEXITED (r) && WEXITSTATUS (r) != 0) || !WIFEXITED (r)) { + fprintf (stderr, "%s: %s: unexpected failure of external command\n", + guestfs_int_program_name, stage); + exit (EXIT_FAILURE); + } +} diff --git a/p2v/test-virt-p2v.sh b/p2v/test-virt-p2v.sh index f4d28d1..5184dab 100755 --- a/p2v/test-virt-p2v.sh +++ b/p2v/test-virt-p2v.sh @@ -59,7 +59,7 @@ export PATH=$d:$PATH # under test (because of the ./run script). # The Linux kernel command line. -cmdline="p2v.server=localhost p2v.name=windows p2v.debug p2v.disks=$f p2v.o=local p2v.os=$d p2v.network=em1:wired,other" +cmdline="p2v.server=localhost p2v.name=windows p2v.debug p2v.disks=$f p2v.o=local p2v.os=$d p2v.network=em1:wired,other p2v.post=" virt-p2v --cmdline="$cmdline" diff --git a/p2v/virt-p2v.pod b/p2v/virt-p2v.pod index 9c1dba1..dd44a1c 100644 --- a/p2v/virt-p2v.pod +++ b/p2v/virt-p2v.pod @@ -422,6 +422,41 @@ option. See L. If not specified, the default is C (on the conversion server). +=item B + +=item B + +Select a pre-conversion command to run. Any command or script can be +specified here. If the command contains spaces, you must quote the +whole command with double quotes. The default is not to run any +command. + +=item B + +=item B + +=item B + +=item B + +Select a post-conversion command to run if conversion is successful. +This can be any command or script. If the command contains spaces, +you must quote the whole command with double quotes. + +I virt-p2v is running as root, I the command line was set +from C (not I<--cmdline>), then the default is to run +the L command. Otherwise the default is not to run any +command. + +=item B + +=item B + +Select a post-conversion command to run if conversion fails. Any +command or script can be specified here. If the command contains +spaces, you must quote the whole command with double quotes. The +default is not to run any command. + =item B Use DHCP for configuring the network interface (this is the default). -- 1.8.3.1