summaryrefslogtreecommitdiffstats
path: root/os-plugins/plugins/xen/files/xen.examples/scripts/block-iscsi
blob: f473a0a92b01f5b986a511ac74b389b797e67232 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/bin/bash

# Usage: block-iscsi [add tgtname | remove dev]
#
# This assumes you're running a correctly configured 
# iscsi target (server) at the other end!
# Note that we assume that the passwords for discovery (if needed)
# are in /etc/iscsid.conf
# and the node session passwords (if required) in the
# open-iscsi database below /var/lib/open-iscsi/node.db
#
# (c) Kurt Garloff <kurt@garloff.de>, 2006-09-04, GNU GPL
# Contributors: Jim Fehlig <jfehlig@novell.com>
#               Stefan de Konink <skinkie@xs4all.nl>

dir=$(dirname "$0")
. "$dir/block-common.sh"

# echo "DBG:xen/scripts/block-iscsi $1 $2 XENBUS_PATH=$XENBUS_PATH $par $node"

find_sdev()
{
  unset dev
  for session in /sys/class/iscsi_session/session*; do
    if [ "$1" = "`cat $session/targetname`" ]; then
      dev=`basename $session/device/target*/*:0:*/block*/*`
      return
    fi
  done
}

find_sdev_rev()
{
  unset tgt
  for session in /sys/class/iscsi_session/session*; do
    dev=`basename $session/device/target*/*:0:*/block*/*`
    if [ "$dev" = "$1" ]; then
      tgt=`cat $session/targetname`
      return
    fi
  done
}

case "$command" in
  add)
    # load modules and start iscsid
    /etc/init.d/open-iscsi status >/dev/null 2>&1 ||
      { /etc/init.d/open-iscsi start >/dev/null 2>&1; sleep 1; }
    # list of targets on node
    /sbin/iscsiadm -m discovery | sed "s/ .*//g" | while read line; do /sbin/iscsiadm -m discovery -t sendtargets -p $line; done >/dev/null
    par=`xenstore-read $XENBUS_PATH/params` || true
    TGTID=`echo $par | sed "s/\/\///g"`
    while read rec uuid; do
      if [ "$uuid" = "$TGTID" ]; then
        find_sdev $TGTID
        if [ -z "$dev" ]; then
          /sbin/iscsiadm -m node -T $uuid -p $rec --login || exit 2
          sleep 4
          find_sdev $TGTID
        fi
        xenstore-write $XENBUS_PATH/node /dev/$dev
        write_dev /dev/$dev
        exit 0
      fi
    done < <(/sbin/iscsiadm -m node)
    exit 1
    ;;

  remove)
    node=`xenstore-read $XENBUS_PATH/node` || true
    dev=$node; dev=${dev#/dev/}
    find_sdev_rev $dev
    if [ -x /sbin/blockdev -a -n "$node" ];  then blockdev --flushbufs "$node"; fi
    test -z "$tgt" && exit 2
    /sbin/iscsiadm -m node -T $tgt --logout
    exit 1
    ;;
esac