ServiceStatus.xaml.cs 5.7 KB

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