ServiceStatus.xaml.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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 DynamicGridColumns LoadColumns()
  39. {
  40. ActionColumns.Clear();
  41. foreach (var server in Servers)
  42. ActionColumns.Add(new DynamicTextColumn(ServerStatus) { HeaderText = $"{server.Name} ({server.Type})", VerticalHeader = true, Width = 40});
  43. return base.LoadColumns();
  44. }
  45. private string? ServerStatus(CoreRow? arg)
  46. {
  47. return "???";
  48. }
  49. }
  50. public partial class ServiceStatus : Window
  51. {
  52. private List<RpcClientPipeTransport> _pipes = new List<RpcClientPipeTransport>();
  53. private String[] _domains;
  54. private Server[] _servers;
  55. private List<ServiceStatusEntry> _statuses = new List<ServiceStatusEntry>();
  56. public ServiceStatus(IEnumerable<String> domains, IEnumerable<Server> servers)
  57. {
  58. _domains = domains.ToArray();
  59. _servers = servers.ToArray();
  60. InitializeComponent();
  61. StatusGrid.Servers = _servers;
  62. CheckDomains();
  63. StatusGrid.Items = _statuses;
  64. StatusGrid.Refresh(true, true);
  65. GetPorts(servers);
  66. }
  67. private void CheckDomains()
  68. {
  69. foreach (var domain in _domains)
  70. {
  71. IPAddress[] addresses;
  72. try
  73. {
  74. Messages.Items.Add($"Resolving {domain}!");
  75. addresses = Dns.GetHostAddresses(domain, AddressFamily.InterNetwork);
  76. if (addresses.Length > 0)
  77. {
  78. foreach (var address in addresses)
  79. _statuses.Add(new ServiceStatusEntry() { Domain = domain, IPAddress = address.ToString() });
  80. Messages.Items.Add($"{domain} resolves to {String.Join(", ", addresses.Select(x => x.ToString()))}");
  81. }
  82. else
  83. {
  84. _statuses.Add(new ServiceStatusEntry() { Domain = domain, IPAddress = "No Address Found" });
  85. Messages.Items.Add($"{domain} canot be resolved!");
  86. }
  87. }
  88. catch (Exception e)
  89. {
  90. _statuses.Add(new ServiceStatusEntry() { Domain = domain, IPAddress = "DNS Resolution Failure" });
  91. Messages.Items.Add($"Exception while resolving {domain} -> {e.Message}");
  92. }
  93. }
  94. }
  95. bool CheckDatabase(string domain, int port)
  96. {
  97. return new RestClient<User>($"{domain}:{port}").Ping();
  98. }
  99. private void GetPorts(IEnumerable<Server> servers)
  100. {
  101. foreach (var server in servers)
  102. {
  103. var manager = new RpcClientPipeTransport($"{server.Key}M");
  104. manager.OnOpen += (o,e) => Task.Run(() =>
  105. {
  106. Dispatcher.Invoke(() => { Messages.Items.Add("Connected to Server"); });
  107. //while (!manager.Disconnected)
  108. //{
  109. try
  110. {
  111. var result = manager.Send<PortStatusCommand, PortStatusParameters, PortStatusResult>(new PortStatusParameters());
  112. foreach (var port in result.Ports)
  113. {
  114. Dispatcher.Invoke(() =>
  115. {
  116. Messages.Items.Add($"{server.Key}: {port.Type}({port.Port}) -> {port.State}");
  117. foreach (var domain in _domains)
  118. {
  119. if (port.Type == PortType.Database)
  120. Messages.Items.Add($"Database {domain}:{port.Port} -> {CheckDatabase(domain,port.Port)}");
  121. }
  122. });
  123. }
  124. }
  125. catch (Exception err)
  126. {
  127. Dispatcher.Invoke(() => { Messages.Items.Add(err.Message); });
  128. }
  129. // Thread.Sleep(1000);
  130. //}
  131. });
  132. _pipes.Add(manager);
  133. }
  134. }
  135. private void ServiceStatus_OnClosing(object? sender, CancelEventArgs e)
  136. {
  137. while (_pipes.Count > 0)
  138. {
  139. _pipes[0].Dispose();
  140. _pipes.RemoveAt(0);
  141. }
  142. }
  143. }
  144. }