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