This file is indexed.

/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