Mohammed Morsi
2009-Jul-13 20:50 UTC
[Ovirt-devel] [PATCH viewer] permit hostname / username / password / vm to be passed in via the cmd line
passing in --hostname <value> will bypass the hostname form passing --username <value> --password <value> will bypass the login form passing in --vm <name> will attempt to connect to the vm on login --- internal.h | 9 ++++- main.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++---------- wui_thread.c | 15 +-------- 3 files changed, 90 insertions(+), 34 deletions(-) diff --git a/internal.h b/internal.h index bd65922..8a857eb 100644 --- a/internal.h +++ b/internal.h @@ -70,10 +70,15 @@ extern gboolean check_cert; /* server we're connecting to */ extern const char* hostname; +extern const char* username; +extern const char* password; /* port which to connect to the server via vnc */ extern int ovirt_server_vnc_port; +/* selected vm name which to automatically connect to */ +extern const char* selected_vm_name; + /* vm currently in focus */ extern struct vm* vm_in_focus; @@ -101,8 +106,8 @@ extern void wui_thread_send_connect (const char *uri); /* Disconnect, forget URI, credentials, VMs etc. */ extern void wui_thread_send_disconnect (void); -/* Set the username and password and tell the WUI to try to log in. */ -extern void wui_thread_send_login (const char *username, const char *password); +/* tell the WUI to try to log in with the username / password variables above */ +extern void wui_thread_send_login (void); /* Tell the WUI thread to refresh the VM list. Note that the WUI * thread does this automatically anyway after a successful login, and diff --git a/main.c b/main.c index dd26c93..1822fdb 100644 --- a/main.c +++ b/main.c @@ -73,7 +73,8 @@ gboolean check_cert = FALSE; // do we want this enabled by default ? static GSList *vmlist = NULL; /* internal.h shared constructs */ -const char* hostname; +const char *hostname, *username, *password; +const char* selected_vm_name; struct vm* vm_in_focus; int ovirt_server_vnc_port = 5900; @@ -82,10 +83,14 @@ static void start_ui (void); static GtkWidget *menu_item_new (int which_menu); static void refresh_menu_vm_list (GtkWidget *, gpointer); static void connect_to_wui_on_enter (GtkWidget *, gpointer); -static void connect_to_wui (GtkWidget *, gpointer); +static void connect_to_wui_via_widget (GtkWidget *, gpointer); +static void connect_to_wui (); static void send_key_to_vm (GtkWidget *widget, gpointer _keyComboDef); static void login_to_wui_on_enter (GtkWidget *, gpointer); -static void login_to_wui (GtkWidget *, gpointer); +static void login_to_wui_via_widget (GtkWidget *, gpointer); +static void login_to_wui (); +static void connect_to_vm_name (const char* vm_name); +static void connect_to_vm (struct vm*); static gboolean delete_event (GtkWidget *widget, GdkEvent *event, gpointer data); static void destroy (GtkWidget *widget, gpointer data); static void clear_connectmenu (void); @@ -201,12 +206,20 @@ static const char *help_msg "Use '" PACKAGE " --help' to see a list of available command line options"; static const GOptionEntry options[] = { - { "port", 'p', 0, G_OPTION_ARG_INT, &ovirt_server_vnc_port, + { "hostname", 'H', 0, G_OPTION_ARG_STRING, &hostname, + "hostname of the server to connect to", NULL}, + { "port", 'P', 0, G_OPTION_ARG_INT, &ovirt_server_vnc_port, "set port which to connect to server via vnc", NULL }, + { "username", 'u', 0, G_OPTION_ARG_STRING, &username, + "username which to connect to the server with", NULL}, + { "password", 'p', 0, G_OPTION_ARG_STRING, &password, + "password which to connect to the server with", NULL}, { "cainfo", 0, 0, G_OPTION_ARG_STRING, &cainfo, "set the path of the CA certificate bundle", NULL }, { "check-certificate", 0, 0, G_OPTION_ARG_NONE, &check_cert, "check the SSL certificate of the server", NULL }, + { "vm", 'm', 0, G_OPTION_ARG_STRING, &selected_vm_name, + "name of the vm which to connect to on login", NULL}, { "debug", 'd', 0, G_OPTION_ARG_NONE, &debug, "turn on debugging messages", NULL }, { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, @@ -279,6 +292,29 @@ main (int argc, char *argv[]) start_wui_thread (); start_ui (); + // if parameters were passed in via + // cmd line, perform necessary operations + // (and thus hostname/login dialogs won't + // be displayed later on) + if (hostname != NULL && !STREQ (hostname, "")){ + g_print("connecting to %s, may take a moment\n", hostname); + connect_to_wui(); + while(!wui_thread_is_connected()) sleep(1); + + if (username != NULL && !STREQ (username, "")){ + g_print("logging in as %s, may take a moment\n", username); + login_to_wui(); + while(!wui_thread_is_logged_in()) sleep(1); + + if (selected_vm_name != NULL && !STREQ(selected_vm_name, "")){ + g_print("waiting for list of vms, may take a moment\n"); + while(!wui_thread_has_valid_vmlist()) sleep(1); + connect_to_vm_name(selected_vm_name); + + } + } + } + DEBUG ("entering the Gtk main loop"); gtk_main (); @@ -420,7 +456,7 @@ start_ui (void) g_signal_connect (G_OBJECT (ca_hostname), "key-release-event", G_CALLBACK (connect_to_wui_on_enter), NULL); g_signal_connect (G_OBJECT (ca_button), "clicked", - G_CALLBACK (connect_to_wui), NULL); + G_CALLBACK (connect_to_wui_via_widget), NULL); login_area = gtk_event_box_new (); la_vbox = gtk_vbox_new (FALSE, 0); @@ -448,7 +484,7 @@ start_ui (void) g_signal_connect (G_OBJECT (la_password), "key-release-event", G_CALLBACK (login_to_wui_on_enter), NULL); g_signal_connect (G_OBJECT (la_button), "clicked", - G_CALLBACK (login_to_wui), NULL); + G_CALLBACK (login_to_wui_via_widget), NULL); /* Tabbed notebook. */ notebook = gtk_notebook_new (); @@ -570,16 +606,22 @@ connect_to_wui_on_enter (GtkWidget *widget, gpointer data) // if key released was not 'enter' key if(((GdkEventKey *)data)->type == GDK_KEY_RELEASE && (((GdkEventKey *)data)->keyval & 0xFF) != 13 ) return; - connect_to_wui(widget, data); + connect_to_wui_via_widget(widget, data); } static void -connect_to_wui (GtkWidget *widget, gpointer data) +connect_to_wui_via_widget (GtkWidget *widget, gpointer data) +{ + hostname = gtk_entry_get_text (GTK_ENTRY (ca_hostname)); + connect_to_wui(); +} + +static void +connect_to_wui() { char *uri; int len; - hostname = gtk_entry_get_text (GTK_ENTRY (ca_hostname)); if (STREQ (hostname, "")) return; /* https:// + hostname + /ovirt + \0 */ @@ -597,19 +639,23 @@ login_to_wui_on_enter (GtkWidget *widget, gpointer data) // if key released was not 'enter' key if(((GdkEventKey *)data)->type == GDK_KEY_RELEASE && (((GdkEventKey *)data)->keyval & 0xFF) != 13 ) return; - login_to_wui(widget, data); + login_to_wui_via_widget(widget, data); } static void -login_to_wui (GtkWidget *widget, gpointer data) +login_to_wui_via_widget (GtkWidget *widget, gpointer data) { - const char *username, *password; + username = gtk_entry_get_text (GTK_ENTRY (la_username)); + password = gtk_entry_get_text (GTK_ENTRY (la_password)); + login_to_wui(); +} - username = gtk_entry_get_text (GTK_ENTRY (la_username)); +static void +login_to_wui() +{ if (STREQ (username, "")) return; - password = gtk_entry_get_text (GTK_ENTRY (la_password)); - wui_thread_send_login (username, password); + wui_thread_send_login(); } /* Connect to a virtual machine. This callback is called from the @@ -618,9 +664,27 @@ login_to_wui (GtkWidget *widget, gpointer data) * makes a new connection. */ static void -connect_to_vm (GtkWidget *widget, gpointer _vm) +connect_to_vm_via_widget (GtkWidget *widget, gpointer _vm) { - struct vm *vm = (struct vm *) _vm; + connect_to_vm((struct vm*)_vm); +} + +static void +connect_to_vm_name(const char* vm_name) +{ + int i; + main_vmlist_updated(NULL); // dont like running this here, but need to make sure we have latest vm list + for(i = 0; i < g_slist_length(vmlist); ++i){ + if(STREQ(((struct vm*) g_slist_nth_data(vmlist, i))->description, vm_name)){ + connect_to_vm((struct vm*) g_slist_nth_data(vmlist, i)); + break; + } + } +} + +static void +connect_to_vm(struct vm* _vm){ + struct vm *vm = _vm; int n = gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)); int i, uuidlen, len, fd; GtkWidget *child; @@ -1144,5 +1208,5 @@ add_vm_to_connectmenu (gpointer _vm, gpointer data) gtk_menu_append (GTK_MENU (connectmenu), item); g_signal_connect (G_OBJECT (item), "activate", - G_CALLBACK (connect_to_vm), vm); + G_CALLBACK (connect_to_vm_via_widget), vm); } diff --git a/wui_thread.c b/wui_thread.c index 8bfa8ca..1688b83 100644 --- a/wui_thread.c +++ b/wui_thread.c @@ -179,7 +179,7 @@ wui_thread_send_disconnect (void) /* Send the login message to the WUI thread. */ void -wui_thread_send_login (const char *username, const char *password) +wui_thread_send_login (void) { struct message *msg; @@ -226,8 +226,6 @@ static int secs_between_refresh = 60; static CURL *curl = NULL; static char curl_error_buffer[CURL_ERROR_SIZE]; static char *uri = NULL; -static char *username = NULL; -static char *password = NULL; static gboolean process_message (struct message *); @@ -396,8 +394,6 @@ process_message (struct message *msg) write_fn_discard_capture_buffer (); if (curl) curl_easy_cleanup (curl); if (uri) g_free (uri); - if (username) g_free (username); - if (password) g_free (password); set_connected (FALSE); set_logged_in (FALSE); return 1; @@ -424,20 +420,11 @@ process_message (struct message *msg) curl = NULL; if (uri) g_free (uri); uri = NULL; - if (username) g_free (username); - username = NULL; - if (password) g_free (password); - password = NULL; set_connected (FALSE); set_logged_in (FALSE); break; case LOGIN: - if (username) g_free (username); - username = msg->str1; - if (password) g_free (password); - password = msg->str2; - /* If we're not connected, this message just updates the * username and password. Otherwise if we are connected, * try to login and grab the initial list of VMs. -- 1.6.0.6
Apparently Analagous Threads
- viewer updates for fedora submission
- [PATCH] add cmd line option for server vnc port
- [PATCH server] added ovirt vnc proxy server, to proxy vnc request to managed vms
- [PATCH v1 02/11] virtio-mem: Paravirtualized memory hotplug
- CUDA fixed VA allocations and sparse mappings