Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- cat arp_from_summit.pl
- #!/usr/local/bin/perl
- use strict;
- #use warnings;
- use threads;
- use threads::shared;
- use DBI;
- use Net::Telnet;
- require '/usr/mrtg/karfax_script/var_access.pl';
- my $comm:shared=our $snmp_100pab;
- my $login:shared=our $login_100pad;
- my $pass:shared=our $pass_100pab;
- print "\x1b[1m\x1b[33m\x1b[42m===== ARP FROM SUMMITs =====\x1b[0m\n\n";
- my $nping:shared;
- my $threads=20;
- my @threads;
- my @switches;
- my $last_p:shared=0;
- my $remain:shared=0;
- my $sql;
- my $all_sw:shared;
- #my $item=$ARGV[0];
- #`rm /var/lib/mysql/ipmac`;
- my $db = DBI->connect("DBI:mysql:database=mrtg;host=localhost", "root", "") or die "Unable connect to server \n";
- $sql="select ip,community from Epsilon where model like '%ummit%';";
- #$sql="select '10.0.100.112';";
- my $q = $db -> prepare($sql);
- $q -> execute ();
- while (my ($ip,$community)=$q->fetchrow_array())
- {
- push (@switches,[$ip,$community]);
- }
- $db->disconnect();
- print "\n";
- $remain=$all_sw=@switches;
- $remain--;
- print "Added $all_sw switches.\n";
- # Отдаём процессор другим процессам и потокам
- threads->yield();
- # Создаём нужное количество потоков
- if ($all_sw<$threads) {
- $threads=$all_sw;
- }
- print "Starting $threads threads...\n";
- for my $t (1..$threads) {
- push @threads, threads->create(\&todo, $t);
- }
- # Дожидаемся окончания работы всех потоков
- foreach my $t (@threads) {
- $t->join();
- }
- open FID, ">notping_summit.txt"
- or die "Failed to open notping_summit.txt: $!\n";
- print "\nNe ping:\t$nping\n";
- print FID "$nping\n"; # обратите внимание - запятой нет
- close FID;
- sub todo
- {
- sub ascii_to_hex ($)
- {
- (my $str = shift) =~ s/(.|\n)/sprintf("%02lx", ord $1)/eg;
- $str=~/(..)(..)(..)(..)(..)(..)/;
- $str="$1".":"."$2".":"."$3".":"."$4".":"."$5".":"."$6";
- return uc($str);
- }
- # Номер текущего потока
- my $num=shift;
- print "+ Thread $num started.\n";
- sleep(1);
- while (1)
- {
- # Берём следующий номер в списке
- my $seq=$last_p++;
- my $pr_num=$seq+1;
- # Если список кончился, заканчиваем
- if ($seq>=@switches)
- {
- print "- Thread $num done.\n";
- return;
- }
- my $ip=$switches[$seq][0];
- my $community=$switches[$seq][1];
- print "Thread $num\t$all_sw/$pr_num\t$ip\tdo...\n";
- my $file=$ip;
- $file =~ s/\.//g;
- # `rm /var/lib/mysql/ipmac$file >>/dev/null 2>&1`;
- open (FILE,">/var/lib/mysql/ipmac$file");
- my @tt=`/usr/local/bin/snmpget -c $community -v2c -OvqE -t 1 $ip 1.3.6.1.2.1.1.1.0`;
- chomp($tt[0]);
- my $descr=$tt[0];
- if ($descr =~ /ExtremeXOS/)
- {
- # Getting mac from summits
- my @maclist=`/usr/local/bin/snmpwalk -c $community -v2c -On $ip .1.3.6.1.2.1.3.1.1.2`;
- foreach my $machex(@maclist) {
- my $ipp;
- my $mac;
- chomp($machex);
- $machex=~s/.1.3.6.1.2.1.3.1.1.2.//;
- if ($machex=~m/(.+)\.(.+)\.(.+)\.(.+)\.(.+) = Hex-STRING: (..) (..) (..) (..) (..) (..)/) {
- #my $snmp_idx="$1";
- $ipp="$2"."."."$3"."."."$4"."."."$5";
- $mac="$6".":"."$7".":"."$8".":"."$9".":"."$10".":"."$11";
- }
- elsif ($machex=~m/(.+)\.(.+)\.(.+)\.(.+)\.(.+) = STRING: \"(......)\"/) {
- #my $snmp_idx="$1";
- $ipp="$2"."."."$3"."."."$4"."."."$5";
- $mac="$6";
- $mac=ascii_to_hex $mac;
- }
- if ($mac ne '') {
- print FILE "$ip;$ipp;$mac\n";
- }
- }
- close FILE;
- my $db2 = DBI->connect("DBI:mysql:database=mrtg;host=localhost", "root", "") or die "Unable connect to server \n";
- 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();";
- $db2->do("$sql");
- $db2->disconnect();
- print "Thread $num\t$all_sw/$pr_num\t$ip\t\x1b[36mDONE\x1b[0m\tRemain: $remain\n";
- }
- else {
- print "Thread $num\t$all_sw/$pr_num\t$ip\t\x1b[31mDead\x1b[0m\tRemain: $remain\n";
- $nping=$nping.$ip;
- }
- $remain--;
- }
- } #end function todo
- 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