diff options
author | Leandro Pereira <leandro@hardinfo.org> | 2009-04-24 23:39:49 -0300 |
---|---|---|
committer | Leandro Pereira <leandro@hardinfo.org> | 2009-04-24 23:39:49 -0300 |
commit | 04bcf66369596532695ec5204601a90ebd50976f (patch) | |
tree | 627c40012d05df9dd45e44cf966978bc8197b43b /hardinfo2/remote.c | |
parent | 02af98db80e09f8a03cdb5fbb44ac3594f0dde96 (diff) | |
parent | b266765231a28a2878aed08b0d726eea70d389f8 (diff) |
Merge branch 'master' of git@github.com:lpereira/hardinfo
Diffstat (limited to 'hardinfo2/remote.c')
-rw-r--r-- | hardinfo2/remote.c | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/hardinfo2/remote.c b/hardinfo2/remote.c new file mode 100644 index 00000000..028fcd66 --- /dev/null +++ b/hardinfo2/remote.c @@ -0,0 +1,241 @@ +/* + * Remote Client + * HardInfo - Displays System Information + * Copyright (C) 2003-2009 Leandro A. F. Pereira <leandro@hardinfo.org> + * + * 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, version 2. + * + * 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 St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <stdio.h> +#include <string.h> +#include <shell.h> +#include <iconcache.h> +#include <hardinfo.h> +#include <config.h> + +/* + * TODO + * + * - Completely disable this feature if libsoup support isn't compiled in + * - Add "Local Computer" + * - Detect machines on local network that runs SSH + * - IP range scan + * - mDNS + * - Allow the user to add/remove/edit a machine + * - Use ~/.ssh/hosts as a starting point? + * - Different icons for different machines? + * - Make sure SSH can do port forwarding + * - Make sure the remote host has HardInfo installed, with the correct + * version. + * - Allow the user to choose/guess the SSH authentication method + * - Plain old username / password + * - Passwordless RSA keys + * - RSA Keys with passwords + * - Make sure SSH can do port forwarding + * - Make sure the remote host has HardInfo installed + * - Implement XML-RPC server (use libsoup; there's a example with libsoup's sources) + * - Create abstractions for common module operations + * - Use function pointers to choose between local and remote modes + * - Generate a random username/password to be passed to the XML-RPC server; use + * that username/password on the client; this is just to make sure nobody on the + * machine will be allowed to obtain information that might be sensitive. This + * will be passed with base64, so it can be sniffed; this needs root access anyway, + * so not really a problem. + * - Determine if we're gonna use GIOChannels or create a communication thread + * - Use libsoup XML-RPC support to implement the remote mode + * - Introduce a flag on the modules, stating their ability to be used locally/remotely + * (Benchmarks can't be used remotely; Displays won't work remotely [unless we use + X forwarding, but that'll be local X11 info anyway]). + */ + +typedef struct _RemoteDialog RemoteDialog; +struct _RemoteDialog { + GtkWidget *dialog; + GtkWidget *btn_connect, *btn_cancel; +}; + +static RemoteDialog + * remote_dialog_new(GtkTreeModel * model, GtkWidget * parent); + +void remote_dialog_show(GtkTreeModel * model, GtkWidget * parent) +{ + gboolean success; + RemoteDialog *rd = remote_dialog_new(model, parent); + + if (gtk_dialog_run(GTK_DIALOG(rd->dialog)) == GTK_RESPONSE_ACCEPT) { + shell_status_update("Generating remote..."); + gtk_widget_hide(rd->dialog); + shell_view_set_enabled(FALSE); + shell_status_set_enabled(TRUE); + +// success = remote_generate(rd); + + shell_status_set_enabled(FALSE); + + if (success) + shell_status_update("Remote saved."); + else + shell_status_update("Error while creating the remote."); + } + + gtk_widget_destroy(rd->dialog); + g_free(rd); +} + +static RemoteDialog + * remote_dialog_new(GtkTreeModel * model, GtkWidget * parent) +{ + RemoteDialog *rd; + GtkWidget *dialog; + GtkWidget *dialog1_vbox; + GtkWidget *scrolledwindow2; + GtkWidget *treeview2; + GtkWidget *vbuttonbox3; + GtkWidget *button3; + GtkWidget *button6; + GtkWidget *dialog1_action_area; + GtkWidget *button8; + GtkWidget *button7; + GtkWidget *label; + GtkWidget *hbox; + + GtkTreeViewColumn *column; + GtkCellRenderer *cr_text, *cr_pbuf, *cr_toggle; + + rd = g_new0(RemoteDialog, 1); + + dialog = gtk_dialog_new(); + gtk_window_set_title(GTK_WINDOW(dialog), "Connect to Remote Computer"); + gtk_container_set_border_width(GTK_CONTAINER(dialog), 5); + gtk_window_set_default_size(GTK_WINDOW(dialog), 420, 260); + gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(parent)); + gtk_window_set_position(GTK_WINDOW(dialog), + GTK_WIN_POS_CENTER_ON_PARENT); + gtk_window_set_type_hint(GTK_WINDOW(dialog), + GDK_WINDOW_TYPE_HINT_DIALOG); + + dialog1_vbox = GTK_DIALOG(dialog)->vbox; + gtk_box_set_spacing(GTK_BOX(dialog1_vbox), 5); + gtk_container_set_border_width(GTK_CONTAINER(dialog1_vbox), 4); + gtk_widget_show(dialog1_vbox); + + hbox = gtk_hbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(dialog1_vbox), hbox, FALSE, FALSE, 0); + + label = gtk_label_new("<big><b>Connect To</b></big>\n" + "Please choose the remote computer to connect to:"); + gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); + gtk_label_set_use_markup(GTK_LABEL(label), TRUE); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); + + + gtk_box_pack_start(GTK_BOX(hbox), + icon_cache_get_image("network.png"), + FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); + gtk_widget_show_all(hbox); + + hbox = gtk_hbox_new(FALSE, 5); + gtk_box_pack_start(GTK_BOX(dialog1_vbox), hbox, TRUE, TRUE, 0); + gtk_widget_show(hbox); + + scrolledwindow2 = gtk_scrolled_window_new(NULL, NULL); + gtk_widget_show(scrolledwindow2); + gtk_box_pack_start(GTK_BOX(hbox), scrolledwindow2, TRUE, TRUE, + 0); + gtk_widget_set_size_request(scrolledwindow2, -1, 200); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow2), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW + (scrolledwindow2), GTK_SHADOW_IN); + + treeview2 = gtk_tree_view_new_with_model(model); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview2), FALSE); + gtk_widget_show(treeview2); + gtk_container_add(GTK_CONTAINER(scrolledwindow2), treeview2); + + column = gtk_tree_view_column_new(); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview2), column); + + cr_toggle = gtk_cell_renderer_toggle_new(); + gtk_tree_view_column_pack_start(column, cr_toggle, FALSE); +// g_signal_connect(cr_toggle, "toggled", +// G_CALLBACK(remote_dialog_sel_toggle), rd); + gtk_tree_view_column_add_attribute(column, cr_toggle, "active", + TREE_COL_SEL); + + cr_pbuf = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(column, cr_pbuf, FALSE); + gtk_tree_view_column_add_attribute(column, cr_pbuf, "pixbuf", + TREE_COL_PBUF); + + cr_text = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, cr_text, TRUE); + gtk_tree_view_column_add_attribute(column, cr_text, "markup", + TREE_COL_NAME); + + vbuttonbox3 = gtk_vbutton_box_new(); + gtk_widget_show(vbuttonbox3); + gtk_box_pack_start(GTK_BOX(hbox), vbuttonbox3, FALSE, TRUE, 0); + gtk_box_set_spacing(GTK_BOX(vbuttonbox3), 5); + gtk_button_box_set_layout(GTK_BUTTON_BOX(vbuttonbox3), + GTK_BUTTONBOX_START); + + button3 = gtk_button_new_with_mnemonic("_Add"); + gtk_widget_show(button3); + gtk_container_add(GTK_CONTAINER(vbuttonbox3), button3); + GTK_WIDGET_SET_FLAGS(button3, GTK_CAN_DEFAULT); +// g_signal_connect(button3, "clicked", +// G_CALLBACK(remote_dialog_sel_none), rd); + + button6 = gtk_button_new_with_mnemonic("_Edit"); + gtk_widget_show(button6); + gtk_container_add(GTK_CONTAINER(vbuttonbox3), button6); + GTK_WIDGET_SET_FLAGS(button6, GTK_CAN_DEFAULT); +// g_signal_connect(button6, "clicked", G_CALLBACK(remote_dialog_sel_all), +// rd); + + button6 = gtk_button_new_with_mnemonic("_Remove"); + gtk_widget_show(button6); + gtk_container_add(GTK_CONTAINER(vbuttonbox3), button6); + GTK_WIDGET_SET_FLAGS(button6, GTK_CAN_DEFAULT); +// g_signal_connect(button6, "clicked", G_CALLBACK(remote_dialog_sel_all), +// rd); + + dialog1_action_area = GTK_DIALOG(dialog)->action_area; + gtk_widget_show(dialog1_action_area); + gtk_button_box_set_layout(GTK_BUTTON_BOX(dialog1_action_area), + GTK_BUTTONBOX_END); + + button8 = gtk_button_new_from_stock(GTK_STOCK_CANCEL); + gtk_widget_show(button8); + gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button8, + GTK_RESPONSE_CANCEL); + GTK_WIDGET_SET_FLAGS(button8, GTK_CAN_DEFAULT); + + button7 = gtk_button_new_from_stock(GTK_STOCK_CONNECT); + gtk_widget_show(button7); + gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button7, + GTK_RESPONSE_ACCEPT); + GTK_WIDGET_SET_FLAGS(button7, GTK_CAN_DEFAULT); + + rd->dialog = dialog; + rd->btn_cancel = button8; + rd->btn_connect = button7; + + gtk_tree_view_collapse_all(GTK_TREE_VIEW(treeview2)); + + return rd; +} |