pkvlm-create
changeset 27 2a5aa20f2651
parent 26 28dd9159f1ad
child 29 3510040c7090
equal deleted inserted replaced
26:28dd9159f1ad 27:2a5aa20f2651
   289 PRESEED_ISOLINUX_FILE="${PRESEED_DIR}/isolinux.cfg"
   289 PRESEED_ISOLINUX_FILE="${PRESEED_DIR}/isolinux.cfg"
   290 
   290 
   291 
   291 
   292 ## Installer tree
   292 ## Installer tree
   293 # Customized preseed image name
   293 # Customized preseed image name
   294 INSTALL_NAME="debian-6.0.3-amd64_${GUEST_NAME}"
   294 INSTALL_NAME="debian-6.0.3-amd64_${NAME}"
   295 
   295 
   296 # Customized image content
   296 # Customized image content
   297 INSTALL_TREE="images/${INSTALL_NAME}"
   297 INSTALL_TREE="images/${INSTALL_NAME}"
   298 INSTALL_ISO="iso/${INSTALL_NAME}.iso"
   298 INSTALL_ISO="iso/${INSTALL_NAME}.iso"
   299 
   299 
   314 INSTALLER_MOUNT="/cdrom"
   314 INSTALLER_MOUNT="/cdrom"
   315 INSTALLER_PRESEED_DIR="${INSTALLER_MOUNT}/${INSTALL_PRESEED_DIR_NAME}"
   315 INSTALLER_PRESEED_DIR="${INSTALLER_MOUNT}/${INSTALL_PRESEED_DIR_NAME}"
   316 INSTALLER_PRESEED_FILE="${INSTALLER_PRESEED_DIR}/${INSTALL_PRESEED_FILE_NAME}"
   316 INSTALLER_PRESEED_FILE="${INSTALLER_PRESEED_DIR}/${INSTALL_PRESEED_FILE_NAME}"
   317 
   317 
   318 
   318 
   319 
   319 ## Stage dir, for generating files for INSTALL_PRESEED
       
   320 STAGE_ROOT="stage"
       
   321 STAGE_DIR="${STAGE_ROOT}/${NAME}"
       
   322 
       
   323 log_info "Stage: prepare stage dir"
       
   324 
       
   325 # root
       
   326 [ ! -d ${STAGE_ROOT} ] && cmd mkdir ${STAGE_ROOT}
       
   327 
       
   328 # host-specific; clean
       
   329 [ -d ${STAGE_DIR} ] && cmd rm -r ${STAGE_DIR}
       
   330 cmd mkdir ${STAGE_DIR}
   320 
   331 
   321 ## preseed.cfg contents
   332 ## preseed.cfg contents
   322 # List of additional packages to install
   333 # List of additional packages to install
   323 PRESEED_PACKAGES=( sudo screen vim )
   334 PRESEED_PACKAGES=( sudo screen vim )
   324 
   335 
   325 # Script commands to execute
   336 # Script commands to execute
   326 PRESEED_LATE_COMMANDS=( )
   337 PRESEED_LATE_COMMANDS=( )
   327 PRESEED_LATE_COMMANDS_END=( )
       
   328 
   338 
   329 # Chainload preseed files
   339 # Chainload preseed files
   330 PRESEED_INCLUDES=( 'passwords.cfg' 'host.cfg' )
   340 PRESEED_INCLUDES=( 'passwords.cfg' 'host.cfg' )
   331 
   341 
   332 # Add packages to preseed install
   342 # Add packages to preseed install
   337 # Add command to execute
   347 # Add command to execute
   338 function preseed_late_commands () {
   348 function preseed_late_commands () {
   339     PRESEED_LATE_COMMANDS=( "${PRESEED_LATE_COMMANDS[@]:-}" "$@" )
   349     PRESEED_LATE_COMMANDS=( "${PRESEED_LATE_COMMANDS[@]:-}" "$@" )
   340 }
   350 }
   341 
   351 
   342 # Add command to execute at end
       
   343 # XXX: ordering?
       
   344 function preseed_late_commands_end () {
       
   345     PRESEED_LATE_COMMANDS_END=( "${PRESEED_LATE_COMMANDS_END[@]:-}" "$@" )
       
   346 }
       
   347 
       
   348 
       
   349 ## preseed-files
   352 ## preseed-files
       
   353 # staged files
       
   354 # name must match with INSTALL_PRESEED_FILES_DIR
       
   355 STAGE_PRESEED_FILES_DIR="${STAGE_DIR}/files"
       
   356 
       
   357 log_info "Stage: prepare preseed-files"
       
   358 cmd mkdir "${STAGE_PRESEED_FILES_DIR}"
       
   359 
   350 # template source trees
   360 # template source trees
   351 PRESEED_FILES_SOURCES=( "${PRESEED_DIR}/files" )
   361 PRESEED_FILES_SOURCES=( "${PRESEED_DIR}/files" )
   352 
   362 
   353 # template output into install tree
   363 # template output into install tree
   354 INSTALL_PRESEED_FILES_DIR_NAME="${INSTALL_PRESEED_DIR_NAME}/files"
   364 INSTALL_PRESEED_FILES_DIR_NAME="${INSTALL_PRESEED_DIR_NAME}/files"
   368 #   if dst is a dir, it must end in /
   378 #   if dst is a dir, it must end in /
   369 function preseed_file () {
   379 function preseed_file () {
   370     local src=$1
   380     local src=$1
   371     local dst=$2
   381     local dst=$2
   372     local dir=$(dirname $dst)
   382     local dir=$(dirname $dst)
   373     local tgt=${PRESEED_FILES_TARGET}
   383     local tgt=${STAGE_PRESEED_FILES_DIR}
   374 
   384 
   375     local tgt_dir="$tgt/$dir"
   385     local tgt_dir="$tgt/$dir"
   376 
   386 
   377     if [ ! -d "$tgt_dir" ]; then
   387     if [ ! -d "$tgt_dir" ]; then
   378         cmd mkdir -p "$tgt_dir"
   388         cmd mkdir -p "$tgt_dir"
   379     fi
   389     fi
   380 
   390 
   381     cmd cp "$src" "$tgt/$dst"
   391     cmd cp "$src" "$tgt/$dst"
   382 }
   392 }
   383 
   393 
       
   394 ## preseed-scripts
       
   395 STAGE_PRESEED_SCRIPTS_DIR="${STAGE_DIR}/scripts"
       
   396 
       
   397 cmd mkdir "${STAGE_PRESEED_SCRIPTS_DIR}"
       
   398 
       
   399 # output into install tree
       
   400 INSTALL_PRESEED_SCRIPTS_DIR_NAME="${INSTALL_PRESEED_DIR_NAME}/scripts"
       
   401 INSTALL_PRESEED_SCRIPTS_DIR="${INSTALL_TREE}/${INSTALL_PRESEED_SCRIPTS_DIR_NAME}"
       
   402 
       
   403 # paths within installer runtime
       
   404 INSTALLER_PRESEED_SCRIPTS_DIR="${INSTALLER_MOUNT}/${INSTALL_PRESEED_SCRIPTS_DIR_NAME}"
       
   405 
       
   406 
       
   407 # add a preseed script to execute, from stdin
       
   408 function preseed_script () {
       
   409     local name=$1
       
   410     local path="${STAGE_PRESEED_SCRIPTS_DIR}/$name"
       
   411     
       
   412     log_debug "preseed script: $name"
       
   413 
       
   414     # header
       
   415     echo '#!/bin/sh' > $path
       
   416 
       
   417     # from stdin
       
   418     cat >> $path
       
   419 
       
   420     chmod +x $path
       
   421 }
       
   422 
   384 ### Extra
   423 ### Extra
   385 ## Puppet
   424 ## Puppet
   386 PUPPET=
       
   387 
       
   388 if [ $opt_puppet ]; then
   425 if [ $opt_puppet ]; then
   389     log_info "Puppetizing preseed"
   426     log_info "Puppetizing preseed"
   390     PUPPET=yes
       
   391     
   427     
   392     PUPPET_PRESEED_DIR="${PRESEED_DIR}/puppet"
   428     PUPPET_PRESEED_DIR="${PRESEED_DIR}/puppet"
   393 
   429 
   394     ## Packages
   430     ## Packages
   395     preseed_packages puppet
   431     preseed_packages puppet
   403    
   439    
   404     ## Preseed files 
   440     ## Preseed files 
   405     # add to list of conf files to copy
   441     # add to list of conf files to copy
   406     preseed_files_sources "${PUPPET_PRESEED_DIR}/files"
   442     preseed_files_sources "${PUPPET_PRESEED_DIR}/files"
   407 
   443 
   408 fi
       
   409 
       
   410 # Invoked during image-customizing process
       
   411 function puppet_config () {
       
   412     ## Preseed ssl certs?
   444     ## Preseed ssl certs?
   413     PUPPET_SOURCE_SSLDIR="${PUPPET_PRESEED_DIR}/ssl"
   445     PUPPET_SOURCE_SSLDIR="${PUPPET_PRESEED_DIR}/ssl"
   414 
   446 
   415     # copy file to preseed if exists
   447     # copy file to preseed if exists
   416     function puppet_preseed_ssl_file () {
   448     function puppet_preseed_ssl_file () {
   432     puppet_preseed_ssl_file certs/ca.pem
   464     puppet_preseed_ssl_file certs/ca.pem
   433 
   465 
   434     # guest cert/pkey
   466     # guest cert/pkey
   435     puppet_preseed_ssl_file certs/${FQDN}.pem
   467     puppet_preseed_ssl_file certs/${FQDN}.pem
   436     puppet_preseed_ssl_file private_keys/${FQDN}.pem
   468     puppet_preseed_ssl_file private_keys/${FQDN}.pem
   437 }
   469 fi
   438 
   470 
   439 ## Configure GRUB, via preseed/files: /etc/default/grub 
   471 ## Configure GRUB, via preseed/files: /etc/default/grub 
   440 # Kernel commandline/grub terminal
   472 # Kernel commandline/grub terminal
   441 # The last console=... for kernel is used as /dev/console, i.e. init output
   473 # The last console=... for kernel is used as /dev/console, i.e. init output
       
   474 log_info "Configure grub / serial console"
   442 
   475 
   443 if [ $SERIAL_CONSOLE ]; then
   476 if [ $SERIAL_CONSOLE ]; then
   444     BOOT_KERNEL_CONSOLE="console=${SERIAL_CONSOLE} console=tty0"
   477     BOOT_KERNEL_CONSOLE="console=${SERIAL_CONSOLE} console=tty0"
   445     BOOT_GRUB_TERMINAL="console serial"
   478     BOOT_GRUB_TERMINAL="console serial"
   446 
   479 
   447     # re-generate grub.cfg
       
   448     preseed_late_commands_end "in-target update-grub"
       
   449 
       
   450     # Configure /etc/inittab for serial console
   480     # Configure /etc/inittab for serial console
   451     preseed_late_commands "in-target sed -i 's/#T0/T0/' /etc/inittab"
   481     preseed_script '11-serial-console' <<END
       
   482         in-target sed -i 's/#T0/T0/' /etc/inittab
       
   483 END
       
   484 
   452 else
   485 else
   453     BOOT_KERNEL_CONSOLE=""
   486     BOOT_KERNEL_CONSOLE=""
   454     BOOT_GRUB_TERMINAL="console"
   487     BOOT_GRUB_TERMINAL="console"
   455 fi
   488 fi
   456 
   489 
       
   490 # re-generate grub.cfg
       
   491 preseed_script '10-boot-grub' <<END
       
   492     in-target update-grub
       
   493 END
       
   494 
   457 # Kernel boot args (overrides those generated by installer) - default boot option uses args + args_default
   495 # Kernel boot args (overrides those generated by installer) - default boot option uses args + args_default
   458 BOOT_KERNEL_ARGS_DEFAULT="quiet"
   496 BOOT_KERNEL_ARGS_DEFAULT="quiet"
   459 BOOT_KERNEL_ARGS="${BOOT_KERNEL_CONSOLE}"
   497 BOOT_KERNEL_ARGS="${BOOT_KERNEL_CONSOLE}"
   460 
   498 
   461 ### Postprocess preseed data
   499 ### Postprocess preseed data
   462 ## Preseed / config files
   500 ## Preseed / config files
   463 
   501 
   464 # copy at end of install
   502 # copy at end of install
   465 preseed_late_commands "cp -rd -- ${INSTALLER_PRESEED_FILES_DIR}/* ${INSTALLER_PRESEED_FILES_TARGET}"
   503 preseed_late_commands "cp -rd -- ${INSTALLER_PRESEED_FILES_DIR}/* ${INSTALLER_PRESEED_FILES_TARGET}"
   466 
   504 
       
   505 ## Preseed / scripts
       
   506 preseed_late_commands "for script in ${INSTALLER_PRESEED_SCRIPTS_DIR}/*; do \$script; done"
       
   507 
   467 ## preseed.cfg
   508 ## preseed.cfg
   468 
   509 
   469 # Additional files to copy
   510 # Additional files to copy
   470 PRESEED_INCLUDE_FILES=( $(for preseed in ${PRESEED_INCLUDES[@]}; do echo "${PRESEED_DIR}/${preseed}"; done) )
   511 PRESEED_INCLUDE_FILES=( $(for preseed in ${PRESEED_INCLUDES[@]}; do echo "${PRESEED_DIR}/${preseed}"; done) )
   471 
   512 
   472 # preseed.cfg 'includes' line
   513 # preseed.cfg 'includes' line
   473 PRESEED_INCLUDE=${PRESEED_INCLUDES[@]}
   514 PRESEED_INCLUDE=${PRESEED_INCLUDES[@]}
   474 
   515 
   475 # preseed command execution
   516 # preseed command execution
   476 PRESEED_LATE_COMMAND=$(for cmd in "${PRESEED_LATE_COMMANDS[@]}" "${PRESEED_LATE_COMMANDS_END[@]:-}"; do if [ "$cmd" ]; then echo -n "$cmd;" $'\\\n    '; fi; done; echo true)
   517 PRESEED_LATE_COMMAND=$(for cmd in "${PRESEED_LATE_COMMANDS[@]}"; do if [ "$cmd" ]; then echo -n "$cmd;" $'\\\n    '; fi; done; echo true)
   477 
   518 
   478 
   519 
   479 ## Isolinux
   520 ## Isolinux
   480 # Automagics for serial boot :)
   521 # Automagics for serial boot :)
   481 #      virt-install assumes we have an X $DISPLAY if given --vnc
   522 #      virt-install assumes we have an X $DISPLAY if given --vnc
   635 done
   676 done
   636 
   677 
   637 ## Expand isolinux
   678 ## Expand isolinux
   638 cmd expand_file ${PRESEED_ISOLINUX_FILE} ${INSTALL_ISOLINUX_FILE}
   679 cmd expand_file ${PRESEED_ISOLINUX_FILE} ${INSTALL_ISOLINUX_FILE}
   639 
   680 
       
   681 log_info "Preseed generated: $INSTALL_PRESEED_DIR"
       
   682 
       
   683 
   640 ## Expand preseed-files
   684 ## Expand preseed-files
   641 log_info "Copy preseed-files..."
   685 log_info "Copy preseed-files..."
   642 
   686 
   643 for tree in "${PRESEED_FILES_SOURCES[@]}"; do
   687 for tree in "${PRESEED_FILES_SOURCES[@]}"; do
   644     log_info "preseed-files: $tree"
   688     log_info "preseed-files: $tree"
   645 
   689 
   646     cmd expand_tree $tree ${INSTALL_PRESEED_FILES_DIR}
   690     cmd expand_tree $tree ${INSTALL_PRESEED_FILES_DIR}
   647 done
   691 done
   648 
   692 
   649 log_info "Preseed generated: $INSTALL_PRESEED_DIR"
   693 # Staged files
   650 
   694 # PRESEED_FILES_DIR must be the same name as INSTALL_PRESEED_FILES_DIR
   651 
   695 cmd cp -rv ${STAGE_PRESEED_FILES_DIR}/ ${INSTALL_PRESEED_DIR}/
   652 
   696 
   653 
   697 # debug?
   654 ## Modules
   698 [ $LOG_DEBUG ] && tree ${INSTALL_PRESEED_FILES_DIR}
   655 # Puppet
   699 
   656 [ $PUPPET ] && puppet_config
   700 
   657 
   701 ## Copy preseed scripts
   658 
   702 log_info "Copy preseed-scripts..."
       
   703 
       
   704 # Staged scripts
       
   705 cmd cp -rv "$STAGE_PRESEED_SCRIPTS_DIR" "$INSTALL_PRESEED_SCRIPTS_DIR"
   659 
   706 
   660 
   707 
   661 ### Create .iso
   708 ### Create .iso
   662 log_info "Generate ISO..."
   709 log_info "Generate ISO..."
   663 
   710