123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Linq;
- using System.Net;
- using System.Net.Sockets;
- using System.Threading.Tasks;
- using System.Windows;
- using InABox.Clients;
- using InABox.Core;
- using InABox.DynamicGrid;
- using InABox.Rpc;
- using PRSServices;
- namespace PRSServer
- {
- public class ServiceStatusEntry : BaseObject
- {
- [TextBoxEditor(Visible=Visible.Default)]
- [EditorSequence(1)]
- public String Domain { get; set; }
-
- [TextBoxEditor(Visible=Visible.Default)]
- [EditorSequence(2)]
- public String IPAddress { get; set; }
-
- [NullEditor]
- public String Port { get; set; }
-
- [EnumLookupEditor(typeof(PortType))]
- public PortType Type { get; set; }
-
- [EnumLookupEditor(typeof(PortState))]
- public PortState State { get; set; }
- }
-
- public class StatusGrid : DynamicItemsListGrid<ServiceStatusEntry>
- {
- public IEnumerable<Server> Servers { get; set; }
- public StatusGrid()
- {
- HeaderHeight = 125;
- }
-
- protected override DynamicGridColumns LoadColumns()
- {
- ActionColumns.Clear();
- foreach (var server in Servers)
- ActionColumns.Add(new DynamicTextColumn(ServerStatus) { HeaderText = $"{server.Name} ({server.Type})", VerticalHeader = true, Width = 40});
- return base.LoadColumns();
- }
- private string? ServerStatus(CoreRow? arg)
- {
- return "???";
- }
- }
-
- public partial class ServiceStatus : Window
- {
- private List<RpcClientPipeTransport> _pipes = new List<RpcClientPipeTransport>();
-
- private String[] _domains;
- private Server[] _servers;
- private List<ServiceStatusEntry> _statuses = new List<ServiceStatusEntry>();
-
- public ServiceStatus(IEnumerable<String> domains, IEnumerable<Server> servers)
- {
- _domains = domains.ToArray();
- _servers = servers.ToArray();
- InitializeComponent();
- StatusGrid.Servers = _servers;
- CheckDomains();
- StatusGrid.Items = _statuses;
- StatusGrid.Refresh(true, true);
- GetPorts(servers);
- }
- private void CheckDomains()
- {
- foreach (var domain in _domains)
- {
- IPAddress[] addresses;
- try
- {
- Messages.Items.Add($"Resolving {domain}!");
- addresses = Dns.GetHostAddresses(domain, AddressFamily.InterNetwork);
- if (addresses.Length > 0)
- {
- foreach (var address in addresses)
- _statuses.Add(new ServiceStatusEntry() { Domain = domain, IPAddress = address.ToString() });
- Messages.Items.Add($"{domain} resolves to {String.Join(", ", addresses.Select(x => x.ToString()))}");
- }
- else
- {
- _statuses.Add(new ServiceStatusEntry() { Domain = domain, IPAddress = "No Address Found" });
- Messages.Items.Add($"{domain} canot be resolved!");
- }
- }
- catch (Exception e)
- {
- _statuses.Add(new ServiceStatusEntry() { Domain = domain, IPAddress = "DNS Resolution Failure" });
- Messages.Items.Add($"Exception while resolving {domain} -> {e.Message}");
- }
- }
- }
- bool CheckDatabase(string domain, int port)
- {
- return new RestClient<User>($"{domain}:{port}").Ping();
- }
- private void GetPorts(IEnumerable<Server> servers)
- {
- foreach (var server in servers)
- {
- var manager = new RpcClientPipeTransport($"{server.Key}M");
- manager.OnOpen += (o,e) => Task.Run(() =>
- {
- Dispatcher.Invoke(() => { Messages.Items.Add("Connected to Server"); });
- //while (!manager.Disconnected)
- //{
- try
- {
- var result = manager.Send<PortStatusCommand, PortStatusParameters, PortStatusResult>(new PortStatusParameters());
- foreach (var port in result.Ports)
- {
- Dispatcher.Invoke(() =>
- {
- Messages.Items.Add($"{server.Key}: {port.Type}({port.Port}) -> {port.State}");
-
- foreach (var domain in _domains)
- {
- if (port.Type == PortType.Database)
- Messages.Items.Add($"Database {domain}:{port.Port} -> {CheckDatabase(domain,port.Port)}");
- }
- });
- }
- }
- catch (Exception err)
- {
- Dispatcher.Invoke(() => { Messages.Items.Add(err.Message); });
- }
- // Thread.Sleep(1000);
- //}
- });
- _pipes.Add(manager);
- }
- }
- private void ServiceStatus_OnClosing(object? sender, CancelEventArgs e)
- {
- while (_pipes.Count > 0)
- {
- _pipes[0].Dispose();
- _pipes.RemoveAt(0);
- }
- }
- }
- }
|