using BeWo.Data.Access; using BeWo.ServerUtils.Core; using BeWo.Service.Core; using BS.Shared.DataContracts; using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace BeWo.Service.Status { public class BaseStatusService { private static readonly log4net.ILog log = LoggerUtils.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); private readonly string joinChar = Environment.NewLine; protected string Name { get; set; } protected List> Checkups { get; } = new List>(); private List RequiredWebConfigs { get; } = new List(); private List RequiredWebSecretConfigs { get; } = new List(); private List RequiredDBScripts { get; } = new List(); private List RequiredConfigs { get; } = new List(); public BaseStatusService(string name) { Name = name; RegisterCheckup(CheckWebConfig, CheckWebSecretConfig, CheckDBScripts, CheckConfig); } protected void AddWebConfigCheck(params WebConfigSetting[] args) { RequiredWebConfigs.AddRange(args); } protected void AddWebSecretConfigCheck(params WebSecretConfigSetting[] args) { RequiredWebSecretConfigs.AddRange(args); } protected void AddDBScript(params string[] args) { RequiredDBScripts.AddRange(args); } protected void AddCustomConfig(params SpecialConfig[] args) { RequiredConfigs.AddRange(args); } protected void RegisterCheckup(params Func[] args) { Checkups.AddRange(args); } public ServiceStatusDC DoHealthCheckup() { var errors = new List(); foreach (var func in Checkups) { try { var error = func(); if (!string.IsNullOrEmpty(error)) errors.Add(error); } catch (Exception ex) { log.Error($"Health-Checkup '{Name}' fehlgeschlagen", ex); errors.Add(ex.Message); } } return new ServiceStatusDC { Name = Name, IsOk = errors.Count == 0, Message = errors.Count == 0 ? "OK" : string.Join(joinChar, errors) }; } private string CheckWebConfig() { var missing = RequiredWebConfigs .Where(x => string.IsNullOrWhiteSpace(MergedConfig.GetSetting(x))) .Select(x => $"'{x}' wurde nicht korrekt konfiguriert"); return string.Join(joinChar, missing); } private string CheckWebSecretConfig() { var missing = RequiredWebSecretConfigs .Where(x => string.IsNullOrWhiteSpace(MergedConfig.GetSecretSetting(x))) .Select(x => $"'{x}' wurde nicht korrekt konfiguriert"); return string.Join(joinChar, missing); } private string CheckDBScripts() { var missing = RequiredDBScripts .Where(x => !DAOFactory.ScriptDAO.IsScriptExecuted(x)) .Select(x => $"Script '{x}' wurde nicht ausgeführt"); return string.Join(joinChar, missing); } private string CheckConfig() { var missing = RequiredConfigs .Where(x => !File.Exists(ConfigReader.GetConfigPath(x))) .Select(x => $"SpecialConfig.{x} wurde nicht korrekt konfiguriert"); return string.Join(joinChar, missing); } } }