#!/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