Statistics
| Branch: | Tag: | Revision:

root / snf-image-host / create @ master

History | View | Annotate | Download (6 kB)

1 f4bd39d8 Nikos Skalkotos
#!/bin/bash
2 f4bd39d8 Nikos Skalkotos
3 444a0cb9 Nikos Skalkotos
# Copyright (C) 2011 GRNET S.A.
4 f4bd39d8 Nikos Skalkotos
#
5 7e5d635b Nikos Skalkotos
# This program is free software; you can redistribute it and/or modify
6 7e5d635b Nikos Skalkotos
# it under the terms of the GNU General Public License as published by
7 7e5d635b Nikos Skalkotos
# the Free Software Foundation; either version 2 of the License, or
8 7e5d635b Nikos Skalkotos
# (at your option) any later version.
9 f4bd39d8 Nikos Skalkotos
#
10 7e5d635b Nikos Skalkotos
# This program is distributed in the hope that it will be useful, but
11 7e5d635b Nikos Skalkotos
# WITHOUT ANY WARRANTY; without even the implied warranty of
12 7e5d635b Nikos Skalkotos
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 7e5d635b Nikos Skalkotos
# General Public License for more details.
14 f4bd39d8 Nikos Skalkotos
#
15 7e5d635b Nikos Skalkotos
# You should have received a copy of the GNU General Public License
16 7e5d635b Nikos Skalkotos
# along with this program; if not, write to the Free Software
17 7e5d635b Nikos Skalkotos
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 7e5d635b Nikos Skalkotos
# 02110-1301, USA.
19 f4bd39d8 Nikos Skalkotos
20 f4bd39d8 Nikos Skalkotos
set -e
21 bad5ca1f Nikos Skalkotos
set -o pipefail
22 f4bd39d8 Nikos Skalkotos
23 f4bd39d8 Nikos Skalkotos
. common.sh
24 f4bd39d8 Nikos Skalkotos
25 e4647c86 Nikos Skalkotos
ganeti_os_main
26 e4647c86 Nikos Skalkotos
27 ded30adf Nikos Skalkotos
if [ "$IMAGE_DEBUG" = "yes" ]; then
28 ded30adf Nikos Skalkotos
    PS4='$(date "+%s.%N ($LINENO) + ")'
29 ded30adf Nikos Skalkotos
    set -x
30 ded30adf Nikos Skalkotos
elif [ "$IMAGE_DEBUG" != "no" ]; then
31 4a4e861a Nikos Skalkotos
    log_warning "Unsupported IMAGE_DEBUG value: \`$IMAGE_DEBUG'"
32 ded30adf Nikos Skalkotos
fi
33 9c76962d Nikos Skalkotos
34 9c76962d Nikos Skalkotos
monitor_pipe=$(mktemp -u)
35 9c76962d Nikos Skalkotos
mkfifo -m 600 "$monitor_pipe"
36 9c76962d Nikos Skalkotos
add_cleanup rm -f "$monitor_pipe"
37 9c76962d Nikos Skalkotos
38 9c76962d Nikos Skalkotos
if [ -n "$PROGRESS_MONITOR" ]; then
39 87d1bf2e Nikos Skalkotos
    { sleep 1; $PROGRESS_MONITOR "$instance" < "$monitor_pipe" ; } &
40 df1c62e2 Nikos Skalkotos
    monitor_pid="$!"
41 9c76962d Nikos Skalkotos
else
42 cb96f527 Nikos Skalkotos
    sed -u 's|^|[MONITOR] |g' < "$monitor_pipe" &
43 df1c62e2 Nikos Skalkotos
    monitor_pid="$!"
44 9c76962d Nikos Skalkotos
fi
45 9c76962d Nikos Skalkotos
46 9c76962d Nikos Skalkotos
# Create file descriptor to monitor_pipe
47 87d1bf2e Nikos Skalkotos
exec {MONITOR_FD}>${monitor_pipe}
48 9c76962d Nikos Skalkotos
add_cleanup  close_fd ${MONITOR_FD}
49 9c76962d Nikos Skalkotos
50 35ab9f4c Nikos Skalkotos
# Ignore sigpipe signals. If progress monitor is dead and snf-image tries to
51 35ab9f4c Nikos Skalkotos
# output something to the opened pipe, then a sigpipe will be raised. If we do
52 35ab9f4c Nikos Skalkotos
# not catch this, the program will terminate.
53 df1c62e2 Nikos Skalkotos
trap "" SIGPIPE
54 df1c62e2 Nikos Skalkotos
55 7ebe2b85 Nikos Skalkotos
trap report_and_cleanup EXIT
56 d51a95a8 Nikos Skalkotos
57 271fbdfd Nikos Skalkotos
echo "Processing image with ID: \`$IMG_ID' and type: \`$IMAGE_TYPE'" >&2
58 750bb97e Nikos Skalkotos
59 d71f59e9 Nikos Skalkotos
case $BACKEND_TYPE in
60 d71f59e9 Nikos Skalkotos
    local)
61 0a982a6d Nikos Skalkotos
        if [[ "$IMAGE_NAME" =~ ^local:// ]]; then
62 0a982a6d Nikos Skalkotos
            IMAGE_NAME="${IMAGE_NAME:8}"
63 0a982a6d Nikos Skalkotos
        elif [[ "$IMAGE_NAME" =~ ^file:// ]]; then
64 0a982a6d Nikos Skalkotos
            IMAGE_NAME="${IMAGE_NAME:7}"
65 9cd69cad Nikos Skalkotos
            log_warning "The file:// back-end identifier is deprecated and" \
66 0a982a6d Nikos Skalkotos
                        "will be removed in the future. Use local:// instead."
67 0a982a6d Nikos Skalkotos
        fi
68 0a982a6d Nikos Skalkotos
69 e88a9e49 Nikos Skalkotos
        canonical_image_dir="$(canonicalize "$IMAGE_DIR")"
70 e88a9e49 Nikos Skalkotos
        if [ ! -d "$canonical_image_dir" ]; then
71 e88a9e49 Nikos Skalkotos
            log_error "The IMAGE_DIR directory: \`$IMAGE_DIR' does not exist."
72 e88a9e49 Nikos Skalkotos
            report_error "Unable to retrieve image file."
73 0a982a6d Nikos Skalkotos
        fi
74 0a982a6d Nikos Skalkotos
75 9cd69cad Nikos Skalkotos
        image_file="$IMAGE_DIR/$IMAGE_NAME"
76 9cd69cad Nikos Skalkotos
        if [ ! -e "$image_file" ]; then
77 9cd69cad Nikos Skalkotos
            if [ -e "$image_file.$IMAGE_TYPE" ] ; then
78 9cd69cad Nikos Skalkotos
                image_file="$image_file.$IMAGE_TYPE"
79 9cd69cad Nikos Skalkotos
                log_warning "The \`.$IMAGE_TYPE' extension is missing from" \
80 9cd69cad Nikos Skalkotos
                    "the local back-end id. This id form is deprecated and" \
81 9cd69cad Nikos Skalkotos
                    " will be remove in the future."
82 9cd69cad Nikos Skalkotos
            else
83 9cd69cad Nikos Skalkotos
                log_error "Image file \`$image_file' does not exist."
84 9cd69cad Nikos Skalkotos
                report_error "Unable to retrieve image file."
85 9cd69cad Nikos Skalkotos
                exit 1
86 9cd69cad Nikos Skalkotos
            fi
87 d71f59e9 Nikos Skalkotos
        fi
88 e88a9e49 Nikos Skalkotos
89 9cd69cad Nikos Skalkotos
        canonical_image_file="$(canonicalize "$image_file")"
90 9cd69cad Nikos Skalkotos
91 e88a9e49 Nikos Skalkotos
        if [[ "$canonical_image_file" != "$canonical_image_dir"* ]]; then
92 e88a9e49 Nikos Skalkotos
            log_error "Image ID points to a file outside the image directory: \`$IMAGE_DIR'"
93 e88a9e49 Nikos Skalkotos
            report_error "Invalid image ID"
94 e88a9e49 Nikos Skalkotos
            exit 1
95 e88a9e49 Nikos Skalkotos
        fi
96 e88a9e49 Nikos Skalkotos
97 d71f59e9 Nikos Skalkotos
        image_size="$(stat -L -c %s "$image_file")"
98 d71f59e9 Nikos Skalkotos
        ;;
99 42ed2a70 Nikos Skalkotos
    null)
100 42ed2a70 Nikos Skalkotos
        image_file=/dev/null
101 42ed2a70 Nikos Skalkotos
        image_size=0
102 42ed2a70 Nikos Skalkotos
        # Treat it as local file from now on...
103 42ed2a70 Nikos Skalkotos
        BACKEND_TYPE="local"
104 42ed2a70 Nikos Skalkotos
        ;;
105 d71f59e9 Nikos Skalkotos
    network)
106 ee2dbbb1 Nikos Skalkotos
        image_cmd="$CURL $(printf "%q" "$IMAGE_NAME")"
107 d71f59e9 Nikos Skalkotos
        image_size=$($CURL -sI "$IMAGE_NAME" | grep ^Content-Length: | cut -d" " -f2)
108 d71f59e9 Nikos Skalkotos
        ;;
109 d71f59e9 Nikos Skalkotos
    pithos)
110 a5f6a683 Nikos Skalkotos
        # For security reasons pass the database url to pithcat as an
111 a5f6a683 Nikos Skalkotos
        # environmental variable.
112 a5f6a683 Nikos Skalkotos
        export PITHCAT_INPUT_DB="$PITHOS_DB"
113 a5f6a683 Nikos Skalkotos
        export PITHCAT_INPUT_DATA="$PITHOS_DATA"
114 a5f6a683 Nikos Skalkotos
        cmd_args="$(printf "%q" "${IMAGE_NAME}")"
115 d71f59e9 Nikos Skalkotos
        image_cmd="./pithcat $cmd_args"
116 d71f59e9 Nikos Skalkotos
        image_size=$(./pithcat -s  $cmd_args)
117 d71f59e9 Nikos Skalkotos
        ;;
118 d71f59e9 Nikos Skalkotos
esac
119 f4bd39d8 Nikos Skalkotos
120 f4bd39d8 Nikos Skalkotos
# If the target device is not a real block device we'll first losetup it.
121 f4bd39d8 Nikos Skalkotos
# This is needed for file disks.
122 bad5ca1f Nikos Skalkotos
if [ ! -b "$blockdev" ]; then
123 bad5ca1f Nikos Skalkotos
    original_blockdev="$blockdev"
124 02485c69 Nikos Skalkotos
    blockdev=$($LOSETUP -sf "$blockdev")
125 02485c69 Nikos Skalkotos
    add_cleanup $LOSETUP -d "$blockdev"
126 f4bd39d8 Nikos Skalkotos
fi
127 f4bd39d8 Nikos Skalkotos
128 b206849d Nikos Skalkotos
case "$IMAGE_TYPE" in
129 7a474322 Nikos Skalkotos
    ntfsdump|extdump)
130 3f4f15f3 Nikos Skalkotos
        # Create partitions
131 b206849d Nikos Skalkotos
        format_disk0 "$blockdev" "$IMAGE_TYPE"
132 b206849d Nikos Skalkotos
133 3f4f15f3 Nikos Skalkotos
        # Install a new MBR
134 02485c69 Nikos Skalkotos
        $INSTALL_MBR -p 1 -i n "$blockdev"
135 3f4f15f3 Nikos Skalkotos
136 b206849d Nikos Skalkotos
        target="$(map_disk0 "$blockdev")-1" #the root device
137 b206849d Nikos Skalkotos
        add_cleanup unmap_disk0 "$blockdev"
138 27acc2e4 Nikos Skalkotos
        snf_export_PROPERTY_ROOT_PARTITION=1
139 b635b72c Nikos Skalkotos
        if [ "$IMAGE_TYPE" = "ntfsdump" ]; then
140 b635b72c Nikos Skalkotos
            snf_export_PROPERTY_OSFAMILY="windows"
141 b635b72c Nikos Skalkotos
        else
142 b635b72c Nikos Skalkotos
            snf_export_PROPERTY_OSFAMILY="linux"
143 b635b72c Nikos Skalkotos
        fi
144 b206849d Nikos Skalkotos
        ;;
145 d71f59e9 Nikos Skalkotos
    diskdump)
146 b206849d Nikos Skalkotos
        target="$blockdev"
147 b206849d Nikos Skalkotos
        ;;
148 71238d01 Nikos Skalkotos
    *)
149 71238d01 Nikos Skalkotos
        log_error "Unknown Image format: \`$IMAGE_TYPE'"
150 240c2f10 Nikos Skalkotos
        report_error "Unknown Image Format"
151 71238d01 Nikos Skalkotos
        exit 1
152 71238d01 Nikos Skalkotos
        ;;
153 b206849d Nikos Skalkotos
esac
154 f4bd39d8 Nikos Skalkotos
155 240c2f10 Nikos Skalkotos
report_info "Starting image copy..."
156 87d1bf2e Nikos Skalkotos
monitor="./copy-monitor.py -o $MONITOR_FD -r $image_size"
157 d71f59e9 Nikos Skalkotos
if [ "$BACKEND_TYPE" = "local" ]; then
158 db0078b9 Nikos Skalkotos
    # dd the dump to its new home :-)
159 db0078b9 Nikos Skalkotos
    # Deploying an image file on a target block device is a streaming copy
160 db0078b9 Nikos Skalkotos
    # operation. Enable the direct I/O flag on the output fd to avoid polluting
161 db0078b9 Nikos Skalkotos
    # the host cache with useless data.
162 db0078b9 Nikos Skalkotos
    $monitor dd bs=4M if="$image_file" of="$target" oflag=direct
163 d71f59e9 Nikos Skalkotos
else
164 d71f59e9 Nikos Skalkotos
    $image_cmd | $monitor dd bs=4M of="$target" oflag=direct
165 db0078b9 Nikos Skalkotos
fi
166 240c2f10 Nikos Skalkotos
report_info "Image copy finished."
167 f4bd39d8 Nikos Skalkotos
168 e036304a Nikos Skalkotos
# Create a floppy image
169 bad5ca1f Nikos Skalkotos
floppy=$(mktemp --tmpdir floppy.XXXXXX)
170 bad5ca1f Nikos Skalkotos
add_cleanup rm "$floppy"
171 e036304a Nikos Skalkotos
172 bad5ca1f Nikos Skalkotos
snf_export_TYPE="$IMG_FORMAT"
173 bad5ca1f Nikos Skalkotos
snf_export_PASSWORD="$IMG_PASSWD"
174 bad5ca1f Nikos Skalkotos
snf_export_HOSTNAME="$instance"
175 7b8cdc65 Nikos Skalkotos
if [ -n "$IMG_PROPERTIES" ]; then
176 78e9f209 Nikos Skalkotos
    snf_export_PROPERTIES="$IMG_PROPERTIES"
177 78e9f209 Nikos Skalkotos
fi
178 58356445 Nikos Skalkotos
if [ -n "$IMG_PERSONALITY" ]; then
179 bad5ca1f Nikos Skalkotos
    snf_export_PERSONALITY="$IMG_PERSONALITY"
180 8b9d0a95 Constantinos Venetsanopoulos
fi
181 a1d894c5 Nikos Skalkotos
182 fcae4e91 Nikos Skalkotos
snf_export_DEV=$(get_img_dev)
183 72052003 Dimitris Aragiorgis
184 fcae4e91 Nikos Skalkotos
create_floppy "$floppy"
185 f25fb7f4 Nikos Skalkotos
186 fcae4e91 Nikos Skalkotos
launch_helper "$blockdev" "$floppy"
187 f25fb7f4 Nikos Skalkotos
188 240c2f10 Nikos Skalkotos
report_info "Image customization finished successfully."
189 e97ba414 Nikos Skalkotos
190 f4bd39d8 Nikos Skalkotos
# Execute cleanups
191 f4bd39d8 Nikos Skalkotos
cleanup
192 f4bd39d8 Nikos Skalkotos
trap - EXIT
193 f4bd39d8 Nikos Skalkotos
194 f4bd39d8 Nikos Skalkotos
exit 0
195 f4bd39d8 Nikos Skalkotos
196 f4bd39d8 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :