2017-02-03 17 views
0

Я не знаком с 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.

Если бы кто-нибудь мог дать мне совет по этому поводу, я был бы признателен!

+0

Трудно комментировать '$ opt_d', не видя кода, который его устанавливает. '$ opt_dl' используется для итерации через массив' @ dev', который, я думаю, содержит список устройств. – codeforester

+0

Спасибо за ваш ответ, я отредактировал сообщение, чтобы показать, как установлен параметр $ opt_d. – user2792137

ответ

1

$opt_dl, вероятно, плохо назван и не имеет ничего общего с вашим $opt_d, это две отдельные переменные.

Из if заявления, если $opt_d не установлен (то есть сценарий не получили какое-либо имя устройства, чтобы воздействовать на), то glob вызываются со значением $opt_g, и именно в том, что узнает все имена файлов glob основанный на регулярном выражении, заданном внутри $opt_g.

После этого оператора if массив @dev хранится с именами устройств для обработки.

И тогда у вас есть инструкция foreach, которая означает цикл для каждого элемента внутри массива @dev. И во время цикла каждый элемент находится в переменной $opt_dl из-за его использования в операторе foreach.

Однако я не мог понять, что вы хотели сделать в своем последнем абзаце.

+0

Спасибо за вашу помощь, я прочитаю об использовании «glob». В последнем абзаце я имел в виду, что текущий скрипт работает с регулярным выражением, когда вы передаете ему переменную для дисков (/ dev/sd [ac]), и я бы хотел, чтобы он выполнял аналогичный цикл через переменная для RAID-карты (megaraid, [5-8]); они оба по существу делают то же самое, как раз в случае с RAID-картой, диски находятся за картой, поэтому они не отображаются как отдельные устройства. – user2792137

+0

Если вы передаете скрипту строку «megaraid, [5-8]», что он должен вычислять из нее, каковы каждый элемент цикла? Где/Как используется переменная для RAID-карты? –

 Смежные вопросы

  • Нет связанных вопросов^_^