Initial Commit

This commit is contained in:
2024-03-13 18:23:27 -04:00
commit 7f4466d810
36 changed files with 1374 additions and 0 deletions

14
App.config Normal file
View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="poll_time_ms" value="300000"/>
<add key="notify_time_ms" value="4320000"/>
<add key="sms_smtpaddress" value="smtp.gmail.com"/>
<add key="sms_smsusername" value="skessler1964@gmail.com"/>
<add key="sms_smspassword" value="xjfo isnf gmyi zovr"/>
<add key="sms_smsrecipients" value="skessler1964sms@gmail.com"/>
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/>
</startup>
</configuration>

65
IPMonitor.csproj Normal file
View File

@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{45646B53-1805-4678-AC93-20F87BE46A95}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>IPMonitor</RootNamespace>
<AssemblyName>IPMonitor</AssemblyName>
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="MDTrace.cs" />
<Compile Include="Network.cs" />
<Compile Include="Profiler.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SMSClient.cs" />
<Compile Include="Utility.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

22
IPMonitor.sln Normal file
View File

@@ -0,0 +1,22 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.21005.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IPMonitor", "IPMonitor.csproj", "{45646B53-1805-4678-AC93-20F87BE46A95}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{45646B53-1805-4678-AC93-20F87BE46A95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{45646B53-1805-4678-AC93-20F87BE46A95}.Debug|Any CPU.Build.0 = Debug|Any CPU
{45646B53-1805-4678-AC93-20F87BE46A95}.Release|Any CPU.ActiveCfg = Release|Any CPU
{45646B53-1805-4678-AC93-20F87BE46A95}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

BIN
IPMonitor.v12.suo Normal file

Binary file not shown.

158
MDTrace.cs Normal file
View File

@@ -0,0 +1,158 @@
using System;
using System.Diagnostics;
using System.Threading;
using System.Text;
using System.Reflection;
using System.Runtime.Remoting.Messaging;
// Filename: MarketDataTrace.cs
// Author:Sean Kessler
// Date:11/2005
namespace IPMonitor
{
public enum LogLevel : uint
{
NONE=0x0000,
INFO=0x0002,
DEBUG=0x0004,
VERBOSE=0x0008
};
/// <summary>MarketDataTrace - Utility for .</summary>
public class MDTrace
{
private static LogLevel logLevel=LogLevel.DEBUG;
/// <summary>MarketDataTrace - Private constructor prevents instantiation.</summary>
/// <returns>none</returns>
private MDTrace()
{
}
/// <summary>LogLevel - Get/Set Log level.</summary>
/// <param name="logLevel">The log level.</param>
/// <returns>LogLevel</returns>
public static LogLevel LogLevel
{
get{return logLevel;}
set{logLevel=value;}
}
/// <summary>WriteLine - Writes a line of text to trace log.</summary>
/// <param name="message">string content of message to write.</param>
/// <returns>void</returns>
// [Conditional("TRACE")]
public static void Write(LogLevel logLevel,string message)
{
if(MDTrace.logLevel<logLevel)return;
Trace.Write(GetCallerIP()+GetThreadRep()+GetLogLevelRep()+"["+DateTime.Now.ToString()+"]"+GetMethodInfo()+message);
Console.Write(message);
Flush();
}
/// <summary>WriteLine - Writes a line of text to trace log.</summary>
/// <param name="message">string content of message to write.</param>
/// <returns>void</returns>
// [Conditional("TRACE")]
public static void WriteLine(string message)
{
WriteLine(LogLevel.DEBUG,GetCallerIP()+GetThreadRep()+GetLogLevelRep()+"["+DateTime.Now.ToString()+"]"+" "+GetMethodInfo()+message);
Console.WriteLine(message);
}
/// <summary>WriteLine - Writes a line of text to trace log.</summary>
/// <param name="message">string content of message to write.</param>
/// <returns>void</returns>
// [Conditional("TRACE")]
public static void WriteLine(LogLevel logLevel,Exception exception)
{
if(MDTrace.logLevel<logLevel)return;
Trace.WriteLine(GetCallerIP()+GetThreadRep()+GetLogLevelRep()+"["+DateTime.Now.ToString()+"]"+" "+GetMethodInfo()+exception.ToString());
Console.WriteLine(exception);
Flush();
}
/// <summary>WriteLine - Writes a line of text to trace log.</summary>
/// <param name="message">string content of message to write.</param>
/// <returns>void</returns>
// [Conditional("TRACE")]
public static void WriteLine(LogLevel logLevel,string message)
{
if(MDTrace.logLevel<logLevel)return;
Trace.WriteLine(GetCallerIP()+GetThreadRep()+GetLogLevelRep()+"["+DateTime.Now.ToString()+"]"+" "+GetMethodInfo()+message);
Console.WriteLine(message);
Flush();
}
/// <summary>Indent - set trace log indentation.</summary>
/// <returns>void</returns>
// [Conditional("TRACE")]
public static void Indent()
{
Trace.Indent();
}
/// <summary>Unindent - set trace log indentation back.</summary>
/// <returns>void</returns>
// [Conditional("TRACE")]
public static void Unindent()
{
Trace.Unindent();
}
/// <summary>Flush - Flush trace log buffers to disk.</summary>
/// <returns>void</returns>
// [Conditional("TRACE")]
public static void Flush()
{
Trace.Flush();
}
/// <summary>GetLogLevel - Return current log level.</summary>
/// <returns>LogLevel</returns>
public static LogLevel GetLogLevel(String strLogLevel)
{
if(strLogLevel.Equals("debug"))return LogLevel.DEBUG;
else if(strLogLevel.Equals("verbose"))return LogLevel.VERBOSE;
else if(strLogLevel.Equals("info"))return LogLevel.INFO;
else return LogLevel.NONE;
}
/// <summary>GetLogLevel - Return current log level.</summary>
/// <returns>LogLevel</returns>
private static string GetLogLevelRep()
{
if (MDTrace.logLevel == LogLevel.DEBUG) return "[TRACE.DEBUG]";
else if (MDTrace.logLevel == LogLevel.VERBOSE) return "[TRACE.VERBOSE]";
else if (MDTrace.logLevel == LogLevel.INFO) return "[TRACE.INFO]";
else return "[TRACE.NONE]";
}
/// <summary>GetThreadRep - Return threading information.</summary>
/// <returns>LogLevel</returns>
private static string GetThreadRep()
{
return "[Thread="+Thread.CurrentThread.GetHashCode()+"]";
}
/// <summary>GetMethodInfo - Returns information about the calling method 2 frames up.</summary>
/// <returns>String</returns>
private static String GetMethodInfo()
{
StringBuilder sb=new StringBuilder();
StackFrame frame=new StackFrame(2,true);
MethodBase methodBase=frame.GetMethod();
ParameterInfo[] parameters=methodBase.GetParameters();
sb.Append("[").Append(methodBase.DeclaringType.FullName).Append("::").Append(methodBase.Name).Append("(");
for(int index=0;index<parameters.Length;index++)
{
ParameterInfo parameter=(ParameterInfo)parameters[index];
sb.Append(parameter.Name);
if(!(index==parameters.Length-1))sb.Append(",");
}
sb.Append(")]");
return sb.ToString();
}
/// <summary>GetCallerIP - Returns the calling methods IP address.</summary>
/// <returns>String</returns>
private static String GetCallerIP()
{
String hostName=(String)CallContext.GetData("HostName");
String hostAddress=(String)CallContext.GetData("HostAddress");
if(null!=hostName)hostName=hostName.Split('.')[0];
if(null==hostName && null==hostAddress)return "[LOCAL]";
return "["+hostAddress+"->"+hostName+"]";
}
}
}

94
Network.cs Normal file
View File

@@ -0,0 +1,94 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading.Tasks;
namespace IPMonitor
{
public class NetworkStatus
{
private NetworkStatus()
{
}
/// <summary>
/// Indicates whether any network connection is available
/// Filter connections below a specified speed, as well as virtual network cards.
/// </summary>
/// <returns>
/// <c>true</c> if a network connection is available; otherwise, <c>false</c>.
/// </returns>
public static bool IsNetworkAvailable()
{
return IsNetworkAvailable(0);
}
public static bool IsInternetConnected()
{
try
{
Ping myPing = new Ping();
String host = "google.com";
byte[] buffer = new byte[32];
int timeout = 1000;
PingOptions pingOptions = new PingOptions();
PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
if (reply.Status == IPStatus.Success)
{
return true;
}
else if (reply.Status == IPStatus.TimedOut)
{
return true;
}
else
{
return false;
}
}
catch (Exception)
{
return false;
}
}
/// <summary>
/// Indicates whether any network connection is available.
/// Filter connections below a specified speed, as well as virtual network cards.
/// </summary>
/// <param name="minimumSpeed">The minimum speed required. Passing 0 will not filter connection using speed.</param>
/// <returns>
/// <c>true</c> if a network connection is available; otherwise, <c>false</c>.
/// </returns>
public static bool IsNetworkAvailable(long minimumSpeed)
{
if (!NetworkInterface.GetIsNetworkAvailable())
return false;
foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
{
// discard because of standard reasons
if ((ni.OperationalStatus != OperationalStatus.Up) ||
(ni.NetworkInterfaceType == NetworkInterfaceType.Loopback) ||
(ni.NetworkInterfaceType == NetworkInterfaceType.Tunnel))
continue;
// this allow to filter modems, serial, etc.
// I use 10000000 as a minimum speed for most cases
if (ni.Speed < minimumSpeed)
continue;
// discard virtual cards (virtual box, virtual pc, etc.)
if ((ni.Description.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0) ||
(ni.Name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0))
continue;
// discard "Microsoft Loopback Adapter", it will not show as NetworkInterfaceType.Loopback but as Ethernet Card.
if (ni.Description.Equals("Microsoft Loopback Adapter", StringComparison.OrdinalIgnoreCase))
continue;
return true;
}
return false;
}
}
}

47
Profiler.cs Normal file
View File

@@ -0,0 +1,47 @@
using System;
using System.Runtime.InteropServices;
using System.Collections;
using System.Text;
// Filename: Profiler.cs
// Author:Sean Kessler
namespace IPMonitor
{
/// <summary>Profiler - Profiler utility class</summary>
public class Profiler
{
[DllImport("kernel32.dll")]
static extern uint GetTickCount();
private uint elapsedTime;
private uint totalTime;
public Profiler()
{
totalTime = GetTickCount();
Start();
}
public void Reset()
{
totalTime = GetTickCount();
Start();
}
public void Start()
{
elapsedTime = GetTickCount();
}
public uint Split()
{
return GetTickCount() - elapsedTime;
}
public uint Stop()
{
return elapsedTime = GetTickCount() - elapsedTime;
}
public uint End()
{
return totalTime = GetTickCount() - totalTime;
}
}
}

127
Program.cs Normal file
View File

@@ -0,0 +1,127 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using System.Net;
using System.IO;
using System.Diagnostics;
using System.Threading;
namespace IPMonitor
{
class Program
{
public static String GetPublicIPAddress()
{
String address = "";
WebRequest request = WebRequest.Create("http://checkip.dyndns.org/");
using (WebResponse response = request.GetResponse())
using (StreamReader stream = new StreamReader(response.GetResponseStream()))
{
address = stream.ReadToEnd();
}
int first = address.IndexOf("Address: ") + 9;
int last = address.LastIndexOf("</body>");
address = address.Substring(first, last - first);
return address;
}
public static void UpdateIPAddress(String ipAddress)
{
String strPathFileName="ipaddress.txt";
if(!File.Exists(strPathFileName))
{
WriteFile(strPathFileName, ipAddress);
SendSMSEmail(String.Format("IPMonitor IPAddress {0}",ipAddress));
}
else
{
String currentIPAddress=ReadFile(strPathFileName);
if(null!=currentIPAddress && !currentIPAddress.Equals(ipAddress))
{
WriteFile(strPathFileName,ipAddress);
SendSMSEmail(String.Format("IPMonitor IPAddress {0}",ipAddress));
}
}
}
public static void WriteFile(String strPathFileName,String ipAddress)
{
if(File.Exists(strPathFileName))File.Delete(strPathFileName);
FileStream fileStream=new FileStream(strPathFileName,FileMode.Create,FileAccess.Write,FileShare.Read);
StreamWriter streamWriter=new StreamWriter(fileStream);
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Creating address file:{0}",strPathFileName));
streamWriter.WriteLine(ipAddress);
streamWriter.Flush();
streamWriter.Close();
streamWriter.Dispose();
}
public static String ReadFile(String strPathFileName)
{
try
{
FileStream fileStream=new FileStream(strPathFileName,FileMode.Open,FileAccess.ReadWrite,FileShare.Read);
StreamReader streamReader=new StreamReader(fileStream);
String item=null;
item=streamReader.ReadLine();
streamReader.Close();
streamReader.Dispose();
return item;
}
catch(Exception exception)
{
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[IPMonitor::ReadFile] Exception:{0}",exception.ToString()));
return null;
}
}
public static void SendSMSEmail(string message)
{
String smsSMTPAddress = ConfigurationManager.AppSettings["sms_smtpaddress"];
String smsUserName = ConfigurationManager.AppSettings["sms_smsusername"];
String smsPassword = ConfigurationManager.AppSettings["sms_smspassword"];
String[] smsRecipients = ConfigurationManager.AppSettings["sms_smsrecipients"].Split(',');
SMSClient.SendSMSEmail(message, smsUserName, smsRecipients, smsSMTPAddress, smsUserName, smsPassword);
}
static void Main(string[] args)
{
int interval_ms = int.Parse(ConfigurationManager.AppSettings["poll_time_ms"]);
int notify_ms = int.Parse(ConfigurationManager.AppSettings["notify_time_ms"]);
try
{
MDTrace.LogLevel = LogLevel.DEBUG;
String strLogFile = "ipmonitor.log";
Utility.CopyFile(strLogFile,Utility.DateTimeToStringYYYYMMDDMMSSTT(DateTime.Now)+strLogFile);
Utility.DeleteFile(strLogFile);
Trace.Listeners.Add(new TextWriterTraceListener(strLogFile));
Profiler profiler=new Profiler();
profiler.Start();
while(true)
{
String ipAddress=GetPublicIPAddress();
UpdateIPAddress(ipAddress);
try{Thread.Sleep(interval_ms);}catch{;}
if(profiler.Split()>=notify_ms)
{
SendSMSEmail(String.Format("IPMonitor IPAddress {0}",ipAddress));
profiler.Start();
}
}
}
catch(Exception exception)
{
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("[IPMonitor] Exception:{0}",exception.ToString()));
}
}
}
}

View File

@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("IPMonitor")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("IPMonitor")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("7c9aa068-2aeb-4b6e-81e1-e5e34fd0e8a8")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

93
SMSClient.cs Normal file
View File

@@ -0,0 +1,93 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Threading.Tasks;
namespace IPMonitor
{
public class SMSClient
{
private SMSClient()
{
}
// <add key="sms_smtpaddress" value="smtp.gmail.com"/>
// <add key="sms_smsusername" value="skessler1964@gmail.com"/>
// <add key="sms_smspassword" value="hebo cfmi qpjf oyii"/>
// <add key="sms_smsrecipients" value="6315252496@vtext.com"/>
public static void SendSMSEmail(string message, String from, String[] recipients,String smtpAddress,String userName,String password,int port=587)
{
String subject = string.Format("{0} {1}", message, DateTime.Now);
try
{
if (!NetworkStatus.IsInternetConnected())
{
MDTrace.WriteLine(LogLevel.DEBUG,"The internet is not connected. Cannot send SMSEmail.");
return;
}
MailMessage mailMessage = new MailMessage();
mailMessage.From = new MailAddress(from);
mailMessage.Body = message;
mailMessage.Subject = subject;
mailMessage.IsBodyHtml = false;
foreach (String recipient in recipients)
{
mailMessage.To.Add(new MailAddress(recipient));
}
SmtpClient smtpClient = new SmtpClient(smtpAddress,port); // smtp.gmail.com
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = new System.Net.NetworkCredential(userName,password); // skessler1964@gmail.com MN5191306B
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
smtpClient.EnableSsl = true;
smtpClient.Send(mailMessage);
smtpClient.Dispose();
}
catch (System.Exception exception)
{
MDTrace.WriteLine(LogLevel.DEBUG,exception.ToString());
}
}
public static void SendEmail(string message, String from, String[] recipients,String smtpAddress,String userName,String password,int port=587)
{
String subject = string.Format("{0} {1}", message, DateTime.Now);
try
{
if (!NetworkStatus.IsInternetConnected())
{
MDTrace.WriteLine(LogLevel.DEBUG,"The internet is not connected. Cannot send Email.");
return;
}
MailMessage mailMessage = new MailMessage();
mailMessage.From = new MailAddress(from);
mailMessage.Body = message;
mailMessage.Subject = subject;
mailMessage.IsBodyHtml = false;
foreach (String recipient in recipients)
{
mailMessage.To.Add(new MailAddress(recipient));
}
SmtpClient smtpClient = new SmtpClient(smtpAddress,port); // smtp.gmail.com
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = new System.Net.NetworkCredential(userName,password); // skessler1964@gmail.com MN5191306B
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
smtpClient.EnableSsl = true;
smtpClient.Send(mailMessage);
smtpClient.Dispose();
}
catch (System.Exception exception)
{
MDTrace.WriteLine(LogLevel.DEBUG,exception.ToString());
}
}
}
}

627
Utility.cs Normal file
View File

@@ -0,0 +1,627 @@
using System;
using System.Text;
using System.IO.Compression;
using System.IO;
using System.Globalization;
using System.Linq;
using System.Collections.Generic;
using Microsoft.Win32;
using System.Diagnostics;
using System.Security.Principal;
using System.Threading;
using ThreadState=System.Threading.ThreadState;
namespace IPMonitor
{
public class Utility
{
private static DateTime epoch = DateTime.Parse("01-01-0001");
private static TimeSpan oneDay=new TimeSpan(1,0,0,0);
public static String ThreadStateToString(Thread thread)
{
switch(thread.ThreadState)
{
case ThreadState.Running :
return "Running";
case ThreadState.StopRequested :
return "StopRequested";
case ThreadState.SuspendRequested :
return "SuspendRequested";
case ThreadState.Background :
return "Background";
case ThreadState.Unstarted :
return "Unstarted";
case ThreadState.Stopped :
return "Stopped";
case ThreadState.WaitSleepJoin :
return "WaitSleepJoin";
case ThreadState.Suspended :
return "Suspended";
case ThreadState.AbortRequested :
return "AbortRequested";
case ThreadState.Aborted :
return "Aborted";
default :
return "Unknown";
}
}
public static long DateToUnixDate(DateTime dateTime)
{
DateTime javascriptEpoch=DateTime.Parse("01-01-1970 00:00:00");
DateTime eod=new DateTime(dateTime.Year,dateTime.Month,dateTime.Day,23,0,0); // request end of day
TimeSpan ts=eod-javascriptEpoch;
long longDate=(long)ts.TotalSeconds;
return longDate;
}
public static DateTime UnixDateToDate(long yahooDate)
{
DateTime javascriptEpoch=DateTime.Parse("01-01-1970 00:00:00");
TimeSpan timespan=TimeSpan.FromSeconds((double)yahooDate);
DateTime date=javascriptEpoch+timespan;
return date;
}
public static void RemoveLogFiles(String strFolder=null)
{
if(null==strFolder)strFolder=Directory.GetCurrentDirectory();
String[] logFiles=Directory.GetFiles(strFolder);
if(null==logFiles || 0==logFiles.Length)return;
logFiles=logFiles.Where(x => x.EndsWith(".log",StringComparison.InvariantCultureIgnoreCase)).ToArray<String>();
if(null==logFiles || 0==logFiles.Length)return;
foreach(String logFile in logFiles)
{
try
{
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("Removing {0}",logFile));
File.Delete(logFile);
}
catch(Exception){;}
}
}
public static String Pad(string str, char filler, int length)
{
int stringLength = str.Length;
if (stringLength >= length) return str;
StringBuilder sb = new StringBuilder();
while (stringLength < length)
{
sb.Append(filler);
stringLength++;
}
return sb.ToString() + str;
}
public static bool Is64Bit()
{
if(IntPtr.Size.Equals(8))return true;
return false;
}
public static bool IsAdministrator()
{
return (new WindowsPrincipal(WindowsIdentity.GetCurrent())).IsInRole(WindowsBuiltInRole.Administrator);
}
public static String RemoveHtml(String strItem)
{
if(null==strItem)return null;
String[] codes = { "&#x27;","&#187;" };
if(null==strItem)return strItem;
foreach (String code in codes)
{
strItem = strItem.Replace(code,"'");
}
strItem=strItem.Replace("&amp;","&");
strItem=strItem.Replace("&#x2018;","'");
strItem=strItem.Replace("&#x2019;","'");
strItem=strItem.Replace("&#x2014;","-");
strItem=strItem.Replace("&#x201C;",@"""");
strItem=strItem.Replace("&#x201c;",@"""");
strItem=strItem.Replace("&#x201D;",@"""");
strItem=strItem.Replace("&#x201d;",@"""");
strItem=strItem.Replace("&#x2013;","-");
return strItem;
}
public static String RemoveDivs(String strItem)
{
StringBuilder sb=new StringBuilder();
bool inDiv=false;
if(null==strItem)return strItem;
for(int index=0;index<strItem.Length;index++)
{
char ch=strItem[index];
if(ch.Equals('<'))inDiv=true;
else if(ch.Equals('>'))inDiv=false;
else if(!inDiv)sb.Append(ch);
}
return sb.ToString();
}
public static int CharToNum(char ch)
{
return (int)ch-48;
}
public static String RemoveCC(String item)
{
StringBuilder sb=new StringBuilder();
foreach(char ch in item)
{
if(!Char.IsControl(ch)) sb.Append(ch);
}
return sb.ToString();
}
public static Stream StreamFromString(string s)
{
var stream=new MemoryStream();
var writer=new StreamWriter(stream);
writer.Write(s);
writer.Flush();
stream.Position=0;
return stream;
}
public static String RemoveQuotes(String strItem)
{
if (String.IsNullOrEmpty(strItem)) return null;
if(strItem.StartsWith("\""))strItem=strItem.Substring(1);
if(strItem.EndsWith("\""))strItem=strItem.Substring(0,strItem.Length-1);
return strItem;
}
public static String BetweenString(String strItem, String strBegin, String strEnd)
{
if (null == strItem) return null;
int index=-1;
if(null==strBegin)index=0;
else index = strItem.IndexOf(strBegin);
if (-1 == index) return null;
String str = null;
if(null!=strBegin)str=strItem.Substring(index + strBegin.Length);
else str=strItem;
if(null==strEnd)return str;
index = str.IndexOf(strEnd);
if (-1 == index) return null;
StringBuilder sb = new StringBuilder();
for (int strIndex = 0; strIndex < str.Length; strIndex++)
{
if (index == strIndex) break;
sb.Append(str[strIndex]);
}
return sb.ToString();
}
public static String RemoveAfter(String strItem, char charItem)
{
StringBuilder sb = new StringBuilder();
for (int index = 0; index < strItem.Length; index++)
{
char ch = strItem[index];
if (ch.Equals(charItem)) break;
sb.Append(ch);
}
return sb.ToString();
}
public static bool OutOfRange(double value)
{
return value > 100000000000000000000.00 || value< -99999999999999999999.99;
}
public static String RemoveControlChars(String strItem)
{
StringBuilder sb=new StringBuilder();
for(int index=0;index<strItem.Length;index++)
{
char ch=strItem[index];
if(!char.IsControl(ch))sb.Append(ch);
}
return sb.ToString();
}
public static String GetPath(String strPathFileName)
{
int index=strPathFileName.LastIndexOf('\\');
if (-1 == index) return null;
String strPath = strPathFileName.Substring(0, index);
return strPath;
}
public static String KeepBefore(String strItem,String strKeepBefore)
{
int startPos=strItem.IndexOf(strKeepBefore);
if(-1==startPos)return null;
return strItem.Substring(0,startPos);
}
public static String KeepAfter(String strItem,String strKeepAfter)
{
int startPos=strItem.IndexOf(strKeepAfter);
if(-1==startPos)return null;
return strItem.Substring(startPos+strKeepAfter.Length);
}
public static String KeepAfterLast(String strItem,String strKeepAfter)
{
if(null==strItem)return null;
int startPos=strItem.LastIndexOf(strKeepAfter);
if(-1==startPos)return null;
return strItem.Substring(startPos+strKeepAfter.Length);
}
public static String Find(String strItem,String search,char delimeter)
{
if(null==strItem)return null;
bool foundDelimeter=false;
StringBuilder sb=new StringBuilder();
int startPos=strItem.LastIndexOf(search);
if(-1==startPos)return null;
startPos+=search.Length;
for(;startPos<strItem.Length;startPos++)
{
char ch=strItem[startPos];
if(ch.Equals(delimeter))
{
foundDelimeter=true;
break;
}
sb.Append(ch);
}
if(!foundDelimeter)return null;
return sb.ToString();
}
public static String FindFirst(String strItem,String search,char delimeter)
{
if(null==strItem)return null;
bool foundDelimeter=false;
StringBuilder sb=new StringBuilder();
int startPos=strItem.IndexOf(search);
if(-1==startPos)return null;
startPos+=search.Length;
for(;startPos<strItem.Length;startPos++)
{
char ch=strItem[startPos];
if(ch.Equals(delimeter))
{
foundDelimeter=true;
break;
}
sb.Append(ch);
}
if(!foundDelimeter)return null;
return sb.ToString();
}
public static String AddQuotes(String item)
{
return "\"" + item + "\"";
}
public static long DateToLong(DateTime date)
{
int year = date.Year;
int month = date.Month;
int day = date.Day;
return (year * 10000) + (month * 100) + day;
}
public static DateTime LongToDate(long longDate)
{
int year = (int)(longDate / 10000);
int month = ((int)longDate / 100) - year * 100;
int day = (int)(longDate - ((int)(longDate / 100)) * 100);
return new DateTime(year, month, day);
}
public static String DayOfWeekToString(DayOfWeek dayOfWeek)
{
switch(dayOfWeek)
{
case System.DayOfWeek.Monday: return "Monday";
case System.DayOfWeek.Tuesday: return "Tuesday";
case System.DayOfWeek.Wednesday: return "Wednesday";
case System.DayOfWeek.Thursday: return "Thursday";
case System.DayOfWeek.Friday: return "Friday";
case System.DayOfWeek.Saturday: return "Saturday";
case System.DayOfWeek.Sunday: return "Sunday";
default: return "";
}
}
public static String DateTimeToStringMMMM(DateTime dateTime)
{
if (Utility.IsEpoch(dateTime)) return "";
return dateTime.ToString("MMMM");
}
public static String DateTimeToStringMMM(DateTime dateTime)
{
if (Utility.IsEpoch(dateTime)) return "";
return dateTime.ToString("MMM");
}
public static String DateTimeToStringHHMMSS(DateTime dateTime)
{
if (Utility.IsEpoch(dateTime)) return "";
return dateTime.ToString("HH:mm:ss");
}
public static String DateTimeToStringMMSDDSYYYY(DateTime dateTime)
{
if (Utility.IsEpoch(dateTime)) return "";
return dateTime.ToString("MM/dd/yyyy");
}
public static String DateTimeToStringMMSDDSYYYYHHMMSS(DateTime dateTime)
{
if (Utility.IsEpoch(dateTime)) return "";
return dateTime.ToString("MM/dd/yyyy hh:mm:ss");
}
public static String DateTimeToStringMMHDDHYYYY(DateTime dateTime)
{
if (Utility.IsEpoch(dateTime)) return "";
return dateTime.ToString("MM-dd-yyyy");
}
public static String DateTimeToStringYYYYHMMHDD(DateTime dateTime)
{
if (Utility.IsEpoch(dateTime)) return "";
return dateTime.ToString("yyyy-MM-dd");
}
public static String DateTimeToStringYYYYHMMHDDHHMMSS(DateTime dateTime)
{
if (Utility.IsEpoch(dateTime)) return "";
return dateTime.ToString("yyyy-MM-dd hh:mm:ss");
}
public static String DateTimeToStringYYYYHMMHDDHHMMSSTT(DateTime dateTime)
{
if(Utility.IsEpoch(dateTime)) return "";
return dateTime.ToString("yyyy-MM-dd hh:mm:ss tt");
}
public static String DateTimeToStringYYYYMMDDMMSSTT(DateTime dateTime)
{
if(Utility.IsEpoch(dateTime)) return "";
return dateTime.ToString("yyyyMMddhhmmsstt");
}
public static String DateTimeToStringYYYYMMDD(DateTime dateTime)
{
if (Utility.IsEpoch(dateTime)) return "";
return dateTime.ToString("yyyyMMdd");
}
public static String AsteriskForString(String str)
{
StringBuilder sb = new StringBuilder();
int length = str.Length;
for (int index = 0; index < length; index++) sb.Append("*");
return sb.ToString();
}
public static String FormatNumber(double number)
{
StringBuilder sb=new StringBuilder();
if (double.NaN.Equals(number))sb.Append("N/A");
else sb.Append(String.Format("{0:0.000}", number));
return sb.ToString();
}
public static String FormatNumber(double number,int places,bool commas=false)
{
StringBuilder sb = new StringBuilder();
StringBuilder formatString=new StringBuilder();
if (commas&&Math.Abs(number)>=1000.00) formatString.Append("{0:0,0.");
else formatString.Append("{0:0.");
for(int index=0;index<places;index++)formatString.Append("0");
formatString.Append("}");
if (double.NaN.Equals(number)) sb.Append("N/A");
else sb.Append(String.Format(formatString.ToString(), number));
return sb.ToString();
}
public static String FormatCurrency(double number)
{
StringBuilder sb=new StringBuilder();
if (double.NaN.Equals(number))sb.Append("N/A");
else sb.Append(String.Format("{0:C}", number));
return sb.ToString();
}
public static String FormatCurrency(double number,int decimals)
{
StringBuilder sb=new StringBuilder();
String currencyFormat="{0:C"+decimals+"}";
if (double.NaN.Equals(number))sb.Append("N/A");
else sb.Append(String.Format(currencyFormat, number));
return sb.ToString();
}
public static String FormatPercent(double number)
{
StringBuilder sb = new StringBuilder();
if (double.NaN.Equals(number)) sb.Append("N/A");
else sb.Append(String.Format("{0:P}", number));
return sb.ToString();
}
public static String FormatPercent(double number,int places)
{
StringBuilder sb=new StringBuilder();
String formatString="{0:P"+places+"}";
if(double.NaN.Equals(number)) sb.Append("N/A");
else sb.Append(String.Format(formatString,number));
return sb.ToString();
}
public static String ConformDate(String strDate)
{
String[] elements=strDate.Split(' ');
if(elements.Length<3)return strDate;
return elements[0]+" "+elements[1]+" "+elements[2];
}
public static DateTime ParseDate(String strDate)
{
System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("en-US");
String[] formats=new[] { "yyyy-MM-dd hh:mm:ss tt","dddd, MMMM dd","MMM dd yyyy","yyyy-MM","ddd, MMM. d","ddd, MMM. dd","yyyy/MM/dd","M-d-yyyy","dd-MM-yyyy","MM-dd-yyyy","M.d.yyyy","dd.MM.yyyy","MM.dd.yyyy","yyyyMMdd" }.Union(cultureInfo.DateTimeFormat.GetAllDateTimePatterns()).ToArray();
strDate = strDate.Trim();
DateTime dateTime=DateTime.ParseExact(strDate, formats, new System.Globalization.CultureInfo("en-US"), DateTimeStyles.AssumeLocal);
return dateTime;
}
public static double ParsePercent(String strPercent)
{
if (null == strPercent) return double.NaN;
strPercent = strPercent.Replace("%", null);
try { return double.Parse(strPercent)/100.00; }
catch (Exception) { return double.NaN; }
}
public static String FormatCurrencyWithQuotes(double number)
{
return AddQuotes(FormatCurrency(number));
}
public static String FormatDates(DateTime d1, DateTime d2)
{
StringBuilder sb=new StringBuilder();
sb.Append(Utility.DateTimeToStringMMSDDSYYYY(d1)).Append("-");
sb.Append(Utility.DateTimeToStringMMSDDSYYYY(d2));
return sb.ToString();
}
public static String TrimToSpace(String strString)
{
if (null == strString) return strString;
StringBuilder sb = new StringBuilder();
for (int index = 0; index < strString.Length; index++)
{
char ch=strString[index];
if (' '.Equals(ch)) break;
sb.Append(ch);
}
return sb.ToString();
}
public static String BooleanToYesNoString(bool booleanValue)
{
return booleanValue ? "Yes" : "No";
}
public static bool IsEpoch(DateTime dateTime)
{
return dateTime.Equals(epoch);
}
public static DateTime Epoch
{
get { return epoch; }
}
public static TimeSpan OneDay
{
get{return oneDay;}
}
public static String ListToString(List<String> list,char separator=',')
{
StringBuilder sb=new StringBuilder();
if (null == list || 0 == list.Count) return null;
for(int index=0;index<list.Count;index++)
{
sb.Append(list[index]);
if(index<list.Count-1)sb.Append(separator);
}
return sb.ToString();
}
public static List<String> ToList(String items,char separator=',')
{
List<String> list = items.Split(separator).ToList<String>();
list=(from String str in list where !String.IsNullOrEmpty(str) select str.Trim()).ToList<String>();
return list;
}
public static String FromList(List<String> items,String postFix=",")
{
StringBuilder sb=new StringBuilder();
for(int index=0;index<items.Count;index++)
{
sb.Append(items[index]);
if(index<items.Count-1)sb.Append(postFix);
}
return sb.ToString();
}
public static byte[] Compress(String strString)
{
MemoryStream outputStream = null;
GZipStream compressionStream = null;
try
{
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(strString);
outputStream = new MemoryStream();
compressionStream = new GZipStream(outputStream, CompressionMode.Compress, true);
compressionStream.Write(bytes, 0, bytes.Length);
compressionStream.Close();
compressionStream = null;
byte[] outputBytes = outputStream.ToArray();
outputStream.Close();
outputStream = null;
return outputBytes;
}
catch (Exception exception)
{
MDTrace.WriteLine(LogLevel.DEBUG,exception);
return null;
}
finally
{
if (null != compressionStream)
{
compressionStream.Close();
compressionStream = null;
}
if (null != outputStream)
{
outputStream.Close();
outputStream = null;
}
}
}
public static String Decompress(byte[] compressedBytes)
{
MemoryStream compressedStream = new MemoryStream(compressedBytes);
GZipStream decompressionStream = new GZipStream(compressedStream, CompressionMode.Decompress,true);
MemoryStream outputStream=new MemoryStream();
try
{
byte[] decompressedBytesBuffer = new byte[4096];
int count = 0;
while (true)
{
count = decompressionStream.Read(decompressedBytesBuffer, 0, decompressedBytesBuffer.Length);
if (count > 0) outputStream.Write(decompressedBytesBuffer, 0, count);
else break;
}
decompressionStream.Close();
compressedStream.Close();
String strDecompressed = System.Text.Encoding.UTF8.GetString(outputStream.ToArray());
outputStream.Close();
outputStream = null;
compressedStream = null;
decompressionStream = null;
return strDecompressed;
}
catch (Exception exception)
{
MDTrace.WriteLine(LogLevel.DEBUG,exception);
return null;
}
finally
{
if (null != outputStream)
{
outputStream.Close();
outputStream = null;
}
if (null != decompressionStream)
{
decompressionStream.Close();
decompressionStream = null;
}
if (null != compressedStream)
{
compressedStream.Close();
compressedStream = null;
}
}
}
public static void LaunchBrowserSearch(String searchTerm)
{
Process.Start("https://www.google.com/search?q="+Uri.EscapeDataString(searchTerm)+"/");
}
public static bool IsZeroOrNaN(double value)
{
return IsNaN(value)||IsZero(value);
}
private static bool IsZero(double value)
{
if(value==0.00)return true;
return false;
}
private static bool IsNaN(double value)
{
return double.IsNaN(value);
}
public static bool DeleteFile(String pathFileName)
{
if(!File.Exists(pathFileName))return false;
try{File.Delete(pathFileName);}catch(Exception){return false;}
return true;
}
public static bool CopyFile(String pathSrcFileName,String pathDstFileName)
{
if(!File.Exists(pathSrcFileName))return false;
try{File.Copy(pathSrcFileName,pathDstFileName);}catch(Exception){return false;}
return true;
}
}
}

BIN
bin/Debug/IPMonitor.exe Normal file

Binary file not shown.

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="poll_time_ms" value="300000"/>
<add key="notify_time_ms" value="4320000"/>
<add key="sms_smtpaddress" value="smtp.gmail.com"/>
<add key="sms_smsusername" value="skessler1964@gmail.com"/>
<add key="sms_smspassword" value="xjfo isnf gmyi zovr"/>
<add key="sms_smsrecipients" value="skessler1964sms@gmail.com"/>
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/>
</startup>
</configuration>

BIN
bin/Debug/IPMonitor.pdb Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="poll_time_ms" value="300000"/>
<add key="notify_time_ms" value="4320000"/>
<add key="sms_smtpaddress" value="smtp.gmail.com"/>
<add key="sms_smsusername" value="skessler1964@gmail.com"/>
<add key="sms_smspassword" value="xjfo isnf gmyi zovr"/>
<add key="sms_smsrecipients" value="skessler1964sms@gmail.com"/>
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/>
</startup>
</configuration>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

1
bin/Debug/ipaddress.txt Normal file
View File

@@ -0,0 +1 @@
67.191.114.201

1
bin/Debug/ipmonitor.log Normal file
View File

@@ -0,0 +1 @@
[LOCAL][Thread=9][TRACE.DEBUG][3/13/2024 04:32:56 PM] [IPMonitor.Program::WriteFile(strPathFileName,ipAddress)]Creating address file:ipaddress.txt

View File

@@ -0,0 +1 @@
[LOCAL][Thread=1][TRACE.DEBUG][3/13/2024 6:10:56 PM] [IPMonitor.Program::WriteFile(strPathFileName,ipAddress)]Creating address file:ipaddress.txt

BIN
bin/Release/IPMonitor.exe Normal file

Binary file not shown.

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="poll_time_ms" value="300000"/>
<add key="notify_time_ms" value="4320000"/>
<add key="sms_smtpaddress" value="smtp.gmail.com"/>
<add key="sms_smsusername" value="skessler1964@gmail.com"/>
<add key="sms_smspassword" value="xjfo isnf gmyi zovr"/>
<add key="sms_smsrecipients" value="skessler1964sms@gmail.com"/>
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/>
</startup>
</configuration>

BIN
bin/Release/IPMonitor.pdb Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="poll_time_ms" value="300000"/>
<add key="sms_smtpaddress" value="smtp.gmail.com"/>
<add key="sms_smsusername" value="skessler1964@gmail.com"/>
<add key="sms_smspassword" value="xjfo isnf gmyi zovr"/>
<add key="sms_smsrecipients" value="skessler1964sms@gmail.com"/>
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/>
</startup>
</configuration>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

View File

@@ -0,0 +1 @@
67.191.114.201

View File

@@ -0,0 +1 @@
[LOCAL][Thread=1][TRACE.DEBUG][3/13/2024 6:14:56 PM] [IPMonitor.Program::WriteFile(strPathFileName,ipAddress)]Creating address file:ipaddress.txt

View File

@@ -0,0 +1,9 @@
C:\Visual Studio\IPMonitor\bin\Debug\IPMonitor.exe.config
C:\Visual Studio\IPMonitor\bin\Debug\IPMonitor.exe
C:\Visual Studio\IPMonitor\bin\Debug\IPMonitor.pdb
C:\Visual Studio\IPMonitor\obj\Debug\IPMonitor.csprojResolveAssemblyReference.cache
C:\Visual Studio\IPMonitor\obj\Debug\IPMonitor.exe
C:\Visual Studio\IPMonitor\obj\Debug\IPMonitor.pdb
C:\boneyard\IPMonitor\bin\Debug\IPMonitor.exe.config
C:\boneyard\IPMonitor\obj\Debug\IPMonitor.exe
C:\boneyard\IPMonitor\obj\Debug\IPMonitor.pdb

BIN
obj/Debug/IPMonitor.exe Normal file

Binary file not shown.

BIN
obj/Debug/IPMonitor.pdb Normal file

Binary file not shown.