Esempio n. 1
0
        private List <SnmpResult <int, string> > MapMacAddresses(SnmpTarget snmpTarget)
        {
            var fdbAddressTable = ReadFdbAddressTable(snmpTarget);
            var fdbPortTable    = ReadFdbPortTable(snmpTarget);

            var portMappings = fdbPortTable.Select(port => new
            {
                PortNumber = Convert.ToInt32(port.Value.ToString()),
                Oid        = port.Oid.ToString()
            })
                               .GroupBy(mappings => mappings.PortNumber)
                               .Where(mappings => mappings.Any())
                               .ToDictionary(mapping => mapping.Key, mapping => mapping.ToList());

            var macMappings = fdbAddressTable.Select(port => new
            {
                MacAddress = port.Value.ToString(),
                Oid        = port.Oid.ToString().Replace(SnmpOids.Dot1DTpFdbAddress, SnmpOids.Dot1DTpFdbPort)
            })
                              .GroupBy(mappings => mappings.Oid)
                              .Where(mappings => mappings.Any())
                              .ToDictionary(mapping => mapping.Key, mapping => mapping.First().MacAddress);

            var results = new List <SnmpResult <int, string> >();

            foreach (var portMapping in portMappings)
            {
                string macAddress;

                foreach (var oid in portMapping.Value)
                {
                    if (macMappings.TryGetValue(oid.Oid, out macAddress))
                    {
                        var result = new SnmpResult <int, string>
                        {
                            Identifier = portMapping.Key,
                            Result     = macAddress.Replace(' ', ':'),
                            SnmpTarget = snmpTarget,
                            Oid        = ""
                        };

                        results.Add(result);
                    }
                }
            }

            return(results);
        }
Esempio n. 2
0
        private List <SnmpResult <int, long> > ProcessTargetsTraffic(SnmpTarget snmpTarget, string snmpOid,
                                                                     string communityString = "public")
        {
            var results = new List <SnmpResult <int, long> >();

            var community = new OctetString(communityString);
            var param     = new AgentParameters(community)
            {
                Version = SnmpVersion.Ver2
            };
            var agent   = new IpAddress(snmpTarget.IpAddress);
            var target  = new UdpTarget((IPAddress)agent, 161, 2000, 1);
            var rootOid = new Oid(snmpOid);
            var lastOid = (Oid)rootOid.Clone();
            var pdu     = new Pdu(PduType.GetBulk)
            {
                NonRepeaters = 0, MaxRepetitions = 5
            };

            while (lastOid != null)
            {
                if (pdu.RequestId != 0)
                {
                    pdu.RequestId += 1;
                }
                pdu.VbList.Clear();
                pdu.VbList.Add(lastOid);
                var result = (SnmpV2Packet)target.Request(pdu, param);

                if (result != null)
                {
                    if (result.Pdu.ErrorStatus != 0)
                    {
                        Console.WriteLine("Error in SNMP reply. Error {0} index {1}",
                                          result.Pdu.ErrorStatus,
                                          result.Pdu.ErrorIndex);
                        break;
                    }

                    foreach (var v in result.Pdu.VbList)
                    {
                        var current = new SnmpResult <int, long>();

                        if (rootOid.IsRootOf(v.Oid))
                        {
                            Console.WriteLine("{0} ({1}): {2}",
                                              v.Oid,
                                              SnmpConstants.GetTypeName(v.Value.Type),
                                              v.Value);

                            current.Result     = Convert.ToInt64(v.Value.ToString());
                            current.Identifier = Convert.ToInt32(v.Oid.ToString().Split('.').Last());
                            current.Oid        = v.Oid.ToString();
                            current.SnmpTarget = snmpTarget;

                            results.Add(current);

                            lastOid = v.Value.Type == SnmpConstants.SMI_ENDOFMIBVIEW ? null : v.Oid;
                        }
                        else
                        {
                            lastOid = null;
                        }
                    }
                }
                else
                {
                    Console.WriteLine("No response received from SNMP agent.");
                }
            }
            target.Close();

            return(results);
        }