/etc/xen/scripts/block-iscsi is in xen-utils-common 4.6.0-1ubuntu4.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
| 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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | #!/bin/bash -e
#
# Open-iSCSI Xen block device hotplug script
#
# Author Roger Pau Monné <roger.pau@citrix.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published
# by the Free Software Foundation; version 2.1 only. with the special
# exception on linking described in file LICENSE.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Lesser General Public License for more details.
#
# Usage:
#
# Target should be specified using the following syntax:
#
# script=block-iscsi,vdev=xvda,target=iqn=<iqn>,portal=<portal IP>
#
# Portal address must be in IP format.
#
dir=$(dirname "$0")
. "$dir/block-common.sh"
remove_label()
{
    echo $1 | sed "s/^\("$2"\)//"
}
check_tools()
{
    if ! command -v iscsiadm > /dev/null 2>&1; then
        fatal "Unable to find iscsiadm tool"
    fi
    if [ "$multipath" = "y" ] && ! command -v multipath > /dev/null 2>&1; then
        fatal "Unable to find multipath"
    fi
}
# Sets the following global variables based on the params field passed in as
# a parameter: iqn, portal, auth_method, user, multipath, password
parse_target()
{
    # set multipath default value
    multipath="n"
    for param in $(echo "$1" | tr "," "\n")
    do
        case $param in
        iqn=*)
            iqn=$(remove_label $param "iqn=")
            ;;
        portal=*)
            portal=$(remove_label $param "portal=")
            ;;
        multipath=*)
            multipath=$(remove_label $param "multipath=")
            ;;
        esac
    done
    if [ -z "$iqn" ] || [ -z "$portal" ]; then
        fatal "iqn= and portal= are required parameters"
    fi
    if [ "$multipath" != "y" ] && [ "$multipath" != "n" ]; then
        fatal "multipath valid values are y and n, $multipath not a valid value"
    fi
}
# Sets $dev to point to the device associated with the value in iqn
find_device()
{
    count=0
    while [ ! -e /dev/disk/by-path/*"$iqn"-lun-0 ]; do
        sleep 0.1
        count=`expr $count + 1`
        if [ count = 100 ]; then
            # 10s timeout while waiting for iSCSI disk to settle
            fatal "timeout waiting for iSCSI disk to settle"
        fi
    done
    sddev=$(readlink -f /dev/disk/by-path/*"$iqn"-lun-0 || true)
    if [ ! -b "$sddev" ]; then
        fatal "Unable to find attached device path"
    fi
    if [ "$multipath" = "y" ]; then
        mdev=$(multipath -ll "$sddev" | head -1 | awk '{ print $1}')
        if [ ! -b /dev/mapper/"$mdev" ]; then
            fatal "Unable to find attached device multipath"
        fi
        dev="/dev/mapper/$mdev"
    else
        dev="$sddev"
    fi
}
# Attaches the target $iqn in $portal and sets $dev to point to the
# multipath device
attach()
{
    do_or_die iscsiadm -m node --targetname "$iqn" -p "$portal" --login > /dev/null
    find_device
}
# Discovers targets in $portal and checks that $iqn is one of those targets
# Also sets the auth parameters to attach the device
prepare()
{
    # Check if target is already opened
    iscsiadm -m session 2>&1 | grep -q "$iqn" && fatal "Device already opened"
    # Discover portal targets
    iscsiadm -m discovery -t st -p $portal 2>&1 | grep -q "$iqn" || \
        fatal "No matching target iqn found"
}
# Attaches the device and writes xenstore backend entries to connect
# the device
add()
{
    attach
    write_dev $dev
}
# Disconnects the device
remove()
{
    find_device
    do_or_die iscsiadm -m node --targetname "$iqn" -p "$portal" --logout > /dev/null
}
command=$1
target=$(xenstore-read $XENBUS_PATH/params || true)
if [ -z "$target" ]; then
    fatal "No information about the target"
fi
parse_target "$target"
check_tools || exit 1
case $command in
add)
    prepare
    add
    ;;
remove)
    remove
    ;;
*)
    exit 1
    ;;
esac
 |