[Pkg-libvirt-commits] [libguestfs] 15/63: p2v/v2v: List output drivers in `virt-v2v --machine-readable', and use that in virt-p2v.
Hilko Bengen
bengen at moszumanska.debian.org
Fri Oct 3 14:43:25 UTC 2014
This is an automated email from the git hooks/post-receive script.
bengen pushed a commit to annotated tag debian/1%1.27.39-1
in repository libguestfs.
commit 03ed5a790b571db2ff5f96f58bdbc01af4646cb2
Author: Richard W.M. Jones <rjones at redhat.com>
Date: Tue Sep 2 19:34:09 2014 +0100
p2v/v2v: List output drivers in `virt-v2v --machine-readable', and use that in virt-p2v.
The new output of virt-v2v --machine-readable now lists the input and
output drivers available in the binary:
$ virt-v2v --machine-readable
virt-v2v
libguestfs-rewrite
input:disk
input:libvirt
input:libvirtxml
output:glance
output:libvirt
output:local
output:rhev
With this information, we can now pre-populate the virt-p2v GUI
combo box.
---
p2v/gui.c | 70 +++++++---
p2v/p2v.h | 4 +
p2v/ssh.c | 217 +++++++++++++++++++++---------
po/POTFILES-ml | 1 +
v2v/Makefile.am | 6 +-
v2v/TODO | 1 -
v2v/cmdline.ml | 2 +
v2v/input_disk.ml | 1 +
v2v/input_libvirt.ml | 1 +
v2v/input_libvirtxml.ml | 1 +
v2v/{output_local.ml => modules_list.ml} | 38 ++----
v2v/{output_local.ml => modules_list.mli} | 37 ++---
v2v/output_RHEV.ml | 1 +
v2v/output_glance.ml | 1 +
v2v/output_libvirt.ml | 1 +
v2v/output_local.ml | 1 +
16 files changed, 239 insertions(+), 144 deletions(-)
diff --git a/p2v/gui.c b/p2v/gui.c
index 430b18d..9cffd1b 100644
--- a/p2v/gui.c
+++ b/p2v/gui.c
@@ -90,6 +90,7 @@ static void test_connection_clicked (GtkWidget *w, gpointer data);
static void *test_connection_thread (void *data);
static void about_button_clicked (GtkWidget *w, gpointer data);
static void connection_next_clicked (GtkWidget *w, gpointer data);
+static void repopulate_output_combo (struct config *config);
static void
create_connection_dialog (struct config *config)
@@ -470,23 +471,7 @@ create_conversion_dialog (struct config *config)
0, 1, 0, 1, GTK_FILL, GTK_FILL, 1, 1);
o_combo = gtk_combo_box_new_text ();
gtk_widget_set_tooltip_markup (o_combo, _("<b>libvirt</b> means send the converted guest to libvirt-managed KVM on the conversion server. <b>local</b> means put it in a directory on the conversion server. <b>rhev</b> means write it to RHEV-M/oVirt. <b>glance</b> means write it to OpenStack Glance. See the virt-v2v(1) manual page for more information about output options."));
- /* XXX Add list of input and output drivers to virt-v2v --machine-readable
- * and pick them up for this list.
- */
- gtk_combo_box_append_text (GTK_COMBO_BOX (o_combo), "libvirt");
- gtk_combo_box_append_text (GTK_COMBO_BOX (o_combo), "local");
- gtk_combo_box_append_text (GTK_COMBO_BOX (o_combo), "rhev");
- gtk_combo_box_append_text (GTK_COMBO_BOX (o_combo), "glance");
- if (config->output) {
- if (STREQ (config->output, "libvirt"))
- gtk_combo_box_set_active (GTK_COMBO_BOX (o_combo), 0);
- else if (STREQ (config->output, "local") || STREQ (config->output, "disk"))
- gtk_combo_box_set_active (GTK_COMBO_BOX (o_combo), 1);
- else if (STREQ (config->output, "rhev") || STREQ (config->output, "ovirt"))
- gtk_combo_box_set_active (GTK_COMBO_BOX (o_combo), 2);
- else if (STREQ (config->output, "glance"))
- gtk_combo_box_set_active (GTK_COMBO_BOX (o_combo), 3);
- }
+ repopulate_output_combo (config);
gtk_table_attach (GTK_TABLE (output_tbl), o_combo,
1, 2, 0, 1, GTK_FILL, GTK_FILL, 1, 1);
@@ -627,6 +612,57 @@ show_conversion_dialog (void)
/* Show the conversion dialog. */
gtk_widget_show_all (conv_dlg);
+
+ /* output_drivers may have been updated, so repopulate o_combo. */
+ repopulate_output_combo (NULL);
+}
+
+static void
+repopulate_output_combo (struct config *config)
+{
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ CLEANUP_FREE char *output;
+ size_t i;
+
+ /* Which driver is currently selected? */
+ if (config && config->output)
+ output = strdup (config->output);
+ else
+ output = gtk_combo_box_get_active_text (GTK_COMBO_BOX (o_combo));
+
+ /* Remove existing rows in o_combo. */
+ model = gtk_combo_box_get_model (GTK_COMBO_BOX (o_combo));
+ while (gtk_tree_model_get_iter_first (model, &iter)) {
+ gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
+ }
+
+ /* List of output_drivers from virt-v2v not read yet, so present
+ * a standard set of drivers.
+ */
+ if (output_drivers == NULL) {
+ gtk_combo_box_append_text (GTK_COMBO_BOX (o_combo), "libvirt");
+ gtk_combo_box_append_text (GTK_COMBO_BOX (o_combo), "local");
+ gtk_combo_box_append_text (GTK_COMBO_BOX (o_combo), "rhev");
+ if (output == NULL || STREQ (output, "libvirt"))
+ gtk_combo_box_set_active (GTK_COMBO_BOX (o_combo), 0);
+ else if (STREQ (output, "local"))
+ gtk_combo_box_set_active (GTK_COMBO_BOX (o_combo), 1);
+ else if (STREQ (output, "rhev"))
+ gtk_combo_box_set_active (GTK_COMBO_BOX (o_combo), 2);
+ }
+ /* List of -o options read from remote virt-v2v --machine-readable. */
+ else {
+ for (i = 0; output_drivers[i] != NULL; ++i)
+ gtk_combo_box_append_text (GTK_COMBO_BOX (o_combo), output_drivers[i]);
+ if (output) {
+ for (i = 0; output_drivers[i] != NULL; ++i)
+ if (STREQ (output, output_drivers[i]))
+ gtk_combo_box_set_active (GTK_COMBO_BOX (o_combo), i);
+ }
+ else
+ gtk_combo_box_set_active (GTK_COMBO_BOX (o_combo), 0);
+ }
}
static void
diff --git a/p2v/p2v.h b/p2v/p2v.h
index 3ada7b6..6067d5f 100644
--- a/p2v/p2v.h
+++ b/p2v/p2v.h
@@ -109,6 +109,10 @@ extern int v2v_major;
extern int v2v_minor;
extern int v2v_release;
+/* input and output drivers (read from remote). */
+extern char **input_drivers;
+extern char **output_drivers;
+
/* authors.c */
extern const char *authors[];
diff --git a/p2v/ssh.c b/p2v/ssh.c
index 993beb4..15ca50c 100644
--- a/p2v/ssh.c
+++ b/p2v/ssh.c
@@ -59,6 +59,8 @@
int v2v_major;
int v2v_minor;
int v2v_release;
+char **input_drivers = NULL;
+char **output_drivers = NULL;
static char *ssh_error;
@@ -98,7 +100,9 @@ static void free_regexps (void) __attribute__((destructor));
static pcre *password_re;
static pcre *prompt_re;
static pcre *version_re;
-static pcre *libguestfs_rewrite_re;
+static pcre *feature_libguestfs_rewrite_re;
+static pcre *feature_input_re;
+static pcre *feature_output_re;
static pcre *portfwd_re;
static void
@@ -123,7 +127,9 @@ compile_regexps (void)
COMPILE (prompt_re, "###([0123456789abcdefghijklmnopqrstuvwxyz]{8})### ", 0);
COMPILE (version_re,
"virt-v2v ([1-9]\\d*)\\.([1-9]\\d*)\\.([1-9]\\d*)", 0);
- COMPILE (libguestfs_rewrite_re, "libguestfs-rewrite", 0);
+ COMPILE (feature_libguestfs_rewrite_re, "libguestfs-rewrite", 0);
+ COMPILE (feature_input_re, "input:(\\w*)", 0);
+ COMPILE (feature_output_re, "output:(\\w*)", 0);
COMPILE (portfwd_re, "Allocated port (\\d+) for remote forward", 0);
}
@@ -133,7 +139,9 @@ free_regexps (void)
pcre_free (password_re);
pcre_free (prompt_re);
pcre_free (version_re);
- pcre_free (libguestfs_rewrite_re);
+ pcre_free (feature_libguestfs_rewrite_re);
+ pcre_free (feature_input_re);
+ pcre_free (feature_output_re);
pcre_free (portfwd_re);
}
@@ -319,6 +327,9 @@ start_ssh (struct config *config, char **extra_args, int wait_prompt)
return h;
}
+static void add_input_driver (const char *name, size_t len);
+static void add_output_driver (const char *name, size_t len);
+
#pragma GCC diagnostic ignored "-Wsuggest-attribute=noreturn" /* WTF? */
int
test_connection (struct config *config)
@@ -341,54 +352,62 @@ test_connection (struct config *config)
return -1;
}
- switch (mexp_expect (h,
- (mexp_regexp[]) {
- { 100, .re = version_re },
- { 101, .re = prompt_re },
- { 0 }
- }, ovector, ovecsize)) {
- case 100: /* Got version string. */
- major_str = strndup (&h->buffer[ovector[2]], ovector[3]-ovector[2]);
- minor_str = strndup (&h->buffer[ovector[4]], ovector[5]-ovector[4]);
- release_str = strndup (&h->buffer[ovector[6]], ovector[7]-ovector[6]);
- sscanf (major_str, "%d", &v2v_major);
- sscanf (minor_str, "%d", &v2v_minor);
- sscanf (release_str, "%d", &v2v_release);
+ for (;;) {
+ switch (mexp_expect (h,
+ (mexp_regexp[]) {
+ { 100, .re = version_re },
+ { 101, .re = prompt_re },
+ { 0 }
+ }, ovector, ovecsize)) {
+ case 100: /* Got version string. */
+ major_str = strndup (&h->buffer[ovector[2]], ovector[3]-ovector[2]);
+ minor_str = strndup (&h->buffer[ovector[4]], ovector[5]-ovector[4]);
+ release_str = strndup (&h->buffer[ovector[6]], ovector[7]-ovector[6]);
+ sscanf (major_str, "%d", &v2v_major);
+ sscanf (minor_str, "%d", &v2v_minor);
+ sscanf (release_str, "%d", &v2v_release);
#if DEBUG_STDERR
- fprintf (stderr, "%s: remote virt-v2v version: %d.%d.%d\n",
- program_name, v2v_major, v2v_minor, v2v_release);
+ fprintf (stderr, "%s: remote virt-v2v version: %d.%d.%d\n",
+ program_name, v2v_major, v2v_minor, v2v_release);
#endif
- if (v2v_major < 1 || v2v_major > 1) {
+ if (v2v_major < 1 || v2v_major > 1) {
+ mexp_close (h);
+ set_ssh_error ("invalid version major (%d)", v2v_major);
+ return -1;
+ }
+ break;
+
+ case 101: /* Got the prompt. */
+ goto end_of_version;
+
+ case MEXP_EOF:
mexp_close (h);
- set_ssh_error ("invalid version major (%d)", v2v_major);
+ set_ssh_error ("unexpected end of file waiting virt-v2v -V output");
return -1;
- }
- break;
-
- case 101: /* Got the prompt, but no version string. */
- mexp_close (h);
- set_ssh_error ("virt-v2v is not installed on the conversion server, "
- "or it might be a too old version");
- return -1;
- case MEXP_EOF:
- mexp_close (h);
- set_ssh_error ("unexpected end of file waiting virt-v2v -V output");
- return -1;
+ case MEXP_TIMEOUT:
+ mexp_close (h);
+ set_ssh_error ("timeout waiting for virt-v2v -V output");
+ return -1;
- case MEXP_TIMEOUT:
- mexp_close (h);
- set_ssh_error ("timeout waiting for virt-v2v -V output");
- return -1;
+ case MEXP_ERROR:
+ set_ssh_error ("mexp_expect: %m");
+ mexp_close (h);
+ return -1;
- case MEXP_ERROR:
- set_ssh_error ("mexp_expect: %m");
- mexp_close (h);
- return -1;
+ case MEXP_PCRE_ERROR:
+ set_ssh_error ("PCRE error: %d\n", h->pcre_error);
+ mexp_close (h);
+ return -1;
+ }
+ }
+ end_of_version:
- case MEXP_PCRE_ERROR:
- set_ssh_error ("PCRE error: %d\n", h->pcre_error);
+ /* Got the prompt but no version number. */
+ if (v2v_major == 0) {
mexp_close (h);
+ set_ssh_error ("virt-v2v is not installed on the conversion server, "
+ "or it might be a too old version");
return -1;
}
@@ -400,35 +419,58 @@ test_connection (struct config *config)
return -1;
}
- switch (mexp_expect (h,
- (mexp_regexp[]) {
- { 100, .re = libguestfs_rewrite_re },
- { 0 }
- }, ovector, ovecsize)) {
- case 100: /* Got feature: libguestfs-rewrite. */
- feature_libguestfs_rewrite = 1;
- break;
+ for (;;) {
+ CLEANUP_FREE char *feature = NULL;
- case MEXP_EOF:
- mexp_close (h);
- set_ssh_error ("unexpected end of file waiting virt-v2v --machine-readable output");
- return -1;
+ switch (mexp_expect (h,
+ (mexp_regexp[]) {
+ { 100, .re = feature_libguestfs_rewrite_re },
+ { 101, .re = feature_input_re },
+ { 102, .re = feature_output_re },
+ { 103, .re = prompt_re },
+ { 0 }
+ }, ovector, ovecsize)) {
+ case 100: /* libguestfs-rewrite. */
+ feature_libguestfs_rewrite = 1;
+ break;
- case MEXP_TIMEOUT:
- mexp_close (h);
- set_ssh_error ("timeout waiting virt-v2v --machine-readable output");
- return -1;
+ case 101:
+ /* input:<driver-name> corresponds to an -i option in virt-v2v. */
+ add_input_driver (&h->buffer[ovector[2]],
+ (size_t) (ovector[3]-ovector[2]));
+ break;
- case MEXP_ERROR:
- set_ssh_error ("mexp_expect: %m");
- mexp_close (h);
- return -1;
+ case 102:
+ /* output:<driver-name> corresponds to an -o option in virt-v2v. */
+ add_output_driver (&h->buffer[ovector[2]],
+ (size_t) (ovector[3]-ovector[2]));
+ break;
- case MEXP_PCRE_ERROR:
- set_ssh_error ("PCRE error: %d\n", h->pcre_error);
- mexp_close (h);
- return -1;
+ case 103: /* Got prompt, so end of output. */
+ goto end_of_machine_readable;
+
+ case MEXP_EOF:
+ mexp_close (h);
+ set_ssh_error ("unexpected end of file waiting virt-v2v --machine-readable output");
+ return -1;
+
+ case MEXP_TIMEOUT:
+ mexp_close (h);
+ set_ssh_error ("timeout waiting virt-v2v --machine-readable output");
+ return -1;
+
+ case MEXP_ERROR:
+ set_ssh_error ("mexp_expect: %m");
+ mexp_close (h);
+ return -1;
+
+ case MEXP_PCRE_ERROR:
+ set_ssh_error ("PCRE error: %d\n", h->pcre_error);
+ mexp_close (h);
+ return -1;
+ }
}
+ end_of_machine_readable:
if (!feature_libguestfs_rewrite) {
mexp_close (h);
@@ -473,6 +515,49 @@ test_connection (struct config *config)
return 0;
}
+static void
+add_option (const char *type, char ***drivers, const char *name, size_t len)
+{
+ size_t n;
+
+ if (*drivers == NULL)
+ n = 0;
+ else
+ n = guestfs___count_strings (*drivers);
+
+ n++;
+
+ *drivers = realloc (*drivers, (n+1) * sizeof (char *));
+ if (*drivers == NULL) {
+ perror ("malloc");
+ exit (EXIT_FAILURE);
+ }
+
+ (*drivers)[n-1] = strndup (name, len);
+ if ((*drivers)[n-1] == NULL) {
+ perror ("strndup");
+ exit (EXIT_FAILURE);
+ }
+ (*drivers)[n] = NULL;
+
+#if DEBUG_STDERR
+ fprintf (stderr, "%s: remote virt-v2v supports %s driver %s\n",
+ program_name, type, (*drivers)[n-1]);
+#endif
+}
+
+static void
+add_input_driver (const char *name, size_t len)
+{
+ add_option ("input", &input_drivers, name, len);
+}
+
+static void
+add_output_driver (const char *name, size_t len)
+{
+ add_option ("output", &output_drivers, name, len);
+}
+
/* The p2v ISO should allow us to open up just about any port. */
static int nbd_local_port = 50123;
diff --git a/po/POTFILES-ml b/po/POTFILES-ml
index 9804e7a..53a7bfb 100644
--- a/po/POTFILES-ml
+++ b/po/POTFILES-ml
@@ -92,6 +92,7 @@ v2v/input_libvirt.ml
v2v/input_libvirtxml.ml
v2v/lib_esx.ml
v2v/lib_linux.ml
+v2v/modules_list.ml
v2v/output_RHEV.ml
v2v/output_glance.ml
v2v/output_libvirt.ml
diff --git a/v2v/Makefile.am b/v2v/Makefile.am
index e0f6983..b74325e 100644
--- a/v2v/Makefile.am
+++ b/v2v/Makefile.am
@@ -31,11 +31,12 @@ SOURCES_MLI = \
convert_windows.mli \
DOM.mli \
domainxml.mli \
- lib_esx.mli \
- lib_linux.mli \
input_disk.mli \
input_libvirt.mli \
input_libvirtxml.mli \
+ lib_esx.mli \
+ lib_linux.mli \
+ modules_list.mli \
output_glance.mli \
output_libvirt.mli \
output_local.mli \
@@ -52,6 +53,7 @@ SOURCES_ML = \
DOM.ml \
lib_esx.ml \
lib_linux.ml \
+ modules_list.ml \
input_disk.ml \
input_libvirtxml.ml \
input_libvirt.ml \
diff --git a/v2v/TODO b/v2v/TODO
index c7fb6fa..bbc6134 100644
--- a/v2v/TODO
+++ b/v2v/TODO
@@ -14,7 +14,6 @@ p2v:
- why is the Back button insensitive?
p2v/gui.c: /* XXX It would be nice not to have to set this explicitly, but
-p2v/gui.c: /* XXX Add list of input and output drivers to virt-v2v --machine-re
p2v/main.c:/* XXX Copied from fish/options.c. */
v2v/convert_linux.ml: (* Get/construct the version. XXX Read this fro
v2v/convert_linux.ml: [ "sym53c8xx" (* XXX why not "ide"? *) ] in
diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml
index d2378f2..bcf718e 100644
--- a/v2v/cmdline.ml
+++ b/v2v/cmdline.ml
@@ -201,6 +201,8 @@ read the man page virt-v2v(1).
if args = [] && machine_readable then (
printf "virt-v2v\n";
printf "libguestfs-rewrite\n";
+ List.iter (printf "input:%s\n") (Modules_list.input_modules ());
+ List.iter (printf "output:%s\n") (Modules_list.output_modules ());
exit 0
);
diff --git a/v2v/input_disk.ml b/v2v/input_disk.ml
index 00a7614..aa4d409 100644
--- a/v2v/input_disk.ml
+++ b/v2v/input_disk.ml
@@ -90,3 +90,4 @@ class input_disk verbose input_format disk = object
end
let input_disk = new input_disk
+let () = Modules_list.register_input_module "disk"
diff --git a/v2v/input_libvirt.ml b/v2v/input_libvirt.ml
index f75df00..b899d59 100644
--- a/v2v/input_libvirt.ml
+++ b/v2v/input_libvirt.ml
@@ -88,3 +88,4 @@ object
end
let input_libvirt = new input_libvirt
+let () = Modules_list.register_input_module "libvirt"
diff --git a/v2v/input_libvirtxml.ml b/v2v/input_libvirtxml.ml
index 4f9cc15..730ed0a 100644
--- a/v2v/input_libvirtxml.ml
+++ b/v2v/input_libvirtxml.ml
@@ -277,3 +277,4 @@ object
end
let input_libvirtxml = new input_libvirtxml
+let () = Modules_list.register_input_module "libvirtxml"
diff --git a/v2v/output_local.ml b/v2v/modules_list.ml
similarity index 51%
copy from v2v/output_local.ml
copy to v2v/modules_list.ml
index c6e5992..7fedc77 100644
--- a/v2v/output_local.ml
+++ b/v2v/modules_list.ml
@@ -16,35 +16,13 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*)
-open Printf
+let input_modules = ref []
+and output_modules = ref []
-open Common_gettext.Gettext
-open Common_utils
+let register_input_module name =
+ input_modules := name :: !input_modules
+and register_output_module name =
+ output_modules := name :: !output_modules
-open Types
-open Utils
-
-class output_local verbose dir = object
- inherit output verbose
-
- method as_options = sprintf "-o local -os %s" dir
-
- method prepare_targets source targets =
- List.map (
- fun t ->
- let target_file = dir // source.s_name ^ "-" ^ t.target_overlay.ov_sd in
- { t with target_file = target_file }
- ) targets
-
- method create_metadata source targets guestcaps _ =
- let doc = Output_libvirt.create_libvirt_xml source targets guestcaps in
-
- let name = source.s_name in
- let file = dir // name ^ ".xml" in
-
- let chan = open_out file in
- DOM.doc_to_chan chan doc;
- close_out chan
-end
-
-let output_local = new output_local
+let input_modules () = List.sort compare !input_modules
+and output_modules () = List.sort compare !output_modules
diff --git a/v2v/output_local.ml b/v2v/modules_list.mli
similarity index 51%
copy from v2v/output_local.ml
copy to v2v/modules_list.mli
index c6e5992..805ba8d 100644
--- a/v2v/output_local.ml
+++ b/v2v/modules_list.mli
@@ -16,35 +16,16 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*)
-open Printf
+(** List of input and output modules. *)
-open Common_gettext.Gettext
-open Common_utils
+val register_input_module : string -> unit
+(** Register an input module by name. *)
-open Types
-open Utils
+val register_output_module : string -> unit
+(** Register an output module by name. *)
-class output_local verbose dir = object
- inherit output verbose
+val input_modules : unit -> string list
+(** Return the list of input modules. *)
- method as_options = sprintf "-o local -os %s" dir
-
- method prepare_targets source targets =
- List.map (
- fun t ->
- let target_file = dir // source.s_name ^ "-" ^ t.target_overlay.ov_sd in
- { t with target_file = target_file }
- ) targets
-
- method create_metadata source targets guestcaps _ =
- let doc = Output_libvirt.create_libvirt_xml source targets guestcaps in
-
- let name = source.s_name in
- let file = dir // name ^ ".xml" in
-
- let chan = open_out file in
- DOM.doc_to_chan chan doc;
- close_out chan
-end
-
-let output_local = new output_local
+val output_modules : unit -> string list
+(** Return the list of output modules. *)
diff --git a/v2v/output_RHEV.ml b/v2v/output_RHEV.ml
index 2e09c77..bfcb0cc 100644
--- a/v2v/output_RHEV.ml
+++ b/v2v/output_RHEV.ml
@@ -720,3 +720,4 @@ object
end
let output_rhev = new output_rhev
+let () = Modules_list.register_output_module "rhev"
diff --git a/v2v/output_glance.ml b/v2v/output_glance.ml
index f858f91..936f1d5 100644
--- a/v2v/output_glance.ml
+++ b/v2v/output_glance.ml
@@ -126,3 +126,4 @@ object
end
let output_glance = new output_glance
+let () = Modules_list.register_output_module "glance"
diff --git a/v2v/output_libvirt.ml b/v2v/output_libvirt.ml
index 5621c0b..927beba 100644
--- a/v2v/output_libvirt.ml
+++ b/v2v/output_libvirt.ml
@@ -275,3 +275,4 @@ class output_libvirt verbose oc output_pool = object
end
let output_libvirt = new output_libvirt
+let () = Modules_list.register_output_module "libvirt"
diff --git a/v2v/output_local.ml b/v2v/output_local.ml
index c6e5992..db36f0e 100644
--- a/v2v/output_local.ml
+++ b/v2v/output_local.ml
@@ -48,3 +48,4 @@ class output_local verbose dir = object
end
let output_local = new output_local
+let () = Modules_list.register_output_module "local"
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-libvirt/libguestfs.git
More information about the Pkg-libvirt-commits
mailing list