簡體   English   中英

Nagios 檢查中的 Perl 正則表達式

[英]Perl regex in Nagios check

我對perl不熟悉,我有修改Nagios檢查的需要。 我很感激有關如何進行的任何建議。 我正在使用的支票是 check_smart,在這里找到:

https://www.claudiokuenzler.com/nagios-plugins/check_smart.php

此腳本可讓您檢查硬盤驅動器中的 SMART 值,並以簡單的形式顯示結果以進行監控。 就目前而言,腳本可以采用 /dev/sd[ac] 形式的正則表達式作為選項之一; 我相信這是允許這樣做的部分:

        # 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] - Device is clean --- [/dev/sdb] - Device is clean --- [/dev/sdc] - Device is干凈的

編輯:這是設置 $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_dl可能命名$opt_d ,與您的$opt_d ,這是兩個單獨的變量。

if語句中,如果$opt_d未設置(即沒有為腳本提供任何設備名稱以進行操作),則使用$opt_g的值調用glob並且實際上是glob根據以下內容找出所有文件名$opt_g給出的正則表達式。

在這個if語句之后, @dev數組被歸檔了要處理的設備名稱。

然后你有一個foreach語句,這意味着@dev數組中的每個項目都有一個循環。 在循環期間,每個項目都在$opt_dl變量中,因為它在foreach語句中使用。

但是,我無法理解您在最后一段中想做什么。

我是 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[az] )將創建一個列表( $opt_dl )並且插件將在 for 循環中運行每個驅動器。

具體來說,我希望能夠傳遞類似於“megaraid,[5-8]”的腳本,並讓它為每個腳本運行。 在這種情況下,我不會傳遞設備的正則表達式,它只是 /dev/sda。

自 5.0 版(於 2014 年 4 月發布,在您提出問題之前;-))以來,這已經成為可能。 您只需要更改語法。 不是在-d上使用 glob 表達式,而是在接口參數 ( -i ) 上使用它。 實際示例: -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-控制器

我希望這能回答你的問題,盡管我可能晚了兩年。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM