[ovs-dev] [PATCH v2 2/6] ovs-ofctl: declare / set up colors for command output

Quentin Monnet quentin.monnet at 6wind.com
Mon Feb 15 15:20:51 UTC 2016


OVS_COLORS environment variable is parsed to extract user-defined
preferences regarding colors (this is used to set up a color theme, not
to replace the `--color` option for activating color output).

The string should be of a format similar to LS_COLORS or GREP_COLORS,
with available colors being as follows:

* ac: action field
* dr: drop keyword
* le: learn keyword
* pm: parameters receiving attributes
* pr: keyword having parenthesis
* sp: some special keywords
* vl: lone values with no parameter name

For color whose idendifier does not appear in the string, the default
hardcoded value is used instead.

As an example, setting OVS_COLORS to the following string is equivalent
to using the default values:

    OVS_COLORS="ac:01;31:dr=34:le=31:pm=36:pr=35:sp=33:vl=32"

Signed-off-by: Quentin Monnet <quentin.monnet at 6wind.com>
---
 lib/automake.mk       |   2 +
 lib/colors.c          | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++
 lib/colors.h          |  36 ++++++++++++++
 utilities/ovs-ofctl.c |   4 ++
 4 files changed, 174 insertions(+)
 create mode 100644 lib/colors.c
 create mode 100644 lib/colors.h

diff --git a/lib/automake.mk b/lib/automake.mk
index 27a16691ebda..1eeb5e48b19a 100644
--- a/lib/automake.mk
+++ b/lib/automake.mk
@@ -40,6 +40,8 @@ lib_libopenvswitch_la_SOURCES = \
 	lib/classifier-private.h \
 	lib/cmap.c \
 	lib/cmap.h \
+	lib/colors.c \
+	lib/colors.h \
 	lib/command-line.c \
 	lib/command-line.h \
 	lib/compiler.h \
diff --git a/lib/colors.c b/lib/colors.c
new file mode 100644
index 000000000000..28548d5836bc
--- /dev/null
+++ b/lib/colors.c
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2016 6WIND S.A.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Handle color setup for output.
+ * See dynamic-strings.{c,h} for the functions that are responsible for
+ * printing the color markers.
+ */
+
+#include <config.h>
+
+#include "colors.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "util.h"
+
+/* Returns a pointer to the variable containing a given color */
+static const char **get_color(const char * name);
+
+/* Extract user-defined colors from OVS_COLORS environment variable */
+static void colors_parse_from_env(void);
+
+struct color_struct {
+  const char *name;
+  const char **var_ptr;
+};
+
+/* Color IDs to use in OVS_COLORS environment variable to use custem colors */
+static const struct color_struct color_identification[] =
+{
+  { "ac", &actions_color},
+  { "dr", &drop_color},
+  { "le", &learn_color},
+  { "pm", &param_color},
+  { "pr", &paren_color},
+  { "sp", &special_color},
+  { "vl", &value_color},
+  { NULL, NULL}
+};
+
+static const char **
+get_color(const char *name)
+{
+  const struct color_struct *color;
+  for (color = color_identification; color->name; color++) {
+    if (!strcmp(color->name, name)) {
+      return color->var_ptr;
+    }
+  }
+  return NULL;
+}
+
+void
+colors_init(void)
+{
+  /* Color codes; variables are declared in header file */
+  actions_color = "01;31";  /* bold red */
+  drop_color    = "34";     /* blue */
+  learn_color   = "31";     /* red */
+  param_color   = "36";     /* cyan */
+  paren_color   = "35";     /* magenta */
+  special_color = "33";     /* yellow */
+  value_color   = "32";     /* green */
+
+  /* Overwrite with user-defined color markers */
+  colors_parse_from_env();
+}
+
+/* Colorized output: get user-defined colors from OVS_COLORS environment
+ * variable. This must be a string of the form:
+ *     ac=01;31:r=34:le=:pm=02;32:pr=01;30
+ * (see color_identification[] above for all color names)
+ * If a color is missing from this string, default value is used instead.
+ * If a color name is assigned an empty or incorrect value (i.e. something
+ * containing characters other than decimals and ';'), fields using this color
+ * will not be highlighted.
+ * Unknown color names are ignored so as to ensure forward compatibility.
+ */
+static void
+colors_parse_from_env(void)
+{
+  const char *color_str;
+  char *s;
+  char *token;
+
+  color_str = getenv("OVS_COLORS");
+  if (color_str == NULL || *color_str == '\0')
+  {
+    return;
+  }
+  s = strdup(color_str);
+
+  /* Loop on tokens: they are separated by columns ':' */
+  for (token = strsep(&s, ":");
+       token != NULL;
+       token = strsep(&s, ":")) {
+    char *ptr;
+    char *name = strsep(&token, "=");
+    for (ptr = token; ptr != NULL && *ptr != '\0'; ptr++) {
+      /* We accept only decimals and ';' for color marker */
+      if (*ptr == ';' || (*ptr >= '0' && *ptr <= '9')) {
+        continue;
+      }
+      name = NULL;
+      break;
+    }
+    if (name != NULL) {
+      /* We found a name and marker contains only decimals and ';'
+       * Try to get a pointer to associated color variable
+       */
+      const char **color_var_ptr = get_color(name);
+      /* If we know that color, update its value */
+      if (color_var_ptr != NULL) {
+        *color_var_ptr = token;
+      }
+    }
+  }
+}
diff --git a/lib/colors.h b/lib/colors.h
new file mode 100644
index 000000000000..4489690c4235
--- /dev/null
+++ b/lib/colors.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2016 6WIND S.A.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef COLORS_H
+#define COLORS_H 1
+
+/* Variables containing color codes. */
+const char *actions_color;
+const char *drop_color;
+const char *learn_color;
+const char *param_color;
+const char *paren_color;
+const char *special_color;
+const char *value_color;
+
+/* Select Graphic Rendition (SGR, "\33[...m") strings.
+ * Also Erase in Line (EL) to Right ("\33[K"). */
+static const char *sgr_start = "\33[%sm\33[K";
+static const char *sgr_end   = "\33[m\33[K";
+
+void colors_init(void);
+
+#endif /* colors.h */
diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c
index a7dea78bcd3a..791c51f7e231 100644
--- a/utilities/ovs-ofctl.c
+++ b/utilities/ovs-ofctl.c
@@ -33,6 +33,7 @@
 #include "classifier.h"
 #include "command-line.h"
 #include "daemon.h"
+#include "colors.h"
 #include "compiler.h"
 #include "dirs.h"
 #include "dynamic-string.h"
@@ -368,6 +369,9 @@ parse_options(int argc, char *argv[])
     if (color_option == 2) {
       color_option = isatty(STDOUT_FILENO) && t && strcmp(t, "dumb") != 0;
     }
+    if (color_option != 0) {
+      colors_init();
+    }
 }
 
 static void
-- 
1.9.1




More information about the dev mailing list