Пример #1
0
        public static void ReportServerHealth(object state)
        {
            try
            {
                HealthReport report = new HealthReport()
                {
                    SampleIntervalInSec = _perfCounterInterval,
                    MachineName         = machineName,
                    BeginTimestamp      = DateTime.UtcNow
                };
                CheckingServiceAreRunning();

                SetPerfCounter(report);
                SetRemoteAccessSslCertificate(report);
                SetRemoteAccess(report);
                SetRemoteAccessRadius(report);
                SetSSServerRunningStatus(report);

                report.EndTimestamp = DateTime.UtcNow;
                repo.InsertServerHealthReport(report);
            }
            catch (Exception ex)
            {
                logger.Log(EventLogEntryType.Error, ex.Message);
                logger.Log(EventLogEntryType.Error, ex.StackTrace);
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.StackTrace);
            }

            _timerReportServerHealth.Change(1000, Timeout.Infinite);

            void CheckingServiceAreRunning()
            {
                perfCounterPS.Commands.Clear();
                perfCounterPS.AddScript("Get-Service RaMgmtSvc, RemoteAccess, RouterReporter | Where-Object { $PSItem.Status -eq 'Running'}");
                var psos = perfCounterPS.Invoke <ServiceController>();

                if (psos.Count != 3)//TODO
                {
                    throw new Exception("service not running...");
                }
            }

            void SetPerfCounter(HealthReport report)
            {
                perfCounterPS.Commands.Clear();
                perfCounterPS.AddScript($"Get-Counter -Counter '{CounterName.NetworkIn}','{CounterName.NetworkOut}','{CounterName.NetworkTotal}','{CounterName.ProcessorInformationTotal}','{CounterName.MemoryAvailableMBytes}' -SampleInterval {_perfCounterInterval} | Select-Object -ExpandProperty CounterSamples");
                var psos = perfCounterPS.Invoke <PerformanceCounterSample>();

                if (!psos.IsNullOrCountEqualsZero())
                {
                    var netCounterSample = psos.FirstOrDefault(c => c.Path.Contains("network") && c.CookedValue != 0);
                    if (netCounterSample != null)
                    {
                        var networkInterfaceName  = CounterName.GetNetworkInterfaceName(netCounterSample.Path);
                        var receivedCounterSample = psos.FirstOrDefault(c => c.Path.Contains(networkInterfaceName) && c.Path.Contains("received"));
                        var sentCounterSample     = psos.FirstOrDefault(c => c.Path.Contains(networkInterfaceName) && c.Path.Contains("sent"));
                        var totalCounterSample    = psos.FirstOrDefault(c => c.Path.Contains(networkInterfaceName) && c.Path.Contains("total"));
                        report.SetNetwork(receivedCounterSample, sentCounterSample, totalCounterSample);
                    }
                    var proTotal = psos.FirstOrDefault(c => c.Path.Contains("processor"));
                    if (proTotal != null)
                    {
                        report.ProcessorTime = proTotal.CookedValue;
                    }
                    var memoTotal = psos.FirstOrDefault(c => c.Path.Contains("memory"));
                    if (memoTotal != null)
                    {
                        report.AvailableMemoryMegaBytes = memoTotal.CookedValue;
                    }
                }
            }

            void SetRemoteAccessRadius(HealthReport report)
            {
            }

            void SetRemoteAccessSslCertificate(HealthReport report)
            {
                perfCounterPS.Commands.Clear();
                perfCounterPS.AddScript($"Get-RemoteAccess | Select-Object -ExpandProperty SslCertificate");
                var psos = perfCounterPS.Invoke <X509Certificate2>();

                if (psos.IsNullOrCountEqualsZero())
                {
                    throw new ItemNotFoundException("SslCertificate");
                }
                report.SetX509Certificate2(psos.First());
            }

            void SetRemoteAccess(HealthReport report)
            {
                perfCounterPS.Commands.Clear();
                perfCounterPS.AddCommand($"Get-RemoteAccess");
                var psos = perfCounterPS.Invoke();

                if (psos.IsNullOrCountEqualsZero())
                {
                    throw new Exception("Get-RemoteAccess fail.");
                }
                report.SetRemoteAccess(psos.First());
            }

            void SetSSServerRunningStatus(HealthReport report)
            {
                perfCounterPS.Commands.Clear();
                perfCounterPS.AddScript($"Get-Process ssserver");
                var psos = perfCounterPS.Invoke();

                if (psos.IsNullOrCountEqualsZero())
                {
                    report.IsShadowsocksServerRunning = false;
                }
                else
                {
                    report.IsShadowsocksServerRunning = true;
                }
            }
        }