--- trunk/mlivecdbuild/mlivecdbuild2.sh 2006/03/05 02:18:28 348 +++ trunk/mlivecdbuild/mlivecdbuild2.sh 2009/05/09 12:00:20 863 @@ -1,7 +1,7 @@ #!/bin/bash # some default settings - gets overidden with the profile config -CDPROFILE="$1" +CDPROFILE="$2" [[ -z ${CDPROFILE} ]] && CDPROFILE="default" LIVECDROOT="/mnt/MLIVECDBUILD/${CDPROFILE}" CDCHROOTDIR="${LIVECDROOT}/chroot" @@ -46,12 +46,98 @@ || die "bootstrapping toolchain" } +custom_services() +{ + local cmd="$1" + local services="$2" + + case ${cmd} in + add|del|default) + # add given services from profile + if [[ -n ${services} ]] + then + local i + for i in ${services} + do + MROOT="${CDCHROOTDIR}" rc-config ${cmd} ${i} || die "rc ${cmd} ${i}" + done + fi + ;; + *) die "custom_services: unkown command ${cmd}";; + esac +} + +add_initrc() +{ + local var="$1" + + # sanity checks + [[ -z ${CDCHROOTDIR} ]] && die "\$CDCHROOTDIR not given." + echo "${var}" >> ${CDCHROOTDIR}/.installrc || die "add_initrc() adding \$var" +} + +custom_packages() +{ + local cmd="$1" + local packages="$2" + + case ${cmd} in + install|uninstall) + if [[ -n ${packages} ]] + then + :> ${CDCHROOTDIR}/.installrc + + # respect proxies + [[ -n ${http_proxy} ]] && add_initrc "export http_proxy=${http_proxy}" + [[ -n ${ftp_proxy} ]] && add_initrc "export ftp_proxy=${ftp_proxy}" + [[ -n ${no_proxy} ]] && add_initrc "export no_proxy=${no_proxy}" + + # do not auto-start any services! + add_initrc "export MAGE_BOOTSTRAP=true" + add_initrc 'die() { if [ $? -eq 1 ]; then echo "ERROR: $@"; exit 1; fi; }' + + local i + for i in ${packages} + do + add_initrc "mage ${cmd} ${i} || die ${i}" + done + add_initrc "mage clean" + + # now run the .installrc script + mount -t proc proc ${CDCHROOTDIR}/proc || die "mount proc" + mount -t sysfs sysfs ${CDCHROOTDIR}/sys || die "mount sys" + mount -o bind /dev ${CDCHROOTDIR}/dev || die "mount dev" + chroot ${CDCHROOTDIR} /bin/bash -i /.installrc || die "chr00ting" + umount ${CDCHROOTDIR}/dev || die "umount dev" + umount ${CDCHROOTDIR}/proc || die "umount proc" + umount ${CDCHROOTDIR}/sys || die "umount sys" + [ -f ${CDCHROOTDIR}/.installrc ] && rm ${CDCHROOTDIR}/.installrc + fi + ;; + *) die "custom_packages: unkown command ${cmd}";; + esac +} + +read_config() +{ + local file="$1" + local pkg + + ( cat ${file}; echo ) | while read pkg + do + case "${pkg}" in + \#*|"") continue ;; + esac + echo "${pkg}" + done +} + prepare_iso() { echo Preparing LiveCD ISO Image ... # fixes some issues with xfree/xorg xkb - if [ -L "${CDCHROOTDIR}/etc/X11/xkb" -a -d "/usr/X11R6/lib/X11/xkb" ] + if [[ -L ${CDCHROOTDIR}/etc/X11/xkb ]] && [[ -d /usr/X11R6/lib/X11/xkb ]] then rm ${CDCHROOTDIR}/etc/X11/xkb || die mv ${CDCHROOTDIR}/usr/X11R6/lib/X11/xkb ${CDCHROOTDIR}/etc/X11 || die @@ -62,22 +148,45 @@ install -m 0644 $(get_profile fstab) ${CDCHROOTDIR}/etc/fstab || die install -m 0644 $(get_profile motd) ${CDCHROOTDIR}/etc/motd || die install -m 0644 $(get_profile issue) ${CDCHROOTDIR}/etc/issue || die + install -m 0644 $(get_profile net.eth0) ${CDCHROOTDIR}/etc/conf.d/net.eth0 || die echo "${CDHOSTNAME}" > ${CDCHROOTDIR}/etc/hostname || die echo Setting up services ... - # change mountfs with mountfslivecd - MROOT="${CDCHROOTDIR}" rc-config del mountfs || die "rc del mountfs" - MROOT="${CDCHROOTDIR}" rc-config add mountfslivecd || die "rc add mountfslivecd" - # add hardware detection MROOT="${CDCHROOTDIR}" rc-config add hwdetect || die "rc add hwdetect" # del checkfs MROOT="${CDCHROOTDIR}" rc-config del checkfs || die "rc del checkfs" + # add custom packages + [[ -n ${ADD_PACKAGES} ]] && custom_packages install "${ADD_PACKAGES}" + [ -f $(get_profile add_packages) ] && custom_packages install "$(read_config $(get_profile add_packages))" + + # del custom packages + [[ -n ${DEL_PACKAGES} ]] && custom_packages uninstall "${DEL_PACKAGES}" + [ -f $(get_profile del_packages) ] && custom_packages uninstall "$(read_config $(get_profile del_packages))" + + # add given services from profile + [[ -n ${ADD_SERVICES} ]] && custom_services add "${ADD_SERVICES}" + [ -f $(get_profile add_services) ] && custom_services add "$(read_config $(get_profile add_services))" + + # del given services from profile + [[ -n ${DEL_SERVICES} ]] && custom_services del "${DEL_SERVICES}" + [ -f $(get_profile del_services) ] && custom_services del "$(read_config $(get_profile del_services))" + + # setup default runlevel + [[ -n ${DEFAULT_RUNLEVEL} ]] && custom_services default "${DEFAULT_RUNLEVEL}" + + if [ -f $(get_profile prepare_custom) ] + then + echo Running custom user script ... + source $(get_profile prepare_custom) || die "running custom user script" + fi + echo Cleaning unwanted files ... :> ${CDCHROOTDIR}/etc/mtab || die "whiping /etc/mtab" + [ -f ${CDCHROOTDIR}/root/.bash_history ] && rm ${CDCHROOTDIR}/root/.bash_history } generate_rootfs() @@ -113,7 +222,6 @@ generate_initrd() { local CHROOTSH="$(mktemp -p ${CDCHROOTDIR})" - echo "DEBUG: ${CHROOTSH}" echo Generating initrd image ... echo '#!/bin/bash' > ${CHROOTSH} || die @@ -151,7 +259,7 @@ enter_livecd() { - mount -t sysfs sysfs ${CDCHROOTDIR}/proc + mount -t sysfs sysfs ${CDCHROOTDIR}/sys mount -t proc proc ${CDCHROOTDIR}/proc mount -o bind /dev ${CDCHROOTDIR}/dev @@ -160,15 +268,53 @@ HOME=/root \ TERM=$TERM PS1='\u:\w\$ ' \ PATH=/bin:/usr/bin:/sbin:/usr/sbin \ + http_proxy=${http_proxy} \ + ftp_proxy=${ftp_proxy} \ + no_proxy=${no_proxy} \ /bin/bash -i + + umount ${CDCHROOTDIR}/dev + umount ${CDCHROOTDIR}/proc + umount ${CDCHROOTDIR}/sys +} + +usage() +{ + echo "Usage: $(basename $0) [command] [profile] ..." + echo + echo "Commands:" + echo " bootstrap - bootstraps the rootfs for the livecd" + echo " prepare - prepare the rootfs to run from a livecd" + echo " rootfs - generates the squashfs rootfs image" + echo " initrd - generates a livecd suitable initrd" + echo " bootloader - installs the bootloader" + echo " isogen - generate the final livecd iso image" + echo " all - runs all tasks to get a livecd from zero" + echo " enter - enters the rootfs of a livecd" + echo + echo " for example '$(basename $0) all default'" + echo " creates a livecd using the default profile." + echo } # source profile config - overrides all other vars [ -f ${PROFILES_DIR}/${CDPROFILE}/config ] && . ${PROFILES_DIR}/${CDPROFILE}/config -bootstrap_system -prepare_iso -generate_rootfs -generate_initrd -install_bootloader -generate_iso +case $1 in + bootstrap) bootstrap_system;; + prepare) prepare_iso;; + rootfs) generate_rootfs;; + initrd) generate_initrd;; + bootloader) install_bootloader;; + isogen) generate_iso;; + all) + bootstrap_system + prepare_iso + generate_rootfs + generate_initrd + install_bootloader + generate_iso + ;; + enter) enter_livecd ;; + *|'') usage;; +esac