ServiceStatus.xaml.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Net.Sockets;
  7. using System.Threading.Tasks;
  8. using System.Windows;
  9. using InABox.Clients;
  10. using InABox.Core;
  11. using InABox.DynamicGrid;
  12. using InABox.Rpc;
  13. using PRSServices;
  14. namespace PRSServer
  15. {
  16. public class ServiceStatusEntry : BaseObject
  17. {
  18. [TextBoxEditor(Visible=Visible.Default)]
  19. [EditorSequence(1)]
  20. public String Domain { get; set; }
  21. [TextBoxEditor(Visible=Visible.Default)]
  22. [EditorSequence(2)]
  23. public String IPAddress { get; set; }
  24. [NullEditor]
  25. public String Port { get; set; }
  26. [EnumLookupEditor(typeof(PortType))]
  27. public PortType Type { get; set; }
  28. [EnumLookupEditor(typeof(PortState))]
  29. public PortState State { get; set; }
  30. }
  31. public class StatusGrid : DynamicItemsListGrid<ServiceStatusEntry>
  32. {
  33. public IEnumerable<Server> Servers { get; set; }
  34. public StatusGrid()
  35. {
  36. HeaderHeight = 125;
  37. }
  38. protected override void DoReconfigure(DynamicGridOptions options)
  39. {
  40. options.Clear();
  41. }
  42. protected override DynamicGridColumns LoadColumns()
  43. {
  44. ActionColumns.Clear();
  45. foreach (var server in Servers)
  46. ActionColumns.Add(new DynamicTextColumn(ServerStatus) { HeaderText = $"{server.Name} ({server.Type})", VerticalHeader = true, Width = 40});
  47. return base.LoadColumns();
  48. }
  49. private string? ServerStatus(CoreRow? arg)
  50. {
  51. return "???";
  52. }
  53. }
  54. public partial class ServiceStatus : Window
  55. {
  56. private List<RpcClientPipeTransport> _pipes = new List<RpcClientPipeTransport>();
  57. private String[] _domains;
  58. private Server[] _servers;
  59. private List<ServiceStatusEntry> _statuses = new List<ServiceStatusEntry>();
  60. public ServiceStatus(IEnumerable<String> domains, IEnumerable<Server> servers)
  61. {
  62. _domains = domains.ToArray();
  63. _servers = servers.ToArray();
  64. InitializeComponent();
  65. StatusGrid.Servers = _servers;
  66. CheckDomains();
  67. StatusGrid.Items = _statuses;
  68. StatusGrid.Refresh(true, true);
  69. GetPorts(servers);
  70. }
  71. private void CheckDomains()
  72. {
  73. foreach (var domain in _domains)
  74. {
  75. IPAddress[] addresses;
  76. try
  77. {
  78. Messages.Items.Add($"Resolving {domain}!");
  79. addresses = Dns.GetHostAddresses(domain, AddressFamily.InterNetwork);
  80. if (addresses.Length > 0)
  81. {
  82. foreach (var address in addresses)
  83. _statuses.Add(new ServiceStatusEntry() { Domain = domain, IPAddress = address.ToString() });
  84. Messages.Items.Add($"{domain} resolves to {String.Join(", ", addresses.Select(x => x.ToString()))}");
  85. }
  86. else
  87. {
  88. _statuses.Add(new ServiceStatusEntry() { Domain = domain, IPAddress = "No Address Found" });
  89. Messages.Items.Add($"{domain} canot be resolved!");
  90. }
  91. }
  92. catch (Exception e)
  93. {
  94. _statuses.Add(new ServiceStatusEntry() { Domain = domain, IPAddress = "DNS Resolution Failure" });
  95. Messages.Items.Add($"Exception while resolving {domain} -> {e.Message}");
  96. }
  97. }
  98. }
  99. bool CheckDatabase(string domain, int port)
  100. {
  101. return new RestClient<User>($"{domain}:{port}").Ping();
  102. }
  103. private void GetPorts(IEnumerable<Server> servers)
  104. {
  105. foreach (var server in servers)
  106. {
  107. var manager = new RpcClientPipeTransport($"{server.Key}M");
  108. manager.OnOpen += (o,e) => Task.Run(() =>
  109. {
  110. Dispatcher.Invoke(() => { Messages.Items.Add("Connected to Server"); });
  111. //while (!manager.Disconnected)
  112. //{
  113. try
  114. {
  115. var result = manager.Send<PortStatusCommand, PortStatusParameters, PortStatusResult>(new PortStatusParameters());
  116. foreach (var port in result.Ports)
  117. {
  118. Dispatcher.Invoke(() =>
  119. {
  120. Messages.Items.Add($"{server.Key}: {port.Type}({port.Port}) -> {port.State}");
  121. foreach (var domain in _domains)
  122. {
  123. if (port.Type == PortType.Database)
  124. Messages.Items.Add($"Database {domain}:{port.Port} -> {CheckDatabase(domain,port.Port)}");
  125. }
  126. });
  127. }
  128. }
  129. catch (Exception err)
  130. {
  131. Dispatcher.Invoke(() => { Messages.Items.Add(err.Message); });
  132. }
  133. // Thread.Sleep(1000);
  134. //}
  135. });
  136. _pipes.Add(manager);
  137. }
  138. }
  139. private void ServiceStatus_OnClosing(object? sender, CancelEventArgs e)
  140. {
  141. while (_pipes.Count > 0)
  142. {
  143. _pipes[0].Dispose();
  144. _pipes.RemoveAt(0);
  145. }
  146. }
  147. }
  148. }