private async Task UpdateLastStateEntry(HostsRepository hostsrepo, HostStatesRepository staterepo, EventRepository eventrepo, CancellationToken stoppingToken) { var hosts = await hostsrepo.GetAllActive(); await hosts.ForEachAsync(10, async (host) => { await UpdateSingleHostStateEntry(hostsrepo, staterepo, eventrepo, host); }); }
private async Task CreateStateEntries(HostsRepository hostsrepo, HostStatesRepository staterepo) { var states = (await hostsrepo.GetAllActive()) .Select(x => new HostState { HostId = x.Id }); staterepo.Add(states); }
private async Task UpdateSingleHostStateEntry(HostsRepository hostsrepo, HostStatesRepository staterepo, EventRepository eventrepo, Data.Host host) { _logger.LogTrace($"Checking host {host.Name} ({host.Hostname})"); var state = staterepo.GetForHost(host.Id) .Last(); var ping = new Ping(); try { var reply = await ping.SendPingAsync(host.Hostname, 2000); switch (reply.Status) { case IPStatus.Success: state.Delay = (int)reply.RoundtripTime; switch (reply.RoundtripTime) { case long n when n < 70: state.Status = HostState.StatusEnum.Online; break; case long n when n < 300: state.Status = HostState.StatusEnum.Warning; break; case long n when n < 2000: state.Status = HostState.StatusEnum.Critical; break; default: state.Status = HostState.StatusEnum.Error; break; } await eventrepo.Enqueue(new HostOnlineEvent { HostId = host.Id }); break; case IPStatus.TimedOut: state.Status = HostState.StatusEnum.Offline; await eventrepo.Enqueue(new HostOfflineEvent { HostId = host.Id }); break; default: _logger.LogError($"Unknown IPStatus {reply.Status} while checking {host.Hostname}"); state.Status = HostState.StatusEnum.Error; break; } } catch (Exception) { _logger.LogWarning($"Error while checking {host.Name} ({host.Hostname})"); state.Status = HostState.StatusEnum.Error; } finally { _logger.LogTrace($"Check complete for host {host.Name} ({host.Hostname})"); } }