1 #!/bin/bash |
1 #!/bin/bash |
2 |
2 |
3 ### Parameters |
3 ### Initialize |
4 ## Options |
4 set -u |
5 _MOCK=${_MOCK:0} |
5 set -e |
6 _ACK=${_ACK:0} |
6 |
7 |
7 TESTING= |
|
8 |
|
9 DO_VIRTINSTALL= |
|
10 |
|
11 scripts=$(dirname $0)/scripts |
|
12 . $scripts/lib.sh |
|
13 |
|
14 ### Command-line input |
|
15 ## Command-line options |
|
16 function _help () { |
|
17 cat <<END |
|
18 Usage: $1 [options] [param=value [...]] |
|
19 |
|
20 Options: |
|
21 -h Show this help text |
|
22 |
|
23 -D Debug |
|
24 -v Verbose |
|
25 -q Quiet |
|
26 |
|
27 -N Mock command execution |
|
28 -P Skip command prompts |
|
29 |
|
30 -I Do a virt-install |
|
31 |
|
32 -T Just testing.. |
|
33 |
|
34 Parameters are given as: |
|
35 |
|
36 NAME=value-{FOO} |
|
37 |
|
38 END |
|
39 } |
|
40 |
|
41 while getopts "hDvqNPTI" opt; do |
|
42 case "$opt" in |
|
43 h) |
|
44 _help $0 |
|
45 |
|
46 exit 0 |
|
47 ;; |
|
48 |
|
49 D) |
|
50 LOG_DEBUG=y |
|
51 LOG_CMD=y |
|
52 |
|
53 ;; |
|
54 |
|
55 v) |
|
56 LOG_CMD=y |
|
57 |
|
58 log_debug "log: Commands" |
|
59 ;; |
|
60 |
|
61 q) |
|
62 LOG_CMD= |
|
63 LOG_INFO= |
|
64 |
|
65 log_debug "log: Quiet" |
|
66 ;; |
|
67 |
|
68 N) |
|
69 log_info "Mock-executing commands (this will break functionality..)" |
|
70 |
|
71 CMD_MOCK=y |
|
72 ;; |
|
73 |
|
74 P) |
|
75 log_info "Skipping command confirmations" |
|
76 |
|
77 CMD_PROMPT= |
|
78 ;; |
|
79 |
|
80 T) |
|
81 log_info "Just testing.." |
|
82 |
|
83 TESTING=y |
|
84 ;; |
|
85 |
|
86 I) |
|
87 log_info "Do virt-install" |
|
88 |
|
89 DO_VIRTINSTALL=y |
|
90 ;; |
|
91 ?) |
|
92 _help $0 |
|
93 |
|
94 exit 1 |
|
95 ;; |
|
96 esac |
|
97 done |
|
98 |
|
99 # forget them |
|
100 shift $(( $OPTIND - 1 )) |
|
101 |
|
102 ## Command-line arguments |
|
103 log_info "Processing ${#@} arguments" |
|
104 for param in "$@"; do |
|
105 name=${param%=*} |
|
106 value=${param##*=} |
|
107 |
|
108 # evaluate |
|
109 value=$(expand_line "$value") |
|
110 |
|
111 log_debug " $name = $value" |
|
112 |
|
113 eval "opt_${name}=${value}" |
|
114 done |
|
115 |
|
116 ### State |
8 ## Guest info |
117 ## Guest info |
9 GUEST_NAME=$1 |
118 GUEST_NAME=$opt_name |
10 |
119 |
11 # Basic params |
120 # Basic params |
12 GUEST_RAM=1G |
121 GUEST_RAM=${opt_ram:-1G} |
13 GUEST_VCPUS=2 |
122 GUEST_VCPUS=${opt_cpus:-2} |
14 |
123 |
15 # OS variant (for virt-install) |
124 # OS variant (for virt-install) |
16 GUEST_OS_VARIANT=debiansqueeze |
125 GUEST_OS_VARIANT=${opt_os:-debiansqueeze} |
17 |
126 |
18 ## Disk |
127 ## Disk |
19 # Size of LV to create |
128 # Size of LV to create |
20 DISK_SIZE=10G |
129 DISK_SIZE=${opt_disk_size:-10G} |
21 |
130 |
22 # LVM vg to use |
131 # LVM vg to use |
23 DISK_VG=pvl |
132 DISK_VG=${opt_disk_vg:-pvl} |
24 |
133 |
25 # LVM lv to use |
134 # LVM lv to use |
26 DISK_NAME=${GUEST_NAME} |
135 DISK_NAME=${opt_disk_lv:-${GUEST_NAME}} |
27 |
136 |
28 # Path to disk block device |
137 # Path to disk block device |
29 DISK_PATH=/dev/mapper/${DISK_VG}-${DISK_NAME} |
138 DISK_PATH=/dev/mapper/${DISK_VG}-${DISK_NAME} |
30 DISK_BUS=virtio |
139 DISK_BUS=${opt_disk_bus:-virtio} |
31 GUEST_DISK=/dev/vda |
140 GUEST_DISK=${opt_guest_disk:-/dev/vda} |
32 |
141 |
33 ## Network |
142 ## Network |
34 NET_HOSTNAME=${GUEST_NAME} |
143 NET_HOSTNAME=${opt_hostname:-${GUEST_NAME}} |
35 NET_BRIDGE=br-lan |
144 NET_BRIDGE=${opt_bridge:-br-lan} |
36 NET_IPADDR=194.197.235.36 |
145 NET_IPADDR=${opt_ip:-194.197.235.36} |
37 |
146 |
38 ## Installation image |
147 ## Installation image |
39 # Original Debian Installer image (iso) |
148 # Original Debian Installer image (iso) |
40 INSTALLER_NAME="debian-6.0.3-amd64" |
149 INSTALLER_NAME="debian-6.0.3-amd64" |
41 INSTALLER_ISO="iso-in/${INSTALLER_NAME}-netinst.iso" |
150 INSTALLER_ISO="iso-in/${INSTALLER_NAME}-netinst.iso" |
48 # Customized image content |
157 # Customized image content |
49 INSTALL_TREE="images/${INSTALL_NAME}" |
158 INSTALL_TREE="images/${INSTALL_NAME}" |
50 INSTALL_ISO="iso-out/${INSTALL_NAME}.iso" |
159 INSTALL_ISO="iso-out/${INSTALL_NAME}.iso" |
51 |
160 |
52 # Preseed output file in install tree |
161 # Preseed output file in install tree |
53 INSTALL_PRESEED_NAME="preseed.cfg" |
|
54 INSTALL_PRESEED_FILE="${INSTALL_TREE}/${INSTALL_PRESEED_NAME}" |
|
55 INSTALL_PRESEED_CHECKSUM= # set later |
|
56 |
162 |
57 # Preseed source template |
163 # Preseed source template |
58 PRESEED_TEMPLATE="preseed/preseed.cfg" |
164 PRESEED_NAME="preseed.cfg" |
|
165 PRESEED_TEMPLATE="preseed/${PRESEED_NAME}" |
|
166 PRESEED_FILE="${INSTALL_TREE}/${PRESEED_NAME}" |
59 PRESEED_ISOLINUX="preseed/isolinux.cfg" |
167 PRESEED_ISOLINUX="preseed/isolinux.cfg" |
60 PRESEED_INCLUDES=("preseed/passwords.cfg" "preseed/host.cfg") |
168 PRESEED_INCLUDES=("preseed/passwords.cfg" "preseed/host.cfg") |
|
169 |
|
170 PRESEED_CHECKSUM= # set later |
61 |
171 |
62 ## External progs |
172 ## External progs |
63 # Bootable .iso for Debian isolinux-based installer CDs |
173 # Bootable .iso for Debian isolinux-based installer CDs |
64 GENISOIMAGE=/usr/bin/genisoimage |
174 GENISOIMAGE=/usr/bin/genisoimage |
65 GENISOIMAGE_OPTS="-r -J -no-emul-boot -boot-load-size 4 -boot-info-table -b isolinux/isolinux.bin -c isolinux/boot.cat" |
175 GENISOIMAGE_OPTS="-r -J -no-emul-boot -boot-load-size 4 -boot-info-table -b isolinux/isolinux.bin -c isolinux/boot.cat" |
83 |
193 |
84 ## SELinux? |
194 ## SELinux? |
85 #SEMANAGE=/usr/sbin/semanage |
195 #SEMANAGE=/usr/sbin/semanage |
86 #RESTORECON=/sbin/restorecon |
196 #RESTORECON=/sbin/restorecon |
87 |
197 |
88 ### Functions |
198 ### Prepare |
89 set -u |
199 cat <<END |
90 set -e |
200 Guest: |
91 |
201 Name: $GUEST_NAME |
92 scripts=$(dirname $0)/scripts |
202 CPUs: $GUEST_VCPUS |
93 . $scripts/lib.sh |
203 RAM: $GUEST_RAM |
|
204 OS: $GUEST_OS_VARIANT |
|
205 |
|
206 Disk: $GUEST_DISK |
|
207 |
|
208 Disk: |
|
209 Method: LVM |
|
210 Size: $DISK_SIZE |
|
211 LVM: |
|
212 VG: $DISK_VG |
|
213 LV: $DISK_NAME |
|
214 |
|
215 Path: $DISK_PATH |
|
216 Bus: $DISK_BUS |
|
217 |
|
218 Net: |
|
219 Hostname: $NET_HOSTNAME |
|
220 Method: Bridge |
|
221 IP: $NET_IPADDR |
|
222 |
|
223 Bridge: |
|
224 Name: $NET_BRIDGE |
|
225 |
|
226 Installer: |
|
227 Name: $INSTALLER_NAME |
|
228 ISO: $INSTALLER_ISO |
|
229 Tree: $INSTALLER_TREE |
|
230 |
|
231 Install: |
|
232 Name: $INSTALL_NAME |
|
233 Tree: $INSTALL_TREE |
|
234 ISO: $INSTALL_ISO |
|
235 |
|
236 Preseed: |
|
237 Name: $PRESEED_NAME |
|
238 Template: $PRESEED_TEMPLATE |
|
239 Target: $PRESEED_FILE |
|
240 Isolinux: $PRESEED_ISOLINUX |
|
241 Includes: $PRESEED_INCLUDES |
|
242 |
|
243 END |
|
244 |
|
245 |
|
246 [ $TESTING ] && exit 0 |
94 |
247 |
95 ### Check |
248 ### Check |
96 # VM exists? |
249 # VM exists? |
97 if cmd virsh domid ${GUEST_NAME} 2> /dev/null; then |
250 if cmd virsh domid ${GUEST_NAME} 2> /dev/null; then |
98 die "Virtual machine already exists: ${GUEST_NAME}" |
251 die "Virtual machine already exists: ${GUEST_NAME}" |
101 # Installer exists? |
254 # Installer exists? |
102 if cmd test ! -f ${INSTALLER_ISO}; then |
255 if cmd test ! -f ${INSTALLER_ISO}; then |
103 die "Installer not found: ${INSTALLER_ISO}" |
256 die "Installer not found: ${INSTALLER_ISO}" |
104 fi |
257 fi |
105 |
258 |
106 ### Go! |
259 ### Prepare install |
107 # Extract .iso |
260 ## Extract .iso |
108 if [ -f ${INSTALLER_FLAG} ]; then |
261 if [ -f ${INSTALLER_FLAG} ]; then |
109 echo "Installer already unpacked: ${INSTALLER_TREE}" |
262 log_info "Installer already unpacked: ${INSTALLER_TREE}" |
110 |
263 |
111 else |
264 else |
112 echo "Unpacking installer: ${INSTALLER_ISO}" |
265 log_info "Unpacking installer: ${INSTALLER_ISO}" |
113 cmd extract_iso ${INSTALLER_ISO} ${INSTALLER_TREE} |
266 cmd extract_iso ${INSTALLER_ISO} ${INSTALLER_TREE} |
114 cmd touch ${INSTALLER_FLAG} |
267 cmd touch ${INSTALLER_FLAG} |
115 fi |
268 fi |
116 |
269 |
117 # Copy to customized tree |
270 # Copy to customized tree |
118 cmd cp -r ${INSTALLER_TREE} ${INSTALL_TREE} |
271 cmd cp -r ${INSTALLER_TREE} ${INSTALL_TREE} |
119 cmd chmod -R u=rwX,og=rX ${INSTALL_TREE} |
272 cmd chmod -R u=rwX,og=rX ${INSTALL_TREE} |
120 |
273 |
121 # XXX: Customize preseed |
274 log_info "Installer extracted: $INSTALL_TREE" |
122 cmd expand_template ${PRESEED_TEMPLATE} ${INSTALL_PRESEED_FILE} |
275 |
|
276 ## Customize preseed |
|
277 cmd expand_template ${PRESEED_TEMPLATE} ${PRESEED_FILE} |
123 |
278 |
124 # md5sum |
279 # md5sum |
125 INSTALL_PRESEED_CHECKSUM=$(my_md5sum $INSTALL_PRESEED_FILE) |
280 PRESEED_CHECKSUM=$(my_md5sum $PRESEED_FILE) |
126 |
281 |
127 # Isolinux .cfg |
282 # Isolinux .cfg |
128 cmd expand_template ${PRESEED_ISOLINUX} ${INSTALL_TREE}/isolinux/isolinux.cfg |
283 cmd expand_template ${PRESEED_ISOLINUX} ${INSTALL_TREE}/isolinux/isolinux.cfg |
129 |
284 |
130 # Others |
285 # Others |
132 name=$(basename $file) |
287 name=$(basename $file) |
133 |
288 |
134 cmd expand_template $file ${INSTALL_TREE}/${name} |
289 cmd expand_template $file ${INSTALL_TREE}/${name} |
135 done |
290 done |
136 |
291 |
137 # Create .iso |
292 log_info "Preseed generated: $PRESEED_FILE" |
|
293 |
|
294 ## Create .iso |
138 [ -f ${INSTALL_ISO} ] && cmd rm -f ${INSTALL_ISO} |
295 [ -f ${INSTALL_ISO} ] && cmd rm -f ${INSTALL_ISO} |
139 cmd ${GENISOIMAGE} -o ${INSTALL_ISO} ${GENISOIMAGE_OPTS} ${INSTALL_TREE} |
296 |
140 |
297 # generates a lot of output |
141 [ $_ACK ] && read -p "Continue..." |
298 cmd ${GENISOIMAGE} -o ${INSTALL_ISO} -quiet ${GENISOIMAGE_OPTS} ${INSTALL_TREE} |
142 |
299 |
143 ## LVM |
300 log_info "Install ISO generated: $INSTALL_ISO" |
144 # Create LV (unless it already exists) |
301 |
145 [ -e $DISK_PATH ] || cmd sudo $LVM lvcreate -L $DISK_SIZE -n $DISK_NAME $DISK_VG |
302 ### Create virtual machine |
146 |
303 if [ $DO_VIRTINSTALL ]; then |
147 ## SELinux? |
304 ## Disk |
148 #$SEMANAGE fcontext -a -t virt_image_t $DISK |
305 # Create LV (unless it already exists) |
149 #$RESTORECON -v $DISK |
306 [ -e $DISK_PATH ] || cmd_confirm sudo $LVM lvcreate -L $DISK_SIZE -n $DISK_NAME $DISK_VG |
150 |
307 |
151 ## virt-install |
308 ## SELinux? |
152 cmd $VIRT_INSTALL \ |
309 #$SEMANAGE fcontext -a -t virt_image_t $DISK |
153 --connect $LIBVIRT \ |
310 #$RESTORECON -v $DISK |
154 --name $GUEST_NAME \ |
311 |
155 --ram $(expand_MB $GUEST_RAM) --vcpus $GUEST_VCPUS \ |
312 ## virt-install |
156 --cdrom "$INSTALL_ISO" \ |
313 cmd_confirm $VIRT_INSTALL \ |
157 --os-variant $GUEST_OS_VARIANT \ |
314 --connect $LIBVIRT \ |
158 --disk path=$DISK_PATH,bus=$DISK_BUS \ |
315 --name $GUEST_NAME \ |
159 --network bridge:$NET_BRIDGE \ |
316 --ram $(expand_MB $GUEST_RAM) --vcpus $GUEST_VCPUS \ |
160 --vnc \ |
317 --cdrom "$INSTALL_ISO" \ |
161 --virt-type $LIBVIRT_TYPE \ |
318 --os-variant $GUEST_OS_VARIANT \ |
162 --accelerate --hvm \ |
319 --disk path=$DISK_PATH,bus=$DISK_BUS \ |
163 --serial pty |
320 --network bridge:$NET_BRIDGE \ |
164 |
321 --vnc \ |
|
322 --virt-type $LIBVIRT_TYPE \ |
|
323 --accelerate --hvm \ |
|
324 --serial pty |
|
325 fi |
|
326 |