diff --git a/EduNetworkBuilder/EduNetworkBuilder.csproj b/EduNetworkBuilder/EduNetworkBuilder.csproj
index 12d3c2d..8153365 100644
--- a/EduNetworkBuilder/EduNetworkBuilder.csproj
+++ b/EduNetworkBuilder/EduNetworkBuilder.csproj
@@ -119,6 +119,7 @@
ListBoxWindow.cs
+
diff --git a/EduNetworkBuilder/NB.cs b/EduNetworkBuilder/NB.cs
index 7e5608b..8d3be1c 100644
--- a/EduNetworkBuilder/NB.cs
+++ b/EduNetworkBuilder/NB.cs
@@ -379,6 +379,8 @@ namespace EduNetworkBuilder
public static int NormalRotation = 5;
public static int PacketDamageDistance = 25;
+ public static int InvalidVLAN = -999; //What we return when it is invalid
+
public static bool DebugActions = false;
public static bool DebugTests = false;
@@ -934,6 +936,46 @@ namespace EduNetworkBuilder
return tbEvent.Text;
}
+ public static string ComboBoxPromptBox(string title, string prompt, List Options, string value)
+ {
+ Form QuestionForm = new Form();
+ QuestionForm.Text = title;
+ Label lbPrompt = new Label();
+ lbPrompt.Text = prompt;
+ lbPrompt.Location = new Point(1, 1);
+ lbPrompt.Size = new Size(200, lbPrompt.Size.Height);
+
+ ComboBox Choice = new ComboBox();
+ List tlist = new List();
+ foreach (string tstring in Options)
+ {
+ Choice.Items.Add(tstring);
+ }
+
+ if (value != "" && Choice.Items.Contains(value))
+ {
+ Choice.SelectedItem = value;
+ }
+ Choice.Location = new Point(1, lbPrompt.Location.Y + lbPrompt.Height + 5);
+
+ Button Done = new Button();
+ Done.Click += (s, g) => { Button b = (Button)s; Form f = (Form)b.Parent; f.Close(); };
+ Choice.DoubleClick += (s, g) => { Button b = (Button)s; Form f = (Form)b.Parent; Choice.SelectedIndex = -1; f.Close(); }; ;
+ Done.Text = NB.Translate("_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();
+ if (Choice.SelectedIndex >= 0) return Choice.SelectedItem.ToString();
+ return "";
+ }
public static Dictionary CheckPromptBox(Dictionary Checks)
{
diff --git a/EduNetworkBuilder/NetworkBuilder.cs b/EduNetworkBuilder/NetworkBuilder.cs
index c9400ae..45b93bb 100644
--- a/EduNetworkBuilder/NetworkBuilder.cs
+++ b/EduNetworkBuilder/NetworkBuilder.cs
@@ -919,6 +919,12 @@ namespace EduNetworkBuilder
pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("_Delete"));
pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkView_Delete_Click;
+ if(!myNetwork.LoadedFromResource)
+ {
+ pbNetworkView.ContextMenuStrip.Items.Add(NB.Translate("NB_Renumber"));
+ pbNetworkView.ContextMenuStrip.Items[index++].Click += pbNetworkRenumber;
+ }
+
//We can color-code multiple items
if (myNetwork.VLANsEnabled)
{
@@ -1129,6 +1135,101 @@ namespace EduNetworkBuilder
}
+ ///
+ /// Try to renumber a chunk of a network
+ ///
+ ///
+ ///
+ private void pbNetworkRenumber(object sender, EventArgs e)
+ {
+ //come up with a plan
+ // sort items by type
+ // loop through the items
+ // come up with the numbers we want to use
+ // Decide which nics to change
+ // On a router, find the nic that is connected to other items in the list
+ // On other devices, find first nic that is connected that is not DHCP
+ // track hostname, nicname, ip_address
+ //print out a list of what we are going to do
+ //Ask if we want to do it. Yes/No
+ //do it
+ if (ItemsSelected.Count > 0)
+ {
+ int ChosenVlanID = 1;
+ if(myNetwork != null && myNetwork.VLANsEnabled)
+ {
+ List vnames = new List();
+ foreach(VLANName vn in myNetwork.VlanNames)
+ {
+ vnames.Add(vn.Name);
+ }
+ string ChosenVlanName = "";
+ if (vnames.Count > 0) ChosenVlanName = vnames[0]; //Usually "Default"
+ if (vnames.Count > 1)
+ {
+ //we need to prompt
+ ChosenVlanName = NB.ComboBoxPromptBox(NB.Translate("NB_ChooseVLANRenumberTitle"), NB.Translate("NB_ChooseVLANRenumber"), vnames, vnames[0]);
+ }
+ ChosenVlanID = myNetwork.VLANIDFromName(ChosenVlanName);
+ }
+
+ NB_IPAddress prompted = new NB_IPAddress("192.168.1.0","255.255.255.0","192.168.1.1");
+
+ IPAddressEntry IPE = new IPAddressEntry(prompted, null, this, false);
+
+ //This next entry should never happen.
+ if (ItemsSelected.Count < 2)
+ {
+ MessageBox.Show("You need to have more items selected");
+ return;
+ }
+
+ //Read in the settings we will use
+ IPE.ShowAsSubnetGateway();
+
+ //pull out the gateway address
+ NB_IPAddress gw = new NB_IPAddress(prompted.GetGateway.ToIpString(), prompted._mask.ToIpString(),IPAddressType.gw);
+
+ //pull out the network address
+ NB_IPAddress network = new NB_IPAddress(prompted.NetworkAddress.ToIpString(), prompted._mask.ToIpString(), IPAddressType.gw);
+
+ //We need to find the gateway device. If no such device exists, find the most likely candidate
+ string gateway_name = myNetwork.ReverseDNSLookup(ItemsSelected[0],gw);
+
+ NetworkDevice gwDevice = myNetwork.DeviceFromName(gateway_name);
+ if(gwDevice == null)
+ {
+ //Make a list of possibilities
+ //Prompt user to select one of them
+ List gwdevices = new List();
+ for (int i = ItemsSelected.Count - 1; i >= 0; i--)
+ {
+ if (ItemsSelected[i].RoutesPackets()) gwdevices.Add(ItemsSelected[i]);
+ }
+ if (gwdevices.Count == 1) gwDevice = gwdevices[0];
+ else
+ {
+ //We need to prompt which device
+ List names = new List();
+ foreach(NetworkDevice one in gwdevices)
+ {
+ names.Add(one.hostname);
+ }
+ names.Sort();
+ gateway_name = NB.ComboBoxPromptBox(NB.Translate("_Gateway"), NB.Translate("NB_ChooseGateway"), names, names[0]);
+ gwDevice = myNetwork.DeviceFromName(gateway_name);
+ }
+ }
+ if (gwDevice == null) return; //No gateway device selected
+
+ //If we get here, we have a gateway and a list of items to renumber.
+ for (int i = ItemsSelected.Count - 1; i >= 0; i--)
+ {
+ }
+ }
+
+ }
+
private void pbNetworkView_Hide_Click(object sender, EventArgs e)
{
if (ItemClickedOn != null)
diff --git a/EduNetworkBuilder/NetworkDevice.cs b/EduNetworkBuilder/NetworkDevice.cs
index 310c24a..ef620f2 100644
--- a/EduNetworkBuilder/NetworkDevice.cs
+++ b/EduNetworkBuilder/NetworkDevice.cs
@@ -35,7 +35,7 @@ namespace EduNetworkBuilder
public bool IsBurned = false;
public Color BackgroundColor = Color.Empty;
protected Color MorphColor = Color.Empty;
- public List FirewallRules = new List();
+ public List FirewallRules = new List();
public bool PowerOff = false;
private List tracertmessages = new List();
public int BadSprayCount = 0;
@@ -49,7 +49,7 @@ namespace EduNetworkBuilder
myType = what;
SetImageFromType(what);
- NetworkCard tnic = new NetworkCard(0,GetUniqueIdentifier,hostname,NicType.lo);
+ NetworkCard tnic = new NetworkCard(0, GetUniqueIdentifier, hostname, NicType.lo);
NICs.Add(tnic);
if (what == NetworkComponentType.net_switch || what == NetworkComponentType.net_hub)
{
@@ -58,7 +58,7 @@ namespace EduNetworkBuilder
tnic = new NetworkCard(0, GetUniqueIdentifier, hostname, NicType.management_interface);
NICs.Add(tnic);
}
- for(int looper=1; looper < 8; looper++)
+ for (int looper = 1; looper < 8; looper++)
{
tnic = new NetworkCard(looper, GetUniqueIdentifier, hostname, NicType.port);
NICs.Add(tnic);
@@ -71,16 +71,16 @@ namespace EduNetworkBuilder
tnic = new NetworkCard(0, GetUniqueIdentifier, hostname);
NICs.Add(tnic);
}
- if(what == NetworkComponentType.router)
+ if (what == NetworkComponentType.router)
{
tnic = new NetworkCard(1, GetUniqueIdentifier, hostname);
NICs.Add(tnic);
}
//**********Wireless***********
//Add a wireless network card to laptops, wireless bridge and wireless repeater
- if (what == NetworkComponentType.laptop )
+ if (what == NetworkComponentType.laptop)
{
- tnic = new NetworkCard(NICs.Count(), GetUniqueIdentifier, hostname,NicType.wlan); //Add a wireless nic
+ tnic = new NetworkCard(NICs.Count(), GetUniqueIdentifier, hostname, NicType.wlan); //Add a wireless nic
tnic.UsesDHCP = true;
NICs.Add(tnic);
}
@@ -161,8 +161,8 @@ namespace EduNetworkBuilder
NICs.Add(tnic);
//Add one wan port
tnic = new NetworkCard(0, GetUniqueIdentifier, hostname, NicType.wan);
- NICs.Insert(1,tnic); //Make this first in the list
- }
+ NICs.Insert(1, tnic); //Make this first in the list
+ }
if (what == NetworkComponentType.cellphone || what == NetworkComponentType.tablet)
{
NICs.Clear();
@@ -179,9 +179,9 @@ namespace EduNetworkBuilder
public int CountNics(NicType TheType)
{
int count = 0;
- foreach(NetworkCard nic in NICs)
+ foreach (NetworkCard nic in NICs)
{
- if(nic.GetNicType == TheType)
+ if (nic.GetNicType == TheType)
{
count++;
}
@@ -197,7 +197,7 @@ namespace EduNetworkBuilder
string tname = TheType.ToString() + count.ToString();
foreach (NetworkCard nic in NICs)
{
- if(nic.NicName() == tname)
+ if (nic.NicName() == tname)
{
found = true;
break;
@@ -236,7 +236,7 @@ namespace EduNetworkBuilder
CanAddNics = true;
setNicsCanUseDHCP(false);
}
- if (myType == NetworkComponentType.pc || myType == NetworkComponentType.laptop ||
+ if (myType == NetworkComponentType.pc || myType == NetworkComponentType.laptop ||
myType == NetworkComponentType.copier || myType == NetworkComponentType.printer ||
myType == NetworkComponentType.tablet || myType == NetworkComponentType.cellphone)
{
@@ -276,7 +276,7 @@ namespace EduNetworkBuilder
private void setNicsCanUseDHCP(bool CanUse)
{
- foreach(NetworkCard nic in NICs)
+ foreach (NetworkCard nic in NICs)
{
//if the device must use DHCP. we set it here.
if (MustUseDHCP && nic.CanUseDHCP)
@@ -355,37 +355,37 @@ namespace EduNetworkBuilder
NetworkLink nl;
if (myNet != null)
{
- foreach(NetworkCard nic in NICs)
- {
- if(nic.ConnectedLink != -1)
- {
+ foreach (NetworkCard nic in NICs)
+ {
+ if (nic.ConnectedLink != -1)
+ {
nl = myNet.GetLinkFromID(nic.ConnectedLink);
- if(nl != null)
+ if (nl != null)
{
myNet.RemoveComponent(nl);
nl.Destroy();
}
nic.ConnectedLink = -1;
- }
- }
+ }
+ }
}
}
public void EditGateway(Form ParentForm)
{
- DefaultGW.Edit(this,ParentForm,NB.Translate("ND_EdtGteway"));
+ DefaultGW.Edit(this, ParentForm, NB.Translate("ND_EdtGteway"));
}
public NB_IPAddress GetGateway()
{
- if(!HasNonDHCPConnected() && CanUseDHCP)
- {
- foreach(NetworkCard nic in NICs)
+ if (!HasNonDHCPConnected() && CanUseDHCP)
+ {
+ foreach (NetworkCard nic in NICs)
{
- if(nic.UsesDHCP)
+ if (nic.UsesDHCP)
{
List tlist = nic.IPAddressList();
- if(tlist.Count > 0)
+ if (tlist.Count > 0)
{
NB_IPAddress newIP = new NB_IPAddress(tlist[0].GetGateway.ToIpString());
return newIP;
@@ -422,7 +422,7 @@ namespace EduNetworkBuilder
XmlNodeType myNodetype = Individual.NodeType;
if (myNodetype == XmlNodeType.Element)
{
- switch(Individual.Name.ToLower())
+ switch (Individual.Name.ToLower())
{
case "location":
string[] pointstr = Individual.InnerText.Split(',');
@@ -450,13 +450,13 @@ namespace EduNetworkBuilder
newNic = new NetworkCard(Individual);
//if (myType == NetworkComponentType.wap && newNic.GetNicType == NicType.eth)
//{
- // //This happened once upon a time. Waps did not have management interfaces.
- // //Make a management interface for the wap and move the IP from the eth to that.
- // //Then, change the nic to a port instead of an eth.
- // NetworkCard tNic = new NetworkCard(newNic);
- // tNic.ChangeType(NicType.management_interface);
- // NICs.Add(tNic);
- // newNic.ChangeType(NicType.port);
+ // //This happened once upon a time. Waps did not have management interfaces.
+ // //Make a management interface for the wap and move the IP from the eth to that.
+ // //Then, change the nic to a port instead of an eth.
+ // NetworkCard tNic = new NetworkCard(newNic);
+ // tNic.ChangeType(NicType.management_interface);
+ // NICs.Add(tNic);
+ // newNic.ChangeType(NicType.port);
//}
NICs.Add(newNic);
break;
@@ -474,7 +474,7 @@ namespace EduNetworkBuilder
bool.TryParse(Individual.InnerText, out isDHCPServer);
break;
case "dhcprange":
- NB_IPAddress dhcpip = new NB_IPAddress(Individual);
+ NB_IPAddress dhcpip = new NB_IPAddress(Individual);
DHCPRanges.Add(dhcpip);
break;
case "hasadvfirewall":
@@ -510,13 +510,13 @@ namespace EduNetworkBuilder
writer.WriteElementString("mytype", myType.ToString());
writer.WriteElementString("isdns", isDNSServer.ToString());
writer.WriteElementString("isdhcp", isDHCPServer.ToString());
- if(IsBurned)
+ if (IsBurned)
writer.WriteElementString("isburned", IsBurned.ToString());
if (HasAdvFirewall)
writer.WriteElementString("hasadvfirewall", HasAdvFirewall.ToString());
- if (MorphColor != Color.Empty)
+ if (MorphColor != Color.Empty)
writer.WriteElementString("morphcolor", MorphColor.Name);
- if(PowerOff == true)
+ if (PowerOff == true)
writer.WriteElementString("poweroff", PowerOff.ToString());
if (isInvisible == true)
writer.WriteElementString("isinvisible", isInvisible.ToString());
@@ -584,21 +584,21 @@ namespace EduNetworkBuilder
return NB.Translate("ND_MicrowaveTooltip");
foreach (NetworkCard nic in NICs)
{
- if (nic.GetNicType == NicType.wport || nic.GetNicType == NicType.port)
+ if (nic.GetNicType == NicType.wport || nic.GetNicType == NicType.port)
continue;
- foreach(string addr in nic.IPAddresses())
+ foreach (string addr in nic.IPAddresses())
{
- answer += System.Environment.NewLine + addr;
+ answer += System.Environment.NewLine + addr;
}
}
- if(BackgroundColor != Color.Empty)
+ if (BackgroundColor != Color.Empty)
{
//There is something wrong with it?
Network myNet = NB.GetNetwork();
List DeviceMessages = myNet.GetTestMessages(hostname);
foreach (string tString in DeviceMessages)
{
- answer += System.Environment.NewLine + tString;
+ answer += System.Environment.NewLine + tString;
}
}
return answer;
@@ -607,18 +607,18 @@ namespace EduNetworkBuilder
public List ListOfConnectedHosts()
{
List thelist = new List();
- foreach(NetworkCard nic in NICs)
+ foreach (NetworkCard nic in NICs)
{
- if(nic.ConnectedLink != -1)
+ if (nic.ConnectedLink != -1)
{
Network myNet = NB.GetNetwork();
NetworkLink Link = myNet.GetLinkFromID(nic.ConnectedLink);
- if(Link != null)
+ if (Link != null)
{
NetworkDevice tmp = myNet.GetDeviceFromID(Link.Src);
if (tmp == null) continue;
if (tmp.hostname != hostname) thelist.Add(tmp.hostname);
- tmp = myNet.GetDeviceFromID(Link.Dst);
+ tmp = myNet.GetDeviceFromID(Link.Dst);
if (tmp.hostname != hostname) thelist.Add(tmp.hostname);
}
}
@@ -662,7 +662,7 @@ namespace EduNetworkBuilder
List ConnectedTo()
{
List connected = new List();
- foreach(NetworkCard nic in NICs)
+ foreach (NetworkCard nic in NICs)
{
NetworkDevice nd = ConnectedTo(nic);
if (nd != null) connected.Add(nd);
@@ -702,6 +702,139 @@ namespace EduNetworkBuilder
return nic.ConnectedTo();
}
+ public int VLANFromNIF(NetworkInterface nif)
+ {
+ if (DoesVLANs())
+ {
+ //This device itself does vlans
+ int vlan = nif.GetUntaggedVLAN();
+ if (vlan != NB.InvalidVLAN)
+ {
+ return vlan;
+ }
+ }
+ if (nif == null) return NB.InvalidVLAN;
+ NetworkCard nic = NicFromID(nif.AttachedToHostNic);
+ if (nic == null) return NB.InvalidVLAN; //Nothing
+ return VLANFromNIC(nic);
+ }
+
+ public int VLANFromNIC(NetworkCard nic)
+ {
+ int vlan = NB.InvalidVLAN;
+ if (DoesVLANs())
+ {
+ foreach (NetworkInterface nif in nic.interfaces)
+ {
+ int tvlan = VLANFromNIF(nif);
+ if (tvlan != NB.InvalidVLAN)
+ {
+ if (vlan != NB.InvalidVLAN && vlan != tvlan)
+ return NB.InvalidVLAN; //We have multiple VLANs defined on this nic. Cannot determine it from the nic. Need to look using nif
+ vlan = tvlan;
+ }
+ }
+ return vlan;
+ }
+ //If the device does not do vlans, we need to trace the wire to the device.
+ NetworkDevice FarEnd = ConnectedTo(nic);
+ if (FarEnd == null) return NB.InvalidVLAN; //Nothing connected to this link
+
+ //if it is a switch or wrouter(does vlans), return vlan for the device
+ if (FarEnd.myType == NetworkComponentType.net_switch || FarEnd.myType == NetworkComponentType.wrouter)
+ return FarEnd.VLANFromSwitchPort(hostname);
+ //if it is a hub, return invalid
+ if (FarEnd.myType == NetworkComponentType.net_hub)
+ return NB.InvalidVLAN;
+ //if it is a wireless device, find the vlan the device is attached to.
+ if (FarEnd.IsWirelessForwarder())
+ {
+ return FarEnd.PrimaryVLAN();
+ }
+ return NB.InvalidVLAN;
+ }
+
+ ///
+ /// Used by PrimaryVLAN
+ ///
+ ///
+ ///
+ private int ProcessVLANlist(List tList)
+ {
+ int VLAN = NB.InvalidVLAN;
+ int tvlan = NB.InvalidVLAN;
+ foreach(NetworkCard nic in tList)
+ {
+ tvlan = VLANFromNIC(nic);
+ if(VLAN != NB.InvalidVLAN && tvlan != VLAN)
+ {
+ //We have multiple VLANs defined on these nics. We do not know what is primary
+ return NB.InvalidVLAN;
+ }
+ VLAN = tvlan;
+ }
+ return VLAN;
+ }
+ ///
+ /// Return the primary vlan of the device.
+ ///
+ ///
+ public int PrimaryVLAN()
+ {
+ int tVLAN;
+ List Connections;
+
+ Connections = NICsFromTypeNic(NicType.management_interface);
+ tVLAN = ProcessVLANlist(Connections);
+ if (tVLAN != NB.InvalidVLAN) return tVLAN;
+
+ //Connections = NICsFromTypeNic(NicType.wan); //If the device has a wan vlan defined
+ //tVLAN = ProcessVLANlist(Connections);
+ //if (tVLAN != NB.InvalidVLAN) return tVLAN;
+
+ Connections = NICsFromTypeNic(NicType.eth);
+ tVLAN = ProcessVLANlist(Connections);
+ if (tVLAN != NB.InvalidVLAN) return tVLAN;
+
+ Connections = NICsFromTypeNic(NicType.wlan);
+ tVLAN = ProcessVLANlist(Connections);
+ if (tVLAN != NB.InvalidVLAN) return tVLAN;
+
+ return NB.InvalidVLAN;
+ }
+
+ ///
+ /// On a switch, return the vlan that hostname is attached to. Returns invalid if not found on this switch
+ ///
+ /// the hostname of the device
+ /// nb.invalid if it is not attached to this switch, or if this is not a switch
+ public int VLANFromSwitchPort(string hostname)
+ {
+ if (myType == NetworkComponentType.net_hub) return NB.InvalidVLAN; //Hubs do not know what vlan they are on
+ if(myType == NetworkComponentType.net_switch || myType == NetworkComponentType.wrouter)
+ {
+ //We want to find the port the hostname is on.
+ foreach(NetworkCard nic in NICs)
+ {
+ NetworkDevice FarEnd = ConnectedTo(nic); //Get the device at the far end
+ if (FarEnd == null) continue;
+ if(FarEnd.hostname == hostname)
+ {
+ //This is the port the host is on
+ return VLANFromNIC(nic);
+ }
+ }
+ }
+ return NB.InvalidVLAN;
+ }
+
+ public int VLANFromIP(string ip)
+ {
+ NetworkInterface nif = InterfaceFromIP(ip);
+ if (nif == null) return NB.InvalidVLAN; //Nothing
+ return VLANFromNIF(nif);
+ }
+
///
/// Check to see if the device has a link to the specified host
///
@@ -1211,6 +1344,32 @@ namespace EduNetworkBuilder
}
return null;
}
+
+ public NetworkInterface InterfaceFromIP(string IP)
+ {
+ foreach (NetworkCard nic in NICs)
+ {
+ foreach (NetworkInterface nif in nic.interfaces)
+ {
+ if (nif.myIP.GetIPString == IP)
+ return nif;
+ }
+ }
+ return null;
+ }
+
+ public NetworkCard NicFromIP(string IP)
+ {
+ foreach (NetworkCard nic in NICs)
+ {
+ foreach(NetworkInterface nif in nic.interfaces)
+ {
+ if (nif.myIP.GetIPString == IP)
+ return nic;
+ }
+ }
+ return null;
+ }
public NetworkCard NicFromID(HostNicID ID)
{
return NicFromID(ID.NicID);
@@ -2837,6 +2996,19 @@ namespace EduNetworkBuilder
return null;
}
+ private List NICsFromTypeNic(NicType What)
+ {
+ List tList = new List();
+ foreach (NetworkCard nic in NB.Randomize(NICs).ToList())
+ {
+ if (nic.GetNicType == What)
+ {
+ tList.Add(nic);
+ }
+ }
+ return tList;
+ }
+
public NB_IPAddress BestIPForThis(NetworkDevice Source=null)
{
NB_IPAddress answer=null;