This is an old revision of the document!
# WWN="200000e08b01ced3" # echo $WWN | tr ' ' '\n' | sed 's/../&:/g;s/:$//' | tr 'A-Z' 'a-z' 20:00:00:e0:8b:01:ce:d3
[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
[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
list all Virtual FID
$ ssh usr1@san1 'lscfg --show' | grep '^FID' | sed 's/FID//' | tr '|' '\n' | awk '{print $1}' | sed '/^$/d' | sort -u
Example of commands on vFID
$ fosexec --fid 10 -cmd "switchshow"