[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH] Power Hypervisor now with libssh2



Hello friends,

This is the new version of phyp driver now using libssh2. I also did
some other changes:

 * Added some debug information. Sometimes its worth to know which
command is being executed and where. So I added the PHYP_CMD_DEBUG
macro.

 * All the connection startup is now "hard coded" in libssh2. For
example, I need to open the socket and start the connection all by
myself. Not a big deal, but in a near future I am planning to send a
patch to libssh2 to encapsulate all these procedures into functions,
hence, less code, probably less bugs :)

 * There is a lot of "out of scope" functions in the bottom of the file.
In the next patch I may put all those together in a phyp_config.[ch] in
order to get things clearer.

What's up next:

 * The problem of handling the UUID in a centralized way still remains.
I started to handle this by opening a sftp connection to the HMC system
and transfer my UUID database. But there is an odd behavior that makes
the driver connect OR NOT to some HMC systems.

 * CPU management: this feature planned to be released in this version
is not ready yet due to the issue above.

 * Storage management.

Vacations:

I'll be on vacations from 26th/august to 14th/september. I'll check my
emails in the meanwhile, but no so often. Anyway, any comments on this
patch are always welcome :)

[]'s

-- 
Eduardo Otubo
Software Engineer
Linux Technology Center
IBM Systems & Technology Group
Mobile: +55 19 8135 0885
otubo linux vnet ibm com
diff --git a/configure.in b/configure.in
index d28c44a..4e933f8 100644
--- a/configure.in
+++ b/configure.in
@@ -187,8 +187,8 @@ AC_ARG_WITH([uml],
 [  --with-uml              add UML support (on)],[],[with_uml=check])
 AC_ARG_WITH([openvz],
 [  --with-openvz           add OpenVZ support (on)],[],[with_openvz=yes])
-AC_ARG_WITH([libssh],
-[  --with-libssh=[PFX]       libssh location],[],[with_libssh=yes])
+AC_ARG_WITH([libssh2],
+[  --with-libssh2=[PFX]       libssh2 location],[],[with_libssh2=yes])
 AC_ARG_WITH([phyp],
 [  --with-phyp=[PFX]         add PHYP support (on)],[],[with_phyp=check])
 AC_ARG_WITH([vbox],
@@ -866,45 +866,45 @@ dnl
 dnl libssh checks
 dnl
 
-if test "$with_libssh" != "yes" -a "$with_libssh" != "no"; then
-		libssh_path="$with_libssh"
-elif test "$with_libssh" = "yes"; then
-		libssh_path="/usr/local/lib/"
-elif test "$with_libssh" = "no"; then
+if test "$with_libssh2" != "yes" -a "$with_libssh2" != "no"; then
+		libssh2_path="$with_libssh2"
+elif test "$with_libssh2" = "yes"; then
+		libssh2_path="/usr/local/lib/"
+elif test "$with_libssh2" = "no"; then
 		with_phyp="no";
 fi
 
 if test "$with_phyp" = "check"; then
-  AC_CHECK_LIB([ssh],[ssh_new],[
-        LIBSSH_LIBS="$LIBSSH_LIBS -lssh -L$libssh_path"
-        AC_SUBST([LIBSSH_LIBS])],[
+  AC_CHECK_LIB([ssh2],[libssh2_session_startup],[
+        LIBSSH2_LIBS="$LIBSSH2_LIBS -lssh2 -L$libssh2_path"
+        AC_SUBST([LIBSSH2_LIBS])],[
         with_phyp="no"
-		    with_libssh="no";
+		    with_libssh2="no";
 				],[])
 
 	if test "$with_phyp" != "no"; then
-  AC_CHECK_HEADERS([libssh/libssh.h],[
+  AC_CHECK_HEADERS([libssh2.h],[
 		    with_phyp="yes"
-        LIBSSH_CFLAGS="-I/usr/local/include/libssh"
-        AC_SUBST([LIBSSH_CFLAGS])
+        LIBSSH2_CFLAGS="-I/usr/local/include"
+        AC_SUBST([LIBSSH2_CFLAGS])
 	      AC_DEFINE_UNQUOTED([WITH_PHYP], 1,
         [whether IBM HMC / IVM driver is enabled])
 				],[
         with_phyp="no"
-		    with_libssh="no";
+		    with_libssh2="no";
 				],[])
 	fi
 elif test "$with_phyp" = "yes"; then
-  AC_CHECK_LIB([ssh],[ssh_new],[
-        LIBSSH_LIBS="$LIBSSH_LIBS -lssh -L$libssh_path"
-        AC_SUBST([LIBSSH_LIBS])],[
-        AC_MSG_ERROR([You must install the libssh to compile Phype driver.])
+  AC_CHECK_LIB([ssh2],[libssh2_session_startup],[
+        LIBSSH2_LIBS="$LIBSSH2_LIBS -lssh2 -L$libssh2_path"
+        AC_SUBST([LIBSSH2_LIBS])],[
+        AC_MSG_ERROR([You must install the libssh2 to compile Phype driver.])
 				])
 
-  AC_CHECK_HEADERS([libssh/libssh.h],[
-        LIBSSH_CFLAGS="-I/usr/local/include/libssh"
-        AC_SUBST([LIBSSH_CFLAGS])],[
-        AC_MSG_ERROR([Cannot find libssh headers.Is libssh installed ?])
+  AC_CHECK_HEADERS([libssh2.h],[
+        LIBSSH2_CFLAGS="-I/usr/local/include"
+        AC_SUBST([LIBSSH2_CFLAGS])],[
+        AC_MSG_ERROR([Cannot find libssh2 headers.Is libssh2 installed ?])
 				],[])
   AC_DEFINE_UNQUOTED([WITH_PHYP], 1,
         [whether IBM HMC / IVM driver is enabled])
@@ -1699,10 +1699,10 @@ AC_MSG_NOTICE([ libcurl: $LIBCURL_CFLAGS $LIBCURL_LIBS])
 else
 AC_MSG_NOTICE([ libcurl: no])
 fi
-if test "$with_libssh" != "no" ; then
-AC_MSG_NOTICE([  libssh: $LIBSSH_CFLAGS $LIBSSH_LIBS])
+if test "$with_libssh2" != "no" ; then
+AC_MSG_NOTICE([  libssh2: $LIBSSH2_CFLAGS $LIBSSH2_LIBS])
 else
-AC_MSG_NOTICE([  libssh: no])
+AC_MSG_NOTICE([  libssh2: no])
 fi
 AC_MSG_NOTICE([  gnutls: $GNUTLS_CFLAGS $GNUTLS_LIBS])
 if test "$with_sasl" != "no" ; then
diff --git a/src/Makefile.am b/src/Makefile.am
index 9567490..c7f6299 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -6,7 +6,7 @@ INCLUDES = \
 	   -I top_srcdir@/include \
 	   -I top_srcdir@/qemud \
 	   $(LIBXML_CFLAGS) \
-	   $(LIBSSH_CFLAGS) \
+	   $(LIBSSH2_CFLAGS) \
 	   $(XEN_CFLAGS) \
 	   $(SELINUX_CFLAGS) \
 	   $(DRIVER_MODULE_CFLAGS) \
@@ -307,8 +307,8 @@ else
 noinst_LTLIBRARIES += libvirt_driver_phyp.la
 libvirt_la_LIBADD += libvirt_driver_phyp.la
 endif
-libvirt_driver_phyp_la_LDFLAGS = $(LIBSSH_LIBS)
-libvirt_driver_phyp_la_CFLAGS = $(LIBSSH_CFLAGS)
+libvirt_driver_phyp_la_LDFLAGS = $(LIBSSH2_LIBS)
+libvirt_driver_phyp_la_CFLAGS = $(LIBSSH2_CFLAGS)
 libvirt_driver_phyp_la_SOURCES = $(PHYP_DRIVER_SOURCES)
 endif
 
diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
index 3100144..861a9c8 100644
--- a/src/phyp/phyp_driver.c
+++ b/src/phyp/phyp_driver.c
@@ -34,8 +34,11 @@
 #include <unistd.h>
 #include <errno.h>
 #include <stdio.h>
-
-#include <libssh/libssh.h>
+#include <libssh2.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/socket.h>
+#include <netdb.h>
 
 #include "internal.h"
 #include "util.h"
@@ -53,6 +56,10 @@
 
 #define VIR_FROM_THIS VIR_FROM_PHYP
 
+#ifdef ENABLE_DEBUG
+#define PHYP_CMD_DEBUG fprintf(stdout,"%s:%d - COMMAND:%s\n",__FUNCTION__,__LINE__,cmd);
+#endif
+
 static int escape_specialcharacters(char *src, char *dst, size_t dstlen);
 
 /*
@@ -63,11 +70,12 @@ static virDrvOpenStatus
 phypOpen(virConnectPtr conn,
          virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED)
 {
-    SSH_SESSION *session = NULL;
+    LIBSSH2_SESSION *session = NULL;
     ConnectionData *connection_data = NULL;
     char *string;
     size_t len = 0;
     uuid_dbPtr uuid_db = NULL;
+    int internal_socket;
 
     if (!conn || !conn->uri)
         return VIR_DRV_OPEN_DECLINED;
@@ -113,15 +121,13 @@ phypOpen(virConnectPtr conn,
         goto failure;
     }
 
-    if ((session = openSSHSession(conn, auth)) == NULL) {
+    if ((session = openSSHSession(conn, auth, &internal_socket)) == NULL) {
         virRaiseError(conn, NULL, NULL, 0, VIR_FROM_PHYP,
                       VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0, "%s",
                       _("Error while opening SSH session."));
         goto failure;
     }
-
-    VIR_FREE(conn->uri->path);
-    conn->uri->path = string;
+    //conn->uri->path = string;
     connection_data->session = session;
     connection_data->auth = auth;
 
@@ -134,7 +140,7 @@ phypOpen(virConnectPtr conn,
 
     return VIR_DRV_OPEN_SUCCESS;
 
-failure:
+  failure:
     VIR_FREE(uuid_db);
     VIR_FREE(connection_data);
     VIR_FREE(string);
@@ -146,63 +152,81 @@ static int
 phypClose(virConnectPtr conn)
 {
     ConnectionData *connection_data = conn->networkPrivateData;
-    SSH_SESSION *ssh_session = connection_data->session;
+    LIBSSH2_SESSION *session = connection_data->session;
 
-    ssh_disconnect(ssh_session);
+    libssh2_session_disconnect(session, "Disconnecting...");
+    libssh2_session_free(session);
 
     VIR_FREE(connection_data);
     return 0;
 }
 
-SSH_SESSION *
-openSSHSession(virConnectPtr conn, virConnectAuthPtr auth)
+LIBSSH2_SESSION *
+openSSHSession(virConnectPtr conn, virConnectAuthPtr auth,
+               int *internal_socket)
 {
-    SSH_SESSION *session;
-    SSH_OPTIONS *opt;
-    char *user = conn->uri->user;
-    char *host = conn->uri->server;
-    int ssh_auth = 0;
-    char *banner;
+    LIBSSH2_SESSION *session;
+    const char *hostname = conn->uri->server;
+    const char *username = conn->uri->user;
+    const char *password = NULL;
+    int sock;
+    struct sockaddr_in sin;
+    int rc;
     int port = 22;
-    char *password;
-
-    if (conn->uri->port)
-        port = conn->uri->port;
-
-    session = ssh_new();
-    opt = ssh_options_new();
-
-    /*setting some ssh options */
-    ssh_options_set_host(opt, host);
-    ssh_options_set_port(opt, port);
-    ssh_options_set_username(opt, user);
-    ssh_set_options(session, opt);
-
-    /*starting ssh connection */
-    if (ssh_connect(session)) {
-        virRaiseError(conn, NULL, NULL, 0, VIR_FROM_PHYP, VIR_ERR_ERROR,
-                      NULL, NULL, NULL, 0, 0, "%s",
-                      _("Connection failed."));
-        ssh_disconnect(session);
-        ssh_finalize();
-        goto err;
+    struct hostent *hp;
+    struct in_addr **pptr;
+
+    sock = socket(AF_INET, SOCK_STREAM, 0);
+
+    if ((hp = gethostbyname(hostname)) == NULL) {
+        return NULL;
+    }
+
+    pptr = (struct in_addr **) hp->h_addr_list;
+    if (*pptr != NULL) {
+        sin.sin_addr.s_addr = inet_addr(inet_ntoa(**(pptr)));
     }
 
-    /*trying to use pub key */
-    if ((ssh_auth =
-         ssh_userauth_autopubkey(session, NULL)) == SSH_AUTH_ERROR) {
-        VIR_WARN("%s", "Authentication with public key failed.");
+    sin.sin_family = AF_INET;
+    sin.sin_port = htons(port);
+    if (connect(sock, (struct sockaddr *) (&sin),
+                sizeof(struct sockaddr_in)) != 0) {
+        virRaiseError(conn, NULL, NULL, 0, VIR_FROM_PHYP,
+                      VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0, "%s",
+                      _("Error while opening socket."));
+        goto err;
     }
+    (*internal_socket) = sock;
 
-    if ((banner = ssh_get_issue_banner(session))) {
-        VIR_INFO("%s", banner);
-        VIR_FREE(banner);
+    /* Create a session instance */
+    session = libssh2_session_init();
+    if (!session)
+        goto err;
+
+    /* tell libssh2 we want it all done non-blocking */
+    libssh2_session_set_blocking(session, 0);
+
+    while ((rc = libssh2_session_startup(session, sock)) ==
+           LIBSSH2_ERROR_EAGAIN) ;
+    if (rc) {
+        virRaiseError(conn, NULL, NULL, 0, VIR_FROM_PHYP,
+                      VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0, "%s",
+                      _("Failure establishing SSH session."));
+        goto err;
     }
 
-    if (ssh_auth != SSH_AUTH_SUCCESS) {
+    /* Trying authentication by pubkey */
+    while ((rc =
+            libssh2_userauth_publickey_fromfile(session, username,
+                                                "/home/user/"
+                                                ".ssh/id_rsa.pub",
+                                                "/home/user/"
+                                                ".ssh/id_rsa",
+                                                password)) ==
+           LIBSSH2_ERROR_EAGAIN) ;
+    if (rc) {
         int i;
         int hasPassphrase = 0;
-        int auth_check = 0;
 
         virConnectCredential creds[] = {
             {VIR_CRED_PASSPHRASE, "password", "Password", NULL, NULL, 0},
@@ -237,34 +261,32 @@ openSSHSession(virConnectPtr conn, virConnectAuthPtr auth)
             goto err;
         }
 
-        if (creds[0].result)
+        if (creds[0].result) {
             password = creds[0].result;
-        else {
+        } else {
             virRaiseError(conn, NULL, NULL, 0, VIR_FROM_PHYP,
-                          VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
-                          _("Unable to get password certificate: %s"),
-                          ssh_get_error(session));
-            ssh_disconnect(session);
+                          VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0, "%s",
+                          _("Unable to get password certificates"));
+            libssh2_session_disconnect(session, "Disconnecting...");
+            libssh2_session_free(session);
             goto err;
         }
 
-        char *username = user;
-
-        auth_check = ssh_userauth_password(session, username, password);
-        memset(password, 0, strlen(password));
+        while ((rc =
+                libssh2_userauth_password(session, username,
+                                          password)) ==
+               LIBSSH2_ERROR_EAGAIN) ;
 
-        if (auth_check != SSH_AUTH_SUCCESS) {
+        if (rc) {
             virRaiseError(conn, NULL, NULL, 0, VIR_FROM_PHYP,
-                          VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
-                          _("Authentication failed: %s"),
-                          ssh_get_error(session));
-            ssh_disconnect(session);
+                          VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0, "%s",
+                          _("Authentication failed"));
+            libssh2_session_disconnect(session, "Disconnecting");
+            libssh2_session_free(session);
             goto err;
         } else
             goto exit;
-    } else
-        goto exit;
-
+    }
   err:
     return NULL;
 
@@ -275,56 +297,73 @@ openSSHSession(virConnectPtr conn, virConnectAuthPtr auth)
 /* this functions is the layer that manipulates the ssh channel itself
  * and executes the commands on the remote machine */
 static char *
-phypExec(SSH_SESSION * session, char *cmd, int *exit_status,
+phypExec(LIBSSH2_SESSION * session, char *cmd, int *exit_status,
          virConnectPtr conn)
 {
-    CHANNEL *channel = channel_new(session);
+    LIBSSH2_CHANNEL *channel;
+    ConnectionData *connection_data = conn->networkPrivateData;
     virBuffer tex_ret = VIR_BUFFER_INITIALIZER;
-    char buf[4096] = { 0 };
-    int ret = 0;
+    char buffer[0x4000] = { 0 };
+    int exitcode;
+    int bytecount = 0;
+    int sock = connection_data->sock;
+    int rc = 0;
+
+    /* Exec non-blocking on the remove host */
+    while ((channel = libssh2_channel_open_session(session)) == NULL &&
+           libssh2_session_last_error(session, NULL, NULL, 0) ==
+           LIBSSH2_ERROR_EAGAIN) {
+        waitsocket(sock, session);
+    }
 
-    if (channel_open_session(channel) == SSH_ERROR) {
-        virRaiseError(NULL, NULL, NULL, 0, VIR_FROM_PHYP,
-                      VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0, "%s",
-                      _("Unable to open a SSH channel."));
+    if (channel == NULL) {
         goto err;
     }
 
-    if (channel_request_exec(channel, cmd) == SSH_ERROR) {
-        virRaiseError(NULL, NULL, NULL, 0, VIR_FROM_PHYP,
-                      VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0, "%s",
-                      _("Unable to execute remote command."));
-        goto err;
+    while ((rc = libssh2_channel_exec(channel, cmd)) ==
+           LIBSSH2_ERROR_EAGAIN) {
+        waitsocket(sock, session);
     }
 
-    if (channel_send_eof(channel) == SSH_ERROR) {
-        virRaiseError(NULL, NULL, NULL, 0, VIR_FROM_PHYP,
-                      VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0, "%s",
-                      _("Unable to send EOF."));
+    if (rc != 0) {
         goto err;
     }
 
-    while (channel && channel_is_open(channel)) {
-        ret = channel_read(channel, buf, sizeof(buf), 0);
-        if (ret < 0)
-            goto err;
-
-        if (ret == 0) {
-            channel_send_eof(channel);
-            if (channel_get_exit_status(channel) == -1)
-                goto err;
+    for (;;) {
+        /* loop until we block */
+        do {
+            rc = libssh2_channel_read(channel, buffer, sizeof(buffer));
+            if (rc > 0) {
+                bytecount += rc;
+                virBufferVSprintf(&tex_ret, "%s", buffer);
+            }
+        }
+        while (rc > 0);
+
+        /* this is due to blocking that would occur otherwise so we loop on
+         * this condition */
+        if (rc == LIBSSH2_ERROR_EAGAIN) {
+            waitsocket(sock, session);
+        } else {
+            break;
+        }
+    }
 
-            if (channel_close(channel) == SSH_ERROR)
-                goto err;
+    exitcode = 127;
 
-            channel_free(channel);
-            channel = NULL;
-            goto exit;
-        }
+    while ((rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN) {
+        waitsocket(sock, session);
+    }
 
-        virBufferAdd(&tex_ret, (const char *) &buf, ret);
+    if (rc == 0) {
+        exitcode = libssh2_channel_get_exit_status(channel);
     }
 
+    (*exit_status) = exitcode;
+    libssh2_channel_free(channel);
+    channel = NULL;
+    goto exit;
+
   err:
     (*exit_status) = SSH_CMD_ERR;
     char *cleanup_buf = virBufferContentAndReset(&tex_ret);
@@ -342,7 +381,7 @@ phypExec(SSH_SESSION * session, char *cmd, int *exit_status,
 
 /* return the lpar_id given a name and a managed system name */
 static int
-phypGetLparID(SSH_SESSION * ssh_session, const char *managed_system,
+phypGetLparID(LIBSSH2_SESSION * session, const char *managed_system,
               const char *name, virConnectPtr conn)
 {
     int exit_status = 0;
@@ -356,13 +395,14 @@ phypGetLparID(SSH_SESSION * ssh_session, const char *managed_system,
         virReportOOMError(conn);
         goto err;
     }
+    PHYP_CMD_DEBUG;
 
-    const char *tex_ret = phypExec(ssh_session, cmd, &exit_status, conn);
+    const char *ret = phypExec(session, cmd, &exit_status, conn);
 
-    if (exit_status < 0 || tex_ret == NULL)
+    if (exit_status < 0 || ret == NULL)
         goto err;
 
-    if (virStrToLong_i(tex_ret, &char_ptr, 10, &lpar_id) == -1)
+    if (virStrToLong_i(ret, &char_ptr, 10, &lpar_id) == -1)
         goto err;
 
     VIR_FREE(cmd);
@@ -375,7 +415,7 @@ phypGetLparID(SSH_SESSION * ssh_session, const char *managed_system,
 
 /* return the lpar name given a lpar_id and a managed system name */
 static char *
-phypGetLparNAME(SSH_SESSION * ssh_session, const char *managed_system,
+phypGetLparNAME(LIBSSH2_SESSION * session, const char *managed_system,
                 unsigned int lpar_id, virConnectPtr conn)
 {
     char *cmd;
@@ -387,22 +427,23 @@ phypGetLparNAME(SSH_SESSION * ssh_session, const char *managed_system,
         virReportOOMError(conn);
         goto err;
     }
+    PHYP_CMD_DEBUG;
 
-    char *lpar_name = phypExec(ssh_session, cmd, &exit_status, conn);
+    char *ret = phypExec(session, cmd, &exit_status, conn);
 
-    if (lpar_name == NULL)
+    if (ret == NULL)
         goto err;
 
-    char *char_ptr = strchr(lpar_name, '\n');
+    char *char_ptr = strchr(ret, '\n');
 
     if (char_ptr)
         *char_ptr = '\0';
 
-    if (exit_status < 0 || lpar_name == NULL)
+    if (exit_status < 0 || ret == NULL)
         goto err;
 
     VIR_FREE(cmd);
-    return lpar_name;
+    return ret;
 
   err:
     VIR_FREE(cmd);
@@ -443,7 +484,7 @@ phypGetLparMem(virConnectPtr conn, const char *managed_system, int lpar_id,
                int type)
 {
     ConnectionData *connection_data = conn->networkPrivateData;
-    SSH_SESSION *ssh_session = connection_data->session;
+    LIBSSH2_SESSION *session = connection_data->session;
     char *cmd;
     char *char_ptr;
     int memory = 0;
@@ -467,13 +508,14 @@ phypGetLparMem(virConnectPtr conn, const char *managed_system, int lpar_id,
             goto err;
         }
     }
+    PHYP_CMD_DEBUG;
 
-    char *tex_ret = phypExec(ssh_session, cmd, &exit_status, conn);
+    char *ret = phypExec(session, cmd, &exit_status, conn);
 
-    if (tex_ret == NULL)
+    if (ret == NULL)
         goto err;
 
-    char *mem_char_ptr = strchr(tex_ret, '\n');
+    char *mem_char_ptr = strchr(ret, '\n');
 
     if (mem_char_ptr)
         *mem_char_ptr = '\0';
@@ -481,7 +523,7 @@ phypGetLparMem(virConnectPtr conn, const char *managed_system, int lpar_id,
     if (exit_status < 0)
         goto err;
 
-    if (virStrToLong_i(tex_ret, &char_ptr, 10, &memory) == -1)
+    if (virStrToLong_i(ret, &char_ptr, 10, &memory) == -1)
         goto err;
 
     VIR_FREE(cmd);
@@ -497,7 +539,7 @@ unsigned long
 phypGetLparCPU(virConnectPtr conn, const char *managed_system, int lpar_id)
 {
     ConnectionData *connection_data = conn->networkPrivateData;
-    SSH_SESSION *ssh_session = connection_data->session;
+    LIBSSH2_SESSION *session = connection_data->session;
     char *cmd;
     int exit_status = 0;
     int vcpus = 0;
@@ -508,17 +550,18 @@ phypGetLparCPU(virConnectPtr conn, const char *managed_system, int lpar_id)
         virReportOOMError(conn);
         goto err;
     }
-    char *tex_ret = phypExec(ssh_session, cmd, &exit_status, conn);
+    PHYP_CMD_DEBUG;
+    char *ret = phypExec(session, cmd, &exit_status, conn);
 
-    if (tex_ret == NULL)
+    if (ret == NULL)
         goto err;
 
-    char *char_ptr = strchr(tex_ret, '\n');
+    char *char_ptr = strchr(ret, '\n');
 
     if (char_ptr)
         *char_ptr = '\0';
 
-    if (virStrToLong_i(tex_ret, &char_ptr, 10, &vcpus) == -1)
+    if (virStrToLong_i(ret, &char_ptr, 10, &vcpus) == -1)
         goto err;
 
     if (exit_status < 0)
@@ -537,7 +580,7 @@ phypGetRemoteSlot(virConnectPtr conn, const char *managed_system,
                   const char *lpar_name)
 {
     ConnectionData *connection_data = conn->networkPrivateData;
-    SSH_SESSION *ssh_session = connection_data->session;
+    LIBSSH2_SESSION *session = connection_data->session;
     char *cmd;
     char *char_ptr;
     int remote_slot = 0;
@@ -549,12 +592,13 @@ phypGetRemoteSlot(virConnectPtr conn, const char *managed_system,
         virReportOOMError(conn);
         goto err;
     }
-    char *tex_ret = phypExec(ssh_session, cmd, &exit_status, conn);
+    PHYP_CMD_DEBUG;
+    char *ret = phypExec(session, cmd, &exit_status, conn);
 
-    if (tex_ret == NULL)
+    if (ret == NULL)
         goto err;
 
-    char *char_ptr2 = strchr(tex_ret, '\n');
+    char *char_ptr2 = strchr(ret, '\n');
 
     if (char_ptr2)
         *char_ptr2 = '\0';
@@ -562,7 +606,7 @@ phypGetRemoteSlot(virConnectPtr conn, const char *managed_system,
     if (exit_status < 0)
         goto err;
 
-    if (virStrToLong_i(tex_ret, &char_ptr, 10, &remote_slot) == -1)
+    if (virStrToLong_i(ret, &char_ptr, 10, &remote_slot) == -1)
         goto err;
 
     VIR_FREE(cmd);
@@ -578,7 +622,7 @@ phypGetBackingDevice(virConnectPtr conn, const char *managed_system,
                      char *lpar_name)
 {
     ConnectionData *connection_data = conn->networkPrivateData;
-    SSH_SESSION *ssh_session = connection_data->session;
+    LIBSSH2_SESSION *session = connection_data->session;
     char *cmd;
     int remote_slot = 0;
     int exit_status = 0;
@@ -593,8 +637,9 @@ phypGetBackingDevice(virConnectPtr conn, const char *managed_system,
         virReportOOMError(conn);
         goto err;
     }
+    PHYP_CMD_DEBUG;
 
-    char *ret = phypExec(ssh_session, cmd, &exit_status, conn);
+    char *ret = phypExec(session, cmd, &exit_status, conn);
 
     if (ret == NULL)
         goto err;
@@ -639,7 +684,7 @@ int
 phypGetLparState(virConnectPtr conn, unsigned int lpar_id)
 {
     ConnectionData *connection_data = conn->networkPrivateData;
-    SSH_SESSION *ssh_session = connection_data->session;
+    LIBSSH2_SESSION *session = connection_data->session;
     char *cmd;
     int exit_status = 0;
     char *char_ptr = NULL;
@@ -664,8 +709,9 @@ phypGetLparState(virConnectPtr conn, unsigned int lpar_id)
         virReportOOMError(conn);
         goto err;
     }
+    PHYP_CMD_DEBUG;
 
-    char *ret = phypExec(ssh_session, cmd, &exit_status, conn);
+    char *ret = phypExec(session, cmd, &exit_status, conn);
 
     if (ret == NULL)
         goto err;
@@ -697,7 +743,7 @@ int
 phypDiskType(virConnectPtr conn, char *backing_device)
 {
     ConnectionData *connection_data = conn->networkPrivateData;
-    SSH_SESSION *ssh_session = connection_data->session;
+    LIBSSH2_SESSION *session = connection_data->session;
     char *cmd;
     int exit_status = 0;
 
@@ -707,8 +753,9 @@ phypDiskType(virConnectPtr conn, char *backing_device)
         virReportOOMError(conn);
         goto err;
     }
+    PHYP_CMD_DEBUG;
 
-    char *ret = phypExec(ssh_session, cmd, &exit_status, conn);
+    char *ret = phypExec(session, cmd, &exit_status, conn);
 
     if (ret == NULL)
         goto err;
@@ -746,7 +793,7 @@ static int
 phypNumDomainsGeneric(virConnectPtr conn, unsigned int type)
 {
     ConnectionData *connection_data = conn->networkPrivateData;
-    SSH_SESSION *ssh_session = connection_data->session;
+    LIBSSH2_SESSION *session = connection_data->session;
     int exit_status = 0;
     int ndom = 0;
     char *char_ptr;
@@ -780,8 +827,9 @@ phypNumDomainsGeneric(virConnectPtr conn, unsigned int type)
         virReportOOMError(conn);
         goto err;
     }
+    PHYP_CMD_DEBUG;
 
-    char *ret = phypExec(ssh_session, cmd, &exit_status, conn);
+    char *ret = phypExec(session, cmd, &exit_status, conn);
 
     if (exit_status < 0 || ret == NULL)
         goto err;
@@ -821,7 +869,7 @@ phypListDomainsGeneric(virConnectPtr conn, int *ids, int nids,
                        unsigned int type)
 {
     ConnectionData *connection_data = conn->networkPrivateData;
-    SSH_SESSION *ssh_session = connection_data->session;
+    LIBSSH2_SESSION *session = connection_data->session;
     char *managed_system = conn->uri->path;
     int exit_status = 0;
     int got = 0;
@@ -857,21 +905,22 @@ phypListDomainsGeneric(virConnectPtr conn, int *ids, int nids,
         virReportOOMError(conn);
         goto err;
     }
-    char *domains = phypExec(ssh_session, cmd, &exit_status, conn);
+    PHYP_CMD_DEBUG;
+    char *ret = phypExec(session, cmd, &exit_status, conn);
 
-    /* I need to parse the textual return in order to get the domains */
-    if (exit_status < 0 || domains == NULL || got == 0)
+    /* I need to parse the textual return in order to get the ret */
+    if (exit_status < 0 || ret == NULL)
         goto err;
     else {
         while (got < nids) {
-            if (domains[i] == '\n') {
+            if (ret[i] == '\n') {
                 if (virStrToLong_i(id_c, &char_ptr, 10, &ids[got]) == -1)
                     return 0;
                 memset(id_c, 0, 10);
                 j = 0;
                 got++;
             } else {
-                id_c[j] = domains[i];
+                id_c[j] = ret[i];
                 j++;
             }
             i++;
@@ -896,7 +945,7 @@ static int
 phypListDefinedDomains(virConnectPtr conn, char **const names, int nnames)
 {
     ConnectionData *connection_data = conn->networkPrivateData;
-    SSH_SESSION *ssh_session = connection_data->session;
+    LIBSSH2_SESSION *session = connection_data->session;
     char *managed_system = conn->uri->path;
     int exit_status = 0;
     int got = 0;
@@ -923,8 +972,9 @@ phypListDefinedDomains(virConnectPtr conn, char **const names, int nnames)
         virReportOOMError(conn);
         goto err;
     }
+    PHYP_CMD_DEBUG;
 
-    char *ret = phypExec(ssh_session, cmd, &exit_status, conn);
+    char *ret = phypExec(session, cmd, &exit_status, conn);
 
     if (VIR_ALLOC(domains) < 0)
         virReportOOMError(conn);
@@ -968,7 +1018,7 @@ static virDomainPtr
 phypDomainLookupByName(virConnectPtr conn, const char *lpar_name)
 {
     ConnectionData *connection_data = conn->networkPrivateData;
-    SSH_SESSION *ssh_session = connection_data->session;
+    LIBSSH2_SESSION *session = connection_data->session;
     virDomainPtr dom = NULL;
     int lpar_id = 0;
     char *managed_system = conn->uri->path;
@@ -989,7 +1039,7 @@ phypDomainLookupByName(virConnectPtr conn, const char *lpar_name)
     if (char_ptr)
         *char_ptr = '\0';
 
-    lpar_id = phypGetLparID(ssh_session, managed_system, lpar_name, conn);
+    lpar_id = phypGetLparID(session, managed_system, lpar_name, conn);
     if (lpar_id < 0)
         goto err;
 
@@ -1013,7 +1063,7 @@ static virDomainPtr
 phypDomainLookupByID(virConnectPtr conn, int lpar_id)
 {
     ConnectionData *connection_data = conn->networkPrivateData;
-    SSH_SESSION *ssh_session = connection_data->session;
+    LIBSSH2_SESSION *session = connection_data->session;
     virDomainPtr dom = NULL;
     char *managed_system = conn->uri->path;
     int exit_status = 0;
@@ -1034,7 +1084,7 @@ phypDomainLookupByID(virConnectPtr conn, int lpar_id)
     if (char_ptr)
         *char_ptr = '\0';
 
-    char *lpar_name = phypGetLparNAME(ssh_session, managed_system, lpar_id,
+    char *lpar_name = phypGetLparNAME(session, managed_system, lpar_id,
                                       conn);
 
     if (phypGetLparUUID(lpar_uuid, lpar_id, conn) == -1)
@@ -1062,7 +1112,7 @@ static char *
 phypDomainDumpXML(virDomainPtr dom, int flags)
 {
     ConnectionData *connection_data = dom->conn->networkPrivateData;
-    SSH_SESSION *ssh_session = connection_data->session;
+    LIBSSH2_SESSION *session = connection_data->session;
     virDomainDefPtr def = NULL;
     char *ret = NULL;
     char *managed_system = dom->conn->uri->path;
@@ -1089,7 +1139,7 @@ phypDomainDumpXML(virDomainPtr dom, int flags)
     def->virtType = VIR_DOMAIN_VIRT_PHYP;
     def->id = dom->id;
 
-    char *lpar_name = phypGetLparNAME(ssh_session, managed_system, def->id,
+    char *lpar_name = phypGetLparNAME(session, managed_system, def->id,
                                       dom->conn);
 
     if (lpar_name == NULL) {
@@ -1136,7 +1186,7 @@ static int
 phypDomainResume(virDomainPtr dom)
 {
     ConnectionData *connection_data = dom->conn->networkPrivateData;
-    SSH_SESSION *ssh_session = connection_data->session;
+    LIBSSH2_SESSION *session = connection_data->session;
     char *managed_system = dom->conn->uri->path;
     int exit_status = 0;
     char *char_ptr = NULL;
@@ -1161,8 +1211,9 @@ phypDomainResume(virDomainPtr dom)
         virReportOOMError(dom->conn);
         goto err;
     }
+    PHYP_CMD_DEBUG;
 
-    char *ret = phypExec(ssh_session, cmd, &exit_status, dom->conn);
+    char *ret = phypExec(session, cmd, &exit_status, dom->conn);
 
   err:
     VIR_FREE(cmd);
@@ -1175,7 +1226,7 @@ static int
 phypDomainShutdown(virDomainPtr dom)
 {
     ConnectionData *connection_data = dom->conn->networkPrivateData;
-    SSH_SESSION *ssh_session = connection_data->session;
+    LIBSSH2_SESSION *session = connection_data->session;
     char *managed_system = dom->conn->uri->path;
     int exit_status = 0;
     char *char_ptr = NULL;
@@ -1200,8 +1251,9 @@ phypDomainShutdown(virDomainPtr dom)
         virReportOOMError(dom->conn);
         goto err;
     }
+    PHYP_CMD_DEBUG;
 
-    char *ret = phypExec(ssh_session, cmd, &exit_status, dom->conn);
+    char *ret = phypExec(session, cmd, &exit_status, dom->conn);
 
   err:
     VIR_FREE(cmd);
@@ -1392,3 +1444,34 @@ escape_specialcharacters(char *src, char *dst, size_t dstlen)
 
     return 0;
 }
+
+int
+waitsocket(int socket_fd, LIBSSH2_SESSION * session)
+{
+    struct timeval timeout;
+    int rc;
+    fd_set fd;
+    fd_set *writefd = NULL;
+    fd_set *readfd = NULL;
+    int dir;
+
+    timeout.tv_sec = 10;
+    timeout.tv_usec = 0;
+
+    FD_ZERO(&fd);
+
+    FD_SET(socket_fd, &fd);
+
+    /* now make sure we wait in the correct direction */
+    dir = libssh2_session_block_directions(session);
+
+    if (dir & LIBSSH2_SESSION_BLOCK_INBOUND)
+        readfd = &fd;
+
+    if (dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)
+        writefd = &fd;
+
+    rc = select(socket_fd + 1, readfd, writefd, NULL, &timeout);
+
+    return rc;
+}
diff --git a/src/phyp/phyp_driver.h b/src/phyp/phyp_driver.h
index f16b6fe..ee2ec32 100644
--- a/src/phyp/phyp_driver.h
+++ b/src/phyp/phyp_driver.h
@@ -1,5 +1,5 @@
 #include <config.h>
-#include <libssh/libssh.h>
+#include <libssh2.h>
 
 #define LPAR_EXEC_ERR -1
 #define SSH_CONN_ERR -2         /* error while trying to connect to remote host */
@@ -8,8 +8,9 @@
 typedef struct _ConnectionData ConnectionData;
 typedef ConnectionData *ConnectionDataPtr;
 struct _ConnectionData {
-    SSH_SESSION *session;
+    LIBSSH2_SESSION *session;
     virConnectAuthPtr auth;
+		int sock;
 };
 
 /* This is the lpar (domain) struct that relates
@@ -42,8 +43,6 @@ void stripPath(char *striped_path, char *path);
 
 void stripNewline(char *striped_string, char *string);
 
-int buffer_add_u8(struct buffer_struct *buffer, u8 data);
-
 int phypGetLparState(virConnectPtr conn, unsigned int lpar_id);
 
 unsigned long phypGetLparMem(virConnectPtr conn,
@@ -61,4 +60,6 @@ char *phypGetBackingDevice(virConnectPtr conn, const char *managed_system,
 
 int phypDiskType(virConnectPtr conn, char *backing_device);
 
-SSH_SESSION *openSSHSession(virConnectPtr conn, virConnectAuthPtr auth);
+LIBSSH2_SESSION *openSSHSession(virConnectPtr conn, virConnectAuthPtr auth, int *internal_socket);
+
+int waitsocket(int socket_fd, LIBSSH2_SESSION * session);

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]