2017-02-03 7 views
0

나는 perl에 익숙하지 않다. 나는 Nagios 체크를 수정할 필요가있다. 진행 방법에 대한 조언을 주시면 감사하겠습니다.Nagios의 펄 정규식 체크

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

이 스크립트는 하드 드라이브의 SMART 값을 확인 및 모니터링을위한 간단한 형태로 결과를 제공 할 수 있습니다 : 내가 사용 체크는 여기 check_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_d 것 같다 때 변수가 $ opt_dl은 왜 아주 이해가 안 :이이를 수있는 부분이라고 생각합니다. 그러나 결과는 다음과 같습니다. OK : [/ dev/sda] - 장치가 깨끗함 - [/ dev/sdb] - 장치가 깨끗함 - [/ dev/sdc] - 장치 깨끗한가

EDIT : 여기에 $ 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'}; 
    } 

, 나는 "메가 RAID, [같은 스크립트 뭔가를 통과 할 수 있도록하고 싶습니다 5-8]. 이 경우 장치에 대한 정규 표현식을 전달하지 않고/dev/sda가됩니다.

누구나 내가이 점에 대해 조언을 해줄 수 있다면 고맙겠습니다!

+0

'$ opt_d'에 대해서는 설정하는 코드를 보지 않고서는 논평하기가 어렵습니다. '$ opt_dl'는'@ dev' 배열을 반복하는데 사용되는데, 이것은 장치 목록을 가지고 있다고 생각합니다. – codeforester

+0

답장을 보내 주셔서 감사합니다. $ opt_d 설정 방법을 보여주기 위해 게시물을 편집했습니다. – user2792137

답변

1

$opt_dl은 아마도 부적절한 이름이며 $opt_d과 아무 관련이 없습니다.이 두 변수는 별개의 변수입니다. $opt_d (즉에 따라 행동하는 모든 장치 이름이 지정되지 않은 스크립트) 설정되어 있지 않은 경우 if 문에서

은 다음 glob$opt_g의 가치를 호출하며 모든 파일 이름을 발견 사실 glob입니다 정규식은 $opt_g 내부에 있습니다.

if 문 뒤에는 @dev 배열이 처리 할 장치의 이름으로 저장됩니다.

다음 @dev 배열 내의 각 항목에 대한 루프를 의미하는 foreach 문이 있습니다. 그리고 루프 중에 각 항목은 foreach 문에 사용되기 때문에 $opt_dl 변수에 있습니다.

그러나 나는 당신이 당신의 마지막 단락에서하고 싶었던 것을 이해할 수 없었습니다.

+0

도움을 주셔서 감사합니다. 'glob'을 사용하여 읽습니다. 마지막 단락에서 의미 한 것은 현재 스크립트가 드라이브 (/ dev/sd [ac])에 대한 변수를 전달할 때 정규 표현식과 함께 작동한다는 것입니다.이 스크립트를 통해 유사한 루프를 수행하는 것이 좋습니다. RAID 카드의 변수 (megaraid, [5-8]); 그들은 모두 기본적으로 동일한 일을하고 있습니다. RAID 카드의 경우 드라이브가 카드 뒤에 있으므로 별도의 장치로 나타나지 않습니다. – user2792137

+0

스크립트에서 "megaraid, [5-8]"문자열을 계산하면 루프에서 각 항목은 무엇입니까? RAID 카드의 어디에서/어떻게 사용합니까? –