From 0f0b61afa2e6997da7b0631bf9f008199404d36f Mon Sep 17 00:00:00 2001 From: Heath Volmer Date: Thu, 4 Aug 2016 13:14:32 -0600 Subject: [PATCH] Working through ssh disconnect / leak problems --- .../Pepperdash Core/Comm/GenericSshClient.cs | 144 +++++++++++------- .../Comm/GenericTcpIpClient.cs | 17 ++- .../Pepperdash Core/CommunicationExtras.cs | 6 + .../Pepperdash Core/PepperDash_Core.csproj | 2 +- .../Pepperdash Core/bin/PepperDash_Core.clz | Bin 677723 -> 678068 bytes .../bin/PepperDash_Core.config | 4 +- .../Pepperdash Core/bin/manifest.info | 2 +- .../Pepperdash Core/bin/manifest.ser | Bin 648 -> 649 bytes 8 files changed, 117 insertions(+), 58 deletions(-) diff --git a/Pepperdash Core/Pepperdash Core/Comm/GenericSshClient.cs b/Pepperdash Core/Pepperdash Core/Comm/GenericSshClient.cs index 947f778..afcbec4 100644 --- a/Pepperdash Core/Pepperdash Core/Comm/GenericSshClient.cs +++ b/Pepperdash Core/Pepperdash Core/Comm/GenericSshClient.cs @@ -26,7 +26,7 @@ namespace PepperDash.Core //***************************************************************************************************** //***************************************************************************************************** - public class GenericSshClient : Device, IBasicCommunication + public class GenericSshClient : Device, IBasicCommunication, IAutoReconnect { public event EventHandler BytesReceived; public event EventHandler TextReceived; @@ -66,12 +66,12 @@ namespace PepperDash.Core /// /// Millisecond value, determines the timeout period in between reconnect attempts /// - public ushort AutoReconnectIntervalMs { get; set; } + public int AutoReconnectIntervalMs { get; set; } SshClient Client; ShellStream TheStream; CTimer ReconnectTimer; - bool ReconnectTimerRunning; + //bool ReconnectTimerRunning; public GenericSshClient(string key, string hostname, int port, string username, string password) : base(key) @@ -82,6 +82,21 @@ namespace PepperDash.Core Port = port; Username = username; Password = password; + CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler); + } + + void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType) + { + if (programEventType == eProgramStatusEventType.Stopping) + { + if (Client != null) + { + Debug.Console(2, this, "Closing connection"); + Client.Disconnect(); + Client.Dispose(); + Debug.Console(2, this, "Connection closed"); + } + } } /// @@ -89,59 +104,73 @@ namespace PepperDash.Core /// public void Connect() { - ReconnectTimerRunning = false; + Debug.Console(1, this, "attempting connect, IsConnected={0}", Client != null ? Client.IsConnected : false); + + //ReconnectTimerRunning = false; + if (ReconnectTimer != null) + { + ReconnectTimer.Stop(); + ReconnectTimer = null; + } + + if (IsConnected) + return; + if (Hostname != null && Hostname != string.Empty && Port > 0 && Username != null && Password != null) { - Debug.Console(1, this, "attempting connect, IsConnected={0}", IsConnected); - if (!IsConnected) - { - UStatus = 1; - IsConnected = false; - // This handles both password and keyboard-interactive (like on OS-X, 'nixes) - KeyboardInteractiveAuthenticationMethod kauth = new KeyboardInteractiveAuthenticationMethod(Username); - kauth.AuthenticationPrompt += new EventHandler(kauth_AuthenticationPrompt); - PasswordAuthenticationMethod pauth = new PasswordAuthenticationMethod(Username, Password); - ConnectionInfo connectionInfo = new ConnectionInfo(Hostname, Port, Username, pauth, kauth); - Client = new SshClient(connectionInfo); - Client.ErrorOccurred += Client_ErrorOccurred; - try + UStatus = 1; + IsConnected = false; + + // This handles both password and keyboard-interactive (like on OS-X, 'nixes) + KeyboardInteractiveAuthenticationMethod kauth = new KeyboardInteractiveAuthenticationMethod(Username); + kauth.AuthenticationPrompt += new EventHandler(kauth_AuthenticationPrompt); + PasswordAuthenticationMethod pauth = new PasswordAuthenticationMethod(Username, Password); + ConnectionInfo connectionInfo = new ConnectionInfo(Hostname, Port, Username, pauth, kauth); + // always spin up new client in case parameters have changed + if (Client != null) + { + Client.Disconnect(); + Client = null; + //Client.Dispose(); + } + Client = new SshClient(connectionInfo); + + Client.ErrorOccurred += Client_ErrorOccurred; + try + { + Client.Connect(); + if (Client.IsConnected) { - Client.Connect(); - if (Client.IsConnected) - { - Client.KeepAliveInterval = TimeSpan.FromSeconds(2); - Client.SendKeepAlive(); - IsConnected = true; - Debug.Console(1, this, "Connected"); - TheStream = Client.CreateShellStream("PDTShell", 100, 80, 100, 200, 65534); - TheStream.DataReceived += Stream_DataReceived; - //TheStream.ErrorOccurred += Stream_ErrorOccurred; - - } - return; - } - catch (SshConnectionException e) - { - var ie = e.InnerException; // The details are inside!! - string msg; - if (ie is SocketException) - msg = string.Format("'{0}' CONNECTION failure: Cannot reach host, ({1})", Key, ie.GetType()); - else if (ie is System.Net.Sockets.SocketException) - msg = string.Format("'{0}' Connection failure: Cannot reach host '{1}' on port {2}, ({3})", - Key, Hostname, Port, ie.GetType()); - else if (ie is SshAuthenticationException) - { - msg = string.Format("'{0}' Authentication failure for username '{1}', ({2})", - Username, Key, ie.GetType()); - Debug.Console(0, this, "Authentication failure for username '{0}', ({1})", - Username, ie.GetType()); - } - else - Debug.Console(0, this, "Error on connect:\r({0})", e); + Client.KeepAliveInterval = TimeSpan.FromSeconds(2); + Client.SendKeepAlive(); + IsConnected = true; + Debug.Console(1, this, "Connected"); + TheStream = Client.CreateShellStream("PDTShell", 100, 80, 100, 200, 65534); + TheStream.DataReceived += Stream_DataReceived; } + return; } + catch (SshConnectionException e) + { + var ie = e.InnerException; // The details are inside!! + string msg; + if (ie is SocketException) + msg = string.Format("'{0}' CONNECTION failure: Cannot reach host, ({1})", Key, ie.GetType()); + else if (ie is System.Net.Sockets.SocketException) + msg = string.Format("'{0}' Connection failure: Cannot reach host '{1}' on port {2}, ({3})", + Key, Hostname, Port, ie.GetType()); + else if (ie is SshAuthenticationException) + { + msg = string.Format("'{0}' Authentication failure for username '{1}', ({2})", + Username, Key, ie.GetType()); + Debug.Console(0, this, "Authentication failure for username '{0}', ({1})", + Username, ie.GetType()); + } + else + Debug.Console(0, this, "Error on connect:\r({0})", e); + } } else { @@ -160,7 +189,11 @@ namespace PepperDash.Core public void Disconnect() { // Stop trying reconnects, if we are - if(ReconnectTimer != null) ReconnectTimer.Stop(); + if (ReconnectTimer != null) + { + ReconnectTimer.Stop(); + ReconnectTimer = null; + } // Otherwise just close up if (Client != null) // && Client.IsConnected) <-- Doesn't always report properly... { @@ -181,10 +214,13 @@ namespace PepperDash.Core AutoReconnect, AutoReconnectIntervalMs); if (AutoReconnect) { - if (ReconnectTimer == null || !ReconnectTimerRunning) + if (ReconnectTimer == null)// || !ReconnectTimerRunning) { - ReconnectTimer = new CTimer(o => Connect(), AutoReconnectIntervalMs); - ReconnectTimerRunning = true; + ReconnectTimer = new CTimer(o => + { + Connect(); + ReconnectTimer = null; + }, AutoReconnectIntervalMs); Debug.Console(1, this, "Attempting connection in {0} seconds", (float)(AutoReconnectIntervalMs / 1000)); } @@ -251,6 +287,8 @@ namespace PepperDash.Core Debug.Console(0, this, "SSH client error: {0}", e.Exception); UStatus = 4; } + Client.Disconnect(); + Client = null; Debug.Console(1, this, "Disconnected by remote"); IsConnected = false; HandleConnectionFailure(); diff --git a/Pepperdash Core/Pepperdash Core/Comm/GenericTcpIpClient.cs b/Pepperdash Core/Pepperdash Core/Comm/GenericTcpIpClient.cs index 93dee26..2ec5be1 100644 --- a/Pepperdash Core/Pepperdash Core/Comm/GenericTcpIpClient.cs +++ b/Pepperdash Core/Pepperdash Core/Comm/GenericTcpIpClient.cs @@ -11,7 +11,7 @@ using Newtonsoft.Json.Linq; namespace PepperDash.Core { - public class GenericTcpIpClient : Device, IBasicCommunication + public class GenericTcpIpClient : Device, IBasicCommunication, IAutoReconnect { public event EventHandler BytesReceived; public event EventHandler TextReceived; @@ -21,6 +21,9 @@ namespace PepperDash.Core public string Status { get { return Client.ClientStatus.ToString(); } } public string ConnectionFailure { get { return Client.ClientStatus.ToString(); } } + public bool AutoReconnect { get; set; } + public int AutoReconnectIntervalMs { get; set; } + public bool Connected { get { return Client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED; } @@ -173,9 +176,21 @@ namespace PepperDash.Core /// public int BufferSize { get; set; } + /// + /// Defaults to true + /// + public bool AutoReconnect { get; set; } + + /// + /// Defaults to 5000ms + /// + public int AutoReconnectIntervalMs { get; set; } + public TcpIpConfig() { BufferSize = 32768; + AutoReconnect = true; + AutoReconnectIntervalMs = 5000; } } diff --git a/Pepperdash Core/Pepperdash Core/CommunicationExtras.cs b/Pepperdash Core/Pepperdash Core/CommunicationExtras.cs index a935d5e..fc50f0f 100644 --- a/Pepperdash Core/Pepperdash Core/CommunicationExtras.cs +++ b/Pepperdash Core/Pepperdash Core/CommunicationExtras.cs @@ -23,6 +23,12 @@ namespace PepperDash.Core void Connect(); } + public interface IAutoReconnect + { + bool AutoReconnect { get; set; } + int AutoReconnectIntervalMs { get; set; } + } + /// /// /// diff --git a/Pepperdash Core/Pepperdash Core/PepperDash_Core.csproj b/Pepperdash Core/Pepperdash Core/PepperDash_Core.csproj index 45c8b85..b55d637 100644 --- a/Pepperdash Core/Pepperdash Core/PepperDash_Core.csproj +++ b/Pepperdash Core/Pepperdash Core/PepperDash_Core.csproj @@ -82,7 +82,7 @@ C:\Users\hvolm\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.clz 1.007.0017 - 8/3/2016 4:33:09 PM + 8/4/2016 12:58:52 PM False diff --git a/Pepperdash Core/Pepperdash Core/bin/PepperDash_Core.clz b/Pepperdash Core/Pepperdash Core/bin/PepperDash_Core.clz index 5fbbc27792dd4c7088b90d710b6d31dee8aaa9eb..bb723ccabb68ec869345b8f45e894b038df2c43a 100644 GIT binary patch delta 12839 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 Cj5mY; delta 12488 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 - 8/3/2016 4:33:09 PM - 1.0.0.27993 + 8/4/2016 12:58:52 PM + 1.0.0.21565 \ No newline at end of file diff --git a/Pepperdash Core/Pepperdash Core/bin/manifest.info b/Pepperdash Core/Pepperdash Core/bin/manifest.info index 1fef01c..0949a69 100644 --- a/Pepperdash Core/Pepperdash Core/bin/manifest.info +++ b/Pepperdash Core/Pepperdash Core/bin/manifest.info @@ -1,4 +1,4 @@ -MainAssembly=PepperDash_Core.dll:ca423b7b3c2fe76c3d6a8b9cb9ff67cd +MainAssembly=PepperDash_Core.dll:1e2af81f50d343b460b7e2684b9db8fe MainAssemblyMinFirmwareVersion=1.007.0017 ü DependencySource=Newtonsoft.Json.Compact.dll:ea996aa2ec65aa1878e7c9d09e37a896 diff --git a/Pepperdash Core/Pepperdash Core/bin/manifest.ser b/Pepperdash Core/Pepperdash Core/bin/manifest.ser index 82edbc63487385d78d68a13ecd1c5095f0160b93..e52d1c5e406908d49af2a79c14bd8687bc7135fb 100644 GIT binary patch delta 212 zcmV;_04x891&IZayal`WKfMo;!5e>skMq6k{9yO|{?6>){=Lcmr#q7e`QE1o`;&*W z$-#L}jbB&mdOD2#%dDLbe)+tbW~H_`dG!1KzF#$j@bCNk&M&KS@%#S1PxIz&TdjWI z-}kDj-xkY@-}m=jF_alW*=~x(s%++2z1p4R=PXCV%?OZ!{Ez7_4`y?s53$6?(>=iUdu OA5XLWy?c`flY7&>^Zdc5(|fZ|vxCXQ>Ez-0 z`KJ%2Giv<0TG!KI>|bW>eDKTX)if)$#mS@J_xJs(A%uV5-*IINrK-232{ N{69SoI6DOf005w}cZ~o5