#! /bin/bash # # mklarch # # Author: Michael Towers # # This file is part of the larch project. # # larch is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # larch is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with larch; if not, write to the Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # #---------------------------------------------------------------------------- # 2008.06.22 # directory to use for building the CD - the installation root # It must have LOTS of space, ~ 4GB for a 700MB CD INSTLDIR=/home/larchroot # Default path to larch5 repositories (architecture is sub-directory) larch5path="ftp://ftp.berlios.de/pub/larch/larch5.3" APP=$( basename $0 ) # Get path to larch base directory, via the location of this script FULLPATH=$( readlink -f $0 ) SCRIPTDIR=$( dirname ${FULLPATH} ) LARCHDATA=$( dirname ${SCRIPTDIR} ) startdir=$( pwd ) # cd to ensure that the following test works even if '.' is in PATH cd / apppath="$( which ${APP} 2>/dev/null )" if [ $? -ne 0 ] || [ "${apppath}" != "${FULLPATH}" ]; then PATH=${SCRIPTDIR}:${PATH} fi cd ${startdir} usage () { echo echo "Usage:" echo " ${APP} -h # Show this message" echo echo " ${APP} -a [-f] [-p ]" echo " [-c ]" echo " [-y ]" echo " []" echo echo " ${APP} [-ugf] [-p ]" echo " [-c ]" echo " [-y ]" echo " []" echo echo " -a Stop after installing Arch system (don't build live system)." echo echo " -p Use the 'profile' in the given directory." echo echo " -c Use an alternative package cache directory" echo " (default is /var/cache/pacman/pkg, on host)" echo " -y Use existing pacman package database instead" echo " of performing 'pacman -Sy'." echo echo " -u Don't build iso, but install to USB-stick instead" echo " -g Use GRUB bootloader (default is isolinux/syslinux)" echo echo " -f No interaction. (not recommended)" echo " The script will just plough straight on and destroy" echo " your file-system without first asking." echo echo "${APP} is the master script for the larch live CD / live USB-stick" echo "builder." echo echo " is the directory in which all the building will" echo "be done, by default '${INSTLDIR}'" echo echo "A profile is a directory containing all the necessary" echo "configuration details for a larch build. See documentation" echo "and examples." echo echo "If you want to rebuild a live system without reinstalling it" echo "(for example if you make minor changes to the profile which" echo "don't affect the packages, or if you want a USB-stick instead" echo "of a CD, or if writing to the USB-stick failed for some reason)" echo "you should look at the 'larchify' script - run it with the '-h'" echo "option for usage notes." echo exit } pROFILE="" DONTASK="" NOLIVE="" USB="" GRUB="" PKGCACHE=/var/cache/pacman/pkg # Options to 'inpacs': INPACSO="" while getopts ":p:ac:y:ugf" Option do case ${Option} in p ) PROFILE="$( readlink -f ${OPTARG} )" ;; a ) NOLIVE="-a" ;; c ) PKGCACHE="$( readlink -f ${OPTARG} )" ;; y ) INPACSO="${INPACSO} -y $( readlink -f ${OPTARG} )" ;; u ) USB="-u" ;; g ) GRUB="-g" ;; f ) DONTASK="-f" ;; * ) usage ;; esac done shift $((${OPTIND} - 1)) if ! [ -d "${PKGCACHE}" ]; then echo "Creating package cache: ${PKGCACHE}" if ! mkdir -p "${PKGCACHE}"; then echo "ERROR: Couldn't create ${PKGCACHE}" exit 1 fi fi INPACSO="${INPACSO} -c ${PKGCACHE}" if [ -n "$1" ]; then INSTLDIR=$1 fi LARCHBUILD="${INSTLDIR}/.larch" if [ -z "${PROFILE}" ]; then PROFILE=${startdir}/profile fi if ! [ -f ${PROFILE}/addedpacks ]; then echo "ERROR: no 'addedpacks' in profile '${PROFILE}'" exit 1 fi # test if the script is started by root user. If not, exit if [ $UID -ne 0 ]; then echo "Only root can run ${APP}"; exit 1 fi echo "//" echo "// **********************************************************" echo "// This will delete EVERYTHING under" echo "//" echo "// ${INSTLDIR}" echo "//" if [ -z "${DONTASK}" ]; then echo "// I really mean it ... Are you sure you want to do this?" echo "// **********************************************************" # Await yes or no read -p "// [y/N]: " ans if [ -z "$( echo ${ans} | grep '^ *[yY]' )" ]; then exit 0; fi fi for fd in $( ls -A ${INSTLDIR} ); do rm -rf ${INSTLDIR}/${fd} #lookforme done mkdir -p ${LARCHBUILD} ############### Call 'inpacs' to do the installation if [ -f ${PROFILE}/basepacks ]; then INPACSO="${INPACSO} -b ${PROFILE}/basepacks" fi if [ -f ${PROFILE}/baseveto ]; then INPACSO="${INPACSO} -x ${PROFILE}/baseveto" fi if [ -f ${PROFILE}/pacman.conf ]; then cp ${PROFILE}/pacman.conf . elif ! [ -f pacman.conf ]; then if [ -f /etc/pacman.conf ]; then cp /etc/pacman.conf . else echo "ERROR: Couldn't find pacman.conf" exit 1 fi fi INPACSO="${INPACSO} -k pacman.conf" if [ x = y ] then # If necessary add the larch repository to pacman.conf if ! grep '^[larch5]' pacman.conf &>/dev/null; then if [ -d larchrepo ]; then larch5path="file://$( readlink -f larchrepo )" else sysarch="$( uname -m )" if [ "${sysarch}" != "x86_64" ]; then sysarch="i686" fi larch5path="${larch5path}/${sysarch}" fi #sed "/\[testing\]/ i \ echo "[larch5] " >> pacman.conf echo "Server = ${larch5path}" >> pacman.conf fi fi if ! which pacman &>/dev/null; then if ! [ -x ${startdir}/pacman ]; then echo "ERROR: Couldn't find pacman executable" exit 1 fi INPACSO="${INPACSO} -P ${startdir}/pacman" fi echo "checking for pre_process.sh" if [ -f ${PROFILE}/pre-process.sh ] then echo "Running pre-process script" cd ${PROFILE} ./pre-process.sh cd - else echo "No pre_process" fi inpacs -a ${PROFILE}/addedpacks ${INPACSO} ${INSTLDIR} if [ $? -ne 0 ]; then exit 1; fi # Use build version of pacman.conf in live system, without [larch5] repository. # This can be overwritten by a pacman.conf in the profile's overlay. rm -f ${INSTLDIR}/etc/pacman.conf if [ -f ${PROFILE}/pacman.conf ]; then # This file should be used in preference to pacman.conf - it is created by # larch-setup on non-Arch systems before commenting out the 'Include' lines. cp ${PROFILE}/pacman.conf ${INSTLDIR}/etc/pacman.conf else sed '/^\[larch5\]/,/^ *$/ d' ${INSTLDIR}/etc/pacman.conf fi cachepacs -a ${PROFILE}/cache_packs $INPACSO -d ${INSTLDIR} if [ $? -ne 0 ] then exit 1 fi # Generate glibc locales if [ -f ${PROFILE}/locale.gen ]; then echo echo "********** Generating locales **********" echo cat ${PROFILE}/locale.gen ${INSTLDIR}/etc/locale.gen >${INSTLDIR}/etc/locale.gen_new mv -f ${INSTLDIR}/etc/locale.gen_new ${INSTLDIR}/etc/locale.gen chroot ${INSTLDIR} usr/sbin/locale-gen fi # Generate ssh keys ssh_init ${INSTLDIR} # Set up a symlink to the installation for 'larchify' rm -f larchroot && ln -sf ${INSTLDIR} ${startdir}/larchroot if [ $? -ne 0 ]; then echo "WARNING: Couldn't create 'larchroot' symlink" fi echo "// ${APP} finished installation of Arch system" echo "//" #run script to post-process the new installation if [ -f ${PROFILE}/post-process.sh ] then ${PROFILE}/post-process.sh ${INSTLDIR} ${PROFILE} echo ${PROFILE}/post-process.sh ${INSTLDIR} ${PROFILE} fi if [ -z "${NOLIVE}" ]; then # Get live CD build functions . ${LARCHDATA}/buildlive mklive fi