public static void ChangeTunnelStatus(TunnelStatuses tunnelStatus, bool saveTunnelStatus = true) { TunnelHelper.CurrentTunnelStatus = tunnelStatus; ServiceSettings serviceSettings = SettingsHelper.GetSettings(); if (saveTunnelStatus) { Settings settings = new Settings(); settings.CurrentTunnelStatus = (int)tunnelStatus; settings.Save(); } if (tunnelStatus == TunnelStatuses.Started) { WcfServerHelper.BroadcastRemoteCallback(x => x.EventToLog("Plink Starting", DateTime.Now), true); if (ProcessHelper.StartPlink()) { TunnelPingHelper.OpenTunnelPingListener(); WcfServerHelper.BroadcastRemoteCallback(x => x.EventToLog("Plink Started: " + ProcessHelper.GetPlinkArguments(serviceSettings), DateTime.Now), true); } else { ChangeTunnelStatus(TunnelStatuses.Paused); } } else { WcfServerHelper.BroadcastRemoteCallback(x => x.EventToLog("Plink Stopping", DateTime.Now), true); TunnelPingHelper.CloseTunnelPingListener(); ProcessHelper.StopPlink(); } WcfServerHelper.BroadcastRemoteCallback(x => x.TunnelStatusChanged(tunnelStatus), true); }
public static void SendTunnelPing() { Task.Factory.StartNew(() => { try { ServiceSettings serviceSettings = SettingsHelper.GetSettings(); TcpClient tcpClient = new TcpClient("localhost", serviceSettings.TunnelValidationLocalPort); using (NetworkStream stream = tcpClient.GetStream()) { byte[] sendData = Encoding.ASCII.GetBytes("-111-"); stream.Write(sendData, 0, sendData.Length); byte[] responseData = new byte[32]; if (stream.CanRead) { int bytesReceived = stream.Read(responseData, 0, responseData.Length); string responseString = Encoding.ASCII.GetString(responseData, 0, bytesReceived); if (responseString.Trim() == "-222-") { WcfServerHelper.BroadcastRemoteCallback((x) => x.EventToLog("Tunnel Validation: Complete", DateTime.Now)); TunnelValidatorLastPingSuccessful = true; TunnelValidatorLastSuccessfulPingTime = DateTime.Now; } else { HandleFailedTunnelPing(); } } else { WcfServerHelper.BroadcastRemoteCallback((x) => x.EventToLog("Tunnel Validation: Sender Error (1)", DateTime.Now)); HandleFailedTunnelPing(); } stream.Close(); } tcpClient.Close(); } catch (Exception ex) { WcfServerHelper.BroadcastRemoteCallback((x) => x.EventToLog("Tunnel Validation Sender Exception (1): " + ex.Message + " ::: " + ex.StackTrace, DateTime.Now)); HandleFailedTunnelPing(); } finally { ClientHelper.PingClient(); } }); }
public static bool StartPlink(ServiceSettings serviceSettings = null, bool testConnection = false) { if (serviceSettings == null) { serviceSettings = SettingsHelper.GetSettings(); } if (string.IsNullOrEmpty(serviceSettings.PlinkExecutable) || !File.Exists(serviceSettings.PlinkExecutable)) { WcfServerHelper.BroadcastRemoteCallback(x => x.TestConnectionCallback(PlinkStatus.ExecutableNotFound)); return(false); } serviceSettings.EnableVerbose = true; _processInfo = new ProcessStartInfo(); _processInfo.FileName = serviceSettings.PlinkExecutable; _processInfo.Arguments = GetPlinkArguments(serviceSettings); _processInfo.RedirectStandardOutput = true; _processInfo.RedirectStandardError = true; _processInfo.RedirectStandardInput = true; _processInfo.UseShellExecute = false; _processInfo.CreateNoWindow = true; _process = new Process(); _process.StartInfo = _processInfo; _process.Start(); _process.StandardInput.NewLine = Environment.NewLine; if (!testConnection) { _process.Exited += process_Exited; PlinkRunning = true; try { PlinkJobObject plinkJobObject = new PlinkJobObject(); plinkJobObject.AddProcess(_process.Id); } catch (Exception ex) { WcfServerHelper.BroadcastRemoteCallback(x => x.EventToLog(ex.Message + " ::: " + ex.StackTrace, DateTime.Now)); return(false); } ClientHelper.PingClient(); } Task.Factory.StartNew(() => ProcessOutputCharacters(_process.StandardError, serviceSettings, testConnection, true)); Task.Factory.StartNew(() => ProcessOutputCharacters(_process.StandardOutput, serviceSettings, testConnection, false)); return(true); }
public static void OpenTunnelPingListener() { if (TunnelValidatorRunning) { CloseTunnelPingListener(); } ServiceSettings serviceSettings = SettingsHelper.GetSettings(); if (TunnelHelper.CurrentTunnelStatus == TunnelStatuses.Started && serviceSettings.EnableTunnelValidation) { TunnelPingHelper.TunnelValidatorLastPingSuccessful = false; _validationListener = new TcpListener(IPAddress.Any, serviceSettings.TunnelValidationRemotePort); Task.Factory.StartNew(() => { TunnelPingHelper.TunnelValidatorRunning = true; _validationListener.Start(); try { while (true) { TcpClient tcpClient; try { tcpClient = _validationListener.AcceptTcpClient(); } catch (SocketException ex) { if (ex.SocketErrorCode == SocketError.Interrupted) { TunnelPingHelper.TunnelValidatorRunning = false; break; } else { throw; } } Task.Factory.StartNew(() => { try { NetworkStream clientStream = tcpClient.GetStream(); byte[] message = new byte[32]; string validationString = ""; while (true) { int bytesRead = clientStream.Read(message, 0, 32); if (bytesRead == 0) { break; } ASCIIEncoding encoding = new ASCIIEncoding(); string str = encoding.GetString(message, 0, bytesRead); validationString += str; if (validationString == "-111-") { const string sendString = "-222-"; byte[] sendData = Encoding.ASCII.GetBytes(sendString); clientStream.Write(sendData, 0, sendData.Length); break; } else if (validationString.Length > 5) { break; } } tcpClient.Close(); } catch (Exception ex) { WcfServerHelper.BroadcastRemoteCallback((x) => x.EventToLog("Tunnel Validation Exception (1): " + ex.Message + " ::: " + ex.StackTrace, DateTime.Now)); HandleFailedTunnelPing(); } }); } } catch (Exception ex) { WcfServerHelper.BroadcastRemoteCallback((x) => x.EventToLog("Tunnel Validation Exception (2): " + ex.Message + " ::: " + ex.StackTrace, DateTime.Now)); HandleFailedTunnelPing(); } }, TaskCreationOptions.LongRunning); _pingTunnelTimer = new System.Timers.Timer(); _pingTunnelTimer.Interval = serviceSettings.TunnelValidationPingInterval * 1000; _pingTunnelTimer.AutoReset = true; _pingTunnelTimer.Elapsed += _pingTunnelTimer_Elapsed; Thread.Sleep(1200); SendTunnelPing(); _pingTunnelTimer.Start(); } }