#!/bin/bash # # $Id: rescanscsi,v 1.2 2001/02/20 06:35:56 merlin Exp $ # # $Log: rescanscsi,v $ # Revision 1.2 2001/02/20 06:35:56 merlin # Now remove devices too # # Revision 1.1 1998/05/24 05:23:41 merlin # First version checked in CVS # # # Skript to rescan SCSI bus, using the # scsi add-single-device mechanism # (w) 98/03/19 Kurt Garloff (c) GNU GPL # Return hosts. /proc/scsi/HOSTADAPTER/? must exist findhosts () { hosts= for name in /proc/scsi/*/?; do name=${name#/proc/scsi/} if test ! $name = scsi then hosts="$hosts ${name#*/}" echo "Host adapter ${name#*/} (${name%/*}) found." fi done } # Test if SCSI device $host $channen $id $lun exists # Outputs description from /proc/scsi/scsi, returns new testexist () { grepstr="scsi$host Channel: 0$channel Id: 0*$id Lun: 0$lun" new=`cat /proc/scsi/scsi|grep -e"$grepstr"` if test ! -z "$new" then cat /proc/scsi/scsi|grep -e"$grepstr" cat /proc/scsi/scsi|grep -A2 -e"$grepstr"|tail -2|pr -o4 -l1 fi } # Perform search (scan $host) dosearch () { for channel in $channelsearch; do for id in $idsearch; do for lun in $lunsearch; do new= devnr="$host $channel $id $lun" echo "scsi remove-single-device $devnr" >/proc/scsi/scsi echo "Scanning for device $devnr ..." printf "OLD: " testexist if test -z "$new" then printf "\rNEW: " echo "scsi add-single-device $devnr" >/proc/scsi/scsi testexist if test -z "$new"; then printf "\r\x1b[A"; else let found+=1; fi fi done done done } # main if test @$1 = @--help -o @$1 = @-h then echo "Usage: rescan-scsi-bus.sh [-l] [-c] [host [host ...]]" echo " -l activates scanning for LUNs 0 .. 7 [default: 0]" echo " -c enables scanning of channels 0 1 [default: 0]" echo " If hosts are given, only these are scanned [def.: all]" exit 0 fi # defaults lunsearch="0" idsearch="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15" channelsearch="0" # Scan options opt="$1" while test ! -z "$opt" -a -z "${opt##-*}"; do opt=${opt#-} case "$opt" in l) lunsearch="0 1 2 3 4 5 6 7" ;; c) channelsearch="0 1" ;; *) echo "Unknown option -$opt !" ;; esac shift opt="$1" done # Hosts given ? if test @$1 = @; then findhosts; else hosts=$*; fi declare -i found=0 for host in $hosts; do dosearch; done echo "$found new device(s) found."