Nagios中的Perl正则表达式检查

时间:2017-02-03 21:05:25

标签: linux perl nagios

我对perl不熟悉,我需要修改Nagios检查。我很感激有关如何进行的任何建议。我正在使用的支票是check_smart,可在此处找到:

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。

如果有人能就此提出建议,我会很感激!

2 个答案:

答案 0 :(得分:1)

$opt_dl可能命名不佳,与您的$opt_d无关,这是两个独立的变量。

if语句中,如果未设置$opt_d(即脚本未被授予任何设备名称,则会调用glob,其值为{ {1}}实际上$opt_g根据glob中给出的正则表达式找出所有文件名。

在此$opt_g语句之后,if数组将包含要处理的设备名称。

然后你有一个@dev语句,这意味着foreach数组中每个项目的循环。在循环过程中,每个项目都在@dev变量中,因为它在$opt_dl语句中使用。

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

答案 1 :(得分:0)

我是check_smart的维护者,很可笑,我现在偶然偶然发现了这个问题。

  

我不太明白为什么变量在以前是$ opt_d时才是$ opt_dl。但是,结果是脚本返回以下内容:确定:[/ dev / sda]-设备干净--- [/ dev / sdb]-设备干净--- [/ dev / sdc]-设备干净干净

因此,基本上,当您使用-g参数时,您告诉check_smart插件使用glob(https://perldoc.perl.org/functions/glob.html)-这与正则表达式不同。与glob表达式匹配的驱动器(例如-d '/dev/sd[a-z])将创建一个列表($opt_dl),并且该插件将在for循环中遍历每个驱动器。

  

具体来说,我希望能够传递诸如“ megaraid [5-8]”之类的脚本,并让每个脚本都运行。在这种情况下,我不会为设备传递正则表达式,而只是/ dev / sda。

自5.0版(2014年4月发布,比您的问题还早;-))已经可以实现。您只需要更改语法。不用在-d上使用glob表达式,而是在接口参数(-i)上使用它。实际示例:-i 'megaraid,[5-8]'

自从最新版本(几天前发布6.6)以来,用于多次驱动器检查(使用-g)和硬件存储/突袭控制器的输出已略有变化,现在指示接口的设备ID,而不是逻辑驱动器路径:

# ./check_smart.pl -g /dev/sda -i 'megaraid,[1-3]'
OK: [megaraid,1] - Device is clean --- [megaraid,2] - Device is clean --- [megaraid,3] - Device is clean|

这也都在官方文档中进行了描述。

更多信息: https://www.claudiokuenzler.com/monitoring-plugins/check_smart.php https://www.claudiokuenzler.com/blog/914/check_smart-6.6-multiple-drives-check-megaraid-3ware-cciss-controllers

我希望这能回答您的问题,尽管我可能迟到了2年。