diff options
Diffstat (limited to 'hardinfo2/remote/ssh-conn.c')
-rw-r--r-- | hardinfo2/remote/ssh-conn.c | 338 |
1 files changed, 0 insertions, 338 deletions
diff --git a/hardinfo2/remote/ssh-conn.c b/hardinfo2/remote/ssh-conn.c deleted file mode 100644 index 7f099d35..00000000 --- a/hardinfo2/remote/ssh-conn.c +++ /dev/null @@ -1,338 +0,0 @@ -/* - Remote Client - HardInfo - Displays System Information - Copyright (C) 2003-2009 Leandro A. F. Pereira <leandro@hardinfo.org> - - Based on ssh-method.c from GnomeVFS - Copyright (C) 1999 Free Software Foundation - Original author: Ian McKellar <yakk@yakk.net> - - ssh-conn.c and ssh-conn.h are free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - ssh-conn.c and ssh-con.h are 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with ssh-conn.c and ssh-conn.h; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. -*/ - -#include "config.h" -#ifdef HAS_LIBSOUP -#include <glib/gstdio.h> -#include <glib.h> -#include <unistd.h> -#include <sys/ioctl.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <stdio.h> -#include <string.h> -#include <errno.h> -#include <sys/types.h> -#include <sys/wait.h> - -#include "ssh-conn.h" - -const char *ssh_conn_errors[] = { - "OK", - "No URI specified", - "Unknown protocol", - "Unknown error", - "Cannot spawn SSH", - "Bad parameters", - "Permission denied (invalid credentials)", - "Host key verification failed", - "Connection refused", - "Invalid username or password" -}; - -int ssh_write(SSHConn * conn, - gconstpointer buffer, gint num_bytes, gint * bytes_written) -{ - int written; - int count = 0; - - do { - written = write(conn->fd_write, buffer, (size_t) num_bytes); - if (written == -1 && errno == EINTR) { - count++; - usleep(10); - } - } while (written == -1 && errno == EINTR && count < 5); - - if (written == -1) { - return -1; - } - - *bytes_written = written; - - return 1; -} - -int ssh_read(gint fd, gpointer buffer, gint num_bytes, gint * bytes_read) -{ - int retval; - fd_set fds; - struct timeval tv = { 5, 0 }; - - FD_ZERO(&fds); - FD_SET(fd, &fds); - - *bytes_read = 0; - - if ((retval = select(fd + 1, &fds, NULL, NULL, &tv)) < 0) { - return retval; - } - - if ((retval = read(fd, buffer, (size_t) num_bytes)) > 0) { - *bytes_read = retval; - return 1; - } - - return retval; -} - -void ssh_close(SSHConn * conn) -{ - if (!conn) { - return; - } - - close(conn->fd_read); - close(conn->fd_write); - close(conn->fd_error); - - if (conn->uri) { - soup_uri_free(conn->uri); - } - - kill(conn->pid, SIGINT); - - if (conn->askpass_path) { - DEBUG("unlinking %s", conn->askpass_path); - g_remove(conn->askpass_path); - g_free(conn->askpass_path); - } - - g_free(conn); -} - -static void ssh_conn_setup(gpointer user_data) -{ - gchar *askpass_path = (gchar *) user_data; - int fd; - - if ((fd = open("/dev/tty", O_RDWR)) != -1) { - ioctl(fd, TIOCNOTTY, NULL); - close(fd); - } - - if (askpass_path) { - g_setenv("DISPLAY", "none:0.", TRUE); - g_setenv("SSH_ASKPASS", askpass_path, TRUE); - } else { - g_setenv("SSH_ASKPASS", "/bin/false", TRUE); - } -} - -SSHConnResponse ssh_new(SoupURI * uri, - SSHConn ** conn_return, gchar * command) -{ - int argc, res, bytes_read; - char **argv, *askpass_path = NULL; - GString *cmd_line; - SSHConnResponse response; - SSHConn *connection; - gchar buffer[512]; - - if (!conn_return) { - return SSH_CONN_BAD_PARAMS; - } - - if (!uri) { - return SSH_CONN_NO_URI; - } - - if (!g_str_equal(uri->scheme, "ssh")) { - return SSH_CONN_UNKNOWN_PROTOCOL; - } - - if (uri->password) { - int tmp_askpass; - - askpass_path = - g_build_filename(g_get_home_dir(), ".hardinfo", - "ssh-askpass-XXXXXX", NULL); - tmp_askpass = g_mkstemp(askpass_path); - if (tmp_askpass > 0) { - gchar *tmp; - - g_chmod(askpass_path, 0700); - - tmp = g_strdup_printf("#!/bin/sh\n" - "echo '%s'\n" - "rm -f \"$0\"", uri->password); - write(tmp_askpass, tmp, strlen(tmp)); - close(tmp_askpass); - g_free(tmp); - - DEBUG("using [%s] as ssh-askpass", askpass_path); - } - } - - - cmd_line = g_string_new("ssh -x"); - - if (uri->query && strlen(uri->query)) { - GHashTable *query; - GList *keys, *key; - - query = soup_form_decode(uri->query); - keys = g_hash_table_get_keys(query); - - for (key = keys; key; key = key->next) { - gchar *param; - - g_string_append_printf(cmd_line, " -%s", (gchar *) key->data); - - if ((param = (gchar *) g_hash_table_lookup(query, key->data))) { - g_string_append_printf(cmd_line, "'%s'", param); - } - } - - g_list_free(keys); - g_hash_table_destroy(query); - } - - if (uri->user) { - g_string_append_printf(cmd_line, " -l '%s'", uri->user); - } - - if (uri->port) { - g_string_append_printf(cmd_line, " -p %d", uri->port); - } - - g_string_append_printf(cmd_line, - " %s \"LC_ALL=C %s\"", uri->host, command); - - DEBUG("cmd_line = [%s]", cmd_line->str); - - if (!g_shell_parse_argv(cmd_line->str, &argc, &argv, NULL)) { - response = SSH_CONN_BAD_PARAMS; - goto end; - } - - connection = g_new0(SSHConn, 1); - connection->exit_status = -1; - - DEBUG("spawning SSH"); - - if (!g_spawn_async_with_pipes(NULL, argv, NULL, - G_SPAWN_SEARCH_PATH, - ssh_conn_setup, askpass_path, - &connection->pid, - &connection->fd_write, - &connection->fd_read, - &connection->fd_error, NULL)) { - response = SSH_CONN_CANNOT_SPAWN_SSH; - goto end; - } - - memset(buffer, 0, sizeof(buffer)); - res = ssh_read(connection->fd_error, &buffer, sizeof(buffer), - &bytes_read); - DEBUG("bytes read: %d, result = %d", bytes_read, res); - if (bytes_read > 0 && res == 1) { - DEBUG("Received (error channel): [%s]", buffer); - - if (strstr(buffer, "Permission denied")) { - response = SSH_CONN_PERMISSION_DENIED; - goto end; - } else if (strstr(buffer, "Host key verification failed")) { - response = SSH_CONN_HOST_KEY_CHECK_FAIL; - goto end; - } else if (strstr(buffer, "Connection refused")) { - response = SSH_CONN_REFUSED; - goto end; - } - } - - DEBUG("no error detected; ssh conn established"); - - connection->uri = soup_uri_copy(uri); - response = SSH_CONN_OK; - - end: - g_strfreev(argv); - g_string_free(cmd_line, TRUE); - - if (askpass_path) { - if (connection) { - connection->askpass_path = askpass_path; - } else { - g_free(askpass_path); - } - } - - if (response != SSH_CONN_OK) { - if (connection->uri) { - soup_uri_free(connection->uri); - } - - g_free(connection); - - *conn_return = NULL; - } else { - *conn_return = connection; - } - - DEBUG("response = %d (%s)", response, ssh_conn_errors[response]); - - return response; -} - -#ifdef SSH_TEST -int main(int argc, char **argv) -{ - SSHConn *c; - SSHConnResponse r; - SoupURI *u; - char buffer[256]; - - if (argc < 2) { - g_print("Usage: %s URI command\n", argv[0]); - g_print("Example: %s ssh://user:password@host 'ls -la /'\n", - argv[0]); - return 1; - } - - u = soup_uri_new(argv[1]); - r = ssh_new(u, &c, argv[2]); - g_print("Connection result: %s\n", ssh_conn_errors[r]); - - if (r == SSH_CONN_OK) { - int bytes_read; - - while (ssh_read(c->fd_read, &buffer, sizeof(buffer), - &bytes_read) > 0) { - g_print("Bytes read: %d\n", bytes_read); - g_print("Contents: %s", buffer); - } - - g_print("Finished running remote command\n"); - } - - g_print("Closing SSH [ptr = %p]", c); - ssh_close(c); - - return 0; -} -#endif /* SSH_TEST */ -#endif /* HAS_LIBSOUP */ |