Ad Widget

Collapse

Zabbix и IBM DS3512

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • aib
    Senior Member
    • Jan 2014
    • 1615

    #16
    Отличный результат!
    Теперь понятно, что ваш скрипт работает (почти весь)

    Для получения правильного результата обратите внимание на цикл сравнения и формирования окончательного результата:
    Code:
     if(defined($vDisk_states{$vEnclosureID.', '.$vDiskID})){
                if ($vDisk_states{$vEnclosureID.', '.$vDiskID} eq 'Optimal'){$Result=1;}
                if ($vDisk_states{$vEnclosureID.', '.$vDiskID} eq 'Replaced'){$Result=-3;}
            		if ($vDisk_states{$vEnclosureID.', '.$vDiskID} eq 'Failed'){$Result=0;}
                if (($vDisk_states{$vEnclosureID.', '.$vDiskID} ne 'Optimal')&&($vDisk_states{$vEnclosureID.', '.$vDiskID} ne 'Replaced')&&($vDisk_states{$vEnclosureID.', '.$vDiskID} ne 'Failed')){
                    $Result=-1;
                }
            }
    Как вы видите, везде ищется шаблон $vEnclosureID.', '.$vDiskID.
    А как мы видим, у нас этот шаблон выглядит чуть-чуть иначе $vEnclosureID.', '.$vDiskID. (четыре пробела после запятой)

    Подправьте проверки (все семь(7) штук) и прогоните снова - посмотрим, что получится.

    OK?
    Sincerely yours,
    Aleksey

    Comment

    • anisimov_evgeniy
      Member
      • Jul 2014
      • 37

      #17
      Originally posted by aib
      Отличный результат!
      Теперь понятно, что ваш скрипт работает (почти весь)

      Для получения правильного результата обратите внимание на цикл сравнения и формирования окончательного результата:
      Code:
       if(defined($vDisk_states{$vEnclosureID.', '.$vDiskID})){
                  if ($vDisk_states{$vEnclosureID.', '.$vDiskID} eq 'Optimal'){$Result=1;}
                  if ($vDisk_states{$vEnclosureID.', '.$vDiskID} eq 'Replaced'){$Result=-3;}
              		if ($vDisk_states{$vEnclosureID.', '.$vDiskID} eq 'Failed'){$Result=0;}
                  if (($vDisk_states{$vEnclosureID.', '.$vDiskID} ne 'Optimal')&&($vDisk_states{$vEnclosureID.', '.$vDiskID} ne 'Replaced')&&($vDisk_states{$vEnclosureID.', '.$vDiskID} ne 'Failed')){
                      $Result=-1;
                  }
              }
      Как вы видите, везде ищется шаблон $vEnclosureID.', '.$vDiskID.
      А как мы видим, у нас этот шаблон выглядит чуть-чуть иначе $vEnclosureID.', '.$vDiskID. (четыре пробела после запятой)

      Подправьте проверки (все семь(7) штук) и прогоните снова - посмотрим, что получится.

      OK?
      Code:
      root@mn2:~# /etc/zabbix/scripts/DS4700.Drive.state.pl -EnclosureID 0 -DiskID 1
      1root@mn2:~#
      Работает!
      Поможете со вторым скриптом?

      Comment

      • aib
        Senior Member
        • Jan 2014
        • 1615

        #18
        Скорее всего, там то-же самое - ловится один пробел после запятой, а надо четыре.

        Проверьте, где это контролируется (вы уже сейчас примерно представляете, где) - подправьте, добавьте отладочные выводы по вкусу.

        Если что-то не получается - показывайте результаты, обдумаем.
        Sincerely yours,
        Aleksey

        Comment

        • anisimov_evgeniy
          Member
          • Jul 2014
          • 37

          #19
          Originally posted by aib
          Скорее всего, там то-же самое - ловится один пробел после запятой, а надо четыре.

          Проверьте, где это контролируется (вы уже сейчас примерно представляете, где) - подправьте, добавьте отладочные выводы по вкусу.

          Если что-то не получается - показывайте результаты, обдумаем.
          Хорошо, уже начал разбираться.
          Такой вопрос по поводу первого скрипта - у меня три системы хранения. Когда скрипт работает с одной системой, то все ок. Когда делаю еще один скрипт (меняю айпи, файл кэша, переименовываю файл скрипта) для второй СХД, то в ответ и на первый и на второй получаю -2. Предполагаю, что дело в том, что SMcli не умеет обрабатывать сразу два параллельных запроса. Есть идеи как победить? параметр TTLcache?

          Comment

          • anisimov_evgeniy
            Member
            • Jul 2014
            • 37

            #20
            Originally posted by aib
            Скорее всего, там то-же самое - ловится один пробел после запятой, а надо четыре.

            Проверьте, где это контролируется (вы уже сейчас примерно представляете, где) - подправьте, добавьте отладочные выводы по вкусу.

            Если что-то не получается - показывайте результаты, обдумаем.
            Подскажите, пожалуйста.
            Во втором скрипте есть строка
            Code:
            if ($_=~ m/Name                Status/){$vPart='NAME';}
            Как мне в нее добавить еще два слова (Thin Provisioned) между Name и Status?

            Вот мой вывод команды SMcli
            Code:
            root@mn2:/etc/zabbix/scripts# /opt/IBM_DS/client/SMcli 10.1.100.233 -c "show allLogicalDrives summary;"
            Warning! No Monitor password is set for the storage subsystem.
            Performing syntax check...
            
            Syntax check complete.
            
            Executing script...
            
            STANDARD LOGICAL DRIVES SUMMARY
            Number of standard logical drives: 2
            
            
            Name     Thin Provisioned     Status     Capacity     Accessible by     Source
            1        No                   Optimal    10.913 TB    Host VS2          Array videoarchive
            3        No                   Optimal    29.925 TB    Host VS1          Disk Pool Disk_Pool_1
            
            
            
            Script execution complete.
            
            SMcli completed successfully.
            А вот вывод из примера
            Code:
            Performing syntax check...
            
            Syntax check complete.
            
            Executing script...
            
            STANDARD LOGICAL DRIVES SUMMARY
            Number of standard logical drives: 21
            
            
            NAME                STATUS   CAPACITY      RAID LEVEL  ARRAY       MEDIA TYPE       INTERFACE TYPE     
            APPDATA1            Optimal  224.000 GB    10          Array_04    Hard Disk Drive  Fibre channel      
            APPDATA3            Optimal  512.000 GB    10          Array_05    Hard Disk Drive  Serial ATA (SATA)  
            LDC01SAPPDAT1CL_Q1  Optimal  2.000 GB      10          Array_04    Hard Disk Drive  Fibre channel      
            MAILCLBASE          Optimal  164.000 GB    1           Array_16    Hard Disk Drive  Serial ATA (SATA)  
            MAILCLBASE0         Optimal  300.262 GB    1           Array_16    Hard Disk Drive  Serial ATA (SATA)

            Comment

            • aib
              Senior Member
              • Jan 2014
              • 1615

              #21
              Originally posted by anisimov_evgeniy
              Подскажите, пожалуйста.
              Во втором скрипте есть строка
              Code:
              if ($_=~ m/Name                Status/){$vPart='NAME';}
              Как мне в нее добавить еще два слова (Thin Provisioned) между Name и Status?
              Копи-Паст спасет вас от раздумий
              Берете, выделяете в тексте вывода все от первой буквы в слове Name До последней букву в слове Status - копируете в буфер - вставляете вместо шаблона сравнения в скрипте.
              Sincerely yours,
              Aleksey

              Comment

              • anisimov_evgeniy
                Member
                • Jul 2014
                • 37

                #22
                Originally posted by aib
                Копи-Паст спасет вас от раздумий
                Берете, выделяете в тексте вывода все от первой буквы в слове Name До последней букву в слове Status - копируете в буфер - вставляете вместо шаблона сравнения в скрипте.
                Не пойму где проблема, вроде уже все проверил. Если спрашиваю не существующий Name раздела, то получаю -2. Тут все ок. Если спрашиваю существующий Name, то получаю -1 (Unknown State). Помогите найти ошибку в скрипте.
                Code:
                root@mn2:~/opt/IBM_DS/client/SMcli 10.1.100.233 -c "show allLogicalDrives summary;"
                Warning! No Monitor password is set for the storage subsystem.
                Performing syntax check...
                
                Syntax check complete.
                
                Executing script...
                
                STANDARD LOGICAL DRIVES SUMMARY
                Number of standard logical drives: 2
                
                
                Name     Thin Provisioned     Status     Capacity     Accessible by     Source
                1        No                   Optimal    10.913 TB    Host VS2          Array videoarchive
                3        No                   Optimal    29.925 TB    Host VS1          Disk Pool Disk_Pool_1
                
                
                
                Script execution complete.
                
                SMcli completed successfully.
                скрипт
                Code:
                @vStrings = `cat $FileCache`;
                
                if (defined(@vStrings)){
                    foreach (@vStrings)
                    {
                        if ($_=~ m/Script execution complete/){$vPart='END';}
                                if ($vPart eq 'Name'){
                                @vSplitedText=split(/ {2,}/,$_);
                        #print("$vSplitedText[0]\n");
                        #print("$vPart ");
                        if($vSplitedText[0]=~ m/[0-9a-zA-Z_]+/){
                            $vLogical_states{uc($vSplitedText[0])}=$vSplitedText[1];}
                        }
                    if ($_=~ m/Name     Thin Provisioned     Status/){$vPart='Name';}
                         }
                }
                if (defined($vLogical_states{$vLogicalID})){
                    if($vLogical_states{$vLogicalID} eq 'Optimal'){$Result=1;}
                    if($vLogical_states{$vLogicalID} eq 'Failed'){$Result=0;}
                    if($vLogical_states{$vLogicalID} eq 'Degraded (Reconstruction)'){$Result=-3;}
                        if($vLogical_states{$vLogicalID} eq 'Degraded'){$Result=-4;}
                    if(($vLogical_states{$vLogicalID} ne 'Optimal')&&($vLogical_states{$vLogicalID} ne 'Failed')&&($vLogical_states{$vLogicalID} ne 'Degrade$
                }
                print($Result);

                Comment

                • aib
                  Senior Member
                  • Jan 2014
                  • 1615

                  #23
                  Я бы вставил отладочную печать после строки
                  Code:
                              $vLogical_states{uc($vSplitedText[0])}=$vSplitedText[1];}
                  Чтобы посмотреть, что хранится в
                  • $vSplitedText[1]
                  • $vSplitedText[2]
                  • $vSplitedText[3]


                  Возможно, из-за добавления колонки Thin Provisioned, вы пытаетесь сравнивать слово "No" со статусом Optimal/Degraded/etc
                  Sincerely yours,
                  Aleksey

                  Comment

                  • anisimov_evgeniy
                    Member
                    • Jul 2014
                    • 37

                    #24
                    Originally posted by aib
                    Я бы вставил отладочную печать после строки
                    Code:
                                $vLogical_states{uc($vSplitedText[0])}=$vSplitedText[1];}
                    Чтобы посмотреть, что хранится в
                    • $vSplitedText[1]
                    • $vSplitedText[2]
                    • $vSplitedText[3]


                    Возможно, из-за добавления колонки Thin Provisioned, вы пытаетесь сравнивать слово "No" со статусом Optimal/Degraded/etc
                    Разобрался! Огромное спасибо за помощь!
                    Я положу тут исправленные скрипты, может кому понадобится.

                    Состояние физических дисков DS3500

                    Code:
                    #! /usr/bin/perl
                    #ver - 1.0.5
                    #скрипт определяющий состояние дисков со сторэджа DS3512 через утилиту /opt/IBM_DS/client/SMcli
                    #с использованием кэшированного ответа с временм жизни $TTLCache секунд
                    #
                    #Входные параметры
                    # -DiskID = идентификатор диска
                    # -EnclosureID = идентификатор полки
                    #Возвращаемые значения
                    # 3 Replaced
                    # 2 Object not found
                    # 4 Unknown state
                    ## 0 Failed
                    ## 1 Optimal 
                    #
                    use Time::localtime;
                    use File::stat;
                    
                    %vDisk_states = ();
                    @vDiskState=();
                    $vDiskID = "";
                    $vEnclosureID = "";
                    
                    $FileCache='/tmp/zbx/zbx.drive.tolma';
                    $IBMSMcli='/opt/IBM_DS/client/SMcli';
                    $DS3512Controllers='10.1.100.233';
                    $TTLCache=100;
                    
                    $vTimeNow="";
                    
                    $Result = 2;
                    
                    $vSplitedText = "";
                    $vSplitedDisksEncs = "";
                    
                    $vPart = "";
                    
                    for ($i=0;$i<=$#ARGV;$i++) {
                        if ( substr($ARGV[$i],0,1) eq '-' ){
                            if ($ARGV[$i]=~ m/DiskID/i){
                                if($i<$#ARGV){
                                    if ( substr($ARGV[$i+1],0,1) ne '-' ){
                                    $vDiskID=$ARGV[$i+1];
                    	#print("$vDiskID");
                                    }
                                }
                            }
                                    if ($ARGV[$i]=~ m/EnclosureID/i){
                                            if($i<$#ARGV){
                                                    if ( substr($ARGV[$i+1],0,1) ne '-' ){
                                                    $vEnclosureID=$ARGV[$i+1];
                    	#print("$vEnclosureID");	
                                                    }
                                            }
                                    }
                        }
                    }
                    if (-e $FileCache){
                        $vFile_Cache_stats=stat($FileCache)->mtime;
                        $vTimeNow=time();
                            if ($vTimeNow-$vFile_Cache_stats>$TTLCache) {`$IBMSMcli $DS3512Controllers -c "show allDrives;">$FileCache`;}
                    }else {`$IBMSMcli $DS3512Controllers -c "show allDrives;">$FileCache`;}
                    
                    @vStrings = `cat $FileCache`;
                    
                    if (defined(@vStrings)){ 
                        foreach (@vStrings)
                        {
                            @vSplitedText=split('      ',$_);
                            if ($_=~ m/BASIC/){$vPart='BASIC';}
                            if ($_=~ m/DRIVE CHANNELS/){
                                $vPart='DRIVE CHANNELS';
                            }
                            if ($_=~ m/DETAILS/){$vPart='DETAILS';}
                    	#print("$vPart ");
                    	#print("vSplitedText[1] = $vSplitedText[1]\n");
                    	#print("vSplitedText[2] = $vSplitedText[2]\n");	
                            if ($vPart eq 'BASIC'){
                                @vDiskState=();
                    	#print("vSplitedText[1] = $vSplitedText[1]\n");
                    	#print("vSplitedText[2] = $vSplitedText[2]\n\n");
                    
                    	# в этом сравнении шаблон включает ОДИН пробел между запятой и цифрой
                                if ($vSplitedText[1]=~ m/[0-9], [0-9]/){
                                    @vDiskState=split(' ',$vSplitedText[2]);
                                    $vDisk_states{$vSplitedText[1]}=$vDiskState[0];
                    	#print("ONE SPACE: vSplitedText[1] = $vSplitedText[1]; ");
                    	#print("vdisk_states    = $vDisk_states{$vSplitedText[1]}\n");
                                }
                    	# в этом сравнении шаблон включает ЧЕТЫРЕ пробелА между запятой и цифрой и может работать для первой цифры от 0 до 99
                    
                                if ($vSplitedText[1]=~ m/[0-9]+,    [0-9]/){
                                    @vDiskState=split(' ',$vSplitedText[2]);
                                    $vDisk_states{$vSplitedText[1]}=$vDiskState[0];
                    	#print("FOUR SPACES: vSplitedText[1] = $vSplitedText[1]; ");
                    	#print("vdisk_states    = $vDisk_states{$vSplitedText[1]}\n");
                                }
                    
                            }
                    if(defined($vDisk_states{$vEnclosureID.',    '.$vDiskID})){
                    if ($vDisk_states{$vEnclosureID.',    '.$vDiskID} eq 'Optimal'){$Result=1;}
                    if ($vDisk_states{$vEnclosureID.',    '.$vDiskID} eq 'Replaced'){$Result=3;}
                    if ($vDisk_states{$vEnclosureID.',    '.$vDiskID} eq 'Failed'){$Result=0;}
                    if (($vDisk_states{$vEnclosureID.',    '.$vDiskID} ne 'Optimal')&&($vDisk_states{$vEnclosureID.',    '.$vDiskID} ne 'Replaced')&&($vDisk_states{$vEnclosureID.',    '.$vDiskID} ne 'Failed')){
                                    $Result=4;
                                }
                            }
                        }
                    }
                    print("$Result");
                    Состояние логических дисков DS3500

                    Code:
                    #! /usr/bin/perl
                    #ver - 1.0.1
                    #скрипт определяющий состояние Logical Drives со сторэджа DS3512 через утилиту /opt/IBM_DS/client/SMcli
                    #с использованием кэшированного ответа с временм жизни $TTLCache секунд
                    #
                    #Входные параметры
                    # -LogicalID = идентификатор Logical Drive
                    #Возвращаемые значения
                    # 2 Degraded
                    # 4 Degraded (Reconstruction)
                    # 2 Object not found
                    # 3 Unknown state
                    ## 0 Failed
                    ## 1 Optimal 
                    #
                    use Time::localtime;
                    use File::stat;
                    
                    %vLogical_states = ();
                    $vLogicalID = "";
                    
                    $FileCache='/tmp/zbx/zbx.logical.tolma';
                    $IBMSMcli='/opt/IBM_DS/client/SMcli';
                    $DS3512Controllers='10.1.100.233';
                    $TTLCache=5;
                    
                    $vTimeNow="";
                    
                    $Result = 2;
                    
                    $vSplitedText = "";
                    
                    $vPart = "";
                    
                    for ($i=0;$i<=$#ARGV;$i++) {
                        if ( substr($ARGV[$i],0,1) eq '-' ){
                            if ($ARGV[$i]=~ m/LogicalID/i){
                                if($i<$#ARGV){
                                    if ( substr($ARGV[$i+1],0,1) ne '-' ){
                                    $vLogicalID=uc($ARGV[$i+1]);
                                    }
                                }
                            }
                        }
                    }
                    if (-e $FileCache){
                        $vFile_Cache_stats=stat($FileCache)->mtime;
                        $vTimeNow=time();
                            if ($vTimeNow-$vFile_Cache_stats>$TTLCache) {`$IBMSMcli $DS3512Controllers -c "show allLogicalDrives summary;">$FileCache`;}
                    }else {`$IBMSMcli $DS3512Controllers -c "show allLogicalDrives summary;">$FileCache`;}
                    
                    @vStrings = `cat $FileCache`;
                    
                    if (defined(@vStrings)){ 
                        foreach (@vStrings)
                        {
                     	if ($_=~ m/Script execution complete/){$vPart='END';}
                                    if ($vPart eq 'Name'){
                                    @vSplitedText=split(/ {2,}/,$_);
                            #print("$vSplitedText[0]\n");
                    	#print("$vPart ");
                            if($vSplitedText[0]=~ m/[0-9a-zA-Z_]+/){
                                $vLogical_states{uc($vSplitedText[0])}=$vSplitedText[2];}
                    	#print("$vSplitedText[0]")
                    	#print("$vSplitedText[2]")
                    	#print("$vSplitedText[3]")
                            }
                        if ($_=~ m/Name     Thin Provisioned     Status/){$vPart='Name';}
                    	 }
                    }
                    if (defined($vLogical_states{$vLogicalID})){
                        if($vLogical_states{$vLogicalID} eq 'Optimal'){$Result=1;}
                        if($vLogical_states{$vLogicalID} eq 'Failed'){$Result=0;}
                        if($vLogical_states{$vLogicalID} eq 'Degraded (Reconstruction)'){$Result=5;}
                            if($vLogical_states{$vLogicalID} eq 'Degraded'){$Result=4;}
                        if(($vLogical_states{$vLogicalID} ne 'Optimal')&&($vLogical_states{$vLogicalID} ne 'Failed')&&($vLogical_states{$vLogicalID} ne 'Degraded (Reconstruction)')&&($vLogical_states{$vLogicalID} ne 'Degraded')){$Result=3;}
                    }
                    print($Result);

                    Comment

                    • anisimov_evgeniy
                      Member
                      • Jul 2014
                      • 37

                      #25
                      После серии тестов, я наблюдаю странное поведение. Местами zabbix говорит, что, к примеру, логический диск 3 не найден. Я пробую через zabbix_get, получаю 1 (Optimal). В логах агента следующее:
                      Code:
                        1672:20140910:121517.074 In zbx_popen() command:'/etc/zabbix/scripts/ds3512.logical.tolma.pl -LogicalID 3'
                        1672:20140910:121517.075 End of zbx_popen():7
                       14573:20140910:121517.076 zbx_popen(): executing script
                        1672:20140910:121517.168 In zbx_waitpid()
                        1672:20140910:121517.169 zbx_waitpid() exited, status:0
                        1672:20140910:121517.170 End of zbx_waitpid():14573
                        1672:20140910:121517.170 Run remote command [/etc/zabbix/scripts/ds3512.logical.tolma.pl -LogicalID 3] Result [1] [2]...
                        1672:20140910:121517.170 Sending back [2]
                      Тоже самое с статусом физических дисков.

                      Comment

                      Working...