Added basic infrastructure for supporting Ubuntu 9.10
[people/pravin/BKO.git] / bko / live / ubuntu / U9.10 / iscsi / tools / iscsi_discovery
1 #!/bin/sh
2 #
3 # Copyright (C) Voltaire Ltd. 2006.  ALL RIGHTS RESERVED.
4 #
5 # This program is free software; you can redistribute it and/or modify it under
6 # the terms of the GNU General Public License as published by the Free Software
7 # Foundation; either version 2 of the License, or (at your option) any later
8 # version.
9 #
10 # This program is distributed in the hope that it will be useful, but WITHOUT
11 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 # FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
13 # details.
14 #
15 # You should have received a copy of the GNU General Public License along with
16 # this program; if not, write to the Free Software Foundation, Inc., 59 Temple
17 # Place, Suite 330, Boston, MA 02111-1307 USA
18 #
19 # Author: Dan Bar Dov <danb@voltaire.com>
20
21 # iscsi_discovery:
22 #    * does a send-targets discovery to the given IP
23 #    * set the transport type to the preferred transport (or tcp is -t flag is not used)
24 #    * tries to login
25 #    * if succeeds,
26 #          o logout,
27 #          o mark record autmatic (unless -m flag is used)
28 #    * else
29 #          o reset transport type to TCP
30 #          o try to login
31 #          o if succeeded
32 #                + logout
33 #                + mark record automatic (unless -m flag is used)
34 #
35
36 usage()
37 {
38         echo "Usage: $0 <IP> [-p <port>] [-d] [-t <tcp|iser> [-f]] [-m] [-l]"
39         echo "Options:"
40         echo  "-p               set the port number (defualt is 3260)."
41         echo  "-d               print debugging information"
42         echo  "-t               set trasnpot (default is tcp)."
43         echo  "-f               force specific transport -disable the fallback to tcp (default is fallback enabled)."
44         echo  "                 force the transport specified by the argument of the -t flag."
45         echo  "-m               manual startup - will set manual startup (default is automatic startup)."
46         echo  "-l               login to the new discovered nodes (defualt is false)."
47 }
48
49 dbg()
50 {
51         $debug && echo $@
52 }
53
54 initialize()
55 {
56         trap "exit" 2
57         debug=false
58         force="0"
59         log_out="1"
60         startup_manual="0"
61         #set defualt transport to tcp
62         transport=tcp
63         #set defualt port to 3260
64         port=3260;
65 }
66
67 parse_cmdline()
68 {
69         if [ $# -lt 1 ]; then
70                 usage
71                 exit 1
72         fi
73
74         # check if the IP address is valid
75         ip=`echo $1 | awk -F'.' '$1 != "" && $1 <=255 && $2 != "" && $2 <= 255 && $3 != "" && $3 <= 255 && $4 != "" && $4 <= 255 {print $0}'`
76         if [ -z "$ip" ]; then
77                 echo "$1 is not a vaild IP address!"
78                 exit 1
79         fi
80         shift
81         while getopts "dfmlt:p:" options; do
82          case $options in
83                 d ) debug=true;;
84                 f ) force="1";;
85                 t ) transport=$OPTARG;;
86                 p ) port=$OPTARG;;
87                 m ) startup_manual="1";;
88                 l ) log_out=0;;
89                 \? ) usage
90                         exit 1;;
91                 * )  usage
92                         exit 1;;
93          esac
94         done
95 }
96
97 discover()
98 {
99         # If open-iscsi is already logged in to the portal, exit
100         if [ $(iscsiadm -m session | grep -c ${ip}:${port}) -ne 0 ]; then
101                 echo "Please logout from all targets on ${ip}:${port} before trying to run discovery on that portal"
102                 exit 2
103         fi
104
105         connected=0
106         discovered=0
107         df=/tmp/discovered.$$
108
109         dbg "starting discovery to $ip"
110         iscsiadm -m discovery --type sendtargets --portal ${ip}:${port} > ${df}
111         while read portal target
112         do
113                 portal=${portal%,*}
114                 select_transport
115         done < ${df}
116
117         discovered=$(cat ${df} | wc -l)
118         if [ ${discovered} = 0 ]; then
119                 echo "failed to discover targets at ${ip}"
120                 exit 2
121         else
122                 echo "discovered ${discovered} targets at ${ip}"
123         fi
124         /bin/rm -f ${df}
125 }
126
127 try_login()
128 {
129         if [ "$startup_manual" != "1" ]; then
130                 iscsiadm -m node --targetname ${target} --portal ${portal} --op update -n node.conn[0].startup -v automatic
131         fi
132         iscsiadm -m node --targetname ${target} --portal ${portal} --login >/dev/null 2>&1
133         ret=$?
134         if [ ${ret} = 0 ]; then
135                 echo "Set target ${target} to automatic login over ${transport} to portal ${portal}"
136                 connected=$(($connected + 1))
137                 if [ "$log_out" = "1" ]; then
138                         iscsiadm -m node --targetname ${target} --portal ${portal} --logout
139                 fi
140         else
141                 echo "Cannot login over ${transport} to portal ${portal}"
142                 iscsiadm -m node --targetname ${target} --portal ${portal} --op update -n node.conn[0].startup -v manual
143         fi
144         return ${ret}
145 }
146
147 set_transport()
148 {
149         transport=$1
150         if [ "$transport" == "iser" ];then
151                 iscsiadm -m node --targetname ${target} --portal ${portal} \
152                                 --op update -n node.conn[0].iscsi.HeaderDigest -v None
153                 iscsiadm -m node --targetname ${target} --portal ${portal} \
154                                 --op update -n node.conn[0].iscsi.DataDigest -v None
155         fi
156         transport_name=`iscsiadm  -m node -p ${portal} -T ${target} |awk '/transport_name/ {print $1}'`
157         iscsiadm -m node --targetname ${target} --portal ${portal} \
158                         --op update -n ${transport_name} -v ${transport}
159 }
160
161 select_transport()
162 {
163         set_transport $transport
164         dbg "Testing $transport-login to target ${target} portal ${portal}"
165         try_login;
166         if [ $? != 0 -a  "$force" = "0" ]; then
167                 set_transport tcp
168                 dbg "starting to test tcp-login to target ${target} portal ${portal}"
169                 try_login;
170         fi
171 }
172
173 check_iscsid()
174 {
175         #check if iscsid is running
176         pidof iscsid &>/dev/null
177         ret=$?
178         if [ $ret -ne 0 ]; then
179                 echo "iscsid is not running"
180                 echo "Exiting..."
181                 exit 1
182         fi
183 }
184
185 check_iscsid
186 initialize
187 parse_cmdline "$@"
188 discover