Statistics
| Branch: | Revision:

root / common.sh.in @ ab712029

History | View | Annotate | Download (6.6 kB)

1 79224631 Lance Albertson
#
2 79224631 Lance Albertson
3 79224631 Lance Albertson
# Copyright (C) 2007, 2008, 2009 Google Inc.
4 79224631 Lance Albertson
#
5 79224631 Lance Albertson
# This program is free software; you can redistribute it and/or modify
6 79224631 Lance Albertson
# it under the terms of the GNU General Public License as published by
7 79224631 Lance Albertson
# the Free Software Foundation; either version 2 of the License, or
8 79224631 Lance Albertson
# (at your option) any later version.
9 79224631 Lance Albertson
#
10 79224631 Lance Albertson
# This program is distributed in the hope that it will be useful, but
11 79224631 Lance Albertson
# WITHOUT ANY WARRANTY; without even the implied warranty of
12 79224631 Lance Albertson
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 79224631 Lance Albertson
# General Public License for more details.
14 79224631 Lance Albertson
#
15 79224631 Lance Albertson
# You should have received a copy of the GNU General Public License
16 79224631 Lance Albertson
# along with this program; if not, write to the Free Software
17 79224631 Lance Albertson
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 79224631 Lance Albertson
# 02110-1301, USA.
19 79224631 Lance Albertson
20 8d0132dc Lance Albertson
AWK="@AWK@"
21 8d0132dc Lance Albertson
DUMP="@DUMP@"
22 8d0132dc Lance Albertson
LOSETUP="@LOSETUP@"
23 8d0132dc Lance Albertson
KPARTX="@KPARTX@"
24 8d0132dc Lance Albertson
SFDISK="@SFDISK@"
25 ab712029 Lance Albertson
QEMU_IMG="@QEMU_IMG@"
26 8d0132dc Lance Albertson
MKDIR_P="@MKDIR_P@"
27 8d0132dc Lance Albertson
28 79224631 Lance Albertson
CLEANUP=( )
29 79224631 Lance Albertson
30 79224631 Lance Albertson
log_error() {
31 79224631 Lance Albertson
  echo "$@" >&2
32 79224631 Lance Albertson
}
33 79224631 Lance Albertson
34 79224631 Lance Albertson
get_api5_arguments() {
35 79224631 Lance Albertson
  GETOPT_RESULT=$*
36 79224631 Lance Albertson
  # Note the quotes around `$TEMP': they are essential!
37 79224631 Lance Albertson
  eval set -- "$GETOPT_RESULT"
38 79224631 Lance Albertson
  while true; do
39 79224631 Lance Albertson
    case "$1" in
40 79224631 Lance Albertson
      -i|-n) instance=$2; shift 2;;
41 79224631 Lance Albertson
42 79224631 Lance Albertson
      -o) old_name=$2; shift 2;;
43 79224631 Lance Albertson
44 79224631 Lance Albertson
      -b) blockdev=$2; shift 2;;
45 79224631 Lance Albertson
46 79224631 Lance Albertson
      -s) swapdev=$2; shift 2;;
47 79224631 Lance Albertson
48 79224631 Lance Albertson
      --) shift; break;;
49 79224631 Lance Albertson
50 79224631 Lance Albertson
      *)  log_error "Internal error!" >&2; exit 1;;
51 79224631 Lance Albertson
    esac
52 79224631 Lance Albertson
  done
53 79224631 Lance Albertson
  if [ -z "$instance" -o -z "$blockdev" ]; then
54 79224631 Lance Albertson
    log_error "Missing OS API Argument (-i, -n, or -b)"
55 79224631 Lance Albertson
    exit 1
56 79224631 Lance Albertson
  fi
57 79224631 Lance Albertson
  if [ "$SCRIPT_NAME" != "export" -a -z "$swapdev"  ]; then
58 79224631 Lance Albertson
    log_error "Missing OS API Argument -s (swapdev)"
59 79224631 Lance Albertson
    exit 1
60 79224631 Lance Albertson
  fi
61 79224631 Lance Albertson
  if [ "$SCRIPT_NAME" = "rename" -a -z "$old_name"  ]; then
62 79224631 Lance Albertson
    log_error "Missing OS API Argument -o (old_name)"
63 79224631 Lance Albertson
    exit 1
64 79224631 Lance Albertson
  fi
65 79224631 Lance Albertson
}
66 79224631 Lance Albertson
67 79224631 Lance Albertson
get_api10_arguments() {
68 79224631 Lance Albertson
  if [ -z "$INSTANCE_NAME" -o -z "$HYPERVISOR" -o -z "$DISK_COUNT" ]; then
69 79224631 Lance Albertson
    log_error "Missing OS API Variable:"
70 79224631 Lance Albertson
    log_error "(INSTANCE_NAME HYPERVISOR or DISK_COUNT)"
71 79224631 Lance Albertson
    exit 1
72 79224631 Lance Albertson
  fi
73 79224631 Lance Albertson
  instance=$INSTANCE_NAME
74 79224631 Lance Albertson
  if [ $DISK_COUNT -lt 1 -o -z "$DISK_0_PATH" ]; then
75 79224631 Lance Albertson
    log_error "At least one disk is needed"
76 79224631 Lance Albertson
    exit 1
77 79224631 Lance Albertson
  fi
78 79224631 Lance Albertson
  if [ "$SCRIPT_NAME" = "export" ]; then
79 79224631 Lance Albertson
    if [ -z "$EXPORT_DEVICE" ]; then
80 79224631 Lance Albertson
      log_error "Missing OS API Variable EXPORT_DEVICE"
81 79224631 Lance Albertson
    fi
82 79224631 Lance Albertson
    blockdev=$EXPORT_DEVICE
83 79224631 Lance Albertson
  elif [ "$SCRIPT_NAME" = "import" ]; then
84 79224631 Lance Albertson
    if [ -z "$IMPORT_DEVICE" ]; then
85 79224631 Lance Albertson
       log_error "Missing OS API Variable IMPORT_DEVICE"
86 79224631 Lance Albertson
    fi
87 79224631 Lance Albertson
    blockdev=$IMPORT_DEVICE
88 79224631 Lance Albertson
  else
89 79224631 Lance Albertson
    blockdev=$DISK_0_PATH
90 79224631 Lance Albertson
  fi
91 79224631 Lance Albertson
  if [ "$SCRIPT_NAME" = "rename" -a -z "$OLD_INSTANCE_NAME" ]; then
92 79224631 Lance Albertson
    log_error "Missing OS API Variable OLD_INSTANCE_NAME"
93 79224631 Lance Albertson
  fi
94 79224631 Lance Albertson
  old_name=$OLD_INSTANCE_NAME
95 79224631 Lance Albertson
}
96 79224631 Lance Albertson
97 79224631 Lance Albertson
format_disk0() {
98 e21b8802 Lance Albertson
    if [ "${SWAP}" = "yes" ] ; then
99 e21b8802 Lance Albertson
        # Create three partitions:
100 e21b8802 Lance Albertson
        # 1 - 100MB /boot, bootable
101 e21b8802 Lance Albertson
        # 2 - Size of Memory, swap
102 e21b8802 Lance Albertson
        # 3 - Rest
103 e21b8802 Lance Albertson
        $SFDISK -uM -H 255 -S 63 --quiet --Linux "$1" <<EOF
104 22b570d6 Lance Albertson
,100,L,*
105 240140b7 Lance Albertson
,$INSTANCE_BE_memory,S
106 22b570d6 Lance Albertson
,,L
107 79224631 Lance Albertson
EOF
108 e21b8802 Lance Albertson
    else
109 e21b8802 Lance Albertson
        # Create two partitions:
110 e21b8802 Lance Albertson
        # 1 - 100MB /boot, bootable
111 e21b8802 Lance Albertson
        # 2 - Rest
112 e21b8802 Lance Albertson
        $SFDISK -uM -H 255 -S 63 --quiet --Linux "$1" <<EOF
113 e21b8802 Lance Albertson
,100,L,*
114 e21b8802 Lance Albertson
,,L
115 e21b8802 Lance Albertson
EOF
116 e21b8802 Lance Albertson
    fi
117 79224631 Lance Albertson
}
118 79224631 Lance Albertson
119 b05b1ab6 Lance Albertson
mount_disk0() {
120 3173a4bc Lance Albertson
    local target=$1 root_dev=$2 boot_dev=$3
121 3173a4bc Lance Albertson
    mount $root_dev $target
122 3173a4bc Lance Albertson
    CLEANUP+=("umount $target")
123 3173a4bc Lance Albertson
    $MKDIR_P $target/boot
124 3173a4bc Lance Albertson
    mount $boot_dev $target/boot
125 3173a4bc Lance Albertson
    CLEANUP+=("umount $target/boot")
126 b05b1ab6 Lance Albertson
}
127 b05b1ab6 Lance Albertson
128 79224631 Lance Albertson
map_disk0() {
129 79224631 Lance Albertson
  blockdev="$1"
130 8d0132dc Lance Albertson
  filesystem_dev_base=`$KPARTX -l -p- $blockdev | \
131 79224631 Lance Albertson
                       grep -m 1 -- "-1.*$blockdev" | \
132 8d0132dc Lance Albertson
                       $AWK '{print $1}'`
133 79224631 Lance Albertson
  if [ -z "$filesystem_dev_base" ]; then
134 79224631 Lance Albertson
    log_error "Cannot interpret kpartx output and get partition mapping"
135 79224631 Lance Albertson
    exit 1
136 79224631 Lance Albertson
  fi
137 8d0132dc Lance Albertson
  $KPARTX -a -p- $blockdev > /dev/null
138 a1d43218 Lance Albertson
  filesystem_dev="/dev/mapper/${filesystem_dev_base/-1/}"
139 25135be9 Lance Albertson
  if [ ! -b "/dev/mapper/$filesystem_dev_base" ]; then
140 25135be9 Lance Albertson
    log_error "Can't find kpartx mapped partition: /dev/mapper/$filesystem_dev_base"
141 79224631 Lance Albertson
    exit 1
142 79224631 Lance Albertson
  fi
143 79224631 Lance Albertson
  echo "$filesystem_dev"
144 79224631 Lance Albertson
}
145 79224631 Lance Albertson
146 79224631 Lance Albertson
unmap_disk0() {
147 8d0132dc Lance Albertson
  $KPARTX -d -p- $1
148 79224631 Lance Albertson
}
149 79224631 Lance Albertson
150 79224631 Lance Albertson
cleanup() {
151 79224631 Lance Albertson
  if [ ${#CLEANUP[*]} -gt 0 ]; then
152 79224631 Lance Albertson
    LAST_ELEMENT=$((${#CLEANUP[*]}-1))
153 79224631 Lance Albertson
    REVERSE_INDEXES=$(seq ${LAST_ELEMENT} -1 0)
154 79224631 Lance Albertson
    for i in $REVERSE_INDEXES; do
155 79224631 Lance Albertson
      ${CLEANUP[$i]}
156 79224631 Lance Albertson
    done
157 79224631 Lance Albertson
  fi
158 79224631 Lance Albertson
}
159 79224631 Lance Albertson
160 79224631 Lance Albertson
trap cleanup EXIT
161 79224631 Lance Albertson
162 c4661256 Lance Albertson
DEFAULT_FILE="@DEFAULTS_DIR@/ganeti-instance-image"
163 79224631 Lance Albertson
if [ -f "$DEFAULT_FILE" ]; then
164 79224631 Lance Albertson
    . "$DEFAULT_FILE"
165 79224631 Lance Albertson
fi
166 79224631 Lance Albertson
167 79224631 Lance Albertson
# note: we don't set a default mirror since debian and ubuntu have
168 79224631 Lance Albertson
# different defaults, and it's better to use the default
169 79224631 Lance Albertson
170 79224631 Lance Albertson
# only if the user want to specify a mirror in the defaults file we
171 79224631 Lance Albertson
# will use it, this declaration is to make sure the variable is set
172 fcce5224 Lance Albertson
: ${CDINSTALL:="yes"}
173 e21b8802 Lance Albertson
: ${SWAP:="yes"}
174 134c11c3 Lance Albertson
: ${IMAGE_NAME:=""}
175 b05b1ab6 Lance Albertson
: ${IMAGE_TYPE:="qemu"}
176 79224631 Lance Albertson
: ${ARCH:=""}
177 f5aa7725 Lance Albertson
: ${CUSTOMIZE_DIR:="@sysconfdir@/ganeti/instance-image.d"}
178 f5aa7725 Lance Albertson
: ${VARIANTS_DIR:="@sysconfdir@/ganeti/instance-image/variants"}
179 2e0988ec Lance Albertson
: ${IMAGE_DIR:="@localstatedir@/cache/ganeti-instance-image"}
180 f7959feb Lance Albertson
# Custom script variables
181 f7959feb Lance Albertson
: ${GRUB_SETUP:="no"}
182 f7959feb Lance Albertson
183 79224631 Lance Albertson
if [ -z "$OS_API_VERSION" -o "$OS_API_VERSION" = "5" ]; then
184 79224631 Lance Albertson
  DEFAULT_PARTITION_STYLE="none"
185 79224631 Lance Albertson
else
186 79224631 Lance Albertson
  DEFAULT_PARTITION_STYLE="msdos"
187 79224631 Lance Albertson
fi
188 79224631 Lance Albertson
: ${PARTITION_STYLE:=$DEFAULT_PARTITION_STYLE} # disk partition style
189 79224631 Lance Albertson
190 134c11c3 Lance Albertson
191 79224631 Lance Albertson
SCRIPT_NAME=$(basename $0)
192 79224631 Lance Albertson
193 79224631 Lance Albertson
if [ -f /sbin/blkid -a -x /sbin/blkid ]; then
194 79224631 Lance Albertson
  VOL_ID="/sbin/blkid -o value -s UUID"
195 79224631 Lance Albertson
  VOL_TYPE="/sbin/blkid -o value -s TYPE"
196 79224631 Lance Albertson
else
197 79224631 Lance Albertson
  for dir in /lib/udev /sbin; do
198 79224631 Lance Albertson
    if [ -f $dir/vol_id -a -x $dir/vol_id ]; then
199 79224631 Lance Albertson
      VOL_ID="$dir/vol_id -u"
200 79224631 Lance Albertson
      VOL_TYPE="$dir/vol_id -t"
201 79224631 Lance Albertson
    fi
202 79224631 Lance Albertson
  done
203 79224631 Lance Albertson
fi
204 79224631 Lance Albertson
205 79224631 Lance Albertson
if [ -z "$VOL_ID" ]; then
206 79224631 Lance Albertson
  log_error "vol_id or blkid not found, please install udev or util-linux"
207 79224631 Lance Albertson
  exit 1
208 79224631 Lance Albertson
fi
209 79224631 Lance Albertson
210 79224631 Lance Albertson
if [ -z "$OS_API_VERSION" -o "$OS_API_VERSION" = "5" ]; then
211 79224631 Lance Albertson
  OS_API_VERSION=5
212 79224631 Lance Albertson
  GETOPT_RESULT=`getopt -o o:n:i:b:s: -n '$0' -- "$@"`
213 79224631 Lance Albertson
  if [ $? != 0 ] ; then log_error "Terminating..."; exit 1 ; fi
214 79224631 Lance Albertson
  get_api5_arguments $GETOPT_RESULT
215 79224631 Lance Albertson
elif [ "$OS_API_VERSION" = "10" -o "$OS_API_VERSION" = "15" ]; then
216 79224631 Lance Albertson
  get_api10_arguments
217 79224631 Lance Albertson
else
218 79224631 Lance Albertson
  log_error "Unknown OS API VERSION $OS_API_VERSION"
219 79224631 Lance Albertson
  exit 1
220 79224631 Lance Albertson
fi
221 79224631 Lance Albertson
222 79224631 Lance Albertson
if [ -n "$OS_VARIANT" ]; then
223 79224631 Lance Albertson
  if [ ! -d "$VARIANTS_DIR" ]; then
224 79224631 Lance Albertson
    log_error "OS Variants directory $VARIANTS_DIR doesn't exist"
225 79224631 Lance Albertson
    exit 1
226 79224631 Lance Albertson
  fi
227 79224631 Lance Albertson
  VARIANT_CONFIG="$VARIANTS_DIR/$OS_VARIANT.conf"
228 79224631 Lance Albertson
  if [ -f "$VARIANT_CONFIG" ]; then
229 79224631 Lance Albertson
    . "$VARIANT_CONFIG"
230 79224631 Lance Albertson
  else
231 79224631 Lance Albertson
    if grep -qxF "$OS_VARIANT" variants.list; then
232 f5aa7725 Lance Albertson
      log_error "ERROR: instance-image configuration error"
233 79224631 Lance Albertson
      log_error "  Published variant $OS_VARIANT is missing its config file"
234 79224631 Lance Albertson
      log_error "  Please create $VARIANT_CONFIG or unpublish the variant"
235 79224631 Lance Albertson
      log_error "  (by removing $OS_VARIANT from variants.list)"
236 79224631 Lance Albertson
    else
237 79224631 Lance Albertson
      log_error "Unofficial variant $OS_VARIANT is unsupported"
238 79224631 Lance Albertson
      log_error "Most probably this is a user error, forcing a wrong name"
239 79224631 Lance Albertson
      log_error "To support this variant please create file $VARIANT_CONFIG"
240 79224631 Lance Albertson
    fi
241 79224631 Lance Albertson
    exit 1
242 79224631 Lance Albertson
  fi
243 79224631 Lance Albertson
fi