public static ServiceSettings GetSettings()
        {
            Settings settings = new Settings();
            ServiceSettings serviceSettings = new ServiceSettings();

            serviceSettings.DynamicSocksHost = settings.DynamicSocksHost;
            serviceSettings.DynamicSocksPort = settings.DynamicSocksPort;
            serviceSettings.EnableCompression = settings.EnableCompression;
            serviceSettings.EnableDynamicSocks = settings.EnableDynamicSocks;
            serviceSettings.EnableTunnelValidation = settings.EnableTunnelValidation;
            serviceSettings.EnableVerbose = settings.EnableVerbose;
            serviceSettings.PlinkExecutable = settings.PlinkExecutable;
            serviceSettings.SshHostname = settings.SshHostname;
            serviceSettings.SshPassword = CryptoHelper.ToInsecureString(CryptoHelper.DecryptString(settings.SshPassword));
            serviceSettings.SshPort = settings.SshPort;
            serviceSettings.SshUsername = settings.SshUsername;
            serviceSettings.TunnelValidationLocalPort = settings.TunnelValidationLocalPort;
            serviceSettings.TunnelValidationPingInterval = settings.TunnelValidationPingInterval;
            serviceSettings.TunnelValidationPingTimeout = settings.TunnelValidationPingTimeout;
            serviceSettings.TunnelValidationRemotePort = settings.TunnelValidationRemotePort;
            serviceSettings.EnableIcmpValidation = settings.EnableIcmpValidation;
            serviceSettings.IcmpValidationHostnames = settings.IcmpValidationHostnames;
            serviceSettings.IcmpValidationPingSshServer = settings.IcmpValidationPingSshServer;
            serviceSettings.UiMinimizedToSysTray = settings.UiMinimizedToSysTray;
            serviceSettings.UiShowSysTrayNotifications = settings.UiShowSysTrayNotifications;
            serviceSettings.UiStartMinimized = settings.UiStartMinimized;
            serviceSettings.UiStartWithWindows = settings.UiStartWithWindows;
            serviceSettings.LocalTunnels = settings.LocalTunnels;
            serviceSettings.RemoteTunnels = settings.RemoteTunnels;

            return serviceSettings;
        }
        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);
        }
        protected override void OnStart(string[] args)
        {
            if (Settings.Default.UpgradeRequired)
            {
                Settings.Default.Upgrade();
                Settings.Default.UpgradeRequired = false;
                Settings.Default.Save();
            }

            WcfServerHelper.Start(typeof(ServiceRemoting));

            _pingClientTimer = new System.Timers.Timer(Constants.ServerPingInterval * 1000);
            _pingClientTimer.AutoReset = true;
            _pingClientTimer.Elapsed += pingTimer_Elapsed;
            _pingClientTimer.Start();

            Settings settings = new Settings();
            if (settings.CurrentTunnelStatus == (int)TunnelStatuses.Started)
            {
                TunnelHelper.ChangeTunnelStatus(TunnelStatuses.Started, false);
            }
        }
        public static void SaveSettings(ServiceSettings serviceSettings)
        {
            try
            {
                Settings settings = new Settings();

                settings.DynamicSocksHost = serviceSettings.DynamicSocksHost;
                settings.DynamicSocksPort = serviceSettings.DynamicSocksPort;
                settings.EnableCompression = serviceSettings.EnableCompression;
                settings.EnableDynamicSocks = serviceSettings.EnableDynamicSocks;
                settings.EnableTunnelValidation = serviceSettings.EnableTunnelValidation;
                settings.EnableVerbose = serviceSettings.EnableVerbose;
                settings.PlinkExecutable = serviceSettings.PlinkExecutable;
                settings.SshHostname = serviceSettings.SshHostname;
                settings.SshPassword = CryptoHelper.EncryptString(CryptoHelper.ToSecureString(serviceSettings.SshPassword));
                settings.SshPort = serviceSettings.SshPort;
                settings.SshUsername = serviceSettings.SshUsername;
                settings.TunnelValidationLocalPort = serviceSettings.TunnelValidationLocalPort;
                settings.TunnelValidationPingInterval = serviceSettings.TunnelValidationPingInterval;
                settings.TunnelValidationPingTimeout = serviceSettings.TunnelValidationPingTimeout;
                settings.TunnelValidationRemotePort = serviceSettings.TunnelValidationRemotePort;
                settings.EnableIcmpValidation = serviceSettings.EnableIcmpValidation;
                settings.IcmpValidationHostnames = serviceSettings.IcmpValidationHostnames;
                settings.IcmpValidationPingSshServer = serviceSettings.IcmpValidationPingSshServer;
                settings.UiMinimizedToSysTray = serviceSettings.UiMinimizedToSysTray;
                settings.UiShowSysTrayNotifications = serviceSettings.UiShowSysTrayNotifications;
                settings.UiStartMinimized = serviceSettings.UiStartMinimized;
                settings.UiStartWithWindows = serviceSettings.UiStartWithWindows;
                settings.LocalTunnels = serviceSettings.LocalTunnels;
                settings.RemoteTunnels = serviceSettings.RemoteTunnels;

                settings.Save();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }