1721 lines
66 KiB
C#
1721 lines
66 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Drawing;
|
|
using System.Windows.Forms;
|
|
using System.Xml;
|
|
using System.IO;
|
|
using System.Text.RegularExpressions;
|
|
using System.ComponentModel;
|
|
using System.Drawing.Imaging;
|
|
|
|
|
|
namespace EduNetworkBuilder
|
|
{
|
|
/// <summary>
|
|
/// This is a whole network. LAN, WAN, Internet; everything combined
|
|
/// </summary>
|
|
public class Network
|
|
{
|
|
public string PuzzleName = "";
|
|
public int myHeight = 1024;
|
|
public int myWidth = 1024;
|
|
public int Level = 0;
|
|
public double SortOrder = 0;
|
|
public bool OptionShowLabels = false;
|
|
public bool ShowLabelsHere = false;
|
|
public bool VLANsEnabled = false;
|
|
public bool VLANPacketColors = false;
|
|
private bool _LoadedFromResource = false; //If we are a puzzle that is built-into the program
|
|
public bool LoadedFromResource {
|
|
get { return _LoadedFromResource; }
|
|
private set { _LoadedFromResource = value; }
|
|
}
|
|
public LanguageStrings NetMessage;
|
|
public LanguageStrings NetTitle;
|
|
List<NetworkComponent> NetComponents = new List<NetworkComponent>();
|
|
//should have background image
|
|
Image TheNetImage = new Bitmap(1024, 1024);
|
|
Image TheNetImageBackground = new Bitmap(1024, 1024);
|
|
public int itemsize = 100; //The size of network components
|
|
PictureBox myPBox = null;
|
|
private int UniqueIdentifier = 100; //This gets used for all sorts of things. is auto-incremented every time someone asks for one
|
|
private List<Packet> myPackets = new List<Packet>();
|
|
private List<PacketMessage> myMessages = new List<PacketMessage>();
|
|
private bool _isDirty = false;
|
|
private IPAddress lastAddress = new IPAddress("0.0.0.0/24");
|
|
public string NetworkFilename = "";
|
|
public List<NetTest> NetTests = new List<NetTest>();
|
|
private bool AlreadyDisplayedMessage = false;
|
|
public NetTestVerbosity HintsToDisplay = NetTestVerbosity.none;
|
|
public NetTestVerbosity StartingHelpLevel = NetTestVerbosity.none;
|
|
public bool PuzzleIsSolved = true; //only set to false if we load a puzzle
|
|
public List<HelpTopics> SuggestedReadings = new List<HelpTopics>();
|
|
private DateTime NetworkStartTime = DateTime.Now;
|
|
private bool AlreadyChosenTimeout = false;
|
|
private int DefaultTimeout = 10;
|
|
private int NumberOfSecondsForTimeout = 10;
|
|
private List<Rectangle> PacketRectangles = new List<Rectangle>();
|
|
public BindingList<VLANName> VlanNames = new BindingList<VLANName>() { new VLANName(1, "Default") };
|
|
|
|
private bool previously_had_packets = false; //used on "tick" to determine if we are starting from scratch
|
|
|
|
private List<string> PacketColors = new List<string>();
|
|
private List<Image> PacketImages = new List<Image>();
|
|
private List<PingTestStatus> PingTestStats = new List<PingTestStatus>();
|
|
|
|
/// <summary>
|
|
/// WhatFrom: If we are launched from a homework, we remember it here.
|
|
/// </summary>
|
|
public SchoolworkClass WhatFrom = null;
|
|
|
|
public Network(string Name)
|
|
{
|
|
TheNetImage = new Bitmap(myWidth, myHeight);
|
|
PuzzleName = Name;
|
|
NetMessage = new LanguageStrings("message"); //Do not translate this string "message" It is an important word
|
|
NetTitle = new LanguageStrings("title"); //Do not translate this string "title". It is an important word
|
|
}
|
|
|
|
public Network() {
|
|
NetMessage = new LanguageStrings("message");
|
|
NetTitle = new LanguageStrings("title"); //Do not translate this string "title". It is an important word
|
|
} //simple constructor
|
|
|
|
private bool isDirty()
|
|
{
|
|
if (_isDirty) return true;
|
|
foreach (NetworkComponent nc in NetComponents)
|
|
{
|
|
if (nc.IsDirty) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static void Clone(Network source, Network dest)
|
|
{
|
|
dest.AlreadyDisplayedMessage = false;
|
|
dest.DefaultTimeout = source.DefaultTimeout;
|
|
dest.HintsToDisplay = source.HintsToDisplay;
|
|
dest.itemsize = source.itemsize;
|
|
dest.Level = source.Level;
|
|
dest.myHeight = source.myHeight;
|
|
dest.myWidth = source.myWidth;
|
|
//dest.NetComponents
|
|
foreach(NetworkComponent NC in source.NetComponents)
|
|
{
|
|
dest.NetComponents.Add(NetworkComponent.Clone(NC));
|
|
}
|
|
//dest.NetTests
|
|
foreach(NetTest NT in source.NetTests)
|
|
{
|
|
dest.NetTests.Add(NetTest.Clone(NT));
|
|
}
|
|
dest.NetTitle = source.NetTitle;
|
|
dest.NetworkFilename = source.NetworkFilename;
|
|
dest.OptionShowLabels = source.OptionShowLabels;
|
|
//dest.PacketColors = source.PacketColors;
|
|
dest.PuzzleName = source.PuzzleName;
|
|
dest.NetMessage = new LanguageStrings(source.NetMessage);
|
|
dest.WhatFrom = source.WhatFrom; //We remember the schoolwork class we came from.
|
|
}
|
|
|
|
public Network Clone()
|
|
{
|
|
Network newitem = new Network();
|
|
Network.Clone(this, newitem);
|
|
return newitem;
|
|
}
|
|
|
|
public void ClearComponents()
|
|
{
|
|
NetComponents.Clear();
|
|
}
|
|
public void ClearPackets()
|
|
{
|
|
myPackets.Clear();
|
|
}
|
|
public void ClearMessages()
|
|
{
|
|
myMessages.Clear();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Load the file from a xml resource
|
|
/// </summary>
|
|
public void Load()
|
|
{
|
|
Load(@"C:\Users\tyoung\Desktop\Test.enbx");
|
|
}
|
|
|
|
public void Load(string filename)
|
|
{
|
|
NetworkFilename = filename;
|
|
XmlDocument xmlDoc = new XmlDocument();
|
|
PuzzleName = Path.GetFileNameWithoutExtension(filename);
|
|
if (File.Exists(filename))
|
|
{
|
|
xmlDoc.Load(filename);
|
|
Load(xmlDoc,PuzzleName);
|
|
}
|
|
}
|
|
|
|
public void Load(XmlNode TheNode, string Name, bool FromResource=false, bool skipOpeningWindows = false)
|
|
{
|
|
_isDirty = true;
|
|
NetworkDevice newND;
|
|
NetworkLink newNL;
|
|
int newUnique=-1;
|
|
PuzzleName = Name;
|
|
LoadedFromResource = FromResource;
|
|
foreach (XmlNode Individual in TheNode.ChildNodes)
|
|
{
|
|
XmlNodeType myNodetype = Individual.NodeType;
|
|
if (myNodetype == XmlNodeType.Element)
|
|
{
|
|
switch (Individual.Name.ToLower())
|
|
{
|
|
case "edunetworkbuilder":
|
|
case "network":
|
|
Load(Individual,PuzzleName, FromResource);
|
|
break;
|
|
case "puzzlename":
|
|
PuzzleName = Individual.InnerText;
|
|
break;
|
|
case "showlabels":
|
|
bool.TryParse(Individual.InnerText, out OptionShowLabels);
|
|
ShowLabelsHere = OptionShowLabels;
|
|
break;
|
|
case "vlansenabled":
|
|
bool.TryParse(Individual.InnerText, out VLANsEnabled);
|
|
break;
|
|
case "vlanpacketcolors":
|
|
bool.TryParse(Individual.InnerText, out VLANPacketColors);
|
|
if (VLANPacketColors)
|
|
VLANsEnabled = true; //If we do colors, we need to do vlans
|
|
break;
|
|
case "itemsize":
|
|
int.TryParse(Individual.InnerText, out itemsize);
|
|
break;
|
|
case "height":
|
|
int.TryParse(Individual.InnerText, out myHeight);
|
|
break;
|
|
case "width":
|
|
int.TryParse(Individual.InnerText, out myWidth);
|
|
break;
|
|
case "uniqueidentifier":
|
|
int.TryParse(Individual.InnerText, out UniqueIdentifier);
|
|
newUnique = UniqueIdentifier;
|
|
break;
|
|
case "link":
|
|
newNL = new NetworkLink(Individual);
|
|
NetComponents.Add(newNL);
|
|
break;
|
|
case "device":
|
|
newND = new NetworkDevice(Individual);
|
|
NetComponents.Add(newND);
|
|
break;
|
|
case "nettest":
|
|
NetTest nt = new NetTest(Individual);
|
|
NetTests.Add(nt);
|
|
break;
|
|
case "tag":
|
|
HelpTopics tempHelpTopic = NB.TryParseEnum<HelpTopics>(Individual.InnerText, HelpTopics.None);
|
|
if (tempHelpTopic != HelpTopics.None)
|
|
{
|
|
SuggestedReadings.Add(tempHelpTopic);
|
|
}
|
|
break;
|
|
case "level":
|
|
int.TryParse(Individual.InnerText, out Level);
|
|
//Tags.Add("Level_" + Individual.InnerText);
|
|
break;
|
|
case "sortorder":
|
|
double.TryParse(Individual.InnerText, out SortOrder);
|
|
break;
|
|
case "startinghelplevel":
|
|
StartingHelpLevel = NB.ParseEnum<NetTestVerbosity>(Individual.InnerText);
|
|
HintsToDisplay = StartingHelpLevel;
|
|
break;
|
|
case "vlanname":
|
|
if (Individual.Attributes != null && Individual.Attributes["ID"] != null)
|
|
{
|
|
int ID;
|
|
int.TryParse(Individual.Attributes["ID"].Value, out ID);
|
|
string colorname = "Blue";
|
|
if (Individual.Attributes["Color"] != null)
|
|
colorname = Individual.Attributes["Color"].Value;
|
|
Color PacketColor = Color.FromName(colorname);
|
|
if (ID > 1)
|
|
{
|
|
VlanNames.Add(new VLANName(ID, Individual.InnerText, PacketColor));
|
|
VLANsEnabled = true;
|
|
}
|
|
else
|
|
{
|
|
VlanNames.RemoveAt(0);
|
|
VlanNames.Insert(0,new VLANName(ID, Individual.InnerText, PacketColor));
|
|
VLANsEnabled = true;
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
if(Regex.IsMatch(Individual.Name.ToLower(),"message"))
|
|
{
|
|
NetMessage.Add(Individual);
|
|
}
|
|
else
|
|
if (Regex.IsMatch(Individual.Name.ToLower(), "title"))
|
|
{
|
|
NetTitle.Add(Individual);
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
DoAllVerifyLinks();
|
|
DoAllAutoJoin();
|
|
OpenHelpIfNeeded(skipOpeningWindows);
|
|
if (NetTests.Count > 0)
|
|
PuzzleIsSolved = false; //When we load the puzzle.
|
|
|
|
if (newUnique != -1)
|
|
UniqueIdentifier = newUnique;
|
|
}
|
|
|
|
public void OpenHelpIfNeeded(bool skipOpeningWindows)
|
|
{
|
|
if (NetMessage.GetText() != "" && !AlreadyDisplayedMessage & !skipOpeningWindows)
|
|
{
|
|
//We have a message loaded on this network. Display it
|
|
BuilderWindow myWin = (BuilderWindow)Application.OpenForms["BuilderWindow"];
|
|
if (myWin != null)
|
|
{
|
|
myWin.OpenNetHelpWindow();
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show(NetMessage.GetText(), NetTitle.GetText(), MessageBoxButtons.OK);
|
|
}
|
|
AlreadyDisplayedMessage = true;
|
|
}
|
|
}
|
|
|
|
public void Save()
|
|
{
|
|
Save(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.enbx"));
|
|
}
|
|
|
|
public void Save(string filename)
|
|
{
|
|
NetworkFilename = filename;
|
|
XmlWriterSettings settings = new XmlWriterSettings();
|
|
settings.Indent = true;
|
|
settings.NewLineOnAttributes = true;
|
|
XmlWriter writer = XmlWriter.Create(filename, settings);
|
|
|
|
//Now we write the file:
|
|
writer.WriteStartDocument();
|
|
writer.WriteStartElement("EduNetworkBuilder");
|
|
writer.WriteComment("This is a network file for EduNetworkBuilder.");
|
|
Save(writer);
|
|
writer.WriteEndElement();
|
|
writer.WriteEndDocument();
|
|
writer.Flush();
|
|
writer.Close();
|
|
}
|
|
|
|
|
|
public void Save(XmlWriter writer, bool StraightToFile = true)
|
|
{
|
|
//Save the language name
|
|
//save the number of items
|
|
//Save all the items
|
|
writer.WriteStartElement("Network");
|
|
if(NetMessage != null)
|
|
NetMessage.Save(writer);
|
|
if(NetTitle != null)
|
|
NetTitle.Save(writer);
|
|
writer.WriteElementString("height", myHeight.ToString());
|
|
writer.WriteElementString("width", myWidth.ToString());
|
|
writer.WriteElementString("itemsize", itemsize.ToString());
|
|
writer.WriteElementString("showlabels", OptionShowLabels.ToString());
|
|
writer.WriteElementString("level", Level.ToString());
|
|
writer.WriteElementString("sortorder", SortOrder.ToString());
|
|
writer.WriteElementString("uniqueidentifier", UniqueIdentifier.ToString());
|
|
writer.WriteElementString("startinghelplevel", StartingHelpLevel.ToString());
|
|
writer.WriteElementString("vlansenabled", VLANsEnabled.ToString());
|
|
writer.WriteElementString("VLANPacketColors", VLANPacketColors.ToString());
|
|
if(!StraightToFile)
|
|
writer.WriteElementString("PuzzleName", PuzzleName);
|
|
//Save all the devices
|
|
for (int loop = 0; loop < NetComponents.Count; loop++)
|
|
{
|
|
if (NB.GetComponentType(NetComponents[loop]) == GeneralComponentType.device)
|
|
NetComponents[loop].Save(writer);
|
|
}
|
|
//Then save the links
|
|
for (int loop = 0; loop < NetComponents.Count; loop++)
|
|
{
|
|
if (NB.GetComponentType(NetComponents[loop]) == GeneralComponentType.link)
|
|
NetComponents[loop].Save(writer);
|
|
}
|
|
foreach(NetTest nt in NetTests)
|
|
{
|
|
nt.Save(writer);
|
|
}
|
|
foreach(HelpTopics HT in SuggestedReadings)
|
|
{
|
|
writer.WriteElementString("tag",HT.ToString());
|
|
}
|
|
foreach(VLANName VLAN in VlanNames)
|
|
{
|
|
writer.WriteStartElement("VLANName");
|
|
writer.WriteAttributeString("ID", VLAN.ID.ToString());
|
|
writer.WriteAttributeString("Color", VLAN.PacketColorString);
|
|
writer.WriteString(VLAN.Name);
|
|
writer.WriteEndElement();
|
|
}
|
|
writer.WriteEndElement();
|
|
}
|
|
|
|
public void UpdateDeviceSizes()
|
|
{
|
|
NetworkDevice nd;
|
|
foreach (NetworkComponent NC in NetComponents)
|
|
{
|
|
if (NB.GetComponentType(NC) == GeneralComponentType.device)
|
|
{
|
|
nd = (NetworkDevice)NC;
|
|
nd.SetSize(itemsize);
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool MAC_Exists(string MAC)
|
|
{
|
|
foreach (NetworkComponent nc in NetComponents)
|
|
{
|
|
if (nc.HasMac(MAC)) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public void RegisterDisplayArea(PictureBox What)
|
|
{
|
|
myPBox = What;
|
|
myPBox.BackgroundImage = TheNetImageBackground;
|
|
myPBox.BackgroundImageLayout = ImageLayout.Stretch;
|
|
myPBox.SizeMode = PictureBoxSizeMode.StretchImage;
|
|
Print();
|
|
myPBox.Invalidate();
|
|
}
|
|
|
|
public Point clickedPos(Point pixelClickedOn)
|
|
{
|
|
if (myPBox == null) return new Point(-1, -1);
|
|
double deltaX = (double)TheNetImage.Width / myPBox.Width;
|
|
double deltaY = (double)TheNetImage.Height / myPBox.Height;
|
|
Point Dest = new Point((int)(pixelClickedOn.X * deltaX), (int)(pixelClickedOn.Y * deltaY));
|
|
if (Dest.X > TheNetImage.Width) Dest = new Point(TheNetImage.Width, Dest.Y);
|
|
if (Dest.Y > TheNetImage.Height) Dest = new Point(Dest.X, TheNetImage.Height);
|
|
if (Dest.X <0) Dest = new Point(0, Dest.Y);
|
|
if (Dest.Y <0) Dest = new Point(Dest.X, 0);
|
|
|
|
return Dest;
|
|
}
|
|
|
|
public Point clickedPosCentered(Point pixelClickedOn)
|
|
{
|
|
Point NetPoint = clickedPos(pixelClickedOn);
|
|
int shift = (itemsize / 2);
|
|
Point Dest = new Point((int)(NetPoint.X - shift), (int)(NetPoint.Y - shift));
|
|
if (Dest.X + itemsize > TheNetImage.Width) Dest = new Point(TheNetImage.Width - itemsize, Dest.Y);
|
|
if (Dest.Y + itemsize > TheNetImage.Height) Dest = new Point(Dest.X, TheNetImage.Height - itemsize);
|
|
if (Dest.X < 0) Dest = new Point(0, Dest.Y);
|
|
if (Dest.Y < 0) Dest = new Point(Dest.X, 0);
|
|
return Dest;
|
|
}
|
|
|
|
public NetworkDevice ItemAtPosition(Point NetworkLocation)
|
|
{
|
|
NetworkDevice tDevice;
|
|
foreach (NetworkComponent tItem in NetComponents)
|
|
{
|
|
if (tItem.GetType().ToString() == "EduNetworkBuilder.NetworkDevice")
|
|
{
|
|
tDevice = (NetworkDevice)tItem;
|
|
if (tDevice.AtLocation(NetworkLocation))
|
|
return tDevice;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
public List<NetworkDevice> DevicesInRectangle(Rectangle area)
|
|
{
|
|
NetworkDevice tDevice;
|
|
Point tPoint;
|
|
List<NetworkDevice> thelist = new List<NetworkDevice>();
|
|
|
|
foreach (NetworkComponent tItem in NetComponents)
|
|
{
|
|
if (tItem is NetworkDevice)
|
|
{
|
|
tDevice = (NetworkDevice)tItem;
|
|
int tsize = tDevice.Size;
|
|
tPoint = tDevice.myLocation();
|
|
if (tPoint.X + tsize >= area.X && tPoint.Y +tsize >= area.Y)
|
|
{
|
|
if (tPoint.X <= area.X + area.Width && tPoint.Y <= area.Y + area.Height)
|
|
{
|
|
thelist.Add(tDevice);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return thelist;
|
|
}
|
|
public NetworkDevice ItemFromName(string hostname)
|
|
{
|
|
NetworkDevice tDevice;
|
|
foreach (NetworkComponent tItem in NetComponents)
|
|
{
|
|
if (tItem.GetType().ToString() == "EduNetworkBuilder.NetworkDevice")
|
|
{
|
|
tDevice = (NetworkDevice)tItem;
|
|
if (tDevice.hostname == hostname)
|
|
return tDevice;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public bool HasItemCalled(string itemname)
|
|
{
|
|
NetworkDevice tDevice;
|
|
foreach(NetworkComponent tItem in NetComponents)
|
|
{
|
|
if(tItem.GetType().ToString() == "EduNetworkBuilder.NetworkDevice")
|
|
{
|
|
tDevice = (NetworkDevice)tItem;
|
|
if (tDevice.hostname == itemname) return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
public NetworkComponent AddItem(NetworkComponentType WhatType, Point location)
|
|
{
|
|
if (WhatType == NetworkComponentType.none) return null; //Do not put none in
|
|
if (WhatType == NetworkComponentType.link) return null; //We need to add links another way
|
|
string basename = WhatType.ToString();
|
|
int count=0;
|
|
while (HasItemCalled(basename + count))
|
|
count++;
|
|
|
|
Point newlocation = NB.GetSnapped(location);
|
|
|
|
NetworkComponent NewItem = new NetworkDevice(WhatType, basename + count, newlocation);
|
|
((NetworkDevice)NewItem).SetSize(itemsize);
|
|
|
|
NetComponents.Add(NewItem);
|
|
TestForCompletion(true);
|
|
myPBox.Invalidate(); //redraw the screen
|
|
return NewItem;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Search throuh all the network components and delete any links that are attacked to the specified nic.
|
|
/// </summary>
|
|
/// <param name="NicStr"></param>
|
|
public void RemoveLinksToNic(HostNicID NicID)
|
|
{
|
|
for(int looper=NetComponents.Count()-1; looper >=0; looper--)
|
|
{
|
|
if(NetComponents[looper].GetType().ToString() == "EduNetworkBuilder.NetworkLink")
|
|
{
|
|
NetworkLink nLink = (NetworkLink)NetComponents[looper];
|
|
if (nLink.HasLink(NicID))
|
|
{
|
|
nLink.Destroy();
|
|
NetComponents.RemoveAt(looper);
|
|
_isDirty = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Search throuh all the network components and delete any links that are attacked to the specified nic.
|
|
/// </summary>
|
|
/// <param name="NicStr"></param>
|
|
public List<NetworkLink> AllLinksConnectedToComponent(int UniqueID)
|
|
{
|
|
List<NetworkLink> theList = new List<NetworkLink>();
|
|
for (int looper = NetComponents.Count() - 1; looper >= 0; looper--)
|
|
{
|
|
if (NetComponents[looper] is NetworkLink)
|
|
{
|
|
NetworkLink nLink = (NetworkLink)NetComponents[looper];
|
|
if (nLink.Src.HostID == UniqueID || nLink.Dst.HostID == UniqueID)
|
|
theList.Add(nLink);
|
|
}
|
|
}
|
|
return theList;
|
|
}
|
|
|
|
public NetworkComponent AddItem(NetworkComponent ToAdd)
|
|
{
|
|
NetComponents.Add(ToAdd);
|
|
TestForCompletion(true);
|
|
return ToAdd;
|
|
}
|
|
public List<string> UnavailableNics()
|
|
{
|
|
NetworkLink myLink;
|
|
List<string> usedList = new List<string>();
|
|
foreach (NetworkComponent NC in NetComponents)
|
|
{
|
|
if (NC.GetType().ToString() == "EduNetworkBuilder.NetworkLink")
|
|
{
|
|
myLink = (NetworkLink)NC;
|
|
usedList.AddRange(myLink.UsedNicIDStrings());
|
|
}
|
|
}
|
|
return usedList;
|
|
}
|
|
|
|
public void RemoveComponent(NetworkComponent tItem)
|
|
{
|
|
for (int i = NetComponents.Count -1; i >= 0; i--)
|
|
{
|
|
if (NetComponents[i] == tItem)
|
|
NetComponents.RemoveAt(i);
|
|
// NetComponents.Remove(tItem);
|
|
}
|
|
tItem.Destroy();
|
|
_isDirty = true;
|
|
}
|
|
|
|
public void StoreLastIP(IPAddress ip)
|
|
{
|
|
lastAddress = ip;
|
|
}
|
|
|
|
public IPAddress RetrieveLastIP()
|
|
{
|
|
return lastAddress;
|
|
}
|
|
|
|
public List<string> GetTestMessages(string host)
|
|
{
|
|
string tString;
|
|
List<string> tMessages = new List<string>();
|
|
foreach(NetTest nt in NetTests)
|
|
{
|
|
if(nt.sHost == host && !nt.TestComplete())
|
|
{
|
|
tString = nt.GetDescription(HintsToDisplay);
|
|
if(tString != "")
|
|
tMessages.Add(tString);
|
|
}
|
|
}
|
|
return tMessages;
|
|
}
|
|
public List<string> GetIncompleteTestDestinations(string Source, ContextTest WhatFor=ContextTest.ping)
|
|
{
|
|
List<string> tDests = new List<string>();
|
|
foreach (NetTest nt in NetTests)
|
|
{
|
|
if (nt.sHost == Source && !nt.TestComplete())
|
|
{
|
|
if (WhatFor == ContextTest.ping && (nt.TheTest == NetTestType.FailedPing || nt.TheTest == NetTestType.SuccessfullyPings
|
|
|| nt.TheTest == NetTestType.SuccessfullyPingsAgain))
|
|
tDests.Add(nt.dHost);
|
|
if (WhatFor == ContextTest.arp && nt.TheTest == NetTestType.SuccessfullyArps)
|
|
tDests.Add(nt.dHost);
|
|
if (WhatFor == ContextTest.traceroute && nt.TheTest == NetTestType.SuccessfullyTraceroutes)
|
|
tDests.Add(nt.dHost);
|
|
}
|
|
}
|
|
return tDests;
|
|
}
|
|
|
|
public void TestForCompletion(bool report_as_done)
|
|
{
|
|
NetworkDevice TmpDevice;
|
|
bool PreviouslyUnsolved = !PuzzleIsSolved; //Only if we have an unsolved puzzle
|
|
int PuzzleCount = 0;
|
|
|
|
foreach (NetworkComponent nc in NetComponents)
|
|
{
|
|
if (NB.GetComponentType(nc) == GeneralComponentType.device)
|
|
{
|
|
TmpDevice = (NetworkDevice)nc;
|
|
if (TmpDevice.BackgroundColor != Color.Empty)
|
|
{
|
|
TmpDevice.BackgroundColor = Color.Empty;
|
|
TmpDevice.IsDirty = true;
|
|
}
|
|
}
|
|
}
|
|
foreach (NetTest nt in NetTests)
|
|
{
|
|
if (nt.ColorItemsIfNeeded(HintsToDisplay != NetTestVerbosity.none)) //only change the color if we are not "none"
|
|
{
|
|
PuzzleCount++;
|
|
}
|
|
}
|
|
if (report_as_done && PuzzleCount == 0 && PreviouslyUnsolved)
|
|
{
|
|
//The puzzle was just solved
|
|
MarkAsSolved();
|
|
}
|
|
}
|
|
|
|
public void UpdateImage()
|
|
{
|
|
TestForCompletion(false);
|
|
//we have the whole thing to print, and the display image already done
|
|
if (isDirty() || _isDirty)
|
|
{
|
|
if(TheNetImage == null)
|
|
TheNetImage = new Bitmap(TheNetImage.Width, TheNetImage.Height);
|
|
SolidBrush theBrush = new SolidBrush(SystemColors.Control);
|
|
Graphics.FromImage(TheNetImage).FillRectangle(theBrush, new Rectangle(0,0, TheNetImage.Width, TheNetImage.Height));
|
|
//re-generate the image
|
|
//Do all the links first
|
|
foreach (NetworkComponent NC in NetComponents)
|
|
{
|
|
if (NC.GetType().ToString() == "EduNetworkBuilder.NetworkLink")
|
|
NC.Print(TheNetImage, false);
|
|
}
|
|
//Now, do all the devices
|
|
foreach (NetworkComponent NC in NetComponents)
|
|
{
|
|
if (NC.GetType().ToString() == "EduNetworkBuilder.NetworkDevice")
|
|
NC.Print(TheNetImage, ShowLabelsHere);
|
|
}
|
|
//Write the whole thing to the background image.
|
|
Graphics.FromImage(TheNetImageBackground).DrawImage(TheNetImage, 0, 0);
|
|
}
|
|
myPBox.Invalidate();//redraw it
|
|
_isDirty = false;
|
|
|
|
}
|
|
|
|
public void EraseOldPackets()
|
|
{
|
|
//Make sure we draw a fresh image.
|
|
Graphics.FromImage(TheNetImageBackground).DrawImage(TheNetImage, 0, 0);
|
|
foreach(Rectangle rec in PacketRectangles)
|
|
{
|
|
Invalidate(rec);
|
|
}
|
|
PacketRectangles.Clear();
|
|
}
|
|
|
|
public void DrawPackets()
|
|
{
|
|
foreach (Packet pkt in myPackets)
|
|
{
|
|
//If we do not already have something at the current rectangle, print it
|
|
if (!PacketRectangles.Contains(pkt.PacketRectangle()))
|
|
{
|
|
pkt.Print(TheNetImageBackground); //Print all the packets over the network image
|
|
Invalidate(pkt.PacketRectangle());
|
|
PacketRectangles.Add(pkt.PacketRectangle());
|
|
}
|
|
}
|
|
//myPBox.Refresh();
|
|
}
|
|
|
|
public void Print()
|
|
{
|
|
//we have the whole thing to print, and the display image already done
|
|
InvalidateEverything();
|
|
UpdateImage();
|
|
EraseOldPackets();
|
|
DrawPackets();
|
|
_isDirty = false;
|
|
}
|
|
|
|
public void InvalidateEverything()
|
|
{
|
|
foreach(NetworkComponent nc in NetComponents)
|
|
{
|
|
nc.IsDirty = true;
|
|
}
|
|
_isDirty = true;
|
|
UpdateImage();
|
|
}
|
|
|
|
public void Invalidate(Rectangle area)
|
|
{
|
|
//Figure out the area we are looking at
|
|
if (myPBox.BackgroundImageLayout == ImageLayout.Stretch)
|
|
{
|
|
double width_ratio = myPBox.ClientRectangle.Width / TheNetImage.Width;
|
|
double height_ratio = myPBox.ClientRectangle.Height / TheNetImage.Height;
|
|
int x, y, width, height;
|
|
x = (int)(area.X * width_ratio);
|
|
y = (int)(area.Y * height_ratio);
|
|
width = (int)(area.Width * width_ratio);
|
|
height = (int)(area.Height * height_ratio);
|
|
|
|
Rectangle newRec = new Rectangle(x, y, width, height);
|
|
|
|
//Now we invalidate the adjusted rectangle
|
|
myPBox.Invalidate(newRec);
|
|
}
|
|
}
|
|
|
|
public List<string> arp(UInt32 IP)
|
|
{
|
|
List<string> arps = new List<string>();
|
|
List<string> tlist;
|
|
foreach (NetworkComponent nc in NB.Randomize(NetComponents))
|
|
{
|
|
tlist = nc.arp(IP);
|
|
if (tlist.Count() > 0)
|
|
{
|
|
foreach (string mac in tlist)
|
|
{
|
|
arps.Add(mac);
|
|
}
|
|
}
|
|
}
|
|
return arps;
|
|
}
|
|
public int GetUniqueIdentifier()
|
|
{
|
|
return UniqueIdentifier++;
|
|
}
|
|
|
|
public void SortNetComponents()
|
|
{
|
|
NetComponents.Sort((x, y) => x.hostname.CompareTo(y.hostname));
|
|
}
|
|
|
|
public NetworkDevice HostMatchingHostNicID(HostNicID ToFind)
|
|
{
|
|
NetworkDevice tDevice;
|
|
//We cheat. the first portion of the host/nic ID is the host_id so we just find that
|
|
foreach (NetworkComponent nc in NetComponents)
|
|
{
|
|
if (NB.GetComponentType(nc) == GeneralComponentType.device)
|
|
{
|
|
if (nc.GetUniqueIdentifier == ToFind.HostID)
|
|
{
|
|
tDevice = (NetworkDevice)nc;
|
|
return tDevice;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
/// <summary>
|
|
/// Search all the devices and make sure the one device is the only one that has the specified IP
|
|
/// </summary>
|
|
/// <param name="ToFind">The IP address to find</param>
|
|
/// <param name="Source">The device that has it</param>
|
|
/// <returns></returns>
|
|
public bool HasUniqueIP(IPAddress ToFind, NetworkDevice Source)
|
|
{
|
|
NetworkDevice ND;
|
|
foreach (NetworkComponent nc in NetComponents)
|
|
{
|
|
if (NB.GetComponentType(nc) == GeneralComponentType.device)
|
|
{
|
|
ND = (NetworkDevice)nc;
|
|
if(ND != Source) //Skip the source
|
|
{
|
|
if (ND.HasIPAddress(ToFind))
|
|
return false; //Something has that IP
|
|
}
|
|
}
|
|
}
|
|
return true; //We did not find any device with that IP
|
|
}
|
|
|
|
public bool ItemIsCritical(string host)
|
|
{
|
|
foreach(NetTest nt in NetTests)
|
|
{
|
|
if (nt.dHost == host) return true;
|
|
if (nt.sHost == host) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public bool ItemIsCritical(HostNicID host)
|
|
{
|
|
NetworkDevice ND = GetDeviceFromID(host);
|
|
if (ND == null) return false; //cannot find it
|
|
foreach (NetTest nt in NetTests)
|
|
{
|
|
if (nt.dHost == ND.hostname) return true;
|
|
if (nt.sHost == ND.hostname) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public bool ItemIsLocked(string host, string dest, NetTestType WhatToCheck)
|
|
{
|
|
foreach (NetTest nt in NetTests)
|
|
{
|
|
if(nt.sHost == host || WhatToCheck == NetTestType.LockVLANNames)
|
|
{
|
|
if (nt.TheTest == NetTestType.LockAll)
|
|
return true;
|
|
if (WhatToCheck == nt.TheTest && WhatToCheck == NetTestType.LockVLANNames) //no dest to check
|
|
return true;
|
|
if (WhatToCheck == nt.TheTest && WhatToCheck == NetTestType.LockVLANsOnHost) //no dest to check
|
|
return true;
|
|
if (WhatToCheck == nt.TheTest && dest == nt.dHost)
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private void MarkAsSolved()
|
|
{
|
|
PuzzleIsSolved = true;
|
|
if (LoadedFromResource) //Save the fact that we solved it only if we loaded it from resource.
|
|
{
|
|
if (PuzzleName != "" && PuzzleName != null)
|
|
{
|
|
NBSettings oursettings = NB.GetSettings();
|
|
oursettings.MarkAsDone(PuzzleName);
|
|
}
|
|
}
|
|
//kill all extra windows that no longer need to be open.
|
|
KillAllExtraWindows();
|
|
|
|
DialogResult answer = MessageBox.Show(NB.Translate("N_MarkAsSolvedDone"),NB.Translate("_Solved"),MessageBoxButtons.YesNo);
|
|
|
|
if (answer == DialogResult.Yes)
|
|
{
|
|
KillAllExtraWindows(true);
|
|
ListBoxWindow LBW = new ListBoxWindow();
|
|
LBW.ShowDialog();
|
|
}
|
|
}
|
|
|
|
void KillAllExtraWindows(bool EvenRTF=false)
|
|
{
|
|
for(int i = Application.OpenForms.Count -1; i >=0; i--)
|
|
{
|
|
if (Application.OpenForms[i].Name == "BuilderWindow") continue; //We do not kill the builder window
|
|
if (EvenRTF && Application.OpenForms[i].Name == "RTFWindow") continue; //We do not kill the rtf window
|
|
Application.OpenForms[i].Hide(); //make them disappear
|
|
Application.OpenForms[i].Close(); //actually close them
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// See if we have any tests that are supposed to check for packet arrival.
|
|
/// </summary>
|
|
/// <param name="packet_type">The type of packet that arrived</param>
|
|
/// <param name="sHost">The host it originated from</param>
|
|
/// <param name="dHost">The machine it went to</param>
|
|
public void NotePacketArrived(PacketType packet_type, NetworkDevice source, IPAddress sIP, IPAddress dIP, int PacketID)
|
|
{
|
|
string sHost = ReverseDNSLookup(source, sIP);
|
|
string dHost = ReverseDNSLookup(source, dIP);
|
|
if (packet_type == PacketType.ping_answer)
|
|
{
|
|
RegisterPingSuccess(sHost, dHost);
|
|
}
|
|
//If we are checking a ping, but we already have done it, we see if there is a ping-again
|
|
foreach (NetTest nt in NetTests)
|
|
{
|
|
if (nt.TheTest == NetTestType.SuccessfullyArps && packet_type == PacketType.arp_answer && sHost == nt.sHost && dHost == nt.dHost)
|
|
nt.SetDone();
|
|
if (nt.TheTest == NetTestType.SuccessfullyDHCPs && packet_type == PacketType.dhcp_answer && sHost == nt.sHost && dHost == nt.dHost)
|
|
nt.SetDone();
|
|
if(HasCompletedPingTest(packet_type,source,sIP,dIP, PacketID))
|
|
{
|
|
if (nt.TheTest == NetTestType.SuccessfullyPingsAgain && packet_type == PacketType.ping_answer && sHost == nt.sHost && dHost == nt.dHost)
|
|
nt.SetDone(PacketID);
|
|
if (nt.TheTest == NetTestType.SuccessfullyPingsAgain && packet_type == PacketType.ping_answer && sHost == nt.sHost && dHost == null && dIP != null && dIP.BroadcastAddress == dIP.GetIP && dIP.GetIPString == nt.dHost)
|
|
nt.SetDone(PacketID);
|
|
}
|
|
if (nt.TheTest == NetTestType.SuccessfullyPings && packet_type == PacketType.ping_answer && sHost == nt.sHost && dHost == nt.dHost)
|
|
nt.SetDone(PacketID);
|
|
if (nt.TheTest == NetTestType.SuccessfullyPings && packet_type == PacketType.ping_answer && sHost == nt.sHost && dHost == null && dIP != null && dIP.BroadcastAddress == dIP.GetIP && dIP.GetIPString == nt.dHost)
|
|
nt.SetDone(PacketID);
|
|
if (nt.TheTest == NetTestType.SuccessfullyTraceroutes && packet_type == PacketType.tracert_reply && sHost == nt.sHost && dHost == nt.dHost)
|
|
nt.SetDone(PacketID);
|
|
if (nt.TheTest == NetTestType.SuccessfullyTraceroutes && packet_type == PacketType.tracert_reply && sHost == nt.sHost && dHost == null && dIP != null && dIP.BroadcastAddress == dIP.GetIP && dIP.GetIPString == nt.dHost)
|
|
nt.SetDone(PacketID);
|
|
}
|
|
}
|
|
|
|
public bool HasCompletedPingTest(PacketType packet_type, NetworkDevice source, IPAddress sIP, IPAddress dIP, int PacketID)
|
|
{
|
|
if (packet_type != PacketType.ping_answer) return false; //This only works with pings.
|
|
string sHost = ReverseDNSLookup(source, sIP);
|
|
string dHost = ReverseDNSLookup(source, dIP);
|
|
//If this matches a ping test which is already set to "done", return true
|
|
foreach (NetTest nt in NetTests)
|
|
{
|
|
if (nt.TheTest == NetTestType.SuccessfullyPings && sHost == nt.sHost && dHost == nt.dHost && nt.TaskWasDone && nt.PacketNumber != PacketID)
|
|
return true;
|
|
if (nt.TheTest == NetTestType.SuccessfullyPings && sHost == nt.sHost && dHost == null && dIP != null && dIP.BroadcastAddress == dIP.GetIP && dIP.GetIPString == nt.dHost && nt.TaskWasDone && nt.PacketNumber != PacketID)
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public bool NoteActionDone(NetTestType theTest, string sHost, string dHost)
|
|
{
|
|
bool OldVal = false;
|
|
IPAddress sourceIP;
|
|
string sourceIPstring;
|
|
IPAddress destIP;
|
|
string destIPstring;
|
|
foreach (NetTest nt in NetTests)
|
|
{
|
|
sourceIP = new IPAddress(sHost);
|
|
sourceIPstring = ReverseDNSLookup(null, sourceIP); //this will either be an ip address or the host name
|
|
destIP = new IPAddress(dHost);
|
|
destIPstring = ReverseDNSLookup(null, destIP); //this will either be an ip address or the host name
|
|
if ((nt.TheTest == NetTestType.HelpRequest || nt.TheTest == NetTestType.FailedPing || nt.TheTest == NetTestType.ReadContextHelp) &&
|
|
(sHost == nt.sHost || sourceIPstring == nt.sHost) &&
|
|
(dHost == nt.dHost || destIPstring == nt.dHost))
|
|
{
|
|
OldVal = nt.TaskWasDone;
|
|
nt.SetDone();
|
|
if (nt.TaskWasDone != OldVal)
|
|
return true;
|
|
}
|
|
if (nt.TheTest == NetTestType.HelpRequest && sHost == "" && dHost == nt.dHost && dHost == "?Button")
|
|
{
|
|
OldVal = nt.TaskWasDone;
|
|
nt.SetDone();
|
|
if (nt.TaskWasDone != OldVal)
|
|
{
|
|
BuilderWindow myWin = NB.GetBuilderWin();
|
|
if (myWin == null) return true;
|
|
Control ctl = myWin.GetControlNamed("btnHelp");
|
|
if (ctl == null) return false;
|
|
ctl.BackColor = Control.DefaultBackColor;
|
|
|
|
return true;
|
|
}
|
|
}
|
|
if (nt.TheTest == NetTestType.HelpRequest && sHost == "" && dHost == nt.dHost && dHost == "ViewButton")
|
|
{
|
|
OldVal = nt.TaskWasDone;
|
|
nt.SetDone();
|
|
if (nt.TaskWasDone != OldVal)
|
|
{
|
|
BuilderWindow myWin = NB.GetBuilderWin();
|
|
if (myWin == null) return true;
|
|
Control ctl = myWin.GetControlNamed("cbViewTitles");
|
|
if (ctl == null) return false;
|
|
ctl.BackColor = Control.DefaultBackColor;
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public List<string> NetworkCardForHostList(string hostname, bool OnlyUnused = true, bool OnlyLinkable = false, NicType fromNIC = NicType.none)
|
|
{
|
|
List<string> theList = new List<string>();
|
|
NetworkDevice tDevice;
|
|
foreach (NetworkComponent nc in NetComponents)
|
|
{
|
|
if (nc.GetType().ToString() == "EduNetworkBuilder.NetworkDevice")
|
|
{
|
|
if(nc.hostname == hostname)
|
|
{
|
|
tDevice = (NetworkDevice)nc;
|
|
theList.AddRange(tDevice.NetworkCardStrings(OnlyUnused,OnlyLinkable, fromNIC));
|
|
}
|
|
}
|
|
}
|
|
return theList;
|
|
}
|
|
|
|
public List<string> GetMessageStrings()
|
|
{
|
|
List<string> themessages = new List<string>();
|
|
foreach (PacketMessage msg in myMessages)
|
|
{
|
|
themessages.AddRange(msg.GetMessagesSummary());
|
|
}
|
|
return themessages;
|
|
}
|
|
public int CountMessages()
|
|
{
|
|
return myMessages.Count();
|
|
}
|
|
public PacketMessage GetMessageAtIndex(int index)
|
|
{
|
|
if (index < 0 || index > myMessages.Count()) return null;
|
|
return myMessages[index];
|
|
}
|
|
|
|
public void addPacket(Packet toadd)
|
|
{
|
|
if (toadd != null && !myPackets.Contains(toadd))
|
|
{
|
|
if (myPackets.Count > NB.MaxPacketsBeforeOptimizing)
|
|
{
|
|
bool foundit = false;
|
|
foreach(Packet pkt in myPackets)
|
|
{
|
|
if(pkt.MyType == toadd.MyType && pkt.WhereAmI == toadd.WhereAmI &&
|
|
(pkt.sourceIP != null && pkt.sourceIP.Equals(toadd.sourceIP)) &&
|
|
(pkt.destIP != null && pkt.destIP.Equals(toadd.destIP)))
|
|
{
|
|
foundit = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!foundit)
|
|
myPackets.Add(toadd);
|
|
}
|
|
else
|
|
{
|
|
myPackets.Add(toadd);
|
|
}
|
|
}
|
|
}
|
|
|
|
public int CountPackets(PacketType WhatType)
|
|
{
|
|
int count = 0;
|
|
foreach (Packet pkt in myPackets)
|
|
{
|
|
if (pkt.MyType == WhatType)
|
|
count++;
|
|
}
|
|
return count;
|
|
}
|
|
|
|
public void ProcessPacketsOnce()
|
|
{
|
|
foreach(Packet tpackets in myPackets.ToList())
|
|
{
|
|
if(tpackets != null)
|
|
tpackets.ProcessTick();
|
|
if (tpackets.DebugOn)
|
|
Console.WriteLine(NB.Translate("N_ProssPackOnceDbug"));
|
|
}
|
|
for(int loop=myPackets.Count -1; loop >=0; loop--)
|
|
{
|
|
//we delete if it has finished.
|
|
if (myPackets[loop].DebugOn)
|
|
Console.WriteLine(NB.Translate("N_ProssPackOnceDbug"));
|
|
if (myPackets[loop].TickTTL < 1) //If the packet has been around too long, get rid of it
|
|
{
|
|
myPackets[loop].AddMessage(DebugLevel.info, NB.Translate("N_ProssPackOnceTickCounter"));
|
|
myPackets[loop].PrepareToDelete();
|
|
myPackets.RemoveAt(loop);
|
|
}
|
|
else if (myPackets[loop].ready_to_delete)
|
|
{
|
|
myPackets[loop].PrepareToDelete();
|
|
myPackets.RemoveAt(loop);
|
|
}
|
|
}
|
|
GC.Collect();//Try to clean up memory.
|
|
myPackets = NB.Randomize(myPackets);
|
|
}
|
|
|
|
/// <summary>
|
|
/// This checks to see if there is any reason we should stop processing the packets
|
|
/// </summary>
|
|
/// <returns>true if we should continue, false if we should pause</returns>
|
|
public bool ProcessingShouldContinue()
|
|
{
|
|
TimeSpan Duration = DateTime.Now - NetworkStartTime;
|
|
NB.SetProgress(Duration.TotalSeconds, NumberOfSecondsForTimeout);
|
|
if (Duration.TotalSeconds > NumberOfSecondsForTimeout)
|
|
{
|
|
Console.WriteLine(string.Format(NB.Translate("N_ProssShouldContinSec"), Duration.TotalSeconds.ToString()));
|
|
foreach (Packet pkt in myPackets)
|
|
{
|
|
pkt.Tracking.AddMessage(DebugLevel.packet, NB.Translate("N_ProssShouldContinNet"), NB.Translate("N_ProssShouldContinTime"));
|
|
pkt.Tracking.Status = NB.Translate("N_ProssShouldContinTimeout");
|
|
pkt.MyStatus = PacketStatus.finished_failed;
|
|
pkt.PrepareToDelete();
|
|
}
|
|
ClearPackets();
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public void RegisterTimeOfArrival()
|
|
{
|
|
TimeSpan Duration = DateTime.Now - NetworkStartTime;
|
|
int MaxTime = (int)Duration.TotalSeconds + 2;
|
|
if(!AlreadyChosenTimeout)
|
|
{
|
|
NumberOfSecondsForTimeout = MaxTime * 2;
|
|
AlreadyChosenTimeout = true;
|
|
}
|
|
}
|
|
|
|
public void ProcessPackets()
|
|
{
|
|
//This functionality is now done in 'Tick'
|
|
return; //exit early. Rest is done in tick
|
|
}
|
|
|
|
public void ResetPacketTimeout()
|
|
{
|
|
//We should only do this when we know we are starting new packets.
|
|
//Traceroute does this when resetting
|
|
AlreadyChosenTimeout = false; //we do this at the beginning of processing
|
|
NumberOfSecondsForTimeout = DefaultTimeout;
|
|
NetworkStartTime = DateTime.Now;
|
|
}
|
|
|
|
public void Tick()
|
|
{
|
|
EraseOldPackets();
|
|
//if (myPackets.Count > 50)
|
|
//Console.WriteLine("Packets: " + myPackets.Count.ToString());
|
|
if (myPackets.Count > 0)
|
|
{
|
|
if (!previously_had_packets)
|
|
{
|
|
AlreadyChosenTimeout = false; //we do this at the beginning of processing
|
|
NumberOfSecondsForTimeout = DefaultTimeout;
|
|
NetworkStartTime = DateTime.Now;
|
|
}
|
|
ProcessPacketsOnce();
|
|
if(!ProcessingShouldContinue())
|
|
{
|
|
//It has all been taken care of
|
|
}
|
|
DrawPackets();
|
|
//myPBox.Refresh();
|
|
previously_had_packets = true;
|
|
}
|
|
else
|
|
{
|
|
if(previously_had_packets)
|
|
{
|
|
//remove any IP connection tracking info
|
|
NetworkDevice ND;
|
|
foreach (NetworkComponent nc in NetComponents)
|
|
{
|
|
if (NB.GetComponentType(nc) == GeneralComponentType.device)
|
|
{
|
|
ND = (NetworkDevice)nc;
|
|
ND.ClearIPConnectionInfo();
|
|
}
|
|
}
|
|
foreach(PingTestStatus PTS in PingTestStats)
|
|
{
|
|
if (PTS.Succeeded == false)
|
|
{
|
|
//We mark it as failed
|
|
NoteActionDone(NetTestType.FailedPing, PTS.Source, PTS.Dest);
|
|
}
|
|
}
|
|
PingTestStats.Clear(); //empty it for now.
|
|
DebugPausePoint WhatIsSet = NB.GetDebugPauseSetting();
|
|
if (WhatIsSet != 0)
|
|
{
|
|
Console.WriteLine(NB.Translate("N_ProssPackDone"));
|
|
}
|
|
TestForCompletion(true); //Now, report on the progress if we solved something in the middle of the packets going out
|
|
AlreadyChosenTimeout = false;
|
|
NB.SetProgress(0, NumberOfSecondsForTimeout);
|
|
NB.UpdateMessages();
|
|
NB.MarkToUpdate();
|
|
}
|
|
previously_had_packets = false;
|
|
}
|
|
}
|
|
|
|
public void AddMessage(PacketMessage toAdd)
|
|
{
|
|
//Only add this if it has not already been added
|
|
if(myMessages.IndexOf(toAdd) <0 )
|
|
{
|
|
myMessages.Add(toAdd);
|
|
}
|
|
}
|
|
|
|
public NetworkComponent GetComponentFromID(int TheID)
|
|
{
|
|
foreach(NetworkComponent nc in NetComponents)
|
|
{
|
|
if(nc.GetUniqueIdentifier == TheID)
|
|
{
|
|
return nc;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public NetworkLink GetLinkFromID(int TheID)
|
|
{
|
|
NetworkComponent nc = GetComponentFromID(TheID);
|
|
if (nc == null) return null;
|
|
if (nc.GetType().ToString() == "EduNetworkBuilder.NetworkLink")
|
|
return (NetworkLink)nc;
|
|
return null;
|
|
}
|
|
public NetworkDevice GetDeviceFromID(int ID)
|
|
{
|
|
NetworkComponent nc = GetComponentFromID(ID);
|
|
if (nc == null) return null;
|
|
if (nc.GetType().ToString() == "EduNetworkBuilder.NetworkDevice")
|
|
return (NetworkDevice)nc;
|
|
return null;
|
|
}
|
|
|
|
public NetworkDevice GetDeviceFromID(HostNicID LinkedNic)
|
|
{
|
|
return GetDeviceFromID(LinkedNic.HostID);
|
|
}
|
|
|
|
public NetworkDevice GetDeviceFromName(string DeviceName)
|
|
{
|
|
NetworkComponent nc = ItemFromName(DeviceName);
|
|
if (nc == null) return null;
|
|
if (NB.GetComponentType(nc) == GeneralComponentType.device)
|
|
return (NetworkDevice)nc;
|
|
return null;
|
|
}
|
|
|
|
public List<string> GetHostnames(bool EvenNonNetworked = false)
|
|
{
|
|
List<string> tList = new List<string>();
|
|
NetworkDevice ND;
|
|
foreach(NetworkComponent NC in NetComponents)
|
|
{
|
|
if(NB.GetComponentType(NC) == GeneralComponentType.device)
|
|
{
|
|
ND = (NetworkDevice)NC;
|
|
if (!EvenNonNetworked && (ND.GetNetType() == NetworkComponentType.microwave || ND.GetNetType() == NetworkComponentType.fluorescent))
|
|
continue;
|
|
tList.Add(ND.hostname);
|
|
}
|
|
}
|
|
tList.Sort();
|
|
return tList;
|
|
}
|
|
|
|
public List<string> GetSubnets()
|
|
{
|
|
List<string> tList = new List<string>();
|
|
NetworkDevice ND;
|
|
List<string> subnets;
|
|
foreach (NetworkComponent NC in NetComponents)
|
|
{
|
|
if (NB.GetComponentType(NC) == GeneralComponentType.device)
|
|
{
|
|
ND = (NetworkDevice)NC;
|
|
subnets = ND.SubnetList();
|
|
foreach(string subnet in subnets)
|
|
{
|
|
if (!tList.Contains(subnet))
|
|
tList.Add(subnet);
|
|
}
|
|
}
|
|
}
|
|
tList.Sort();
|
|
return tList;
|
|
}
|
|
|
|
public List<string> GetBroadcasts()
|
|
{
|
|
List<string> tList = new List<string>();
|
|
NetworkDevice ND;
|
|
List<string> subnets;
|
|
foreach (NetworkComponent NC in NetComponents)
|
|
{
|
|
if (NB.GetComponentType(NC) == GeneralComponentType.device)
|
|
{
|
|
ND = (NetworkDevice)NC;
|
|
subnets = ND.BroadcastList();
|
|
foreach (string subnet in subnets)
|
|
{
|
|
if (!tList.Contains(subnet))
|
|
tList.Add(subnet);
|
|
}
|
|
}
|
|
}
|
|
tList.Sort();
|
|
return tList;
|
|
}
|
|
public void MarkAsLinked(HostNicID LinkedNic, int LinkID)
|
|
{
|
|
NetworkDevice nd = GetDeviceFromID(LinkedNic);
|
|
//If the host exists, now mark the nic
|
|
if(nd != null)
|
|
{
|
|
NetworkCard nic = nd.NicFromID(LinkedNic);
|
|
if(nic != null)
|
|
nic.ConnectedLink = LinkID;
|
|
}
|
|
}
|
|
public void MarkAsUnlinked(HostNicID LinkedNic, int LinkID)
|
|
{
|
|
NetworkDevice nd = GetDeviceFromID(LinkedNic);
|
|
//If the host exists, now mark the nic
|
|
if (nd != null)
|
|
{
|
|
NetworkCard nic = nd.NicFromID(LinkedNic);
|
|
if ((nic != null && nic.ConnectedLink == LinkID) || LinkID == -1)
|
|
{
|
|
nic.ConnectedLink = -1;
|
|
}
|
|
}
|
|
}
|
|
|
|
public IPAddress DNSLookup(NetworkDevice source, string toFind)
|
|
{
|
|
|
|
foreach(NetworkComponent nc in NB.Randomize(NetComponents))
|
|
{
|
|
NetworkDevice nd;
|
|
if(NB.GetComponentType(nc) == GeneralComponentType.device)
|
|
{
|
|
nd = (NetworkDevice)nc;
|
|
if(nd.hostname == toFind)
|
|
{
|
|
IPAddress found = nd.BestIPForThis(source);
|
|
return found;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public string ReverseDNSLookup(NetworkDevice source, IPAddress toFind)
|
|
{
|
|
if (source != null && source.HasIPAddress(toFind))
|
|
return source.hostname; //if the host is 127.0.0.1 or something.
|
|
foreach (NetworkComponent nc in NB.Randomize(NetComponents))
|
|
{
|
|
NetworkDevice nd;
|
|
if (NB.GetComponentType(nc) == GeneralComponentType.device)
|
|
{
|
|
nd = (NetworkDevice)nc;
|
|
if (nd.HasIPAddress(toFind))
|
|
return nd.hostname;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public bool DeviceIsOverDamaging(LinkType myLink, Point location)
|
|
{
|
|
NetworkDevice ND;
|
|
int countDistance = 25;
|
|
double HowFar;
|
|
foreach(NetworkComponent NC in NetComponents)
|
|
{
|
|
if (NB.GetComponentType(NC) == GeneralComponentType.device)
|
|
{
|
|
ND = (NetworkDevice)NC;
|
|
if(myLink == LinkType.wireless && ND.GetNetType() == NetworkComponentType.microwave)
|
|
{
|
|
HowFar = distance(location, ND.myLocation());
|
|
//Console.WriteLine("position=" + HowFar.ToString());
|
|
if (HowFar < countDistance)
|
|
if (HowFar < countDistance)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
if (myLink != LinkType.wireless && ND.GetNetType() == NetworkComponentType.fluorescent)
|
|
{
|
|
HowFar = distance(location, ND.myLocation());
|
|
//Console.WriteLine("position=" + HowFar.ToString());
|
|
if (HowFar < countDistance)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public double distance(Point start, Point dest)
|
|
{
|
|
return Math.Sqrt(Math.Pow((start.X - dest.X),2) + Math.Pow((start.Y - dest.Y),2)) / 5; //use grid size...
|
|
}
|
|
|
|
public double distance(NetworkDevice start, NetworkDevice dest)
|
|
{
|
|
if (start == null || dest == null) return 0;
|
|
return distance(start.myLocation(), dest.myLocation());
|
|
}
|
|
|
|
/// <summary>
|
|
/// Return the closest wireless device we can connect to
|
|
/// </summary>
|
|
/// <param name="start"></param>
|
|
/// <returns></returns>
|
|
public NetworkCard BestWirelessLinkForDevice(NetworkCard start)
|
|
{
|
|
NetworkDevice starting = GetDeviceFromID(start.myID);
|
|
NetworkCard found = null;
|
|
NetworkDevice checking = null;
|
|
double l_distance = 10000;
|
|
if (starting == null) return null;
|
|
NetworkCard answer=null;
|
|
foreach(NetworkComponent nc in NetComponents)
|
|
{
|
|
if(NB.GetComponentType(nc) == GeneralComponentType.device)
|
|
{
|
|
checking = (NetworkDevice)nc;
|
|
if (checking.PowerOff) continue; //we cannot connect to a powered-off device
|
|
if (checking == starting) continue;
|
|
answer = checking.HasWPortSSIDKey(start.SSID, start.EncryptionKey);
|
|
if(answer != null)
|
|
{
|
|
double tdist = distance(starting, checking);
|
|
if(tdist < l_distance && tdist < NB.WirelessMaxUnsuccessfulLink)
|
|
{
|
|
l_distance = tdist;
|
|
found = answer;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return found;
|
|
}
|
|
|
|
public void RegisterPingTest(string source, string dest)
|
|
{
|
|
PingTestStatus PTS = new PingTestStatus();
|
|
PTS.Source = source;
|
|
PTS.Dest = dest;
|
|
PTS.Succeeded = false;
|
|
PingTestStats.Add(PTS);
|
|
}
|
|
|
|
public void RegisterPingSuccess(string source, string dest)
|
|
{
|
|
foreach (PingTestStatus PST in PingTestStats)
|
|
{
|
|
if (PST.Source == source &&
|
|
PST.Dest == dest)
|
|
{
|
|
PST.Succeeded = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/****************************************
|
|
* Do On All Devices
|
|
* **************************************/
|
|
public void DoAllDHCP()
|
|
{
|
|
NetworkDevice nd;
|
|
foreach (NetworkComponent nc in NetComponents)
|
|
{
|
|
if(NB.GetComponentType(nc) == GeneralComponentType.device)
|
|
{
|
|
nd = (NetworkDevice)nc;
|
|
nd.DHCPRequestFromHere();
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool DoAllVerifyLinks()
|
|
{
|
|
NetworkLink nl;
|
|
bool didanything = false;
|
|
NetworkComponent nc;
|
|
for (int i = NetComponents.Count -1; i >= 0; i-- )
|
|
{
|
|
nc = NetComponents[i];
|
|
if (NB.GetComponentType(nc) == GeneralComponentType.link)
|
|
{
|
|
nl = (NetworkLink)nc;
|
|
didanything = nl.VerifyLinkIntegrity() || didanything;
|
|
}
|
|
}
|
|
return didanything;
|
|
}
|
|
|
|
public bool DoAllMarkAsLinked()
|
|
{
|
|
bool didanything = false;
|
|
NetworkLink nl;
|
|
foreach (NetworkComponent nc in NetComponents.ToList())
|
|
{
|
|
if (NB.GetComponentType(nc) == GeneralComponentType.link)
|
|
{
|
|
nl = (NetworkLink)nc;
|
|
nl.MarkAsLinked();
|
|
didanything = true;
|
|
}
|
|
}
|
|
|
|
return didanything;
|
|
}
|
|
|
|
public bool DoAllAutoJoin()
|
|
{
|
|
bool didanything = false;
|
|
NetworkDevice nd;
|
|
foreach (NetworkComponent nc in NetComponents.ToList())
|
|
{
|
|
if (NB.GetComponentType(nc) == GeneralComponentType.device)
|
|
{
|
|
nd = (NetworkDevice)nc;
|
|
didanything = nd.AutoJoinWireless() || didanything;
|
|
}
|
|
}
|
|
|
|
return didanything;
|
|
}
|
|
|
|
public int VLANIDFromName(string name)
|
|
{
|
|
foreach(VLANName VN in VlanNames)
|
|
{
|
|
if (VN.Name.Equals(name))
|
|
return VN.ID;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
/// <summary>
|
|
/// For solved puzzles. We can add options to them
|
|
/// </summary>
|
|
public void OverrideFromResources()
|
|
{
|
|
LoadedFromResource = false;
|
|
}
|
|
|
|
public void DoAllClearArp()
|
|
{
|
|
NetworkDevice nd;
|
|
foreach (NetworkComponent nc in NetComponents)
|
|
{
|
|
if (NB.GetComponentType(nc) == GeneralComponentType.device)
|
|
{
|
|
nd = (NetworkDevice)nc;
|
|
nd.ClearArps();
|
|
}
|
|
}
|
|
}
|
|
public void DoAllPing(IPAddress destination)
|
|
{
|
|
NetworkDevice nd;
|
|
foreach (NetworkComponent nc in NetComponents)
|
|
{
|
|
if (NB.GetComponentType(nc) == GeneralComponentType.device)
|
|
{
|
|
nd = (NetworkDevice)nc;
|
|
nd.PingFromHere(destination);
|
|
}
|
|
}
|
|
}
|
|
public void DoAllClearIPs()
|
|
{
|
|
NetworkDevice nd;
|
|
foreach (NetworkComponent nc in NetComponents)
|
|
{
|
|
if (NB.GetComponentType(nc) == GeneralComponentType.device)
|
|
{
|
|
nd = (NetworkDevice)nc;
|
|
nd.ClearIPs();
|
|
}
|
|
}
|
|
}
|
|
|
|
public Image GetPacketImage(Color PacketColor, Color VLANColor)
|
|
{
|
|
if (VLANColor == Color.Blue) VLANColor = PacketColor;
|
|
string ColorNames = PacketColor.Name + VLANColor.Name;
|
|
if(PacketColors.Contains(ColorNames))
|
|
{
|
|
return PacketImages[PacketColors.IndexOf(ColorNames)];
|
|
}
|
|
PacketColors.Add(ColorNames);
|
|
Image newPacketImage = new Bitmap(NB.PacketPixelSize, NB.PacketPixelSize);
|
|
using (Graphics G = Graphics.FromImage(newPacketImage))
|
|
{
|
|
G.Clear(Color.Transparent);
|
|
// Pen myPen = new Pen(PacketColor, NB.PacketPixelSize);
|
|
Brush tBrush = new SolidBrush(VLANColor);
|
|
G.FillEllipse(tBrush, 0,0, NB.PacketPixelSize, NB.PacketPixelSize);
|
|
tBrush = new SolidBrush(PacketColor);
|
|
int dist = NB.PacketPixelSize / 4;
|
|
G.FillEllipse(tBrush, dist, dist, NB.PacketPixelSize / 2, NB.PacketPixelSize / 2);
|
|
}
|
|
PacketImages.Add(newPacketImage);
|
|
return newPacketImage;
|
|
}
|
|
|
|
public Color ColorFromPacketVLAN(int id)
|
|
{
|
|
if (!VLANPacketColors) return Color.Blue; //If we are not set up to do vlan colors.
|
|
foreach(VLANName VN in VlanNames)
|
|
{
|
|
if (VN.ID == id)
|
|
return VN.PacketColor;
|
|
}
|
|
return Color.Blue;
|
|
}
|
|
|
|
//This function heavily borrowed from: http://stackoverflow.com/questions/1563038/fast-work-with-bitmaps-in-c-sharp
|
|
public Image ColoredImage(Image BaseImage, Color MorphColor)
|
|
{
|
|
Bitmap b = new Bitmap(BaseImage);
|
|
|
|
BitmapData bData = b.LockBits(new Rectangle(0, 0, BaseImage.Width, BaseImage.Height), ImageLockMode.ReadWrite, b.PixelFormat);
|
|
|
|
/* GetBitsPerPixel just does a switch on the PixelFormat and returns the number */
|
|
int bitsPerPixel = Image.GetPixelFormatSize(bData.PixelFormat);
|
|
|
|
/*the size of the image in bytes */
|
|
int size = bData.Stride * bData.Height;
|
|
|
|
/*Allocate buffer for image*/
|
|
byte[] data = new byte[size];
|
|
|
|
/*This overload copies data of /size/ into /data/ from location specified (/Scan0/)*/
|
|
System.Runtime.InteropServices.Marshal.Copy(bData.Scan0, data, 0, size);
|
|
|
|
for (int i = 0; i < size; i += bitsPerPixel / 8)
|
|
{
|
|
//double magnitude = 1 / 3d * (data[i] + data[i + 1] + data[i + 2]);
|
|
|
|
//data[i] is the first of 3 bytes of color
|
|
data[i] = (byte)((data[i] + MorphColor.B) / 2);
|
|
data[i + 1] = (byte)((data[i + 1] + MorphColor.G) / 2);
|
|
data[i + 2] = (byte)((data[i + 2] + MorphColor.R) / 2);
|
|
}
|
|
|
|
/* This override copies the data back into the location specified */
|
|
System.Runtime.InteropServices.Marshal.Copy(data, 0, bData.Scan0, data.Length);
|
|
|
|
b.UnlockBits(bData);
|
|
|
|
return b;
|
|
}
|
|
}
|
|
|
|
}
|