2017-02-03 31 views
0

我对Perl不熟悉,我需要修改Nagios检查。我会很感激任何关于如何进行的建议。我使用的检查是check_smart,发现这里:Nagios检查中的Perl正则表达式

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] - 设备是干净的

编辑:这里的代码$ 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阵列内的每个项目上的循环。在循环过程中,由于在foreach声明中的使用,每个项目都在$opt_dl变量中。

但是我无法理解你想要在最后一段中做什么。

+0

感谢您的帮助,我会阅读使用'glob'。我在最后一段中的意思是,当你传递变量给驱动器(/ dev/sd [ac])时,当前脚本使用正则表达式,我希望它通过变量为RAID卡(megaraid,[5-8]);它们基本上都是做同样的事情,就像RAID卡一样,驱动器在卡的后面,所以不会显示为单独的设备。 – user2792137

+0

如果你通过脚本的字符串“megaraid,[5-8]”它应该从它计算什么,循环的每个项目是什么?在哪里/如何使用RAID卡的可变性? –