Ejemplo n.º 1
0
        private void CalculateEdgeText(CDPDataSet ds)
        {
            var  edges = from row in ds.Neighbours where ((row.Parent_ID == Source_ID) & (row.Neighbor_ID == Target_ID)) select row;
            bool check = true;

            if (edges.Count() > 1)
            {
                ConnectionText = "Multiple Connection";
                line_color     = "RGB(255,0,0)";
                check          = false;
            }

            foreach (var thisEdge in edges)
            {
                string source_name = ds.Devices.FindByID(Source_ID).Name;
                string target_name = thisEdge.Name;
                Source_Interfaces.Add(thisEdge.Local_Interface);
                Target_Interafecs.Add(thisEdge.Neighbour_Interface);
                if (check)
                {
                    ConnectionText = string.Format("{0} - {1}\r\n{2} - {3}", DottedNameSpace.TLD(source_name), thisEdge.Local_Interface, DottedNameSpace.TLD(target_name), thisEdge.Neighbour_Interface);
                    line_color     = "RGB(0,128,0)";
                }
            }
        }
Ejemplo n.º 2
0
 private void CalculateWeight(CDPDataSet ds)
 {
     if (ds.Devices.Count() < 5)
     {
         if (ConnectionText.IndexOf("Multiple Connection") >= 0)
         {
             line_weight = "5pt";
             TextSize    = 10;
         }
         else
         {
             line_weight = "2pt";
             TextSize    = 8;
         }
     }
     else
     {
         if (ConnectionText.IndexOf("Multiple Connection") >= 0)
         {
             line_weight = "1pt";
             TextSize    = 6;
         }
         else
         {
             line_weight = "1pt";
             TextSize    = 5;
         }
     }
 }
Ejemplo n.º 3
0
        public void Initialize(IScriptExecutorBase Executor)
        {
            DebugEx.WriteLine("Initializing PGTNetworkDiscovery CustomActionHandler... ", DebugLevel.Informational);
            _terminated   = false;
            local_dataset = new CDPDataSet();
            local_dataset.Clear();
            ScriptSettings = SettingsManager.GetCurrentScriptSettings();
            Guid engineID = Executor.EngineID;

            // search an existing inventory file and load. used later for checking domain boundary
            InventoryFileName = string.Format("{0}{1}{2}.xml", Helper.GetWorkingDirectory(), Options.Default.InventoryDBDirectory, engineID.ToString());
            DebugEx.WriteLine(string.Format("Checking for pre-existing inventory file {0}... ", InventoryFileName), DebugLevel.Informational);
            if (File.Exists(InventoryFileName))
            {
                try
                {
                    local_dataset.ReadXml(InventoryFileName);
                    InventoryPreProvisioned = true;
                    AllowRecursion          = local_dataset.Parameters.First()?.AllowRecursion ?? Options.Default.MRUActiveDiscovery;
                    DebugEx.WriteLine(string.Format("Inventory file loaded successfully. Active discovery is {0}.", AllowRecursion ? "enabled" : "disabled"), DebugLevel.Informational);
                }
                catch (Exception Ex)
                {
                    DebugEx.WriteLine(string.Format("Error loading inventory file : {0}", Ex.InnerExceptionsMessage()));
                }
            }
            else
            {
                AllowRecursion = Options.Default.MRUActiveDiscovery;
                DebugEx.WriteLine(string.Format("File {0} does not exist. Active discovery is {1}.", InventoryFileName, AllowRecursion ? "enabled" : "disabled"), DebugLevel.Informational);
            }
        }
Ejemplo n.º 4
0
 public void CalculateEdge(CDPDataSet ds)
 {
     Source_Interfaces = new List <string>();
     Target_Interafecs = new List <string>();
     CalculateEdgeText(ds);
     CalculateEdgeRuningConfig(ds);
     CalculateNames(ds);
     CalculateWeight(ds);
 }
Ejemplo n.º 5
0
        private void CalculateEdgeRuningConfig(CDPDataSet ds)
        {
            string source_interf_config = string.Empty;
            string target_interf_config = string.Empty;

            #region source_int_config
            var query_source_int_config = from row in ds.Devices
                                          join interf in ds.Interfaces on row.ID equals interf.ID
                                          where (row.ID == Source_ID)
                                          select new
            {
                name       = row.Name,
                int_name   = interf.Name,
                inter_conf = interf.Running_config
            };
            foreach (var mem in query_source_int_config)
            {
                if (Source_Interfaces.Contains(mem.int_name))
                {
                    source_interf_config = source_interf_config + mem.name + ": \r\n";
                    source_interf_config = source_interf_config + mem.inter_conf + "\r\n";
                }
            }
            #endregion
            #region target_int_config
            var query_target_int_config = from row in ds.Devices
                                          join interf in ds.Interfaces on row.ID equals interf.ID
                                          where (row.ID == Target_ID)
                                          select new
            {
                name       = row.Name,
                int_name   = interf.Name,
                inter_conf = interf.Running_config
            };
            foreach (var mem in query_target_int_config)
            {
                if (Target_Interafecs.Contains(mem.int_name))
                {
                    target_interf_config = target_interf_config + mem.name + ": \r\n";
                    target_interf_config = target_interf_config + mem.inter_conf + "\r\n";
                }
            }
            #endregion

            ConnectionConfig = source_interf_config + "\r\n" + target_interf_config;
        }
Ejemplo n.º 6
0
        private void CalculateNames(CDPDataSet ds)
        {
            var query_source_name = from row in ds.Devices
                                    where (row.ID == Source_ID)
                                    select(row);

            foreach (var mem in query_source_name)
            {
                SourceName = mem.Name;
            }

            var query_target_name = from row in ds.Devices
                                    where (row.ID == Target_ID)
                                    select(row);

            foreach (var mem in query_target_name)
            {
                TargetName = mem.Name;
            }
        }
Ejemplo n.º 7
0
        public virtual void ProcessCDPResult(string command_result, CDPDataSet.DevicesRow parent_device, CDPDataSet ds)
        {
            if (command_result.IndexOf("CDP is not enabled") >= 0)
            {
                parent_device.CDP_status = false;
            }
            else
            {
                string[] cdp_lines = command_result.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                CDPDataSet.DevicesRow current_device = null; // As going through the CDP output lines, this is the actual neighbor
                string currentDeviceName             = "";
                string currentDeviceIP = "";
                CDPDataSet.NeighboursRow    new_neigbor    = null; // This is the neighbor created for current_device as a neighbor of parent_device
                PGTDataSet.ScriptSettingRow ScriptSettings = SettingsManager.GetCurrentScriptSettings();
                // As the ip address must be unique for each device, adding a device with ip address of nocdpip constant would fail for the second time
                // To overcome this issue, we do indexing for devices with no ip address (such as VMware ESX hosts)
                int nocdpip_index = 0;
                foreach (string line in cdp_lines)
                {
                    DebugEx.WriteLine(String.Format("CDP2VISIO : parsing cdp neighbor row [ {0} ]", line), DebugLevel.Full);
                    try
                    {
                        bool isVMWareESX = false;

                        #region Check for DeviceID line and set currentDeviceName accordingly
                        if (line.IndexOf(DeviceID()) >= 0)
                        {
                            try
                            {
                                if (new_neigbor != null)
                                {
                                    ds.Neighbours.AddNeighboursRow(new_neigbor);
                                }
                            }
                            catch (Exception Ex)
                            {
                                // Depending on discovery list, under special circumstances it can happen that we try to add a new neighbor row
                                // with the same connection parameters (same parent, neighbor and interfaces) that will violate unique key constraint
                                DebugEx.WriteLine(String.Format("CDP2VISIO : Error storing neighbor row : {0}", Ex.InnerExceptionsMessage()), DebugLevel.Warning);
                            }
                            new_neigbor = null;
                            string[] words = line.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                            currentDeviceName = words[2].Trim();;
                            currentDeviceIP   = "";
                            DebugEx.WriteLine(String.Format("CDP2VISIO : CDPParser found a new neighbor : {0}", currentDeviceName), DebugLevel.Informational);
                        }
                        #endregion

                        if (currentDeviceName == "")
                        {
                            continue;
                        }

                        #region Check for IPAddress line and set currentDeviceIP accordingly
                        if (line.IndexOf(IPAddress()) >= 0)
                        {
                            string[] words_in_line = line.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                            currentDeviceIP = words_in_line[2].Trim();
                            if (currentDeviceIP == "")
                            {
                                DebugEx.WriteLine(String.Format("CDP2VISIO : cdp is not reporting ip address for neighbor {0}", currentDeviceName), DebugLevel.Debug);
                                currentDeviceIP = string.Format("{0}_{1}", nocdpip, nocdpip_index);
                                nocdpip_index++;
                            }
                        }
                        #endregion

                        #region Check whether the Platform is VMware ESX
                        if (line.Trim().StartsWith("Platform:"))
                        {
                            string[] words = line.SplitByComma();
                            // words[0] should be PlatForm, words[1] is Capabilities
                            isVMWareESX = words[0].ToLowerInvariant().IndexOf("vmware esx") >= 0;
                            if (isVMWareESX)
                            {
                                DebugEx.WriteLine(String.Format("CDP2VISIO : neighbor {0} is an ESX host", currentDeviceName), DebugLevel.Debug);
                                currentDeviceIP = string.Format("{0}_{1}", nocdpip, nocdpip_index);
                                nocdpip_index++;
                            }
                        }
                        #endregion

                        if (currentDeviceIP == "")
                        {
                            continue;
                        }

                        #region Add current device as new device or select existing device from Devices table
                        // At this point we can identify the current device(cdp neighbor) by name and ip. This is also a new neighbor
                        // Two devices considered identical if :
                        // - have the same hostname, or
                        // - have the same IPAddress
                        string currentDeviceHostName = DottedNameSpace.TLD(currentDeviceName);
                        current_device = ds.Devices.FirstOrDefault(d =>
                                                                   currentDeviceIP != nocdpip && d.IP_Address.SplitBySemicolon().Any(thisIP => thisIP == currentDeviceIP) ||
                                                                   d.Name.SplitBySemicolon().Any(thisName => DottedNameSpace.CompateTLD(thisName, currentDeviceHostName))
                                                                   );
                        if (current_device == null)
                        {
                            DebugEx.WriteLine(String.Format("CDP2VISIO : neighbor {0} is a new device, adding to devices data table", currentDeviceName), DebugLevel.Informational);
                            // This device is not yet known. Add to device list and also to list of devices in script
                            current_device = ds.Devices.NewDevicesRow();
                            //if (current_device.Name != currentDeviceName) current_device.Name += ";" + currentDeviceName;
                            //else
                            current_device.Name = currentDeviceName;
                            if (current_device.IsIP_AddressNull() || current_device.IP_Address == "")
                            {
                                current_device.IP_Address = currentDeviceIP;
                            }
                            else if (current_device.IP_Address != currentDeviceIP)
                            {
                                current_device.IP_Address += ";" + currentDeviceIP;
                            }
                            ds.Devices.AddDevicesRow(current_device);
                            // Add a new entry for discovered device if has a valid neighbor ip, Recursion is allowed
                            // and this ip is not defined as discovery boundary
                            if (_AllowRecursion && !currentDeviceIP.StartsWith(nocdpip))
                            {
                                var includedAddresses = (from addressdefinition in ds.DomainBoundary where addressdefinition.Action == BoundaryAddressAction.Include.ToString() select addressdefinition.IP_Address)?.ToList();
                                var excludedAddresses = (from addressdefinition in ds.DomainBoundary where addressdefinition.Action == BoundaryAddressAction.Exclude.ToString() select addressdefinition.IP_Address)?.ToList();
                                if (IPOperations.IsIPAddressInNetworks(currentDeviceIP, includedAddresses, true) && !IPOperations.IsIPAddressInNetworks(currentDeviceIP, excludedAddresses, false))
                                {
                                    string[] newScriptLine = _ConnectionInfo.ScriptLine.Split(ScriptSettings.CSVSeparator.ToCharArray());
                                    newScriptLine[2] = currentDeviceIP;
                                    newScriptLine[3] = currentDeviceName;
                                    _Executor.AddScriptEntry(string.Join(ScriptSettings.CSVSeparator, newScriptLine));
                                    string msg = string.Format("Added device <{0}> to discovery list.", currentDeviceIP);
                                    DebugEx.WriteLine(msg, DebugLevel.Informational);
                                    _Executor.ShowActivity(msg);
                                }
                                else
                                {
                                    string msg = string.Format("Not adding device <{0}> to discovery list because it is either explicitly excluded or not included in discovery domain", currentDeviceIP);
                                    DebugEx.WriteLine(msg, DebugLevel.Full);
                                    _Executor.ShowActivity(msg);
                                }
                            }
                            else
                            {
                                string msg = "Not adding device a new neighbor to discovery list because Active Discovery is not allowed or the neighbor does not have a valid ip address detected.";
                                DebugEx.WriteLine(msg, DebugLevel.Full);
                            }
                        }
                        else
                        {
                            DebugEx.WriteLine(String.Format("CDP2VISIO : neighbor {0} is already a known device", currentDeviceName), DebugLevel.Full);
                        }
                        #endregion

                        if (current_device == null)
                        {
                            continue;
                        }

                        #region Create Neighbor for parent_device <-> current_device
                        if (new_neigbor == null)
                        {
                            new_neigbor             = ds.Neighbours.NewNeighboursRow();
                            new_neigbor.Neighbor_ID = current_device.ID;
                            new_neigbor.Parent_ID   = parent_device.ID;
                            new_neigbor.Name        = current_device.Name;
                            DebugEx.WriteLine(String.Format("CDP2VISIO : new neighbor {0} added for device {1}", currentDeviceName, parent_device.Name), DebugLevel.Full);
                        }
                        #endregion

                        #region  Get Platform/Interfaces info and update the neighbor

                        if (line.Trim().StartsWith("Platform") && new_neigbor != null)
                        {
                            string[] words = line.SplitByComma();
                            // words[0] should be PlatForm, words[1] is Capabilities
                            string[] platformWords = words[0].SplitBySpace();
                            string[] capabilities  = words[1].SplitBySpace();
                            current_device.Platform = string.Join(" ", platformWords.SkipWhile((string l, int i) => i < 1));
                            if (current_device.Type != "VSS" && current_device.Type != "ASA" && !current_device.Type.StartsWith("Stack"))
                            {
                                current_device.Type = string.Join(";", capabilities.SkipWhile((s, i) => i < 1));
                            }
                            DebugEx.WriteLine(String.Format("CDP2VISIO : Platform of neighbor {0} identified as {1}. Device type was set to {2}", currentDeviceName, current_device.Platform, current_device.Type), DebugLevel.Full);
                        }

                        if (line.IndexOf("Interface") >= 0 && new_neigbor != null)
                        {
                            string[] words_in_line        = line.SplitBySpace();
                            int      words_length         = words_in_line.Length;
                            string   neighbour_interfaces = words_in_line[words_length - 1];
                            neighbour_interfaces = Common.ConvInt(neighbour_interfaces);

                            string local_interfaces = words_in_line[1].Replace(",", "");
                            local_interfaces = Common.ConvInt(local_interfaces);

                            new_neigbor.Neighbour_Interface = neighbour_interfaces;
                            new_neigbor.Local_Interface     = local_interfaces;
                            DebugEx.WriteLine(String.Format("CDP2VISIO : connected interface added {0}::{1} connects to  {2}::{3}", currentDeviceName, local_interfaces, parent_device.Name, neighbour_interfaces), DebugLevel.Full);
                        }
                        #endregion
                    }
                    catch (Exception Ex)
                    {
                        DebugEx.WriteLine(String.Format("CDP2VISIO : Error while parsing cdp output line [{0}]. Error is : {1}", line, Ex.InnerExceptionsMessage()));
                    }
                }
                if (new_neigbor != null)
                {
                    ds.Neighbours.AddNeighboursRow(new_neigbor);
                }
            }
        }