Я не знаком с perl, и мне нужно изменить проверку Nagios. Я был бы признателен за любые советы о том, как действовать. Проверка я использую check_smart, здесь:Perl regex in Nagios check
https://www.claudiokuenzler.com/nagios-plugins/check_smart.php
Этот сценарий позволяет проверить SMART значения с жестких дисков и представить результаты в простой форме для мониторинга. По существу, сценарий может принимать регулярное выражение в форме/dev/sd [a-c] для одного из параметров; Я считаю, что это раздел, который позволяет это:
# list of devices for a loop
my(@dev);
if ($opt_d){
# normal mode - push opt_d on the list of devices
push(@dev,$opt_d);
} else {
# glob all devices - try '?' first
@dev =glob($opt_g);
}
foreach my $opt_dl (@dev){
warn "Found $opt_dl\n" if $opt_debug;
if (-b $opt_dl || -c $opt_dl){
$device .= $opt_dl.":";
} else {
warn "$opt_dl is not a valid block/character special device!\n\n" if $opt_debug;
}
}
Я не совсем понимаю, почему переменная $ opt_dl когда ранее, кажется, $ opt_d. Результатом, однако, является то, что скрипт возвращает что-то вроде: OK: [/ dev/sda] - Устройство чиста --- [/ dev/sdb] - Устройство чиста --- [/ dev/sdc] - Устройство является чистым
EDIT: Вот код, где $ opt_d установлен; по дальнейшему мнению, похоже, что $ opt_dl - это просто $ opt_d, когда он находится в цикле или что-то в этом роде?
use vars qw($opt_b $opt_d $opt_g $opt_debug $opt_h $opt_i $opt_v);
Getopt::Long::Configure('bundling');
GetOptions(
"debug" => \$opt_debug,
"b=i" => \$opt_b, "bad=i" => \$opt_b,
"d=s" => \$opt_d, "device=s" => \$opt_d,
"g=s" => \$opt_g, "global=s" => \$opt_g,
"h" => \$opt_h, "help" => \$opt_h,
"i=s" => \$opt_i, "interface=s" => \$opt_i,
"v" => \$opt_v, "version" => \$opt_v,
);
Часть кода, который я хотел бы изменить в подобной моды:
# Allow all device types currently supported by smartctl
# See http://www.smartmontools.org/wiki/Supported_RAID-Controllers
if ($opt_i =~ m/(ata|scsi|3ware|areca|hpt|cciss|megaraid|sat)/) {
$interface = $opt_i;
} else {
print "invalid interface $opt_i for $opt_d!\n\n";
print_help();
exit $ERRORS{'UNKNOWN'};
}
В частности, я хотел бы быть в состоянии передать скрипт что-то вроде «MegaRAID, [ 5-8], и пусть это будет работать для каждого. В этом случае я бы не передавал регулярное выражение для устройства, это было бы просто/dev/sda.
Если бы кто-нибудь мог дать мне совет по этому поводу, я был бы признателен!
Трудно комментировать '$ opt_d', не видя кода, который его устанавливает. '$ opt_dl' используется для итерации через массив' @ dev', который, я думаю, содержит список устройств. – codeforester
Спасибо за ваш ответ, я отредактировал сообщение, чтобы показать, как установлен параметр $ opt_d. – user2792137