Statistics
| Branch: | Tag: | Revision:

root / host / common.sh.in @ f4bd39d8

History | View | Annotate | Download (7.6 kB)

1 f4bd39d8 Nikos Skalkotos
# Copyright 2011 GRNET S.A. All rights reserved.
2 f4bd39d8 Nikos Skalkotos
#
3 f4bd39d8 Nikos Skalkotos
# Redistribution and use in source and binary forms, with or without
4 f4bd39d8 Nikos Skalkotos
# modification, are permitted provided that the following conditions
5 f4bd39d8 Nikos Skalkotos
# are met:
6 f4bd39d8 Nikos Skalkotos
#
7 f4bd39d8 Nikos Skalkotos
#   1. Redistributions of source code must retain the above copyright
8 f4bd39d8 Nikos Skalkotos
#      notice, this list of conditions and the following disclaimer.
9 f4bd39d8 Nikos Skalkotos
#
10 f4bd39d8 Nikos Skalkotos
#  2. Redistributions in binary form must reproduce the above copyright
11 f4bd39d8 Nikos Skalkotos
#     notice, this list of conditions and the following disclaimer in the
12 f4bd39d8 Nikos Skalkotos
#     documentation and/or other materials provided with the distribution.
13 f4bd39d8 Nikos Skalkotos
#
14 f4bd39d8 Nikos Skalkotos
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
15 f4bd39d8 Nikos Skalkotos
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 f4bd39d8 Nikos Skalkotos
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 f4bd39d8 Nikos Skalkotos
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
18 f4bd39d8 Nikos Skalkotos
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 f4bd39d8 Nikos Skalkotos
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 f4bd39d8 Nikos Skalkotos
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 f4bd39d8 Nikos Skalkotos
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 f4bd39d8 Nikos Skalkotos
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 f4bd39d8 Nikos Skalkotos
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 f4bd39d8 Nikos Skalkotos
# SUCH DAMAGE.
25 f4bd39d8 Nikos Skalkotos
#
26 f4bd39d8 Nikos Skalkotos
# The views and conclusions contained in the software and documentation are
27 f4bd39d8 Nikos Skalkotos
# those of the authors and should not be interpreted as representing official
28 f4bd39d8 Nikos Skalkotos
# policies, either expressed or implied, of GRNET S.A.
29 f4bd39d8 Nikos Skalkotos
30 f4bd39d8 Nikos Skalkotos
AWK="awk"
31 f4bd39d8 Nikos Skalkotos
KPARTX="kpartx"
32 f4bd39d8 Nikos Skalkotos
LOSETUP="losetup"
33 f4bd39d8 Nikos Skalkotos
SFDISK="sfdisk"
34 f4bd39d8 Nikos Skalkotos
PROGRESS_MONITOR="snf-progress-monitor"
35 f4bd39d8 Nikos Skalkotos
36 f4bd39d8 Nikos Skalkotos
progress_monitor_support="@progress_monitor_support@"
37 f4bd39d8 Nikos Skalkotos
38 f4bd39d8 Nikos Skalkotos
CLEANUP=( )
39 f4bd39d8 Nikos Skalkotos
40 f4bd39d8 Nikos Skalkotos
log_error() {
41 f4bd39d8 Nikos Skalkotos
    echo "$@" >&2
42 f4bd39d8 Nikos Skalkotos
}
43 f4bd39d8 Nikos Skalkotos
44 f4bd39d8 Nikos Skalkotos
get_api5_arguments() {
45 f4bd39d8 Nikos Skalkotos
    GETOPT_RESULT=$*
46 f4bd39d8 Nikos Skalkotos
    # Note the quotes around `$TEMP': they are essential!
47 f4bd39d8 Nikos Skalkotos
    eval set -- "$GETOPT_RESULT"
48 f4bd39d8 Nikos Skalkotos
    while true; do
49 f4bd39d8 Nikos Skalkotos
        case "$1" in
50 f4bd39d8 Nikos Skalkotos
            -i|-n) instance=$2; shift 2;;
51 f4bd39d8 Nikos Skalkotos
52 f4bd39d8 Nikos Skalkotos
            -o) old_name=$2; shift 2;;
53 f4bd39d8 Nikos Skalkotos
54 f4bd39d8 Nikos Skalkotos
            -b) blockdev=$2; shift 2;;
55 f4bd39d8 Nikos Skalkotos
56 f4bd39d8 Nikos Skalkotos
            -s) swapdev=$2; shift 2;;
57 f4bd39d8 Nikos Skalkotos
58 f4bd39d8 Nikos Skalkotos
            --) shift; break;;
59 f4bd39d8 Nikos Skalkotos
60 f4bd39d8 Nikos Skalkotos
            *)  log_error "Internal error!" >&2; exit 1;;
61 f4bd39d8 Nikos Skalkotos
        esac
62 f4bd39d8 Nikos Skalkotos
    done
63 f4bd39d8 Nikos Skalkotos
    if [ -z "$instance" -o -z "$blockdev" ]; then
64 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Argument (-i, -n, or -b)"
65 f4bd39d8 Nikos Skalkotos
        exit 1
66 f4bd39d8 Nikos Skalkotos
    fi
67 f4bd39d8 Nikos Skalkotos
    if [ "$SCRIPT_NAME" != "export" -a -z "$swapdev"  ]; then
68 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Argument -s (swapdev)"
69 f4bd39d8 Nikos Skalkotos
        exit 1
70 f4bd39d8 Nikos Skalkotos
    fi
71 f4bd39d8 Nikos Skalkotos
    if [ "$SCRIPT_NAME" = "rename" -a -z "$old_name"  ]; then
72 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Argument -o (old_name)"
73 f4bd39d8 Nikos Skalkotos
        exit 1
74 f4bd39d8 Nikos Skalkotos
    fi
75 f4bd39d8 Nikos Skalkotos
}
76 f4bd39d8 Nikos Skalkotos
77 f4bd39d8 Nikos Skalkotos
get_api10_arguments() {
78 f4bd39d8 Nikos Skalkotos
    if [ -z "$INSTANCE_NAME" -o -z "$HYPERVISOR" -o -z "$DISK_COUNT" ]; then
79 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Variable:"
80 f4bd39d8 Nikos Skalkotos
        log_error "(INSTANCE_NAME HYPERVISOR or DISK_COUNT)"
81 f4bd39d8 Nikos Skalkotos
        exit 1
82 f4bd39d8 Nikos Skalkotos
    fi
83 f4bd39d8 Nikos Skalkotos
    instance=$INSTANCE_NAME
84 f4bd39d8 Nikos Skalkotos
    if [ $DISK_COUNT -lt 1 -o -z "$DISK_0_PATH" ]; then
85 f4bd39d8 Nikos Skalkotos
        log_error "At least one disk is needed"
86 f4bd39d8 Nikos Skalkotos
        exit 1
87 f4bd39d8 Nikos Skalkotos
    fi
88 f4bd39d8 Nikos Skalkotos
    if [ "$SCRIPT_NAME" = "export" ]; then
89 f4bd39d8 Nikos Skalkotos
        if [ -z "$EXPORT_DEVICE" ]; then
90 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Variable EXPORT_DEVICE"
91 f4bd39d8 Nikos Skalkotos
    fi
92 f4bd39d8 Nikos Skalkotos
    blockdev=$EXPORT_DEVICE
93 f4bd39d8 Nikos Skalkotos
    elif [ "$SCRIPT_NAME" = "import" ]; then
94 f4bd39d8 Nikos Skalkotos
        if [ -z "$IMPORT_DEVICE" ]; then
95 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Variable IMPORT_DEVICE"
96 f4bd39d8 Nikos Skalkotos
        fi
97 f4bd39d8 Nikos Skalkotos
        blockdev=$IMPORT_DEVICE
98 f4bd39d8 Nikos Skalkotos
    else
99 f4bd39d8 Nikos Skalkotos
        blockdev=$DISK_0_PATH
100 f4bd39d8 Nikos Skalkotos
    fi
101 f4bd39d8 Nikos Skalkotos
    if [ "$SCRIPT_NAME" = "rename" -a -z "$OLD_INSTANCE_NAME" ]; then
102 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Variable OLD_INSTANCE_NAME"
103 f4bd39d8 Nikos Skalkotos
    fi
104 f4bd39d8 Nikos Skalkotos
    old_name=$OLD_INSTANCE_NAME
105 f4bd39d8 Nikos Skalkotos
}
106 f4bd39d8 Nikos Skalkotos
107 f4bd39d8 Nikos Skalkotos
get_api20_arguments() {
108 f4bd39d8 Nikos Skalkotos
    get_api_10_arguments
109 f4bd39d8 Nikos Skalkotos
    if [ -z "$OSP_IMG_ID"]; then
110 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Parameter: OSP_IMG_ID"
111 f4bd39d8 Nikos Skalkotos
        exit 1
112 f4bd39d8 Nikos Skalkotos
    fi
113 f4bd39d8 Nikos Skalkotos
    if [ -z "$OSP_IMG_FORMAT"]; then
114 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Parameter: OSP_IMG_FORMAT"
115 f4bd39d8 Nikos Skalkotos
        exit 1
116 f4bd39d8 Nikos Skalkotos
    fi
117 f4bd39d8 Nikos Skalkotos
    if [ -z "$OSP_IMG_PASSWD"]; then
118 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Parameter: OSP_IMG_PASSWD"
119 f4bd39d8 Nikos Skalkotos
        exit 1
120 f4bd39d8 Nikos Skalkotos
    fi
121 f4bd39d8 Nikos Skalkotos
122 f4bd39d8 Nikos Skalkotos
    IMG_ID=$OSP_IMG_ID
123 f4bd39d8 Nikos Skalkotos
    IMG_FORMAT=$OSP_IMG_FORMAT
124 f4bd39d8 Nikos Skalkotos
    IMG_PASSWD=$OSP_IMG_PASSWD
125 f4bd39d8 Nikos Skalkotos
}
126 f4bd39d8 Nikos Skalkotos
127 f4bd39d8 Nikos Skalkotos
map_disk0() {
128 f4bd39d8 Nikos Skalkotos
    blockdev="$1"
129 f4bd39d8 Nikos Skalkotos
    filesystem_dev_base=`$KPARTX -l -p- $blockdev | \
130 f4bd39d8 Nikos Skalkotos
                            grep -m 1 -- "-1.*$blockdev" | \
131 f4bd39d8 Nikos Skalkotos
                            $AWK '{print $1}'`
132 f4bd39d8 Nikos Skalkotos
    if [ -z "$filesystem_dev_base" ]; then
133 f4bd39d8 Nikos Skalkotos
        log_error "Cannot interpret kpartx output and get partition mapping"
134 f4bd39d8 Nikos Skalkotos
        exit 1
135 f4bd39d8 Nikos Skalkotos
    fi
136 f4bd39d8 Nikos Skalkotos
    $KPARTX -a -p- $blockdev > /dev/null
137 f4bd39d8 Nikos Skalkotos
    filesystem_dev="/dev/mapper/${filesystem_dev_base/%-1/}"
138 f4bd39d8 Nikos Skalkotos
    if [ ! -b "/dev/mapper/$filesystem_dev_base" ]; then
139 f4bd39d8 Nikos Skalkotos
        log_error "Can't find kpartx mapped partition:" \
140 f4bd39d8 Nikos Skalkotos
                                            "/dev/mapper/$filesystem_dev_base"
141 f4bd39d8 Nikos Skalkotos
        exit 1
142 f4bd39d8 Nikos Skalkotos
    fi
143 f4bd39d8 Nikos Skalkotos
    echo "$filesystem_dev"
144 f4bd39d8 Nikos Skalkotos
}
145 f4bd39d8 Nikos Skalkotos
146 f4bd39d8 Nikos Skalkotos
unmap_disk0() {
147 f4bd39d8 Nikos Skalkotos
    $KPARTX -d -p- $1
148 f4bd39d8 Nikos Skalkotos
}
149 f4bd39d8 Nikos Skalkotos
150 f4bd39d8 Nikos Skalkotos
format_disk0() {
151 f4bd39d8 Nikos Skalkotos
    local device="$1"
152 f4bd39d8 Nikos Skalkotos
    local image_type="$2"
153 f4bd39d8 Nikos Skalkotos
    
154 f4bd39d8 Nikos Skalkotos
    declare -A part_id=( ['extdump']="83" ["ntfsdump"]="7" )
155 f4bd39d8 Nikos Skalkotos
156 f4bd39d8 Nikos Skalkotos
    # The -f is needed, because we use an optimal alignment and sfdisk complains
157 f4bd39d8 Nikos Skalkotos
    # about partitions not ending on clylinder boundary.
158 f4bd39d8 Nikos Skalkotos
    local sfdisk_cmd="$SFDISK -uS -H 255 -S 63 -f --quiet --Linux --DOS $device"
159 f4bd39d8 Nikos Skalkotos
160 f4bd39d8 Nikos Skalkotos
    $sfdisk_cmd > /dev/null <<EOF
161 f4bd39d8 Nikos Skalkotos
2048,,${part_id["$image_type"]},*
162 f4bd39d8 Nikos Skalkotos
EOF
163 f4bd39d8 Nikos Skalkotos
}
164 f4bd39d8 Nikos Skalkotos
165 f4bd39d8 Nikos Skalkotos
cleanup() {
166 f4bd39d8 Nikos Skalkotos
    if [ ${#CLEANUP[*]} -gt 0 ]; then
167 f4bd39d8 Nikos Skalkotos
        LAST_ELEMENT=$((${#CLEANUP[*]}-1))
168 f4bd39d8 Nikos Skalkotos
        REVERSE_INDEXES=$(seq ${LAST_ELEMENT} -1 0)
169 f4bd39d8 Nikos Skalkotos
        for i in $REVERSE_INDEXES; do
170 f4bd39d8 Nikos Skalkotos
            ${CLEANUP[$i]}
171 f4bd39d8 Nikos Skalkotos
        done
172 f4bd39d8 Nikos Skalkotos
    fi
173 f4bd39d8 Nikos Skalkotos
}
174 f4bd39d8 Nikos Skalkotos
175 f4bd39d8 Nikos Skalkotos
trap cleanup EXIT
176 f4bd39d8 Nikos Skalkotos
177 f4bd39d8 Nikos Skalkotos
DEFAULT_FILE="@sysconfdir@/default/snf-image"
178 f4bd39d8 Nikos Skalkotos
if [ -f "$DEFAULT_FILE" ]; then
179 f4bd39d8 Nikos Skalkotos
    . "$DEFAULT_FILE"
180 f4bd39d8 Nikos Skalkotos
fi
181 f4bd39d8 Nikos Skalkotos
182 f4bd39d8 Nikos Skalkotos
: ${ARCH:="x86_64}
183 f4bd39d8 Nikos Skalkotos
: ${CUSTOMIZE_DIR:="@sysconfdir@/ganeti/snf-image/hooks"}
184 f4bd39d8 Nikos Skalkotos
: ${VARIANTS_DIR:="@sysconfdir@/ganeti/snf-image/variants"}
185 f4bd39d8 Nikos Skalkotos
: ${IMAGE_DIR:="@localstatedir@/lib/snf-image"}
186 f4bd39d8 Nikos Skalkotos
187 f4bd39d8 Nikos Skalkotos
SCRIPT_NAME=$(basename $0)
188 f4bd39d8 Nikos Skalkotos
189 f4bd39d8 Nikos Skalkotos
if [ -f /sbin/blkid -a -x /sbin/blkid ]; then
190 f4bd39d8 Nikos Skalkotos
    VOL_ID="/sbin/blkid -c /dev/null -o value -s UUID"
191 f4bd39d8 Nikos Skalkotos
    VOL_TYPE="/sbin/blkid -c /dev/null -o value -s TYPE"
192 f4bd39d8 Nikos Skalkotos
else
193 f4bd39d8 Nikos Skalkotos
    for dir in /lib/udev /sbin; do
194 f4bd39d8 Nikos Skalkotos
        if [ -f $dir/vol_id -a -x $dir/vol_id ]; then
195 f4bd39d8 Nikos Skalkotos
            VOL_ID="$dir/vol_id -u"
196 f4bd39d8 Nikos Skalkotos
            VOL_TYPE="$dir/vol_id -t"
197 f4bd39d8 Nikos Skalkotos
        fi
198 f4bd39d8 Nikos Skalkotos
    done
199 f4bd39d8 Nikos Skalkotos
fi
200 f4bd39d8 Nikos Skalkotos
201 f4bd39d8 Nikos Skalkotos
if [ -z "$VOL_ID" ]; then
202 f4bd39d8 Nikos Skalkotos
    log_error "vol_id or blkid not found, please install udev or util-linux"
203 f4bd39d8 Nikos Skalkotos
    exit 1
204 f4bd39d8 Nikos Skalkotos
fi
205 f4bd39d8 Nikos Skalkotos
206 f4bd39d8 Nikos Skalkotos
207 f4bd39d8 Nikos Skalkotos
if [ -z "$OS_API_VERSION" -o "$OS_API_VERSION" = "5" ]; then
208 f4bd39d8 Nikos Skalkotos
    OS_API_VERSION=5
209 f4bd39d8 Nikos Skalkotos
    GETOPT_RESULT=`getopt -o o:n:i:b:s: -n '$0' -- "$@"`
210 f4bd39d8 Nikos Skalkotos
    if [ $? != 0 ] ; then log_error "Terminating..."; exit 1 ; fi
211 f4bd39d8 Nikos Skalkotos
    get_api5_arguments $GETOPT_RESULT
212 f4bd39d8 Nikos Skalkotos
elif [ "$OS_API_VERSION" = "10" -o "$OS_API_VERSION" = "15" ]; then
213 f4bd39d8 Nikos Skalkotos
    get_api10_arguments
214 f4bd39d8 Nikos Skalkotos
elif [ "$OS_API_VERSION" = "20" ]; then
215 f4bd39d8 Nikos Skalkotos
    get_api20_arguments
216 f4bd39d8 Nikos Skalkotos
    IMAGE_NAME=$IMG_ID
217 f4bd39d8 Nikos Skalkotos
    IMAGE_TYPE=$IMG_FORMAT
218 f4bd39d8 Nikos Skalkotos
else
219 f4bd39d8 Nikos Skalkotos
    log_error "Unknown OS API VERSION $OS_API_VERSION"
220 f4bd39d8 Nikos Skalkotos
    exit 1
221 f4bd39d8 Nikos Skalkotos
fi
222 f4bd39d8 Nikos Skalkotos
223 f4bd39d8 Nikos Skalkotos
if [ -n "$OS_VARIANT" ]; then
224 f4bd39d8 Nikos Skalkotos
    if [ ! -d "$VARIANTS_DIR" ]; then
225 f4bd39d8 Nikos Skalkotos
        log_error "OS Variants directory $VARIANTS_DIR doesn't exist"
226 f4bd39d8 Nikos Skalkotos
        exit 1
227 f4bd39d8 Nikos Skalkotos
    fi
228 f4bd39d8 Nikos Skalkotos
    VARIANT_CONFIG="$VARIANTS_DIR/$OS_VARIANT.conf"
229 f4bd39d8 Nikos Skalkotos
    if [ -f "$VARIANT_CONFIG" ]; then
230 f4bd39d8 Nikos Skalkotos
        . "$VARIANT_CONFIG"
231 f4bd39d8 Nikos Skalkotos
    else
232 f4bd39d8 Nikos Skalkotos
        if grep -qxF "$OS_VARIANT" variants.list; then
233 f4bd39d8 Nikos Skalkotos
            log_error "ERROR: instance-image configuration error"
234 f4bd39d8 Nikos Skalkotos
            log_error "  Published variant $OS_VARIANT is missing its config" \
235 f4bd39d8 Nikos Skalkotos
                      "file"
236 f4bd39d8 Nikos Skalkotos
            log_error "  Please create $VARIANT_CONFIG or unpublish the variant"
237 f4bd39d8 Nikos Skalkotos
            log_error "  (by removing $OS_VARIANT from variants.list)"
238 f4bd39d8 Nikos Skalkotos
        else
239 f4bd39d8 Nikos Skalkotos
            log_error "Unofficial variant $OS_VARIANT is unsupported"
240 f4bd39d8 Nikos Skalkotos
            log_error "Most probably this is a user error, forcing a wrong name"
241 f4bd39d8 Nikos Skalkotos
            log_error "To support this variant please create file" \
242 f4bd39d8 Nikos Skalkotos
                        "$VARIANT_CONFIG"
243 f4bd39d8 Nikos Skalkotos
        fi
244 f4bd39d8 Nikos Skalkotos
        exit 1
245 f4bd39d8 Nikos Skalkotos
    fi
246 f4bd39d8 Nikos Skalkotos
fi
247 f4bd39d8 Nikos Skalkotos
248 f4bd39d8 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :