2017-02-03 33 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卡的可變性? –