Merge pull request #2 from swagfin/feature/target-ping-checker

Feature/target ping checker
This commit is contained in:
Wainaina George (Swagfin) 2023-03-10 00:25:50 +03:00 committed by GitHub
commit 49c90c81b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 169 additions and 30 deletions

View File

@ -13,6 +13,7 @@ namespace PortProxyGUI.Data
public int ConnectPort { get; set; } public int ConnectPort { get; set; }
public string Comment { get; set; } public string Comment { get; set; }
public string Group { get; set; } public string Group { get; set; }
public string PingStatus { get; set; } = "Not checked";
public bool Valid => ListenPort > 0 && ConnectPort > 0; public bool Valid => ListenPort > 0 && ConnectPort > 0;

View File

@ -37,12 +37,14 @@
this.columnHeader4 = new System.Windows.Forms.ColumnHeader(); this.columnHeader4 = new System.Windows.Forms.ColumnHeader();
this.columnHeader5 = new System.Windows.Forms.ColumnHeader(); this.columnHeader5 = new System.Windows.Forms.ColumnHeader();
this.columnHeader6 = new System.Windows.Forms.ColumnHeader(); this.columnHeader6 = new System.Windows.Forms.ColumnHeader();
this.columnPingStatus = new System.Windows.Forms.ColumnHeader();
this.columnHeader7 = new System.Windows.Forms.ColumnHeader(); this.columnHeader7 = new System.Windows.Forms.ColumnHeader();
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
this.toolStripMenuItem_Enable = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem_Enable = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem_Disable = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem_Disable = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripMenuItem_Refresh = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem_Refresh = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem_RefreshPingStatus = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripMenuItem_FlushDnsCache = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem_FlushDnsCache = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripMenuItem_New = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem_New = new System.Windows.Forms.ToolStripMenuItem();
@ -64,6 +66,7 @@
this.columnHeader4, this.columnHeader4,
this.columnHeader5, this.columnHeader5,
this.columnHeader6, this.columnHeader6,
this.columnPingStatus,
this.columnHeader7}); this.columnHeader7});
this.listViewProxies.ContextMenuStrip = this.contextMenuStrip1; this.listViewProxies.ContextMenuStrip = this.contextMenuStrip1;
resources.ApplyResources(this.listViewProxies, "listViewProxies"); resources.ApplyResources(this.listViewProxies, "listViewProxies");
@ -104,6 +107,10 @@
this.columnHeader6.Tag = ""; this.columnHeader6.Tag = "";
resources.ApplyResources(this.columnHeader6, "columnHeader6"); resources.ApplyResources(this.columnHeader6, "columnHeader6");
// //
// columnPingStatus
//
resources.ApplyResources(this.columnPingStatus, "columnPingStatus");
//
// columnHeader7 // columnHeader7
// //
resources.ApplyResources(this.columnHeader7, "columnHeader7"); resources.ApplyResources(this.columnHeader7, "columnHeader7");
@ -115,6 +122,7 @@
this.toolStripMenuItem_Disable, this.toolStripMenuItem_Disable,
this.toolStripSeparator3, this.toolStripSeparator3,
this.toolStripMenuItem_Refresh, this.toolStripMenuItem_Refresh,
this.toolStripMenuItem_RefreshPingStatus,
this.toolStripMenuItem_FlushDnsCache, this.toolStripMenuItem_FlushDnsCache,
this.toolStripSeparator2, this.toolStripSeparator2,
this.toolStripMenuItem_New, this.toolStripMenuItem_New,
@ -146,6 +154,11 @@
this.toolStripMenuItem_Refresh.Name = "toolStripMenuItem_Refresh"; this.toolStripMenuItem_Refresh.Name = "toolStripMenuItem_Refresh";
resources.ApplyResources(this.toolStripMenuItem_Refresh, "toolStripMenuItem_Refresh"); resources.ApplyResources(this.toolStripMenuItem_Refresh, "toolStripMenuItem_Refresh");
// //
// toolStripMenuItem_RefreshPingStatus
//
this.toolStripMenuItem_RefreshPingStatus.Name = "toolStripMenuItem_RefreshPingStatus";
resources.ApplyResources(this.toolStripMenuItem_RefreshPingStatus, "toolStripMenuItem_RefreshPingStatus");
//
// toolStripMenuItem_FlushDnsCache // toolStripMenuItem_FlushDnsCache
// //
this.toolStripMenuItem_FlushDnsCache.Name = "toolStripMenuItem_FlushDnsCache"; this.toolStripMenuItem_FlushDnsCache.Name = "toolStripMenuItem_FlushDnsCache";
@ -224,6 +237,8 @@
private System.Windows.Forms.ColumnHeader columnHeader7; private System.Windows.Forms.ColumnHeader columnHeader7;
internal System.Windows.Forms.ListView listViewProxies; internal System.Windows.Forms.ListView listViewProxies;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_FlushDnsCache; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_FlushDnsCache;
private System.Windows.Forms.ColumnHeader columnPingStatus;
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem_RefreshPingStatus;
} }
} }

View File

@ -1,7 +1,10 @@
using NStandard; using NStandard;
using System; using System;
using System.Collections.Generic;
using System.Data; using System.Data;
using System.Drawing;
using System.Linq; using System.Linq;
using System.Net.NetworkInformation;
using System.Windows.Forms; using System.Windows.Forms;
using static System.Windows.Forms.ListViewItem; using static System.Windows.Forms.ListViewItem;
@ -12,7 +15,7 @@ namespace PortProxyGUI
public SetProxy SetProxyForm; public SetProxy SetProxyForm;
public About AboutForm; public About AboutForm;
private ListViewColumnSorter lvwColumnSorter; private ListViewColumnSorter lvwColumnSorter;
private List<KeyValuePair<string, IPStatus>> hostStatus { get; set; } = new List<KeyValuePair<string, IPStatus>>();
public PortProxyGUI() public PortProxyGUI()
{ {
InitializeComponent(); InitializeComponent();
@ -46,7 +49,8 @@ namespace PortProxyGUI
ListenPort = listenPort, ListenPort = listenPort,
ConnectTo = subItems[4].Text.Trim(), ConnectTo = subItems[4].Text.Trim(),
ConnectPort = connectPort, ConnectPort = connectPort,
Comment = subItems[6].Text.Trim(), PingStatus = subItems[6].Text.Trim(),
Comment = subItems[7].Text.Trim(),
Group = item.Group?.Header.Trim(), Group = item.Group?.Header.Trim(),
}; };
return rule; return rule;
@ -154,7 +158,14 @@ namespace PortProxyGUI
new ListViewSubItem(item, rule.ListenPort.ToString()) { Tag = "Number" }, new ListViewSubItem(item, rule.ListenPort.ToString()) { Tag = "Number" },
new ListViewSubItem(item, rule.ConnectTo), new ListViewSubItem(item, rule.ConnectTo),
new ListViewSubItem(item, rule.ConnectPort.ToString ()) { Tag = "Number" }, new ListViewSubItem(item, rule.ConnectPort.ToString ()) { Tag = "Number" },
new ListViewSubItem(item, rule.Comment ?? ""), new ListViewSubItem(item, rule.PingStatus ?? string.Empty)
{
Tag ="Connect To Ping Status",
ForeColor = rule.PingStatus.Equals("Success") ? Color.Green
: rule.PingStatus.Equals("Pending") ? Color.DarkGray
: Color.MediumVioletRed
},
new ListViewSubItem(item, rule.Comment ?? string.Empty)
}); });
if (rule.Group.IsNullOrWhiteSpace()) item.Group = null; if (rule.Group.IsNullOrWhiteSpace()) item.Group = null;
@ -172,6 +183,9 @@ namespace PortProxyGUI
public void RefreshProxyList() public void RefreshProxyList()
{ {
try
{
var proxies = CmdUtil.GetProxies(); var proxies = CmdUtil.GetProxies();
var rules = Program.SqliteDbScope.Rules.ToArray(); var rules = Program.SqliteDbScope.Rules.ToArray();
foreach (var proxy in proxies) foreach (var proxy in proxies)
@ -195,6 +209,11 @@ namespace PortProxyGUI
InitProxyGroups(rules); InitProxyGroups(rules);
InitProxyItems(rules, proxies); InitProxyItems(rules, proxies);
} }
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error Refreshing");
}
}
public void FlushDnsCache() public void FlushDnsCache()
{ {
@ -237,6 +256,9 @@ namespace PortProxyGUI
case ToolStripMenuItem item when item == toolStripMenuItem_Refresh: case ToolStripMenuItem item when item == toolStripMenuItem_Refresh:
RefreshProxyList(); RefreshProxyList();
break; break;
case ToolStripMenuItem item when item == toolStripMenuItem_RefreshPingStatus:
RefreshConnectHostPingStatus();
break;
case ToolStripMenuItem item when item == toolStripMenuItem_FlushDnsCache: case ToolStripMenuItem item when item == toolStripMenuItem_FlushDnsCache:
FlushDnsCache(); FlushDnsCache();
break; break;
@ -314,5 +336,42 @@ namespace PortProxyGUI
if (e.KeyCode == Keys.Delete) DeleteSelectedProxies(); if (e.KeyCode == Keys.Delete) DeleteSelectedProxies();
} }
} }
private void RefreshConnectHostPingStatus()
{
try
{
var items = listViewProxies.Items.OfType<ListViewItem>();
hostStatus = new List<KeyValuePair<string, IPStatus>>();
foreach (var item in items)
{
try
{
//Custom Color for cells
item.UseItemStyleForSubItems = false;
//Proceed
Data.Rule rule = ParseRule(item);
//Check if host already pinged host
var alreadyChkdHost = hostStatus.FirstOrDefault(x => x.Key.Equals(rule.ConnectTo, StringComparison.OrdinalIgnoreCase));
if (!string.IsNullOrEmpty(alreadyChkdHost.Key))
{
//Skip Checking Status since already checked
rule.PingStatus = alreadyChkdHost.Value.ToString();
UpdateListViewItem(item, rule, item.ImageIndex);
}
else
{
//If not yet checked
PingCheckerUtil.GetPingResult(rule.ConnectTo, 2, out IPStatus ipStatus, out _, out _);
hostStatus.Add(new KeyValuePair<string, IPStatus>(rule.ConnectTo, ipStatus));
rule.PingStatus = ipStatus.ToString();
UpdateListViewItem(item, rule, item.ImageIndex);
}
}
catch { }
}
}
catch { }
}
} }
} }

View File

@ -94,6 +94,12 @@
<data name="columnHeader6.Width" type="System.Int32, mscorlib"> <data name="columnHeader6.Width" type="System.Int32, mscorlib">
<value>100</value> <value>100</value>
</data> </data>
<data name="columnPingStatus.Text" xml:space="preserve">
<value>Ping Status</value>
</data>
<data name="columnPingStatus.Width" type="System.Int32, mscorlib">
<value>104</value>
</data>
<data name="columnHeader7.Text" xml:space="preserve"> <data name="columnHeader7.Text" xml:space="preserve">
<value>Comment</value> <value>Comment</value>
</data> </data>
@ -125,6 +131,18 @@
<data name="toolStripMenuItem_Refresh.Text" xml:space="preserve"> <data name="toolStripMenuItem_Refresh.Text" xml:space="preserve">
<value>Refresh (&amp;F)</value> <value>Refresh (&amp;F)</value>
</data> </data>
<data name="toolStripMenuItem_Refresh.ToolTipText" xml:space="preserve">
<value>Refresh Port Proxies</value>
</data>
<data name="toolStripMenuItem_RefreshPingStatus.Size" type="System.Drawing.Size, System.Drawing">
<value>180, 22</value>
</data>
<data name="toolStripMenuItem_RefreshPingStatus.Text" xml:space="preserve">
<value>Refresh Ping Status</value>
</data>
<data name="toolStripMenuItem_RefreshPingStatus.ToolTipText" xml:space="preserve">
<value>Refresh Host Ping Statuses</value>
</data>
<data name="toolStripMenuItem_FlushDnsCache.Size" type="System.Drawing.Size, System.Drawing"> <data name="toolStripMenuItem_FlushDnsCache.Size" type="System.Drawing.Size, System.Drawing">
<value>180, 22</value> <value>180, 22</value>
</data> </data>
@ -132,7 +150,7 @@
<value>Flush DNS Cache</value> <value>Flush DNS Cache</value>
</data> </data>
<data name="toolStripMenuItem_FlushDnsCache.ToolTipText" xml:space="preserve"> <data name="toolStripMenuItem_FlushDnsCache.ToolTipText" xml:space="preserve">
<value>Will perform ipconfig/flushDNS</value> <value>Perform ipconfig/flushDNS</value>
</data> </data>
<data name="toolStripSeparator2.Size" type="System.Drawing.Size, System.Drawing"> <data name="toolStripSeparator2.Size" type="System.Drawing.Size, System.Drawing">
<value>177, 6</value> <value>177, 6</value>
@ -165,7 +183,7 @@
<value>About</value> <value>About</value>
</data> </data>
<data name="contextMenuStrip1.Size" type="System.Drawing.Size, System.Drawing"> <data name="contextMenuStrip1.Size" type="System.Drawing.Size, System.Drawing">
<value>181, 220</value> <value>181, 242</value>
</data> </data>
<data name="&gt;&gt;contextMenuStrip1.Name" xml:space="preserve"> <data name="&gt;&gt;contextMenuStrip1.Name" xml:space="preserve">
<value>contextMenuStrip1</value> <value>contextMenuStrip1</value>
@ -184,10 +202,10 @@
<value>0, 0</value> <value>0, 0</value>
</data> </data>
<data name="listViewProxies.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms"> <data name="listViewProxies.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>4, 3, 4, 3</value> <value>5, 3, 5, 3</value>
</data> </data>
<data name="listViewProxies.Size" type="System.Drawing.Size, System.Drawing"> <data name="listViewProxies.Size" type="System.Drawing.Size, System.Drawing">
<value>704, 456</value> <value>797, 456</value>
</data> </data>
<metadata name="imageListProxies.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="imageListProxies.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>182, 17</value> <value>182, 17</value>
@ -197,7 +215,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAA3AgAAAJNU0Z0AUkBTAIBAQIB SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAA3AgAAAJNU0Z0AUkBTAIBAQIB
AAEwAQEBMAEBARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMAAUADAAEQAwABAQEAAQgG AAF4AQEBeAEBARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMAAUADAAEQAwABAQEAAQgG
AAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEAAfABygGmAQABMwUAATMB AAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEAAfABygGmAQABMwUAATMB
AAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEAAYABfAH/AQACUAH/AQAB AAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEAAYABfAH/AQACUAH/AQAB
kwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFmAwABmQMAAcwCAAEzAwAC kwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFmAwABmQMAAcwCAAEzAwAC
@ -256,10 +274,13 @@
<value>True</value> <value>True</value>
</metadata> </metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing"> <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>6, 13</value> <value>7, 15</value>
</data> </data>
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing"> <data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
<value>704, 456</value> <value>797, 456</value>
</data>
<data name="$this.Font" type="System.Drawing.Font, System.Drawing">
<value>Segoe UI, 9pt</value>
</data> </data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
@ -2464,6 +2485,12 @@
<data name="&gt;&gt;columnHeader6.Type" xml:space="preserve"> <data name="&gt;&gt;columnHeader6.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data> </data>
<data name="&gt;&gt;columnPingStatus.Name" xml:space="preserve">
<value>columnPingStatus</value>
</data>
<data name="&gt;&gt;columnPingStatus.Type" xml:space="preserve">
<value>System.Windows.Forms.ColumnHeader, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;columnHeader7.Name" xml:space="preserve"> <data name="&gt;&gt;columnHeader7.Name" xml:space="preserve">
<value>columnHeader7</value> <value>columnHeader7</value>
</data> </data>
@ -2494,6 +2521,12 @@
<data name="&gt;&gt;toolStripMenuItem_Refresh.Type" xml:space="preserve"> <data name="&gt;&gt;toolStripMenuItem_Refresh.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data> </data>
<data name="&gt;&gt;toolStripMenuItem_RefreshPingStatus.Name" xml:space="preserve">
<value>toolStripMenuItem_RefreshPingStatus</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_RefreshPingStatus.Type" xml:space="preserve">
<value>System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;toolStripMenuItem_FlushDnsCache.Name" xml:space="preserve"> <data name="&gt;&gt;toolStripMenuItem_FlushDnsCache.Name" xml:space="preserve">
<value>toolStripMenuItem_FlushDnsCache</value> <value>toolStripMenuItem_FlushDnsCache</value>
</data> </data>

View File

@ -0,0 +1,31 @@
using System.Net;
using System.Net.NetworkInformation;
using System.Text;
namespace PortProxyGUI
{
public static class PingCheckerUtil
{
// Adapted from https://docs.microsoft.com/en-us/dotnet/api/system.net.networkinformation.ping.send
public static bool GetPingResult(string ipAddress, int timeout, out IPStatus responseStatus, out IPAddress responseIpAddress, out long responseTime)
{
//Defaults
responseIpAddress = null;
responseTime = 0;
responseStatus = IPStatus.Unknown;
try
{
//Sending 32bytes
byte[] buffer = Encoding.ASCII.GetBytes("12345678901234567890123456789012");
Ping pingSender = new Ping();
PingOptions options = new PingOptions(64, true);
PingReply reply = pingSender.Send(ipAddress, timeout, buffer, options);
responseIpAddress = reply.Address;
responseTime = reply.RoundtripTime;
responseStatus = reply.Status;
return (reply.Status == IPStatus.Success) ? true : false;
}
catch { return false; }
}
}
}