ServiceStatus.xaml.cs 5.7 KB

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