244 USER_NAME=$USER |
249 USER_NAME=$USER |
245 USER_FULLNAME=$(user_fullname $USER) |
250 USER_FULLNAME=$(user_fullname $USER) |
246 USER_SHADOW=$(user_shadow $USER) |
251 USER_SHADOW=$(user_shadow $USER) |
247 USER_GROUPS=( cdrom sudo adm ) |
252 USER_GROUPS=( cdrom sudo adm ) |
248 |
253 |
249 ## Misc |
|
250 PACKAGE_INCLUDES=( sudo screen vim ) |
|
251 PRESEED_LATE_COMMANDS=( ) |
|
252 PRESEED_LATE_COMMANDS_END=( ) |
|
253 PRESEED_INCLUDES=( 'passwords.cfg' 'host.cfg' ) |
|
254 |
|
255 function preseed_late_commands () { |
|
256 PRESEED_LATE_COMMANDS=( "${PRESEED_LATE_COMMANDS[@]:-}" "$@" ) |
|
257 } |
|
258 |
|
259 # XXX: ordering? |
|
260 function preseed_late_commands_end () { |
|
261 PRESEED_LATE_COMMANDS_END=( "${PRESEED_LATE_COMMANDS_END[@]:-}" "$@" ) |
|
262 } |
|
263 |
|
264 |
|
265 ### Extra |
|
266 ## Puppet |
|
267 if [ $opt_puppet ]; then |
|
268 log_info "Puppetizing preseed" |
|
269 |
|
270 PUPPET_PACKAGES=( puppet ) |
|
271 PUPPET_COMMANDS=( \ |
|
272 # "in-target sed -i 's/START=no/START=yes/' /etc/default/puppet" \ |
|
273 # "echo '[agent]\nserver = ${opt_puppet_master}\n' >> /etc/puppet/puppet.conf" \ |
|
274 ) |
|
275 |
|
276 # XXX: we use files in preseed/files/..., should modularize those |
|
277 |
|
278 PUPPET_MASTER="${opt_puppet_master}" |
|
279 |
|
280 PACKAGE_INCLUDES=( ${PACKAGE_INCLUDES[@]} ${PUPPET_PACKAGES[@]} ) |
|
281 |
|
282 [ "${PUPPET_COMMANDS[@]:-}" ] && preseed_late_commands "${PUPPET_COMMANDS[@]}" |
|
283 fi |
|
284 |
|
285 ## Configure GRUB, via preseed/files: /etc/default/grub |
|
286 # Kernel commandline/grub terminal |
|
287 # The last console=... for kernel is used as /dev/console, i.e. init output |
|
288 |
|
289 if [ $SERIAL_CONSOLE ]; then |
|
290 BOOT_KERNEL_CONSOLE="console=${SERIAL_CONSOLE} console=tty0" |
|
291 BOOT_GRUB_TERMINAL="console serial" |
|
292 |
|
293 # re-generate grub.cfg |
|
294 preseed_late_commands_end "in-target update-grub" |
|
295 |
|
296 # Configure /etc/inittab for serial console |
|
297 preseed_late_commands "in-target sed -i 's/#T0/T0/' /etc/inittab" |
|
298 else |
|
299 BOOT_KERNEL_CONSOLE="" |
|
300 BOOT_GRUB_TERMINAL="console" |
|
301 fi |
|
302 |
|
303 # Kernel boot args (overrides those generated by installer) - default boot option uses args + args_default |
|
304 BOOT_KERNEL_ARGS_DEFAULT="quiet" |
|
305 BOOT_KERNEL_ARGS="${BOOT_KERNEL_CONSOLE}" |
|
306 |
|
307 |
|
308 ### Installer setup |
254 ### Installer setup |
309 ## Installation image |
255 ## Installation image |
310 # Original Debian Installer image (iso) |
256 # Original Debian Installer image (iso) |
311 INSTALLER_NAME="debian-6.0.3-amd64" |
257 INSTALLER_NAME="debian-6.0.3-amd64" |
312 INSTALLER_ISO="iso-in/${INSTALLER_NAME}-netinst.iso" |
258 INSTALLER_ISO="iso-in/${INSTALLER_NAME}-netinst.iso" |
318 |
264 |
319 # Customized image content |
265 # Customized image content |
320 INSTALL_TREE="images/${INSTALL_NAME}" |
266 INSTALL_TREE="images/${INSTALL_NAME}" |
321 INSTALL_ISO="iso-out/${INSTALL_NAME}.iso" |
267 INSTALL_ISO="iso-out/${INSTALL_NAME}.iso" |
322 |
268 |
323 ## Preseed files |
269 |
|
270 ### Preseed setup |
|
271 ## preseed.cfg templating |
|
272 PRESEED_SOURCE_DIR="preseed" |
|
273 |
324 # Preseed output file in install tree |
274 # Preseed output file in install tree |
325 PRESEED_NAME="preseed.cfg" |
275 PRESEED_NAME="preseed.cfg" |
326 |
|
327 # Directory containing our source templates |
|
328 PRESEED_SOURCE_DIR="preseed" |
|
329 |
276 |
330 # Mount path of preseed target in installer |
277 # Mount path of preseed target in installer |
331 PRESEED_MOUNT="/cdrom" |
278 PRESEED_MOUNT="/cdrom" |
332 |
279 |
333 # Prefix for target files in install tree |
280 # Prefix for target files in install tree |
341 PRESEED_FILE="${INSTALL_TREE}/${PRESEED_NAME}" |
288 PRESEED_FILE="${INSTALL_TREE}/${PRESEED_NAME}" |
342 |
289 |
343 # Checksum of target preseed.cfg |
290 # Checksum of target preseed.cfg |
344 PRESEED_CHECKSUM= # set later |
291 PRESEED_CHECKSUM= # set later |
345 |
292 |
346 ## Configs |
293 |
347 |
294 ## preseed.cfg contents |
|
295 # List of additional packages to install |
|
296 PRESEED_PACKAGES=( sudo screen vim ) |
|
297 |
|
298 # Script commands to execute |
|
299 PRESEED_LATE_COMMANDS=( ) |
|
300 PRESEED_LATE_COMMANDS_END=( ) |
|
301 |
|
302 # Chainload preseed files |
|
303 PRESEED_INCLUDES=( 'passwords.cfg' 'host.cfg' ) |
|
304 |
|
305 # Add packages to preseed install |
|
306 function preseed_packages () { |
|
307 PRESEED_PACKAGES=( ${PRESEED_PACKAGES[@]} "$@" ) |
|
308 } |
|
309 |
|
310 # Add command to execute |
|
311 function preseed_late_commands () { |
|
312 PRESEED_LATE_COMMANDS=( "${PRESEED_LATE_COMMANDS[@]:-}" "$@" ) |
|
313 } |
|
314 |
|
315 # Add command to execute at end |
|
316 # XXX: ordering? |
|
317 function preseed_late_commands_end () { |
|
318 PRESEED_LATE_COMMANDS_END=( "${PRESEED_LATE_COMMANDS_END[@]:-}" "$@" ) |
|
319 } |
|
320 |
|
321 |
|
322 ## preseed-files |
348 # template source |
323 # template source |
349 CONF_FILES_SOURCE='preseed/files' |
324 CONF_FILES_SOURCE='preseed/files' |
350 |
325 |
351 # template output into install tree |
326 # template output into install tree |
352 CONF_FILES_TARGET_NAME='preseed-files' |
327 CONF_FILES_TARGET_NAME='preseed-files' |
353 CONF_FILES_TARGET="${INSTALL_TREE}/${CONF_FILES_TARGET_NAME}" |
328 CONF_FILES_TARGET="${INSTALL_TREE}/${CONF_FILES_TARGET_NAME}" |
354 |
329 |
355 # paths within installer runtime |
330 # paths within installer runtime |
356 CONF_FILES_CP_SRC="${PRESEED_MOUNT}/${CONF_FILES_TARGET_NAME}" |
331 CONF_FILES_CP_SRC="${PRESEED_MOUNT}/${CONF_FILES_TARGET_NAME}" |
357 CONF_FILES_CP_DST='/target' |
332 CONF_FILES_CP_DST='/target' |
|
333 |
|
334 # Add a file to install in preseed, without templating |
|
335 # preseed_file <src> <dst>/ |
|
336 # if dst is a dir, it must end in / |
|
337 function preseed_file () { |
|
338 local src=$1 |
|
339 local dst=$2 |
|
340 local dir=$(dirname $dst) |
|
341 local tgt=${CONF_FILES_TARGET} |
|
342 |
|
343 local tgt_dir="$tgt/$dir" |
|
344 |
|
345 if [ ! -d "$tgt_dir" ]; then |
|
346 cmd mkdir -p "$tgt_dir" |
|
347 fi |
|
348 |
|
349 cmd cp "$src" "$tgt/$dst" |
|
350 } |
|
351 |
|
352 ### Extra |
|
353 ## Puppet |
|
354 PUPPET= |
|
355 |
|
356 if [ $opt_puppet ]; then |
|
357 log_info "Puppetizing preseed" |
|
358 PUPPET=yes |
|
359 |
|
360 # install package |
|
361 preseed_packages puppet |
|
362 |
|
363 ## Vars for preseed-files |
|
364 # hostname for puppetmaster (server) |
|
365 PUPPET_MASTER="${opt_puppet_master}" |
|
366 |
|
367 # path ssl data (ssldir) |
|
368 PUPPET_SSLDIR=/etc/puppet/ssl |
|
369 fi |
|
370 |
|
371 # Invoked during image-customizing process |
|
372 function puppet_config () { |
|
373 ## Preseed ssl certs? |
|
374 PUPPET_SOURCE_SSLDIR="${PRESEED_SOURCE_DIR}/puppet/ssl" |
|
375 |
|
376 # copy file to preseed if exists |
|
377 function puppet_preseed_ssl_file () { |
|
378 local name=$1 |
|
379 |
|
380 local src=${PUPPET_SOURCE_SSLDIR}/$name |
|
381 local dst=${PUPPET_SSLDIR}/$name |
|
382 |
|
383 if [ -f $src ]; then |
|
384 log_info "puppet: preseed ssl data: $name" |
|
385 |
|
386 cmd preseed_file $src $dst |
|
387 else |
|
388 log_debug "puppet: skip ssl preseed: $name" |
|
389 fi |
|
390 } |
|
391 |
|
392 # ca.pem |
|
393 puppet_preseed_ssl_file certs/ca.pem |
|
394 |
|
395 # guest cert/pkey |
|
396 puppet_preseed_ssl_file certs/${FQDN}.pem |
|
397 puppet_preseed_ssl_file private_keys/${FQDN}.pem |
|
398 } |
|
399 |
|
400 ## Configure GRUB, via preseed/files: /etc/default/grub |
|
401 # Kernel commandline/grub terminal |
|
402 # The last console=... for kernel is used as /dev/console, i.e. init output |
|
403 |
|
404 if [ $SERIAL_CONSOLE ]; then |
|
405 BOOT_KERNEL_CONSOLE="console=${SERIAL_CONSOLE} console=tty0" |
|
406 BOOT_GRUB_TERMINAL="console serial" |
|
407 |
|
408 # re-generate grub.cfg |
|
409 preseed_late_commands_end "in-target update-grub" |
|
410 |
|
411 # Configure /etc/inittab for serial console |
|
412 preseed_late_commands "in-target sed -i 's/#T0/T0/' /etc/inittab" |
|
413 else |
|
414 BOOT_KERNEL_CONSOLE="" |
|
415 BOOT_GRUB_TERMINAL="console" |
|
416 fi |
|
417 |
|
418 # Kernel boot args (overrides those generated by installer) - default boot option uses args + args_default |
|
419 BOOT_KERNEL_ARGS_DEFAULT="quiet" |
|
420 BOOT_KERNEL_ARGS="${BOOT_KERNEL_CONSOLE}" |
|
421 |
|
422 ### Postprocess preseed |
|
423 ## Preseed files |
|
424 ## Preseed / config files |
|
425 |
|
426 |
358 |
427 |
359 # copy at end of install |
428 # copy at end of install |
360 preseed_late_commands "cp -rd -- ${CONF_FILES_CP_SRC}/* ${CONF_FILES_CP_DST}" |
429 preseed_late_commands "cp -rd -- ${CONF_FILES_CP_SRC}/* ${CONF_FILES_CP_DST}" |
361 |
430 |
362 # Additional files to copy |
431 # Additional files to copy |
496 log_info "Unpacking installer: ${INSTALLER_ISO}" |
568 log_info "Unpacking installer: ${INSTALLER_ISO}" |
497 cmd extract_iso ${INSTALLER_ISO} ${INSTALLER_TREE} |
569 cmd extract_iso ${INSTALLER_ISO} ${INSTALLER_TREE} |
498 cmd touch ${INSTALLER_FLAG} |
570 cmd touch ${INSTALLER_FLAG} |
499 fi |
571 fi |
500 |
572 |
501 # Copy to customized tree |
573 ## Copy to customized tree |
502 [ -d ${INSTALL_TREE} ] && cmd rm -r ${INSTALL_TREE} |
574 [ -d ${INSTALL_TREE} ] && cmd rm -r ${INSTALL_TREE} |
503 cmd cp -rd ${INSTALLER_TREE} ${INSTALL_TREE} |
575 cmd cp -rd ${INSTALLER_TREE} ${INSTALL_TREE} |
504 cmd chmod -R u=rwX,og=rX ${INSTALL_TREE} |
576 cmd chmod -R u=rwX,og=rX ${INSTALL_TREE} |
505 |
577 |
506 log_info "Installer extracted: $INSTALL_TREE" |
578 log_info "Installer extracted: $INSTALL_TREE" |
507 |
579 |
508 ## Customize preseed |
580 |
|
581 |
|
582 ### Customize preseed |
|
583 ## preseed.cfg |
509 cmd expand_template ${PRESEED_TEMPLATE} ${PRESEED_FILE} |
584 cmd expand_template ${PRESEED_TEMPLATE} ${PRESEED_FILE} |
510 |
585 |
511 # md5sum |
586 # md5sum |
512 PRESEED_CHECKSUM=$(my_md5sum $PRESEED_FILE) |
587 PRESEED_CHECKSUM=$(my_md5sum $PRESEED_FILE) |
513 |
588 |
514 # Isolinux .cfg |
589 ## Isolinux |
515 cmd expand_template ${PRESEED_ISOLINUX} ${INSTALL_TREE}/isolinux/isolinux.cfg |
590 cmd expand_template ${PRESEED_ISOLINUX} ${INSTALL_TREE}/isolinux/isolinux.cfg |
516 |
591 |
517 # Others |
592 ## Includes |
518 for file in ${PRESEED_INCLUDE_FILES[@]}; do |
593 for file in ${PRESEED_INCLUDE_FILES[@]}; do |
519 name=$(basename $file) |
594 name=$(basename $file) |
520 |
595 |
521 cmd expand_template $file ${INSTALL_TREE}/${name} |
596 cmd expand_template $file ${INSTALL_TREE}/${name} |
522 done |
597 done |
523 |
598 |
524 log_info "Preseed generated: $PRESEED_FILE" |
599 log_info "Preseed generated: $PRESEED_FILE" |
525 |
600 |
526 # Files |
601 ## Config preseed-files |
527 log_info "Copy preseed-files"... |
602 log_info "Copy preseed-files"... |
528 cmd expand_tree ${CONF_FILES_SOURCE} ${CONF_FILES_TARGET} |
603 cmd expand_tree ${CONF_FILES_SOURCE} ${CONF_FILES_TARGET} |
529 |
604 |
530 ## Create .iso |
605 ## Modules |
|
606 # Puppet |
|
607 [ $PUPPET ] && puppet_config |
|
608 |
|
609 |
|
610 |
|
611 |
|
612 |
|
613 ### Create .iso |
531 [ -f ${INSTALL_ISO} ] && cmd rm -f ${INSTALL_ISO} |
614 [ -f ${INSTALL_ISO} ] && cmd rm -f ${INSTALL_ISO} |
532 |
615 |
533 # generates a lot of output |
616 # generates a lot of output |
534 cmd ${GENISOIMAGE} -o ${INSTALL_ISO} -quiet ${GENISOIMAGE_OPTS} ${INSTALL_TREE} |
617 cmd ${GENISOIMAGE} -o ${INSTALL_ISO} -quiet ${GENISOIMAGE_OPTS} ${INSTALL_TREE} |
535 |
618 |
536 log_info "Install ISO generated: $INSTALL_ISO" |
619 log_info "Install ISO generated: $INSTALL_ISO" |
|
620 |
|
621 |
|
622 |
|
623 |
|
624 |
537 |
625 |
538 ### Create virtual machine |
626 ### Create virtual machine |
539 if [ $DO_VIRTINSTALL ]; then |
627 if [ $DO_VIRTINSTALL ]; then |
540 ## Check |
628 ## Check |
541 # VM exists? |
629 # VM exists? |