Скрипт висит в кроне, и по SNMP находит новые UNACTIVATED NTU и
затем через TELNET конфигурит канал(порт) NTU.
На вход скрипта бросаем файл с содержанием
MAC - IP - VLAN
A8:F9:4B:8B:65:16 10.100.14.3 142
A8:F9:4B:8B:6A:46 10.100.13.3 162
A8:F9:4B:8B:6D:46 10.100.19.3 152
Код: Выделить всё
#!/usr/bin/perl
# "Большая тройка"
use strict;
use warnings;
use diagnostics;
use Net::SNMP;
use Net::Ping;
use Net::Telnet ();
use Data::Dumper qw(Dumper);
use Switch;
use Text::Iconv;
use DBI;
use utf8;
binmode(STDOUT,':utf8');
my $dbname = "abills";
my $username = "username";
my $password = "pass";
my $dbhost = "10.100.1.40";
my $dbport = "3306";
my $dboptions = "-e";
my $dbtty = "utf8";
my $dbh = DBI->connect("DBI:mysql:dbname=$dbname;host=$dbhost;port=$dbport;options=$dboptions;tty=$dbtty","$username","$password", {mysql_enable_utf8 => 1,PrintError => 0});
my $file = $ARGV[0] or die "Need to get CSV file on the command line\n";
# Что будем оправшивать
my $snmp_host = '10.100.19.3'; # IP или hostname
my $snmp_community = '20142014'; # SNMP Community
my $mac;
my $ip;
my $vlan;
my $port = 0;
my $p = Net::Ping->new("icmp");
my $gpon = 0;
my $ELTX_num;
my $channel_vlan;
my $ltp8xONTConfigSerial = '.1.3.6.1.4.1.35265.1.22.3.4.1.2'; # ltp8xONTConfigSerial
my $ltp8xONTConfigChannel = '.1.3.6.1.4.1.35265.1.22.3.4.1.3'; # ltp8xONTConfigChannel
my $ltp8xONTConfigID = '.1.3.6.1.4.1.35265.1.22.3.4.1.4'; # ltp8xONTConfigID
my $ltp8xONTStateState = '.1.3.6.1.4.1.35265.1.22.3.1.1.5'; #ltp8xONTStateState
my $ltp8xONTStateChannel = '.1.3.6.1.4.1.35265.1.22.3.1.1.3'; #ltp8xONTStateChannel
my $ltp8xONTStateSerial = '.1.3.6.1.4.1.35265.1.22.3.1.1.2'; #ltp8xONTStateSerial
open(my $data, '<', $file) or die "Could not open '$file' $!\n";
while (my $line = <$data>) {
chomp $line;
my @fields = split " " , $line;
$mac = $fields[0];
$ip = $fields[1];
$vlan = $fields[2];
$snmp_host = $ip;
if( $p->ping($snmp_host, 2) )
{
my $query_a = "select name from nas where upper(mac)='$mac'";
my $sth = $dbh->prepare($query_a);
$sth->execute; # исполняем запрос
my $ref_a = $sth->fetchrow_arrayref;
my $snmp_session = Net::SNMP->session(-hostname => $snmp_host,-community => $snmp_community,-version => '2c',-timeout => 7, -retries => 5, -translate => [-octetstring => 0]) or die(print 'Не удалось соединиться!');
# print Dumper(\@result);
print "$ip => $mac => $$ref_a[0]\n";
# channel
my $key_Channel = $ltp8xONTConfigChannel;
my $result_Channel = $snmp_session->get_table(-baseoid => $key_Channel) or die('Не удалось выполнить запрос!');
my @v_i = (0,0,0,0,0,0,0,0);
while (my ($k0,$v0) = each %{$result_Channel}) {
# print $v0."/";
$k0 =~ s/$ltp8xONTConfigChannel//g;
for(my $i = 0; $i < 8; $i++) {
if ($v0 == $i){
$v_i[$i]++;
print "GPON $i ";
}
}
my $key_Serial = $ltp8xONTConfigSerial.$k0;
my $result_Serial = $snmp_session->get_request(-varbindlist => [$key_Serial],) or die('Не удалось выполнить запрос!');
while (my ($key,$value) = each %{$result_Serial}) {
# print "$key = $value \n";
my $dec_num = unpack('H*', "$value");
print " = $dec_num = > ";
$key =~ s/$ltp8xONTConfigSerial//g;
}
# ONT_ID
my $key_ID = $ltp8xONTConfigID.$k0;
my $result_ID = $snmp_session->get_request(-varbindlist => [$key_ID],) or die('Не удалось выполнить запрос!');
while (my ($k1,$v1) = each %{$result_ID}) {
print $v1."\n";
}
}
for(my $i = 0; $i < 8; $i++) {
print $v_i[$i]."\n";
}
print $gpon."\n";
print "---------------------------\n";
# chennal unactivated
my $key_Channel_Unactivated = $ltp8xONTStateState;
my $result_Channel_Unactivated = $snmp_session->get_table(-baseoid => $key_Channel_Unactivated) or die('Не удалось выполнить запрос!');
my @v_i_u = (0,0,0,0,0,0,0,0);
while (my ($k2,$v2) = each %{$result_Channel_Unactivated}) {
if ($v2 == 13){
$k2 =~ s/$ltp8xONTStateState//g;
print "Unactivated $k2 => $v2 \n";
my $key_Channel_ = $ltp8xONTStateChannel.$k2;
my $result_Channel_ = $snmp_session->get_request(-varbindlist => [$key_Channel_],) or die('Не удалось выполнить запрос!');
while (my ($k3,$v3) = each %{$result_Channel_}) {
$channel_vlan = $vlan + $v3;
$gpon = $v3;
if ($v_i[$gpon]) {$port = $v_i[$gpon]} else {$port = 0};
print "Unactivated Chennal $k3 => $v3 \n";
}
my $key_Channel__ = $ltp8xONTStateSerial.$k2;
my $result_Channel__ = $snmp_session->get_request(-varbindlist => [$key_Channel__],) or die('Не удалось выполнить запрос!');
while (my ($k4,$v4) = each %{$result_Channel__}) {
my $dec_num = unpack('H*', "$v4");
$dec_num =~s/454c5458//g;
$ELTX_num =uc('ELTX'.$dec_num);
print "Unactivated Serial $k4 => $ELTX_num \n";
}
#--------------------------------- TELNET
# $channel_vlan = $vlan + $v3;
my $login = 'admin';
my $pass = 'admin';
# my $gpon = $v3;
# my $port;
my $t = new Net::Telnet (Timeout => 20, Host => $ip, Errmode=>'return');
if ( $t )
{
my @cmd =("configure terminal",
"interface ont $gpon/$port",
"serial $ELTX_num",
"profile ports NTP-RG-$channel_vlan",
"service 0 profile cross-connect INTERNET_$channel_vlan",
"service 0 profile dba dba-00",
"exit",
"exit",
"commit",
"save");
$t->waitfor('/login:.*$/');
$t->print($login);
$t->waitfor('/Password:.*$/');
$t->print($pass);
$t->waitfor('/#.*$/');
foreach my $n (@cmd){
$t->print($n);
$t->waitfor('/#.*$/');
}
$t->close();
} else { print "Warning: ".$ip." telnet not responding\n"; }
}
}
$snmp_session->close();
# Закрываем соединение
}
else
{
print "Warning: ".$snmp_host." appears to be down or icmp packets are blocked by their servern\n";
}
}
$dbh->disconnect();