Advertisement
Guest User

arp

a guest
May 10th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.14 KB | None | 0 0
  1. cat arp_from_summit.pl
  2. #!/usr/local/bin/perl
  3. use strict;
  4. #use warnings;
  5. use threads;
  6. use threads::shared;
  7. use DBI;
  8. use Net::Telnet;
  9.  
  10. require '/usr/mrtg/karfax_script/var_access.pl';
  11. my $comm:shared=our $snmp_100pab;
  12. my $login:shared=our $login_100pad;
  13. my $pass:shared=our $pass_100pab;
  14.  
  15. print "\x1b[1m\x1b[33m\x1b[42m===== ARP FROM SUMMITs =====\x1b[0m\n\n";
  16.  
  17.  
  18. my $nping:shared;
  19.  
  20. my $threads=20;
  21. my @threads;
  22. my @switches;
  23. my $last_p:shared=0;
  24. my $remain:shared=0;
  25. my $sql;
  26.  
  27. my $all_sw:shared;
  28.  
  29. #my $item=$ARGV[0];
  30.  
  31. #`rm /var/lib/mysql/ipmac`;
  32.  
  33. my $db = DBI->connect("DBI:mysql:database=mrtg;host=localhost", "root", "") or die "Unable connect to server \n";
  34. $sql="select ip,community from Epsilon where model like '%ummit%';";
  35. #$sql="select '10.0.100.112';";
  36. my $q = $db -> prepare($sql);
  37. $q -> execute ();
  38.  
  39. while (my ($ip,$community)=$q->fetchrow_array())
  40. {
  41. push (@switches,[$ip,$community]);
  42. }
  43. $db->disconnect();
  44.  
  45. print "\n";
  46.  
  47.  
  48. $remain=$all_sw=@switches;
  49. $remain--;
  50. print "Added $all_sw switches.\n";
  51.  
  52. # Отдаём процессор другим процессам и потокам
  53. threads->yield();
  54.  
  55. # Создаём нужное количество потоков
  56. if ($all_sw<$threads) {
  57. $threads=$all_sw;
  58. }
  59. print "Starting $threads threads...\n";
  60. for my $t (1..$threads) {
  61. push @threads, threads->create(\&todo, $t);
  62. }
  63.  
  64. # Дожидаемся окончания работы всех потоков
  65. foreach my $t (@threads) {
  66. $t->join();
  67. }
  68.  
  69. open FID, ">notping_summit.txt"
  70. or die "Failed to open notping_summit.txt: $!\n";
  71. print "\nNe ping:\t$nping\n";
  72. print FID "$nping\n"; # обратите внимание - запятой нет
  73. close FID;
  74.  
  75. sub todo
  76. {
  77.  
  78. sub ascii_to_hex ($)
  79. {
  80. (my $str = shift) =~ s/(.|\n)/sprintf("%02lx", ord $1)/eg;
  81. $str=~/(..)(..)(..)(..)(..)(..)/;
  82. $str="$1".":"."$2".":"."$3".":"."$4".":"."$5".":"."$6";
  83. return uc($str);
  84. }
  85. # Номер текущего потока
  86. my $num=shift;
  87.  
  88. print "+ Thread $num started.\n";
  89. sleep(1);
  90. while (1)
  91. {
  92. # Берём следующий номер в списке
  93. my $seq=$last_p++;
  94. my $pr_num=$seq+1;
  95. # Если список кончился, заканчиваем
  96. if ($seq>=@switches)
  97. {
  98. print "- Thread $num done.\n";
  99. return;
  100. }
  101.  
  102. my $ip=$switches[$seq][0];
  103. my $community=$switches[$seq][1];
  104.  
  105. print "Thread $num\t$all_sw/$pr_num\t$ip\tdo...\n";
  106.  
  107. my $file=$ip;
  108. $file =~ s/\.//g;
  109. # `rm /var/lib/mysql/ipmac$file >>/dev/null 2>&1`;
  110. open (FILE,">/var/lib/mysql/ipmac$file");
  111.  
  112. my @tt=`/usr/local/bin/snmpget -c $community -v2c -OvqE -t 1 $ip 1.3.6.1.2.1.1.1.0`;
  113. chomp($tt[0]);
  114. my $descr=$tt[0];
  115.  
  116. if ($descr =~ /ExtremeXOS/)
  117. {
  118. # Getting mac from summits
  119. my @maclist=`/usr/local/bin/snmpwalk -c $community -v2c -On $ip .1.3.6.1.2.1.3.1.1.2`;
  120. foreach my $machex(@maclist) {
  121.  
  122. my $ipp;
  123. my $mac;
  124. chomp($machex);
  125. $machex=~s/.1.3.6.1.2.1.3.1.1.2.//;
  126. if ($machex=~m/(.+)\.(.+)\.(.+)\.(.+)\.(.+) = Hex-STRING: (..) (..) (..) (..) (..) (..)/) {
  127. #my $snmp_idx="$1";
  128. $ipp="$2"."."."$3"."."."$4"."."."$5";
  129. $mac="$6".":"."$7".":"."$8".":"."$9".":"."$10".":"."$11";
  130. }
  131. elsif ($machex=~m/(.+)\.(.+)\.(.+)\.(.+)\.(.+) = STRING: \"(......)\"/) {
  132. #my $snmp_idx="$1";
  133. $ipp="$2"."."."$3"."."."$4"."."."$5";
  134. $mac="$6";
  135. $mac=ascii_to_hex $mac;
  136. }
  137. if ($mac ne '') {
  138. print FILE "$ip;$ipp;$mac\n";
  139. }
  140.  
  141. }
  142. close FILE;
  143.  
  144. my $db2 = DBI->connect("DBI:mysql:database=mrtg;host=localhost", "root", "") or die "Unable connect to server \n";
  145. my $sql="LOAD DATA INFILE '/var/lib/mysql/ipmac$file' REPLACE INTO TABLE ipmac FIELDS TERMINATED BY ';' (summit_ip,ip,mac,\@date) SET date=NOW();";
  146. $db2->do("$sql");
  147. $db2->disconnect();
  148. print "Thread $num\t$all_sw/$pr_num\t$ip\t\x1b[36mDONE\x1b[0m\tRemain: $remain\n";
  149. }
  150. else {
  151. print "Thread $num\t$all_sw/$pr_num\t$ip\t\x1b[31mDead\x1b[0m\tRemain: $remain\n";
  152. $nping=$nping.$ip;
  153. }
  154. $remain--;
  155. }
  156. } #end function todo
  157.  
  158.  
  159.  
  160. print "\x1b[1m\x1b[31m\x1b[42m===== END ARP FROM SUMMITs =====\x1b[0m\n\n";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement