LINUX.ORG.RU
решено ФорумAdmin

Перл, на разных ОС работает по разному.


0

1

доброго дня всем. Есть самописный скрипт, писался для контроллера датчиков температуры и влажности, от малоизвестной компании actidata, взамен кривому софту, но речь не о компании. речь о перле. Дан скрипт:

#!/usr/bin/perl -w
#Суть скрипта в том, что контроллер при опросе выводит трехзначное число: к примеру 281 градуса(с показаний контроллера) должно выглядеть как  28.1, аналогично с влажностью
$SNMPWLK = "/usr/local/nagios/libexec/check_snmp ";
my $IP = shift;
my $OID_PREF = shift;
my $ARG1 = shift;
my $ARG2 = shift;
my $zn = shift;
$WARN_TEM=$ARG1*10;
$CRIT_TEM=$ARG2*10;
$source1 = `$SNMPWLK -H '$IP' -o '$OID_PREF' -w '$WARN_TEM'  -c '$CRIT_TEM' | awk '{ print \$4}' | tr "**" " "` ;
$human_read1 = ($source1/10);
$i=0;
# если с датчика пришло по нулям - значит датчик видимо отвалился, посему сменим статус
if($source1==0){
$i++;
}
else {
$i=0;
}
#сама замена
if($i==1) {
        $zamena1 = "UNKNOWN";
        $test = `$SNMPWLK -H '$IP' -o '$OID_PREF'  -w '$WARN_TEM'  -c '$CRIT_TEM' | awk '{ print \$1,"$zamena1",\$3,'$human_read1', "$zn", \$5, \$6 } '`;
}
else {
        $test = `$SNMPWLK -H '$IP' -o '$OID_PREF' -w '$WARN_TEM'  -c '$CRIT_TEM' | awk '{ print \$1,\$2,\$3,'$human_read1',"$zn" , \$5, \$6 } '`;
}

print "$test";
my ($exit_code);

if($test =~ m/OK/i){
$exit_code = 0;
}
if($test =~ m/WARNING/i){
 $exit_code = 1;
}
if($test =~ m/CRITICAL/i){
 $exit_code = 2;
}
if($test =~ m/UNKNOWN/i){
 $exit_code = 3;
}
exit $exit_code;

передав ему нужные параметры, на выходе получим:

SNMP OK - 99.8 *f | iso.3.6.1.4.1.37758.1.10.1.2.3=998

а теперь об интересном:

при выводе на сервере с centos 6.4 вылезает ошибка

Argument "with\n" isn't numeric in division (/) at /usr/lib64/nagios/plugins/check_anv line 14.
External UNKNOWN error 0 *f no output

в обоих случаях perl 5.10.1

Есть у кого какие мысли на этот счет?



Последнее исправление: Rockon (всего исправлений: 2)

$SNMPWLK -H '$IP' -o '$OID_PREF' -w '$WARN_TEM' -c '$CRIT_TEM' | awk '{ print \$4}' | tr «**» " «` ;

Это в развернутом виде запусти из консоли на проблемной машине, скорее всего, оно выдает ошибку и неправильный вывод потом вызывает ошибку в перле.

P.S. я не люблю из перла вызывать команды через ``
предпочитаю через open()

sdio ★★★★★
()
Последнее исправление: sdio (всего исправлений: 3)

1) добавить

use strict;
use warnings;
в начало и разрезолвить все ошибки, которые будут связаны с переменными (добавить my)

2) после строки

$source1 = `$SNMPWLK -H '$IP' -o '$OID_PREF' -w '$WARN_TEM'  -c '$CRIT_TEM' | awk '{ print \$4}' | tr "**" " "` ;

сделать вывод этого $source1

Результат - сюда

bvn13 ★★★★★
()
Ответ на: комментарий от bvn13
rpm -q net-snmp
пакет net-snmp не установлен

:)

Rockon
() автор топика

Зачем внешний $SNMPWLK вместо use SNMP_util;?

Зачем его вызывать два раза?

И уж совсем непонятно, зачем из перла(NB!) вызывать во внешнем шелле `awk '{ print \$4}' | tr «**» " «`?

baka-kun ★★★★★
()
Ответ на: комментарий от slackwarrior

И уж совсем непонятно, зачем из перла(NB!) вызывать во внешнем шелле `awk

а because he can как же? :)

Нет, ты не понял. Ведь можно было вызвать .net или python3, удобно и хорошо.

anonymous
()
Ответ на: комментарий от anonymous

это был мой первый скрипт на перле. свои задачи он выполняет и бог с ним. Понятно, что есть правила тона, но тут не тот случай. Я умею читать код на перле, иногда писать что-то свое. А вообще, если вдруг кто покажет на примере данного скрипта, как надо писать «по-правильному» - буду благодарен.

Rockon
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.