diff options
Diffstat (limited to 'scripts/scsi_mandat')
-rwxr-xr-x | scripts/scsi_mandat | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/scripts/scsi_mandat b/scripts/scsi_mandat new file mode 100755 index 00000000..1f72b406 --- /dev/null +++ b/scripts/scsi_mandat @@ -0,0 +1,133 @@ +#!/bin/bash +# scsi_mandat +# +# Script to test compliance with SCSI mandatory commands. +# The vintage is SPC-3 and SPC-4 (see www.t10.org). +# +# Coverage: +# Command Standard/Draft (is mandatory in) +# ------------------------------------------------------- +# INQUIRY (standard) SCSI-2, SPC, SPC-2, SPC-3, SPC-4 +# INQUIRY (VPD pages 0, 0x83) SPC-2, SPC-3, SPC-4 +# REPORT LUNS SPC-3, SPC-4 +# TEST UNIT READY SCSI-2, SPC, SPC-2, SPC-3, SPC-4 +# REQUEST SENSE SCSI-2, SBC, SBC-2,3, MMC-4,5, SSC-2,3 +# SEND DIAGNOSTIC SBC, SBC-2,3, SSC-2,3 +# +# This script uses utilities frim sg3_utils package (version +# 1.21 or later) +# +# Douglas Gilbert 20131016 + + +log=0 +quiet=0 +verbose="" + +file_err=0 +inv_opcode=0 +illeg_req=0 +not_ready=0 +medium=0 +other_err=0 +recovered=0 +sanity=0 +syntax=0 +timeout=0 +unit_attention=0 +aborted_command=0 + +## total_err=0 + +usage() +{ + echo "Usage: scsi_mandat [-h] [-L] [-q] [-v] <device>" + echo " where: -h, --help print usage message" + echo " -L, --log append stderr to 'scsi_mandat.err'" + echo " -q, --quiet suppress some output" + echo " -v, --verbose increase verbosity of output" + echo "" + echo "Check <device> for mandatory SCSI command support" +} + + +opt="$1" +while test ! -z "$opt" -a -z "${opt##-*}"; do + opt=${opt#-} + case "$opt" in + h|-help) usage ; exit 0 ;; + L|-log) let log=$log+1 ;; + q|-quiet) let quiet=$quiet+1 ;; + v|-verbose) verbose="-v" ;; + vv) verbose="-vv" ;; + vvv) verbose="-vvv" ;; + *) echo "Unknown option: -$opt " ; exit 1 ;; + esac + shift + opt="$1" +done + +if [ $# -lt 1 ] + then + usage + exit 1 +fi + +for command in "sg_inq" "sg_luns" "sg_turs" "sg_requests" "sg_vpd" \ + "sg_vpd -i" "sg_senddiag -t" +do + if [ $quiet -eq 0 ] + then echo "$command" $verbose "$1" + fi + + if [ $verbose ] + then + if [ $log -eq 0 ] + then + $command $verbose "$1" + else + $command $verbose "$1" >> scsi_mandat.err 2>> scsi_mandat.err + fi + else + if [ $log -eq 0 ] + then + $command "$1" > /dev/null 2>> /dev/null + else + $command "$1" > /dev/null 2>> scsi_mandat.err + fi + fi + res=$? + case "$res" in + 0) ;; + 1) echo " syntax error" ; let syntax=$syntax+1 ;; + 2) echo " not ready" ; let not_ready=$not_ready+1 ;; + 3) echo " medium error" ; let medium=$medium+1 ;; + 5) echo " illegal request, general" ; let illeg_req=$illeg_req+1 ;; + 6) echo " unit attention" ; let unit_attention=$unit_attention+1 ;; + 9) echo " illegal request, invalid opcode" ; let inv_opcode=$inv_opcode+1 ;; + 11) echo " aborted command" ; let aborted_command=$aborted_command+1 ;; + 15) echo " file error with $1 " ; let file_err=$file_err+1 ;; + 20) echo " no sense" ; let other_err=$other_err+1 ;; + 21) echo " recovered error" ; let recovered=$recovered+1 ;; + 33) echo " timeout" ; let timeout=$timeout+1 ;; + 97) echo " response fails sanity" ; let sanity=$sanity+1 ;; + 98) echo " other SCSI error" ; let other_err=$other_err+1 ;; + 99) echo " other error" ; let other_err=$other_err+1 ;; + *) echo " unknown exit status for sg_inq: $res" ; let other_err=$other_err+1 ;; + esac +done + +echo "" +let total_bad_err=$file_err+$inv_opcode+$illeg_req+$medium+$aborted_command +let total_bad_err+=$other_err+$recovered+$sanity+$syntax+$timeout + +let total_allow_err=$not_ready+$unit_attention + + echo "total number of bad errors: $total_bad_err " + +if [ $total_allow_err -gt 0 ] + then + echo "total number of allowable errors: $total_allow_err " +fi + +exit $total_bad_err |