Statistics
| Branch: | Tag: | Revision:

root / snf-image-host / create @ fcae4e91

History | View | Annotate | Download (4.5 kB)

1
#!/bin/bash
2

    
3
# Copyright (C) 2011 GRNET S.A. 
4
#
5
# This program is free software; you can redistribute it and/or modify
6
# it under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 2 of the License, or
8
# (at your option) any later version.
9
#
10
# This program is distributed in the hope that it will be useful, but
11
# WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
# General Public License for more details.
14
#
15
# You should have received a copy of the GNU General Public License
16
# along with this program; if not, write to the Free Software
17
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18
# 02110-1301, USA.
19

    
20
set -e
21
set -o pipefail
22

    
23
. common.sh
24

    
25
ganeti_os_main
26

    
27
# Save stderr to a file
28
stderr=$(mktemp)
29
add_cleanup rm "$stderr"
30
exec 2> >(tee -a "$stderr" >&2)
31

    
32
monitor_pipe=$(mktemp -u)
33
mkfifo -m 600 "$monitor_pipe"
34
add_cleanup rm -f "$monitor_pipe"
35

    
36
if [ -n "$PROGRESS_MONITOR" ]; then
37
    { sleep 1; $PROGRESS_MONITOR "$instance" < "$monitor_pipe" ; } &
38
    monitor_pid="$!"
39
else
40
    sed -u 's|^|MONITOR MSG: |g' < "$monitor_pipe" &
41
    monitor_pid="$!"
42
fi
43

    
44
# Create file descriptor to monitor_pipe
45
exec {MONITOR_FD}>${monitor_pipe}
46
add_cleanup  close_fd ${MONITOR_FD}
47

    
48
# Ignore sigpipe signals. If progress monitor is dead and snf-image-host tries
49
# to output something to the opened pipe, then a sigpipe will be raised. If we
50
# do not catch this, the program will terminate.
51
trap "" SIGPIPE
52

    
53
trap "report_and_cleanup $(printf "%q" "$stderr")" EXIT
54

    
55
case $BACKEND_TYPE in
56
    local)
57
        image_file="$IMAGE_DIR/$(echo "$IMAGE_NAME" | sed 's/^file://').$IMAGE_TYPE"
58
        if [ ! -e "$image_file" ]; then
59
            log_error "Image file \`$image_file' does not exit."
60
            exit 1
61
        fi
62
        image_size="$(stat -L -c %s "$image_file")"
63
        ;;
64
    null)
65
        image_file=/dev/null
66
        image_size=0
67
        # Treat it as local file from now on...
68
        BACKEND_TYPE="local"
69
        ;;
70
    network)
71
        image_cmd="$CURL $(printf "%q" "$IMAGE_NAME") 2> /dev/null"
72
        image_size=$($CURL -sI "$IMAGE_NAME" | grep ^Content-Length: | cut -d" " -f2)
73
        ;;
74
    pithos)
75
        cmd_args="--db $(printf "%q" "${PITHOS_DB}") \
76
                  --data $(printf "%q" "${PITHOS_DATA}") \
77
                  $(printf "%q" "${IMAGE_NAME}")"
78
        image_cmd="./pithcat $cmd_args"
79
        image_size=$(./pithcat -s  $cmd_args)
80
        ;;
81
esac
82

    
83
# If the target device is not a real block device we'll first losetup it.
84
# This is needed for file disks.
85
if [ ! -b "$blockdev" ]; then
86
    original_blockdev="$blockdev"
87
    blockdev=$($LOSETUP -sf "$blockdev")
88
    add_cleanup $LOSETUP -d "$blockdev"
89
fi
90

    
91
case "$IMAGE_TYPE" in
92
    ntfsdump|extdump)
93
        # Create partitions
94
        format_disk0 "$blockdev" "$IMAGE_TYPE"
95

    
96
        # Install a new MBR
97
        $INSTALL_MBR -p 1 -i n "$blockdev"
98

    
99
        target="$(map_disk0 "$blockdev")-1" #the root device
100
        add_cleanup unmap_disk0 "$blockdev"
101
        snf_export_PROPERTY_ROOT_PARTITION=1
102
        if [ "$IMAGE_TYPE" = "ntfsdump" ]; then
103
            snf_export_PROPERTY_OSFAMILY="windows"
104
        else
105
            snf_export_PROPERTY_OSFAMILY="linux"
106
        fi
107
        ;;
108
    diskdump)
109
        target="$blockdev"
110
        ;;
111
    *)
112
        log_error "Unknown Image format: \`$IMAGE_TYPE'"
113
        exit 1
114
        ;;
115
esac
116

    
117
log_info "Starting image copy..."
118
monitor="./copy-monitor.py -o $MONITOR_FD -r $image_size"
119
if [ "$BACKEND_TYPE" = "local" ]; then
120
    # dd the dump to its new home :-)
121
    # Deploying an image file on a target block device is a streaming copy
122
    # operation. Enable the direct I/O flag on the output fd to avoid polluting
123
    # the host cache with useless data.
124
    $monitor dd bs=4M if="$image_file" of="$target" oflag=direct
125
else
126
    $image_cmd | $monitor dd bs=4M of="$target" oflag=direct
127
fi
128
log_info "Image copy finished."
129

    
130
# Create a floppy image
131
floppy=$(mktemp --tmpdir floppy.XXXXXX)
132
add_cleanup rm "$floppy"
133

    
134
snf_export_TYPE="$IMG_FORMAT"
135
snf_export_PASSWORD="$IMG_PASSWD"
136
snf_export_HOSTNAME="$instance"
137
if [ -n "$IMG_PROPERTIES" ]; then
138
    snf_export_PROPERTIES="$IMG_PROPERTIES"
139
fi
140
if [ -n "$IMG_PERSONALITY" ]; then
141
    snf_export_PERSONALITY="$IMG_PERSONALITY"
142
fi
143

    
144
snf_export_DEV=$(get_img_dev)
145

    
146
create_floppy "$floppy"
147

    
148
launch_helper "$blockdev" "$floppy"
149

    
150
log_info "Image customization finished successfully."
151

    
152
# Execute cleanups
153
cleanup
154
trap - EXIT
155

    
156
exit 0
157

    
158
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :