Blob Blame History Raw
From b7dd708d309d86625e3d6cb2f479bed5e5b55ee1 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Wed, 29 Jun 2016 12:51:39 +0100
Subject: [PATCH] p2v: Colourize kernel-conversion status messages from
 virt-p2v.

The messages that come "through" from virt-v2v are already colourized.
However the other messages are not.  This colourizes the ones
generated during kernel-mode conversions.

Note that because of the way journal/syslog works we have to write the
ansi_restore before the end of line, thus code like this:

 ansi_magenta (stdout);
 printf ("%s: %s", guestfs_int_program_name, data);
 ansi_restore (stdout);
 putchar ('\n');

This also adds a "Conversion finished successfully" message (in green).

Thanks: Ming Xie
(cherry picked from commit b15b6e69e37cb3b6520d301442a67b9971ae8d51)
---
 p2v/kernel.c           | 23 +++++++++++++++++++----
 p2v/launch-virt-p2v.in |  4 ++--
 p2v/main.c             | 12 ++++++++++++
 p2v/p2v.h              |  3 +++
 p2v/virt-p2v.pod       |  9 +++++++++
 5 files changed, 45 insertions(+), 6 deletions(-)

diff --git a/p2v/kernel.c b/p2v/kernel.c
index 6d9388b..6914ab5 100644
--- a/p2v/kernel.c
+++ b/p2v/kernel.c
@@ -250,6 +250,11 @@ kernel_conversion (struct config *config, char **cmdline, int cmdline_source)
     exit (EXIT_FAILURE);
   }
 
+  ansi_green (stdout);
+  printf ("Conversion finished successfully.");
+  ansi_restore (stdout);
+  putchar ('\n');
+
   p = get_cmdline_key (cmdline, "p2v.post");
   if (!p) {
     if (geteuid () == 0 && cmdline_source == CMDLINE_SOURCE_PROC_CMDLINE)
@@ -264,8 +269,12 @@ notify_ui_callback (int type, const char *data)
 {
   switch (type) {
   case NOTIFY_LOG_DIR:
-    printf ("%s: remote log directory location: %s\n",
-            guestfs_int_program_name, data);
+    ansi_magenta (stdout);
+    printf ("%s: remote log directory location: ", guestfs_int_program_name);
+    ansi_red (stdout);
+    fputs (data, stdout);
+    ansi_restore (stdout);
+    putchar ('\n');
     break;
 
   case NOTIFY_REMOTE_MESSAGE:
@@ -273,12 +282,18 @@ notify_ui_callback (int type, const char *data)
     break;
 
   case NOTIFY_STATUS:
-    printf ("%s: %s\n", guestfs_int_program_name, data);
+    ansi_magenta (stdout);
+    printf ("%s: %s", guestfs_int_program_name, data);
+    ansi_restore (stdout);
+    putchar ('\n');
     break;
 
   default:
-    printf ("%s: unknown message during conversion: type=%d data=%s\n",
+    ansi_red (stdout);
+    printf ("%s: unknown message during conversion: type=%d data=%s",
             guestfs_int_program_name, type, data);
+    ansi_restore (stdout);
+    putchar ('\n');
   }
 
   fflush (stdout);
diff --git a/p2v/launch-virt-p2v.in b/p2v/launch-virt-p2v.in
index 3e4f1f9..ca971a0 100755
--- a/p2v/launch-virt-p2v.in
+++ b/p2v/launch-virt-p2v.in
@@ -23,7 +23,7 @@
 cmdline=$(</proc/cmdline)
 if [[ $cmdline == *p2v.server=* ]]; then
     # Non-GUI mode, don't run X.  Just run virt-p2v directly.
-    exec @libexecdir@/virt-p2v --iso
+    exec @libexecdir@/virt-p2v --iso --colours
 
 else
     # GUI mode.  Run xinit to start X.  To save one script, we invoke
@@ -32,7 +32,7 @@ else
         cd /
         metacity &
         nm-applet &
-        exec @libexecdir@/virt-p2v --iso
+        exec @libexecdir@/virt-p2v --iso --colours
     else
         xinit "$0" run
     fi
diff --git a/p2v/main.c b/p2v/main.c
index 99d0011..c5ab233 100644
--- a/p2v/main.c
+++ b/p2v/main.c
@@ -43,6 +43,7 @@ char **all_removable;
 char **all_interfaces;
 int is_iso_environment = 0;
 int feature_colours_option = 0;
+int force_colour = 0;
 
 static void udevadm_settle (void);
 static void set_config_defaults (struct config *config);
@@ -55,6 +56,10 @@ static const char options[] = "Vv";
 static const struct option long_options[] = {
   { "help", 0, 0, HELP_OPTION },
   { "cmdline", 1, 0, 0 },
+  { "color", 0, 0, 0 },
+  { "colors", 0, 0, 0 },
+  { "colour", 0, 0, 0 },
+  { "colours", 0, 0, 0 },
   { "iso", 0, 0, 0 },
   { "long-options", 0, 0, 0 },
   { "short-options", 0, 0, 0 },
@@ -77,6 +82,7 @@ usage (int status)
               "Options:\n"
               "  --help                 Display brief help\n"
               " --cmdline=CMDLINE       Used to debug command line parsing\n"
+              " --colours               Use ANSI colour sequences even if not tty\n"
               " --iso                   Running in the ISO environment\n"
               "  -v|--verbose           Verbose messages\n"
               "  -V|--version           Display version and exit\n"
@@ -158,6 +164,12 @@ main (int argc, char *argv[])
         cmdline = parse_cmdline_string (optarg);
         cmdline_source = CMDLINE_SOURCE_COMMAND_LINE;
       }
+      else if (STREQ (long_options[option_index].name, "color") ||
+               STREQ (long_options[option_index].name, "colour") ||
+               STREQ (long_options[option_index].name, "colors") ||
+               STREQ (long_options[option_index].name, "colours")) {
+        force_colour = 1;
+      }
       else if (STREQ (long_options[option_index].name, "iso")) {
         is_iso_environment = 1;
       }
diff --git a/p2v/p2v.h b/p2v/p2v.h
index 3e75690..52d5ccb 100644
--- a/p2v/p2v.h
+++ b/p2v/p2v.h
@@ -61,6 +61,9 @@ extern int is_iso_environment;
 /* True if virt-v2v supports the --colours option. */
 extern int feature_colours_option;
 
+/* virt-p2v --colours option (used by ansi_* macros). */
+extern int force_colour;
+
 /* config.c */
 struct config {
   int verbose;
diff --git a/p2v/virt-p2v.pod b/p2v/virt-p2v.pod
index 421925f..247acce 100644
--- a/p2v/virt-p2v.pod
+++ b/p2v/virt-p2v.pod
@@ -591,6 +591,15 @@ Display help.
 This is used for debugging. Instead of parsing the kernel command line
 from F</proc/cmdline>, parse the string parameter C<CMDLINE>.
 
+=item B<--colors>
+
+=item B<--colours>
+
+Use ANSI colour sequences to colourize messages.  This is the default
+when the output is a tty.  If the output of the program is redirected
+to a file, ANSI colour sequences are disabled unless you use this
+option.
+
 =item B<--iso>
 
 This flag is passed to virt-p2v when it is launched inside the
-- 
1.8.3.1