#!/bin/busybox sh [ -r /etc/rc ] && . /etc/rc [ -r /etc/make.conf ] && . /etc/make.conf [ "$ROOT" = "" ] && ROOT=/ [ "$INDEX_DIR" = "" ] && INDEX_DIR=/dev/shm/ einfo() { echo ">>> ${*}" } eerror() { echo "!!! ${*}" } die() { eerror $* exit 1 } hasq() { local x local me=$1 shift # All the TTY checks really only help out depend. Which is nice. # Logging kills all this anyway. Everything becomes a pipe. --NJ for x in "$@"; do if [ "${x}" = "${me}" ]; then [ "$VERBOSE" = 1 ] && echo $me return 0 fi done return 1 } fetched_package() { echo "fetched_package(${PKGDIR}/All/$1)" [ ! -e "${PKGDIR}/All/$1" ] && return 0 || return 1 } usage() { cat <<__EOF__ -h|--help : This help -d|--debug : set -x -p|--pretend : pretend only -v|--verbose : set verbose flag -f|--fetch : fetch binary files -K|--usepkgonly : use binary package -C|--unmerge : uninstall a binary package --info|info : display info --sync : preform $opt operation --list : update index and list packages --update : update index file --clean : clean up tmpfiles --root= : define ROOT=$ROOT --index= : define INDEX_DIR=$INDEX_DIR --pkgdir= : define PKGDIR=$PKGDIR --tmpdir= : define PORTAGE_TMPDIR=$PORTAGE_TMPDIR --binhost= : define PORTAGE_BINHOST=$PORTAGE_BINHOST __EOF__ } self_setup() { local foo="Try adding it to your /etc/make.conf or exporting it as an environment variable." [ "$PKGDIR" = "" ] && \ die "PKGDIR is not set. $foo" [ "$PORTAGE_BINHOST" = "" ] && \ die "PORTAGE_BINHOST is not set. $foo" [ "$PORTAGE_TMPDIR" = "" ] && \ die "PORTAGE_TMPDIR is not set. $foo" [ -e "${PKGDIR}/All" ] || mkdir -p "${PKGDIR}/All" [ ! -e ${INDEX_DIR}/INDEX ] && export UPDATE=1 } fetch_package() { local pkg=$1 if fetched_package $pkg ; then wget -c -P ${PKGDIR}/All/ ${PORTAGE_BINHOST}/${pkg} [ $? != 0 ] && die "Error fetching ${pkg}" fi } update_index() { if [ "${UPDATE}" = 1 ] ; then wget -O ${INDEX_DIR}/INDEX ${PORTAGE_BINHOST}/INDEX [ $? != 0 ] && \ die "Failed to fetch ${PORTAGE_BINHOST}/INDEX to ${INDEX_DIR}/INDEX" fi } if [ "$1" = "" ];then usage exit 0 fi for opt in "$@" ; do case "${opt}" in -h|--help) usage;exit 0;; -d|--debug) set -x;; -p|--pretend) PRETEND=1;; -v|--verbose) VERBOSE=1;; -f|--fetch) FETCH=1;; -K|--usepkgonly) USEPKG=1; FETCH=1;; -C|--unmerge) REMOVEPKG=1;; --info|info) set;exit 0;; --list) LIST=1;UPDATE=1;; --update) UPDATE=1;; --clean) CLEAN=1;; --root=*) ROOT="$(echo $opt | cut -d = -f 2)";; --pkgdir=*) PKGDIR="$(echo $opt | cut -d = -f 2)";; --binhost=*) PORTAGE_BINHOST="$(echo $opt | cut -d = -f 2)";; --tmpdir=*) PORTAGE_TMPDIR="$(echo $opt | cut -d = -f 2)";; --index=*) INDEX_DIR="$(echo $opt | cut -d = -f 2)";; *) pkgs="${pkgs} $opt";; esac done self_setup file_ext=".tbz2" tar_flags="x" [ "${VERBOSE}" = 1 ] && tar_flags="${tar_flags}v" [ "$file_ext" = ".tbz2" ] && tar_flags="j${tar_flags}" [ "$file_ext" = ".tbz" ] && tar_flags="z${tar_flags}" update_index [ -e "${INDEX_DIR}/INDEX" ] && INDEX_CACHE="$(sort -u ${INDEX_DIR}/INDEX)" || INDEX_CACHE="" if [ "$LIST" = 1 ] ; then for pkg in ${INDEX_CACHE}; do basename $pkg ${file_ext} ; done exit 0 fi if [ "$FETCH" = 1 ]; then for pkg in ${INDEX_CACHE}; do for p in ${pkgs}; do ok=0 this_pkg="$(basename ${pkg} ${file_ext})" if [ "${this_pkg}" = "${p}" ]; then ok=1 else [ "$(echo $this_pkg | cut -d '-' -f 1)" = "${p}" ] && ok=1 fi [ $ok = 1 ] && fetch_package ${pkg} done done fi [ "$USEPKG" = 1 ] && for p in $pkgs; do list="$(ls -1 ${PKGDIR}/All/${p}*${file_ext} 2>/dev/null)" if [ "$list" = "" ]; then eerror "package ${p} not found. try --fetch" else for pkg in ${list}; do P=$(basename $pkg ${file_ext}) IMAGE=${PORTAGE_TMPDIR}/${P} mkdir -p ${IMAGE} einfo "Extracting ${P} to ${IMAGE}" tar ${tar_flags}f ${PKGDIR}/All/$(basename ${pkg}) -C ${IMAGE} # Package cleanup and sstrip executables if nostrip is not set in features hasq noman $FEATURES && rm -fR ${IMAGE}/usr/share/man ${IMAGE}/usr/man hasq nodoc $FEATURES && rm -fR ${IMAGE}/usr/share/doc ${IMAGE}/usr/doc hasq noinfo $FEATURES && rm -fR ${IMAGE}/usr/share/info ${IMAGE}/usr/info for f in ${INSTALL_MASK} ; do # remove dirs if [ -d "${IMAGE}/${f}" ] ; then einfo "Removing dir $f" rm -rf ${IMAGE}/${f} else cruft=$(find ${IMAGE} -name ${f}) if [ "${cruft}" != "" ]; then einfo "Removing [$(echo -n "${cruft}" | tr ' ' '\n' | wc -l)] files matching $f" [ "$VERBOSE" = 1 ] && einfo "rm -rf ${cruft}" rm -rf "${cruft}" fi fi done hasq nostrip $FEATURES || \ ([ -e /usr/bin/sstrip && find ${IMAGE}/ -type f | xargs -n1 /usr/bin/sstrip ) 2> /dev/null cd ${IMAGE} find | xargs -n1 ls -ld | gzip >> ${PORTAGE_TMPDIR}/CONTENTS-${P}.gz cd - einfo $([ "$PRETEND" = 1 ] && echo Pretend) Installing to ${pkg} ${ROOT} gzip -d < ${PORTAGE_TMPDIR}/CONTENTS-${P}.gz if [ "$PRETEND" != 1 ]; then [ "$COUNTDOWN" = "" ] && COUNTDOWN="5 4 3 2 1" for cnt in ${COUNTDOWN}; do echo -ne "[$cnt] " sleep $cnt done cp -a ${IMAGE}/* ${ROOT}/ fi hasq keeptemp $FEATURES || rm -fR ${IMAGE} if hasq distclean $FEATURES; then CLEAN=1 size="$(/bin/ls -lh ${pkg} | /bin/awk '{print $5}')" einfo "Freeing up ${size} by removing ${P}${file_ext}" rm ${pkg} fi done fi done if [ "$CLEAN" = 1 ]; then einfo "Cleaning up." rm -rf ${PORTAGE_TMPDIR}/* fi