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);
        }
Ejemplo n.º 2
0
        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();
                }
            });
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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();
            }
        }