implement preseed-scripts
authorTero Marttila <terom@paivola.fi>
Wed, 01 Feb 2012 15:34:25 +0200
changeset 27 2a5aa20f2651
parent 26 28dd9159f1ad
child 28 b13eae268f5c
implement preseed-scripts
.hgignore
pkvlm-create
--- a/.hgignore	Wed Feb 01 14:35:10 2012 +0200
+++ b/.hgignore	Wed Feb 01 15:34:25 2012 +0200
@@ -1,4 +1,9 @@
 syntax: regexp
 
 \.sw[op]$
-^(images|iso|mnt)/
+^(images|iso|mnt|stage)/
+
+^preseed/puppet/ssl/
+^preseed/passwords.cfg
+
+^misc/
--- a/pkvlm-create	Wed Feb 01 14:35:10 2012 +0200
+++ b/pkvlm-create	Wed Feb 01 15:34:25 2012 +0200
@@ -291,7 +291,7 @@
 
 ## Installer tree
 # Customized preseed image name
-INSTALL_NAME="debian-6.0.3-amd64_${GUEST_NAME}"
+INSTALL_NAME="debian-6.0.3-amd64_${NAME}"
 
 # Customized image content
 INSTALL_TREE="images/${INSTALL_NAME}"
@@ -316,7 +316,18 @@
 INSTALLER_PRESEED_FILE="${INSTALLER_PRESEED_DIR}/${INSTALL_PRESEED_FILE_NAME}"
 
 
+## Stage dir, for generating files for INSTALL_PRESEED
+STAGE_ROOT="stage"
+STAGE_DIR="${STAGE_ROOT}/${NAME}"
 
+log_info "Stage: prepare stage dir"
+
+# root
+[ ! -d ${STAGE_ROOT} ] && cmd mkdir ${STAGE_ROOT}
+
+# host-specific; clean
+[ -d ${STAGE_DIR} ] && cmd rm -r ${STAGE_DIR}
+cmd mkdir ${STAGE_DIR}
 
 ## preseed.cfg contents
 # List of additional packages to install
@@ -324,7 +335,6 @@
 
 # Script commands to execute
 PRESEED_LATE_COMMANDS=( )
-PRESEED_LATE_COMMANDS_END=( )
 
 # Chainload preseed files
 PRESEED_INCLUDES=( 'passwords.cfg' 'host.cfg' )
@@ -339,14 +349,14 @@
     PRESEED_LATE_COMMANDS=( "${PRESEED_LATE_COMMANDS[@]:-}" "$@" )
 }
 
-# Add command to execute at end
-# XXX: ordering?
-function preseed_late_commands_end () {
-    PRESEED_LATE_COMMANDS_END=( "${PRESEED_LATE_COMMANDS_END[@]:-}" "$@" )
-}
+## preseed-files
+# staged files
+# name must match with INSTALL_PRESEED_FILES_DIR
+STAGE_PRESEED_FILES_DIR="${STAGE_DIR}/files"
 
+log_info "Stage: prepare preseed-files"
+cmd mkdir "${STAGE_PRESEED_FILES_DIR}"
 
-## preseed-files
 # template source trees
 PRESEED_FILES_SOURCES=( "${PRESEED_DIR}/files" )
 
@@ -370,7 +380,7 @@
     local src=$1
     local dst=$2
     local dir=$(dirname $dst)
-    local tgt=${PRESEED_FILES_TARGET}
+    local tgt=${STAGE_PRESEED_FILES_DIR}
 
     local tgt_dir="$tgt/$dir"
 
@@ -381,13 +391,39 @@
     cmd cp "$src" "$tgt/$dst"
 }
 
+## preseed-scripts
+STAGE_PRESEED_SCRIPTS_DIR="${STAGE_DIR}/scripts"
+
+cmd mkdir "${STAGE_PRESEED_SCRIPTS_DIR}"
+
+# output into install tree
+INSTALL_PRESEED_SCRIPTS_DIR_NAME="${INSTALL_PRESEED_DIR_NAME}/scripts"
+INSTALL_PRESEED_SCRIPTS_DIR="${INSTALL_TREE}/${INSTALL_PRESEED_SCRIPTS_DIR_NAME}"
+
+# paths within installer runtime
+INSTALLER_PRESEED_SCRIPTS_DIR="${INSTALLER_MOUNT}/${INSTALL_PRESEED_SCRIPTS_DIR_NAME}"
+
+
+# add a preseed script to execute, from stdin
+function preseed_script () {
+    local name=$1
+    local path="${STAGE_PRESEED_SCRIPTS_DIR}/$name"
+    
+    log_debug "preseed script: $name"
+
+    # header
+    echo '#!/bin/sh' > $path
+
+    # from stdin
+    cat >> $path
+
+    chmod +x $path
+}
+
 ### Extra
 ## Puppet
-PUPPET=
-
 if [ $opt_puppet ]; then
     log_info "Puppetizing preseed"
-    PUPPET=yes
     
     PUPPET_PRESEED_DIR="${PRESEED_DIR}/puppet"
 
@@ -405,10 +441,6 @@
     # add to list of conf files to copy
     preseed_files_sources "${PUPPET_PRESEED_DIR}/files"
 
-fi
-
-# Invoked during image-customizing process
-function puppet_config () {
     ## Preseed ssl certs?
     PUPPET_SOURCE_SSLDIR="${PUPPET_PRESEED_DIR}/ssl"
 
@@ -434,26 +466,32 @@
     # guest cert/pkey
     puppet_preseed_ssl_file certs/${FQDN}.pem
     puppet_preseed_ssl_file private_keys/${FQDN}.pem
-}
+fi
 
 ## Configure GRUB, via preseed/files: /etc/default/grub 
 # Kernel commandline/grub terminal
 # The last console=... for kernel is used as /dev/console, i.e. init output
+log_info "Configure grub / serial console"
 
 if [ $SERIAL_CONSOLE ]; then
     BOOT_KERNEL_CONSOLE="console=${SERIAL_CONSOLE} console=tty0"
     BOOT_GRUB_TERMINAL="console serial"
 
-    # re-generate grub.cfg
-    preseed_late_commands_end "in-target update-grub"
+    # Configure /etc/inittab for serial console
+    preseed_script '11-serial-console' <<END
+        in-target sed -i 's/#T0/T0/' /etc/inittab
+END
 
-    # Configure /etc/inittab for serial console
-    preseed_late_commands "in-target sed -i 's/#T0/T0/' /etc/inittab"
 else
     BOOT_KERNEL_CONSOLE=""
     BOOT_GRUB_TERMINAL="console"
 fi
 
+# re-generate grub.cfg
+preseed_script '10-boot-grub' <<END
+    in-target update-grub
+END
+
 # Kernel boot args (overrides those generated by installer) - default boot option uses args + args_default
 BOOT_KERNEL_ARGS_DEFAULT="quiet"
 BOOT_KERNEL_ARGS="${BOOT_KERNEL_CONSOLE}"
@@ -464,6 +502,9 @@
 # copy at end of install
 preseed_late_commands "cp -rd -- ${INSTALLER_PRESEED_FILES_DIR}/* ${INSTALLER_PRESEED_FILES_TARGET}"
 
+## Preseed / scripts
+preseed_late_commands "for script in ${INSTALLER_PRESEED_SCRIPTS_DIR}/*; do \$script; done"
+
 ## preseed.cfg
 
 # Additional files to copy
@@ -473,7 +514,7 @@
 PRESEED_INCLUDE=${PRESEED_INCLUDES[@]}
 
 # preseed command execution
-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)
+PRESEED_LATE_COMMAND=$(for cmd in "${PRESEED_LATE_COMMANDS[@]}"; do if [ "$cmd" ]; then echo -n "$cmd;" $'\\\n    '; fi; done; echo true)
 
 
 ## Isolinux
@@ -637,6 +678,9 @@
 ## Expand isolinux
 cmd expand_file ${PRESEED_ISOLINUX_FILE} ${INSTALL_ISOLINUX_FILE}
 
+log_info "Preseed generated: $INSTALL_PRESEED_DIR"
+
+
 ## Expand preseed-files
 log_info "Copy preseed-files..."
 
@@ -646,16 +690,19 @@
     cmd expand_tree $tree ${INSTALL_PRESEED_FILES_DIR}
 done
 
-log_info "Preseed generated: $INSTALL_PRESEED_DIR"
+# Staged files
+# PRESEED_FILES_DIR must be the same name as INSTALL_PRESEED_FILES_DIR
+cmd cp -rv ${STAGE_PRESEED_FILES_DIR}/ ${INSTALL_PRESEED_DIR}/
 
-
+# debug?
+[ $LOG_DEBUG ] && tree ${INSTALL_PRESEED_FILES_DIR}
 
 
-## Modules
-# Puppet
-[ $PUPPET ] && puppet_config
+## Copy preseed scripts
+log_info "Copy preseed-scripts..."
 
-
+# Staged scripts
+cmd cp -rv "$STAGE_PRESEED_SCRIPTS_DIR" "$INSTALL_PRESEED_SCRIPTS_DIR"
 
 
 ### Create .iso