using System.Collections.ObjectModel; using System.Net.Http.Headers; using Avalonia.Media; using Avalonia.Threading; using CommunityToolkit.Mvvm.DependencyInjection; using DynamicData; using DynamicData.Binding; using HetznerCloudApi; using Material.Icons; using Newtonsoft.Json.Linq; using PSCHelpdesk.Plugins.HetznerServer.Models; using PSCHelpdesk.Shared.Service; using PSCHelpdesk.Shared.Setting; using PSCHelpdesk.Shared.Tasks; using ReactiveUI; using Renci.SshNet; namespace PSCHelpdesk.Plugins.HetznerServer.Service; public class CheckMKService: IServerService { private SettingsManager _settingsManager; private readonly DispatcherTimer _reloadTimer = new DispatcherTimer(); private ServerService _server; public CheckMKService(ServerService serverService) { _server = serverService; _settingsManager = (SettingsManager)Ioc.Default.GetService(); this._reloadTimer.Tick += (sender, args) => { this.reloadServerStatus(); }; _reloadTimer.Interval = TimeSpan.FromMinutes(2); _reloadTimer.Start(); } private async Task reloadServerStatus() { var settings = new CheckMKSettings(); _settingsManager.LoadPluginSettings("CheckMKSettings", settings); var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Accept.Clear(); httpClient.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/ld+json")); httpClient.DefaultRequestHeaders.Add("User-Agent", "PSC Client"); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes($"{settings.Username}:{settings.Password}"))); try { foreach (var serv in _server.SourceCache.Items) { serv.Services.Clear(); } var stringPlugins = httpClient.GetStringAsync("https://check.thomas-peterson.de/cmk/check_mk/view.py?view_name=svcproblems&output_format=json"); var msg = await stringPlugins; JArray pluginMsg = JArray.Parse(msg); foreach (var token in pluginMsg) { if (token[0].ToString() != "service_state") { var serv = _server.SourceCache.Items.FirstOrDefault(e => e.Name.ToLower().Contains(token[1].ToString().ToLower())); if (serv != null) { serv.Services.Add(new Models.Service(token[0].ToString(), token[4].ToString())); } } } foreach (var serv in _server.SourceCache.Items) { if (serv.Services.Count == 0 && serv.BackupLastModified > DateTime.Today.AddDays(-3) && serv.Status == "running") { serv.ServerStatus = Brushes.Transparent; }else { serv.ServerStatus = Brushes.Red; } } } catch (Exception ex) { Console.WriteLine(ex.Message); } } public void DoReScan(Server serv) { doScan(); } async private void doScan() { var settings = new CheckMKSettings(); _settingsManager.LoadPluginSettings("CheckMKSettings", settings); var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Accept.Clear(); httpClient.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/ld+json")); httpClient.DefaultRequestHeaders.Add("User-Agent", "PSC Client"); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes($"{settings.Username}:{settings.Password}"))); try { foreach (var serv in _server.SourceCache.Items) { serv.Services.Clear(); } var stringPlugins = httpClient.GetStringAsync("https://check.thomas-peterson.de/cmk/check_mk/view.py?view_name=svcproblems&output_format=json"); var msg = await stringPlugins; JArray pluginMsg = JArray.Parse(msg); foreach (var token in pluginMsg) { if (token[0].ToString() != "service_state") { var serv = _server.SourceCache.Items.FirstOrDefault(e => e.Name.ToLower().Contains(token[1].ToString().ToLower())); if (serv != null) { serv.Services.Add(new Models.Service(token[0].ToString(), token[4].ToString())); } } } foreach (var serv in _server.SourceCache.Items) { if (serv.Services.Count == 0 && serv.BackupLastModified > DateTime.Today.AddDays(-3) && serv.Status == "running") { serv.ServerStatus = Brushes.Transparent; } } } catch (Exception ex) { Console.WriteLine(ex.Message); } } }