Windows installer adds PING and SSH subagents to agent configuration on server
[public/netxms.git] / src / agent / subagents / ssh / session.cpp
index 6509eff..449dfdf 100644 (file)
@@ -17,7 +17,6 @@
 ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 **
 ** File: session.cpp
-**
 **/
 
 #include "ssh_subagent.h"
 /**
  * SSH session constructor
  */
-SSHSession::SSHSession(const InetAddress& addr, UINT16 port)
+SSHSession::SSHSession(const InetAddress& addr, UINT16 port, INT32 id)
 {
+   m_id = id;
    m_addr = addr;
    m_port = port;
    m_session = NULL;
+   m_lastAccess = 0;
+   m_user[0] = 0;
+   m_busy = false;
+   _sntprintf(m_name, MAX_SSH_SESSION_NAME_LEN, _T("nobody@%s:%d/%d"), (const TCHAR *)m_addr.toString(), m_port, m_id);
 }
 
 /**
@@ -40,6 +44,33 @@ SSHSession::~SSHSession()
    disconnect();
 }
 
+/**
+ * Check if session match for given target
+ */
+bool SSHSession::match(const InetAddress& addr, UINT16 port, const TCHAR *user) const
+{
+   return addr.equals(m_addr) && ((unsigned int)port == m_port) && !_tcscmp(m_user, user);
+}
+
+/**
+ * Acquire session
+ */
+bool SSHSession::acquire()
+{
+   if (m_busy || !isConnected())
+      return false;
+   m_busy = true;
+   return true;
+}
+
+/**
+ * Release session
+ */
+void SSHSession::release()
+{
+   m_busy = false;
+}
+
 /**
  * Connect to server
  */
@@ -57,8 +88,8 @@ bool SSHSession::connect(const TCHAR *user, const TCHAR *password)
    char hostname[64];
    ssh_options_set(m_session, SSH_OPTIONS_HOST, m_addr.toStringA(hostname));
    ssh_options_set(m_session, SSH_OPTIONS_PORT, &m_port);
-   long timeout = 2;
-   ssh_options_set(m_session, SSH_OPTIONS_TIMEOUT, &timeout);
+   long timeout = (long)g_sshConnectTimeout * (long)1000;   // convert milliseconds to microseconds
+   ssh_options_set(m_session, SSH_OPTIONS_TIMEOUT_USEC, &timeout);
 #ifdef UNICODE
    char mbuser[256];
    WideCharToMultiByte(CP_UTF8, 0, user, -1, mbuser, 256, NULL, NULL);
@@ -89,7 +120,13 @@ bool SSHSession::connect(const TCHAR *user, const TCHAR *password)
       nxlog_debug(6, _T("SSH: connect to %s:%d failed"), (const TCHAR *)m_addr.toString(), m_port);
    }
 
-   if (!success)
+   if (success)
+   {
+      nx_strncpy(m_user, user, MAX_SSH_LOGIN_LEN);
+      _sntprintf(m_name, MAX_SSH_SESSION_NAME_LEN, _T("%s@%s:%d/%d"), m_user, (const TCHAR *)m_addr.toString(), m_port, m_id);
+      m_lastAccess = time(NULL);
+   }
+   else
    {
       if (ssh_is_connected(m_session))
          ssh_disconnect(m_session);
@@ -147,11 +184,14 @@ StringList *SSHSession::execute(const TCHAR *command)
             while(eol != NULL)
             {
                *eol = 0;
+               char *cr = strchr(curr, '\r');
+               if (cr != NULL)
+                  *cr = 0;
                output->addMBString(curr);
                curr = eol + 1;
                eol = strchr(curr, '\n');
             }
-            offset = strlen(curr);
+            offset = (int)strlen(curr);
             if (offset > 0)
                memmove(buffer, curr, offset);
             nbytes = ssh_channel_read(channel, &buffer[offset], sizeof(buffer) - offset - 1, 0);
@@ -161,6 +201,9 @@ StringList *SSHSession::execute(const TCHAR *command)
             if (offset > 0)
             {
                buffer[offset] = 0;
+               char *cr = strchr(buffer, '\r');
+               if (cr != NULL)
+                  *cr = 0;
                output->addMBString(buffer);
             }
             ssh_channel_send_eof(channel);
@@ -181,5 +224,6 @@ StringList *SSHSession::execute(const TCHAR *command)
       nxlog_debug(6, _T("SSH: cannot open channel on %s:%d"), (const TCHAR *)m_addr.toString(), m_port);
    }
    ssh_channel_free(channel);
+   m_lastAccess = time(NULL);
    return output;
 }