Some scripting hints for checking your Storwize firmware version

I am in the habit of writing mini-shell scripts to paste into an SVC or Storwize terminal to create mini reports.  While the GUI does make all this quite easy, I am quite often remote from the machine, or at the end of a VPN tunnel, so using the GUI is not always convenient.    So for instance if you want to learn just the software version of your Storwize device and the firmware version of its drives,  there is no super quick way to do that from the command line.  You can use the lssystem command to get the cluster software version, but since there is no grep command on Storwize/SVC, you need to sort through all the output yourself host side or use some fancy bash tricks.   You can use the lsdrive command to get the drive firmware version but the lsdrive command does not show the drive types or firmware version in the summary version.   This is rather annoying as it means you need to run lsdrive against every drive to get that level of detail.   In a perfect world I should be able to specify which fields I want in the summary view (see an example below of the rather sparse summary view):

2015-08-02_18-39-16

I wrote a small script to display the firmware version of each drive.   It looks like this:

firmwareversion=$(svcinfo lssystem -delim , | while IFS="," read -ra data
do 
if [ "${data[0]}" == "code_level" ] 
then echo ${data[1]} 
fi
done)
drive=$(printf "%5s%-20s%-10s%-15s \n" "ID" " DriveType" "Capacity" "Version"
svcinfo lsdrive -nohdr -delim , | while IFS="," read -ra drives
do 
svcinfo lsdrive -delim , ${drives[0]} | { while IFS="," read desc data
do 
[[ $desc == "id" ]] && id=$data
[[ $desc == "product_id" ]] && product_id=$data
[[ $desc == "capacity" ]] && capacity=$data
[[ $desc == "firmware_level" ]] && firmware_level=$data
done
printf "%5s%-20s%-10s%-15s \n" "$id" " $product_id" "$capacity" "$firmware_level"
}
done);echo "";echo "Version $firmwareversion";echo "";echo "$drive"

Now for those who understand shell scripts, it uses the –delim , option to separate fields (since in general, commas are not allowed to appear in any data fields).  It then reads the output into an array with the command read -ra, telling the read command that the field delimiter is a comma with the IFS=”,” statement.

When I ran it on a Storwize V3700 running 7.3 code, it ran fine with output like this:

Version 7.3.0.9 (build 97.5.1501190000)

ID  DriveType       Capacity  Version 
 0  HUS723020ALS64  1.8TB     J3K8 
 1  HUS723020ALS64  1.8TB     J3K8 
 2  HUS723020ALS64  1.8TB     J3K8 
 3  HUS723020ALS64  1.8TB     J3K8 
 4  HUS723020ALS64  1.8TB     J3K8 
 5  HUS723020ALS64  1.8TB     J3K8

  But when I ran it on a V3700 running 7.4 or 7.5 code I got this:

rbash: IFS: readonly variable
rbash: IFS: readonly variable
CMMVC5709E [0,online,,member,sas_nearline_hdd,2.7TB,0,mdisk1,5,1,8,,,inactive] is not a supported parameter.

I googled the issue and found this rather helpful forum discussion:

https://www.ibm.com/developerworks/community/forums/html/topic?id=34b706f3-5532-4fed-8742-028d211dadc9

The solution is two-fold:

  1. Dont use IFS to define field separators.
  2. Don’t allow any names in your system to have spaces in it.  This normally doesn’t occur but it appears they may be allowing them in VDisk names.

So I re-wrote my script to not rely on IFS to separate fields and it now looks like this (and runs fine on release 7.4 and 7.5 machines):

firmwareversion=$(svcinfo lssystem | while read desc data
do 
if [ "$desc" == "code_level" ] 
then echo $data 
fi 
done)
drive=$(printf "%5s%-20s%-10s%-15s \n" "ID" " DriveType" "Capacity" "Version"
svcinfo lsdrive -nohdr | while read did status 
do 
svcinfo lsdrive $did | { while read desc data  
do 
[[ $desc == "id" ]] && id=$data 
[[ $desc == "product_id" ]] && product_id=$data 
[[ $desc == "firmware_level" ]] && firmware_level=$data
[[ $desc == "capacity" ]] && capacity=$data
done
printf "%5s%-20s%-10s%-15s \n" "$id" " $product_id" "$capacity" "$firmware_level"
 } 
done);echo "";echo "Version $firmwareversion";echo "";echo "$drive"

The other suggestion from the forum post is to run this whole script externally, which is a great suggestion but not as easily done as it sounds, as running an external script vs pasting in a script can cause a lot of back and forward traffic.

I wrote a BASH script that learns all the drives in one command and then gets all the detailed views in a single command as a second step.    So I pull all that I need about each drive with only two SSH commands (rather than 1 per drive).  Sorry folks, this is Unix or Mac OS only (unless you’re running some unix tools on your Windows machine).

This script presumes you have the SSH key already set up for your userid (since I don’t specify a key, but you could add it to the script).   There are a large number of blank lines simply to make each section clear.

Simply paste it into a file like this

vi checkcodelevels.sh   <then hit ‘i’ and paste in the data, then shift ZZ to save and exit >
chmod 755 checkcodelevels.sh
./checkcodelevels.sh -u superuser -h 10.1.1.1   < where super user is your user and 10.1.1.1 is your V7000 >

The script uses optargs to get two inputs and check for them.   It has no error checking for an unreachable host.   If the user cannot login with your default SSH key it will fail.

#!/bin/bash
# Script to display SVC or Storwize firmware versions

while getopts :u:h: opt
do
 case "$opt"
 in
 u) username="$OPTARG";;
 h) hostname="$OPTARG";;
 esac
done

# We need a user name
if [ -z "$username" ] 
then
echo "Please use a username with -u"
echo "For instance -u superuser"
exit
fi

# we need a host
if [ -z "$hostname" ] 
then
echo "Please use a host with -h"
echo "For instance -h 10.0.0.1"
exit
fi

# Fetch and print the system software version
echo 
echo "Host $hostname is running Code Level: $(ssh $username@$hostname "svcinfo lssystem -delim ," | grep code_level | cut -d, -f2)"
echo

# print the header for the drive data
printf "%5s%-15s%-20s%-15s \n" "ID" " Capacity" "DriveType" "Version"

# Fetch the drive summary view to get a list of drives
summarydrives=$(ssh $username@$hostname "svcinfo lsdrive -nohdr -delim ,")

# build the drive detailed view as one command before sending it
fetchdetailed=$(echo "$summarydrives" | while IFS="," read -ra drivedata
do
echo -n "svcinfo lsdrive -delim , ${drivedata[0]};"
done)

# now grab all the detailed drive data in one command
detailedview=$(ssh $username@$hostname "$fetchdetailed")

# now chunk through the detailed view output and print in table view
echo "$detailedview" | while IFS="," read desc data
do
[[ $desc == "id" ]] && printf "%5s" "$data"
[[ $desc == "capacity" ]] && printf "%-15s" " $data"
[[ $desc == "product_id" ]] && printf "%-20s" "$data"
[[ $desc == "firmware_level" ]] && printf "%-15s \n" "$data"
done

Hopefully this is useful to someone out there.  Suggestions always welcome!

 

Advertisements

About Anthony Vandewerdt

I am an IT Professional who lives and works in Melbourne Australia. This blog is totally my own work. It does not represent the views of any corporation. Constructive and useful comments are very very welcome.
This entry was posted in advice, IBM Storage, SAN, Storwize V3700, Storwize V7000, SVC and tagged , , , . Bookmark the permalink.

6 Responses to Some scripting hints for checking your Storwize firmware version

  1. karlochacon says:

    really helpful script

  2. akshatmithal says:

    Hi Anthony,

    I always liked your blog and your scripts are really handy and simple to use.

    To make life even simpler, we have added support of following commands in latest Storwize code – 7.5.0.2

    “grep; more; sed; sort; cut; head; less; tail; uniq; tr; wc”

    Thanks,
    Akshat

    akshatstorageblog.wordpress.com

  3. Alex Howell says:

    Hi Anthony – you’ll be pleased to hear that grep, and a few other standard Linux utilities, are now available in 7.5. See Barry Whyte’s blog for details:

    https://www.ibm.com/developerworks/community/blogs/storagevirtualization/entry/Spectrum_Virtualize_7_5_0_HyperSwap_grep_and_more?lang=en

    Of course for some tasks host-side scripting is still needed, but this should make users’ lives a little easier.

  4. Pingback: Some scripting hints for checking your Storwize firmware version | Aussie Storage Blog | I Love My Storage

  5. Chris H says:

    Wow, hadn’t seen this post when I commented on the other one, you obviously know all about the stuff I mentioned! Didn’t know about IFS becoming a read-only var, since I haven’t been working with SVC for several years now, that’s too bad. I’d have gone all nerd-rage if I were still running it and came across that! Nice that they’ve added the basic utilities.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s