Advertisement
Izya12

lldp

Mar 12th, 2014
288
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 11.82 KB | None | 0 0
  1. #!/usr/bin/perl
  2. # Topology Discovery, lldp2dot for FTTB by SERGIUS, v2.6.1 beta
  3.  
  4. use lib "./libs";
  5.  
  6. # use strict;
  7. # use warnings;
  8. use Net::SNMP;
  9. use SNMP_Session;
  10. use SNMP_util;
  11. use Net::Ping;
  12. use iptools;
  13. use threads;
  14. use threads::shared;
  15. use DateTime;
  16.  
  17. my $ping=Net::Ping->new();
  18. my %hosts:shared=();
  19. my $maxThreads=100;
  20. my %lldpmapout = ();
  21. my $mgmtvlans;
  22. # my $snmpcommunity = "metroro";
  23. my $snmpcommunity = "ugorskro";
  24. my %edges = ();
  25. my %edges2 = ();
  26. my %database = ();
  27. my %snmplldpnei_hash = ();
  28. my $i;
  29. my $edgesid = 0;
  30. my $edgesid2 = 0;
  31. # Объявляем переменные
  32. my $today = DateTime->now; # Определяем текущую дату
  33.  
  34.  
  35. my @scanRange=(
  36.     "192.168.212.1-192.168.213.254",    #
  37. );
  38.  
  39. foreach my $rangeS (@scanRange)
  40.     {
  41.     my @range=split /-/,$rangeS;
  42.     my $startIP=iptools::IPtodec($range[0]);
  43.     my $endIP=iptools::IPtodec($range[1]);
  44.     for (my $i=$startIP;$i<=$endIP;$i++)
  45.         {
  46.         $_->join() foreach (threads->list(threads::joinable));
  47.         if (threads->list(threads::all)>$maxThreads)
  48.             {
  49.             print "thread count > limit, joining\n";
  50.             while(threads->list(threads::all)>$maxThreads)
  51.                 {
  52.                 $_->join() foreach (threads->list(threads::joinable));
  53.                 }
  54.             }
  55.         threads->create(\&pingDec,$i);
  56.         }
  57.         while(threads->list(threads::all))
  58.         {
  59.         $_->join() foreach (threads->list(threads::joinable));
  60.         }
  61.  
  62.     foreach $iphost (keys %hosts)
  63.         {
  64.         print "get sysObjct.0 from $iphost... \n";
  65.         }
  66.  
  67.     foreach $iphost (keys %hosts)
  68.         {
  69.         my $snmpsession;
  70.         my $snmperror;
  71.         my $snmptemp;
  72.         my $snmpsysobject;
  73.         my $snmplocalmac;
  74.         my $snmplocation;
  75.         my $snmpsysname;
  76.         my $snmpvid;
  77.         my %snmptemp = (); 
  78.         my $request;
  79.         my $id;
  80.         my $sysobject;
  81.         my $localmac;
  82.         my $syslocation;
  83.         my $sysname;
  84.         my %snmpvlans = ();
  85.         my $vlanid;
  86.         my $snmploopback;
  87.         my $fw;
  88.  
  89.         $syslocation = "";
  90.         $localmac = "";
  91.         $uptime = "";
  92.         $sysname = "";
  93.         my $firmware = "";
  94.         $sysobject = "";
  95.         $network = "";
  96.         $vlanid = "";
  97.         my $serial = "";
  98.        
  99.         print "get sysObjct.0 from $iphost... ";
  100.  
  101.         my ($snmpsession, $snmperror) = Net::SNMP -> session(
  102.         -timeout => 1,
  103.         -retries => 1,
  104.         -hostname => $iphost,
  105.         -community => $snmpcommunity,
  106.         -translate => [-timeticks => 0x0]
  107.         );
  108.  
  109.         #sysObject.0
  110.         my $snmptemp = $snmpsession->get_request('.1.3.6.1.2.1.1.2.0');
  111.         if (ref($snmptemp))
  112.             {
  113.             my %snmpsysobjectid = %{$snmptemp};
  114.  
  115.             foreach my $values (values %snmpsysobjectid)
  116.                 {$sysobjectid = $values;}
  117.  
  118.             #default
  119.             $id = 0;
  120.             # 1-99 tkd
  121.             if($sysobjectid eq ".1.3.6.1.4.1.6486.800.1.1.2.2.4.1.1")
  122.                 {$id = 1;$sysobject = "Alcatel-Lucent OmniStack LS 6224";}
  123.  
  124.             if($sysobjectid eq ".1.3.6.1.4.1.171.10.113.1.5")
  125.                 {$id = 2;$sysobject = "D-Link DES-3200-26";}
  126.  
  127.             if($sysobjectid eq ".1.3.6.1.4.1.171.10.63.6")
  128.                 {$id = 3;$sysobject = "D-Link DES-3028";}
  129.  
  130.             if($sysobjectid eq ".1.3.6.1.4.1.171.10.64.1")
  131.                 {$id = 4;$sysobject = "D-Link DES-3526";}
  132.  
  133.             if($sysobjectid eq ".1.3.6.1.4.1.171.10.113.1.1")
  134.                 {$id = 5;$sysobject = "D-Link DES-3200-10";}
  135.  
  136.             if($sysobjectid eq ".1.3.6.1.4.1.171.10.64.2")
  137.                 {$id = 6;$sysobject = "D-Link DES-3550";}
  138.  
  139.             if($sysobjectid eq ".1.3.6.1.4.1.171.10.105.3")
  140.                 {$id = 7;$sysobject = "D-Link DES-3552";}
  141.  
  142.             if($sysobjectid eq ".1.3.6.1.4.1.171.10.113.1.3")
  143.                 {$id = 8;$sysobject = "D-Link DES-3200-28";}
  144.  
  145.             if($sysobjectid eq ".1.3.6.1.4.1.171.10.113.5.1")
  146.                 {$id = 9;$sysobject = "D-Link DES-3200-28-C1";}
  147.  
  148.             if($sysobjectid eq ".1.3.6.1.4.1.171.10.113.1.2")
  149.                 {$id = 10;$sysobject = "D-Link DES-3200-18";}
  150.  
  151.             if($sysobjectid eq ".1.3.6.1.4.1.171.10.113.1.4")
  152.                 {$id = 11;$sysobject = "D-Link DES-3200-28F";}
  153.  
  154.             if($sysobjectid eq ".1.3.6.1.4.1.171.10.113.9.1")
  155.                 {$id = 12;$sysobject = "D-Link DES-3200-52";}
  156.  
  157.             if($sysobjectid eq ".1.3.6.1.4.1.171.10.116.2")
  158.                 {$id = 13;$sysobject = "D-Link DES-1228/ME";}
  159.  
  160.             # 100-999 agg
  161.             if($sysobjectid eq ".1.3.6.1.4.1.6486.800.1.1.2.1.7.1.10")
  162.                 {$id = 100;$sysobject = "Alcatel-Lucent OmniSwitch 6850-U24X";}
  163.  
  164.             if($sysobjectid eq ".1.3.6.1.4.1.171.10.70.8")
  165.                 {$id = 101;$sysobject = "D-Link DGS-3627G";}
  166.  
  167.             if($sysobjectid eq ".1.3.6.1.4.1.171.10.120.1")
  168.                 {$id = 101;$sysobject = "D-Link DGS-6604";}
  169.  
  170.             if($sysobjectid eq ".1.3.6.1.4.1.171.10.101.1")
  171.                 {$id = 102;$sysobject = "D-Link DGS-3200-10";}
  172.  
  173.             if($sysobjectid eq ".1.3.6.1.4.1.171.10.70.9")
  174.                 {$id = 103;$sysobject = "D-Link DGS-3612g";}
  175.  
  176.             if($sysobjectid eq ".1.3.6.1.4.1.207.1.4.149")
  177.                 {$id = 104;$sysobject = "Allied Telesis AT-9000/28SP";}
  178.  
  179.             if($sysobjectid eq ".1.3.6.1.4.1.171.10.117.1.3")
  180.                 {$id = 105;$sysobject = "D-Link DGS-3120-24SC";}
  181.  
  182.             # 1000-9999 ups
  183.             if($sysobjectid eq ".1.3.6.1.4.1.2254.2.4")
  184.                 {$id = 1000;$sysobject = "Delta GES102R202035";}
  185.  
  186.             if($sysobjectid eq ".1.3.6.1.4.1.935")
  187.                 {$id = 1001;$sysobject = "EngPower EP901RH";}
  188.  
  189.             # 10000-99999 core
  190.             if($sysobjectid eq ".1.3.6.1.4.1.9.1.402")
  191.                 {$id = 10000;$sysobject = "Cisco 7606 Chassis";}
  192.             }
  193.             else
  194.             {
  195.             $id = "-1";
  196.             print "fault, reason: wrong SNMP community or forbitten SNMP protocol ";
  197.             }
  198.  
  199.         if($id eq 0){print "unknow net device ";}
  200.         undef $snmptemp;
  201.  
  202.         if ($id >= 0)
  203.             {
  204.             #get MAC-adress
  205.             $snmptemp = $snmpsession -> get_request(".1.3.6.1.2.1.17.1.1.0");
  206.             $localmac = $snmptemp -> {".1.3.6.1.2.1.17.1.1.0"};
  207.  
  208.             #get sysLocation.0
  209.             $snmptemp = $snmpsession -> get_request(".1.3.6.1.2.1.1.6.0");
  210.             $syslocation = $snmptemp -> {".1.3.6.1.2.1.1.6.0"};
  211.  
  212.             #get sysName.0
  213.             $snmptemp = $snmpsession -> get_request(".1.3.6.1.2.1.1.5.0");
  214.             $sysname = $snmptemp -> {".1.3.6.1.2.1.1.5.0"};
  215.  
  216.             # Take Loopback0 for aggregator
  217.             if($id >= 100 && $id <= 999)
  218.                 {
  219.                 $snmptemp = $snmpsession -> get_request(".1.3.6.1.2.1.14.1.1.0");
  220.                 $snmploopback = $snmptemp -> {".1.3.6.1.2.1.14.1.1.0"};
  221.                 $iphost = $snmploopback;
  222.                 }
  223.  
  224.             #LLDP nei
  225.                 %snmplldpnei_hash = %{$snmpsession -> get_table(".1.0.8802.1.1.2.1.4.1.1.5")};
  226.                 my $snmpport;
  227.                 foreach $lldpneioid (keys %snmplldpnei_hash)
  228.                     {
  229.                     $lldpneioid =~ m/(\d{1,})(?=\.(\d{1,})$)/;
  230.                     if($id >=0 && $id <= 999)
  231.                         {
  232.                         $getport = ".1.3.6.1.2.1.31.1.1.1.1."."$&";
  233.                         $snmptemp = $snmpsession -> get_request("$getport");
  234.                         $portname = $snmptemp -> {"$getport"};
  235.                         $edges{$edgesid} = {
  236.                         'edgefrom'=>$localmac,
  237.                         'edgeto'=>$snmplldpnei_hash{$lldpneioid},
  238.                         'port'=>$portname,
  239.                         };
  240.                         $edgesid = $edgesid + 1;
  241.                         $lldpnei.= $portname."->".$snmplldpnei_hash{$lldpneioid}.",";
  242.                         }
  243.                     }
  244.                 if(defined($lldpnei))
  245.                     {
  246.                     chop $lldpnei;
  247.                     }
  248.  
  249.  
  250.  
  251.             # take firmware for D-Link DES-3200-26 ...
  252.             if ($id == 2 || $id == 5 || $id == 9 || $id == 10 || $id == 11 )
  253.                 {
  254.                 $snmptemp = $snmpsession -> get_request(".1.3.6.1.2.1.47.1.1.1.1.9.1");
  255.                 $fw = $snmptemp -> {".1.3.6.1.2.1.47.1.1.1.1.9.1"};
  256.                 }
  257.  
  258.             # take firmware for D-Link DES-3526 ...
  259.             if ($id == 4)
  260.                 {
  261.                 $snmptemp = $snmpsession -> get_request(".1.3.6.1.2.1.16.19.2.0");
  262.                 $fw = $snmptemp -> {".1.3.6.1.2.1.16.19.2.0"};
  263.                 }
  264.             }
  265.  
  266.         if(!defined($fw))
  267.             {
  268.             $fw = "";
  269.             }
  270.  
  271.         if($id >=0 )
  272.             {
  273.             print "$iphost;";
  274.             print "$localmac;";
  275.             print "$syslocation;";
  276.             print "$vlanid;";
  277.             print "$sysname;";
  278.             print "$id;";
  279.             print "$sysobject;";
  280.             print "$fw;";
  281.  
  282.             if(!defined($lldpnei))
  283.                 {
  284.                 $lldpnei = "";
  285.                 }
  286.  
  287.             print "$lldpnei\n\n";
  288.             $database{$iphost}={
  289.             'localmac'=>$localmac,
  290.             'syslocation'=>$syslocation,
  291.             'vlanid'=>$vlanid,
  292.             'sysname'=>$sysname,
  293.             'id'=>$id,
  294.             'sysobject'=>$sysobject,
  295.             'lldpnei'=>$lldpnei,
  296.             'fw'=>$fw,
  297.             };
  298.             }
  299.  
  300.         undef $fw;
  301.         undef $localmac;
  302.         undef $syslocation;
  303.         undef $vlanid;
  304.         undef $sysname;
  305.         undef $id;
  306.         undef $sysobject;
  307.         undef $lldpnei;
  308.         }
  309.     %hosts = ();
  310.     }
  311.  
  312. my $edgefrom;
  313. my $edgefrom2;
  314. my $edgeto;
  315. my $edgeto2;
  316. my $edge;
  317. my $edge2;
  318. my $port;
  319. my $port2;
  320.  
  321. foreach $edge6(keys %edges)
  322.     {
  323.     $edgefrom6 = $edges{$edge6}{edgefrom};
  324.     $edgeto6 = $edges{$edge6}{edgeto};
  325.     $port6 = $edges{$edge6}{port};
  326.     print "$edge6 => $edgefrom6--$edgeto6;$port6\n";
  327.     }
  328.  
  329. # delete full edges dublicate
  330. foreach $edge3(keys %edges)
  331.     {
  332.     $edgefrom3 = $edges{$edge3}{edgefrom};
  333.     $edgeto3 = $edges{$edge3}{edgeto};
  334.     $port3 = $edges{$edge3}{port};
  335.     if(defined($edgefrom3) & defined($edgeto3) & defined($port3))
  336.         {
  337.         foreach $edge4(keys %edges)
  338.             {
  339.             $edgefrom4 = $edges{$edge4}{edgefrom};
  340.             $edgeto4 = $edges{$edge4}{edgeto};
  341.             $port4 = $edges{$edge4}{port};
  342.             if(defined($edgefrom4) & defined($edgeto4) & defined($port4))
  343.                 {          
  344.                 if($edgefrom3 eq $edgefrom4 & $edgeto3 eq $edgeto4 & $port3 eq $port4 & $edge3 ne $edge4)
  345.                     {
  346.                     delete $edges{$edge4};
  347.                     }
  348.                 }
  349.             }
  350.         }
  351.     }
  352.  
  353. # combine edges and ports and delete dublicate
  354. foreach $edge(keys %edges)
  355.     {
  356.     my $port2;
  357.     $edgefrom = $edges{$edge}{edgefrom};
  358.     $edgeto = $edges{$edge}{edgeto};
  359.     $port = $edges{$edge}{port};
  360.     foreach $edge2(keys %edges)
  361.         {
  362.         $edgefrom2 = $edges{$edge2}{edgefrom};
  363.         $edgeto2 = $edges{$edge2}{edgeto};
  364.         if(defined($edgefrom))
  365.             {
  366.             if(defined($edgeto2))
  367.                 {
  368.                 if($edgefrom eq $edgeto2)
  369.                     {
  370.                     if($edgeto eq $edgefrom2)
  371.                         {
  372.                         $port2 = $edges{$edge2}{port};
  373.                         delete $edges{$edge2};
  374.                         }
  375.                     }
  376.                 }
  377.             }
  378.         }
  379.     if (defined($edgefrom) & defined($edgeto))
  380.         {
  381.         if(defined($edge) & defined($edgefrom) & defined($edgeto) & defined($port) & defined($port2))
  382.             {
  383.             print "$edge => $edgefrom--$edgeto;$port;$port2\n";
  384.             }
  385.         if(!defined($port2))
  386.             {
  387.             $port2 = "";
  388.             }
  389.         $lldpmap.= "\"$edgefrom\" -- \"$edgeto\" [taillabel=\"$port\", headlabel=\"$port2\", labeldistance=\"8\", len=\"15\" ]\;\n";
  390.         }
  391.     }
  392.  
  393. foreach $iphost(keys %database)
  394.     {
  395.     $fw = $database{$iphost}{fw};
  396.     $syslocation = $database{$iphost}{syslocation};
  397.     $vlanid = $database{$iphost}{vlanid};
  398.     $sysname = $database{$iphost}{sysname};
  399.     $sysobject = $database{$iphost}{sysobject};
  400.     $id = $database{$iphost}{id};  
  401.     $localmac = $database{$iphost}{localmac};
  402.     my @portmac = ();
  403.  
  404.     if($id >= 0 && $id <= 9999)
  405.         {
  406.         $label.="\"$database{$iphost}{localmac}\" [ label=\"$iphost\\n$syslocation\\n$sysobject\\n$sysname\\n$vlanid\", fillcolor=\"white\", shape=\"$shape\", ranksep=\"15\" ]\;\n";
  407.         }
  408.     }
  409.  
  410. open(lldp2dot,">mapdot.gv");
  411. print lldp2dot "graph lldp2dot {\n\toverlap=scale;\n\tsplines=true;\n";
  412. print lldp2dot "node [ shape=\"box\", fixedsize=\"false\", style=\"filled\", fillcolor=\"black\" ];\n";
  413. print lldp2dot "graph [ fontname=\"Helvetica-Oblique\", fontsize=\"150\", label=\"Metro\", size=\"12\" ];\n";
  414. print lldp2dot "edge [color=red];\n";
  415. print lldp2dot $label;
  416. print lldp2dot $lldpmap;
  417. print lldp2dot "}";
  418. close(lldp2dot);
  419.  
  420. sub pingDec {
  421.     my $iphost=iptools::dectoIP(shift);
  422.     print "ping $iphost...";
  423.     if($ping->ping($iphost,0.500))
  424.         {
  425.         $hosts{$iphost}=undef;
  426.         print " success, save result, go to next host...\n";
  427.         }
  428.         else
  429.         {
  430.         print " fault, save result, go to next host...\n";
  431.         }
  432.     return 0;
  433. }
  434.  
  435. # pdf
  436.  
  437. #print "dot ==> generation PDF...\n";
  438. #`dot -Tpdf -Gratio=auto -Ecolor=black -Ncolor=black -Goverlap=false -Gsize=20 mapdot.gv -o mapdot_06.08.13.pdf`;
  439.  
  440. print "neato ==> generation PDF...\n";
  441. `neato -Tpdf -Gratio=auto -Ecolor=black -Ncolor=black -Goverlap=false -Gsize=20 mapdot.gv -o mapneato_$today.pdf`;
  442.  
  443. #print "fdp ==> generation PDF...\n";
  444. #`fdp -Tpdf -Gratio=auto -Ecolor=black -Ncolor=black -Goverlap=false -Gsize=20 mapdot.gv -o mapfdp.pdf`;
  445.  
  446. # svg
  447.  
  448. # print "dot ==> generation SVG...\n";
  449. # `dot -Tsvg -Gratio=auto -Ecolor=black -Ncolor=black -Goverlap=false -Gsize=10 mapdot.gv -o mapdot.svg`;
  450.  
  451. print "neato ==> generation PS2...\n";
  452. `neato -Tsvg -Gratio=auto -Ecolor=black -Ncolor=black -Goverlap=false -Gsize=20 mapdot.gv -o mapneato_$today.svg`;
  453.  
  454. # print "fdp ==> generation SVG...\n";
  455. # `fdp -Tsvg -Gratio=auto -Ecolor=black -Ncolor=black -Goverlap=false -Gsize=50 mapdot.gv -o mapfdp.svg`;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement