[virt-tools-list] [libosinfo 1/2] Add utility app that detects OS given a media

Zeeshan Ali (Khattak) zeeshanak at gnome.org
Mon Aug 29 20:30:13 UTC 2011


From: "Zeeshan Ali (Khattak)" <zeeshanak at gnome.org>

Given a path to a ISO9660 image/device, detects if media is bootable and
the relavent OS if media is an installer for it.
---
 Makefile.am           |    2 +-
 configure.ac          |    1 +
 tools/Makefile.am     |   15 +++++++
 tools/osinfo-detect.c |  111 +++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 128 insertions(+), 1 deletions(-)
 create mode 100644 tools/Makefile.am
 create mode 100644 tools/osinfo-detect.c

diff --git a/Makefile.am b/Makefile.am
index 92220ea..8ee8bb0 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,5 +1,5 @@
 
-SUBDIRS = osinfo test data docs examples scripts
+SUBDIRS = osinfo test data tools docs examples scripts
 
 EXTRA_DIST = \
   COPYING.LIB \
diff --git a/configure.ac b/configure.ac
index bf5681b..324c0a1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -118,6 +118,7 @@ AC_CONFIG_FILES([
 	data/devices/Makefile
 	data/hypervisors/Makefile
 	data/oses/Makefile
+	tools/Makefile
 	scripts/Makefile
 	test/Makefile
 	docs/Makefile
diff --git a/tools/Makefile.am b/tools/Makefile.am
new file mode 100644
index 0000000..4de1e8f
--- /dev/null
+++ b/tools/Makefile.am
@@ -0,0 +1,15 @@
+AM_CFLAGS = $(GOBJECT_CFLAGS) \
+	    $(GIO_CFLAGS)     \
+	    $(LIBXML_CFLAGS)  \
+	    -I$(top_srcdir)
+
+bin_PROGRAMS = osinfo-detect
+
+osinfo_detect_SOURCES = osinfo-detect.c
+
+osinfo_detect_LDADD = $(GOBJECT_LIBS) 	     \
+		      $(GIO_LIBS)     	     \
+		      $(LIBXML_LIBS)  	     \
+		      -L$(top_srcdir)/osinfo \
+		      -losinfo-1.0
+
diff --git a/tools/osinfo-detect.c b/tools/osinfo-detect.c
new file mode 100644
index 0000000..029b6b6
--- /dev/null
+++ b/tools/osinfo-detect.c
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2011 Red Hat, Inc
+ *
+ * osinfo-detect: Given a path to a ISO9660 image/device, detects if media is
+ *                bootable and the relavent OS if media is an installer for it.
+ *
+ * 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.
+ *
+ * Authors:
+ *   Zeeshan Ali <zeenix at redhat.com>
+ */
+
+#include <osinfo/osinfo.h>
+
+static gboolean print_env = FALSE;
+
+static GOptionEntry entries[] =
+{
+    { "print-env", 'e', 0,
+      G_OPTION_ARG_NONE, &print_env,
+      "Print information in the form of environment variables.", NULL },
+    { NULL }
+};
+
+gint main(gint argc, gchar **argv)
+{
+    GOptionContext *context;
+    GError *error = NULL;
+    OsinfoMedia *media = NULL;
+    OsinfoLoader *loader = NULL;
+    OsinfoDb *db = NULL;
+    OsinfoOs *os = NULL;
+    gint ret = 0;
+
+    context = g_option_context_new("- Detect if media is bootable " \
+                                   "and the relavent OS and distribution.");
+    /* FIXME: We don't have a gettext package to pass to this function. */
+    g_option_context_add_main_entries(context, entries, NULL);
+    if (!g_option_context_parse(context, &argc, &argv, &error)) {
+        g_printerr("Error while parsing options: %s\n", error->message);
+        g_printerr("%s\n", g_option_context_get_help(context, FALSE, NULL));
+
+        ret = -1;
+        goto EXIT;
+    }
+
+    if (argc < 2) {
+        g_printerr("%s\n", g_option_context_get_help(context, FALSE, NULL));
+
+        ret = -2;
+        goto EXIT;
+    }
+
+    g_type_init();
+
+    media = osinfo_media_create_from_location(argv[1], NULL, &error);
+    if (error != NULL)
+        if (error->code != OSINFO_MEDIA_ERROR_NOT_BOOTABLE) {
+            g_printerr("Error parsing media: %s\n", error->message);
+
+            ret = -3;
+            goto EXIT;
+        } else
+            if (print_env)
+                g_print("OSINFO_BOOTABLE=0\n");
+            else
+                g_print("Media is not bootable.\n");
+
+    if (print_env)
+        g_print("OSINFO_BOOTABLE=1\n");
+    else
+        g_print("Media is bootable.\n");
+
+    loader = osinfo_loader_new();
+    osinfo_loader_process_default_path(loader, &error);
+    if (error != NULL) {
+        g_printerr("Error loading OS data: %s\n", error->message);
+
+        ret = -4;
+        goto EXIT;
+    }
+
+    db = osinfo_loader_get_db(loader);
+    os = osinfo_db_guess_os_from_media(db, media);
+    if (os != NULL)
+        if (print_env)
+            g_print("OSINFO_INSTALLER=%s\n",
+                    osinfo_entity_get_id(OSINFO_ENTITY(os)));
+        else
+            g_print("Media is an installer for OS '%s'\n",
+                    osinfo_product_get_name(OSINFO_PRODUCT(os)));
+
+EXIT:
+    g_clear_error(&error);
+    g_clear_object(&loader);
+    g_option_context_free(context);
+
+    return ret;
+}
-- 
1.7.6




More information about the virt-tools-list mailing list