User Tools

Site Tools


storage:svc_scripts

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
storage:svc_scripts [2023/11/24 17:37]
manu
storage:svc_scripts [2025/02/28 14:36] (current)
manu
Line 1: Line 1:
 ====== SVC scripts ====== ====== SVC scripts ======
 +
 +===== Monitoring SVC nagios =====
 +
 +==== Check paths ====
 +
 +<cli prompt='#'>​
 +[root@aix001]/​usr/​local/​nagios/​libexec#​ cat check_paths.sh
 +</​cli>​
 +<​code>​
 +#!/bin/sh
 +#@(#) v1.0 Count number of paths per disk
 +# v1.1 add sudo linux
 +# v1.2 change for VSCSI
 +# v1.3 add verbose (-v), improvements linux
 +
 +# number of path per type of disk
 +pathviosfc=4
 +pathviosscsi=2
 +pathviossas=1
 +pathlparfc=8
 +pathlparscsi=2
 +pathlparsas=1
 +
 +
 +STATUS=0
 +
 +STATE_OK=0
 +STATE_WARNING=1
 +STATE_CRITICAL=2
 +STATE_UNKNOWN=3
 +
 +MSG=""​
 +verbose=""​
 +
 +# specified value for nb paths
 +if [ "​$npath"​ == ""​ ]
 +then
 +  nbpath=$pathlparfc
 +fi
 +
 +os=$(uname -a | awk '​{print $1}')
 +
 +grepp() { [ $# -eq 1 ] && perl -00ne "print if /$1/i" || perl -00ne "print if /$1/i" < "​$2";​}
 +
 +#​---------------------
 +count_linux_path()
 +{
 +tempfile=/​tmp/​multipath.txt
 +
 +if [ ! -x /​usr/​sbin/​multipath ] || [ $(lsscsi -s | grep -q VMware; echo $?) -eq 0 ]
 +then
 +  MSG="​OK:​ no multipathing"​
 +  verbose="​$MSG"​
 +  STATUS=$STATE_OK
 +else
 +  if [ $(timeout 30  sudo /​usr/​sbin/​multipath -ll | grep -v "​policy="​ | grep -v "​size="​ | tr -s ' ' | sed 's/\ /;/g' | sed '/​^mpath/​i \\n' > $tempfile ; echo $?) -ne "​0"​ ]
 +  then
 +    MSG="​$MSG Maybe error on sudo config"​
 +    verbose="​$MSG"​
 +    STATUS=$STATE_UNKNOWN
 +  else
 +    for i in $(cat $tempfile | grep '​^mpath'​ | awk -F';'​ '​{print $1}')
 +    do
 +      pathok=$(cat $tempfile | grepp "​^$i;"​ | grep -v "​policy="​ | grep -v "​size="​ | grep -v '​^mpath'​ | grep active | wc -l | awk '​{print $1}')
 +      pathok_pct=$(echo "​scale=1;​100*$pathok/​$nbpath"​ | bc | cut -d '​.'​ -f1)
 +      verbose="​$verbose $i;​$pathok/​$nbpath"​ # verbose message
 +      if [ "​$pathok_pct"​ -lt "​50"​ ]
 +      then
 +        MSG="​$MSG $i;​$pathok/​$nbpath"​
 +        if [ $STATUS -lt $STATE_CRITICAL ]
 +        then
 +          STATUS=$STATE_CRITICAL
 +        fi
 +      else
 +        if [ "​$pathok_pct"​ -ne "​100"​ ]
 +        then
 +          MSG="​$MSG $i;​$pathok/​$nbpath"​
 +          if [ $STATUS -lt $STATE_CRITICAL ]
 +          then
 +            STATUS=$STATE_WARNING
 +          fi
 +        fi
 +      fi
 +    done
 +  fi
 +fi
 +
 +rm -f $tempfile 2>/​dev/​null
 +}
 +
 +#​---------------------
 +count_aix_path()
 +{
 +# check not available disks
 +nbdisknok=$(lsdev -Cc disk | grep -v Available | wc -l | awk '​{print $1}')
 +if [ "​$nbdisknok"​ -ne "​0"​ ]
 +then
 +  MSG="​$MSG WARNING: $nbdisknok disks defined"​
 +  verbose="​$MSG"​
 +  STATUS=$STATE_WARNING
 +else
 +  STATUS=$STATE_OK
 +fi
 +
 +for line in $(lsdev -Cc disk | tr -s ' ' | sed 's/\ /:/' | sed 's/\ /:/' | sed 's/\ /,/g')
 +do
 +  hdisk=$(echo $line | awk -F':'​ '​{print $1}')
 +  if [ "​$(echo $line | cut -d':'​ -f3- | tr '​A-Z'​ '​a-z'​ | grep -q mpio; echo $?)" -eq "​0"​ ]
 +  then
 +    if [ ! -e /​usr/​ios/​cli/​ioscli ]
 +        then
 +          # type LPAR FC
 +          nbpath=$pathlparfc
 +    else
 +          # type VIOS FC
 +          nbpath=$pathviosfc
 +    fi
 +  else
 +    if [ "​$(echo $line | cut -d':'​ -f3- | tr '​A-Z'​ '​a-z'​ | grep -q scsi; echo $?)" -eq "​0"​ ]
 +    then
 +      if [ ! -e /​usr/​ios/​cli/​ioscli ]
 +          then
 +            # type LPAR SCSI
 +            nbpath=$pathlparscsi
 +      else
 +            # type VIOS SCSI
 +            nbpath=$pathviosscsi
 +      fi
 +    else
 +      if [ "​$(echo $line | cut -d':'​ -f3- | tr '​A-Z'​ '​a-z'​ | grep -q sas; echo $?)" -eq "​0"​ ]
 +      then
 +        if [ ! -e /​usr/​ios/​cli/​ioscli ]
 +            then
 +              # type LPAR SAS
 +              nbpath=$pathlparsas
 +        else
 +              # type VIOS SAS
 +              nbpath=$pathviossas
 +        fi
 +          fi
 +        fi
 +  fi
 +
 +  pathok=$(lspath -l $hdisk | grep Enabled | wc -l | awk '​{print $1}')
 +  pathok_pct=$(echo "​scale=1;​100*$pathok/​$nbpath"​ | bc | cut -d '​.'​ -f1)
 +  verbose="​$verbose $hdisk;​$pathok/​$nbpath"​
 +  if [ "​$pathok_pct"​ -lt "​50"​ ]
 +  then
 +    MSG="​$MSG $hdisk;​$pathok/​$nbpath"​
 +    if [ $STATUS -lt $STATE_CRITICAL ]
 +    then
 +      STATUS=$STATE_CRITICAL
 +    fi
 +  else
 +    if [ "​$pathok_pct"​ -ne "​100"​ ]
 +    then
 +      MSG="​$MSG $hdisk;​$pathok/​$nbpath"​
 +      if [ $STATUS -lt $STATE_CRITICAL ]
 +      then
 +        STATUS=$STATE_WARNING
 +      fi
 +    fi
 +  fi
 +done
 +}
 +
 +######################​
 +if [ "​$os"​ = "​Linux"​ ]
 +then
 +  count_linux_path
 +else
 +  if [ "​$os"​ = "​AIX"​ ]
 +  then
 +    count_aix_path
 +  else
 +    echo "##########​ Unknown OS"
 +        STATUS=$STATE_UNKNOWN
 +  fi
 +fi
 +
 +if [ $STATUS -eq $STATE_OK ]
 +then
 +  echo "​OK"​
 +else
 +  echo "​$MSG"​
 +fi
 +
 +# For debug
 +if [ "​$1"​ = "​-v"​ ]
 +then
 +  echo "​$verbose"​ | tr ' ' '​\n'​
 +fi
 +
 +exit $STATUS
 +</​code>​
 +
 +==== Check quorum ====
 +
 +<cli prompt='#'>​
 +[root@nagios plugins]# cat check_ibm_storwize_quorum.sh
 +</​cli>​
 +<​code>​
 +#!/bin/sh
 +#set -x
 +##################################################​
 +#@(#) check SVC IP quorum
 +##################################################​
 +# version: 1.0 02-2022 Manu
 +##################################################​
 +
 +STATUS=0
 +
 +STATE_OK=0
 +STATE_WARNING=1
 +STATE_CRITICAL=2
 +STATE_UNKNOWN=3
 +
 +cluster=$(echo $1 | sed '​s/​\-cluster=//'​)
 +user="​nagios"​
 +
 +quorumsrv="​witness01.ad.com"​
 +
 +output=$(ssh $user@$cluster '​lsquorum -delim :')
 +
 +STATUS=0
 +MSG=""​
 +if [[ $(echo $output | tr ' ' '​\n'​ | grep ':​online:'​ | grep ':​device:'​ | grep ":​${quorumsrv}"​ | wc -l | awk '​{print $1}') -ge "​1"​ ]]
 +then
 +  (( STATUS = STATUS + 0 ))
 +  MSG="​IP quorum: $quorumsrv OK"
 +else
 +  (( STATUS = STATUS + 1 ))
 +  MSG="​IP quorum: $quorumsrv down!!!"​
 +fi
 +
 +if [[ $(echo $output | tr ' ' '​\n'​ | grep ':​online:'​ | grep -v ':​device:'​ | wc -l | awk '​{print $1}') -ge "​2"​ ]]
 +then
 +  (( STATUS = STATUS + 0 ))
 +  MSG=$(echo "$MSG | nb quorum OK")
 +else
 +  (( STATUS = STATUS + 1 ))
 +  MSG=$(echo "$MSG | bad number of quorum !!")
 +fi
 +
 +echo $MSG
 +exit $STATUS
 +</​code>​
 +
 +==== Check paths ====
 +
 +<cli prompt='#'>​
 +[root@lnxb080 plugins]# cat check_storage_host_paths.sh
 +</​cli>​
 +<​code>​
 +#!/bin/sh
 +#set -x
 +##################################################​
 +#@(#) check host paths on SVC
 +##################################################​
 +# version: 1.0 02-2022 Manu
 +##################################################​
 +
 +STATUS=0
 +
 +STATE_OK=0
 +STATE_WARNING=1
 +STATE_CRITICAL=2
 +STATE_UNKNOWN=3
 +
 +cluster=$(echo $1 | sed '​s/​\-cluster=//'​)
 +user="​nagios"​
 +SSH="​ssh -o ConnectTimeout=30 ${user}@"​
 +list="​svc01"​
 +
 +MSG=""​
 +exclude=':​none:'​
 +
 +word="​$1"​
 +case "​$word"​ in
 +    "​esx"​ ) count=2
 +            exclude=':​none:'​ ;;
 +    "​aix"​ ) count=4
 +            exclude="​aixv"​ ;;
 +    "​lnx"​ ) count=4
 +            exclude=':​none:'​ ;;
 +    "​vio"​ ) count=2
 +            word=aixv
 +            exclude=':​none:'​ ;;
 +    "​win"​ ) count=2
 +            word='​win|mssql'​
 +            exclude=':​none:'​ ;;
 +  "​other"​ ) count=4
 +            word='​svc01'​
 +            exclude='​esx|aix|lnx|win|mssql'​ ;;
 +      "​*"​ ) MSG="​wrong parameter"​ ;;
 +esac
 +
 +
 +
 +for storage in $(echo ${list})
 +do
 +  cmd='​lshost -delim : -nohdr'​
 +  for node in $(${SSH}${storage} $cmd | cut -d':'​ -f2)
 +  do
 +    cmd="​lshost -delim : $node"
 +    MSG1=$(echo "​$storage:​$node:​$(${SSH}${storage} $cmd | grep -c "​state:​active"​)"​ | grep -v ':​0$'​ | egrep -i "​${word}"​ | grep -v ":​${count}$"​ | egrep -vi "​${exclude}"​)
 +    if [ "​$MSG1"​ != ""​ ]
 +    then
 +      MSG=$(echo "​${MSG};​${MSG1}"​)
 +    fi
 +  done
 +done
 +
 +if [ "​$MSG"​ == ""​ ]
 +then
 +  RC=0
 +else
 +  RC=2
 +  echo $MSG
 +fi
 +
 +exit $RC
 +</​code>​
 +
 +==== Check v7000/SVC ====
 +
 +https://​exchange.nagios.org/​directory/​Plugins/​Hardware/​Storage-Systems/​SAN-and-NAS/​IBM-San-Volume-Controller/​IBM-StorWize-V3700--2F-V7000-check/​details
 +
 +<cli prompt='#'>​
 +[root@centreon01 plugins]# cat check_ibm_v7000.sh
 +</​cli>​
 +<​code>​
 +#​!/​usr/​bin/​bash
 +#set -x
 +#############################################​
 +#@(#) Nagios-Centreon check for IBM storage
 +#############################################​
 +# version 1.0 01-2025
 +
 +ssh='/​usr/​bin/​ssh -q'
 +exitCode=1
 +
 +while getopts '​M:​U:​Q:​d:​h'​ OPT; do
 +  case $OPT in
 +    M)  storage=$OPTARG ​ ;;
 +    U)  user=$OPTARG ​    ;;
 +    Q)  query=$OPTARG ​   ;;
 +    h)  help="​yes" ​       ;;
 +    *)  unknown="​yes" ​   ;;
 +  esac
 +done
 +
 +#​storage="​psnsvccl01"​
 +#​user=centreon
 +outputMess=""​
 +
 +# usage
 +HELP="
 +    Check IBM Storwize v7000 throght ssh (GPL licence)
 +
 +    usage: $0 [ -M value -U value -Q command -h ]
 +
 +    syntax:
 +
 +            -M --> IP Address
 +            -U --> user
 +            -Q --> query to storage
 +                lsdrive
 +                lsarray
 +                lsmdisk
 +                lsmdiskgrp
 +                lsvdisk
 +                lsenclosure
 +                lsenclosurecanister
 +                lsenclosurepsu
 +                lsenclosurebattery
 +                lsnode --> SVC only
 +                lsnodebattery --> SVC only
 +            -h --> Print This Help Screen
 +
 +    Note :
 +    This check use ssh protocoll.
 +"
 +
 +if [ "​$hlp"​ = "​yes"​ -o $# -lt 1 ]; then
 +        echo "​$HELP"​
 +        exit 0
 +fi
 +
 +case $query in
 +  lsdrive)
 +                word_online=':​online:'​
 +                num=1
 +                device='​Drives'​
 +                ;;
 +  lsarray)
 +                word_online=':​online:'​
 +                num=2
 +                device='​Array'​
 +                ;;
 +  lsmdisk)
 +                word_online=':​online:'​
 +                num=2
 +                device='​Mdisks'​
 +                ;;
 +  lsmdiskgrp)
 +                word_online=':​online:'​
 +                num=2
 +                device='​Pools'​
 +                ;;
 +  lsvdisk)
 +                word_online=':​online:'​
 +                num=2
 +                device='​Volumes'​
 +                ;;
 +  lsenclosure)
 +                word_online=':​online:'​
 +                num=1
 +                device='​Enclosures'​
 +                ;;
 +  lsenclosurecanister)
 +                word_online=':​online:'​
 +                num=2
 +                device='​Nodes'​
 +                ;;
 +  lsenclosurepsu)
 +                word_online=':​online:'​
 +                num=2
 +                device='​PowerSupply'​
 +                ;;
 +  lsenclosurebattery)
 +                word_online=':​online:'​
 +                num=2
 +                device='​Battery'​
 +                ;;
 +  lsnode)
 +                word_online=':​online:'​
 +                num=2
 +                device='​Nodes'​
 +                ;;
 +  lsnodebattery)
 +                word_online=':​online:'​
 +                num=2
 +                device='​Battery'​
 +                ;;
 +  *)
 +                echo -ne "​Command not found. \n"
 +                exitCode=3
 +                exit $exitCode
 +                ;;
 +esac
 +
 +output=$($ssh $user@$storage $query -delim : 2>/​dev/​null)
 +
 +if [ "​$output"​ == ""​ ]
 +then
 +  outputMess="​$outputMess UNKNOWN: Improper command"​
 +  exitCode=3
 +else
 +  nbline=$(echo $output | tr ' ' '​\n'​ | sed '​1d'​ | grep -cv "​${word_online}"​)
 +  if [ "​$nbline"​ -ne "​0"​ ]
 +  then
 +    value=$(echo $output | tr ' ' '​\n'​ | sed '​1d'​ | grep -v "​${word_online}"​ | cut -d':'​ -f$num | tr '​\n'​ ';'​ | sed '​s/;​$//'​)
 +    outputMess="​$outputMess CRITICAL: $device OFFLINE $value \n"
 +    exitCode=2
 +  else
 +    value=$(echo $output | tr ' ' '​\n'​ | sed '​1d'​ | grep "​${word_online}"​ | cut -d':'​ -f$num | tr '​\n'​ ';'​ | sed '​s/;​$//'​)
 +    outputMess="​$outputMess OK: $device $value \n"
 +    exitCode=0
 +  fi
 +fi
 +
 +echo -ne "​$outputMess\n"​
 +exit $exitCode
 +</​code>​
 +
 +
 +===== Backup IBM storage config =====
 +
 +<cli prompt='#'>​
 +# backup_config_storage_ibm.sh
 +</​cli>​
 +<​code>​
 +#!/bin/bash
 +#set -x
 +#
 +#@(#) Script to backup svc
 +#
 +# version: 1.1 03-2022 eif
 +#
 +
 +dir=`dirname $0`
 +. $dir/.env
 +
 +# Variables
 +destination="​mail@test.lu"​
 +user_repoting="​report"​
 +SSH="​ssh -o ConnectTimeout=30 ${user_repoting}@"​
 +logfile=$logpath/​list_storage_users.txt
 +list=$binpath/​storage_list.txt
 +
 +savedir=/​workdir/​svc/​backup
 +svc_user="​report"​
 +DATE=$(date +%Y%m%d)
 +DAY=$(date +%d)    # backup rotation 30 days
 +
 +# create backup folder
 +if [[ ! -d $savedir ]]
 +then
 +  mkdir -p $savedir
 +fi
 +
 +#​----------------------
 +backup_svc ()
 +{
 +date '​+%Y-%m-%d %H:​%M:​%S'​
 +
 +for storage in $(cat ${list})
 +do
 +  connection="​${svc_user}@${storage}"​
 +  savedir1=$savedir/​$storage
 +
 +  if [[ ! -d $savedir1 ]]
 +  then
 +    mkdir -p $savedir1
 +  fi
 +  rm -f $savedir1/​svc.config.backup* >/​dev/​null 2>&1
 +
 +  echo "### ​ Start Backup of storage:​$(date '​+%Y-%m-%d %H:​%M:​%S'​) $storage"​
 +  ssh $connection svcconfig backup
 +
 +  RC=$?
 +  if [[ $RC != 0 ]]
 +  then
 +    echo "# Backup failure on storage: ${storage}"​
 +    mailx -s "​Backup failure on storage: ${storage}" ​ $destination
 +    exit 1
 +  else
 +    echo "# Backup Success on storage: ${storage}"​
 +  fi
 +
 +  echo "### ​ Copy Backup of storage: $storage"​
 +  scp $connection:/​dumps/​svc.config.backup* $savedir1
 +
 +  RC=$?
 +  if [[ $RC != 0 ]]
 +  then
 +    echo "#​******* Copy Backup failure (scp) for storage: ${storage}"​
 +    mailx -s "Copy Backup failure (scp) for storage: ${storage}" ​ $destination
 +    exit 1
 +  else
 +    echo "# Copy Backup Success (scp) for storage: ${storage}"​
 +  fi
 +
 +  # compress backup.... + delete old files (30 j)
 +  cd $savedir1
 +  rm -f svc_conf_backup_$DAY.tar* >/​dev/​null 2>&1
 +  tar -cvf svc_conf_backup_$DAY.tar svc.config.backup*
 +  gzip svc_conf_backup_$DAY.tar
 +
 +  echo
 +done
 +date '​+%Y-%m-%d %H:​%M:​%S'​
 +}
 +
 +#########################​
 +# Main
 +#########################​
 +main ()
 +{
 +backup_svc
 +}
 +
 +main > $logname.$(date '​+%u'​) 2>&1
 +</​code>​
  
 ===== LUN thin warning disable ===== ===== LUN thin warning disable =====
Line 139: Line 714:
 # Formating page for Dokuwiki # Formating page for Dokuwiki
  
-echo "​====== Last User Audit log for storage ====== +echo "​====== Last User Audit log for storage ======" > ${index} 
- +echo "" ​>> ${index}
-" > ${index}+
  
 for storage in $(cat ${list}) for storage in $(cat ${list})
Line 159: Line 733:
   echo "​====== Last Changes on ${Ustorage} ​ ======"​ > $output   echo "​====== Last Changes on ${Ustorage} ​ ======"​ > $output
   date "​+%d-%m-%Y %H:%M" >> $output   date "​+%d-%m-%Y %H:%M" >> $output
-  echo '<code>' >> $output+  echo '#code#' >> $output
   cat $output.1 >> $output   cat $output.1 >> $output
-  echo '</code>' >> $output+  echo '#/code#' >> $output
  
-  echo "​[[storage:​svc:​auditlog_${storage}|${Ustorage}]] +  echo "​[[storage:​svc:​auditlog_${storage}|${Ustorage}]]" >> ${index} 
- +  echo "" >> ${index}
-" >> ${index}+
   rm -f $output.1 $output.2   rm -f $output.1 $output.2
 done done
Line 204: Line 777:
 </​code>​ </​code>​
  
 +==== template ====
 +
 +**check_ibm_v7000.sh**
 +<​code>​
 +#!/bin/bash
 +# Author:​ Lazzarin Alberto
 +# Date:​ 10-04-2013
 +# Version 1.4
 +#
 +# This plugin check the HW status of IBM Storwize v7000.
 +# To use this script you need to create a linux user with his ssh certificate.
 +# Create the same user on the v7000, member of monitor group and upload the public ssh key.
 +# Try to log from linux machine to the v7000 without password, if it function you can use the plugin.
 +# I use the '​nagios'​ user to check the remote system.
 +# The help is included into the script.
 +#
 +#
 +#
 +# CHANGELOG
 +#
 +# 1.4 Made by Andrea Tedesco [andrea85 . tedesco @ gmail . com]
 +# Add check of v7000 Unified
 +# 1.3 Made by Ivan Bergantin [ivan . bergantin @ gmail . com] suggested by Leandro Freitas [leandro @ nodeps . com . br]
 +# Add short output in "​Service Status Details For Host" view, and detailed output in "​Service Information"​view
 +#
 +# 1.2 Made by Feilong
 +# Add check of mirror status between two volumes on two IBM V7000.
 +# It check the number of mirrors, the numbers of consitent and synchronized mirrors. If they are differents, the status returned is critical.
 +#
 +# 1.1
 +# Change login method from from '​plink'​ to ssh.
 +# Add "​OK"​ and "​ATTENTION"​ in the output.
 +#
 +# 1.0
 +# First release.
 +#
 +
 +ssh=/​usr/​bin/​ssh
 +exitCode=0
 +
 +while getopts '​M:​U:​Q:​d:​h'​ OPT; do
 +  case $OPT in
 +    M)  storage=$OPTARG;;​
 +    U)  user=$OPTARG;;​
 +    Q)  query=$OPTARG;;​
 +    h)  hlp="​yes";;​
 +    *)  unknown="​yes";;​
 +  esac
 +done
 +
 +# usage
 +HELP="
 +    Check IBM Storwize v7000 throght ssh (GPL licence)
 +
 +    usage: $0 [ -M value -U value -Q command -h ]
 +
 +    syntax:
 +
 +            -M --> IP Address
 +            -U --> user
 +            -Q --> query to storage
 + lsarray
 + lsdrive
 + lsvdisk
 + lsenclosure
 + lsenclosurebattery
 + lsenclosurecanister
 + lsenclosurepsu
 + lsenclosureslot
 + lsrcrelationship
 + unified
 +            -h --> Print This Help Screen
 +
 +    Note :
 +    This check use ssh protocoll.
 +"
 +
 +if [ "​$hlp"​ = "​yes"​ -o $# -lt 1 ]; then
 +        echo "​$HELP"​
 +        exit 0
 +fi
 +
 +tmp_file=/​tmp/​v7000_$storage_$query.tmp
 +tmp_file_OK=/​tmp/​v7000_OK.tmp
 +outputMess=""​
 +
 +#echo -ne "IBM Storwize v7000 Health Check\n"​
 +
 +case $query in 
 + lsarray)
 + $ssh $user@$storage $query |sed '​1d'​ > $tmp_file
 +
 + cat $tmp_file |awk '​{printf $3}' |grep -i offline
 + if [ "​$?"​ -eq "​0"​ ]; then
 +                        outputMess="​$outputMess CRITICAL: MDisk OFFLINE \n"
 + else
 +                        outputMess="​$outputMess OK: MDisks \n"
 + fi
 +
 + while read line
 + do
 + mdisk_name=$(echo "​${line}"​ | awk '​{printf $2}')
 + mdisk_status=$(echo "​${line}"​ | awk '​{printf $3}')
 +
 +                if [ $mdisk_status = "​online"​ ]; then
 +                       ​ outputMess="​$outputMess OK: MDisks $mdisk_name status: $mdisk_status \n"
 +               ​ else
 + outputMess="​$outputMess ATTENTION: MDisks $mdisk_name status: $mdisk_status \n"
 +              exitCode=2
 + fi
 +
 +       ​ done < $tmp_file
 + ;;
 +
 + lsdrive)
 +                $ssh $user@$storage $query |sed '​1d'​ > $tmp_file
 +
 +                cat $tmp_file |awk '​{printf $2}' |grep -i offline
 +                if [ "​$?"​ -eq "​0"​ ]; then
 +                        outputMess="​$outputMess CRITICAL: Disk OFFLINE \n"
 +                else
 +                        outputMess="​$outputMess OK: Drive \n"
 +                fi
 +
 + drive_total=$(/​bin/​cat $tmp_file |/​usr/​bin/​wc -l)
 +                while read line
 +                        do
 +                                drive_n=$(echo "​${line}"​ | awk '​{printf $1}')
 +                                drive_status=$(echo "​${line}"​ | awk '​{printf $2}')
 +                                drive_role=$(echo "​${line}"​ | awk '​{printf $4}')
 +                                drive_type=$(echo "​${line}"​ | awk '​{printf $5}')
 +                                drive_capacity=$(echo "​${line}"​ | awk '​{printf $6}')
 +                                drive_enclosure=$(echo "​${line}"​ | awk '​{printf $10}')
 +                                drive_slot=$(echo "​${line}"​ | awk '​{printf $11}')
 +
 +                                if [ $drive_status = "​online"​ ]; then
 +                                        outputMess="​$outputMess OK: Drive $drive_n is online \n"
 +                                else
 +                                        outputMess="​$outputMess ATTENTION: Disk $drive_n \nstatus: $disk_status \nrole: $drive_role \ntype: $drive_type \ncapacity: $drive_capacity \nenclosure:​ $drive_enclosure \nslot: $drive_slot "
 +                                        exitCode=2
 +                                fi
 +
 +                done < $tmp_file
 +
 + ;;
 +
 + lsvdisk)
 +                $ssh $user@$storage $query |sed '​1d'​ > $tmp_file
 +
 +                cat $tmp_file |awk '​{printf $5}' |grep -i offline
 +                if [ "​$?"​ -eq "​0"​ ]; then
 +                        outputMess="​$outputMess CRITICAL: VDisk OFFLINE \n"
 +                else
 +                        outputMess="​$outputMess OK: VDisk \n"
 +                fi
 +
 +                while read line
 +                        do
 +                                vdisk_name=$(echo "​${line}"​ | awk '​{printf $2}')
 +                                vdisk_status=$(echo "​${line}"​ | awk '​{printf $5}')
 +
 +                                if [ $vdisk_status = "​online"​ ]; then
 +                                        outputMess="​$outputMess OK: VDisks $vdisk_name status: $vdisk_status \n"
 +                                else
 +                                        outputMess="​$outputMess ATTENTION: VDisks $mdisk_name status: $vdisk_status \n"
 +                                        exitCode=2
 +                                fi
 +
 +                done < $tmp_file
 + ;;
 +
 + lsenclosure)
 +                $ssh $user@$storage $query |sed '​1d'​ > $tmp_file
 +
 +                cat $tmp_file |awk '​{printf $2}' |grep -i offline
 +                if [ "​$?"​ -eq "​0"​ ]; then
 +                        outputMess="​$outputMess CRITICAL: Enclosure OFFLINE \n"
 +                else
 +                        outputMess="​$outputMess OK: Enclosure \n"
 +                fi
 +
 +                while read line
 +                        do
 +                                enc_n=$(echo "​${line}"​ | awk '​{printf $1}')
 +                                enc_status=$(echo "​${line}"​ | awk '​{printf $2}')
 +                                enc_pn=$(echo "​${line}"​ | awk '​{printf $7}')
 +                                enc_sn=$(echo "​${line}"​ | awk '​{printf $8}')
 +
 +
 +                                if [ $enc_status = "​online"​ ]; then
 +                                        outputMess="​$outputMess OK: Enclosure $enc_n status: $enc_status \n"
 +                                else
 +                                        outputMess="​$outputMess ATTENTION: Enclosure $enc_n status: $enc_status sn: $enc_sn pn: $enc_pn \n"
 +                                        exitCode=2
 +                                fi
 +
 +                done < $tmp_file
 + ;;
 +
 + lsenclosurebattery)
 +                $ssh $user@$storage $query |sed '​1d'​ > $tmp_file
 +
 +                cat $tmp_file |awk '​{printf $3}' |grep -i offline
 +                if [ "​$?"​ -eq "​0"​ ]; then
 +                        outputMess="​$outputMess CRITICAL: Battery OFFLINE \n"
 +                else
 +                        outputMess="​$outputMess OK: Battery \n"
 +                fi
 +
 +                while read line
 +                        do
 +                                batt_n=$(echo "​${line}"​ | awk '​{printf $2}')
 +                                batt_status=$(echo "​${line}"​ | awk '​{printf $3}')
 +                                batt_charge=$(echo "​${line}"​ | awk '​{printf $4}')
 +                                batt_rec=$(echo "​${line}"​ | awk '​{printf $5}')
 +                                batt_charge=$(echo "​${line}"​ | awk '​{printf $6}')
 + batt_eol=$(echo "​${line}"​ | awk '​{printf $7}')
 +
 +
 +                                if [ $batt_status = "​online"​ -a  $batt_rec = "​no"​ -a $batt_charge = "​100"​ -a $batt_eol = "​no"​ ]; then
 +                                        outputMess="​$outputMess OK: Battery $batt_n status: $batt_status \n"
 +                                else
 +                                        outputMess="​$outputMess ATTENTION: Battery $batt_n status: $batt_statusn recharge: $batt_rec charged: $batt_charge eol: $batt_eol \n"
 +                                        exitCode=2
 +                                fi
 +
 +                done < $tmp_file
 + ;;
 +
 + lsenclosurecanister)
 +                $ssh $user@$storage $query |sed '​1d'​ > $tmp_file
 +
 +                cat $tmp_file |awk '​{printf $3}' |grep -i offline
 +                if [ "​$?"​ -eq "​0"​ ]; then
 +                        outputMess="​$outputMess CRITICAL: Canister OFFLINE \n"
 +                else
 +                        outputMess="​$outputMess OK: Canister \n"
 +                fi
 +
 +                while read line
 +                        do
 +                                can_id=$(echo "​${line}"​ | awk '​{printf $2}')
 +                                can_enc_id=$(echo "​${line}"​ | awk '​{printf $1}')
 +                                can_stat=$(echo "​${line}"​ | awk '​{printf $3}')
 +                                can_type=$(echo "​${line}"​ | awk '​{printf $4}')
 +
 +                                if [ $can_stat = "​online"​ ]; then
 +                                        outputMess="​$outputMess OK: Canister $can_id enclosure: $can_enc_id status: $can_stat \n"
 +                                else
 +                                        outputMess="​$outputMess ATTENTION: Canister $can_id enclosure: $can_enc_id status: $can_stat type: $can_type \n"
 +                                        exitCode=2
 +                                fi
 +
 +                done < $tmp_file
 + ;;
 +
 + lsenclosurepsu)
 +                $ssh $user@$storage $query |sed '​1d'​ > $tmp_file
 +
 +                cat $tmp_file |awk '​{printf $3}' |grep -i offline
 +                if [ "​$?"​ -eq "​0"​ ]; then
 +                        outputMess="​$outputMess CRITICAL: PSU OFFLINE \n"
 +                else
 +                        outputMess="​$outputMess OK: PSU \n"
 +                fi
 +
 +                while read line
 +                        do
 +                                psu_id=$(echo "​${line}"​ | awk '​{printf $2}')
 +                                psu_enc_id=$(echo "​${line}"​ | awk '​{printf $1}')
 +                                psu_stat=$(echo "​${line}"​ | awk '​{printf $3}')
 +
 +                                if [ $psu_stat = "​online"​ ]; then
 +                                        outputMess="​$outputMess OK: PSU $psu_id enclosure: $psu_enc_id status: $psu_stat \n"
 +                                else
 +                                        outputMess="​$outputMess ATTENTION: PSU $psu_id enclosure: $psu_enc_id status: $psu_stat \n"
 +                                        exitCode=2
 +                                fi
 +
 +                done < $tmp_file
 + ;;
 +
 + lsenclosureslot)
 +                $ssh $user@$storage $query |sed '​1d'​ > $tmp_file
 +
 +                cat $tmp_file |awk '​{printf $3, $4}' |grep -i offline
 +                if [ "​$?"​ -eq "​0"​ ]; then
 +                        outputMess="​$outputMess CRITICAL: EnclosureSlot OFFLINE \n"
 +                else
 +                        outputMess="​$outputMess OK: EnclosureSlot \n"
 +                fi
 +
 +                while read line
 +                        do
 +                                slt_enc_id=$(echo "​${line}"​ | awk '​{printf $1}')
 +                                slt_id=$(echo "​${line}"​ | awk '​{printf $2}')
 +                                slt_prt1_stat=$(echo "​${line}"​ | awk '​{printf $3}')
 +                                slt_prt2_stat=$(echo "​${line}"​ | awk '​{printf $4}')
 +                                slt_drv=$(echo "​${line}"​ | awk '​{printf $5}')
 +                                drv_id=$(echo "​${line}"​ | awk '​{printf $6}')
 +
 +                                if [ $slt_prt1_stat = "​online"​ -a $slt_prt2_stat = "​online"​ -a $slt_drv = "​yes"​ ]; then
 +                                        outputMess="​$outputMess OK: Drive-$drv_id enclosure-$slt_enc_id slot-$slt_id port1-$slt_prt1_stat port2-$slt_prt2_stat\n"​
 +                                else
 +                                        outputMess="​$outputMess ATTENTION: Drive-$drv_id enclosure-$slt_enc_id slot-$slt_id port1-$slt_prt1_stat port2-$slt_prt2_stat \n"
 +                                        exitCode=2
 +                                fi
 +
 +                done < $tmp_file
 + ;;
 +
 + lsrcrelationship)
 +                volume_mirror_prod=$($ssh $user@$storage $query | grep -c "​rcrel*"​)
 +                volume_mirror_sync=$($ssh $user@$storage $query | grep -c "​consistent_synchronized"​)
 +
 +                                if [ $volume_mirror_prod = $volume_mirror_sync ]; then
 +                                        outputMess="​$outputMess OK: $volume_mirror_prod mirors are consistent and synchronized \n"
 +                                else
 +                                        outputMess="​$outputMess CRITICAL: sur les $volume_mirror_prod volumes, only $volume_mirror_sync are consistent and synchronized \n"
 +                                        exitCode=2
 +                                fi
 +
 + ;;
 +
 + unified)
 +    # Execute remote command
 + $ssh $user@$storage lshealth -Y > $tmp_file
 +
 +    # Parse remote command output
 +    while read line
 +    do
 +        case $(echo "​$line"​ | cut -d : -f 9) in
 +          OK) # Sensor OK state -> do nothing
 + outputMess="​${outputMess}`echo $line | cut -d : -f 7,9 >> $tmp_file_OK`"​
 +          ;;
 +          WARNING) # Sensor WARNING state
 +            if [ "​$exitCode"​ -lt 1 ]; then 
 + exitCode=1; ​
 +     fi
 +            # Append sensor message to output
 +            if [ -n "​$outputMess"​ ]; then 
 + outputMess="​$outputMess +++ "; ​
 +     fi
 +            outputMess="​${outputMess}STATE WARNING - [`echo $line | cut -d : -f 7`:`echo $line | cut -d : -f 8`] `echo $line | cut -d : -f 10`"
 +          ;;
 +          ERROR) # Sensor ERROR state
 +            if [ "​$exitCode"​ -lt 2 ]; then 
 + exitCode=2; ​
 + fi
 +            # Append sensor message to output
 +            if [ -n "​$outputMess"​ ]; then 
 + outputMess="​$outputMess +++ "; ​
 + fi
 +            outputMess="​${outputMess}STATE CRITICAL - [`echo $line | cut -d : -f 7`:`echo $line | cut -d : -f 8`] `echo $line | cut -d : -f 10`"
 +          ;;
 +        esac
 +    done < $tmp_file
 +
 +    # No warnings/​errors detected
 +    if [ "​$exitCode"​ -eq 0 ]; then 
 + outputMess=`uniq "​$tmp_file_OK"​`;​
 + fi
 +  ;;
 + *)
 + echo -ne "​Command not found. \n"
 + exit 3
 + ;;
 +esac
 +
 +rm $tmp_file
 +rm $tmp_file_OK
 +echo -ne "​$outputMess\n"​
 +exit $exitCode
 +</​code>​
 +
 +$ssh $user@$storage $query -delim :
 +<​code>​
 +######### lsarray
 +mdisk_id:​mdisk_name:​status:​mdisk_grp_id:​mdisk_grp_name:​capacity:​raid_status:​raid_level:​redundancy:​strip_size:​tier:​encrypt:​distributed
 +0:​MDisk1:​online:​0:​Pool01_SiteA:​694.9TB:​online:​raid6:​2:​256:​tier0_flash:​yes:​yes
 +######### lshost
 +id:​name:​port_count:​iogrp_count:​status:​site_id:​site_name:​host_cluster_id:​host_cluster_name:​protocol:​owner_id:​owner_name:​portset_id:​portset_name:​partition_id:​partition_name:​draft_partition_id:​draft_partition_name:​ungrouped_volume_mapping:​location_system_name
 +0:​svc01:​2:​4:​online:::​0:​svccl01:​scsi:::​64:​portset64:::::​yes:​
 +1:​svc02:​2:​4:​online:::​0:​svccl01:​scsi:::​64:​portset64:::::​yes:​
 +######### lsdrive
 +id:​status:​error_sequence_number:​use:​tech_type:​capacity:​mdisk_id:​mdisk_name:​member_id:​enclosure_id:​slot_id:​node_id:​node_name:​auto_manage:​drive_class_id
 +0:​online::​member:​tier0_flash:​52.4TB:​0:​MDisk1:​0:​1:​19:::​inactive:​0
 +1:​online::​member:​tier0_flash:​52.4TB:​0:​MDisk1:​1:​1:​5:::​inactive:​0
 +2:​online::​member:​tier0_flash:​52.4TB:​0:​MDisk1:​2:​1:​11:::​inactive:​0
 +3:​online::​member:​tier0_flash:​52.4TB:​0:​MDisk1:​3:​1:​15:::​inactive:​0
 +4:​online::​member:​tier0_flash:​52.4TB:​0:​MDisk1:​4:​1:​7:::​inactive:​0
 +5:​online::​member:​tier0_flash:​52.4TB:​0:​MDisk1:​5:​1:​16:::​inactive:​0
 +6:​online::​member:​tier0_flash:​52.4TB:​0:​MDisk1:​6:​1:​13:::​inactive:​0
 +7:​online::​member:​tier0_flash:​52.4TB:​0:​MDisk1:​7:​1:​17:::​inactive:​0
 +8:​online::​member:​tier0_flash:​52.4TB:​0:​MDisk1:​8:​1:​20:::​inactive:​0
 +9:​online::​member:​tier0_flash:​52.4TB:​0:​MDisk1:​9:​1:​21:::​inactive:​0
 +10:​online::​member:​tier0_flash:​52.4TB:​0:​MDisk1:​10:​1:​12:::​inactive:​0
 +11:​online::​member:​tier0_flash:​52.4TB:​0:​MDisk1:​11:​1:​18:::​inactive:​0
 +12:​online::​member:​tier0_flash:​52.4TB:​0:​MDisk1:​12:​1:​10:::​inactive:​0
 +13:​online::​member:​tier0_flash:​52.4TB:​0:​MDisk1:​13:​1:​8:::​inactive:​0
 +14:​online::​member:​tier0_flash:​52.4TB:​0:​MDisk1:​14:​1:​9:::​inactive:​0
 +15:​online::​member:​tier0_flash:​52.4TB:​0:​MDisk1:​15:​1:​14:::​inactive:​0
 +16:​online::​member:​tier0_flash:​52.4TB:​0:​MDisk1:​16:​1:​6:::​inactive:​0
 +######### lsmdiskgrp
 +id:​name:​status:​mdisk_count:​vdisk_count:​capacity:​extent_size:​free_capacity:​virtual_capacity:​used_capacity:​real_capacity:​overallocation:​warning:​easy_tier:​easy_tier_status:​compression_active:​compression_virtual_capacity:​compression_compressed_capacity:​compression_uncompressed_capacity:​parent_mdisk_grp_id:​parent_mdisk_grp_name:​child_mdisk_grp_count:​child_mdisk_grp_capacity:​type:​encrypt:​owner_type:​owner_id:​owner_name:​site_id:​site_name:​data_reduction:​used_capacity_before_reduction:​used_capacity_after_reduction:​overhead_capacity:​deduplication_capacity_saving:​reclaimable_capacity:​easy_tier_fcm_over_allocation_max:​provisioning_policy_id:​provisioning_policy_name:​replication_pool_link_uid
 +0:​Pool01_SiteA:​online:​1:​13:​694.22TB:​2048:​654.21TB:​40.00TB:​40.00TB:​40.00TB:​5:​80:​auto:​balanced:​no:​0.00MB:​0.00MB:​0.00MB:​0:​Pool01_SiteA:​0:​0.00MB:​parent:​yes:​none:::::​no:​0.00MB:​0.00MB:​0.00MB:​0.00MB:​0.00MB:​100%:::​7D97EF5B263D688Exxxxxxxxxxxxxxxxxxxx
 +######### lsmdisk
 +id:​name:​status:​mode:​mdisk_grp_id:​mdisk_grp_name:​capacity:​ctrl_LUN_#:​controller_name:​UID:​tier:​encrypt:​site_id:​site_name:​distributed:​dedupe:​over_provisioned:​supports_unmap
 +0:​MDisk1:​online:​array:​0:​Pool01_SiteA:​694.9TB::::​tier0_flash:​yes:::​yes:​no:​yes:​yes
 +######### lsvdisk
 +id:​name:​IO_group_id:​IO_group_name:​status:​mdisk_grp_id:​mdisk_grp_name:​capacity:​type:​FC_id:​FC_name:​RC_id:​RC_name:​vdisk_UID:​fc_map_count:​copy_count:​fast_write_state:​se_copy_count:​RC_change:​compressed_copy_count:​parent_mdisk_grp_id:​parent_mdisk_grp_name:​owner_id:​owner_name:​formatting:​encrypt:​volume_id:​volume_name:​function:​volume_group_id:​volume_group_name:​protocol:​is_snapshot:​snapshot_count:​volume_type:​replication_mode:​is_safeguarded_snapshot:​safeguarded_snapshot_count:​restore_in_progress
 +0:​vol_siteA_001:​0:​io_grp0:​online:​0:​Pool01_SiteA:​4.00TB:​striped:::::​60050xxxxxxxxxx10000000000000000:​0:​1:​not_empty:​0:​no:​0:​0:​Pool01_SiteA:::​yes:​yes:​0:​vol_siteA_001::::​scsi:​no:​0:::​no:​0:​no
 +1:​vol_siteA_002:​0:​io_grp0:​online:​0:​Pool01_SiteA:​4.00TB:​striped:::::​60050xxxxxxxxxx10000000000000001:​0:​1:​not_empty:​0:​no:​0:​0:​Pool01_SiteA:::​yes:​yes:​1:​vol_siteA_002::::​scsi:​no:​0:::​no:​0:​no
 +2:​vol_siteA_003:​0:​io_grp0:​online:​0:​Pool01_SiteA:​4.00TB:​striped:::::​60050xxxxxxxxxx10000000000000002:​0:​1:​not_empty:​0:​no:​0:​0:​Pool01_SiteA:::​yes:​yes:​2:​vol_siteA_003::::​scsi:​no:​0:::​no:​0:​no
 +######### lsenclosure
 +id:​status:​type:​managed:​IO_group_id:​IO_group_name:​product_MTM:​serial_number:​total_canisters:​online_canisters:​total_PSUs:​online_PSUs:​drive_slots:​total_fan_modules:​online_fan_modules:​total_sems:​online_sems
 +1:​online:​control:​yes:​0:​io_grp0:​4657-924:​78xxxxx:​2:​2:​2:​2:​24:​0:​0:​0:​0
 +######### lsenclosurebattery
 +enclosure_id:​battery_id:​status:​charging_status:​recondition_needed:​percent_charged:​end_of_life_warning:​canister_id:​battery_slot
 +1:​1:​online:​idle:​no:​100:​no:​1:​1
 +1:​2:​online:​idle:​no:​100:​no:​2:​1
 +######### lsenclosurecanister
 +enclosure_id:​canister_id:​status:​type:​node_id:​node_name
 +1:​1:​online:​node:​2:​node2
 +1:​2:​online:​node:​1:​node1
 +######### lsenclosurepsu
 +enclosure_id:​PSU_id:​status:​input_power
 +1:​1:​online:​ac
 +1:​2:​online:​ac
 +######### lsenclosureslot
 +enclosure_id:​slot_id:​port_1_status:​port_2_status:​drive_present:​drive_id:​row:​column
 +1:1:::no:::
 +1:2:::no:::
 +1:3:::no:::
 +1:4:::no:::
 +1:​5:::​yes:​1::​
 +1:​6:::​yes:​16::​
 +1:​7:::​yes:​4::​
 +1:​8:::​yes:​13::​
 +...
 +</​code>​
 +
 +On SVC
 +<​code>​
 +######### lsnode
 +id:​name:​UPS_serial_number:​WWNN:​status:​IO_group_id:​IO_group_name:​config_node:​UPS_unique_id:​hardware:​iscsi_name:​iscsi_alias:​panel_name:​enclosure_id:​canister_id:​enclosure_serial_number:​site_id:​site_name
 +1:​svcaxx01::​50050xxxx000yyD:​online:​0:​io_grp0:​yes::​SA2:​iqn.xxxxxxx.com.ibm:​2145.svccl01.svcaxx01::​78xxxxD::​1::​1:​siteA
 +6:​svcbxx01::​50050xxxx000yyA4:​online:​0:​io_grp0:​no::​SA2:​iqn.xxxxxxx.com.ibm:​2145.svccl01.svcbxx01::​78xxxxC::​1::​2:​siteB
 +3:​svcaxx02::​50050xxxx000yy5F:​online:​1:​io_grp1:​no::​SA2:​iqn.xxxxxxx.com.ibm:​2145.svccl01.svcaxx02::​78xxxxL::​1::​1:​siteA
 +4:​svcbxx02::​50050xxxx000yy5D:​online:​1:​io_grp1:​no::​SA2:​iqn.xxxxxxx.com.ibm:​2145.svccl01.svcbxx02::​78xxxxN::​1::​2:​siteB
 +######### lsnodebattery
 +node_id:​node_name:​battery_id:​status:​charging_status:​recondition_needed:​node_percentage_charge:​end_of_life_warning
 +1:​svcaxx01:​1:​online:​idle:​no:​100:​no
 +6:​svcbxx01:​1:​online:​idle:​no:​100:​no
 +3:​svcaxx02:​1:​online:​idle:​no:​100:​no
 +4:​svcbxx02:​1:​online:​idle:​no:​100:​no
 +</​code>​
storage/svc_scripts.1700843869.txt.gz · Last modified: 2023/11/24 17:37 by manu