Ошибка в Perl программе

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Podedinov
мл. сержант
Сообщения: 84
Зарегистрирован: 2008-12-28 11:50:19

Ошибка в Perl программе

Непрочитанное сообщение Podedinov » 2010-06-15 10:39:20

Есть вот такая программулина на PERL:

Код: Выделить всё

#!/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.
Может кто-нибудь подскажет как ее исправить.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
thefree
лейтенант
Сообщения: 980
Зарегистрирован: 2008-12-29 9:23:19
Откуда: Весёлая Страна

Re: Ошибка в Perl программе

Непрочитанное сообщение thefree » 2010-06-15 11:13:22

а ты поставь вот так и покажи что выводит

Код: Выделить всё

print "$mac_online[$a]' - $vlan_online[$a]\n";
$query = "INSERT INTO mac_temp (mac, vlan) values ('$mac_online[$a]', '$vlan_online[$a]');";  # <-------- Ошибка
И посомтри нет ли пустых строк
И еще в догонку правильнее будет

Код: Выделить всё

#Запись во временную таблицу
for (my $a = 0; $i <= $#mac_online; $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";
   
}
А вообще вписывал бы ты лучше в hash все намного удобнее же ...
Не судите меня строго, Я не волшебник, а только учусь!
http://planetbsd.ru - RSS-агрегатор *BSD по Рунету

Podedinov
мл. сержант
Сообщения: 84
Зарегистрирован: 2008-12-28 11:50:19

Re: Ошибка в Perl программе

Непрочитанное сообщение Podedinov » 2010-06-15 13:12:37

Проверил пустых сток нет, thefree c хешами не когда не работал, если есть желание можешь помочь.

Аватара пользователя
thefree
лейтенант
Сообщения: 980
Зарегистрирован: 2008-12-29 9:23:19
Откуда: Весёлая Страна

Re: Ошибка в Perl программе

Непрочитанное сообщение thefree » 2010-06-15 15:44:18

Код: Выделить всё

#Запись во временную таблицу
for (my $a = 0; $a <= $#mac_online; $a++) {
    if ($mac_online[$a] and $vlan_online[$a]) {
    $query = "INSERT INTO mac_temp (mac, vlan) values ($dbh->quote($mac_online[$a]), $dbh->quote($vlan_online[$a]))";
    $sth = $dbh->prepare($query);
    $sth->execute || die print "Невозможно выполнить SQL запрос: $DBI::errstr\n";
    }
}
Не судите меня строго, Я не волшебник, а только учусь!
http://planetbsd.ru - RSS-агрегатор *BSD по Рунету

Podedinov
мл. сержант
Сообщения: 84
Зарегистрирован: 2008-12-28 11:50:19

Re: Ошибка в Perl программе

Непрочитанное сообщение Podedinov » 2010-06-15 15:52:56

Пишет теперь вот такую ошибку:

Код: Выделить всё

Невозможно выполнить SQL запрос: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '::db=HASH(0xab7960)->quote(00:25:11:C1:18:A7), DBI::db=HASH(0xab7960)->quote(1))' at line 1
1 at ./drop.pl line 111.

Аватара пользователя
thefree
лейтенант
Сообщения: 980
Зарегистрирован: 2008-12-29 9:23:19
Откуда: Весёлая Страна

Re: Ошибка в Perl программе

Непрочитанное сообщение thefree » 2010-06-15 20:14:21

Код: Выделить всё

#Запись во временную таблицу
for (my $a = 0; $a <= $#mac_online; $a++) {
  if ($mac_online[$a] and $vlan_online[$a]) {
    $query = "INSERT INTO mac_temp (mac, vlan) values (".$dbh->quote($mac_online[$a]).", ".$dbh->quote($vlan_online[$a]).")";
    $sth = $dbh->prepare($query);
    $sth->execute || die print "Невозможно выполнить SQL запрос: $DBI::errstr\n";
  }
}
Не судите меня строго, Я не волшебник, а только учусь!
http://planetbsd.ru - RSS-агрегатор *BSD по Рунету

Podedinov
мл. сержант
Сообщения: 84
Зарегистрирован: 2008-12-28 11:50:19

Re: Ошибка в Perl программе

Непрочитанное сообщение Podedinov » 2010-06-16 7:26:38

thefree большое спасибо, все получилось.