| 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);            }        }    }}
 |