User Tools

Site Tools


storage:brocade_scripts

This is an old revision of the document!


Scripts Brocade

Convert a WWN

# WWN="200000e08b01ced3"
# echo $WWN | tr ' ' '\n' | sed 's/../&:/g;s/:$//' | tr 'A-Z' 'a-z'
20:00:00:e0:8b:01:ce:d3

List switch ports and alias associated

[root@mgmt01 san]# cat list_brocade_switches_ports.sh
#!/bin/bash
#set -x
#====================================================================
#@(#) Script to generate a HTML report on Brocade SAN switches
#       format of line before HMTL :
#          html_tag;nagios_tag;reserved;output
#====================================================================
# version 1.0

dir=`dirname $0`

#. $dir/.env

# global variables for all scripts
export sn=`basename $0 | cut -d. -f1`
export HOSTNAME=`/bin/hostname`
logpath=./logs
export logname=$logpath/$sn.log
TMPFILE=$logpath/tempo_file

os=$(uname -s | tr 'A-Z' 'a-z')

USER=admin
listswitch="sansw1 sansw2"        # All SAN switches from all fabric separated by space

#NAGIOSTAG="0=OK, 1=WARNING, 2=CRITICAL, 3=UNKNOWN"
COLOR[0]="#57E964"      # green
COLOR[1]="#F87217"      # orange #F7BE81
COLOR[2]="#FF2400"      # red    #DF013A
COLOR[3]="yellow"       # yellow #F3F781
COLOR[4]="#56A5EC"      # blue
COLOR[5]="#FFFFFF"      # white
#FFA500 : orange
COLOR[6]="#3090C7"      # Blue Ivry for SAN blue
COLOR[7]="#E77471"      # Light Coral for SAN red

TAG=TAG    # reserved for future

TMPFILE=$logpath/santemp


#----------------------------
initialize ()
{
echo "# Initialize"
mkdir -p $logpath > /dev/null 2>&1
rm $logpath/*configshow* > /dev/null 2>&1
rm $logpath/*switchshow* > /dev/null 2>&1
rm $logpath/swsan* > /dev/null 2>&1
rm $logpath/san* > /dev/null 2>&1
rm $logpath/san_full* > /dev/null 2>&1
rm $TMPFILE* > /dev/null 2>&1
}

#----------------------------
grepp ()
{
x=$1
y=$2
if [ $os == "aix" ]
then
  cat $y | tr -d "\015" | tr -d "\011" | tr -d "\044" | sed 's/^ *$//' | grep -p "$x"
else
  if [ $os == "linux" ]
  then
    cat $y | tr -d "\015" | tr -d "\011" | tr -d "\044" | sed 's/^ *$//' | awk -v RS="" "/$x/"
  else
    echo "ERROR: Unknown OS"
    exit 1
  fi
fi
}

#----------------------------
list_switch_ports ()
{

fabric=fabric
for sw in $(echo $listswitch)
do
  ssh $USER@$sw "configshow" | egrep "^alias|^zone|^cfg|^enable" > $logpath/configshow_${fabric}.csv
  fabricname=$(grep -i '^enable:' $logpath/configshow_${fabric}.csv | awk -F':' '{print $2}')
  ssh $USER@$sw "switchshow" | tr -s ' ' | sed 's/\ /;/g' | sed 's/[^A-Za-z0-9_.;:-]//g' | tr -s '\;' ';' > $TMPFILE.tempo
  switchname=$(grep -i '^switchName:' $TMPFILE.tempo | awk -F':' '{print $2}' | tr 'A-Z' 'a-z')
  swdomain=$(grep -i '^switchDomain:' $TMPFILE.tempo | awk -F':' '{print $2}')
  echo "H3;0;TAG;FABRIC: $fabricname  SWITCHNAME: $switchname" > $logpath/switchshow_${fabricname}_${switchname}.csv
  echo "TH;4;TAG;Index;Slot;Port;Speed;State;Protocol;Type;WWN;Alias;Zoned" >> $logpath/switchshow_${fabricname}_${switchname}.csv
  if [ $(grep -qi '^Index;Port;' $TMPFILE.tempo; echo $?) -eq 0 ]
  then
    slot=";NA"
    cat $TMPFILE.tempo | sed -e "/;/ s/;/${slot};/2" > $logpath/switchshow_${fabricname}_${switchname}
    rm $TMPFILE.tempo
  else
    mv $TMPFILE.tempo $logpath/switchshow_${fabricname}_${switchname}
  fi
  for line in $(cat $logpath/switchshow_${fabricname}_${switchname} | grep "FC" | grep -v '^FC' | cut -d';' -f1-4,7-)
  do
    NAGIOSTAG=0
    if [ $(echo $fabricname | grep -qi blue;echo $?) -eq 0 ]
    then
      NAGIOSTAG=6
    else
      if [ $(echo $fabricname | grep -qi red;echo $?) -eq 0 ]
      then
        NAGIOSTAG=7
      fi
    fi
    TAG=TAG
    prefix="TD;$NAGIOSTAG;$TAG"
    zone="no"
    if [ $(echo $line | cut -d';' -f6 | grep -v "Online" > /dev/null; echo $?) -eq 0 ]
    then
      # Ports offline or no FC module
      begin=$(echo $line | cut -d';' -f1-7)
      wwn=""
      alias=""
      echo "${prefix}${begin};;${wwn};${alias};${zone}" >> $logpath/switchshow_${fabricname}_${switchname}.csv
    else
      if [ $(echo $line | egrep "E-Port" > /dev/null; echo $?) -eq 0 ]
      then
        line1=$(echo $line | sed 's/;LS;/;/' | sed 's/;LE;/;/' | sed 's/;LD;/;/')
        # Port type E-Port
        begin=$(echo $line1 | cut -d';' -f1-8)
        wwn=$(echo $line1 | cut -d';' -f9)
        if [ $(echo $wwn | sed 's/[^:]//g' | awk '{ print length }') -eq 7 ]
        then
          alias=$(echo $line1 | cut -d';' -f10- | sed 's/;/|/g')
        else
          wwn=""
          alias=$(echo $line1 | cut -d';' -f9- | sed 's/;/|/g')
        fi
        echo "${prefix}${begin};${wwn};${alias}(ISL);${zone}" >> $logpath/switchshow_${fabricname}_${switchname}.csv
      else
        if [ $(echo $line | egrep "L-Port|NPIV" > /dev/null; echo $?) -eq 0 ]
        then
          # Port type L-Port or N-Port (NPIV)
          begin=$(echo $line | cut -d';' -f1-8 | sed 's/F\-Port/NPIV/')
          index=$(echo $line | cut -d';' -f2 | sed 's/;/,/')
          ssh $USER@$sw "portshow -i $index" > $logpath/portshow_tmp
          for wwn in $(grepp "portWwn:" $logpath/portshow_tmp | grep -v "portWwn" | awk '{print $1}' | sed '/^$/d' | egrep -vi "port|distance")
          do
            if [ $(echo $wwn | tr -s ':' '\n' | wc -l | awk '{print $1}') == 8 ]
            then
              zone="no"
              alias=$(grep "$wwn" $logpath/configshow_${fabric}.csv | grep alias | cut -d':' -f1 | sed 's/alias\.//')
              if [ $(cat $logpath/configshow_${fabric}.csv | grep '^zone.' | cut -d':' -f2- | sed -e 's/^/;/' -e 's/$/;/' | grep ";${alias};" > /dev/null; echo $?) -eq 0 ]
              then
                zone="yes"
              fi
              if [ $(echo $alias | tr -s ' ' '\n' | wc -l | awk '{print $1}') -ne 1 ]
              then
                alias=$(echo $alias | sed 's/\ /,/g' | sed 's/$/(multiples_alias)/')
              else
                if [ -z ${alias} ]
                then
                  alias="(no_alias)"
                fi
              fi
              echo "${prefix}${begin};${wwn};${alias};${zone}" >> $logpath/switchshow_${fabricname}_${switchname}.csv
            fi
          done
          rm -f $logpath/portshow_tmp
        else
          if [ $(echo $line | grep "F-Port" > /dev/null; echo $?) -eq 0 ]
          then
            # Port type F-Port
            begin=$(echo $line | cut -d';' -f1-8)
            wwn=$(echo $line | cut -d';' -f9)
            alias=$(grep "$wwn" $logpath/configshow_${fabric}.csv | grep alias | cut -d':' -f1 | sed 's/alias\.//')
            if [ $(cat $logpath/configshow_${fabric}.csv | grep '^zone.' | cut -d':' -f2- | sed -e 's/^/;/' -e 's/$/;/' | grep ";${alias};" > /dev/null; echo $?) -eq 0 ]
            then
              zone="yes"
            fi
            if [ $(echo $alias | tr -s ' ' '\n' | wc -l | awk '{print $1}') -ne 1 ]
            then
              alias=$(echo $alias | sed 's/\ /,/g' | sed 's/$/(multiples_alias)/')
            else
              if [ -z ${alias} ]
              then
                port=$(echo $line | cut -d';' -f2)
                domport=$(echo "${swdomain},${port}" | rev)
                alias=$(cat $logpath/configshow_${fabric}.csv | grep alias | rev | grep "^$domport:" | cut -d':' -f2 | cut -d'.' -f1 | rev)
                if [ $(cat $logpath/configshow_${fabric}.csv | grep '^zone.' | cut -d':' -f2- | sed -e 's/^/;/' -e 's/$/;/' | grep ";${alias};" > /dev/null; echo $?) -eq 0 ]
                then
                  zone="yes"
                fi
                if [ -z ${alias} ]
                then
                  alias="(no_alias)"
                fi
              fi
            fi
            echo "${prefix}${begin};${wwn};${alias};${zone}" >> $logpath/switchshow_${fabricname}_${switchname}.csv
          else
            begin=$(echo $line | cut -d';' -f1-8)
            wwn=$(echo $line | cut -d';' -f9)
            alias="(unknown_type)"
            echo "${prefix}${begin};${wwn};${alias};${zone}" >> $logpath/switchshow_${fabricname}_${switchname}.csv
          fi
        fi
      fi
    fi
  done
  rm $logpath/switchshow_${fabricname}_${switchname}
  mv $logpath/switchshow_${fabricname}_${switchname}.csv $logpath/swsan_${fabricname}_switchshow_${switchname}.csv
  mv $logpath/configshow_${fabric}.csv $logpath/swsan_${fabricname}_configshow_${switchname}.csv
done
}

#----------------------------
alias_unused ()
{
# Alias unused
NAGIOSTAG=0
TAG=TAG

allfabric=""
for fabricname in $(ls $logpath/swsan_*_configshow_*.csv | rev | cut -d'/' -f1 | cut -d'.' -f2 | rev | sed -e 's/swsan_/\ /' -e 's/_configshow_/\ /' | awk '{print $1}' | sort -u)
do
  allfabric=$(echo $allfabric $fabricname)
  filename=$(ls $logpath/swsan_${fabricname}_configshow_*.csv | head -1)
  cat /dev/null > $logpath/san_result.csv
  for i in $(ls $logpath/swsan_${fabricname}_switchshow_*.csv)
  do
    cat $i | grep '^TD;' >> $logpath/san_result.csv
  done
    echo "H3;0;TAG;Alias defined in Fabric ${fabricname} but not connected" | tee $logpath/swsan_${fabricname}_unused.csv
    echo "TH;4;TAG;alias;number of defined zones;zone name" | tee -a $logpath/swsan_${fabricname}_unused.csv

    sed '1d' $logpath/san_result.csv | grep ";Online;" | rev | cut -d';' -f2 | rev | sed 's/(no_alias)//' | sed 's/(multiples_alias)//' | sed '/^$/d' | grep -v "(ISL)" | tr ' ' '\n' | sed 's/$/;/' > $logpath/san_result1.csv

    for alias in $(cat $filename | grep '^alias' | cut -d'.' -f2- | cut -d':' -f1 | sort | uniq)
    do
      nb_zone=0
      if [ $(grep "^${alias};" $logpath/san_result1.csv > /dev/null 2>&1;echo $?) -ne 0 ]
      then
        # Alias no more in use
        cat $filename | grep "^zone." | sed 's/:/:;/' | sed 's/$/;/' | grep ";${alias};" | cut -d':' -f1 | cut -d'.' -f2 > $logpath/san_result2.csv
        if [ -z $logpath/san_result2.csv ]
        then
          nb_zone=0
        else
          nb_zone=$(cat $logpath/san_result2.csv | tr -s ' ' '/n' | wc -l | awk '{print $1}')
        fi
        if [ "$nb_zone" == "0" ]
        then
          NAGIOSTAG=3
        else
          NAGIOSTAG=0
        fi
        prefix="TD;$NAGIOSTAG;$TAG"
        echo "${prefix};$alias;$nb_zone;"$(cat $logpath/san_result2.csv) | tee -a $logpath/swsan_${fabricname}_unused.csv
      else
        echo ${alias} >> $logpath/swsan_good.txt
      fi
    done
done
}

#----------------------------
list_zones ()
{
echo "====== ZONING ======"
echo
echo "Generated from "$(hostname -s) $(date "+%d-%m-%Y %H:%M")
for fabricname in $(echo $allfabric)
do
  filename=$(ls $logpath/swsan_${fabricname}_configshow_*.csv | head -1)
  echo
  echo "===== Zones defined on fabric ${fabricname} ====="
  echo
  cat $filename | grep '^zone.' | cut -d'.' -f2- | sed 's/:/\ /' | sed 's/$/\\/' | sed 's/$/\\/'
done

for fabricname in $(echo $allfabric)
do
  filename=$(ls $logpath/swsan_${fabricname}_configshow_*.csv | head -1)
  echo
  cfg=$(cat $filename | grep '^enable:' | cut -d':' -f2)
  zoning_active=$(grep "^cfg.${cfg}:" $filename | cut -d':' -f2- | sed -e 's/^/;/' -e 's/$/;/')
  echo "===== Inactives zone in Fabric ${fabricname} ====="
  echo
  for zone in $(cat $filename | grep '^zone.' | cut -d'.' -f2- | awk -F':' '{print $1}')
  do
    if [ $(echo $zoning_active | grep ";${zone};" > /dev/null;echo $?) -ne 0 ]
    then
      echo "${zone}" | sed 's/$/\\/' | sed 's/$/\\/'
    fi
  done
done

for fabricname in $(echo $allfabric)
do
  filename=$(ls $logpath/swsan_${fabricname}_configshow_*.csv | head -1)
  echo
  echo "===== Active configuration for fabric ${fabricname} ====="
  echo
  cfg=$(cat $filename | grep '^enable:' | cut -d':' -f2)
  echo ${cfg}
  echo
  echo "==== Active zones ===="
  echo
  grep "^cfg.${cfg}:" $filename | cut -d':' -f2- | sed 's/;/\ /g' | sed 's/$/\\/' | sed 's/$/\\/'
done
}

#----------------------------
convert_html ()
{
#<TABLE BORDER="1" style="background:#FFFF00">
#  <CAPTION> Voici le titre du tableau </CAPTION>
#  <TR style="background:#80BFFF"><TH> Titre A1 </TH><TH> Titre A2 </TH><TH> Titre A3 </TH><TH> Titre A4 </TH></TR>
#  <TR style="background:#00FF00"><TH> Titre B1 </TH><TD> Valeur B2 </TD><TD> Valeur B3 </TD><TD> Valeur B4 </TD></TR>
#  <TR><TH> Titre B1 </TH><TD> Valeur B2 </TD><TD> Valeur B3 </TD><TD> Valeur B4 </TD></TR>
#</TABLE>

server=$(/bin/hostname -s)
echo '<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<h1>SAN SWITCH CONFIG (generated from' $server')' $(date "+%d-%m-%Y %H:%M") '</h1>
<body>
<br>
<h2>SWITCHSHOW</h2>
<br>
<table border="1">
<tbody>'

for filename in $(ls $logpath/swsan_*_switchshow_*.csv)
do
  nb_line=$(cat $filename | wc -l)
  if [ "$nb_line" -gt "1" ]
  then
    fabricname=$(echo $filename | rev | cut -d'/' -f1 | cut -d'.' -f2 | rev | sed -e 's/swsan_/\ /' -e 's/_switchshow_/\ /' | awk '{print $1}')
    switchname=$(echo $filename | rev | cut -d'/' -f1 | cut -d'.' -f2 | rev | sed -e 's/swsan_/\ /' -e 's/_switchshow_/\ /'| awk '{print $2}')
    #echo '<h3>Fabric: '$(echo $fabricname)' Switchname: '$(echo $switchname)'</h3><br>'
    cat $filename | grep '^H3' | sed -e 's/^H3;0;TAG;/\<h3\>/' -e 's/$/\<\/h3\>\<br\>/'
    cat $filename | grep -v '^H3' > $TMPFILE.tempo
    for nb in 0 1 2 3 4 5 6 7 8 9
    do
      for begin in TH TD
      do
        cat $TMPFILE.tempo | sed "s/^$begin;$nb;TAG;/\<TR\ style=\"background:${COLOR[$nb]}\"><TD>/g" > $TMPFILE.tempo1
        mv $TMPFILE.tempo1 $TMPFILE.tempo
      done
    done
    cat $TMPFILE.tempo | sed 's/;/<\/TD><TD>/g' | sed 's/|/\ /g' | sed 's/$/<\/TD><\/TR>/g'
    echo '</tbody>
</table>
<table border="1">
<tbody>
<BR><BR>'
  fi
done

echo '
</body>
</html>'
}

#----------------------------
convert_html_unused ()
{
#<TABLE BORDER="1" style="background:#FFFF00">
#  <CAPTION> Voici le titre du tableau </CAPTION>
#  <TR style="background:#80BFFF"><TH> Titre A1 </TH><TH> Titre A2 </TH><TH> Titre A3 </TH><TH> Titre A4 </TH></TR>
#  <TR style="background:#00FF00"><TH> Titre B1 </TH><TD> Valeur B2 </TD><TD> Valeur B3 </TD><TD> Valeur B4 </TD></TR>
#  <TR><TH> Titre B1 </TH><TD> Valeur B2 </TD><TD> Valeur B3 </TD><TD> Valeur B4 </TD></TR>
#</TABLE>

server=$(/bin/hostname -s)
echo '<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<h1>SAN SWITCH UNUSED ports (generated from' $server')' $(date "+%d-%m-%Y %H:%M") '</h1>
<body>
<br>
<h2>ALIAS</h2>
<br>
<table border="1">
<tbody>'

for filename in $(ls $logpath/swsan_*_unused.csv)
do
  nb_line=$(cat $filename | wc -l)
  if [ "$nb_line" -gt "1" ]
  then
    cat $filename | grep '^H3' | sed -e 's/^H3;0;TAG;/\<h3\>/' -e 's/$/\<\/h3\>\<br\>/'
    cat $filename | grep -v '^H3' > $TMPFILE.tempo
    for nb in 0 1 2 3 4 5 6 7 8 9
    do
      for begin in TH TD
      do
        cat $TMPFILE.tempo | sed "s/^$begin;$nb;TAG;/\<TR\ style=\"background:${COLOR[$nb]}\"><TD>/g" > $TMPFILE.tempo1
        mv $TMPFILE.tempo1 $TMPFILE.tempo
      done
    done
    cat $TMPFILE.tempo | sed 's/;/<\/TD><TD>/g' | sed 's/|/\ /g' | sed 's/$/<\/TD><\/TR>/g'
    echo '</tbody>
</table>
<table border="1">
<tbody>
<BR><BR>'
  fi
done

echo '
</body>
</html>'
}


#------------------------------------------------
send_wiki()
{
htmlinventory=$logpath/san_switchshow.html
dokupath=/var/www/html/data/pages/inventory/san
dokuhost=dokuwiki01
dokuuser=apache
dokugrp=apache

#file_exist=$(ssh $dokuhost "ls $dokupath/$xlsmonthly > /dev/null 2>&1" ;echo $?)
#echo ${file_exist}
#if [ ${file_exist} != 0 ]
#then
#  echo "Creating monthly file hmcscan_ALL-server_${cur_month}.xls"
#  scp -p $xlsinventory $dokuhost:$dokupath/$xlsmonthly
#  scp $dokuhost:$dokupath/$dokufilename $logpath
#  echo "\n\nhttp://dokuwiki01/data/pages/inventory/hmcscan/$xlsmonthly" >> $logpath/$dokufilename
#  scp -p $logpath/$dokufilename $dokuhost:$dokupath
#else
#  echo "Monthly file available, not creating"
#fi
#
scp -p -r $htmlinventory $dokuhost:$dokupath
scp -p -r $logpath/san_unused_alias.html $dokuhost:$dokupath
scp -p -r $logpath/san_full_config.txt $dokuhost:$dokupath
#scp -p $xlsinventory $dokuhost:$dokupath
ssh $dokuhost "chown -R $dokuuser.$dokugrp $dokupath"
}

#############################
# Main
#############################
main ()
{
date
echo "***** initialize"
initialize
echo "***** Switchshow"
list_switch_ports
echo "***** convert HTML"
convert_html > $logpath/san_switchshow.html
echo "***** List Unused"
alias_unused > $logpath/san_unused_alias.csv
echo "***** convert HTML"
convert_html_unused > $logpath/san_unused_alias.html
echo "***** List FULL config"
list_zones > $logpath/san_full_config.txt
echo "***** Send to Wiki"
send_wiki

date
}

main > $logname 2>&1

Backup Brocade SAN switch

[root@mgmt01 san]# cat backup_brocade_switches.sh
#!/bin/ksh
# Script to back up SAN configuration using  ssh and scp.

# Variable declaration
RC=0
SUMRC=0
SAN_LIST="SAN_SW1 SAN_SW2 SAN_SW3"
BCKSRV="IP_OF_BACKUP_SERVER|"
BCK_DIRECTORY="/directory/where/to/backup"
BCK_USER=BACKUP_SERVER_USER
#TODAY=`date +"%Y%m%d"`

for san in $SAN_LIST
do
  echo "Backing up SAN switch config data..." $san
  ssh admin@$san "configupload -all -p sftp $BCKSRV,$BCK_USER,$BCK_DIRECTORY/$san.cfg"
  RC=$?
  echo "RC = " $RC
  SUMRC=$((SUMRC+RC))
done

#TSM backup
echo "Archiving configuration of all SAN switches..."
dsmc archive "$BCK_DIRECTORY/*" -archmc=MC_NAME
RC=$?
echo "RC = " $RC
SUMRC=$((SUMRC+RC))

exit $SUMRC

dev

list all Virtual FID

$ ssh usr1@san1 'lscfg --show' | grep '^FID' | sed 's/FID//' | tr '|' '\n' | awk '{print $1}' | sed '/^$/d' | sort -u
storage/brocade_scripts.1655107127.txt.gz · Last modified: 2022/06/13 09:58 by manu