Statistics
| Branch: | Tag: | Revision:

root / snf-image-host / common.sh.in @ edf5dd1a

History | View | Annotate | Download (8.3 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 0c8625b9 Nikos Skalkotos
INSTALL_MBR="install-mbr"
36 9999d40d Nikos Skalkotos
TIMELIMIT="timelimit"
37 f4bd39d8 Nikos Skalkotos
38 f4bd39d8 Nikos Skalkotos
progress_monitor_support="@progress_monitor_support@"
39 f4bd39d8 Nikos Skalkotos
40 f4bd39d8 Nikos Skalkotos
CLEANUP=( )
41 f4bd39d8 Nikos Skalkotos
42 f4bd39d8 Nikos Skalkotos
log_error() {
43 f4bd39d8 Nikos Skalkotos
    echo "$@" >&2
44 f4bd39d8 Nikos Skalkotos
}
45 f4bd39d8 Nikos Skalkotos
46 f4bd39d8 Nikos Skalkotos
get_api5_arguments() {
47 f4bd39d8 Nikos Skalkotos
    GETOPT_RESULT=$*
48 f4bd39d8 Nikos Skalkotos
    # Note the quotes around `$TEMP': they are essential!
49 f4bd39d8 Nikos Skalkotos
    eval set -- "$GETOPT_RESULT"
50 f4bd39d8 Nikos Skalkotos
    while true; do
51 f4bd39d8 Nikos Skalkotos
        case "$1" in
52 f4bd39d8 Nikos Skalkotos
            -i|-n) instance=$2; shift 2;;
53 f4bd39d8 Nikos Skalkotos
54 f4bd39d8 Nikos Skalkotos
            -o) old_name=$2; shift 2;;
55 f4bd39d8 Nikos Skalkotos
56 f4bd39d8 Nikos Skalkotos
            -b) blockdev=$2; shift 2;;
57 f4bd39d8 Nikos Skalkotos
58 f4bd39d8 Nikos Skalkotos
            -s) swapdev=$2; shift 2;;
59 f4bd39d8 Nikos Skalkotos
60 f4bd39d8 Nikos Skalkotos
            --) shift; break;;
61 f4bd39d8 Nikos Skalkotos
62 f4bd39d8 Nikos Skalkotos
            *)  log_error "Internal error!" >&2; exit 1;;
63 f4bd39d8 Nikos Skalkotos
        esac
64 f4bd39d8 Nikos Skalkotos
    done
65 f4bd39d8 Nikos Skalkotos
    if [ -z "$instance" -o -z "$blockdev" ]; then
66 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Argument (-i, -n, or -b)"
67 f4bd39d8 Nikos Skalkotos
        exit 1
68 f4bd39d8 Nikos Skalkotos
    fi
69 f4bd39d8 Nikos Skalkotos
    if [ "$SCRIPT_NAME" != "export" -a -z "$swapdev"  ]; then
70 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Argument -s (swapdev)"
71 f4bd39d8 Nikos Skalkotos
        exit 1
72 f4bd39d8 Nikos Skalkotos
    fi
73 f4bd39d8 Nikos Skalkotos
    if [ "$SCRIPT_NAME" = "rename" -a -z "$old_name"  ]; then
74 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Argument -o (old_name)"
75 f4bd39d8 Nikos Skalkotos
        exit 1
76 f4bd39d8 Nikos Skalkotos
    fi
77 f4bd39d8 Nikos Skalkotos
}
78 f4bd39d8 Nikos Skalkotos
79 f4bd39d8 Nikos Skalkotos
get_api10_arguments() {
80 f4bd39d8 Nikos Skalkotos
    if [ -z "$INSTANCE_NAME" -o -z "$HYPERVISOR" -o -z "$DISK_COUNT" ]; then
81 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Variable:"
82 f4bd39d8 Nikos Skalkotos
        log_error "(INSTANCE_NAME HYPERVISOR or DISK_COUNT)"
83 f4bd39d8 Nikos Skalkotos
        exit 1
84 f4bd39d8 Nikos Skalkotos
    fi
85 f4bd39d8 Nikos Skalkotos
    instance=$INSTANCE_NAME
86 f4bd39d8 Nikos Skalkotos
    if [ $DISK_COUNT -lt 1 -o -z "$DISK_0_PATH" ]; then
87 f4bd39d8 Nikos Skalkotos
        log_error "At least one disk is needed"
88 f4bd39d8 Nikos Skalkotos
        exit 1
89 f4bd39d8 Nikos Skalkotos
    fi
90 f4bd39d8 Nikos Skalkotos
    if [ "$SCRIPT_NAME" = "export" ]; then
91 f4bd39d8 Nikos Skalkotos
        if [ -z "$EXPORT_DEVICE" ]; then
92 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Variable EXPORT_DEVICE"
93 f4bd39d8 Nikos Skalkotos
    fi
94 f4bd39d8 Nikos Skalkotos
    blockdev=$EXPORT_DEVICE
95 f4bd39d8 Nikos Skalkotos
    elif [ "$SCRIPT_NAME" = "import" ]; then
96 f4bd39d8 Nikos Skalkotos
        if [ -z "$IMPORT_DEVICE" ]; then
97 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Variable IMPORT_DEVICE"
98 f4bd39d8 Nikos Skalkotos
        fi
99 f4bd39d8 Nikos Skalkotos
        blockdev=$IMPORT_DEVICE
100 f4bd39d8 Nikos Skalkotos
    else
101 f4bd39d8 Nikos Skalkotos
        blockdev=$DISK_0_PATH
102 f4bd39d8 Nikos Skalkotos
    fi
103 f4bd39d8 Nikos Skalkotos
    if [ "$SCRIPT_NAME" = "rename" -a -z "$OLD_INSTANCE_NAME" ]; then
104 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Variable OLD_INSTANCE_NAME"
105 f4bd39d8 Nikos Skalkotos
    fi
106 f4bd39d8 Nikos Skalkotos
    old_name=$OLD_INSTANCE_NAME
107 f4bd39d8 Nikos Skalkotos
}
108 f4bd39d8 Nikos Skalkotos
109 f4bd39d8 Nikos Skalkotos
get_api20_arguments() {
110 a1d894c5 Nikos Skalkotos
    get_api10_arguments
111 a1d894c5 Nikos Skalkotos
    if [ -z "$OSP_IMG_ID" ]; then
112 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Parameter: OSP_IMG_ID"
113 f4bd39d8 Nikos Skalkotos
        exit 1
114 f4bd39d8 Nikos Skalkotos
    fi
115 a1d894c5 Nikos Skalkotos
    if [ -z "$OSP_IMG_FORMAT" ]; then
116 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Parameter: OSP_IMG_FORMAT"
117 f4bd39d8 Nikos Skalkotos
        exit 1
118 f4bd39d8 Nikos Skalkotos
    fi
119 a1d894c5 Nikos Skalkotos
    if [ -z "$OSP_IMG_PASSWD" ]; then
120 f4bd39d8 Nikos Skalkotos
        log_error "Missing OS API Parameter: OSP_IMG_PASSWD"
121 f4bd39d8 Nikos Skalkotos
        exit 1
122 f4bd39d8 Nikos Skalkotos
    fi
123 f4bd39d8 Nikos Skalkotos
124 f4bd39d8 Nikos Skalkotos
    IMG_ID=$OSP_IMG_ID
125 f4bd39d8 Nikos Skalkotos
    IMG_FORMAT=$OSP_IMG_FORMAT
126 f4bd39d8 Nikos Skalkotos
    IMG_PASSWD=$OSP_IMG_PASSWD
127 58356445 Nikos Skalkotos
    if [ -n "$OSP_IMG_PERSONALITY" ]; then
128 8b9d0a95 Constantinos Venetsanopoulos
        IMG_PERSONALITY=$OSP_IMG_PERSONALITY
129 8b9d0a95 Constantinos Venetsanopoulos
    fi
130 f4bd39d8 Nikos Skalkotos
}
131 a1d894c5 Nikos Skalkotos
132 f4bd39d8 Nikos Skalkotos
map_disk0() {
133 f4bd39d8 Nikos Skalkotos
    blockdev="$1"
134 a1d894c5 Nikos Skalkotos
    filesystem_dev_base=$($KPARTX -l -p- $blockdev | \
135 f4bd39d8 Nikos Skalkotos
                            grep -m 1 -- "-1.*$blockdev" | \
136 a1d894c5 Nikos Skalkotos
                            $AWK '{print $1}')
137 f4bd39d8 Nikos Skalkotos
    if [ -z "$filesystem_dev_base" ]; then
138 f4bd39d8 Nikos Skalkotos
        log_error "Cannot interpret kpartx output and get partition mapping"
139 f4bd39d8 Nikos Skalkotos
        exit 1
140 f4bd39d8 Nikos Skalkotos
    fi
141 f4bd39d8 Nikos Skalkotos
    $KPARTX -a -p- $blockdev > /dev/null
142 f4bd39d8 Nikos Skalkotos
    filesystem_dev="/dev/mapper/${filesystem_dev_base/%-1/}"
143 f4bd39d8 Nikos Skalkotos
    if [ ! -b "/dev/mapper/$filesystem_dev_base" ]; then
144 f4bd39d8 Nikos Skalkotos
        log_error "Can't find kpartx mapped partition:" \
145 f4bd39d8 Nikos Skalkotos
                                            "/dev/mapper/$filesystem_dev_base"
146 f4bd39d8 Nikos Skalkotos
        exit 1
147 f4bd39d8 Nikos Skalkotos
    fi
148 f4bd39d8 Nikos Skalkotos
    echo "$filesystem_dev"
149 f4bd39d8 Nikos Skalkotos
}
150 f4bd39d8 Nikos Skalkotos
151 f4bd39d8 Nikos Skalkotos
unmap_disk0() {
152 f4bd39d8 Nikos Skalkotos
    $KPARTX -d -p- $1
153 f4bd39d8 Nikos Skalkotos
}
154 f4bd39d8 Nikos Skalkotos
155 f4bd39d8 Nikos Skalkotos
format_disk0() {
156 f4bd39d8 Nikos Skalkotos
    local device="$1"
157 f4bd39d8 Nikos Skalkotos
    local image_type="$2"
158 f4bd39d8 Nikos Skalkotos
    
159 f4bd39d8 Nikos Skalkotos
    declare -A part_id=( ['extdump']="83" ["ntfsdump"]="7" )
160 f4bd39d8 Nikos Skalkotos
161 f4bd39d8 Nikos Skalkotos
    # The -f is needed, because we use an optimal alignment and sfdisk complains
162 f4bd39d8 Nikos Skalkotos
    # about partitions not ending on clylinder boundary.
163 f4bd39d8 Nikos Skalkotos
    local sfdisk_cmd="$SFDISK -uS -H 255 -S 63 -f --quiet --Linux --DOS $device"
164 f4bd39d8 Nikos Skalkotos
165 f4bd39d8 Nikos Skalkotos
    $sfdisk_cmd > /dev/null <<EOF
166 f4bd39d8 Nikos Skalkotos
2048,,${part_id["$image_type"]},*
167 f4bd39d8 Nikos Skalkotos
EOF
168 f4bd39d8 Nikos Skalkotos
}
169 f4bd39d8 Nikos Skalkotos
170 e036304a Nikos Skalkotos
create_floppy() {
171 e036304a Nikos Skalkotos
    local img=$1
172 e036304a Nikos Skalkotos
173 a1d894c5 Nikos Skalkotos
    local target=$(mktemp -d) || exit 1
174 e036304a Nikos Skalkotos
    CLEANUP+=("rmdir $target")
175 e036304a Nikos Skalkotos
176 e036304a Nikos Skalkotos
    dd bs=512 count=2880 if=/dev/zero of=$img
177 e036304a Nikos Skalkotos
    mkfs.ext2 -F $img > /dev/null
178 e036304a Nikos Skalkotos
    mount $img $target -o loop
179 b6275d20 Nikos Skalkotos
    set | egrep ^snf_export_\\w+=|sed -e 's/^snf_export_/SNF_IMAGE_/' | \
180 b6275d20 Nikos Skalkotos
    while read line; do
181 4d0a0a13 Nikos Skalkotos
        echo "export $line" >> $target/rules
182 b6275d20 Nikos Skalkotos
    done
183 e036304a Nikos Skalkotos
    umount $target
184 e036304a Nikos Skalkotos
}
185 e036304a Nikos Skalkotos
186 f4bd39d8 Nikos Skalkotos
cleanup() {
187 f4bd39d8 Nikos Skalkotos
    if [ ${#CLEANUP[*]} -gt 0 ]; then
188 f4bd39d8 Nikos Skalkotos
        LAST_ELEMENT=$((${#CLEANUP[*]}-1))
189 f4bd39d8 Nikos Skalkotos
        REVERSE_INDEXES=$(seq ${LAST_ELEMENT} -1 0)
190 f4bd39d8 Nikos Skalkotos
        for i in $REVERSE_INDEXES; do
191 f4bd39d8 Nikos Skalkotos
            ${CLEANUP[$i]}
192 f4bd39d8 Nikos Skalkotos
        done
193 f4bd39d8 Nikos Skalkotos
    fi
194 f4bd39d8 Nikos Skalkotos
}
195 f4bd39d8 Nikos Skalkotos
196 f4bd39d8 Nikos Skalkotos
trap cleanup EXIT
197 f4bd39d8 Nikos Skalkotos
198 f4bd39d8 Nikos Skalkotos
DEFAULT_FILE="@sysconfdir@/default/snf-image"
199 f4bd39d8 Nikos Skalkotos
if [ -f "$DEFAULT_FILE" ]; then
200 f4bd39d8 Nikos Skalkotos
    . "$DEFAULT_FILE"
201 f4bd39d8 Nikos Skalkotos
fi
202 f4bd39d8 Nikos Skalkotos
203 a1d894c5 Nikos Skalkotos
: ${ARCH:="x86_64"}
204 f4bd39d8 Nikos Skalkotos
: ${VARIANTS_DIR:="@sysconfdir@/ganeti/snf-image/variants"}
205 f4bd39d8 Nikos Skalkotos
: ${IMAGE_DIR:="@localstatedir@/lib/snf-image"}
206 5484975e Nikos Skalkotos
: ${HELPER:="@HELPER@"}
207 9999d40d Nikos Skalkotos
: ${HELPER_KERNEL:="@HELPER_KERNEL@"}
208 9999d40d Nikos Skalkotos
: ${HELPER_INITRD:="@HELPER_INITRD@"}
209 9999d40d Nikos Skalkotos
: ${HELPER_SOFT_TIMEOUT=120}
210 9999d40d Nikos Skalkotos
: ${HELPER_HARD_TIMEOUT=15}
211 13487fe3 Nikos Skalkotos
: ${HELPER_USR="nobody"}
212 f4bd39d8 Nikos Skalkotos
213 f4bd39d8 Nikos Skalkotos
SCRIPT_NAME=$(basename $0)
214 f4bd39d8 Nikos Skalkotos
215 f4bd39d8 Nikos Skalkotos
if [ -f /sbin/blkid -a -x /sbin/blkid ]; then
216 f4bd39d8 Nikos Skalkotos
    VOL_ID="/sbin/blkid -c /dev/null -o value -s UUID"
217 f4bd39d8 Nikos Skalkotos
    VOL_TYPE="/sbin/blkid -c /dev/null -o value -s TYPE"
218 f4bd39d8 Nikos Skalkotos
else
219 f4bd39d8 Nikos Skalkotos
    for dir in /lib/udev /sbin; do
220 f4bd39d8 Nikos Skalkotos
        if [ -f $dir/vol_id -a -x $dir/vol_id ]; then
221 f4bd39d8 Nikos Skalkotos
            VOL_ID="$dir/vol_id -u"
222 f4bd39d8 Nikos Skalkotos
            VOL_TYPE="$dir/vol_id -t"
223 f4bd39d8 Nikos Skalkotos
        fi
224 f4bd39d8 Nikos Skalkotos
    done
225 f4bd39d8 Nikos Skalkotos
fi
226 f4bd39d8 Nikos Skalkotos
227 f4bd39d8 Nikos Skalkotos
if [ -z "$VOL_ID" ]; then
228 f4bd39d8 Nikos Skalkotos
    log_error "vol_id or blkid not found, please install udev or util-linux"
229 f4bd39d8 Nikos Skalkotos
    exit 1
230 f4bd39d8 Nikos Skalkotos
fi
231 f4bd39d8 Nikos Skalkotos
232 f4bd39d8 Nikos Skalkotos
233 f4bd39d8 Nikos Skalkotos
if [ -z "$OS_API_VERSION" -o "$OS_API_VERSION" = "5" ]; then
234 f4bd39d8 Nikos Skalkotos
    OS_API_VERSION=5
235 f4bd39d8 Nikos Skalkotos
    GETOPT_RESULT=`getopt -o o:n:i:b:s: -n '$0' -- "$@"`
236 f4bd39d8 Nikos Skalkotos
    if [ $? != 0 ] ; then log_error "Terminating..."; exit 1 ; fi
237 f4bd39d8 Nikos Skalkotos
    get_api5_arguments $GETOPT_RESULT
238 f4bd39d8 Nikos Skalkotos
elif [ "$OS_API_VERSION" = "10" -o "$OS_API_VERSION" = "15" ]; then
239 f4bd39d8 Nikos Skalkotos
    get_api10_arguments
240 f4bd39d8 Nikos Skalkotos
elif [ "$OS_API_VERSION" = "20" ]; then
241 f4bd39d8 Nikos Skalkotos
    get_api20_arguments
242 f4bd39d8 Nikos Skalkotos
    IMAGE_NAME=$IMG_ID
243 f4bd39d8 Nikos Skalkotos
    IMAGE_TYPE=$IMG_FORMAT
244 f4bd39d8 Nikos Skalkotos
else
245 f4bd39d8 Nikos Skalkotos
    log_error "Unknown OS API VERSION $OS_API_VERSION"
246 f4bd39d8 Nikos Skalkotos
    exit 1
247 f4bd39d8 Nikos Skalkotos
fi
248 f4bd39d8 Nikos Skalkotos
249 f4bd39d8 Nikos Skalkotos
if [ -n "$OS_VARIANT" ]; then
250 f4bd39d8 Nikos Skalkotos
    if [ ! -d "$VARIANTS_DIR" ]; then
251 f4bd39d8 Nikos Skalkotos
        log_error "OS Variants directory $VARIANTS_DIR doesn't exist"
252 f4bd39d8 Nikos Skalkotos
        exit 1
253 f4bd39d8 Nikos Skalkotos
    fi
254 f4bd39d8 Nikos Skalkotos
    VARIANT_CONFIG="$VARIANTS_DIR/$OS_VARIANT.conf"
255 f4bd39d8 Nikos Skalkotos
    if [ -f "$VARIANT_CONFIG" ]; then
256 f4bd39d8 Nikos Skalkotos
        . "$VARIANT_CONFIG"
257 f4bd39d8 Nikos Skalkotos
    else
258 f4bd39d8 Nikos Skalkotos
        if grep -qxF "$OS_VARIANT" variants.list; then
259 f4bd39d8 Nikos Skalkotos
            log_error "ERROR: instance-image configuration error"
260 f4bd39d8 Nikos Skalkotos
            log_error "  Published variant $OS_VARIANT is missing its config" \
261 f4bd39d8 Nikos Skalkotos
                      "file"
262 f4bd39d8 Nikos Skalkotos
            log_error "  Please create $VARIANT_CONFIG or unpublish the variant"
263 f4bd39d8 Nikos Skalkotos
            log_error "  (by removing $OS_VARIANT from variants.list)"
264 f4bd39d8 Nikos Skalkotos
        else
265 f4bd39d8 Nikos Skalkotos
            log_error "Unofficial variant $OS_VARIANT is unsupported"
266 f4bd39d8 Nikos Skalkotos
            log_error "Most probably this is a user error, forcing a wrong name"
267 f4bd39d8 Nikos Skalkotos
            log_error "To support this variant please create file" \
268 f4bd39d8 Nikos Skalkotos
                        "$VARIANT_CONFIG"
269 f4bd39d8 Nikos Skalkotos
        fi
270 f4bd39d8 Nikos Skalkotos
        exit 1
271 f4bd39d8 Nikos Skalkotos
    fi
272 f4bd39d8 Nikos Skalkotos
fi
273 f4bd39d8 Nikos Skalkotos
274 f4bd39d8 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :