Getting up to date and moving translation stuff to separate function
This commit is contained in:
parent
a18f760a9f
commit
5775c35020
449
EduNetworkBuilder/DeviceConfig.cs
Normal file
449
EduNetworkBuilder/DeviceConfig.cs
Normal file
@ -0,0 +1,449 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Globalization;
|
||||
using System.Resources;
|
||||
|
||||
|
||||
namespace EduNetworkBuilder
|
||||
{
|
||||
public partial class DeviceConfig : Form
|
||||
{
|
||||
NetworkComponent OriginalItem;
|
||||
NetworkComponent ClonedItem;
|
||||
bool processing = false;
|
||||
ToolTip mytooltips = new ToolTip();
|
||||
|
||||
public DeviceConfig(NetworkComponent Original_Item)
|
||||
{
|
||||
InitializeComponent();
|
||||
LanguagifyComponents();
|
||||
OriginalItem = Original_Item;
|
||||
ClonedItem = NetworkComponent.Clone(OriginalItem);
|
||||
UpdateForm();
|
||||
lblHelp.Text = "Select the network card or interface for that network card that you wish to edit. " +
|
||||
"Then press the [edit] button to make changes to that. Press the [-] to remove it, and press [+] to add another.";
|
||||
}
|
||||
|
||||
private void LoadFromOrig()
|
||||
{
|
||||
ClonedItem.UpdateFromComponent(OriginalItem);
|
||||
}
|
||||
|
||||
private void LoadFromClone()
|
||||
{
|
||||
OriginalItem.UpdateFromComponent(ClonedItem);
|
||||
}
|
||||
|
||||
private void LanguagifyComponents()
|
||||
{
|
||||
ResourceManager RM = NB.GetResource();
|
||||
CultureInfo CI = NB.GetCulture();
|
||||
Text = NB.Translate("DC_lblHostname");
|
||||
Text = NB.Translate("DC_lblHelp");
|
||||
Text = NB.Translate("DC_btnCancel");
|
||||
Text = NB.Translate("DC_btnOK");
|
||||
Text = NB.Translate("DC_btnNicPlus");
|
||||
Text = NB.Translate("DC_btnNicMinus");
|
||||
Text = NB.Translate("DC_btnNicEdit");
|
||||
Text = NB.Translate("DC_btnIfEdit");
|
||||
Text = NB.Translate("DC_btnIfMinus");
|
||||
Text = NB.Translate("DC_btnIfAdd");
|
||||
Text = NB.Translate("DC_btnGateway");
|
||||
Text = NB.Translate("DC_btnRoutes");
|
||||
Text = NB.Translate("DC_cbDHCP");
|
||||
Text = NB.Translate("DC_btnDHCP");
|
||||
Text = NB.Translate("DC_Form");
|
||||
}
|
||||
|
||||
|
||||
private void UpdateForm()
|
||||
{
|
||||
Network theNet = NB.GetNetwork();
|
||||
if (theNet.ItemIsCritical(OriginalItem.hostname))
|
||||
{
|
||||
tbHostname.Enabled = false;
|
||||
mytooltips.SetToolTip(tbHostname, "This item is part of the puzzle and cannot be renamed.");
|
||||
}
|
||||
if (processing) return;
|
||||
processing = true;
|
||||
if (ClonedItem.GetType().ToString() == "EduNetworkBuilder.NetworkDevice")
|
||||
{
|
||||
NetworkDevice ndCLonedItem = (NetworkDevice)ClonedItem;
|
||||
|
||||
if(ndCLonedItem.CanAddNics)
|
||||
{
|
||||
btnNicPlus.Visible = true;
|
||||
btnNicMinus.Visible = true;
|
||||
}else
|
||||
{
|
||||
btnNicPlus.Visible = false;
|
||||
btnNicMinus.Visible = false;
|
||||
}
|
||||
|
||||
if(ndCLonedItem.CanServeDHCP)
|
||||
{
|
||||
if (ndCLonedItem.GetIsDHCPServer())
|
||||
cbDHCP.Checked = true;
|
||||
cbDHCP.Visible = true;
|
||||
if(cbDHCP.Checked)
|
||||
btnDHCP.Visible = true;
|
||||
else
|
||||
btnDHCP.Visible = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
btnDHCP.Visible = false;
|
||||
cbDHCP.Visible = false;
|
||||
}
|
||||
|
||||
btnGateway.Visible = true;
|
||||
btnGateway.Text = "Gateway: " + ndCLonedItem.GetGateway().GetIP.ToIpString();
|
||||
tbHostname.Text = ndCLonedItem.hostname;
|
||||
//Network cards are changed with the [edit] button and do not need to be updated here
|
||||
//IPAddresses are changed with the [edit] button and do not need to be updated here
|
||||
|
||||
//The Nics
|
||||
int selectedLb = lbNics.SelectedIndex;
|
||||
lbNics.Items.Clear();
|
||||
List<string> lists = ndCLonedItem.NetworkCardStrings(false);
|
||||
foreach (string tstring in lists)
|
||||
{
|
||||
lbNics.Items.Add(tstring);
|
||||
}
|
||||
if(selectedLb < 0)
|
||||
{
|
||||
if (lbNics.Items.Count > 0)
|
||||
{
|
||||
lbNics.SelectedIndex = 0;
|
||||
selectedLb = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (selectedLb >= lbNics.Items.Count) selectedLb = -1;
|
||||
lbNics.SelectedIndex = selectedLb;
|
||||
}
|
||||
if (lbNics.SelectedIndex >= 0)
|
||||
{
|
||||
btnNicEdit.Enabled = true;
|
||||
btnNicMinus.Enabled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
btnNicEdit.Enabled = false;
|
||||
btnNicMinus.Enabled = false;
|
||||
}
|
||||
|
||||
lbArpTable.Items.Clear();
|
||||
lbArpTable.Items.Add("Arp Table MAC\tIPAddress");
|
||||
foreach(ArpEntry ae in ndCLonedItem.GetArps())
|
||||
{
|
||||
lbArpTable.Items.Add(ae.MACAddress + "\t" + ae.IPAddr);
|
||||
}
|
||||
|
||||
//The IP Addresses for the given nic
|
||||
//Use the index of the nic
|
||||
string selectedNicName = "";
|
||||
if (lbNics.SelectedItem != null) selectedNicName = lbNics.SelectedItem.ToString();
|
||||
selectedNicName = Regex.Replace(selectedNicName, " .*", "");
|
||||
selectedNicName = Regex.Replace(selectedNicName, "\\*", "");
|
||||
lists = ndCLonedItem.NetworkCardInterfaceStrings(selectedNicName);
|
||||
//get the IPAddress string list from the nic
|
||||
selectedLb = lbAddresses.SelectedIndex;
|
||||
lbAddresses.Items.Clear();
|
||||
foreach (string tstring in lists)
|
||||
{
|
||||
lbAddresses.Items.Add(tstring);
|
||||
}
|
||||
if (selectedLb < 0)
|
||||
{
|
||||
if (lbAddresses.Items.Count > 0)
|
||||
lbAddresses.SelectedIndex = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (lbAddresses.Items.Count > 0 && selectedLb < lbAddresses.Items.Count)
|
||||
lbAddresses.SelectedIndex = selectedLb;
|
||||
}
|
||||
if (lbNics.SelectedIndex >= 0)
|
||||
{
|
||||
btnIfEdit.Enabled = true;
|
||||
btnIfMinus.Enabled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
btnIfEdit.Enabled = false;
|
||||
btnIfMinus.Enabled = false;
|
||||
}
|
||||
|
||||
}
|
||||
processing = false;
|
||||
}
|
||||
|
||||
private void StoreInCloneFromForm()
|
||||
{
|
||||
if(NB.GetComponentType(ClonedItem) == GeneralComponentType.device)
|
||||
{
|
||||
NetworkDevice ndCLonedItem = (NetworkDevice)ClonedItem;
|
||||
ndCLonedItem.hostname = tbHostname.Text;
|
||||
//Network cards are changed with the [edit] button and do not need to be updated here
|
||||
//IPAddresses are changed with the [edit] button and do not need to be updated here
|
||||
}
|
||||
}
|
||||
|
||||
private void tbHostname_Validating(object sender, CancelEventArgs e)
|
||||
{
|
||||
//Make sure something else does not already have this hostname
|
||||
Network theNet = NB.GetNetwork();
|
||||
string otext;
|
||||
if(theNet.ItemIsCritical(tbHostname.Text))
|
||||
{
|
||||
if(tbHostname.Text != OriginalItem.hostname)
|
||||
{
|
||||
e.Cancel = true;
|
||||
otext = tbHostname.Text;
|
||||
tbHostname.Text = OriginalItem.hostname;
|
||||
|
||||
MessageBox.Show("The name '" + otext + "' is being used as part of this puzzle and this machine cannot be named that.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void btnNicPlus_Click(object sender, EventArgs e)
|
||||
{
|
||||
List<NicType> WhatToAdd = new List<NicType>();
|
||||
//generate a new nic and add it to the device
|
||||
if (ClonedItem.GetType().ToString() == "EduNetworkBuilder.NetworkDevice")
|
||||
{
|
||||
NetworkDevice ndCLonedItem = (NetworkDevice)ClonedItem;
|
||||
if (!ndCLonedItem.CanAddNics) return;
|
||||
if(ndCLonedItem.GetNetType() == NetworkComponentType.firewall)
|
||||
{
|
||||
WhatToAdd.Add(NicType.eth);
|
||||
WhatToAdd.Add(NicType.tun);
|
||||
WhatToAdd.Add(NicType.vpn);
|
||||
}
|
||||
if (ndCLonedItem.GetNetType() == NetworkComponentType.net_hub || ndCLonedItem.GetNetType() == NetworkComponentType.net_switch)
|
||||
{
|
||||
WhatToAdd.Add(NicType.port);
|
||||
}
|
||||
if (ndCLonedItem.GetNetType() == NetworkComponentType.router )
|
||||
{
|
||||
WhatToAdd.Add(NicType.eth);
|
||||
}
|
||||
if (ndCLonedItem.GetNetType() == NetworkComponentType.pc && ndCLonedItem.CountNics(NicType.eth) < 1)
|
||||
{
|
||||
WhatToAdd.Add(NicType.eth);
|
||||
}
|
||||
if (WhatToAdd.Count == 1)
|
||||
{
|
||||
ndCLonedItem.AddNic(WhatToAdd[0]);
|
||||
}
|
||||
if(WhatToAdd.Count > 1)
|
||||
{
|
||||
//we need to choose a type:
|
||||
Form QuestionForm = new Form();
|
||||
QuestionForm.Text = "Network Card to Add";
|
||||
QuestionForm.Icon = Properties.Resources.NBIco;
|
||||
|
||||
Label lblText = new Label();
|
||||
lblText.Location = new Point(5, 5);
|
||||
lblText.Text = "Choose a type:";
|
||||
|
||||
ComboBox cbQuestions = new ComboBox();
|
||||
cbQuestions.Location = new Point(lblText.Location.X + lblText.Width + 5, lblText.Location.Y);
|
||||
cbQuestions.Width = 60;
|
||||
foreach(NicType nt in WhatToAdd)
|
||||
{
|
||||
cbQuestions.Items.Add(nt.ToString());
|
||||
}
|
||||
cbQuestions.SelectedIndex = 0;
|
||||
|
||||
QuestionForm.Width = cbQuestions.Location.X + cbQuestions.Width + 70;
|
||||
QuestionForm.Height = 90;
|
||||
QuestionForm.AutoSize = true;
|
||||
|
||||
Button btnAccept = new Button();
|
||||
btnAccept.Location = new Point(cbQuestions.Location.X, cbQuestions.Location.Y + cbQuestions.Height + 10);
|
||||
btnAccept.Text = "Add";
|
||||
btnAccept.Click += (s, g) => { Button b = (Button)s; Form f = (Form)b.Parent; f.Close(); };
|
||||
|
||||
QuestionForm.Controls.Add(lblText);
|
||||
QuestionForm.Controls.Add(cbQuestions);
|
||||
QuestionForm.Controls.Add(btnAccept);
|
||||
|
||||
QuestionForm.ShowDialog();
|
||||
if(cbQuestions.SelectedIndex >=0)
|
||||
{
|
||||
ndCLonedItem.AddNic(WhatToAdd[cbQuestions.SelectedIndex]);
|
||||
}
|
||||
}
|
||||
}
|
||||
UpdateForm();
|
||||
}
|
||||
|
||||
private void btnNicMinus_Click(object sender, EventArgs e)
|
||||
{
|
||||
//delete the specified nic
|
||||
if (ClonedItem.GetType().ToString() == "EduNetworkBuilder.NetworkDevice")
|
||||
{
|
||||
NetworkDevice ndCLonedItem = (NetworkDevice)ClonedItem;
|
||||
ndCLonedItem.DeleteNic(lbNics.SelectedIndex + 1); //Skip the loopback nic
|
||||
UpdateForm();
|
||||
}
|
||||
}
|
||||
|
||||
private void btnNicEdit_Click(object sender, EventArgs e)
|
||||
{
|
||||
//open a window to change the settings on the nic
|
||||
if (ClonedItem.GetType().ToString() == "EduNetworkBuilder.NetworkDevice")
|
||||
{
|
||||
NetworkDevice ndCLonedItem = (NetworkDevice)ClonedItem;
|
||||
ndCLonedItem.EditNic(lbNics.SelectedIndex +1); //Skip the loopback nic
|
||||
UpdateForm();
|
||||
}
|
||||
}
|
||||
|
||||
private void btnIfAdd_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (NB.GetComponentType(ClonedItem) == GeneralComponentType.device)
|
||||
{
|
||||
NetworkDevice ND = (NetworkDevice)ClonedItem;
|
||||
ND.AddNicInterface(lbNics.SelectedIndex + 1); //we do not show loopback
|
||||
}
|
||||
UpdateForm();
|
||||
}
|
||||
|
||||
private void btnIfMinus_Click(object sender, EventArgs e)
|
||||
{
|
||||
//if one is selected and there are more than one, delete it
|
||||
if(lbAddresses.SelectedIndex >= 0)
|
||||
{
|
||||
if (lbAddresses.Items.Count > 1)
|
||||
{
|
||||
//we can delete it
|
||||
if(NB.GetComponentType(ClonedItem) == GeneralComponentType.device)
|
||||
{
|
||||
NetworkDevice ND = (NetworkDevice)ClonedItem;
|
||||
ND.DeleteNicInterface(lbNics.SelectedIndex + 1, lbAddresses.SelectedIndex);
|
||||
}
|
||||
}
|
||||
else
|
||||
MessageBox.Show("You cannot delete the sole remaining interface.");
|
||||
}
|
||||
else
|
||||
MessageBox.Show("Please select an interface to delete.");
|
||||
UpdateForm();
|
||||
}
|
||||
|
||||
private void editInterface()
|
||||
{
|
||||
if (ClonedItem.GetType().ToString() == "EduNetworkBuilder.NetworkDevice")
|
||||
{
|
||||
NetworkDevice ndCLonedItem = (NetworkDevice)ClonedItem;
|
||||
if (lbAddresses.SelectedIndex >= 0 && lbNics.SelectedIndex >= 0)
|
||||
{
|
||||
string selectedNIC = lbNics.SelectedItem.ToString();
|
||||
selectedNIC = Regex.Replace(selectedNIC, " .*", "");
|
||||
selectedNIC = Regex.Replace(selectedNIC, "\\*", "");
|
||||
|
||||
ndCLonedItem.EditNicInterface(selectedNIC, lbAddresses.SelectedIndex);
|
||||
UpdateForm();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void btnIfEdit_Click(object sender, EventArgs e)
|
||||
{
|
||||
editInterface();
|
||||
}
|
||||
|
||||
private void btnCancel_Click(object sender, EventArgs e)
|
||||
{
|
||||
//we should prompt to save if we made changes
|
||||
Close();
|
||||
}
|
||||
|
||||
private void btnOK_Click(object sender, EventArgs e)
|
||||
{
|
||||
StoreInCloneFromForm();
|
||||
LoadFromClone(); //this saves the values in the object we passed it
|
||||
OriginalItem.IsDirty = true; //re-draw it
|
||||
Close();
|
||||
}
|
||||
|
||||
private void lbNics_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
UpdateForm();
|
||||
processing = false;
|
||||
}
|
||||
|
||||
private void lbAddresses_DoubleClick(object sender, EventArgs e)
|
||||
{
|
||||
if(lbAddresses.SelectedIndex >=0)
|
||||
{
|
||||
//We have one to edit
|
||||
editInterface();
|
||||
UpdateForm();
|
||||
}
|
||||
}
|
||||
|
||||
private void lbNics_DoubleClick(object sender, EventArgs e)
|
||||
{
|
||||
if (NB.GetComponentType(ClonedItem) == GeneralComponentType.device)
|
||||
{
|
||||
NetworkDevice nd = (NetworkDevice)ClonedItem;
|
||||
nd.EditNic(lbNics.SelectedIndex + 1); //skip the loopback device
|
||||
UpdateForm();
|
||||
}
|
||||
}
|
||||
|
||||
private void btnGateway_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (NB.GetComponentType(ClonedItem) == GeneralComponentType.device)
|
||||
{
|
||||
NetworkDevice nd = (NetworkDevice)ClonedItem;
|
||||
nd.EditGateway();
|
||||
UpdateForm();
|
||||
}
|
||||
}
|
||||
|
||||
private void btnRoutes_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (ClonedItem == null) return;
|
||||
if (NB.GetComponentType(ClonedItem) == GeneralComponentType.link) return;
|
||||
NetworkDevice tItem = (NetworkDevice)ClonedItem;
|
||||
ListBoxWindow lbwindow = new ListBoxWindow(tItem,LBContents.routes);
|
||||
lbwindow.ShowDialog();
|
||||
}
|
||||
|
||||
private void btnDHCP_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (ClonedItem == null) return;
|
||||
if (NB.GetComponentType(ClonedItem) == GeneralComponentType.link) return;
|
||||
NetworkDevice tItem = (NetworkDevice)ClonedItem;
|
||||
ListBoxWindow lbwindow = new ListBoxWindow(tItem, LBContents.dhcp);
|
||||
lbwindow.ShowDialog();
|
||||
}
|
||||
|
||||
|
||||
private void cbDHCP_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
if(NB.GetComponentType(ClonedItem) == GeneralComponentType.device)
|
||||
{
|
||||
NetworkDevice ndClonedItem = (NetworkDevice)ClonedItem;
|
||||
ndClonedItem.SetDHCPServer(cbDHCP.Checked);
|
||||
}
|
||||
UpdateForm();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
274
EduNetworkBuilder/IPAddress.cs
Normal file
274
EduNetworkBuilder/IPAddress.cs
Normal file
@ -0,0 +1,274 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Globalization;
|
||||
using System.Xml;
|
||||
using System.Windows.Forms;
|
||||
|
||||
|
||||
namespace EduNetworkBuilder
|
||||
{
|
||||
[Serializable]
|
||||
public class IPAddress
|
||||
{
|
||||
|
||||
private UInt32 _ip;
|
||||
private UInt32 _mask;
|
||||
private UInt32 _gw;
|
||||
private IPAddressType myType;
|
||||
|
||||
public IPAddress(string ip, string mask, IPAddressType WhatType)
|
||||
{
|
||||
myType = WhatType;
|
||||
_ip = ip.ParseIp();
|
||||
_mask = mask.ParseIp();
|
||||
}
|
||||
|
||||
public IPAddress(string ip, string mask, string gw)
|
||||
{
|
||||
myType = IPAddressType.route;
|
||||
_ip = ip.ParseIp();
|
||||
_mask = mask.ParseIp();
|
||||
_gw = gw.ParseIp();
|
||||
}
|
||||
|
||||
public IPAddress(XmlNode theNode)
|
||||
{
|
||||
foreach (XmlNode Individual in theNode.ChildNodes)
|
||||
{
|
||||
XmlNodeType myNodetype = Individual.NodeType;
|
||||
if (myNodetype == XmlNodeType.Element)
|
||||
{
|
||||
switch (Individual.Name.ToLower())
|
||||
{
|
||||
case "ip":
|
||||
_ip = Individual.InnerText.ParseIp();
|
||||
break;
|
||||
case "mask":
|
||||
_mask = Individual.InnerText.ParseIp();
|
||||
break;
|
||||
case "gateway":
|
||||
_gw = Individual.InnerText.ParseIp();
|
||||
break;
|
||||
case "type":
|
||||
myType = NB.ParseEnum<IPAddressType>(Individual.InnerText);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Save(XmlWriter writer, string tag)
|
||||
{
|
||||
writer.WriteStartElement(tag);
|
||||
writer.WriteElementString("ip", _ip.ToIpString());
|
||||
writer.WriteElementString("mask", _mask.ToIpString());
|
||||
writer.WriteElementString("gateway", _gw.ToIpString());
|
||||
writer.WriteElementString("type", myType.ToString());
|
||||
writer.WriteEndElement();
|
||||
}
|
||||
|
||||
public void Reparse(string ip, string mask, string gw)
|
||||
{
|
||||
_ip = ip.ParseIp();
|
||||
_mask = mask.ParseIp();
|
||||
_gw = gw.ParseIp();
|
||||
}
|
||||
public void Reparse(string ip, string mask)
|
||||
{
|
||||
_ip = ip.ParseIp();
|
||||
_mask = mask.ParseIp();
|
||||
}
|
||||
|
||||
public IPAddressType GetAddressType
|
||||
{
|
||||
get { return myType; }
|
||||
}
|
||||
|
||||
public bool IsLocal(IPAddress dest)
|
||||
{
|
||||
if (dest == null) return false;
|
||||
UInt32 answer = dest.GetIP & _mask;
|
||||
if ((dest.GetIP & _mask) == NetworkAddress)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool Edit(NetworkDevice FromWhat, string message="")
|
||||
{
|
||||
IPAddressEntry IPe = new IPAddressEntry(this, FromWhat);
|
||||
if (message != "")
|
||||
IPe.Text = message;
|
||||
return IPe.Edit();
|
||||
}
|
||||
|
||||
public bool Edit(NetworkDevice FromWhat, IPAddress DHCPif)
|
||||
{
|
||||
IPAddressEntry IPe = new IPAddressEntry(this, FromWhat);
|
||||
return IPe.Edit(FromWhat, DHCPif);
|
||||
}
|
||||
|
||||
public IPAddress(string ip)
|
||||
{
|
||||
myType = IPAddressType.ip;
|
||||
_ip = ip.ParseIp();
|
||||
var mySplitVal = ip.Split('/');
|
||||
if (mySplitVal.Count() < 2)
|
||||
{
|
||||
//We do not have a cidr. We need to guess
|
||||
//For now, use 255.255.255.0
|
||||
_mask = "255.255.255.0".ParseIp();
|
||||
mySplitVal = ip.Split('.');
|
||||
if(mySplitVal.Count() > 0)
|
||||
{
|
||||
//If it is not one of these three, we already use 255.255.255.0
|
||||
if(mySplitVal[0] == "10")
|
||||
{
|
||||
_mask = "255.0.0.0".ParseIp();
|
||||
}
|
||||
if (mySplitVal[0] == "172")
|
||||
{
|
||||
_mask = "255.255.0.0".ParseIp();
|
||||
}
|
||||
if (mySplitVal[0] == "192")
|
||||
{
|
||||
_mask = "255.255.255.0".ParseIp();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UInt32 tInt = 0;
|
||||
int cdr;
|
||||
int.TryParse(mySplitVal[1], out cdr);
|
||||
for (int loop = 0; loop < 32; loop++)
|
||||
{
|
||||
tInt = (tInt << 1);
|
||||
if (loop < cdr) tInt++;
|
||||
}
|
||||
_mask = tInt;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public bool Equals(UInt32 IP)
|
||||
{
|
||||
return IP == _ip;
|
||||
}
|
||||
|
||||
public bool Equals(UInt32 IP, UInt32 mask)
|
||||
{
|
||||
return (IP == _ip && mask == _mask);
|
||||
}
|
||||
|
||||
|
||||
public UInt32 NumberOfHosts
|
||||
{
|
||||
get { return ~_mask + 1; }
|
||||
}
|
||||
|
||||
public UInt32 GetIP
|
||||
{
|
||||
get { return _ip; }
|
||||
}
|
||||
public string GetIPString
|
||||
{
|
||||
get { return _ip.ToIpString(); }
|
||||
}
|
||||
public string GetBroadcastString
|
||||
{
|
||||
get { return BroadcastAddress.ToIpString(); }
|
||||
}
|
||||
public string GetMaskString
|
||||
{
|
||||
get { return _mask.ToIpString(); }
|
||||
}
|
||||
|
||||
public UInt32 GetMask
|
||||
{
|
||||
get { return _mask; }
|
||||
}
|
||||
public UInt32 GetGateway
|
||||
{
|
||||
get { return _gw; }
|
||||
}
|
||||
|
||||
public UInt32 NetworkAddress
|
||||
{
|
||||
get { return _ip & _mask; }
|
||||
}
|
||||
|
||||
public UInt32 BroadcastAddress
|
||||
{
|
||||
get { return NetworkAddress + ~_mask; }
|
||||
}
|
||||
|
||||
public IEnumerable<UInt32> Hosts()
|
||||
{
|
||||
for (var host = NetworkAddress + 1; host < BroadcastAddress; host++)
|
||||
{
|
||||
yield return host;
|
||||
}
|
||||
}
|
||||
public string IPFormat()
|
||||
{
|
||||
return IPFormat(_gw.ToIpString());
|
||||
}
|
||||
public string PadIt(string Addr)
|
||||
{
|
||||
string myaddr = Addr.PadRight(12);
|
||||
return myaddr;
|
||||
}
|
||||
public string IPFormat(string gw)
|
||||
{
|
||||
string tstring = "IP:" +PadIt(_ip.ToIpString())+
|
||||
" Mask:" + PadIt(_mask.ToIpString())+
|
||||
" GW:" + PadIt(gw);
|
||||
return tstring;
|
||||
}
|
||||
}
|
||||
|
||||
public static class IpHelpers
|
||||
{
|
||||
public static string ToIpString(this UInt32 value)
|
||||
{
|
||||
var bitmask = 0xff000000;
|
||||
var parts = new string[4];
|
||||
for (var i = 0; i < 4; i++)
|
||||
{
|
||||
var masked = (value & bitmask) >> ((3 - i) * 8);
|
||||
bitmask >>= 8;
|
||||
parts[i] = masked.ToString(CultureInfo.InvariantCulture);
|
||||
}
|
||||
return String.Join(".", parts);
|
||||
}
|
||||
|
||||
public static string ToBitString(this UInt32 value)
|
||||
{
|
||||
var item = System.Convert.ToString(value, 2);
|
||||
return (string)item;
|
||||
}
|
||||
|
||||
public static UInt32 ParseIp(this string ipAddress)
|
||||
{
|
||||
var gw = ipAddress.Split('/'); //Pull off any cdr
|
||||
var mySplitVal = gw[0].Split('.');
|
||||
if (mySplitVal.Count() != 4)
|
||||
return 0;
|
||||
UInt32 ip = 0;
|
||||
uint part;
|
||||
if (mySplitVal.Count() == 4)
|
||||
{
|
||||
for (var i = 0; i < 4; i++)
|
||||
{
|
||||
part = 0;
|
||||
UInt32.TryParse(mySplitVal[i], out part);
|
||||
ip = (ip << 8) + part;
|
||||
}
|
||||
}
|
||||
return ip;
|
||||
}
|
||||
}
|
||||
}
|
246
EduNetworkBuilder/IPAddressEntry.cs
Normal file
246
EduNetworkBuilder/IPAddressEntry.cs
Normal file
@ -0,0 +1,246 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using System.Globalization;
|
||||
using System.Resources;
|
||||
|
||||
|
||||
namespace EduNetworkBuilder
|
||||
{
|
||||
public partial class IPAddressEntry : Form
|
||||
{
|
||||
IPAddress WhatToEdit;
|
||||
IPAddress DHCPInterface=null;
|
||||
bool WellDone = true;
|
||||
NetworkDevice ParentDevice = null;
|
||||
|
||||
|
||||
public IPAddressEntry(IPAddress toEdit, NetworkDevice ToEdit)
|
||||
{
|
||||
InitializeComponent();
|
||||
LanguagifyComponents();
|
||||
ParentDevice = ToEdit;
|
||||
Network myNet = NB.GetNetwork();
|
||||
IPAddress lastIP = myNet.RetrieveLastIP();
|
||||
WhatToEdit = toEdit;
|
||||
string hostname = "";
|
||||
if (ToEdit != null)
|
||||
hostname = ToEdit.hostname;
|
||||
if (toEdit.GetIP.ToIpString() == NB.ZeroIPString)
|
||||
{
|
||||
string lIP = lastIP.GetIP.ToIpString();
|
||||
string lNM = lastIP.GetMask.ToIpString();
|
||||
string lGW = lastIP.GetGateway.ToIpString();
|
||||
switch (WhatToEdit.GetAddressType)
|
||||
{
|
||||
case IPAddressType.gw:
|
||||
lNM = NB.ZeroIPString;
|
||||
lGW = NB.ZeroIPString;
|
||||
break;
|
||||
case IPAddressType.ip:
|
||||
case IPAddressType.ip_only:
|
||||
if (!lNM.Contains("255"))
|
||||
lNM = "255.255.255.0";
|
||||
lGW = NB.ZeroIPString;
|
||||
break;
|
||||
case IPAddressType.route:
|
||||
break;
|
||||
}
|
||||
WhatToEdit.Reparse(lIP, lNM, lGW);
|
||||
}
|
||||
UpdateFieldsFromAddress();
|
||||
switch (WhatToEdit.GetAddressType)
|
||||
{
|
||||
case IPAddressType.gw:
|
||||
tbGateway.Enabled = false;
|
||||
tbGateway.Visible = false; //This just confuses people
|
||||
tbIPAddress.Enabled = true;
|
||||
tbNetmask.Enabled = false;
|
||||
break;
|
||||
case IPAddressType.ip:
|
||||
tbGateway.Enabled = false;
|
||||
tbIPAddress.Enabled = true;
|
||||
tbNetmask.Enabled = true;
|
||||
break;
|
||||
case IPAddressType.route:
|
||||
tbGateway.Enabled = true;
|
||||
tbIPAddress.Enabled = true;
|
||||
tbNetmask.Enabled = true;
|
||||
break;
|
||||
case IPAddressType.ip_only:
|
||||
tbGateway.Enabled = false;
|
||||
tbIPAddress.Enabled = true;
|
||||
tbNetmask.Enabled = false;
|
||||
break;
|
||||
}
|
||||
|
||||
//Disable anythingthatis locked
|
||||
switch (WhatToEdit.GetAddressType)
|
||||
{
|
||||
case IPAddressType.gw:
|
||||
if (myNet.ItemIsLocked(hostname, tbIPAddress.Text, NetTestType.LockGateway))
|
||||
{
|
||||
tbGateway.Enabled = false;
|
||||
tbIPAddress.Enabled = false;
|
||||
tbNetmask.Enabled = false;
|
||||
}
|
||||
break;
|
||||
case IPAddressType.ip:
|
||||
if (myNet.ItemIsLocked(hostname, tbIPAddress.Text, NetTestType.LockIP))
|
||||
{
|
||||
tbGateway.Enabled = false;
|
||||
tbIPAddress.Enabled = false;
|
||||
tbNetmask.Enabled = false;
|
||||
}
|
||||
break;
|
||||
case IPAddressType.route:
|
||||
if (myNet.ItemIsLocked(hostname, tbIPAddress.Text, NetTestType.LockRoute))
|
||||
{
|
||||
tbGateway.Enabled = false;
|
||||
tbIPAddress.Enabled = false;
|
||||
tbNetmask.Enabled = false;
|
||||
}
|
||||
break;
|
||||
case IPAddressType.ip_only:
|
||||
if (myNet.ItemIsLocked(hostname, tbIPAddress.Text, NetTestType.LockIP))
|
||||
{
|
||||
tbIPAddress.Enabled = false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void LanguagifyComponents()
|
||||
{
|
||||
ResourceManager RM = NB.GetResource();
|
||||
CultureInfo CI = NB.GetCulture();
|
||||
Text = NB.Translate("IPAE_lblIP");
|
||||
Text = NB.Translate("IPAE_lblNetmask");
|
||||
Text = NB.Translate("IPAE_lblGateway");
|
||||
Text = NB.Translate("IPAE_btnCancel");
|
||||
Text = NB.Translate("IPAE_btnOK");
|
||||
Text = NB.Translate("IPAE_Form");
|
||||
}
|
||||
|
||||
|
||||
private void UpdateFieldsFromAddress()
|
||||
{
|
||||
tbIPAddress.Text = WhatToEdit.GetIP.ToIpString();
|
||||
tbNetmask.Text = WhatToEdit.GetMask.ToIpString();
|
||||
tbGateway.Text = WhatToEdit.GetGateway.ToIpString();
|
||||
}
|
||||
|
||||
private void btnOK_Click(object sender, EventArgs e)
|
||||
{
|
||||
WhatToEdit.Reparse(tbIPAddress.Text, tbNetmask.Text, tbGateway.Text);
|
||||
Network myNet = NB.GetNetwork();
|
||||
myNet.StoreLastIP(WhatToEdit);
|
||||
Close();
|
||||
}
|
||||
|
||||
public bool Edit()
|
||||
{
|
||||
ShowDialog();
|
||||
return WellDone;
|
||||
}
|
||||
|
||||
public bool Edit(NetworkDevice ToEdit, IPAddress DHCPif)
|
||||
{
|
||||
DHCPInterface = DHCPif;
|
||||
lblIP.Text = "Interface";
|
||||
lblNetmask.Text = "Start";
|
||||
lblGateway.Text = "End";
|
||||
tbIPAddress.Enabled = false;
|
||||
tbGateway.Enabled = true;
|
||||
tbNetmask.Enabled = true;
|
||||
Network myNet = NB.GetNetwork();
|
||||
if (myNet.ItemIsLocked(ToEdit.hostname, tbIPAddress.Text, NetTestType.LockDHCP))
|
||||
{
|
||||
tbGateway.Enabled = false;
|
||||
tbIPAddress.Enabled = false;
|
||||
tbNetmask.Enabled = false;
|
||||
}
|
||||
ShowDialog();
|
||||
return WellDone;
|
||||
}
|
||||
|
||||
|
||||
private void btnCancel_Click(object sender, EventArgs e)
|
||||
{
|
||||
UpdateFieldsFromAddress();
|
||||
WellDone = false;
|
||||
Close();
|
||||
}
|
||||
|
||||
private void tbGateway_Validating(object sender, CancelEventArgs e)
|
||||
{
|
||||
Network mynet = NB.GetNetwork();
|
||||
if (ParentDevice != null)
|
||||
{
|
||||
IPAddress tAddress = mynet.DNSLookup(ParentDevice, tbGateway.Text);
|
||||
}
|
||||
|
||||
UInt32 taddress = tbGateway.Text.ParseIp();
|
||||
UInt32 startaddress = tbNetmask.Text.ParseIp();
|
||||
tbGateway.Text = taddress.ToIpString();
|
||||
if (DHCPInterface != null)
|
||||
{
|
||||
//We also check to verify that the address is in the correct range
|
||||
if (!DHCPInterface.IsLocal(new IPAddress(tbGateway.Text)))
|
||||
{
|
||||
e.Cancel = true;
|
||||
MessageBox.Show("The end IP in the range must be within the scope of the interface.");
|
||||
}
|
||||
if (taddress < startaddress)
|
||||
{
|
||||
e.Cancel = true;
|
||||
MessageBox.Show("The end IP must be equal to or larger than the start IP.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void tbNetmask_Validating(object sender, CancelEventArgs e)
|
||||
{
|
||||
UInt32 taddress = tbNetmask.Text.ParseIp();
|
||||
tbNetmask.Text = taddress.ToIpString();
|
||||
if (DHCPInterface != null)
|
||||
{
|
||||
//We also check to verify that the address is in the correct range
|
||||
if (!DHCPInterface.IsLocal(new IPAddress(tbNetmask.Text)))
|
||||
{
|
||||
e.Cancel = true;
|
||||
MessageBox.Show("The start IP in the range must be within the scope of the interface.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void tbIPAddress_Validating(object sender, CancelEventArgs e)
|
||||
{
|
||||
UInt32 taddress;
|
||||
Network mynet = NB.GetNetwork();
|
||||
IPAddress tIPAddress = null;
|
||||
if (ParentDevice != null)
|
||||
{
|
||||
tIPAddress = mynet.DNSLookup(ParentDevice, tbIPAddress.Text);
|
||||
}
|
||||
if(tIPAddress != null)
|
||||
{
|
||||
taddress = tIPAddress.GetIP;
|
||||
}
|
||||
else
|
||||
taddress = tbIPAddress.Text.ParseIp();
|
||||
tbIPAddress.Text = taddress.ToIpString();
|
||||
}
|
||||
|
||||
public void SetText(string text)
|
||||
{
|
||||
this.Text = text;
|
||||
}
|
||||
}
|
||||
}
|
@ -60,9 +60,9 @@ namespace EduNetworkBuilder
|
||||
{
|
||||
ResourceManager RM = NB.GetResource();
|
||||
CultureInfo CI = NB.GetCulture();
|
||||
Text = RM.GetString("LE_btnLink", CI);
|
||||
Text = RM.GetString("LE_btnCancel", CI);
|
||||
Text = RM.GetString("LE_Form", CI);
|
||||
Text = NB.Translate("LE_btnLink");
|
||||
Text = NB.Translate("LE_btnCancel");
|
||||
Text = NB.Translate("LE_Form");
|
||||
}
|
||||
|
||||
|
||||
|
442
EduNetworkBuilder/ListBoxWindow.cs
Normal file
442
EduNetworkBuilder/ListBoxWindow.cs
Normal file
@ -0,0 +1,442 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using System.Globalization;
|
||||
using System.Resources;
|
||||
|
||||
|
||||
namespace EduNetworkBuilder
|
||||
{
|
||||
public partial class ListBoxWindow : Form
|
||||
{
|
||||
protected LBContents MyMode = LBContents.messages;
|
||||
protected DebugLevel WhatToDisplay = DebugLevel.info; //used when viewing packet-messages
|
||||
NetworkDevice myNetDevice;
|
||||
PacketMessage myPacketMessage;
|
||||
int EditableCount = -1;
|
||||
bool processing = false;
|
||||
|
||||
/// <summary>
|
||||
/// Instantiate a ListBoxWindow for use in choosing a network to load
|
||||
/// </summary>
|
||||
public ListBoxWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
LanguagifyComponents();
|
||||
MyMode = LBContents.puzzles;
|
||||
|
||||
UpdateForm();
|
||||
CheckBox newCB;
|
||||
btnAdd.Visible = false;
|
||||
int count = 0;
|
||||
lblInstructions.Text = "Filter the puzzles by checking one the boxes.";
|
||||
panelCheckboxes.SuspendLayout();
|
||||
string SelectedTag = GetSelectedTag();
|
||||
if (SelectedTag == "ALL")
|
||||
Text = Text + "(All Solved)";
|
||||
foreach (string str in NB.GetPuzzleTags())
|
||||
{
|
||||
newCB = AddCheckBox(count, str);
|
||||
if (str == SelectedTag || (SelectedTag == "ALL" && Regex.IsMatch(str,"Level")))
|
||||
{
|
||||
newCB.Checked = true; //The first level with an unsolved puzzle starts checked
|
||||
}
|
||||
else
|
||||
{
|
||||
newCB.Checked = false;
|
||||
}
|
||||
count++;
|
||||
}
|
||||
panelCheckboxes.ResumeLayout();
|
||||
btnOK.Text = "Load";
|
||||
btnAdd.Text = "Cancel";
|
||||
btnAdd.Visible = true;
|
||||
cbLoadPuzzlesAtStart.Checked = Properties.Settings.Default.AutoStartPuzzles;
|
||||
UpdateForm();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// We are doing a routing table or dhcp. We pass it the device and pull the data from that
|
||||
/// </summary>
|
||||
/// <param name="MasterDevice">The master device to edit/view the routing table of</param>
|
||||
public ListBoxWindow(NetworkDevice MasterDevice, LBContents mode)
|
||||
{
|
||||
InitializeComponent();
|
||||
LanguagifyComponents();
|
||||
if (mode == LBContents.routes)
|
||||
{
|
||||
MyMode = LBContents.routes;
|
||||
myNetDevice = MasterDevice;
|
||||
lblInstructions.Text = "Double-click a route to change it.";
|
||||
lbWindowData.Font = new System.Drawing.Font("Courier New", 8);
|
||||
btnAdd.Visible = true;
|
||||
}
|
||||
if (mode == LBContents.dhcp)
|
||||
{
|
||||
MyMode = LBContents.dhcp;
|
||||
myNetDevice = MasterDevice;
|
||||
lblInstructions.Text = "Double-Click the interface to add/edit the range of DHCP to serve.";
|
||||
lbWindowData.Font = new System.Drawing.Font("Courier New", 8);
|
||||
btnAdd.Visible = false;
|
||||
}
|
||||
UpdateForm();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// We are doing a packet message detail look.
|
||||
/// </summary>
|
||||
/// <param name="Messages">The packet message to look at</param>
|
||||
public ListBoxWindow(PacketMessage Messages)
|
||||
{
|
||||
InitializeComponent();
|
||||
LanguagifyComponents();
|
||||
MyMode = LBContents.messages;
|
||||
myPacketMessage = Messages;
|
||||
UpdateForm();
|
||||
btnAdd.Visible = false;
|
||||
int count=0;
|
||||
lblInstructions.Text = "For greater detail, click on the check-boxes";
|
||||
panelCheckboxes.SuspendLayout();
|
||||
foreach (string str in Enum.GetNames(typeof(DebugLevel)))
|
||||
{
|
||||
AddCheckBox(count, str);
|
||||
count++;
|
||||
}
|
||||
panelCheckboxes.ResumeLayout();
|
||||
UpdateChecked();
|
||||
}
|
||||
|
||||
private void LanguagifyComponents()
|
||||
{
|
||||
ResourceManager RM = NB.GetResource();
|
||||
CultureInfo CI = NB.GetCulture();
|
||||
Text = NB.Translate("LBW_btnOK");
|
||||
Text = NB.Translate("LBW_lblInstructions");
|
||||
Text = NB.Translate("LBW_btnAdd");
|
||||
Text = NB.Translate("LBW_cbLoadPuzzlesAtStart");
|
||||
Text = NB.Translate("LBW_btnReset");
|
||||
Text = NB.Translate("LBW_Form");
|
||||
}
|
||||
|
||||
private CheckBox AddCheckBox(int count, string name)
|
||||
{
|
||||
int myY = 1;
|
||||
int myX = 1;
|
||||
int cdwidth = 70;
|
||||
int cdHeight = 20;
|
||||
int divisor = panelCheckboxes.Width / cdwidth;
|
||||
myX = (cdwidth * count) % (divisor * cdwidth);
|
||||
myY = ((cdwidth * count) / (divisor * cdwidth)) * cdHeight;
|
||||
CheckBox newCB = new CheckBox();
|
||||
newCB.Text = name;
|
||||
Point mylocation = new Point(myX, myY);
|
||||
newCB.AutoSize = true;
|
||||
newCB.Name = "checkBox" + count.ToString();
|
||||
newCB.Size = new System.Drawing.Size(98, 21);
|
||||
newCB.TabIndex = count;
|
||||
newCB.UseVisualStyleBackColor = true;
|
||||
newCB.Location = mylocation;
|
||||
newCB.CheckedChanged += genericCheckmarkChange;
|
||||
panelCheckboxes.Controls.Add(newCB);
|
||||
return newCB;
|
||||
}
|
||||
|
||||
private string GetSelectedTag()
|
||||
{
|
||||
if (Properties.Settings.Default.ScoreList == null)
|
||||
Properties.Settings.Default.ScoreList = new System.Collections.Specialized.StringCollection();
|
||||
PuzzleInfo PI;
|
||||
foreach (string str in NB.GetPuzzleNames())
|
||||
{
|
||||
if(!Properties.Settings.Default.ScoreList.Contains(str))
|
||||
{
|
||||
PI = NB.GetPuzzleInfoFromName(str);
|
||||
return "Level_" + PI.Level;
|
||||
}
|
||||
}
|
||||
return "ALL";
|
||||
}
|
||||
|
||||
private void UpdateForm()
|
||||
{
|
||||
int selectedIndex = lbWindowData.SelectedIndex;
|
||||
string selected = "";
|
||||
if (lbWindowData.SelectedIndex != -1)
|
||||
selected = lbWindowData.Items[lbWindowData.SelectedIndex].ToString();
|
||||
lbWindowData.Items.Clear();
|
||||
cbLoadPuzzlesAtStart.Visible = false;
|
||||
btnReset.Visible = false;
|
||||
List<string> itemstrings = new List<string>();
|
||||
if (MyMode == LBContents.messages)
|
||||
{
|
||||
itemstrings.AddRange(myPacketMessage.GetMessagesSummary());
|
||||
itemstrings.AddRange(myPacketMessage.GetMessagesLike(WhatToDisplay));
|
||||
foreach (string str in itemstrings)
|
||||
{
|
||||
lbWindowData.Items.Add(str);
|
||||
}
|
||||
}
|
||||
if(MyMode == LBContents.routes)
|
||||
{
|
||||
itemstrings.Add("--Static Routes (Read/Write)--");
|
||||
itemstrings.AddRange(myNetDevice.DeviceRouteStrings());
|
||||
EditableCount = itemstrings.Count();
|
||||
itemstrings.Add("--Routes from NICs (Read-Only)--");
|
||||
itemstrings.AddRange(myNetDevice.NICRouteStrings());
|
||||
foreach (string str in itemstrings)
|
||||
{
|
||||
lbWindowData.Items.Add(str);
|
||||
}
|
||||
}
|
||||
if (MyMode == LBContents.dhcp)
|
||||
{
|
||||
myNetDevice.CheckDHCPRangesAgainstInterfaces();
|
||||
itemstrings.AddRange(myNetDevice.DHCPStrings());
|
||||
foreach (string str in itemstrings)
|
||||
{
|
||||
lbWindowData.Items.Add(str);
|
||||
}
|
||||
}
|
||||
if (MyMode == LBContents.puzzles)
|
||||
{
|
||||
cbLoadPuzzlesAtStart.Visible = true;
|
||||
btnReset.Visible = true;
|
||||
PuzzleInfo pi;
|
||||
if (Properties.Settings.Default.ScoreList == null)
|
||||
Properties.Settings.Default.ScoreList = new System.Collections.Specialized.StringCollection();
|
||||
string shown_name;
|
||||
List<string> Puzzles = NB.GetPuzzleNames();
|
||||
if (Puzzles == null) return;
|
||||
foreach (string str in Puzzles)
|
||||
{
|
||||
pi = NB.GetPuzzleInfoFromName(str);
|
||||
shown_name = pi.PuzzleName;
|
||||
if (Properties.Settings.Default.ScoreList.Contains(str))
|
||||
shown_name = "* " + shown_name;
|
||||
foreach(string tag in pi.PuzzleTags)
|
||||
{
|
||||
if(isChecked(tag))
|
||||
{
|
||||
lbWindowData.Items.Add(shown_name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(selected != null && selected != "")
|
||||
{
|
||||
if (lbWindowData.Items.Contains(selected))
|
||||
lbWindowData.SelectedItem = selected;
|
||||
}
|
||||
if(lbWindowData.SelectedIndex != -1)
|
||||
{
|
||||
btnOK.Enabled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
btnOK.Enabled = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void btnOK_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (MyMode == LBContents.puzzles && lbWindowData.SelectedItem != null)
|
||||
{
|
||||
string TheName = lbWindowData.SelectedItem.ToString();
|
||||
TheName = Regex.Replace(TheName, @"^\* ", "");
|
||||
Visible = false;
|
||||
BuilderWindow myWin = (BuilderWindow)Application.OpenForms["BuilderWindow"];
|
||||
if (myWin == null)
|
||||
{
|
||||
myWin.Activate();
|
||||
}
|
||||
if(Properties.Settings.Default.AutoStartPuzzles != cbLoadPuzzlesAtStart.Checked)
|
||||
{
|
||||
Properties.Settings.Default.AutoStartPuzzles = cbLoadPuzzlesAtStart.Checked;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
if (lbWindowData.SelectedItem != null)
|
||||
NB.LoadNetworkFromResource(TheName);
|
||||
}
|
||||
Close();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The checkmark was changed. Tally up everything
|
||||
/// </summary>
|
||||
/// <param name="sender">The checkmark that changed</param>
|
||||
/// <param name="e"></param>
|
||||
private void genericCheckmarkChange(object sender, EventArgs e)
|
||||
{
|
||||
if (processing) return;
|
||||
CheckBox mybox = (CheckBox)sender;
|
||||
if (MyMode == LBContents.messages)
|
||||
{
|
||||
if (mybox.Checked)
|
||||
{
|
||||
WhatToDisplay = WhatToDisplay | NB.ParseEnum<DebugLevel>(mybox.Text);
|
||||
}
|
||||
else
|
||||
{
|
||||
WhatToDisplay = WhatToDisplay ^ NB.ParseEnum<DebugLevel>(mybox.Text);
|
||||
}
|
||||
}
|
||||
UpdateChecked();
|
||||
}
|
||||
|
||||
private bool isChecked(string Name)
|
||||
{
|
||||
foreach (Control mycontrol in panelCheckboxes.Controls)
|
||||
{
|
||||
//pull out the name
|
||||
CheckBox cb = (CheckBox)mycontrol;
|
||||
//make an enum. See if that is set. If so, mark it as checked
|
||||
if(cb.Text.ToLower() == Name.ToLower())
|
||||
{
|
||||
return cb.Checked;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void UpdateChecked()
|
||||
{
|
||||
processing = true;
|
||||
DebugLevel toFind;
|
||||
if (MyMode == LBContents.messages)
|
||||
{
|
||||
foreach (Control mycontrol in panelCheckboxes.Controls)
|
||||
{
|
||||
//pull out the name
|
||||
CheckBox cb = (CheckBox)mycontrol;
|
||||
//make an enum. See if that is set. If so, mark it as checked
|
||||
toFind = NB.ParseEnum<DebugLevel>(mycontrol.Text);
|
||||
if ((toFind & WhatToDisplay) == toFind)
|
||||
{
|
||||
cb.Checked = true;
|
||||
}
|
||||
else //If not, mark it as not checked.
|
||||
{
|
||||
cb.Checked = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
processing=false;
|
||||
UpdateForm();
|
||||
}
|
||||
|
||||
private void btnAdd_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (MyMode == LBContents.routes)
|
||||
{
|
||||
AddRoute();
|
||||
}
|
||||
if(MyMode == LBContents.puzzles)
|
||||
{
|
||||
if (Properties.Settings.Default.AutoStartPuzzles != cbLoadPuzzlesAtStart.Checked)
|
||||
{
|
||||
Properties.Settings.Default.AutoStartPuzzles = cbLoadPuzzlesAtStart.Checked;
|
||||
Properties.Settings.Default.Save();
|
||||
}
|
||||
Close();
|
||||
}
|
||||
}
|
||||
private void AddRoute()
|
||||
{
|
||||
IPAddress newip = new IPAddress(NB.ZeroIPString, NB.ZeroIPString, NB.ZeroIPString);
|
||||
newip.Edit(myNetDevice,"Create Route");
|
||||
myNetDevice.AddRoute(newip);
|
||||
UpdateForm();
|
||||
}
|
||||
|
||||
private void lbWindowData_DoubleClick(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
if (MyMode == LBContents.routes)
|
||||
{
|
||||
if (lbWindowData.SelectedIndex >= EditableCount) return;
|
||||
if (lbWindowData.SelectedIndex < 1) return;
|
||||
//we always subtract 1 since we have added one line of comment to the list
|
||||
myNetDevice.EditRoute(lbWindowData.SelectedIndex - 1);
|
||||
}
|
||||
if(MyMode == LBContents.dhcp)
|
||||
{
|
||||
//We always add one since we are skipping the loopback device
|
||||
myNetDevice.EditDHCP(lbWindowData.SelectedIndex + 1);
|
||||
}
|
||||
if (MyMode == LBContents.puzzles)
|
||||
{
|
||||
//Just like pressing the OK button. We load the map
|
||||
btnOK_Click(sender, e);
|
||||
}
|
||||
UpdateForm();
|
||||
}
|
||||
private void lbWindowData_Edit_Click(object sender, EventArgs e)
|
||||
{
|
||||
lbWindowData_DoubleClick(sender, e);
|
||||
}
|
||||
private void lbWindowData_Delete_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (MyMode == LBContents.routes)
|
||||
{
|
||||
if (lbWindowData.SelectedIndex >= EditableCount) return;
|
||||
if (lbWindowData.SelectedIndex < 1) return;
|
||||
//we always subtract 1 since we have added one line of comment to the list
|
||||
myNetDevice.DeleteRoute(lbWindowData.SelectedIndex - 1);
|
||||
}
|
||||
UpdateForm();
|
||||
}
|
||||
private void lbWindowData_RightMouseUp(object sender, MouseEventArgs e)
|
||||
{
|
||||
int index=0;
|
||||
if(MyMode == LBContents.routes)
|
||||
{
|
||||
if (lbWindowData.ContextMenuStrip == null)
|
||||
{
|
||||
lbWindowData.ContextMenuStrip = new ContextMenuStrip();
|
||||
}
|
||||
lbWindowData.ContextMenuStrip.Items.Clear();
|
||||
lbWindowData.ContextMenuStrip.Items.Add("Edit");
|
||||
lbWindowData.ContextMenuStrip.Items[index++].Click += lbWindowData_Edit_Click;
|
||||
lbWindowData.ContextMenuStrip.Items.Add("Delete");
|
||||
lbWindowData.ContextMenuStrip.Items[index++].Click += lbWindowData_Delete_Click;
|
||||
}
|
||||
}
|
||||
private void lbWindowData_MouseUp(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (e.Button == System.Windows.Forms.MouseButtons.Right)
|
||||
{
|
||||
lbWindowData_RightMouseUp(sender, e);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(MyMode == LBContents.puzzles)
|
||||
{
|
||||
UpdateForm();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void btnReset_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (Properties.Settings.Default.ScoreList == null)
|
||||
Properties.Settings.Default.ScoreList = new System.Collections.Specialized.StringCollection();
|
||||
DialogResult answer = MessageBox.Show("Are sure you want to forget what puzzles you have done?", "Forget Puzzles?", MessageBoxButtons.YesNo);
|
||||
if (answer == System.Windows.Forms.DialogResult.Yes)
|
||||
{
|
||||
Properties.Settings.Default.ScoreList.Clear();
|
||||
Properties.Settings.Default.Save();
|
||||
UpdateForm();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
570
EduNetworkBuilder/NB.cs
Normal file
570
EduNetworkBuilder/NB.cs
Normal file
@ -0,0 +1,570 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Deployment.Application;
|
||||
using System.Windows.Forms;
|
||||
using System.Globalization;
|
||||
using System.Resources;
|
||||
using System.Xml;
|
||||
using System.Drawing;
|
||||
using System.Media;
|
||||
using System.Reflection;
|
||||
|
||||
|
||||
namespace EduNetworkBuilder
|
||||
{
|
||||
public enum PacketStatus {
|
||||
processing, //It is inside a device. It needs to be routed, masqueraded, or whatever
|
||||
input, //It is hitting the interface/nic of a device.
|
||||
output, //It is leaving a device. Make sure the mac address is what it should be & that we are going out the right link
|
||||
waiting_for_arp, //It is in the output chain, has been procesed, but is waiting for an arp packet to give it the dest MAC
|
||||
moving, //It is traveling along a link. We increment the distance it has gone and re-draw the packet.
|
||||
encapsulated, //It has been put inside another packet.
|
||||
finished_ok,//The packet has finished and is ready to be removed from the network
|
||||
finished_failed, //The packet is finished (failed) and is ready to be removed from the network.
|
||||
finished //There was an appropriate reason this packet finished. It stopped
|
||||
}
|
||||
public enum LinkType { normal, wireless, broken }
|
||||
public enum PacketType { none, ping_request, ping_answer, arp_request, arp_answer, dhcp_request, dhcp_answer, vpn_packet, tun_packet }
|
||||
public enum ResponseToPacket { none, accept, masq, drop, reject }
|
||||
public enum DebugLevel { none=0, info=1, routing=2, switching=4, natting=8, filtering=16, debug=32 , packet=64, all=127}
|
||||
public enum NetworkComponentType { none, router, net_switch, net_hub, laptop, pc, server, wap ,
|
||||
wrouter, wbridge, wrepeater, link, firewall, ip_phone, printer, copier }
|
||||
public enum NicType { none, lo, eth, wlan, wan, vpn, tun, management_interface, port, wport }
|
||||
public enum IPAddressType { ip, gw, route, ip_only }
|
||||
public enum nb_direction { none, to_src, to_dst }
|
||||
public enum GeneralComponentType { none, link, device }
|
||||
public enum NBSoundType { none, success }
|
||||
public enum RTFWindowContents { help, about, release_notes }
|
||||
public enum NetTestType { NeedsLocalIPTo, NeedsDefaultGW, NeedsLinkToDevice, NeedsRouteToNet,
|
||||
SuccessfullyPings, SuccessfullyArps, SuccessfullyDHCPs, HelpRequest, FailedPing,
|
||||
LockAll, LockIP, LockRoute, LockNic, LockDHCP, LockGateway
|
||||
}
|
||||
public enum NetTestVerbosity { none, basic, hints, full }
|
||||
public enum LBContents { routes, messages, dhcp, puzzles }
|
||||
public enum HelpTopics {
|
||||
DHCP, DHCPServer, Firewall, Gateway, Help, IPAddress, Link, Subnet, Ping,
|
||||
VPN, Hub, Switch, ARP, StaticRoute, Subnetting, WhenToSubnet, ComparingAddresses, MACAddress,
|
||||
Network, Packet, NIC, Interface
|
||||
}
|
||||
public enum PuzzleNames
|
||||
{
|
||||
Level0_IP, Level1_NoGateway, Level0_NeedsLink, Level0_NoSwitch, Level1_BadDHCP, Level1_BadGateway,
|
||||
Level0_SimpleDHCP, Level1_BadIP, Level0_Help, Level0_Ping, Level0_HubVsSwitch, Level1_MixedNetwork,
|
||||
Level1_MidDHCP, Level1_OneNetTwoSubnets, Level1_DuplicateIPs, Level0_NetworkLoop, Level1_DuplicateMAC,
|
||||
Level2_FirewallDemo, Level1_OneNetTwoSubnets2, Level2_VPN_Demo, Level2_Bad_VPN_IP, Level2_Bad_Encryption,
|
||||
Level2_Bad_Route, Level2_Blast_From_Past, Level2_Not_Working, Level2_Build_A_VPN, Level2_Connect_The_Dots,
|
||||
Level3_BlackHole, Level3_Busted, Level3_Middle_Man_Out, Level3_PhoneyNetwork, Level3_VPNify, Level3_EncryptionTroubles,
|
||||
Level3_NowhereToGo, Level3_GrandCentralStation, Level3_Dead, Level0_NetworkLoop2, Level0_BrokenLink,
|
||||
Level4_DualWans, Level4_SinglesLife, Level4_SmallSubnets, Level4_OneRoute, Level4_RouterReplacement,
|
||||
Level4_InternalSubnetting, Level4_Internalhemorrhage,
|
||||
}
|
||||
public enum DebugPausePoint { none=0, packet_create=1, packet_kill=2,
|
||||
packet_in=4, packet_out=8, packet_duplicate=16, all=63,
|
||||
dump=256, pause=512}
|
||||
|
||||
|
||||
[Serializable]
|
||||
public struct HostNicID //This holds a unique identifier for a network card. Links use this to know what it is connected to
|
||||
{
|
||||
public int HostID;
|
||||
public int NicID;
|
||||
public string HostName;
|
||||
public string NicName;
|
||||
public HostNicID(int host, int nic, string hostname, string nicname)
|
||||
{
|
||||
HostID = host;
|
||||
NicID = nic;
|
||||
HostName = hostname;
|
||||
NicName = nicname;
|
||||
}
|
||||
public HostNicID(XmlNode theNode)
|
||||
{
|
||||
HostID = 0;
|
||||
NicID = 0;
|
||||
HostName = "";
|
||||
NicName = "";
|
||||
foreach (XmlNode Individual in theNode.ChildNodes)
|
||||
{
|
||||
XmlNodeType myNodetype = Individual.NodeType;
|
||||
if (myNodetype == XmlNodeType.Element)
|
||||
{
|
||||
switch (Individual.Name.ToLower())
|
||||
{
|
||||
case "hostid":
|
||||
int.TryParse(Individual.InnerText, out HostID);
|
||||
break;
|
||||
case "nicid":
|
||||
int.TryParse(Individual.InnerText, out NicID);
|
||||
break;
|
||||
case "hostname":
|
||||
HostName = Individual.InnerText;
|
||||
break;
|
||||
case "nicname":
|
||||
NicName = Individual.InnerText;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public void Save(XmlWriter writer, string tag)
|
||||
{
|
||||
writer.WriteStartElement(tag);
|
||||
writer.WriteElementString("hostid", HostID.ToString());
|
||||
writer.WriteElementString("nicid", NicID.ToString());
|
||||
writer.WriteElementString("hostname", HostName);
|
||||
writer.WriteElementString("nicname", NicName);
|
||||
writer.WriteEndElement();
|
||||
}
|
||||
public string HostNicIDString
|
||||
{
|
||||
get { return HostID.ToString()+"-"+NicID.ToString(); }
|
||||
}
|
||||
public bool Equals(HostNicID toCheck)
|
||||
{
|
||||
if (HostID != toCheck.HostID) return false;
|
||||
if (NicID != toCheck.NicID) return false;
|
||||
if (HostName != toCheck.HostName) return false;
|
||||
if (NicName != toCheck.NicName) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public struct IPConnectionEntry
|
||||
{
|
||||
public IPAddress destIP; //where we are sending the packet to. We expect a response to come from here
|
||||
public PacketType What; //ping, dhcp, etc
|
||||
public ResponseToPacket Response; //accept, masq
|
||||
public IPAddress internalIP; //Used if we are masquerading
|
||||
public IPConnectionEntry(IPAddress dest, PacketType what, ResponseToPacket response)
|
||||
{
|
||||
destIP = dest;
|
||||
What = what;
|
||||
Response = response;
|
||||
internalIP = null;
|
||||
}
|
||||
public IPConnectionEntry(IPAddress dest, PacketType what, ResponseToPacket response, IPAddress internal_ip)
|
||||
{
|
||||
destIP = dest;
|
||||
What = what;
|
||||
Response = response;
|
||||
internalIP = internal_ip;
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public struct ArpEntry
|
||||
{
|
||||
public string MACAddress;
|
||||
public string IPAddr;
|
||||
public HostNicID NicOnWhichItIsFound;
|
||||
public ArpEntry(string mac, string ip, HostNicID thenic)
|
||||
{
|
||||
MACAddress = mac;
|
||||
IPAddr = ip;
|
||||
NicOnWhichItIsFound = thenic;
|
||||
}
|
||||
}
|
||||
|
||||
public class PuzzleInfo
|
||||
{
|
||||
public string PuzzleName;
|
||||
public string PuzzleTitle;
|
||||
public string PuzzleDescription;
|
||||
public List<string> PuzzleTags = new List<string>();
|
||||
public int Level=0;
|
||||
public double SortOrder=0;
|
||||
public void Load(XmlNode TheNode, string Name)
|
||||
{
|
||||
PuzzleName = Name;
|
||||
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);
|
||||
break;
|
||||
case "message":
|
||||
PuzzleDescription = Individual.InnerText;
|
||||
break;
|
||||
case "title":
|
||||
PuzzleTitle = Individual.InnerText;
|
||||
break;
|
||||
case "tag":
|
||||
PuzzleTags.Add(Individual.InnerText);
|
||||
break;
|
||||
case "level":
|
||||
PuzzleTags.Add("Level_" + Individual.InnerText);
|
||||
int.TryParse(Individual.InnerText, out Level);
|
||||
break;
|
||||
case "sortorder":
|
||||
double.TryParse(Individual.InnerText, out SortOrder);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class NB
|
||||
{
|
||||
|
||||
public static string BroadcastMACString = "FF:FF:FF:FF:FF:FF"; //The broadcast MAC address
|
||||
public static string BroadcastIPString = "255.255.255.255"; //the generic broadcast IP address
|
||||
public static string ZeroIPString = "0.0.0.0";
|
||||
public static string LoopbackIPString = "127.0.0.1";
|
||||
public static int LinkStep = 8;//The percentage of the link we move at each "tick"
|
||||
public static int PacketPixelSize = 8; //The size of the packet pixel
|
||||
public static int PacketVersionNum = 2; //2 uses the new stuff. Anything else uses the old stuff
|
||||
public const int GridSize = 10;
|
||||
public static string[,] LanguageChoices = { { "English", "en" }, { "French", "fr" } };
|
||||
|
||||
/// <summary>
|
||||
/// Find the global random number generator.
|
||||
/// </summary>
|
||||
/// <returns>A valid random number generator</returns>
|
||||
public static Random GetRandom()
|
||||
{
|
||||
BuilderWindow myWin = (BuilderWindow)Application.OpenForms["BuilderWindow"];
|
||||
if (myWin == null) return new Random();
|
||||
if (myWin.GameRandomGen == null) return new Random();
|
||||
return myWin.GameRandomGen;
|
||||
}
|
||||
/// <summary>
|
||||
/// Find the global random number generator.
|
||||
/// </summary>
|
||||
/// <returns>A valid random number generator</returns>
|
||||
public static CultureInfo GetCulture()
|
||||
{
|
||||
BuilderWindow myWin = (BuilderWindow)Application.OpenForms["BuilderWindow"];
|
||||
CultureInfo CI=null;
|
||||
if (myWin != null)
|
||||
{
|
||||
CI = myWin.GetCulture();
|
||||
}
|
||||
if(CI == null || myWin == null)
|
||||
{
|
||||
string CL = Properties.Settings.Default.ChosenLanguage;
|
||||
CI = CultureInfo.CreateSpecificCulture(CL);
|
||||
}
|
||||
return CI;
|
||||
}
|
||||
/// <summary>
|
||||
/// Find the global random number generator.
|
||||
/// </summary>
|
||||
/// <returns>A valid random number generator</returns>
|
||||
public static ResourceManager GetResource()
|
||||
{
|
||||
ResourceManager myresource = null;
|
||||
BuilderWindow myWin = (BuilderWindow)Application.OpenForms["BuilderWindow"];
|
||||
if (myWin != null)
|
||||
{
|
||||
myresource = myWin.GetResource();
|
||||
}
|
||||
if(myresource == null || myWin == null)
|
||||
{
|
||||
System.Reflection.Assembly MyAssembly;
|
||||
MyAssembly = Assembly.GetCallingAssembly();
|
||||
myresource = new ResourceManager("EduNetworkBuilder.Resources.languages.edustrings", MyAssembly);
|
||||
}
|
||||
return myresource;
|
||||
}
|
||||
|
||||
public static Point GetSnapped(Point Location)
|
||||
{
|
||||
int x = (Location.X / NB.GridSize) * NB.GridSize;
|
||||
int y = (Location.Y / NB.GridSize) * NB.GridSize;
|
||||
Point newlocation = new Point(x, y);
|
||||
return newlocation;
|
||||
}
|
||||
|
||||
public static Network GetNetwork()
|
||||
{
|
||||
BuilderWindow myWin = (BuilderWindow)Application.OpenForms["BuilderWindow"];
|
||||
if (myWin == null) return null;
|
||||
if (myWin.GameRandomGen == null) return null;
|
||||
return myWin.myNetwork;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Return a translated string in the current chosen language
|
||||
/// </summary>
|
||||
/// <param name="key">The key for the item we are translating</param>
|
||||
/// <returns>A string of the translated information</returns>
|
||||
public static string Translate(string key)
|
||||
{
|
||||
BuilderWindow myWin = (BuilderWindow)Application.OpenForms["BuilderWindow"];
|
||||
if (myWin == null)
|
||||
{
|
||||
ResourceManager RM = GetResource();
|
||||
CultureInfo CI = GetCulture();
|
||||
string answer;
|
||||
answer = RM.GetString(key, CI);
|
||||
return answer;
|
||||
}
|
||||
return myWin.Translate(key);
|
||||
}
|
||||
|
||||
public static DebugPausePoint GetDebugPauseSetting()
|
||||
{
|
||||
BuilderWindow myWin = (BuilderWindow)Application.OpenForms["BuilderWindow"];
|
||||
if (myWin == null) return DebugPausePoint.none;
|
||||
if (myWin.GameRandomGen == null) return DebugPausePoint.none;
|
||||
return myWin.DebugSetting;
|
||||
}
|
||||
|
||||
public static PuzzleInfo GetPuzzleInfoFromName(string PuzzleName)
|
||||
{
|
||||
BuilderWindow myWin = (BuilderWindow)Application.OpenForms["BuilderWindow"];
|
||||
if (myWin == null) return null;
|
||||
return myWin.PuzzleInfoFromName(PuzzleName);
|
||||
}
|
||||
public static void ChangeLanguage()
|
||||
{
|
||||
//Find the window. If it exists, use /set the language setting there. If not, use / set the default.
|
||||
BuilderWindow myWin = (BuilderWindow)Application.OpenForms["BuilderWindow"];
|
||||
string lang = Properties.Settings.Default.ChosenLanguage;
|
||||
if (lang == "") lang = "en";
|
||||
|
||||
string StartingItem = "";
|
||||
for (int i = 0; i < LanguageChoices.GetLength(0); i++)
|
||||
{
|
||||
if (lang == LanguageChoices[i, 1])
|
||||
{
|
||||
StartingItem = LanguageChoices[i, 0];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//we need to choose a language:
|
||||
Form LanguageForm = new Form();
|
||||
LanguageForm.Text = "Choose Language";
|
||||
Label lblText = new Label();
|
||||
lblText.Location = new Point(5, 5);
|
||||
lblText.AutoSize = true;
|
||||
lblText.Text = "Choose a Language:";
|
||||
LanguageForm.Icon = Properties.Resources.NBIco;
|
||||
|
||||
ComboBox cbQuestions = new ComboBox();
|
||||
cbQuestions.Location = new Point(lblText.Location.X + lblText.Width + 10, lblText.Location.Y);
|
||||
cbQuestions.Width = 60;
|
||||
for (int i = 0; i < LanguageChoices.GetLength(0); i++ )
|
||||
{
|
||||
cbQuestions.Items.Add(LanguageChoices[i,0]);
|
||||
}
|
||||
if(cbQuestions.Items.Contains(StartingItem))
|
||||
{
|
||||
cbQuestions.SelectedItem = StartingItem;
|
||||
}
|
||||
else
|
||||
cbQuestions.SelectedIndex = 0;
|
||||
|
||||
LanguageForm.Width = cbQuestions.Location.X + cbQuestions.Width + 70;
|
||||
LanguageForm.Height = 90;
|
||||
LanguageForm.AutoSize = true;
|
||||
|
||||
Button btnAccept = new Button();
|
||||
btnAccept.Location = new Point(cbQuestions.Location.X, cbQuestions.Location.Y + cbQuestions.Height + 10);
|
||||
btnAccept.Text = "OK";
|
||||
btnAccept.Click += (s, g) => { Button b = (Button)s; Form f = (Form)b.Parent; f.Close(); };
|
||||
|
||||
LanguageForm.Controls.Add(lblText);
|
||||
LanguageForm.Controls.Add(cbQuestions);
|
||||
LanguageForm.Controls.Add(btnAccept);
|
||||
|
||||
LanguageForm.ShowDialog();
|
||||
if (cbQuestions.SelectedIndex >= 0)
|
||||
{
|
||||
Properties.Settings.Default.LanguageHasBeenChosen = true;
|
||||
string mychoice = LanguageChoices[cbQuestions.SelectedIndex, 1];
|
||||
if (myWin == null)
|
||||
{
|
||||
Properties.Settings.Default.ChosenLanguage = mychoice;
|
||||
//Properties.Settings.Default.Save(); //We do this when we exit. No need to save it right this instant.
|
||||
}
|
||||
else
|
||||
{
|
||||
myWin.ChosenLanguage = mychoice;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void PlaySound(NBSoundType What)
|
||||
{
|
||||
SoundPlayer sndClick;
|
||||
switch (What)
|
||||
{
|
||||
case NBSoundType.none:
|
||||
break;
|
||||
case NBSoundType.success:
|
||||
sndClick = new SoundPlayer(Properties.Resources.wavBellDing);
|
||||
sndClick.Play();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public static List<string> GetPuzzleTags()
|
||||
{
|
||||
BuilderWindow myWin = (BuilderWindow)Application.OpenForms["BuilderWindow"];
|
||||
if (myWin == null) return null;
|
||||
return myWin.GetPuzzleTags();
|
||||
}
|
||||
|
||||
public static List<string> GetPuzzleNames()
|
||||
{
|
||||
BuilderWindow myWin = (BuilderWindow)Application.OpenForms["BuilderWindow"];
|
||||
if (myWin == null) return null;
|
||||
return myWin.GetPuzzleNames();
|
||||
}
|
||||
|
||||
public static void LoadNetworkFromResource(string resource)
|
||||
{
|
||||
BuilderWindow myWin = (BuilderWindow)Application.OpenForms["BuilderWindow"];
|
||||
if (myWin == null) return;
|
||||
myWin.LoadNetworkFromResource(resource);
|
||||
}
|
||||
|
||||
public static void SetProgress(double HowFar, double total)
|
||||
{
|
||||
BuilderWindow myWin = (BuilderWindow)Application.OpenForms["BuilderWindow"];
|
||||
if (myWin == null) return;
|
||||
myWin.SetProgress(HowFar, total);
|
||||
}
|
||||
|
||||
public static int GetUniqueIdentifier()
|
||||
{
|
||||
Network myNet = GetNetwork();
|
||||
if(myNet == null)
|
||||
{
|
||||
//We should never get here. If so, we are in a bad sort of way.
|
||||
Random rnd = GetRandom();
|
||||
return rnd.Next(1,100);
|
||||
}
|
||||
return myNet.GetUniqueIdentifier();
|
||||
}
|
||||
|
||||
public static void Delay(int amount)
|
||||
{
|
||||
System.Threading.Thread.Sleep(amount);
|
||||
}
|
||||
|
||||
public static T ParseEnum<T>(string value)
|
||||
{
|
||||
return (T)Enum.Parse(typeof(T), value, true);
|
||||
}
|
||||
|
||||
public static GeneralComponentType GetComponentType(NetworkComponent What)
|
||||
{
|
||||
GeneralComponentType theType = GeneralComponentType.none;
|
||||
if(What.GetType().ToString() == "EduNetworkBuilder.NetworkDevice")
|
||||
theType = GeneralComponentType.device;
|
||||
if (What.GetType().ToString() == "EduNetworkBuilder.NetworkLink")
|
||||
theType = GeneralComponentType.link;
|
||||
return theType;
|
||||
}
|
||||
|
||||
public static string GenerateMACAddress()
|
||||
{
|
||||
var sBuilder = new StringBuilder();
|
||||
var random = GetRandom();
|
||||
int number;
|
||||
byte b;
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
number = random.Next(0, 255);
|
||||
b = Convert.ToByte(number);
|
||||
if (i == 0)
|
||||
{
|
||||
b = setBit(b, 6); //--> set locally administered
|
||||
b = unsetBit(b, 7); // --> set unicast
|
||||
}
|
||||
sBuilder.Append(number.ToString("X2"));
|
||||
}
|
||||
string mac= sBuilder.ToString().ToUpper();
|
||||
if (MAC_Exists(mac))
|
||||
return GenerateMACAddress(); //If it already exists, generate another
|
||||
return mac;
|
||||
}
|
||||
|
||||
public static bool MAC_Exists(string MAC)
|
||||
{
|
||||
Network myNet = GetNetwork();
|
||||
if(myNet == null) return false;
|
||||
return myNet.MAC_Exists(MAC);
|
||||
}
|
||||
|
||||
public static List<string> arp(UInt32 IP)
|
||||
{
|
||||
List<string> arps = new List<string>();
|
||||
Network myNet = GetNetwork();
|
||||
if (myNet == null) return arps;
|
||||
return myNet.arp(IP);
|
||||
}
|
||||
|
||||
private static byte setBit(byte b, int BitNumber)
|
||||
{
|
||||
if (BitNumber < 8 && BitNumber > -1)
|
||||
{
|
||||
return (byte)(b | (byte)(0x01 << BitNumber));
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"Invalid Bit " + BitNumber.ToString() + "! (Should be from 0 to 7)");
|
||||
}
|
||||
}
|
||||
|
||||
private static byte unsetBit(byte b, int BitNumber)
|
||||
{
|
||||
if (BitNumber < 8 && BitNumber > -1)
|
||||
{
|
||||
return (byte)(b | (byte)(0x00 << BitNumber));
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"Invalid Bit" + BitNumber.ToString() + "! (Should be from 0 to 7)");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Randomize a list
|
||||
/// </summary>
|
||||
/// <typeparam name="T">The type of list to return</typeparam>
|
||||
/// <param name="list">The list to randomize</param>
|
||||
/// <returns>a new list that is randomized</returns>
|
||||
public static List<T> Randomize<T>(List<T> list)
|
||||
{
|
||||
|
||||
List<T> randomizedList = new List<T>(list);
|
||||
Random rnd = GetRandom();
|
||||
int n = randomizedList.Count;
|
||||
int counter = 0;
|
||||
T value;
|
||||
while (n > 1)
|
||||
{
|
||||
n--;
|
||||
int k = rnd.Next(n + 1);
|
||||
value = randomizedList[k];
|
||||
randomizedList[k] = randomizedList[n];
|
||||
randomizedList[n] = value;
|
||||
counter++;
|
||||
if (counter > 10)
|
||||
{
|
||||
counter = 0;
|
||||
}
|
||||
}
|
||||
return randomizedList;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
361
EduNetworkBuilder/NetTest.cs
Normal file
361
EduNetworkBuilder/NetTest.cs
Normal file
@ -0,0 +1,361 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Drawing;
|
||||
using System.Xml;
|
||||
|
||||
namespace EduNetworkBuilder
|
||||
{
|
||||
public class NetTest
|
||||
{
|
||||
public string sHost = "";
|
||||
public string dHost = "";
|
||||
public Color WrongColor = Color.Red;
|
||||
public NetTestType TheTest = NetTestType.NeedsDefaultGW;
|
||||
public bool TaskWasDone = false;
|
||||
|
||||
public NetTest(string srcHost, string dstHost, NetTestType tTest)
|
||||
{
|
||||
sHost = srcHost;
|
||||
dHost = dstHost;
|
||||
TheTest = tTest;
|
||||
}
|
||||
|
||||
public NetTest(NetTest FromWhat)
|
||||
{
|
||||
sHost = FromWhat.sHost;
|
||||
dHost = FromWhat.dHost;
|
||||
TheTest = FromWhat.TheTest;
|
||||
}
|
||||
|
||||
public NetTest(XmlNode theNode)
|
||||
{
|
||||
foreach (XmlNode Individual in theNode.ChildNodes)
|
||||
{
|
||||
XmlNodeType myNodetype = Individual.NodeType;
|
||||
if (myNodetype == XmlNodeType.Element)
|
||||
{
|
||||
switch (Individual.Name.ToLower())
|
||||
{
|
||||
case "sourcehost":
|
||||
case "shost":
|
||||
sHost = Individual.InnerText;
|
||||
break;
|
||||
case "desthost":
|
||||
case "dhost":
|
||||
dHost = Individual.InnerText;
|
||||
break;
|
||||
case "thetest":
|
||||
TheTest = NB.ParseEnum<NetTestType>(Individual.InnerText);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Save(XmlWriter writer)
|
||||
{
|
||||
writer.WriteStartElement("nettest");
|
||||
writer.WriteElementString("shost", sHost);
|
||||
writer.WriteElementString("dhost", dHost);
|
||||
writer.WriteElementString("thetest", TheTest.ToString());
|
||||
writer.WriteEndElement();
|
||||
}
|
||||
|
||||
public void UpdateValuesFromAnother(NetTest WhatFrom)
|
||||
{
|
||||
dHost = WhatFrom.dHost;
|
||||
sHost = WhatFrom.sHost;
|
||||
TheTest = WhatFrom.TheTest;
|
||||
WrongColor = WhatFrom.WrongColor;
|
||||
}
|
||||
|
||||
public bool Equals(NetTest CompareTo)
|
||||
{
|
||||
if (sHost != CompareTo.sHost) return false;
|
||||
if (dHost != CompareTo.dHost) return false;
|
||||
if (TheTest != CompareTo.TheTest) return false;
|
||||
if (WrongColor != CompareTo.WrongColor) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool Edit()
|
||||
{
|
||||
NetTestEditor nte = new NetTestEditor(this);
|
||||
NetTest copy = new NetTest(this);
|
||||
nte.ShowDialog();
|
||||
if (copy.Equals(this)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
private string TestDescription(NetTestVerbosity amount)
|
||||
{
|
||||
string toreturn = "";
|
||||
switch(amount)
|
||||
{
|
||||
case NetTestVerbosity.basic:
|
||||
toreturn = "Has a problem";
|
||||
break;
|
||||
case NetTestVerbosity.hints:
|
||||
switch (TheTest)
|
||||
{
|
||||
case NetTestType.NeedsDefaultGW:
|
||||
toreturn = "Needs the gateway set";
|
||||
break;
|
||||
// case NetTestType.NeedsPingToHost:
|
||||
// toreturn = "Cannot ping";
|
||||
// break;
|
||||
case NetTestType.NeedsRouteToNet:
|
||||
toreturn = "Needs a route set";
|
||||
break;
|
||||
case NetTestType.NeedsLocalIPTo:
|
||||
toreturn = "Needs a local IP";
|
||||
break;
|
||||
case NetTestType.NeedsLinkToDevice:
|
||||
toreturn = "Needs to be connected to the network.";
|
||||
break;
|
||||
case NetTestType.SuccessfullyArps:
|
||||
toreturn = "Needs to find ARP from some device";
|
||||
break;
|
||||
case NetTestType.SuccessfullyDHCPs:
|
||||
toreturn = "Needs a DHCP IP address";
|
||||
break;
|
||||
case NetTestType.SuccessfullyPings:
|
||||
toreturn = "Must ping a host.";
|
||||
break;
|
||||
case NetTestType.HelpRequest:
|
||||
toreturn = "Get mouse-over help";
|
||||
break;
|
||||
case NetTestType.FailedPing:
|
||||
toreturn = "Should fail to ping a specific host";
|
||||
break;
|
||||
case NetTestType.LockAll:
|
||||
toreturn = "Is Locked";
|
||||
break;
|
||||
case NetTestType.LockDHCP:
|
||||
toreturn = "Has Locked DHCP";
|
||||
break;
|
||||
case NetTestType.LockIP:
|
||||
toreturn = "Has Locked IP";
|
||||
break;
|
||||
case NetTestType.LockNic:
|
||||
toreturn = "Has Locked NIC";
|
||||
break;
|
||||
case NetTestType.LockRoute:
|
||||
toreturn = "Has Locked Route";
|
||||
break;
|
||||
case NetTestType.LockGateway:
|
||||
toreturn = "Has Locked Gateway";
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case NetTestVerbosity.full:
|
||||
switch (TheTest)
|
||||
{
|
||||
case NetTestType.NeedsDefaultGW:
|
||||
toreturn = "Needs the gateway set to:";
|
||||
break;
|
||||
// case NetTestType.NeedsPingToHost:
|
||||
// toreturn = "Cannot ping host:";
|
||||
// break;
|
||||
case NetTestType.NeedsRouteToNet:
|
||||
toreturn = "Needs a route to network:";
|
||||
break;
|
||||
case NetTestType.NeedsLocalIPTo:
|
||||
toreturn = "Needs an IP local to host:";
|
||||
break;
|
||||
case NetTestType.NeedsLinkToDevice:
|
||||
toreturn = "Needs a link to host:";
|
||||
break;
|
||||
case NetTestType.SuccessfullyArps:
|
||||
toreturn = "Needs to find ARP from:";
|
||||
break;
|
||||
case NetTestType.SuccessfullyDHCPs:
|
||||
toreturn = "Needs a DHCP IP address from server:";
|
||||
break;
|
||||
case NetTestType.SuccessfullyPings:
|
||||
toreturn = "Must ping:";
|
||||
break;
|
||||
case NetTestType.HelpRequest:
|
||||
toreturn = "Get mouse-over help of level:";
|
||||
break;
|
||||
case NetTestType.FailedPing:
|
||||
toreturn = "Needs to try to ping (and fail):";
|
||||
break;
|
||||
case NetTestType.LockAll:
|
||||
toreturn = "Is Locked:";
|
||||
break;
|
||||
case NetTestType.LockDHCP:
|
||||
toreturn = "Has Locked DHCP:";
|
||||
break;
|
||||
case NetTestType.LockIP:
|
||||
toreturn = "Has Locked IP:";
|
||||
break;
|
||||
case NetTestType.LockNic:
|
||||
toreturn = "Has Locked NIC:";
|
||||
break;
|
||||
case NetTestType.LockRoute:
|
||||
toreturn = "Has Locked Route:";
|
||||
break;
|
||||
case NetTestType.LockGateway:
|
||||
toreturn = "Has Locked Gateway:";
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case NetTestVerbosity.none:
|
||||
toreturn = "";
|
||||
break;
|
||||
}
|
||||
return toreturn;
|
||||
}
|
||||
|
||||
public string GetDescription(NetTestVerbosity amount)
|
||||
{
|
||||
string toreturn = "";
|
||||
switch(amount)
|
||||
{
|
||||
case NetTestVerbosity.basic:
|
||||
toreturn = sHost + " " + TestDescription(amount);
|
||||
break;
|
||||
case NetTestVerbosity.hints:
|
||||
toreturn = sHost + " " + TestDescription(amount);
|
||||
break;
|
||||
case NetTestVerbosity.full:
|
||||
toreturn = sHost + " " + TestDescription(amount) + " " + dHost;
|
||||
break;
|
||||
case NetTestVerbosity.none:
|
||||
toreturn = "";
|
||||
break;
|
||||
}
|
||||
return toreturn;
|
||||
}
|
||||
|
||||
|
||||
public bool TestPiecesExist()
|
||||
{
|
||||
Network theNet = NB.GetNetwork();
|
||||
NetworkDevice Source = theNet.GetDeviceFromName(sHost);
|
||||
NetworkDevice Dest = theNet.GetDeviceFromName(dHost);
|
||||
if (Source == null) return false;
|
||||
if (Dest == null) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool ColorItemsIfNeeded(bool ChangeColor)
|
||||
{
|
||||
bool WasDone = TaskWasDone;
|
||||
if(!TestComplete())
|
||||
{
|
||||
Network theNet = NB.GetNetwork();
|
||||
NetworkDevice Source = theNet.GetDeviceFromName(sHost);
|
||||
if(Source!= null)
|
||||
{
|
||||
if (ChangeColor)
|
||||
{
|
||||
Source.BackgroundColor = WrongColor;
|
||||
Source.IsDirty = true; //Make sure we re-draw it
|
||||
}
|
||||
return true; //We have a test that is not completed
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if(WasDone == false)
|
||||
{
|
||||
//We just solved it for the first time
|
||||
TaskWasDone = true;
|
||||
NB.PlaySound(NBSoundType.success);
|
||||
}
|
||||
return false; //No need to color anything
|
||||
}
|
||||
|
||||
public void SetDone()
|
||||
{
|
||||
if(TaskWasDone == false)
|
||||
{
|
||||
NB.PlaySound(NBSoundType.success);
|
||||
}
|
||||
TaskWasDone = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// See if the test has been solved
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public bool TestComplete()
|
||||
{
|
||||
Network theNet = NB.GetNetwork();
|
||||
NetworkDevice Source = theNet.GetDeviceFromName(sHost);
|
||||
NetworkDevice Dest = theNet.GetDeviceFromName(dHost);
|
||||
IPAddress gw;
|
||||
IPAddress tAddr;
|
||||
|
||||
switch(TheTest)
|
||||
{
|
||||
case NetTestType.NeedsDefaultGW:
|
||||
if (Source == null) return false; //Unable to do it. Do not count it against them.
|
||||
if (Dest == null) return false; //Unable to do it. Do not count it against them.
|
||||
|
||||
gw = Source.GetGateway();
|
||||
if(Dest.HasIPAddress(gw))
|
||||
{
|
||||
//It has the IP. Is it local to the source?
|
||||
if(Source.LocalNic(gw) != null)
|
||||
{
|
||||
//The default gw is set to the IP of the dest
|
||||
//The IP address chosen is "local" to the source host. So it should ping between them
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false; //Something is not set right.
|
||||
case NetTestType.NeedsRouteToNet:
|
||||
if (Source == null) return false; //Unable to do it. Do not count it against them.
|
||||
tAddr = theNet.DNSLookup(Source,dHost);
|
||||
if (tAddr == null || tAddr.GetIPString == NB.ZeroIPString)
|
||||
tAddr = new IPAddress(dHost);
|
||||
if (Source.HasRouteMatching(tAddr))
|
||||
{
|
||||
IPAddress route = Source.RouteMatching(tAddr);
|
||||
if (Source.LocalNic(new IPAddress(route.GetGateway.ToIpString())) == null)
|
||||
return false; //The gateway specified is not local to the device. We cannot get to it
|
||||
return true;
|
||||
}
|
||||
return false; //if we get here, it has failed somehow
|
||||
case NetTestType.NeedsLocalIPTo:
|
||||
if (Source == null) return false; //Unable to do it. Do not count it against them.
|
||||
if (Dest == null) return false; //Unable to do it. Do not count it against them.
|
||||
tAddr = Source.LocalDeviceIP(Dest);
|
||||
IPAddress dAddress = Dest.LocalDeviceIP(Source);
|
||||
if (Dest.HasIPAddress(tAddr)) return false; //They gave the same address to the source that the dest has.
|
||||
if (!theNet.HasUniqueIP(tAddr, Source)) return false; //Verify we have not given the IP to someone else
|
||||
if (tAddr != null &&
|
||||
tAddr.GetIPString != NB.ZeroIPString)
|
||||
{
|
||||
if(dAddress != null & dAddress.GetMask == tAddr.GetMask)
|
||||
return true;
|
||||
}
|
||||
return false; //Something is not set right.
|
||||
case NetTestType.NeedsLinkToDevice:
|
||||
if (Source == null) return false; //Unable to do it. Do not count it against them.
|
||||
if (Dest == null) return false; //Unable to do it. Do not count it against them.
|
||||
if (Source.HasLinkTo(dHost)) return true;
|
||||
return false; //Something is not set right.
|
||||
case NetTestType.SuccessfullyArps:
|
||||
case NetTestType.SuccessfullyDHCPs:
|
||||
case NetTestType.SuccessfullyPings:
|
||||
case NetTestType.HelpRequest:
|
||||
case NetTestType.FailedPing:
|
||||
return TaskWasDone; //This variable will tell us if these tests have been done.
|
||||
case NetTestType.LockAll:
|
||||
case NetTestType.LockDHCP:
|
||||
case NetTestType.LockIP:
|
||||
case NetTestType.LockNic:
|
||||
case NetTestType.LockRoute:
|
||||
case NetTestType.LockGateway:
|
||||
return true; //Nothing to solve. We just lock it so it cannot be changed.
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
259
EduNetworkBuilder/NetTestEditor.cs
Normal file
259
EduNetworkBuilder/NetTestEditor.cs
Normal file
@ -0,0 +1,259 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Globalization;
|
||||
using System.Resources;
|
||||
|
||||
|
||||
namespace EduNetworkBuilder
|
||||
{
|
||||
public partial class NetTestEditor : Form
|
||||
{
|
||||
NetTest ToEdit;
|
||||
NetTest OrigTest;
|
||||
List<string> HostNames = new List<string>();
|
||||
List<string> Networks = new List<string>();
|
||||
List<string> Broadcasts = new List<string>();
|
||||
bool processing = false;
|
||||
|
||||
public NetTestEditor(NetTest WhatToEdit)
|
||||
{
|
||||
InitializeComponent();
|
||||
LanguagifyComponents();
|
||||
OrigTest = WhatToEdit;
|
||||
ToEdit = new NetTest(OrigTest);
|
||||
|
||||
Network mynet = NB.GetNetwork();
|
||||
HostNames.AddRange(mynet.GetHostnames());
|
||||
Networks.AddRange(mynet.GetSubnets());
|
||||
Broadcasts.AddRange(mynet.GetBroadcasts());
|
||||
UpdateForm();
|
||||
}
|
||||
|
||||
private void LanguagifyComponents()
|
||||
{
|
||||
ResourceManager RM = NB.GetResource();
|
||||
CultureInfo CI = NB.GetCulture();
|
||||
Text = NB.Translate("NTE_lblSource");
|
||||
Text = NB.Translate("NTE_lblTest");
|
||||
Text = NB.Translate("NTE_lblDest");
|
||||
Text = NB.Translate("NTE_btnOK");
|
||||
Text = NB.Translate("NTE_btnCancel");
|
||||
Text = NB.Translate("NTE_Form");
|
||||
}
|
||||
|
||||
|
||||
private void btnOK_Click(object sender, EventArgs e)
|
||||
{
|
||||
OrigTest.UpdateValuesFromAnother(ToEdit);
|
||||
Close();
|
||||
}
|
||||
|
||||
private void btnCancel_Click(object sender, EventArgs e)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
private void UpdateForm()
|
||||
{
|
||||
NetworkDevice sItem;
|
||||
processing = true;
|
||||
Network theNet = NB.GetNetwork();
|
||||
//We add all the hostnames as source
|
||||
cbSource.Items.Clear();
|
||||
foreach(string host in HostNames)
|
||||
{
|
||||
cbSource.Items.Add(host);
|
||||
}
|
||||
|
||||
//The tests are just the list of available tests.
|
||||
cbTest.Items.Clear();
|
||||
List<string> tList = new List<string>();
|
||||
foreach (string test in Enum.GetNames(typeof(NetTestType)))
|
||||
{
|
||||
tList.Add(test);
|
||||
}
|
||||
tList.Sort(); //Sort them alphabetically. Just to make things easier
|
||||
foreach (string test in tList)
|
||||
{
|
||||
cbTest.Items.Add(test);
|
||||
}
|
||||
|
||||
cbDest.Items.Clear();
|
||||
if (ToEdit.TheTest == NetTestType.NeedsRouteToNet)
|
||||
{ //List all the networks
|
||||
foreach (string subnet in Networks)
|
||||
{
|
||||
cbDest.Items.Add(subnet);
|
||||
}
|
||||
}
|
||||
else if (ToEdit.TheTest == NetTestType.HelpRequest)
|
||||
{
|
||||
foreach (string subnet in Enum.GetNames(typeof(NetTestVerbosity)))
|
||||
{
|
||||
cbDest.Items.Add(subnet);
|
||||
}
|
||||
cbDest.Items.Add("?Button");
|
||||
}
|
||||
else if (ToEdit.TheTest == NetTestType.LockAll || ToEdit.TheTest == NetTestType.LockGateway)
|
||||
{
|
||||
cbDest.Items.Add("All");
|
||||
}
|
||||
else if (ToEdit.TheTest == NetTestType.LockDHCP)
|
||||
{
|
||||
//return all the dhcp ranges
|
||||
sItem = theNet.GetDeviceFromName(ToEdit.sHost);
|
||||
foreach(string ip in sItem.DHCPStrings(false))
|
||||
{
|
||||
cbDest.Items.Add(ip);
|
||||
}
|
||||
}
|
||||
else if (ToEdit.TheTest == NetTestType.LockIP)
|
||||
{
|
||||
//return all the dhcp ranges
|
||||
sItem = theNet.GetDeviceFromName(ToEdit.sHost);
|
||||
foreach (IPAddress ip in sItem.IPAddressList())
|
||||
{
|
||||
cbDest.Items.Add(ip.GetIPString);
|
||||
}
|
||||
}
|
||||
else if (ToEdit.TheTest == NetTestType.LockRoute)
|
||||
{
|
||||
//return all the dhcp ranges
|
||||
sItem = theNet.GetDeviceFromName(ToEdit.sHost);
|
||||
foreach (IPAddress ip in sItem.ListRoutes())
|
||||
{
|
||||
cbDest.Items.Add(ip.GetIPString);
|
||||
}
|
||||
}
|
||||
else if (ToEdit.TheTest == NetTestType.LockNic)
|
||||
{
|
||||
//return all the dhcp ranges
|
||||
sItem = theNet.GetDeviceFromName(ToEdit.sHost);
|
||||
foreach (string nname in sItem.NICNames())
|
||||
{
|
||||
cbDest.Items.Add(nname);
|
||||
}
|
||||
}
|
||||
else
|
||||
{ //List all the hosts
|
||||
foreach (string host in HostNames)
|
||||
{
|
||||
cbDest.Items.Add(host);
|
||||
}
|
||||
|
||||
if (ToEdit.TheTest == NetTestType.SuccessfullyPings)
|
||||
{ //List all the network broadcasts
|
||||
foreach (string subnet in Broadcasts)
|
||||
{
|
||||
cbDest.Items.Add(subnet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Now we select all the appropriate items.
|
||||
if(cbSource.Items.Contains(ToEdit.sHost))
|
||||
{
|
||||
cbSource.SelectedItem = ToEdit.sHost;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(cbSource.Items.Count > 0)
|
||||
cbSource.SelectedIndex = 0; //select the first item
|
||||
}
|
||||
|
||||
if (cbDest.Items.Contains(ToEdit.dHost))
|
||||
{
|
||||
cbDest.SelectedItem = ToEdit.dHost;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (cbDest.Items.Count > 0)
|
||||
cbDest.SelectedIndex = 0; //select the first item
|
||||
}
|
||||
|
||||
if (cbTest.Items.Contains(ToEdit.TheTest.ToString()))
|
||||
{
|
||||
cbTest.SelectedItem = ToEdit.TheTest.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (cbTest.Items.Count > 0)
|
||||
cbTest.SelectedIndex = 0; //select the first item
|
||||
}
|
||||
processing = false;
|
||||
}
|
||||
|
||||
private void NetTestEditor_Load(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private bool validate_choices()
|
||||
{
|
||||
if (processing) return true; //If we are processing, we are all OK.
|
||||
Network theNet = NB.GetNetwork();
|
||||
NetTestType ntt = NB.ParseEnum<NetTestType>(cbTest.SelectedItem.ToString());
|
||||
if (cbSource.SelectedItem.ToString() == cbDest.SelectedItem.ToString() && ntt != NetTestType.HelpRequest)
|
||||
return false; //Source cannot equal dest
|
||||
if (theNet.GetDeviceFromName(cbSource.SelectedItem.ToString()) == null)
|
||||
return false; //This should never happen with a drop-down list, but just in case...
|
||||
if (ntt == NetTestType.LockAll || ntt == NetTestType.LockDHCP || ntt == NetTestType.LockIP ||
|
||||
ntt == NetTestType.LockNic || ntt == NetTestType.LockRoute)
|
||||
return true;
|
||||
if(ntt == NetTestType.NeedsRouteToNet)
|
||||
{
|
||||
//We should have a network, not a host.
|
||||
}
|
||||
else if (ntt == NetTestType.HelpRequest)
|
||||
{
|
||||
//This uses a verbosity
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ntt == NetTestType.SuccessfullyPings) return true;
|
||||
if (theNet.GetDeviceFromName(cbDest.SelectedItem.ToString()) == null)
|
||||
return false; //This should never happen with a drop-down list, but just in case...
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void cbTest_SelectedValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
ToEdit.TheTest = NB.ParseEnum<NetTestType>(cbTest.SelectedItem.ToString());
|
||||
if (!processing)
|
||||
UpdateForm();
|
||||
|
||||
}
|
||||
|
||||
private void cbSource_SelectedValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (validate_choices())
|
||||
{
|
||||
ToEdit.sHost = cbSource.SelectedItem.ToString();
|
||||
}
|
||||
else
|
||||
if (!processing)
|
||||
UpdateForm();
|
||||
}
|
||||
|
||||
private void cbDest_SelectedValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (validate_choices())
|
||||
{
|
||||
ToEdit.dHost = cbDest.SelectedItem.ToString();
|
||||
}
|
||||
else
|
||||
if (!processing)
|
||||
UpdateForm();
|
||||
}
|
||||
}
|
||||
}
|
1111
EduNetworkBuilder/Network.cs
Normal file
1111
EduNetworkBuilder/Network.cs
Normal file
File diff suppressed because it is too large
Load Diff
1126
EduNetworkBuilder/NetworkBuilder.cs
Normal file
1126
EduNetworkBuilder/NetworkBuilder.cs
Normal file
File diff suppressed because it is too large
Load Diff
627
EduNetworkBuilder/NetworkCard.cs
Normal file
627
EduNetworkBuilder/NetworkCard.cs
Normal file
@ -0,0 +1,627 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Runtime.Serialization.Formatters.Binary;
|
||||
using System.Runtime.Serialization;
|
||||
using System.IO;
|
||||
using System.Xml;
|
||||
|
||||
|
||||
namespace EduNetworkBuilder
|
||||
{
|
||||
[Serializable]
|
||||
public class NetworkCard
|
||||
{
|
||||
public string MAC = NB.GenerateMACAddress(); //Technically we should make sure it is unique
|
||||
List<NetworkInterface> interfaces = new List<NetworkInterface>();
|
||||
public bool UsesDHCP = false;
|
||||
public bool CanUseDHCP = false;
|
||||
public bool MustUseDHCP = false;
|
||||
private NicType myNicType = NicType.eth;
|
||||
public HostNicID myID;
|
||||
public int ConnectedLink=-1; //The link that is connected to this nic.
|
||||
private int UniqueIdentifier = NB.GetUniqueIdentifier();
|
||||
private string _nic_name="";
|
||||
public IPAddress TunnelEndpoint;
|
||||
public string EncryptionKey;
|
||||
|
||||
public NetworkCard(int index, int HostID, string hostname, NicType theType = NicType.eth)
|
||||
{
|
||||
myNicType = theType;
|
||||
_nic_name = myNicType.ToString() + index.ToString();
|
||||
NetworkInterface nInterface = new NetworkInterface(NicName(), NB.ZeroIPString, NB.ZeroIPString, myID);
|
||||
if(theType == NicType.lo)
|
||||
nInterface = new NetworkInterface(NicName(), "127.0.0.1", "255.0.0.0", myID);
|
||||
myID = new HostNicID(HostID, UniqueIdentifier,hostname,nInterface.nic_name);
|
||||
interfaces.Add(nInterface);
|
||||
ApplyNicRules();
|
||||
SetIPForDHCP();
|
||||
}
|
||||
|
||||
public NetworkCard(XmlNode theNode)
|
||||
{
|
||||
foreach (XmlNode Individual in theNode.ChildNodes)
|
||||
{
|
||||
XmlNodeType myNodetype = Individual.NodeType;
|
||||
if (myNodetype == XmlNodeType.Element)
|
||||
{
|
||||
switch (Individual.Name.ToLower())
|
||||
{
|
||||
case "nictype":
|
||||
myNicType = NB.ParseEnum<NicType>(Individual.InnerText);
|
||||
break;
|
||||
case "nicname":
|
||||
_nic_name = Individual.InnerText;
|
||||
break;
|
||||
case "myid":
|
||||
myID = new HostNicID(Individual);
|
||||
break;
|
||||
case "usesdhcp":
|
||||
bool.TryParse(Individual.InnerText, out UsesDHCP);
|
||||
break;
|
||||
case "uniqueidentifier":
|
||||
int.TryParse(Individual.InnerText, out UniqueIdentifier);
|
||||
break;
|
||||
case "interface":
|
||||
NetworkInterface newIF = new NetworkInterface(Individual,myID);
|
||||
interfaces.Add(newIF);
|
||||
break;
|
||||
case "mac":
|
||||
string tmac = Individual.InnerText;
|
||||
if (tmac.Length == MAC.Length)
|
||||
MAC = tmac.ToUpper(); //Make sure it is all uppercase
|
||||
break;
|
||||
case "tunnelendpoint":
|
||||
TunnelEndpoint = new IPAddress(Individual);
|
||||
break;
|
||||
case "encryptionkey":
|
||||
EncryptionKey = Individual.InnerText;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
ApplyNicRules();
|
||||
SetIPForDHCP();
|
||||
}
|
||||
|
||||
private void ApplyNicRules()
|
||||
{
|
||||
//These are the defaults for the various nic types. They can be overridden by the device.
|
||||
if(myNicType == NicType.eth || myNicType == NicType.management_interface || myNicType == NicType.wlan)
|
||||
{
|
||||
CanUseDHCP = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
CanUseDHCP = false;
|
||||
}
|
||||
}
|
||||
|
||||
public void Save(XmlWriter writer)
|
||||
{
|
||||
writer.WriteStartElement("nic");
|
||||
writer.WriteElementString("nictype", myNicType.ToString());
|
||||
writer.WriteElementString("nicname", _nic_name);
|
||||
myID.Save(writer, "myid");
|
||||
writer.WriteElementString("nictype", myNicType.ToString());
|
||||
writer.WriteElementString("uniqueidentifier", UniqueIdentifier.ToString());
|
||||
writer.WriteElementString("usesdhcp", UsesDHCP.ToString());
|
||||
if(EncryptionKey != "")
|
||||
writer.WriteElementString("encryptionkey", EncryptionKey);
|
||||
if (TunnelEndpoint != null)
|
||||
{
|
||||
TunnelEndpoint.Save(writer, "tunnelendpoint");
|
||||
}
|
||||
foreach (NetworkInterface nIF in interfaces)
|
||||
{
|
||||
nIF.Save(writer);
|
||||
}
|
||||
writer.WriteEndElement();
|
||||
}
|
||||
|
||||
public int GetUniqueIdentifier
|
||||
{
|
||||
get { return UniqueIdentifier; }
|
||||
}
|
||||
|
||||
public NicType GetNicType
|
||||
{
|
||||
get { return myNicType; }
|
||||
}
|
||||
|
||||
public bool HasIP(UInt32 IP)
|
||||
{
|
||||
if (myNicType == NicType.port) return false;
|
||||
if (myNicType == NicType.none) return false;
|
||||
foreach (NetworkInterface IF in interfaces)
|
||||
{
|
||||
if (IF.myIP.Equals(IP))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public string NicName()
|
||||
{
|
||||
return _nic_name;
|
||||
}
|
||||
|
||||
public string NicString(int index)
|
||||
{
|
||||
string connected = " ";
|
||||
if (isConnected(true)) connected = "*";
|
||||
if (myNicType == NicType.port)
|
||||
return NicName() + connected;
|
||||
return NicName() + connected + " " + MAC;
|
||||
}
|
||||
|
||||
public List<string> NICRouteStrings(string GW)
|
||||
{
|
||||
List<string> thestrings = new List<string>();
|
||||
if (myNicType == NicType.port) return thestrings;
|
||||
if (myNicType == NicType.none) return thestrings;
|
||||
foreach (NetworkInterface iface in interfaces)
|
||||
{
|
||||
thestrings.Add(iface.RouteString(_nic_name,GW));
|
||||
}
|
||||
return thestrings;
|
||||
}
|
||||
|
||||
public List<string> IPAddresses(bool UseCidr = false)
|
||||
{
|
||||
List<string> theIPs = new List<string>();
|
||||
if (myNicType == NicType.port) return theIPs;
|
||||
if (myNicType == NicType.none) return theIPs;
|
||||
string DHCPString = "";
|
||||
if (UsesDHCP && CanUseDHCP) DHCPString = "DHCP: ";
|
||||
foreach (NetworkInterface iface in interfaces)
|
||||
{
|
||||
theIPs.Add(DHCPString + iface.InterfaceString(UseCidr));
|
||||
}
|
||||
return theIPs;
|
||||
}
|
||||
|
||||
public List<IPAddress> IPAddressList()
|
||||
{
|
||||
List<IPAddress> theIPs = new List<IPAddress>();
|
||||
if (myNicType == NicType.port) return theIPs;
|
||||
if (myNicType == NicType.none) return theIPs;
|
||||
foreach (NetworkInterface iface in interfaces)
|
||||
{
|
||||
theIPs.Add(iface.myIP);
|
||||
}
|
||||
return theIPs;
|
||||
}
|
||||
|
||||
public bool HasIPAddresses(IPAddress dest)
|
||||
{
|
||||
if (myNicType == NicType.port) return false;
|
||||
if (myNicType == NicType.none) return false;
|
||||
if (dest == null) return false;
|
||||
foreach (NetworkInterface iface in interfaces)
|
||||
{
|
||||
if (iface.myIP.GetIP == dest.GetIP)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public bool HasBroadcastAddresses(IPAddress dest)
|
||||
{
|
||||
if (myNicType == NicType.port) return false;
|
||||
if (myNicType == NicType.none) return false;
|
||||
if (dest == null) return false;
|
||||
foreach (NetworkInterface iface in interfaces)
|
||||
{
|
||||
if (iface.myIP.BroadcastAddress == dest.GetIP)
|
||||
return true;//If they are pinging the broadcast IP
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void EditInterface(int index)
|
||||
{
|
||||
if (index < 0 || index > interfaces.Count())
|
||||
return;
|
||||
interfaces[index].EditAddress();
|
||||
}
|
||||
public void DeleteInterface(int index)
|
||||
{
|
||||
if (index < 0 || index > interfaces.Count())
|
||||
return;
|
||||
if (interfaces.Count < 2)
|
||||
return; //We cannot delete the sole remaining interface
|
||||
interfaces.RemoveAt(index);
|
||||
}
|
||||
public void AddInterface()
|
||||
{
|
||||
NetworkInterface iface = new NetworkInterface(NicName(), NB.ZeroIPString, NB.ZeroIPString, myID);
|
||||
interfaces.Add(iface);
|
||||
}
|
||||
|
||||
public NetworkInterface GetInterface(int index)
|
||||
{
|
||||
if (index < 0 || index > interfaces.Count())
|
||||
return null;
|
||||
return interfaces[index];
|
||||
}
|
||||
|
||||
public bool isConnected(bool CheckForBrokenLink)
|
||||
{
|
||||
if(ConnectedLink != -1)
|
||||
{
|
||||
if (!CheckForBrokenLink) return true; //We only care if there is any link
|
||||
Network myNet = NB.GetNetwork();
|
||||
NetworkLink NL = myNet.GetLinkFromID(ConnectedLink);
|
||||
if(NL != null)
|
||||
{
|
||||
if (NL.theLinkType != LinkType.broken) return true;
|
||||
else return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void Edit()
|
||||
{
|
||||
NetworkCardEditor nce = new NetworkCardEditor(this);
|
||||
nce.ShowDialog();
|
||||
//Now. update the interfaces if we need to do so.
|
||||
SetIPForDHCP();
|
||||
}
|
||||
|
||||
public void SetIPForDHCP()
|
||||
{
|
||||
if (UsesDHCP && CanUseDHCP)
|
||||
{
|
||||
//remove any extra interfaces.
|
||||
//set the one interface to 0.0.0.0
|
||||
switch(myNicType)
|
||||
{
|
||||
case NicType.eth:
|
||||
case NicType.wlan:
|
||||
interfaces.Clear(); //empty out all interfaces
|
||||
//Give it an interface with an empty IP
|
||||
NetworkInterface nInterface = new NetworkInterface(NicName(), NB.ZeroIPString, NB.ZeroIPString,myID);
|
||||
interfaces.Add(nInterface);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void SetIPForDHCP(IPAddress newIP)
|
||||
{
|
||||
if (UsesDHCP && CanUseDHCP)
|
||||
{
|
||||
if(interfaces.Count > 0)
|
||||
interfaces[0].myIP = newIP;
|
||||
}
|
||||
}
|
||||
|
||||
public bool HasLocalInterface(IPAddress theIP)
|
||||
{
|
||||
foreach(NetworkInterface nIF in interfaces)
|
||||
{
|
||||
if (nIF.isLocal(theIP))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Return the interface that is considered "local" to the IP address we are trying to reach
|
||||
/// </summary>
|
||||
/// <param name="theIP">An IP address we are trying to send out</param>
|
||||
/// <returns>null if no interface is local. Otherwise, it returns the one that matches the packet</returns>
|
||||
public NetworkInterface LocalInterface(IPAddress theIP, PacketMessage Tracker)
|
||||
{
|
||||
if (myNicType == NicType.port) return null; //ports have no local interfaces
|
||||
foreach (NetworkInterface nIF in interfaces)
|
||||
{
|
||||
if (nIF.isLocal(theIP))
|
||||
{
|
||||
if(Tracker != null)
|
||||
Tracker.AddMessage(DebugLevel.routing, myID.HostName, "Found local interface: ip" + nIF.myIP.GetIP.ToIpString() +
|
||||
" gw:" + nIF.myIP.GetMask.ToIpString());
|
||||
return nIF;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/***************************************
|
||||
*
|
||||
* *************************************/
|
||||
public bool SendPacketOutNIC(Packet tPacket)
|
||||
{
|
||||
bool madeprogress = false;
|
||||
Packet nPacket = null;
|
||||
Network myNet = NB.GetNetwork();
|
||||
NetworkLink nl;
|
||||
if (NB.GetComponentType(tPacket.WhereAmI) != GeneralComponentType.device) return false; //we cannot do this.
|
||||
NetworkDevice WhereFrom = (NetworkDevice)tPacket.WhereAmI;
|
||||
|
||||
switch (GetNicType)
|
||||
{
|
||||
case NicType.lo:
|
||||
case NicType.management_interface:
|
||||
case NicType.none:
|
||||
break; //Do nothing
|
||||
case NicType.eth:
|
||||
//see if it the packet dest is local to this nic
|
||||
foreach (NetworkInterface nf in interfaces.ToList())
|
||||
{
|
||||
if (tPacket.MyType == PacketType.arp_request && !nf.isLocal(tPacket.destIP))
|
||||
continue; //only send out arp requests on local networks
|
||||
nPacket = new Packet(tPacket);//Creates a new packet but sets isfresh=false
|
||||
if (nf.isLocal(tPacket.OutboundIP) || tPacket.OutboundIP.GetIPString == NB.BroadcastIPString)
|
||||
{
|
||||
if ((nf != null && nf.myIP.GetIPString != NB.ZeroIPString) || nPacket.MyType == PacketType.dhcp_request)
|
||||
{
|
||||
//this means we have a local interface to send it out of
|
||||
nPacket.sourceMAC = MAC;
|
||||
//If the source IP is empty then it is a new packet. We set the source to be us
|
||||
if (nPacket.sourceIP == null || nPacket.sourceIP.GetIPString == NB.ZeroIPString)
|
||||
nPacket.sourceIP = nf.myIP;
|
||||
nPacket.TsourceIP = nf.myIP;
|
||||
if (nPacket.destMAC == null || nPacket.destMAC == "")
|
||||
{
|
||||
nPacket.destMAC = WhereFrom.LookupArpFromIP(tPacket.OutboundIP.GetIPString);
|
||||
if (nPacket.MyType == PacketType.arp_request)
|
||||
{
|
||||
nPacket.destMAC = NB.BroadcastMACString;
|
||||
}
|
||||
|
||||
if(nPacket.destMAC == "")
|
||||
{
|
||||
nPacket.AddMessage(DebugLevel.debug, " No Machine matching that IP address on this subnet. " + nPacket.destIP.GetIPString);
|
||||
Network mynet = NB.GetNetwork();
|
||||
NetworkDevice nd = mynet.GetDeviceFromID(myID);
|
||||
string hostname = "No Host";
|
||||
if (nd != null) hostname = nd.hostname;
|
||||
nPacket.Tracking.Status = hostname + " No Machine matching that IP address on this subnet. " + nPacket.destIP.GetIPString;
|
||||
nPacket.MyStatus = PacketStatus.finished_failed;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
nl = myNet.GetLinkFromID(ConnectedLink);
|
||||
nPacket.StartOnLink(nl, WhereFrom); //This sends the packet down the link.
|
||||
//Store outbound information here - som we expect the returning packet
|
||||
WhereFrom.StoreOutgoingPacketInfo(nPacket);
|
||||
myNet.addPacket(nPacket);
|
||||
nPacket.PacketDump(myID.HostName + "-" + _nic_name, DebugPausePoint.packet_out);
|
||||
madeprogress = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case NicType.wan:
|
||||
//see if it the packet dest is local to this nic
|
||||
if (tPacket.MyType == PacketType.dhcp_answer && tPacket.isFresh)
|
||||
break; //We do not broadcast out the WAN port
|
||||
foreach (NetworkInterface nf in interfaces.ToList())
|
||||
{
|
||||
nPacket = new Packet(tPacket);//Creates a new packet but sets isfresh=false
|
||||
if (nf.isLocal(tPacket.OutboundIP) || tPacket.OutboundIP.GetIPString == NB.BroadcastIPString)
|
||||
{
|
||||
if ((nf != null && nf.myIP != null && nf.myIP.GetIPString != NB.ZeroIPString) || nPacket.MyType == PacketType.dhcp_request)
|
||||
{
|
||||
//this means we have a local interface to send it out of
|
||||
nPacket.sourceMAC = MAC;
|
||||
//If the source IP is empty then it originated from here. We set the source to be us
|
||||
if (nPacket.sourceIP == null || nPacket.sourceIP.GetIPString == NB.ZeroIPString)
|
||||
{
|
||||
nPacket.sourceIP = nf.myIP;
|
||||
WhereFrom.StoreOutgoingPacketInfo(nPacket); //the packet is not masqueraded, just accepted
|
||||
}
|
||||
else
|
||||
{
|
||||
//When we leave the WAN port, we are masqueraded. Track that.
|
||||
WhereFrom.StoreOutgoingPacketInfo(nPacket, ResponseToPacket.masq);
|
||||
//Now, we masquerade the packet so it looks like it comes fromhere
|
||||
nPacket.Tracking.AddMessage(DebugLevel.natting, WhereFrom.hostname, "MASQ: Changing outbound IP to: " + nf.myIP.GetIPString);
|
||||
nPacket.sourceIP = nf.myIP;
|
||||
}
|
||||
nPacket.TsourceIP = nf.myIP;
|
||||
if (nPacket.destMAC == null || nPacket.destMAC == "")
|
||||
{
|
||||
nPacket.destMAC = WhereFrom.LookupArpFromIP(tPacket.OutboundIP.GetIPString);
|
||||
|
||||
if (nPacket.destMAC == "")
|
||||
{
|
||||
nPacket.AddMessage(DebugLevel.debug, " No Machine matching that IP address on this subnet. " + nPacket.destIP.GetIPString);
|
||||
Network mynet = NB.GetNetwork();
|
||||
NetworkDevice nd = mynet.GetDeviceFromID(myID);
|
||||
string hostname = "No Host";
|
||||
if (nd != null) hostname = nd.hostname;
|
||||
nPacket.Tracking.Status = hostname + " No Machine matching that IP address on this subnet. " + nPacket.destIP.GetIPString;
|
||||
nPacket.MyStatus = PacketStatus.finished_failed;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
nl = myNet.GetLinkFromID(ConnectedLink);
|
||||
nPacket.StartOnLink(nl, WhereFrom); //This sends the packet down the link.
|
||||
//Store outbound information here - som we expect the returning packet
|
||||
WhereFrom.StoreOutgoingPacketInfo(nPacket);
|
||||
myNet.addPacket(nPacket);
|
||||
nPacket.PacketDump(myID.HostName + "-" + _nic_name, DebugPausePoint.packet_out);
|
||||
madeprogress = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case NicType.tun:
|
||||
case NicType.vpn:
|
||||
foreach (NetworkInterface nf in interfaces.ToList())
|
||||
{
|
||||
if (nf.isLocal(tPacket.OutboundIP))
|
||||
{
|
||||
//We need to tell the original packet that it is inside another packet
|
||||
tPacket.MyStatus = PacketStatus.encapsulated;
|
||||
tPacket.TsourceIP = nf.myIP;
|
||||
tPacket.destMAC = WhereFrom.LookupArpFromIP(tPacket.OutboundIP.GetIPString);
|
||||
|
||||
//We need to make a new, tunnel packet
|
||||
if (myNicType == NicType.tun)
|
||||
EncryptionKey = "";
|
||||
Packet rnPacket = new Packet(tPacket);
|
||||
WhereFrom.TunnelPacketFromHere(TunnelEndpoint, rnPacket, EncryptionKey);
|
||||
//We need to send the new packet on (pass it back to the device to process)
|
||||
madeprogress = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case NicType.port:
|
||||
nPacket = new Packet(tPacket);
|
||||
if (HasBroadcastAddresses(tPacket.destIP))
|
||||
{
|
||||
//Broadcast packets will go to everything and we want a response from all of them.
|
||||
nPacket.Tracking = PacketMessage.Clone(tPacket.Tracking);
|
||||
}
|
||||
if (nPacket.sourceMAC == null || nPacket.sourceMAC == "")
|
||||
{
|
||||
//Need to find the managament interface MAC
|
||||
nPacket.sourceMAC = WhereFrom.HubManagementMAC();
|
||||
}
|
||||
if(nPacket.sourceIP == null || nPacket.sourceIP.GetIPString == NB.ZeroIPString)
|
||||
{
|
||||
//set it to be the ip of management interface
|
||||
nPacket.sourceIP = WhereFrom.HubManagementIP();
|
||||
}
|
||||
if (nPacket.destMAC == null || nPacket.destMAC == "")
|
||||
{
|
||||
nPacket.destMAC = WhereFrom.LookupArpFromIP(tPacket.OutboundIP.GetIPString);
|
||||
}
|
||||
if(nPacket.TsourceIP == null)
|
||||
nPacket.TsourceIP = WhereFrom.HubManagementIP();
|
||||
nl = myNet.GetLinkFromID(ConnectedLink);
|
||||
if (nl == null) break;
|
||||
nPacket.StartOnLink(nl, WhereFrom); //This sends the packet down the link.
|
||||
myNet.addPacket(nPacket);
|
||||
if(tPacket.isFresh)
|
||||
WhereFrom.StoreOutgoingPacketInfo(nPacket); //if it originated from here...
|
||||
madeprogress = true;
|
||||
nPacket.PacketDump(myID.HostName, DebugPausePoint.packet_out);
|
||||
break;
|
||||
}
|
||||
return madeprogress;
|
||||
}
|
||||
|
||||
//********************Process Packet ********
|
||||
public void ProcessOutboundPacket(Packet tPacket)
|
||||
{
|
||||
//We set the MAC addrss to this nic
|
||||
tPacket.sourceMAC = MAC;
|
||||
|
||||
//If the nic has a special function, we need to do that too.
|
||||
// VPN, etc
|
||||
}
|
||||
|
||||
public void ProcessInboundPacket(Packet tPacket)
|
||||
{
|
||||
Network mynet;
|
||||
NetworkDevice nd;
|
||||
//We make sure the MAC matches.
|
||||
if (myNicType == NicType.port)
|
||||
{
|
||||
//Try tracking the arp if we can
|
||||
mynet = NB.GetNetwork();
|
||||
nd = mynet.GetDeviceFromID(myID);
|
||||
if (tPacket.TsourceIP == null) tPacket.TsourceIP = tPacket.sourceIP;
|
||||
nd.StoreArp(tPacket.sourceMAC, tPacket.TsourceIP.GetIP.ToIpString(), myID);
|
||||
//If it is a return DHCP packet. We should try to update the MAC
|
||||
if (tPacket.MyType == PacketType.dhcp_answer)
|
||||
{
|
||||
HostNicID otherid = nd.NicIDFromArp(tPacket.destMAC);
|
||||
if (otherid.HostID != -1)
|
||||
nd.StoreArp(tPacket.destMAC, tPacket.payloadIP.GetIP.ToIpString(), otherid);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if(myNicType == NicType.wan)
|
||||
{
|
||||
mynet = NB.GetNetwork();
|
||||
nd = mynet.GetDeviceFromID(myID);
|
||||
|
||||
if(nd.HowToRespondToPacket(tPacket) == ResponseToPacket.masq)
|
||||
{
|
||||
IPAddress oAddress = nd.PacketMasqueradeSource(tPacket);
|
||||
if(oAddress != null)
|
||||
{
|
||||
tPacket.Tracking.AddMessage(DebugLevel.natting, nd.hostname, "MASQ: Changing source IP back to: " + oAddress.GetIPString);
|
||||
tPacket.destIP = oAddress;
|
||||
}
|
||||
}
|
||||
else if(!HasIP(tPacket.destIP.GetIP))
|
||||
{
|
||||
tPacket.AddMessage(DebugLevel.routing, "The packet was rejected by the firewall.");
|
||||
tPacket.AddMessage(DebugLevel.debug, " The packet was not expected by the firewall, so it was rejected.");
|
||||
mynet = NB.GetNetwork();
|
||||
nd = mynet.GetDeviceFromID(myID);
|
||||
string hostname = "No Host";
|
||||
if (nd != null) hostname = nd.hostname;
|
||||
tPacket.Tracking.Status = hostname + " The packet was rejected by the firewall.. Dropped.";
|
||||
tPacket.MyStatus = PacketStatus.finished_failed;
|
||||
}
|
||||
}
|
||||
if(tPacket.destMAC == MAC || tPacket.destMAC == NB.BroadcastMACString || myNicType == NicType.port)
|
||||
{
|
||||
//It matches. We are ok. Anything to do?
|
||||
//If the NIC is a vpn, do that here.
|
||||
}
|
||||
else
|
||||
{
|
||||
tPacket.AddMessage(DebugLevel.routing,"The Packet was destined for a different machine (MAC Address): Rejected");
|
||||
tPacket.AddMessage(DebugLevel.debug, " Device MAC: " + MAC + " did not match packet: " + tPacket.destMAC);
|
||||
mynet = NB.GetNetwork();
|
||||
nd = mynet.GetDeviceFromID(myID);
|
||||
string hostname = "No Host";
|
||||
if (nd != null) hostname = nd.hostname;
|
||||
tPacket.Tracking.Status = hostname + " Packet destined for another machine. Dropped.";
|
||||
tPacket.MyStatus = PacketStatus.finished_failed;
|
||||
}
|
||||
}
|
||||
|
||||
public void ClearIPs()
|
||||
{
|
||||
foreach(NetworkInterface nf in interfaces)
|
||||
{
|
||||
if(myNicType != NicType.lo)
|
||||
nf.myIP = new IPAddress(NB.ZeroIPString);
|
||||
}
|
||||
}
|
||||
|
||||
public IPAddress FirstIP()
|
||||
{
|
||||
List<IPAddress> addresses = IPAddressList();
|
||||
if (addresses.Count > 0)
|
||||
return addresses[0];
|
||||
else
|
||||
return new IPAddress(NB.ZeroIPString);
|
||||
}
|
||||
|
||||
public static T Clone<T>(T source)
|
||||
{
|
||||
if (!typeof(T).IsSerializable)
|
||||
{
|
||||
throw new ArgumentException("The type must be serializable.", "source");
|
||||
}
|
||||
|
||||
// Don't serialize a null object, simply return the default for that object
|
||||
if (Object.ReferenceEquals(source, null))
|
||||
{
|
||||
return default(T);
|
||||
}
|
||||
|
||||
IFormatter formatter = new BinaryFormatter();
|
||||
Stream stream = new MemoryStream();
|
||||
using (stream)
|
||||
{
|
||||
formatter.Serialize(stream, source);
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
return (T)formatter.Deserialize(stream);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
161
EduNetworkBuilder/NetworkCardEditor.cs
Normal file
161
EduNetworkBuilder/NetworkCardEditor.cs
Normal file
@ -0,0 +1,161 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using System.Globalization;
|
||||
using System.Resources;
|
||||
|
||||
namespace EduNetworkBuilder
|
||||
{
|
||||
public partial class NetworkCardEditor : Form
|
||||
{
|
||||
NetworkCard MyNicToEdit;
|
||||
Button btnVPNEnd = null;
|
||||
TextBox tbVPNEncrypt = null;
|
||||
Label lblVPNEnd = null;
|
||||
Label lblVPNEncrypt = null;
|
||||
|
||||
private NetworkCardEditor()
|
||||
{
|
||||
InitializeComponent();
|
||||
LanguagifyComponents();
|
||||
}
|
||||
|
||||
public NetworkCardEditor(NetworkCard NicToEdit)
|
||||
{
|
||||
InitializeComponent();
|
||||
LanguagifyComponents();
|
||||
|
||||
if (NicToEdit.GetNicType == NicType.tun || NicToEdit.GetNicType == NicType.vpn)
|
||||
{
|
||||
AutoSize = false;
|
||||
btnVPNEnd = new Button();
|
||||
btnVPNEnd.Location = new Point(TBMacAddress.Location.X, cbDHCP.Location.Y + 28);
|
||||
string btnval = "0.0.0.0";
|
||||
if (NicToEdit.TunnelEndpoint != null)
|
||||
btnval = NicToEdit.TunnelEndpoint.GetIPString;
|
||||
btnVPNEnd.Text = btnval;
|
||||
btnVPNEnd.Click += btnVPNEnd_Click;
|
||||
|
||||
lblVPNEnd = new Label();
|
||||
lblVPNEnd.Location = new Point(10, btnVPNEnd.Location.Y);
|
||||
lblVPNEnd.Text = "VPN Endpoint:";
|
||||
Controls.Add(btnVPNEnd);
|
||||
Controls.Add(lblVPNEnd);
|
||||
this.Height = lblVPNEnd.Location.Y + lblVPNEnd.Height + 80;
|
||||
|
||||
if (NicToEdit.GetNicType == NicType.vpn)
|
||||
{
|
||||
tbVPNEncrypt = new TextBox();
|
||||
tbVPNEncrypt.Location = new Point(TBMacAddress.Location.X, btnVPNEnd.Location.Y + 28);
|
||||
|
||||
lblVPNEncrypt = new Label();
|
||||
lblVPNEncrypt.Location = new Point(10, tbVPNEncrypt.Location.Y);
|
||||
lblVPNEncrypt.Text = "Encryption Key:";
|
||||
Controls.Add(tbVPNEncrypt);
|
||||
Controls.Add(lblVPNEncrypt);
|
||||
this.Height = tbVPNEncrypt.Location.Y + tbVPNEncrypt.Height + 80;
|
||||
}
|
||||
Refresh();
|
||||
//AutoSize = true;
|
||||
}
|
||||
TBMacAddress.Enabled = false;
|
||||
tbNicName.Enabled = false;
|
||||
tbNicType.Enabled = false;
|
||||
cbCanUseDHCP.Enabled = false;
|
||||
|
||||
TBMacAddress.Text = NicToEdit.MAC;
|
||||
tbNicName.Text = NicToEdit.NicName();
|
||||
tbNicType.Text = NicToEdit.GetNicType.ToString();
|
||||
|
||||
MyNicToEdit = NicToEdit;
|
||||
cbCanUseDHCP.Checked = NicToEdit.CanUseDHCP;
|
||||
cbDHCP.Checked = NicToEdit.UsesDHCP;
|
||||
if (!NicToEdit.CanUseDHCP) cbDHCP.Enabled = false;
|
||||
if(NicToEdit.MustUseDHCP)
|
||||
{
|
||||
cbDHCP.Enabled = false;
|
||||
cbCanUseDHCP.Enabled = false;
|
||||
}
|
||||
Network theNet = NB.GetNetwork();
|
||||
NetworkDevice nd = theNet.GetDeviceFromID(NicToEdit.myID);
|
||||
if(theNet.ItemIsLocked(nd.hostname, NicToEdit.NicName(), NetTestType.LockNic))
|
||||
{
|
||||
cbDHCP.Enabled = false;
|
||||
cbCanUseDHCP.Enabled = false;
|
||||
TBMacAddress.Enabled = false;
|
||||
tbNicName.Enabled = false;
|
||||
tbNicType.Enabled = false;
|
||||
}
|
||||
UpdateForm();
|
||||
}
|
||||
|
||||
private void LanguagifyComponents()
|
||||
{
|
||||
ResourceManager RM = NB.GetResource();
|
||||
CultureInfo CI = NB.GetCulture();
|
||||
Text = NB.Translate("NCE_cbCanUseDHCP");
|
||||
Text = NB.Translate("NCE_cbDHCP");
|
||||
Text = NB.Translate("NCE_label1");
|
||||
Text = NB.Translate("NCE_label2");
|
||||
Text = NB.Translate("NCE_label3");
|
||||
Text = NB.Translate("NCE_btnDone");
|
||||
Text = NB.Translate("NCE_lblLinkStatus");
|
||||
Text = NB.Translate("NCE_Form");
|
||||
}
|
||||
|
||||
private void UpdateForm()
|
||||
{
|
||||
if (btnVPNEnd != null)
|
||||
{
|
||||
string btnval = "0.0.0.0";
|
||||
if (MyNicToEdit.TunnelEndpoint != null)
|
||||
btnval = MyNicToEdit.TunnelEndpoint.GetIPString;
|
||||
btnVPNEnd.Text = btnval;
|
||||
}
|
||||
if(tbVPNEncrypt != null)
|
||||
{
|
||||
tbVPNEncrypt.Text = MyNicToEdit.EncryptionKey;
|
||||
}
|
||||
if (MyNicToEdit.GetNicType == NicType.tun || MyNicToEdit.GetNicType == NicType.vpn ||
|
||||
MyNicToEdit.GetNicType == NicType.management_interface || MyNicToEdit.GetNicType == NicType.lo)
|
||||
{
|
||||
lblLinkStatus.Visible = false;
|
||||
}
|
||||
else
|
||||
lblLinkStatus.Visible = true;
|
||||
if (MyNicToEdit.isConnected(true))
|
||||
lblLinkStatus.Text = "Connected";
|
||||
else
|
||||
lblLinkStatus.Text = "Disconnected";
|
||||
}
|
||||
|
||||
private void btnDone_Click(object sender, EventArgs e)
|
||||
{
|
||||
MyNicToEdit.CanUseDHCP = cbCanUseDHCP.Checked;
|
||||
MyNicToEdit.UsesDHCP = cbDHCP.Checked;
|
||||
if (tbVPNEncrypt != null)
|
||||
{
|
||||
MyNicToEdit.EncryptionKey = tbVPNEncrypt.Text;
|
||||
}
|
||||
Close();
|
||||
}
|
||||
|
||||
private void btnVPNEnd_Click(object sender, EventArgs e)
|
||||
{
|
||||
Network theNet = NB.GetNetwork();
|
||||
NetworkDevice nd = theNet.GetDeviceFromID(MyNicToEdit.myID);
|
||||
if(MyNicToEdit.TunnelEndpoint == null)
|
||||
{
|
||||
MyNicToEdit.TunnelEndpoint = new IPAddress(NB.ZeroIPString, "255.255.255.0", IPAddressType.ip_only);
|
||||
}
|
||||
MyNicToEdit.TunnelEndpoint.Edit(nd,"Endpoint");
|
||||
UpdateForm();
|
||||
}
|
||||
}
|
||||
}
|
120
EduNetworkBuilder/NetworkCardEditor.resx
Normal file
120
EduNetworkBuilder/NetworkCardEditor.resx
Normal file
@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
2281
EduNetworkBuilder/NetworkDevice.cs
Normal file
2281
EduNetworkBuilder/NetworkDevice.cs
Normal file
File diff suppressed because it is too large
Load Diff
224
EduNetworkBuilder/NetworkLink.cs
Normal file
224
EduNetworkBuilder/NetworkLink.cs
Normal file
@ -0,0 +1,224 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Drawing;
|
||||
using System.Xml;
|
||||
|
||||
|
||||
namespace EduNetworkBuilder
|
||||
{
|
||||
[Serializable]
|
||||
public class NetworkLink : NetworkComponent
|
||||
{
|
||||
HostNicID SrcNic;
|
||||
HostNicID DstNic;
|
||||
public LinkType theLinkType = LinkType.normal;
|
||||
public bool isVisibleLink = true; //False for wireless. Skip drawing a line if it is there
|
||||
|
||||
public NetworkLink(HostNicID source, HostNicID dest, LinkType type = LinkType.normal)
|
||||
{
|
||||
SrcNic = source;
|
||||
DstNic = dest;
|
||||
Network myNet = NB.GetNetwork();
|
||||
myNet.MarkAsLinked(source, GetUniqueIdentifier);
|
||||
myNet.MarkAsLinked(dest, GetUniqueIdentifier);
|
||||
theLinkType = type;
|
||||
}
|
||||
|
||||
public NetworkLink(XmlNode theNode)
|
||||
{
|
||||
IsDirty = true;
|
||||
Load(theNode);
|
||||
}
|
||||
|
||||
public HostNicID Src
|
||||
{
|
||||
get { return SrcNic; }
|
||||
}
|
||||
public HostNicID Dst
|
||||
{
|
||||
get { return DstNic; }
|
||||
}
|
||||
public override void Load(XmlNode theNode)
|
||||
{
|
||||
foreach (XmlNode Individual in theNode.ChildNodes)
|
||||
{
|
||||
XmlNodeType myNodetype = Individual.NodeType;
|
||||
if (myNodetype == XmlNodeType.Element)
|
||||
{
|
||||
switch (Individual.Name.ToLower())
|
||||
{
|
||||
case "srcnic":
|
||||
SrcNic = new HostNicID(Individual);
|
||||
break;
|
||||
case "dstnic":
|
||||
DstNic = new HostNicID(Individual);
|
||||
break;
|
||||
case "hostname":
|
||||
hostname = Individual.InnerText;
|
||||
break;
|
||||
case "linktype":
|
||||
theLinkType = NB.ParseEnum<LinkType>(Individual.InnerText);
|
||||
break;
|
||||
case "uniqueidentifier":
|
||||
int.TryParse(Individual.InnerText,out UniqueIdentifier);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
Network myNet = NB.GetNetwork();
|
||||
myNet.MarkAsLinked(SrcNic, GetUniqueIdentifier);
|
||||
myNet.MarkAsLinked(DstNic, GetUniqueIdentifier);
|
||||
}
|
||||
|
||||
public override void Save(XmlWriter writer)
|
||||
{
|
||||
writer.WriteStartElement("link");
|
||||
SrcNic.Save(writer,"SrcNic");
|
||||
DstNic.Save(writer,"DstNic");
|
||||
writer.WriteElementString("hostname", hostname);
|
||||
writer.WriteElementString("linktype", theLinkType.ToString());
|
||||
writer.WriteElementString("uniqueidentifier", UniqueIdentifier.ToString());
|
||||
writer.WriteEndElement();
|
||||
|
||||
}
|
||||
|
||||
|
||||
public override void Destroy()
|
||||
{
|
||||
Network myNet = NB.GetNetwork();
|
||||
if (myNet != null)
|
||||
{
|
||||
myNet.MarkAsUnlinked(SrcNic, GetUniqueIdentifier);
|
||||
myNet.MarkAsUnlinked(DstNic, GetUniqueIdentifier);
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsSource(int ID)
|
||||
{
|
||||
if (SrcNic.HostID == ID)
|
||||
return true;
|
||||
else return false;
|
||||
}
|
||||
public bool IsDest(int ID)
|
||||
{
|
||||
if (DstNic.HostID == ID)
|
||||
return true;
|
||||
else return false;
|
||||
}
|
||||
//Have func to verify both ends are powered on
|
||||
public bool isLive()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check to see if the link is connected to the specified nic at either end
|
||||
/// </summary>
|
||||
/// <param name="toFind">The unique identifier of the link</param>
|
||||
/// <returns>True if it has it</returns>
|
||||
public bool HasLink(HostNicID toFind)
|
||||
{
|
||||
if (SrcNic.Equals(toFind) || DstNic.Equals(toFind))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public override void Print(Image BaseImage, bool DrawTitle)
|
||||
{
|
||||
//Find the XY of the connected items
|
||||
Network myNet = NB.GetNetwork();
|
||||
NetworkDevice Src = myNet.HostMatchingHostNicID(SrcNic);
|
||||
NetworkDevice Dst = myNet.HostMatchingHostNicID(DstNic);
|
||||
//Draw a line between them
|
||||
if (Src == null || Dst == null) return;
|
||||
|
||||
Point sPoint = Src.GetCenter();
|
||||
Point dPoint = Dst.GetCenter();
|
||||
Pen tPen = new Pen(Color.Black, 4);
|
||||
Graphics.FromImage(BaseImage).DrawLine(tPen,sPoint,dPoint);
|
||||
IsDirty = false; //we have printed, we are no longer dirty.
|
||||
}
|
||||
|
||||
public Point PositionOnLine(nb_direction direction, int Percentage)
|
||||
{
|
||||
Network myNet = NB.GetNetwork();
|
||||
if(Percentage < 0) Percentage =0;
|
||||
if(Percentage > 100) Percentage = 100;
|
||||
NetworkDevice Src = myNet.HostMatchingHostNicID(SrcNic);
|
||||
NetworkDevice Dst = myNet.HostMatchingHostNicID(DstNic);
|
||||
//Draw a line between them
|
||||
if (Src == null || Dst == null)
|
||||
return new Point(-1,-1);
|
||||
|
||||
Point sPoint = Src.GetCenter();
|
||||
Point dPoint = Dst.GetCenter();
|
||||
|
||||
double deltax = (sPoint.X - dPoint.X) / 100.0;
|
||||
double deltay = (sPoint.Y - dPoint.Y) / 100.0;
|
||||
//wearehere; //We need to start at an end. (we need to add sPoint.x, spoint.y depending on which dir we are going)
|
||||
Point answer;
|
||||
if(direction == nb_direction.to_dst)
|
||||
answer = new Point(sPoint.X-(int)(deltax * Percentage), sPoint.Y-(int)(deltay * Percentage));
|
||||
else
|
||||
answer = new Point((int)(deltax * Percentage) + dPoint.X, (int)(deltay * Percentage) + dPoint.Y);
|
||||
return answer;
|
||||
}
|
||||
|
||||
public List<string> UsedNicIDStrings()
|
||||
{
|
||||
List<string> usedLinks = new List<string>();
|
||||
//If the nic is a wireless end point, we should not count it. We can have multiple Nics linked to one AP
|
||||
usedLinks.Add(SrcNic.HostNicIDString);
|
||||
usedLinks.Add(DstNic.HostNicIDString);
|
||||
return usedLinks;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Have the packet traverse the network
|
||||
/// </summary>
|
||||
/// <param name="tPacket"></param>
|
||||
public override void DoMoving(Packet tPacket)
|
||||
{
|
||||
NetworkDevice movingTo = null;
|
||||
Network myNet = NB.GetNetwork();
|
||||
HostNicID target;
|
||||
tPacket.IncrementDistance();
|
||||
if(theLinkType == LinkType.broken && tPacket.myLinkPercent > 50)
|
||||
{
|
||||
//The link is broken. Drop the packet
|
||||
tPacket.Tracking.AddMessage(DebugLevel.info, this, "The packet tried to use a broken network wire and was corrupted.");
|
||||
tPacket.Tracking.Status = "The packet got corrupted and was dropped.";
|
||||
tPacket.MyStatus = PacketStatus.finished_failed;
|
||||
}
|
||||
if(tPacket.Arrived())
|
||||
{
|
||||
//We need to pass it to the recieving device
|
||||
if (tPacket.myDirection == nb_direction.to_dst)
|
||||
{
|
||||
movingTo= myNet.GetDeviceFromID(DstNic.HostID);
|
||||
target = DstNic;
|
||||
}
|
||||
else
|
||||
{
|
||||
movingTo = myNet.GetDeviceFromID(SrcNic.HostID);
|
||||
target = SrcNic;
|
||||
}
|
||||
if(movingTo == null)
|
||||
{
|
||||
tPacket.AddMessage(DebugLevel.info, "Oops! We do not have anything at the end of the network wire. This should not happen!");
|
||||
tPacket.Tracking.Status = hostname + " Nothing at far end of the wire. This should never happen..";
|
||||
tPacket.MyStatus = PacketStatus.finished_failed;
|
||||
}
|
||||
else
|
||||
{
|
||||
movingTo.DoInputFromLink(tPacket, target);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
347
EduNetworkBuilder/OptionsWindow.cs
Normal file
347
EduNetworkBuilder/OptionsWindow.cs
Normal file
@ -0,0 +1,347 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using System.Globalization;
|
||||
using System.Resources;
|
||||
|
||||
|
||||
namespace EduNetworkBuilder
|
||||
{
|
||||
public partial class OptionsWindow : Form
|
||||
{
|
||||
private Network myNet;
|
||||
private ToolTip myToolTip = new ToolTip();
|
||||
Form QuestionForm = new Form();
|
||||
|
||||
private OptionsWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public OptionsWindow(Network theNet)
|
||||
{
|
||||
myNet = theNet;
|
||||
InitializeComponent();
|
||||
myToolTip.SetToolTip(tbItemSize, "The size of an item (switch, PC, etc). Default is 100.");
|
||||
myToolTip.SetToolTip(lblItemSize, "The size of an item (switch, PC, etc). Default is 100.");
|
||||
myToolTip.SetToolTip(tbMessage, "The message given when the network is loaded. Instructions.");
|
||||
myToolTip.SetToolTip(lblNetMessage, "The message given when the network is loaded. Instructions.");
|
||||
myToolTip.SetToolTip(tbNetworkTitle, "The title of the network window.");
|
||||
myToolTip.SetToolTip(lblNetTitle, "The title of the network window.");
|
||||
myToolTip.SetToolTip(lblNetSize, "The height and width of the network graphics area.");
|
||||
myToolTip.SetToolTip(tbNetworkX, "The width of the network window graphics area.");
|
||||
myToolTip.SetToolTip(tbNetworkY, "The Height of the network window graphics area.");
|
||||
myToolTip.SetToolTip(lbTags, "The Tags that this puzzle is saved as (only for puzzles)");
|
||||
myToolTip.SetToolTip(lblTags, "The Tags that this puzzle is saved as (only for puzzles)");
|
||||
myToolTip.SetToolTip(lbTests, "The things that need to be solved before the puzzle is completed.");
|
||||
myToolTip.SetToolTip(lblTests, "The things that need to be solved before the puzzle is completed.");
|
||||
myToolTip.SetToolTip(lblLevel, "The Level that this puzzle is stored in.");
|
||||
myToolTip.SetToolTip(tbLevel, "The Level that this puzzle is stored in.");
|
||||
myToolTip.SetToolTip(lblSortOrder, "How this is sorted within the list of puzzles.");
|
||||
myToolTip.SetToolTip(tbSortOrder, "How this is sorted within the list of puzzles.");
|
||||
|
||||
LoadValuesFromNetwork();
|
||||
}
|
||||
|
||||
private void LanguagifyComponents()
|
||||
{
|
||||
ResourceManager RM = NB.GetResource();
|
||||
CultureInfo CI = NB.GetCulture();
|
||||
Text = NB.Translate("OW_btnDone");
|
||||
Text = NB.Translate("OW_lblNetTitle");
|
||||
Text = NB.Translate("OW_cbDisplayTitles");
|
||||
Text = NB.Translate("OW_lblNetSize");
|
||||
Text = NB.Translate("OW_lblItemSize");
|
||||
Text = NB.Translate("OW_lblNetMessage");
|
||||
Text = NB.Translate("OW_lblTests");
|
||||
Text = NB.Translate("OW_lblTags");
|
||||
Text = NB.Translate("OW_lblLevel");
|
||||
Text = NB.Translate("OW_lblSortOrder");
|
||||
Text = NB.Translate("OW_lblStartingHelp");
|
||||
Text = NB.Translate("OW_Form");
|
||||
}
|
||||
|
||||
|
||||
private void LoadValuesFromNetwork()
|
||||
{
|
||||
tbItemSize.Text = myNet.itemsize.ToString();
|
||||
tbMessage.Text = myNet.NetMessage;
|
||||
tbNetworkTitle.Text = myNet.NetTitle;
|
||||
cbDisplayTitles.Checked = myNet.ShowLabels;
|
||||
tbNetworkX.Text = myNet.myWidth.ToString();
|
||||
tbNetworkY.Text = myNet.myHeight.ToString();
|
||||
tbLevel.Text = myNet.Level.ToString();
|
||||
tbSortOrder.Text = myNet.SortOrder.ToString("00.000");
|
||||
|
||||
lbTests.Items.Clear();
|
||||
string what;
|
||||
foreach(NetTest NT in myNet.NetTests)
|
||||
{
|
||||
what = NT.GetDescription(NetTestVerbosity.full);
|
||||
if (what != "")
|
||||
{
|
||||
lbTests.Items.Add(what);
|
||||
}
|
||||
}
|
||||
lbTags.Items.Clear();
|
||||
myNet.Tags.Sort();
|
||||
foreach (string tag in myNet.Tags)
|
||||
{
|
||||
lbTags.Items.Add(tag);
|
||||
}
|
||||
cbStartingHelpLevel.Items.Clear();
|
||||
foreach (string helplevel in Enum.GetNames(typeof(NetTestVerbosity)))
|
||||
{
|
||||
cbStartingHelpLevel.Items.Add(helplevel);
|
||||
}
|
||||
cbStartingHelpLevel.SelectedItem = myNet.StartingHelpLevel.ToString();
|
||||
|
||||
}
|
||||
|
||||
private void SaveValuesToNetwork()
|
||||
{
|
||||
int.TryParse(tbItemSize.Text, out myNet.itemsize);
|
||||
myNet.NetMessage = tbMessage.Text;
|
||||
myNet.NetTitle = tbNetworkTitle.Text;
|
||||
myNet.ShowLabels = cbDisplayTitles.Checked;
|
||||
int.TryParse(tbNetworkX.Text, out myNet.myWidth);
|
||||
int.TryParse(tbNetworkY.Text, out myNet.myHeight);
|
||||
myNet.InvalidateEverything();
|
||||
int.TryParse(tbLevel.Text, out myNet.Level);
|
||||
double.TryParse(tbSortOrder.Text, out myNet.SortOrder);
|
||||
myNet.StartingHelpLevel = NB.ParseEnum<NetTestVerbosity>(cbStartingHelpLevel.SelectedItem.ToString());
|
||||
}
|
||||
|
||||
private void btnDone_Click(object sender, EventArgs e)
|
||||
{
|
||||
SaveValuesToNetwork();
|
||||
Close();
|
||||
}
|
||||
|
||||
private void lbTests_MouseDoubleClick(object sender, MouseEventArgs e)
|
||||
{
|
||||
//if left-click.
|
||||
//if on an item, edit it
|
||||
//if not on an item, make a new one and edit it
|
||||
NetTest NT;
|
||||
SaveValuesToNetwork();
|
||||
if(lbTests.SelectedIndex != -1)
|
||||
{
|
||||
//Something is selected. Edit it
|
||||
NT = myNet.NetTests[lbTests.SelectedIndex];
|
||||
NT.Edit();
|
||||
}
|
||||
else
|
||||
{
|
||||
//nothing is selected, create new one
|
||||
NT = new NetTest("", "", NetTestType.NeedsDefaultGW);
|
||||
if(NT.Edit())
|
||||
{
|
||||
//Returns true. Something was changed. Save it.
|
||||
myNet.NetTests.Add(NT);
|
||||
}
|
||||
}
|
||||
LoadValuesFromNetwork();
|
||||
}
|
||||
|
||||
private void lbTests_Edit_Click(object sender, EventArgs e)
|
||||
{
|
||||
lbTests_MouseDoubleClick(sender, null);
|
||||
}
|
||||
|
||||
private void lbTests_Add_Click(object sender, EventArgs e)
|
||||
{
|
||||
lbTests.SelectedIndex = -1;
|
||||
lbTests_MouseDoubleClick(sender, null);
|
||||
}
|
||||
|
||||
private void lbTests_Delete_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (lbTests.SelectedIndex >= lbTests.Items.Count) return;
|
||||
if (lbTests.SelectedIndex < 0 ) return;
|
||||
SaveValuesToNetwork();
|
||||
myNet.NetTests.RemoveAt(lbTests.SelectedIndex);
|
||||
LoadValuesFromNetwork();
|
||||
}
|
||||
|
||||
private void lbTests_MouseClick(object sender, MouseEventArgs e)
|
||||
{
|
||||
//see if it is right-click
|
||||
// Add, delete, edit
|
||||
int index = 0;
|
||||
if(e.Button == MouseButtons.Right)
|
||||
{
|
||||
if (lbTests.ContextMenuStrip == null)
|
||||
{
|
||||
lbTests.ContextMenuStrip = new ContextMenuStrip();
|
||||
}
|
||||
lbTests.ContextMenuStrip.Items.Clear();
|
||||
lbTests.ContextMenuStrip.Items.Add("Add");
|
||||
lbTests.ContextMenuStrip.Items[index++].Click += lbTests_Add_Click;
|
||||
lbTests.ContextMenuStrip.Items.Add("Edit");
|
||||
lbTests.ContextMenuStrip.Items[index++].Click += lbTests_Edit_Click;
|
||||
lbTests.ContextMenuStrip.Items.Add("Delete");
|
||||
lbTests.ContextMenuStrip.Items[index++].Click += lbTests_Delete_Click;
|
||||
}
|
||||
}
|
||||
|
||||
private void lbTests_MouseDown(object sender, MouseEventArgs e)
|
||||
{
|
||||
//see if it is right-click
|
||||
// Add, delete, edit
|
||||
int index = 0;
|
||||
if (e.Button == MouseButtons.Right)
|
||||
{
|
||||
if (lbTests.ContextMenuStrip == null)
|
||||
{
|
||||
lbTests.ContextMenuStrip = new ContextMenuStrip();
|
||||
}
|
||||
lbTests.ContextMenuStrip.Items.Clear();
|
||||
lbTests.ContextMenuStrip.Items.Add("Add");
|
||||
lbTests.ContextMenuStrip.Items[index++].Click += lbTests_Add_Click;
|
||||
lbTests.ContextMenuStrip.Items.Add("Edit");
|
||||
lbTests.ContextMenuStrip.Items[index++].Click += lbTests_Edit_Click;
|
||||
lbTests.ContextMenuStrip.Items.Add("Delete");
|
||||
lbTests.ContextMenuStrip.Items[index++].Click += lbTests_Delete_Click;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************/
|
||||
/******* STUFF FOR TAGS *******************************/
|
||||
private void lbTags_Edit_Click(object sender, EventArgs e)
|
||||
{
|
||||
lbTags_MouseDoubleClick(sender, null);
|
||||
}
|
||||
private void lbTags_Add_Click(object sender, EventArgs e)
|
||||
{
|
||||
lbTags.ClearSelected();
|
||||
lbTags_MouseDoubleClick(sender, null);
|
||||
}
|
||||
|
||||
private void lbTags_Delete_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (lbTags.SelectedIndex >= lbTags.Items.Count) return;
|
||||
if (lbTags.SelectedIndex < 0) return;
|
||||
SaveValuesToNetwork();
|
||||
myNet.Tags.RemoveAt(lbTags.SelectedIndex);
|
||||
LoadValuesFromNetwork();
|
||||
}
|
||||
|
||||
private void lbTags_MouseDown(object sender, MouseEventArgs e)
|
||||
{
|
||||
//see if it is right-click
|
||||
// Add, delete, edit
|
||||
int index = 0;
|
||||
if (e.Button == MouseButtons.Right)
|
||||
{
|
||||
if (lbTags.ContextMenuStrip == null)
|
||||
{
|
||||
lbTags.ContextMenuStrip = new ContextMenuStrip();
|
||||
}
|
||||
lbTags.ContextMenuStrip.Items.Clear();
|
||||
lbTags.ContextMenuStrip.Items.Add("Add");
|
||||
lbTags.ContextMenuStrip.Items[index++].Click += lbTags_Add_Click;
|
||||
if (lbTags.SelectedIndex != -1)
|
||||
{
|
||||
lbTags.ContextMenuStrip.Items.Add("Edit");
|
||||
lbTags.ContextMenuStrip.Items[index++].Click += lbTags_Edit_Click;
|
||||
lbTags.ContextMenuStrip.Items.Add("Delete");
|
||||
lbTags.ContextMenuStrip.Items[index++].Click += lbTags_Delete_Click;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private string QuickPrompt(string title, string prompt, string value)
|
||||
{
|
||||
|
||||
QuestionForm.Text = title;
|
||||
Label lbPrompt = new Label();
|
||||
lbPrompt.Text = prompt;
|
||||
lbPrompt.Location = new Point(1, 1);
|
||||
lbPrompt.Size = new Size(200, lbPrompt.Size.Height);
|
||||
|
||||
TextBox Choice = new TextBox();
|
||||
Choice.Text = value;
|
||||
|
||||
Choice.Location = new Point(1, lbPrompt.Location.Y + lbPrompt.Height + 5);
|
||||
|
||||
Button Done = new Button();
|
||||
Done.Click += btnClose_Click;
|
||||
Done.Text = "Done";
|
||||
Done.Location = new Point(1, Choice.Location.Y + Choice.Height + 5);
|
||||
QuestionForm.Controls.Clear();
|
||||
QuestionForm.Controls.Add(Choice);
|
||||
QuestionForm.Controls.Add(Done);
|
||||
QuestionForm.Controls.Add(lbPrompt);
|
||||
QuestionForm.AcceptButton = Done;
|
||||
QuestionForm.FormBorderStyle = FormBorderStyle.FixedDialog;
|
||||
QuestionForm.AutoSize = true;
|
||||
QuestionForm.Height = Done.Location.Y + Done.Height + 5; //This is too small for the form, it autosizes to "big enough"
|
||||
QuestionForm.Width = Choice.Location.X + Choice.Width + 5;
|
||||
QuestionForm.ShowDialog();
|
||||
return Choice.Text;
|
||||
}
|
||||
|
||||
private void btnClose_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (QuestionForm != null)
|
||||
QuestionForm.Close();
|
||||
}
|
||||
|
||||
|
||||
private void lbTags_MouseDoubleClick(object sender, MouseEventArgs e)
|
||||
{
|
||||
//if left-click.
|
||||
//if on an item, edit it
|
||||
//if not on an item, make a new one and edit it
|
||||
SaveValuesToNetwork();
|
||||
string newstring;
|
||||
if (lbTags.SelectedIndex != -1)
|
||||
{
|
||||
//Something is selected. Edit it
|
||||
newstring = QuickPrompt("Edit Tag", "Tag:", myNet.Tags[lbTags.SelectedIndex]);
|
||||
if (newstring != "")
|
||||
{
|
||||
myNet.Tags[lbTags.SelectedIndex] = newstring;
|
||||
}
|
||||
else
|
||||
{
|
||||
myNet.Tags.RemoveAt(lbTags.SelectedIndex);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//nothing is selected, create new one
|
||||
newstring = QuickPrompt("Edit Tag", "Tag:", "");
|
||||
if (newstring != "")
|
||||
{
|
||||
myNet.Tags.Add(newstring);
|
||||
}
|
||||
}
|
||||
LoadValuesFromNetwork();
|
||||
|
||||
}
|
||||
|
||||
private void tbSortOrder_Validating(object sender, CancelEventArgs e)
|
||||
{
|
||||
double value;
|
||||
double.TryParse(tbSortOrder.Text, out value);
|
||||
tbSortOrder.Text = value.ToString("00.000");
|
||||
}
|
||||
|
||||
private void tbLevel_Validating(object sender, CancelEventArgs e)
|
||||
{
|
||||
int value;
|
||||
int.TryParse(tbLevel.Text, out value);
|
||||
tbLevel.Text = value.ToString();
|
||||
}
|
||||
}
|
||||
}
|
456
EduNetworkBuilder/Packet.cs
Normal file
456
EduNetworkBuilder/Packet.cs
Normal file
@ -0,0 +1,456 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Runtime.Serialization.Formatters.Binary;
|
||||
using System.Runtime.Serialization;
|
||||
using System.IO;
|
||||
using System.Drawing;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace EduNetworkBuilder
|
||||
{
|
||||
//This is a network packet that can either contain data, or another packet
|
||||
[Serializable]
|
||||
public class Packet
|
||||
{
|
||||
public PacketType MyType = PacketType.none;
|
||||
public PacketStatus _MyStatus = PacketStatus.processing; //new packets start by being processed by the source device
|
||||
public PacketStatus MyStatus
|
||||
{
|
||||
get { return _MyStatus; }
|
||||
set {
|
||||
_MyStatus = value;
|
||||
if (_MyStatus == PacketStatus.finished_failed || _MyStatus == PacketStatus.finished_ok)
|
||||
{
|
||||
string status = _MyStatus.ToString();
|
||||
PacketDump(" " + status, DebugPausePoint.packet_kill);
|
||||
}
|
||||
if (_MyStatus == PacketStatus.finished_ok)
|
||||
Tracking.Finished = true;
|
||||
}
|
||||
}
|
||||
public int TTL = 20;
|
||||
public int TickTTL = 50;
|
||||
public IPAddress sourceIP;
|
||||
public IPAddress OriginalDestIP;
|
||||
public IPAddress TsourceIP;
|
||||
public IPAddress destIP;
|
||||
public string sourceMAC;
|
||||
public string destMAC;
|
||||
public Packet payloadPacket = null;
|
||||
public string payloadData = ""; //Contains the mac-address, or ip-address string, or something else
|
||||
public string EncryptionString = "";
|
||||
public IPAddress payloadIP = null;
|
||||
public PacketMessage Tracking = new PacketMessage();
|
||||
public NetworkComponent WhereAmI = null;
|
||||
public nb_direction myDirection = nb_direction.none;
|
||||
public int myLinkPercent = 0; //How far along the path are we. 0%, 50%, 100%. For moving a dot along the link line
|
||||
public bool packet_good = true;
|
||||
DateTime StartTime = DateTime.Now;
|
||||
public NetworkCard OutboundNic = null;
|
||||
public NetworkInterface OutboundIF = null;
|
||||
public IPAddress OutboundIP = new IPAddress(NB.ZeroIPString);
|
||||
public string OutboundMAC = "";
|
||||
public string OutboundDestMAC = "";
|
||||
public bool isFresh = false; //Set to be true if the packet is new. Set false as soon as it is processed
|
||||
public bool DebugOn = false;
|
||||
|
||||
public bool ready_to_delete
|
||||
{
|
||||
get {
|
||||
Tracking.duration = DateTime.Now - StartTime;
|
||||
|
||||
if (MyStatus == PacketStatus.finished_failed)
|
||||
{
|
||||
packet_good = false;
|
||||
return true;
|
||||
}
|
||||
if (MyStatus == PacketStatus.finished_ok)
|
||||
{
|
||||
packet_good = true; //It should already be good, but we state it just in case
|
||||
return true;
|
||||
}
|
||||
if (MyStatus == PacketStatus.finished)
|
||||
{
|
||||
packet_good = true; //It should already be good, but we state it just in case
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
public Packet(Packet copyfrom)
|
||||
{
|
||||
MyType = copyfrom.MyType;
|
||||
TTL = copyfrom.TTL;
|
||||
sourceIP = copyfrom.sourceIP;
|
||||
TsourceIP = copyfrom.TsourceIP;
|
||||
destIP = copyfrom.destIP;
|
||||
sourceMAC = copyfrom.sourceMAC;
|
||||
destMAC = copyfrom.destMAC;
|
||||
payloadData = copyfrom.payloadData;
|
||||
payloadPacket = copyfrom.payloadPacket;
|
||||
EncryptionString = copyfrom.EncryptionString;
|
||||
payloadIP = copyfrom.payloadIP;
|
||||
Tracking = copyfrom.Tracking;
|
||||
WhereAmI = copyfrom.WhereAmI;
|
||||
StartTime = copyfrom.StartTime;
|
||||
OriginalDestIP = copyfrom.OriginalDestIP;
|
||||
Tracking.AddMessage(DebugLevel.debug, WhereAmI, "Packet duplicated");
|
||||
}
|
||||
|
||||
//Generate a packet with the given payload.
|
||||
public Packet(NetworkComponent start, string source, string dest, string payload, PacketType theType)
|
||||
{
|
||||
WhereAmI = start;
|
||||
payloadData = payload;
|
||||
MyType = theType;
|
||||
if(theType == PacketType.arp_answer || theType == PacketType.arp_request ||
|
||||
theType == PacketType.dhcp_request || theType == PacketType.dhcp_answer)
|
||||
{
|
||||
sourceMAC = source;
|
||||
destMAC = dest;
|
||||
OutboundDestMAC = dest;
|
||||
Tracking.AddMessage(DebugLevel.info, start, theType.ToString() + "Packet Created");
|
||||
Tracking.AddMessage(DebugLevel.routing, start, " MAC:" + source + " -> " + dest);
|
||||
}
|
||||
else
|
||||
{
|
||||
sourceIP = new IPAddress(source);
|
||||
TsourceIP = new IPAddress(source);
|
||||
destIP = new IPAddress(dest);
|
||||
if (destIP.BroadcastAddress == destIP.GetIP)
|
||||
{
|
||||
destMAC = NB.BroadcastMACString;
|
||||
OutboundDestMAC = destMAC;
|
||||
}
|
||||
Tracking.AddMessage(DebugLevel.info, start, "Packet Created");
|
||||
Tracking.AddMessage(DebugLevel.routing, start, " IP:" + source + " -> " + dest);
|
||||
Tracking.AddMessage(DebugLevel.debug, start, " IPs Translated to" + sourceIP.GetIP.ToIpString() + " -> " + destIP.GetIP.ToIpString());
|
||||
}
|
||||
isFresh = true;
|
||||
}
|
||||
|
||||
public Packet(NetworkComponent start, IPAddress dest, string payload, PacketType theType)
|
||||
{
|
||||
WhereAmI = start;
|
||||
payloadData = payload;
|
||||
MyType = theType;
|
||||
if (theType != PacketType.arp_answer && theType != PacketType.arp_request)
|
||||
{
|
||||
sourceIP = new IPAddress(NB.ZeroIPString);
|
||||
destIP = dest;
|
||||
if (destIP != null && destIP.BroadcastAddress == destIP.GetIP)
|
||||
destMAC = NB.BroadcastMACString;
|
||||
Tracking.AddMessage(DebugLevel.info, start, "Packet Created");
|
||||
Tracking.AddMessage(DebugLevel.routing, start, " IP:" + sourceIP.GetIP.ToIpString() + " -> " + dest.GetIP.ToIpString());
|
||||
}
|
||||
else
|
||||
{
|
||||
sourceIP = new IPAddress(NB.ZeroIPString);
|
||||
destMAC = NB.BroadcastMACString;
|
||||
destIP = dest;
|
||||
Tracking.AddMessage(DebugLevel.info, start, "Packet Created");
|
||||
//Tracking.AddMessage(DebugLevel.routing, start, " IP:" + sourceIP.GetIP.ToIpString() + " -> " + dest.GetIP.ToIpString());
|
||||
}
|
||||
isFresh = true;
|
||||
}
|
||||
|
||||
public Point PacketLocation()
|
||||
{
|
||||
if (NB.GetComponentType(WhereAmI) != GeneralComponentType.link)
|
||||
return new Point(-1,-1);
|
||||
NetworkLink Nl = (NetworkLink)WhereAmI;
|
||||
Point mylocation = Nl.PositionOnLine(myDirection, myLinkPercent);
|
||||
return mylocation;
|
||||
}
|
||||
|
||||
public Rectangle PacketRectangle()
|
||||
{
|
||||
Point start = PacketLocation();
|
||||
int half = NB.PacketPixelSize / 2;
|
||||
return new Rectangle(start.X - half, start.Y - half, NB.PacketPixelSize, NB.PacketPixelSize);
|
||||
}
|
||||
|
||||
public void Print(Image BaseImage)
|
||||
{
|
||||
//we draw a packet on the map
|
||||
Point thePoint = PacketLocation();
|
||||
if (thePoint.X == -1 || thePoint.Y == -1) return; //It is an invalid location
|
||||
Color pencolor = Color.Blue;
|
||||
switch (MyType)
|
||||
{
|
||||
case PacketType.arp_answer:
|
||||
case PacketType.arp_request:
|
||||
pencolor = Color.Green;
|
||||
break;
|
||||
case PacketType.dhcp_answer:
|
||||
case PacketType.dhcp_request:
|
||||
pencolor = Color.Red;
|
||||
break;
|
||||
case PacketType.ping_answer:
|
||||
case PacketType.ping_request:
|
||||
pencolor = Color.Blue;
|
||||
break;
|
||||
case PacketType.tun_packet:
|
||||
pencolor = Color.White;
|
||||
break;
|
||||
case PacketType.vpn_packet:
|
||||
pencolor = Color.Orange;
|
||||
break;
|
||||
}
|
||||
Pen myPen = new Pen(pencolor, NB.PacketPixelSize);
|
||||
Graphics.FromImage(BaseImage).DrawEllipse(myPen, PacketRectangle());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// See if we need to do anything for a packet. If so, do one step in processing it
|
||||
/// </summary>
|
||||
public void ProcessTick()
|
||||
{
|
||||
TickTTL--;
|
||||
switch(MyStatus)
|
||||
{
|
||||
case PacketStatus.processing:
|
||||
//The packet is "inside" the device.
|
||||
// Here we masquerade
|
||||
// Here we route
|
||||
// Here the packet is just about to exit. Maybe we need to set the "source IP"
|
||||
if (NB.PacketVersionNum != 2)
|
||||
{
|
||||
DoProcessing();
|
||||
}
|
||||
else
|
||||
{
|
||||
DoMainProcessing();
|
||||
}
|
||||
break;
|
||||
case PacketStatus.finished_ok:
|
||||
case PacketStatus.finished_failed:
|
||||
break; //we do not have anything to do.
|
||||
case PacketStatus.input: //Just entering a device.
|
||||
case PacketStatus.moving: //Traversing a link
|
||||
DoMoving();
|
||||
break;
|
||||
case PacketStatus.output: //Just leaving a device
|
||||
break;
|
||||
case PacketStatus.waiting_for_arp: //We need to see if the arp information has shown up. If so, we resume
|
||||
if (NB.GetComponentType(WhereAmI) == GeneralComponentType.device)
|
||||
{
|
||||
NetworkDevice ndWhere = (NetworkDevice)WhereAmI;
|
||||
IPAddress dest = ndWhere.DestinationFromIP(destIP);
|
||||
string dMAC = ndWhere.ArpFromIP(dest.GetIP.ToIpString());
|
||||
if (dMAC != "" || destMAC == NB.BroadcastMACString)
|
||||
{
|
||||
MyStatus = PacketStatus.processing;
|
||||
}
|
||||
else
|
||||
{
|
||||
Network MyNet = NB.GetNetwork();
|
||||
if(MyNet.CountPackets(PacketType.arp_answer) + MyNet.CountPackets(PacketType.arp_request) == 0)
|
||||
{
|
||||
//No more arps going. We do not have an answer!
|
||||
Tracking.AddMessage(DebugLevel.info, WhereAmI, "Unable to find a mac address for the IP address: " + dest.GetIP.ToIpString());
|
||||
Tracking.Status = WhereAmI.hostname + " Failed: Unable to find a MAC address for the specified IP.";
|
||||
MyStatus = PacketStatus.finished_failed;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void DoMainProcessing()
|
||||
{
|
||||
//We pass it to the device
|
||||
if (WhereAmI == null)
|
||||
{
|
||||
AddMessage(DebugLevel.debug, "The packet was dropped because we lost where it was. WhereAmI == null!");
|
||||
Tracking.Status = "NO_Host" + " Lost location of packet..";
|
||||
MyStatus = PacketStatus.finished_failed;
|
||||
return; //We cannot process the packet
|
||||
}
|
||||
WhereAmI.ProcessPacket(this);//The device knows how to do the processing
|
||||
}
|
||||
|
||||
private void DoProcessing()
|
||||
{
|
||||
//The packet is "inside" the device.
|
||||
// Here we masquerade
|
||||
// Here we route
|
||||
// Here the packet is just about to exit. Maybe we need to set the "source IP"
|
||||
|
||||
//We need to find out which interface we are leaving.
|
||||
//Then we figure out what rules we need to follow from there
|
||||
//So, we pass the packet to the device to process
|
||||
if (WhereAmI == null)
|
||||
{
|
||||
AddMessage(DebugLevel.debug, "The packet was dropped because we lost where it was. WhereAmI == null!");
|
||||
Tracking.Status = "NO_Host" + " Lost location of packet..";
|
||||
MyStatus = PacketStatus.finished_failed;
|
||||
return; //We cannot process the packet
|
||||
}
|
||||
WhereAmI.DoProcessing(this);//The device knows how to do the processing
|
||||
}
|
||||
|
||||
private void DoMoving()
|
||||
{
|
||||
if (WhereAmI == null)
|
||||
{
|
||||
AddMessage(DebugLevel.debug, "The packet was dropped because we lost where it was. WhereAmI == null!");
|
||||
Tracking.Status = "NO_Host" + " Lost location of packet..";
|
||||
MyStatus = PacketStatus.finished_failed;
|
||||
return; //We cannot process the packet
|
||||
}
|
||||
WhereAmI.DoMoving(this);//The device knows how to do the processing
|
||||
}
|
||||
|
||||
public void ReplaceMessage(PacketMessage Tracker)
|
||||
{
|
||||
Tracking = Tracker; //We do this if we are making a new packet, but tracking it with the old one.
|
||||
//We do this for arp requests.
|
||||
}
|
||||
|
||||
public void StartOnLink(NetworkLink theLink, NetworkDevice start_device)
|
||||
{
|
||||
WhereAmI = theLink;
|
||||
MyStatus = PacketStatus.moving;
|
||||
myLinkPercent = 0;
|
||||
TickTTL = 200; //We keep resetting this as we go.
|
||||
OutboundIF = null;
|
||||
OutboundIP = null;
|
||||
OutboundMAC = "";
|
||||
OutboundNic = null;
|
||||
if (theLink.IsSource(start_device.GetUniqueIdentifier))
|
||||
myDirection = nb_direction.to_dst;
|
||||
else
|
||||
myDirection = nb_direction.to_src;
|
||||
AddMessage(DebugLevel.debug, " Starting on link");
|
||||
}
|
||||
|
||||
public void StartOnDevice(NetworkDevice theDevice)
|
||||
{
|
||||
WhereAmI = theDevice;
|
||||
MyStatus = PacketStatus.processing;
|
||||
myLinkPercent = 0;
|
||||
TickTTL = 200;
|
||||
}
|
||||
|
||||
public void PrepareToDelete()
|
||||
{
|
||||
Network myNet = NB.GetNetwork();
|
||||
if(myNet != null)
|
||||
{
|
||||
if (payloadPacket != null)
|
||||
{
|
||||
payloadPacket.PrepareToDelete();
|
||||
payloadPacket.Tracking.AddMessage(DebugLevel.info, WhereAmI, Tracking.Status);
|
||||
payloadPacket.Tracking.Status = Tracking.Status;
|
||||
payloadPacket.MyStatus = MyStatus;
|
||||
}
|
||||
if(MyType == PacketType.arp_request && MyStatus == PacketStatus.finished_failed)
|
||||
{
|
||||
Tracking.AddMessage(DebugLevel.info, "Packet", "Packet failed to reach any IP. No such IP on network: " + destIP.GetIPString);
|
||||
Tracking.Status = "Packet failed to reach IP: " + destIP.GetIPString;
|
||||
MyStatus = PacketStatus.finished_failed;
|
||||
}
|
||||
if(MyType == PacketType.ping_answer && MyStatus == PacketStatus.finished_failed)
|
||||
{
|
||||
myNet.NoteActionDone(NetTestType.FailedPing, destIP.GetIPString, sourceIP.GetIPString);
|
||||
}
|
||||
if (MyType == PacketType.ping_request && MyStatus == PacketStatus.finished_failed)
|
||||
{
|
||||
myNet.NoteActionDone(NetTestType.FailedPing, sourceIP.GetIPString, destIP.GetIPString);
|
||||
}
|
||||
if (MyStatus != PacketStatus.finished)
|
||||
myNet.AddMessage(Tracking); //We only store finished_failed, and finished_ok
|
||||
}
|
||||
}
|
||||
|
||||
public void AddMessage(DebugLevel tLevel, string tMessage)
|
||||
{
|
||||
Tracking.AddMessage(tLevel, WhereAmI, tMessage);
|
||||
}
|
||||
|
||||
public void IncrementDistance()
|
||||
{
|
||||
myLinkPercent += NB.LinkStep;
|
||||
}
|
||||
|
||||
public bool Arrived()
|
||||
{
|
||||
if (myLinkPercent >= 100)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool isFinshed()
|
||||
{
|
||||
if (_MyStatus == PacketStatus.finished_ok) return true;
|
||||
if (_MyStatus == PacketStatus.finished_failed) return true;
|
||||
if (_MyStatus == PacketStatus.finished_ok) return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
private bool debugIsSet(DebugPausePoint what)
|
||||
{
|
||||
DebugPausePoint SetPoint = NB.GetDebugPauseSetting();
|
||||
if ((SetPoint & what) == what)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
public void PacketDump(string hostname, DebugPausePoint WhereWeAre)
|
||||
{
|
||||
DebugPausePoint WhatIsSet = NB.GetDebugPauseSetting();
|
||||
string position = WhereWeAre.ToString();
|
||||
string sIP = NB.ZeroIPString;
|
||||
string dIP = NB.ZeroIPString;
|
||||
if (sourceIP != null) sIP = sourceIP.GetIPString;
|
||||
if (destIP != null) dIP = destIP.GetIPString;
|
||||
position = Regex.Replace(position, "packet_", "");
|
||||
if ((WhereWeAre & WhatIsSet) != WhereWeAre)
|
||||
return; //We are not set to debug here.
|
||||
if ((WhatIsSet & DebugPausePoint.pause) == DebugPausePoint.pause)
|
||||
{
|
||||
Console.WriteLine("Pausing");
|
||||
}
|
||||
if ((WhatIsSet & DebugPausePoint.dump) == DebugPausePoint.dump)
|
||||
{
|
||||
Console.WriteLine(hostname + ": " + MyType.ToString());
|
||||
Console.Write(hostname + ": " + position + " PACKET: dstIP:" + dIP);
|
||||
Console.WriteLine(" dstMAC:" + destMAC);
|
||||
Console.Write(hostname + ": " + position + " PACKET: srcIP:" + sIP);
|
||||
Console.WriteLine(" srcMAC:" + sourceMAC);
|
||||
Console.WriteLine("---");
|
||||
}
|
||||
AddMessage(DebugLevel.packet, hostname + ": " + position + " PACKET: dstIP:" + dIP + " dstMAC:" + destMAC);
|
||||
AddMessage(DebugLevel.packet, hostname + ": " + position + " PACKET: srcIP:" + sIP + " srcMAC:" + sourceMAC);
|
||||
}
|
||||
|
||||
public static T Clone<T>(T source)
|
||||
{
|
||||
if (!typeof(T).IsSerializable)
|
||||
{
|
||||
throw new ArgumentException("The type must be serializable.", "source");
|
||||
}
|
||||
|
||||
// Don't serialize a null object, simply return the default for that object
|
||||
if (Object.ReferenceEquals(source, null))
|
||||
{
|
||||
return default(T);
|
||||
}
|
||||
|
||||
IFormatter formatter = new BinaryFormatter();
|
||||
Stream stream = new MemoryStream();
|
||||
using (stream)
|
||||
{
|
||||
formatter.Serialize(stream, source);
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
return (T)formatter.Deserialize(stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
110
EduNetworkBuilder/PacketMessage.cs
Normal file
110
EduNetworkBuilder/PacketMessage.cs
Normal file
@ -0,0 +1,110 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Runtime.Serialization.Formatters.Binary;
|
||||
using System.Runtime.Serialization;
|
||||
using System.IO;
|
||||
|
||||
namespace EduNetworkBuilder
|
||||
{
|
||||
/// <summary>
|
||||
/// This tracks everything that happened to a packet in transit
|
||||
/// </summary>
|
||||
///
|
||||
[Serializable]
|
||||
public struct DebugMessage
|
||||
{
|
||||
public DebugLevel WhatLevel;
|
||||
public string HostName;
|
||||
public string Message;
|
||||
public DebugMessage(DebugLevel tLevel, string tHost, string tMessage)
|
||||
{
|
||||
WhatLevel = tLevel;
|
||||
HostName = tHost;
|
||||
Message = tMessage;
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class PacketMessage
|
||||
{
|
||||
List<DebugMessage> Messages = new List<DebugMessage>();
|
||||
public string _Status = ""; //Usually "success" or "failed"
|
||||
public bool Finished = false;
|
||||
public TimeSpan duration;
|
||||
public string Status
|
||||
{
|
||||
get { return _Status; }
|
||||
set { if (!Finished) _Status = value; }
|
||||
}
|
||||
|
||||
public static T Clone<T>(T source)
|
||||
{
|
||||
if (!typeof(T).IsSerializable)
|
||||
{
|
||||
throw new ArgumentException("The type must be serializable.", "source");
|
||||
}
|
||||
|
||||
// Don't serialize a null object, simply return the default for that object
|
||||
if (Object.ReferenceEquals(source, null))
|
||||
{
|
||||
return default(T);
|
||||
}
|
||||
|
||||
IFormatter formatter = new BinaryFormatter();
|
||||
Stream stream = new MemoryStream();
|
||||
using (stream)
|
||||
{
|
||||
formatter.Serialize(stream, source);
|
||||
stream.Seek(0, SeekOrigin.Begin);
|
||||
return (T)formatter.Deserialize(stream);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void AddMessage(DebugLevel tLevel, string tHost, string tMessage)
|
||||
{
|
||||
if(!Finished)
|
||||
Messages.Add(new DebugMessage(tLevel, tHost, tMessage));
|
||||
}
|
||||
|
||||
public void AddMessage(DebugLevel tLevel, NetworkComponent tHost, string tMessage)
|
||||
{
|
||||
string host = "unknown";
|
||||
if (tHost != null)
|
||||
host = tHost.hostname;
|
||||
if(! Finished)
|
||||
Messages.Add(new DebugMessage(tLevel, host, tMessage));
|
||||
}
|
||||
|
||||
public List<string> GetMessagesLike(DebugLevel tLevel)
|
||||
{
|
||||
List<string> answer = new List<string>();
|
||||
string tString;
|
||||
foreach( DebugMessage tmessage in Messages)
|
||||
{
|
||||
if((tmessage.WhatLevel | tLevel) == tLevel)
|
||||
{
|
||||
tString = tmessage.HostName + " \t" + tmessage.WhatLevel.ToString() + "\t" + tmessage.Message;
|
||||
answer.Add(tString);
|
||||
}
|
||||
}
|
||||
return answer;
|
||||
}
|
||||
|
||||
public List<string> GetMessagesSummary()
|
||||
{
|
||||
List<string> answer = new List<string>();
|
||||
string tString;
|
||||
int time = duration.Seconds * 1000 + duration.Milliseconds;
|
||||
tString = time.ToString() + " ms " + Status;
|
||||
answer.Add(tString);
|
||||
return answer;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
91
EduNetworkBuilder/RTFWindow.cs
Normal file
91
EduNetworkBuilder/RTFWindow.cs
Normal file
@ -0,0 +1,91 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
using System.IO;
|
||||
using System.Globalization;
|
||||
using System.Resources;
|
||||
|
||||
|
||||
namespace EduNetworkBuilder
|
||||
{
|
||||
public partial class RTFWindow : Form
|
||||
{
|
||||
public RTFWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
LanguagifyComponents();
|
||||
}
|
||||
/// <summary>
|
||||
/// Used when viewing help from the ? button. This displays network specific help information
|
||||
/// </summary>
|
||||
/// <param name="theHelp"></param>
|
||||
/// <param name="theTests"></param>
|
||||
public RTFWindow(string title, string theHelp, List<NetTest> theTests)
|
||||
{
|
||||
InitializeComponent();
|
||||
LanguagifyComponents();
|
||||
BuilderWindow myWin = (BuilderWindow)Application.OpenForms["BuilderWindow"];
|
||||
if (myWin != null)
|
||||
{
|
||||
StartPosition = FormStartPosition.Manual;
|
||||
Point newlocation = new Point(myWin.Location.X + myWin.Width + 5, myWin.Location.Y);
|
||||
if (newlocation.X > (Screen.PrimaryScreen.Bounds.Width + 5))
|
||||
{
|
||||
newlocation = new Point(Screen.PrimaryScreen.Bounds.Width - 5, newlocation.Y);
|
||||
}
|
||||
Location = newlocation;
|
||||
}
|
||||
System.Drawing.Font currentFont = rtbContent.SelectionFont;
|
||||
Text = title;
|
||||
rtbContent.Text = theHelp;
|
||||
rtbContent.SelectAll();
|
||||
rtbContent.SelectionFont = new Font(
|
||||
currentFont.FontFamily,
|
||||
currentFont.Size + 2, FontStyle.Regular);
|
||||
rtbContent.DeselectAll();
|
||||
}
|
||||
public RTFWindow(RTFWindowContents WhatToShow)
|
||||
{
|
||||
InitializeComponent();
|
||||
LanguagifyComponents();
|
||||
string currentDir = Directory.GetCurrentDirectory();
|
||||
string myRTF;
|
||||
if (WhatToShow == RTFWindowContents.help)
|
||||
{
|
||||
myRTF = Properties.Resources.Help;
|
||||
rtbContent.Rtf = myRTF;
|
||||
}
|
||||
else if (WhatToShow == RTFWindowContents.about)
|
||||
{
|
||||
myRTF = Properties.Resources.about;
|
||||
rtbContent.Rtf = myRTF;
|
||||
}
|
||||
else if (WhatToShow == RTFWindowContents.release_notes)
|
||||
{
|
||||
myRTF = Properties.Resources.ReleaseNotes;
|
||||
rtbContent.Rtf = myRTF;
|
||||
}
|
||||
}
|
||||
|
||||
private void LanguagifyComponents()
|
||||
{
|
||||
ResourceManager RM = NB.GetResource();
|
||||
CultureInfo CI = NB.GetCulture();
|
||||
Text = NB.Translate("RTFW_rtbContent");
|
||||
Text = NB.Translate("RTFW_btnOK");
|
||||
Text = NB.Translate("RTFW_Form");
|
||||
}
|
||||
|
||||
private void btnOK_Click(object sender, EventArgs e)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
107
EduNetworkBuilder/pullLanguageInfo.pl
Normal file
107
EduNetworkBuilder/pullLanguageInfo.pl
Normal file
@ -0,0 +1,107 @@
|
||||
#!/bin/perl
|
||||
#
|
||||
$filedir="Resources/languages/";
|
||||
$langfile="edustrings.resx";
|
||||
|
||||
sub parse_file
|
||||
{
|
||||
my $filename = "@_";
|
||||
my $front = $filename;
|
||||
my %items;
|
||||
my $program = $filename;
|
||||
|
||||
$program =~ s/\..*//g;
|
||||
$front =~ s/\..*//g;
|
||||
$front =~ s/[a-z]//g;
|
||||
$front = "${front}_";
|
||||
#print "$filename\n";
|
||||
#print "$front\n";
|
||||
my $count=0;
|
||||
if ( -f $filename )
|
||||
{
|
||||
open(INFILE, $filename);
|
||||
while ( <INFILE> )
|
||||
{
|
||||
if(/([^.]*)\.Text = (.*)$/)
|
||||
{
|
||||
$var=$1;
|
||||
$text=$2;
|
||||
|
||||
$var=~ s/ *//g;
|
||||
if($var eq "this") { $var="Form"};
|
||||
$item=$var;
|
||||
$var="$front$var";
|
||||
|
||||
$text=~ s/[";]//g;
|
||||
$text=~ s/\r//g;
|
||||
$text=~ s/\n//g;
|
||||
#print "Var: $var Text: $text\n";
|
||||
#now we process them. If it does not exist yet, make an entry for it.
|
||||
if(!exists($existing{$var}))
|
||||
{
|
||||
#print("var $key item $items{$key}\n");
|
||||
print EDUFILE (' <data name="' . $var . '" xml:space="preserve">' . "\r\n");
|
||||
printf EDUFILE (' <value>%s</value>%s',$text,"\n");
|
||||
printf EDUFILE (' <comment>%s</comment>%s',"$program $item = $text","\n");
|
||||
print EDUFILE (" </data>\n");
|
||||
|
||||
if($count == 0)
|
||||
{
|
||||
print CFILE "$program\n";
|
||||
print CFILE "private void LanguagifyComponents()
|
||||
{
|
||||
ResourceManager RM = NB.GetResource();
|
||||
CultureInfo CI = NB.GetCulture();\n"
|
||||
}
|
||||
if($item == "Form")
|
||||
{
|
||||
print CFILE ("Text = RM.GetString(\"$var\", CI);\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
print CFILE ("$item.Text = RM.GetString(\"$var\", CI);\n");
|
||||
}
|
||||
$count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
close INFILE;
|
||||
if($count > 0)
|
||||
{
|
||||
print CFILE ("}\n\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
print "$filename does not exist\n";
|
||||
}
|
||||
}
|
||||
|
||||
#Read the language file to see what already exists.
|
||||
$tfile="$filedir/$langfile";
|
||||
open (IFILE, $tfile) or die "$tfile does not exist.";
|
||||
while ( <IFILE> )
|
||||
{
|
||||
if(/data name="([^"]*)"/)
|
||||
{
|
||||
$tag=$1;
|
||||
#print("TAG: $tag\n");
|
||||
$existing{$tag}="here";
|
||||
}
|
||||
}
|
||||
close(IFILE);
|
||||
|
||||
open(EDUFILE, ">add2edustrings.txt");
|
||||
open(CFILE, ">add2cfiles.txt");
|
||||
|
||||
#parse the various Designer files and process them
|
||||
my @files = glob("*.Designer.cs");
|
||||
foreach my $file (@files)
|
||||
{
|
||||
print "$file\n";
|
||||
parse_file( $file );
|
||||
}
|
||||
|
||||
|
||||
close(CFILE);
|
||||
close(EDUFILE);
|
Loading…
Reference in New Issue
Block a user