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 { public IEnumerable 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 _pipes = new List(); private String[] _domains; private Server[] _servers; private List _statuses = new List(); public ServiceStatus(IEnumerable domains, IEnumerable 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($"{domain}:{port}").Ping(); } private void GetPorts(IEnumerable 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(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); } } } }