【问题标题】:Perl regex in Nagios checkNagios 检查中的 Perl 正则表达式
【发布时间】:2017-06-21 08:13:09
【问题描述】:

我不熟悉 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。

如果有人能就此提供建议,我将不胜感激!

【问题讨论】:

  • 如果没有看到设置它的代码,就很难评论$opt_d$opt_dl 用于迭代 @dev 数组,我猜它包含设备列表。
  • 感谢您的回复,我已经编辑了帖子以显示如何设置 $opt_d。

标签: linux perl nagios


【解决方案1】:

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

if 语句中,如果$opt_d 未设置(即脚本未指定任何设备名称以对其进行操作),则使用$opt_g 的值调用glob,它是@ 987654327@ 实际上是根据$opt_g 中给出的正则表达式找出所有文件名。

if 语句之后,@dev 数组中包含要处理的设备名称。

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

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

【讨论】:

  • 感谢您的帮助,我将继续阅读有关使用“glob”的信息。我在上一段中的意思是,当您将驱动器的变量 (/dev/sd[ac]) 传递给当前脚本时,当前脚本可以使用正则表达式,而我希望它通过RAID 卡的变量(megaraid,[5-8]);它们本质上都在做同样的事情,只是在 RAID 卡的情况下,驱动器位于卡后面,因此不会显示为单独的设备。
  • 如果您将字符串“megaraid,[5-8]”传递给脚本,它应该从中计算什么,循环的每个项目是什么? RAID 卡的变量在哪里/如何使用?
【解决方案2】:

我是 check_smart 的维护者,有趣的是我现在不小心偶然发现了这个问题。

我不太明白为什么变量是 $opt_dl,而之前它似乎是 $opt_d。然而,结果是脚本返回如下内容: OK: [/dev/sda] - Device is clean --- [/dev/sdb] - Device is clean --- [/dev/sdc] - Device is干净

所以基本上当您使用-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 月发布,早于您的问题 ;-) 以来,这已经成为可能。您只需要更改语法。您可以在接口参数 (-i) 上使用它,而不是在 -d 上使用 glob 表达式。实际例子:-i 'megaraid,[5-8]'.

自最新版本(6.6,几天前发布)以来,多个驱动器检查(使用 -g)和硬件存储/RAID 控制器的输出略有变化,现在指示接口的设备 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 年。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    相关资源
    最近更新 更多