public void CheckHealthStateAndRespond(HttpContext httpContext) { if (!HealthCheckResponder.HealthCheckResponderEnabled.Value) { this.RespondSuccess(httpContext); } else { ServerComponentEnum serverComponent = ServerComponentEnum.None; if (!HealthCheckResponder.ProtocolServerComponentMap.TryGetValue(HttpProxyGlobals.ProtocolType, out serverComponent)) { throw new InvalidOperationException("Unknown protocol type " + HttpProxyGlobals.ProtocolType); } if (HealthCheckResponder.HealthCheckResponderServerComponentOverride.Value != ServerComponentEnum.None) { serverComponent = HealthCheckResponder.HealthCheckResponderServerComponentOverride.Value; } DateTime utcNow = DateTime.UtcNow; if (this.componentStateNextLookupTime <= utcNow) { this.isComponentOnline = ServerComponentStateManager.IsOnline(serverComponent); this.componentStateNextLookupTime = utcNow.AddSeconds(15.0); } if (!this.isComponentOnline) { this.RespondFailure(httpContext); } else { this.RespondSuccess(httpContext); } } httpContext.ApplicationInstance.CompleteRequest(); }
// Token: 0x06000010 RID: 16 RVA: 0x000024E8 File Offset: 0x000006E8 private void Run(string[] args) { bool flag = false; bool flag2 = false; bool flag3 = false; bool flag4 = false; string text = null; string name = null; string name2 = null; string s = null; foreach (string text2 in args) { if (text2.StartsWith("-?", StringComparison.OrdinalIgnoreCase)) { MonitoringWorker.PrintUsageAndExit(); } else if (text2.StartsWith("-console", StringComparison.OrdinalIgnoreCase)) { flag3 = true; } else if (text2.StartsWith("-stopkey:", StringComparison.OrdinalIgnoreCase)) { text = text2.Remove(0, "-stopkey:".Length); } else if (text2.StartsWith("-hangkey:", StringComparison.OrdinalIgnoreCase)) { name = text2.Remove(0, "-hangkey:".Length); } else if (text2.StartsWith("-resetkey:", StringComparison.OrdinalIgnoreCase)) { text2.Remove(0, "-resetkey:".Length); } else if (text2.StartsWith("-readykey:", StringComparison.OrdinalIgnoreCase)) { name2 = text2.Remove(0, "-readykey:".Length); } else if (text2.StartsWith("-pipe:", StringComparison.OrdinalIgnoreCase)) { s = text2.Remove(0, "-pipe:".Length); } else if (text2.StartsWith("-paused", StringComparison.OrdinalIgnoreCase)) { flag = true; } else if (text2.StartsWith("-passive", StringComparison.OrdinalIgnoreCase)) { flag2 = true; } else if (text2.StartsWith("-wait", StringComparison.OrdinalIgnoreCase)) { flag4 = true; } } this.serviceControlled = !string.IsNullOrEmpty(text); if (!this.serviceControlled) { if (!flag3) { MonitoringWorker.PrintUsageAndExit(); } Console.WriteLine("Starting {0}, running in console mode.", Assembly.GetExecutingAssembly().GetName().Name); if (flag4) { Console.WriteLine("Press ENTER to continue."); Console.ReadLine(); } } this.stopHandle = MonitoringWorker.OpenSemaphore(text, "stop"); this.hangHandle = MonitoringWorker.OpenSemaphore(name, "hang"); this.readyHandle = MonitoringWorker.OpenSemaphore(name2, "ready"); if (this.hangHandle != null) { new Thread(new ThreadStart(this.WaitForHangSignal)) { IsBackground = true }.Start(); } if (CriticalDependencyAlertEscalator.RunningInMicrosoftDatacenter()) { bool flag5 = true; string name3 = "SOFTWARE\\Microsoft\\ExchangeServer\\v15\\ActiveMonitoring\\CriticalDependencyVerification\\"; using (RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(name3)) { if (registryKey != null) { object value = registryKey.GetValue("Enabled"); if (value != null && value is int && (int)value == 0) { flag5 = false; } } } if (flag5) { WTFLogger.Instance.LogDebug(WTFLog.Core, TracingContext.Default, "Attempting to verify critical dependencies before continuing with initialization.", "Run", "f:\\15.00.1497\\sources\\dev\\monitoring\\src\\ActiveMonitoring\\Local\\WorkerProcess\\Program.cs", 543); CriticalDependencyVerification criticalDependencyVerification = new CriticalDependencyVerification(ExTraceGlobals.CommonComponentsTracer, TracingContext.Default); if (!criticalDependencyVerification.VerifyDependencies()) { WTFLogger.Instance.LogError(WTFLog.Core, TracingContext.Default, "Failed to verify one or more critical dependencies. We will try to continue running, but may hang, crash, or exit unexpectedly.", "Run", "f:\\15.00.1497\\sources\\dev\\monitoring\\src\\ActiveMonitoring\\Local\\WorkerProcess\\Program.cs", 551); } else { WTFLogger.Instance.LogDebug(WTFLog.Core, TracingContext.Default, "Successfully verified all critical dependencies. Continuing with initialization.", "Run", "f:\\15.00.1497\\sources\\dev\\monitoring\\src\\ActiveMonitoring\\Local\\WorkerProcess\\Program.cs", 555); } } } if (!ServiceTopologyProvider.IsAdTopologyServiceInstalled()) { ADSession.SetAdminTopologyMode(); } Globals.InitializeMultiPerfCounterInstance("ExHMWorker"); LocalEndpointManager.UseMaintenanceWorkItem = true; WTFLogger.Instance.LogDebug(WTFLog.Core, TracingContext.Default, "Initializing global override lists", "Run", "f:\\15.00.1497\\sources\\dev\\monitoring\\src\\ActiveMonitoring\\Local\\WorkerProcess\\Program.cs", 573); try { DirectoryAccessor.Instance.LoadGlobalOverrides(); } catch (Exception arg) { ExTraceGlobals.WorkerTracer.TraceError <Exception>(0L, "Initializing global override lists failed with exception {0}", arg); } WTFLogger.Instance.LogDebug(WTFLog.Core, TracingContext.Default, "Initializing local override lists", "Run", "f:\\15.00.1497\\sources\\dev\\monitoring\\src\\ActiveMonitoring\\Local\\WorkerProcess\\Program.cs", 586); LocalOverrideManager.LoadLocalOverrides(); Settings.RemoveAllOverrides(); if (MaintenanceDefinition.GlobalOverrides != null) { foreach (WorkDefinitionOverride o in MaintenanceDefinition.GlobalOverrides) { this.ApplyConfigurationOverrideIfNecessary(o); } } if (MaintenanceDefinition.LocalOverrides != null) { foreach (WorkDefinitionOverride o2 in MaintenanceDefinition.LocalOverrides) { this.ApplyConfigurationOverrideIfNecessary(o2); } } Assembly assembly = typeof(LocalEndpointManager).Assembly; WorkItemFactory.DefaultAssemblies["Microsoft.Exchange.Monitoring.ActiveMonitoring.Local.Components.dll"] = assembly; WorkItemFactory.DefaultAssemblies[assembly.Location] = assembly; WorkItemFactory factory = new WorkItemFactory(); bool flag6 = true; bool flag7 = true; try { flag6 = ServerComponentStateManager.IsOnline(ServerComponentEnum.Monitoring); } catch (Exception ex) { MonitoringWorker.eventLogger.LogEvent(MSExchangeHMEventLogConstants.Tuple_FailedToGetIsOnlineState, null, new object[] { MonitoringWorker.processId, ServerComponentEnum.Monitoring.ToString(), flag6.ToString(), ex.ToString() }); } try { flag7 = ServerComponentStateManager.IsOnline(ServerComponentEnum.RecoveryActionsEnabled); } catch (Exception ex2) { MonitoringWorker.eventLogger.LogEvent(MSExchangeHMEventLogConstants.Tuple_FailedToGetIsOnlineState, null, new object[] { MonitoringWorker.processId, ServerComponentEnum.RecoveryActionsEnabled.ToString(), flag7.ToString(), ex2.ToString() }); } if (flag6 && flag7) { this.activeMonitoringWorker = new Worker(new WorkBroker[] { new ProbeWorkBroker <LocalDataAccess>(factory), new MonitorWorkBroker <LocalDataAccess>(factory), new ResponderWorkBroker <LocalDataAccess>(factory), new MaintenanceWorkBroker <LocalDataAccess>(factory) }, new Action(this.OnExitCallback), true); MonitoringWorker.eventLogger.LogEvent(MSExchangeHMEventLogConstants.Tuple_HealthManagerWorkerStarted, null, new object[] { MonitoringWorker.processId, Strings.StartedWithAllWorkBrokers(flag6, flag7) }); } else if (flag6 && !flag7) { this.activeMonitoringWorker = new Worker(new WorkBroker[] { new ProbeWorkBroker <LocalDataAccess>(factory), new MonitorWorkBroker <LocalDataAccess>(factory), new MaintenanceWorkBroker <LocalDataAccess>(factory) }, new Action(this.OnExitCallback), true); MonitoringWorker.eventLogger.LogEvent(MSExchangeHMEventLogConstants.Tuple_HealthManagerWorkerStarted, null, new object[] { MonitoringWorker.processId, Strings.StartedWithAllWorkBrokersExceptResponder(flag6, flag7) }); } else { this.activeMonitoringWorker = new Worker(new WorkBroker[] { new MaintenanceWorkBroker <LocalDataAccess>(factory) }, new Action(this.OnExitCallback), true); MonitoringWorker.eventLogger.LogEvent(MSExchangeHMEventLogConstants.Tuple_HealthManagerWorkerStarted, null, new object[] { MonitoringWorker.processId, Strings.StartedWithMaintenanceWorkBrokerOnly(flag6, flag7) }); } try { if (this.serviceControlled) { SafeFileHandle handle = new SafeFileHandle(new IntPtr(long.Parse(s)), true); this.listenPipeStream = new PipeStream(handle, FileAccess.Read, true); this.controlObject = new ControlObject(this.listenPipeStream, this); if (this.controlObject.Initialize()) { if (this.readyHandle != null) { WTFLogger.Instance.LogDebug(WTFLog.Core, TracingContext.Default, "Signal the process is ready", "Run", "f:\\15.00.1497\\sources\\dev\\monitoring\\src\\ActiveMonitoring\\Local\\WorkerProcess\\Program.cs", 726); this.readyHandle.Release(); this.readyHandle.Close(); this.readyHandle = null; } if (!flag && !flag2) { WTFLogger.Instance.LogDebug(WTFLog.Core, TracingContext.Default, "Start processing work items", "Run", "f:\\15.00.1497\\sources\\dev\\monitoring\\src\\ActiveMonitoring\\Local\\WorkerProcess\\Program.cs", 736); this.Activate(); } WTFLogger.Instance.LogDebug(WTFLog.Core, TracingContext.Default, "Waiting for shutdown signal to exit.", "Run", "f:\\15.00.1497\\sources\\dev\\monitoring\\src\\ActiveMonitoring\\Local\\WorkerProcess\\Program.cs", 742); this.stopHandle.WaitOne(); } } else { if (!flag) { Console.WriteLine("Start processing work items"); this.Activate(); } Console.WriteLine("Press ENTER to exit "); bool flag8 = false; while (!flag8) { string text3 = Console.ReadLine(); if (string.IsNullOrEmpty(text3)) { Console.WriteLine("Exiting."); flag8 = true; } else if (text3.Equals("p")) { Console.WriteLine("Pause."); this.Pause(); } else if (text3.Equals("c")) { Console.WriteLine("Continue."); this.Continue(); } else if (text3.Equals("s")) { Console.WriteLine("Stop."); this.Stop(); } else { Console.WriteLine("Unknown command."); } } } } catch (Exception ex3) { MonitoringWorker.eventLogger.LogEvent(MSExchangeHMEventLogConstants.Tuple_WorkerRestartOnUnknown, null, new object[] { MonitoringWorker.processId, ex3.ToString() }); if (!this.serviceControlled && ((ex3 is Win32Exception && ((Win32Exception)ex3).NativeErrorCode == 5) || ex3 is UnauthorizedAccessException || ex3 is SecurityAccessDeniedException)) { Console.WriteLine("You must run the worker process with elevated privileges"); } } WTFLogger.Instance.LogDebug(WTFLog.Core, TracingContext.Default, "Received a signal to shut down. Closing control pipe.", "Run", "f:\\15.00.1497\\sources\\dev\\monitoring\\src\\ActiveMonitoring\\Local\\WorkerProcess\\Program.cs", 814); this.DoCleanUp(); this.SavePersistentState(); WTFLogger.Instance.LogDebug(WTFLog.Core, TracingContext.Default, "Monitoring worker process stopped.", "Run", "f:\\15.00.1497\\sources\\dev\\monitoring\\src\\ActiveMonitoring\\Local\\WorkerProcess\\Program.cs", 820); WTFLogger.Instance.Flush(); MonitoringWorker.eventLogger.LogEvent(MSExchangeHMEventLogConstants.Tuple_HealthManagerWorkerStopped, null, new object[] { MonitoringWorker.processId }); }