#!/bin/bash # Copyright 2010-2011, Asio Software Technologies # Distributed under the terms of the GNU General Public License v2 PROGRESS=/var/run/dispatch-progress # Outputs error message and aborts script execution die() { eerror $1 exit $2 } # Sets progress of dispatch process dispatchProgress() { export DISPATCH_STAGE=$1 echo "DISPATCH_STAGE=$1" > ${PROGRESS} } # Load necessary files . /etc/profile source /etc/init.d/functions.sh # Track progress of the dispatching process [[ -e ${PROGRESS} ]] && source ${PROGRESS} export DISPATCH_STAGE=${DISPATCH_STAGE:-0} # Check if system is dispatched already or if process has been aborted if [ ${DISPATCH_STAGE} -ge 3 ]; then ewarn "Your system has been dispatched already!" ewarn "It is not recommended to re-dispatch." ewarn "Press ENTER to continue or CTRL+C to abort..." read dispatchProgress 0 elif [ ${DISPATCH_STAGE} -gt 0 ]; then einfo "Resuming dispatch at stage #${DISPATCH_STAGE}..." fi # Display warning when user aborts or process gets killed trap 'die "Process killed! This may lead into unexpected problems. Be warned!" 9' ABRT INT KILL QUIT TERM # Check system requirements einfo "The process of dispatching may take a while. Please be patient..." einfo "Checking system requirements..." [[ ! -e /dev/random ]] && die "The /dev directory seems to be not mounted!" [[ ! -e /proc/mounts ]] && die "The /proc directory seems to be not mounted!" ping -c 1 google.com &> /dev/null [[ "$?" -ne "0" ]] && die "There seems to be no Internet connectivity!" # Get necessary variables einfo "Obtaining necessary variables..." export ENV_EXPORTS="GENTOO_MIRRORS PORTDIR DISTDIR PKGDIR PORTAGE_TMPDIR CFLAGS CHOST CXXFLAGS MAKEOPTS ACCEPT_KEYWORDS PROXY HTTP_PROXY FTP_PROXY FEATURES STAGE1_USE" eval $(python -c 'import portage, os, sys; sys.stdout.write("".join(["export %s=\"%s\"; [[ -z \"%s\" ]] || einfo %s=\\\"%s\\\";\n" % (k, portage.settings[k], portage.settings[k], k, portage.settings[k]) for k in os.getenv("ENV_EXPORTS").split()]))') &> /dev/null unset ENV_EXPORTS # Begin stage #0 if [ ${DISPATCH_STAGE} -eq 0 ]; then einfo "Backing up files..." mkdir -p /tmp/regen2-dispatch cp -ap ${PORTDIR}/sys-apps/portage /tmp/regen2-dispatch/ dispatchProgress 1 fi # Begin stage #1 if [ ${DISPATCH_STAGE} -eq 1 ]; then einfo "Generating manifests..." cd ${PORTDIR}/sys-apps/portage find * -maxdepth 0 -type f -name '*.ebuild' | while read FILE; do ebuild ${FILE} manifest &> /dev/null || die "Unable to generate manifest!" 1 done einfo "Installing reGen2 portage..." cd ${PORTDIR}/scripts export CONFIG_PROTECT="-*" export EMERGE_DEFAULT_OPTS="" export FEATURES="${FEATURES} -collision-protect" emerge -1 --nodeps portage &> /dev/null || die "Unable to install sys-apps/portage!" 1 dispatchProgress 2 fi # Begin stage #2 if [ ${DISPATCH_STAGE} -eq 2 ]; then einfo "Testing new portage..." export FEATURES="${FEATURES} mini-manifest" rm -rf ${PORTDIR}/sys-apps/portage cp -ap /tmp/regen2-dispatch/portage ${PORTDIR}/sys-apps/ emerge -1 --nodeps portage &> /dev/null || die "reGen2 portage seems to be broken!" 2 einfo "Regenerating local cache..." rm -rf /var/cache/edb/mtimedb emerge --metadata &> /dev/null || die "Unable to regenerate metadata!" 2 dispatchProgress 3 fi # Begin stage #3 if [ ${DISPATCH_STAGE} -eq 3 ]; then einfo "Dispatching system..." emerge -1 --nodeps baselayout &> /dev/null || die "Unable to emerge baselayout!" 3 emerge -1 --nodeps openrc &> /dev/null || die "Unable to emerge openrc!" 3 dispatchProgress 4 fi # Begin stage #4 if [ ${DISPATCH_STAGE} -eq 4 ]; then einfo "Cleaning up..." rm -rf /tmp/regen2-dispatch einfo "All done!" einfo "Enjoy reGen2!" fi