Код: Выделить всё
#!/usr/bin/perl -w
use DBI;
use strict;
use warnings;
use Net::Telnet::Cisco;
#Настройки переменных для Cisco
my $ci_address = "";
my $ci_passwd = "";
my $ci_login = "";
my $ci_enable = "";
#Настройки для MySQL
my $hostname = "";
my $database = "";
my $username = "";
my $password = "";
#Настройки переменных для SNMP
my $community = "";
my $switch = "";
my $command = "RFC1213-MIB::atPhysAddress";
#Объявление переменых
my $i = 0;
my @mac_all;
my @mac_online;
my @vlan_online;
my @result;
my %temp;
#Подлючение к MySQL
my $dbh = DBI->connect("dbi:mysql:$database:$hostname",
$username, $password) || die print "Невозможно подключиться к серверу MySQL";
#Подлючение к Cisco
my $session = Net::Telnet::Cisco->new(Host => $ci_address);
$session->login($ci_login, $ci_passwd);
$session->enable($ci_enable);
#Получение текущей даты и времени
my ($sec, $min, $hour, $mday, $mon, $year) = localtime(time());
$mon++; $year += 1900;
#Добавление нулей в дату и время
if ($mon < 10) { $mon = "0$mon"; }
if ($mday < 10) { $mday = "0$mday"; }
if ($min < 10) { $min = "0$min"; }
if ($sec < 10) { $sec = "0$sec"; }
#Формируем текущию дату
my $date = "$year-$mon-$mday $hour:$min:$sec";
#Очистка временной таблицы
my $query = "TRUNCATE TABLE mac_temp;";
my $sth = $dbh->prepare($query);
$sth->execute || die print "Невозможно выполнить SQL запрос: $DBI::errstr\n";
$sth->finish();
#Поиск всех известных маков
$query = "SELECT mac FROM user_mac;";
$sth = $dbh->prepare($query);
$sth->execute || die print "Невозможно выполнить SQL запрос: $DBI::errstr";
#Выборка всех маков из базы
while (my ($mac_temp) = $sth->fetchrow_array) {
$mac_all[$i] = $mac_temp;
$i++;
}
$sth->finish();
$i = 0;
#Подлючение к SNMP
open(SNMP,"snmpwalk -v2c -c $community $switch $command|");
#Выборка маков по SNMP
while (<SNMP>) {
chomp;
my ($ci_vlan, $ci_mac) = split /=/;
$ci_mac =~ s/\s*$//;
$ci_mac =~ s/(?:[^:]+: )((?:[\dA-F]{2}?)+)/$1/;
$ci_mac =~ s/ /:/g;
$mac_online[$i] = $ci_mac;
$ci_vlan =~ s/$command//;
$ci_vlan =~ s/\.(\d+).+/$1/;
$vlan_online[$i] = $ci_vlan;
$i++;
}
close(SNMP);
#Запись во временную таблицу
for ($a = 0; $a <= $i; $a++) {
$query = "INSERT INTO mac_temp (mac, vlan) values ('$mac_online[$a]', '$vlan_online[$a]');"; # <-------- Ошибка
$sth = $dbh->prepare($query);
$sth->execute || die print "Невозможно выполнить SQL запрос: $DBI::errstr\n";
}
$sth->finish();
#Поиск пользователей на блокировку
foreach (@mac_all) { $temp{$_} = 1; }
foreach (@mac_online) { push @result, $_ unless (defined($temp{$_})); }
#Выборка левых маков
foreach my $mac_drop (@result) {
#Поиск вилана по маку
$query = "SELECT mac, vlan FROM mac_temp WHERE mac = '$mac_drop';";
$sth = $dbh->prepare($query);
$sth->execute || die print "Невозможно выполнить SQL запрос: $DBI::errstr\n";
my ($mac, $vlan) = $sth->fetchrow_array();
#Убираем служебные виланы
if ($vlan > 99 && $vlan != 191) {
print "$mac - $vlan - $date\n";
#Блокировка маков на cisco
#$session->cmd("mac-address-table static $mac vlan $vlan drop");
#Записываем лог в базу
#my $query1 = "INSERT INTO user_log (user, mac, vlan, action, date) values ('unknown', '$mac', '$vlan', 'disable', '$date');";
#my $sth1 = $dbh->prepare($query1);
#$sth1->execute || die print "Невозможно выполнить SQL запрос: $DBI::errstr";
#$sth1->finish();
#Проверка мака в тавлице user_drop
#$query1 = "SELECT user FROM user_drop WHERE user = '$mac';";
#$sth1 = $dbh->prepare($query1);
#$sth1->execute || die print "Невозможно выполнить SQL запрос: $DBI::errstr";
#my $string = $sth1->fetchrow_array;
#$sth1->finish();
#Если нет в тавлице user_drop то добавляем
#if (!$string) {
#$query1 = "INSERT INTO user_drop (user, mac, vlan, gid, date) values ('unknown', '$mac', '$vlan', '0', '$date');";
#$sth1 = $dbh->prepare($query1);
#$sth1->execute || die print "Невозможно выполнить SQL запрос: $DBI::errstr";
#$sth1->finish();
#}
}
}
#Закрытие сессии
$sth->finish();
#Отключение от Cisco
$session->close;
#Отключение от MySQL
$dbh->disconnect();
Код: Выделить всё
Use of uninitialized value within @mac_online in concatenation (.) or string at ./drop.pl line 99.
Use of uninitialized value in concatenation (.) or string at ./drop.pl line 99.