blob: 8a68a4402152712103cc287912d1fe6c85455380 [file] [log] [blame]
#!/bin/bash
# Copyright 1999-2006 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$
# Author: Karl Trygve Kalleberg <karltk@gentoo.org>
# Rewritten from the old, Perl-based emerge-webrsync script
type portageq > /dev/null || exit $?
eval $(portageq envvar -v FEATURES FETCHCOMMAND GENTOO_MIRRORS \
PORTAGE_BIN_PATH PORTAGE_INST_UID PORTAGE_INST_GID PORTAGE_NICENESS \
PORTAGE_TMPDIR PORTDIR PORTAGE_RSYNC_EXTRA_OPTS http_proxy ftp_proxy)
DISTDIR="${PORTAGE_TMPDIR}/emerge-webrsync"
export http_proxy ftp_proxy
# If PORTAGE_NICENESS is overriden via the env then it will
# still pass through the portageq call and override properly.
if [ -n "${PORTAGE_NICENESS}" ]; then
renice $PORTAGE_NICENESS $$ > /dev/null
fi
source "${PORTAGE_BIN_PATH}"/isolated-functions.sh || exit 1
if [ ! -d $DISTDIR ] ; then
mkdir -p $DISTDIR
fi
cd "$DISTDIR"
found=0
if [ "$1" == "-v" ] ; then
wgetops=
else
#this sucks. probably better to do 1> /dev/null
#that said, waiting on the refactoring.
if [ "${FETCHCOMMAND/wget}" != "${FETCHCOMMAND}" ]; then
wgetops="-q"
elif [ "${FETCHCOMMAND/curl}" != "${FETCHCOMMAND}" ]; then
wgetops="-s -f"
fi
fi
if type -P md5sum > /dev/null; then
md5_com='md5sum -c "${FILE}.md5sum"'
elif type -P md5 > /dev/null; then
md5_com='[ "$(md5 -q ${FILE})" == "$(cut -d \ -f 1 ${FILE}.md5sum)" ]'
else
echo "warning, unable to do md5 verification of the snapshot!"
echo "no suitable md5/md5sum binary was found!"
md5_com='true'
fi
sync_local() {
echo Syncing local tree...
if type -P tarsync &> /dev/null; then
# tarsync doesn't take numeric uid/gid so we need to convert them.
local inst_user="$(python -c "import pwd; print pwd.getpwuid(int('${PORTAGE_INST_UID:-0}'))[0]")"
local inst_group="$(python -c "import grp; print grp.getgrgid(int('${PORTAGE_INST_GID:-0}'))[0]")"
if ! tarsync "${FILE}" "${PORTDIR}" -v -s 1 -o ${inst_user} -g ${inst_group} -e /distfiles -e /packages -e /local; then
echo "tarsync failed; tarball is corrupt?"
exit 1;
fi
rm "${FILE}"
else
if ! tar jxf $FILE; then
echo "Tar failed to extract the image. Please review the output."
echo "Executed command: tar jxf $FILE"
exit 1
fi
rm -f $FILE
# Make sure user and group file ownership is ${PORTAGE_INST_UID}:${PORTAGE_INST_GID}
chown -R ${PORTAGE_INST_UID:-0}:${PORTAGE_INST_GID:-0} portage
cd portage
rsync -av --progress --stats --delete --delete-after \
--exclude='/distfiles' --exclude='/packages' \
--exclude='/local' ${PORTAGE_RSYNC_EXTRA_OPTS} . "${PORTDIR%%/}"
cd ..
echo "cleaning up"
rm -rf portage
fi
if hasq metadata-transfer ${FEATURES} ; then
echo "transferring metadata/cache"
emerge --metadata
fi
[ -x /etc/portage/bin/post_sync ] && /etc/portage/bin/post_sync
}
echo "Fetching most recent snapshot"
declare -i attempts=0
while (( $attempts < 40 )) ; do
attempts=$(( attempts + 1 ))
# The snapshot for a given day is generated at 01:45 UTC on the following
# day, so the current day's snapshot (going by UTC time) hasn't been
# generated yet. Therefore, always start by looking for the previous day's
# snapshot (for attempts=1, subtract 1 day from the current UTC time).
daysbefore=$(expr $(date -u +"%s") - 86400 \* ${attempts})
if [ "${USERLAND}" = "BSD" ]; then
DATE_ARGS="-r ${daysbefore}"
else
DATE_ARGS="-d @${daysbefore}"
fi
day=$(date ${DATE_ARGS} -u +"%d")
month=$(date ${DATE_ARGS} -u +"%m")
year=$(date ${DATE_ARGS} -u +"%Y")
FILE_ORIG="portage-${year}${month}${day}.tar.bz2"
echo "Attempting to fetch file dated: ${year}${month}${day}"
got_md5=0
if [ ! -e "${FILE_ORIG}.md5sum" ]; then
FILE="${FILE_ORIG}.md5sum"
for i in $GENTOO_MIRRORS ; do
URI="${i}/snapshots/${FILE}"
if (eval "$FETCHCOMMAND $wgetops") && [ -s "${FILE}" ]; then
got_md5=1
break
fi
done
else
got_md5=1
fi
FILE="${FILE_ORIG}"
if (($got_md5 == 0 )); then
echo " --- No md5sum present on the mirror. (Not yet available.)"
continue
elif [ -s "${FILE}" ]; then
if eval "$md5_com"; then
echo " === snapshot $FILE is correct, using it"
sync_local
echo
echo " === Snapshot has been sync'd"
echo
exit 0
else
rm $FILE
fi
fi
for i in $GENTOO_MIRRORS ; do
URI="${i}/snapshots/$FILE"
rm -f "$FILE"
if (eval "$FETCHCOMMAND $wgetops") && [ -s "$FILE" ]; then
if ! eval "$md5_com"; then
echo "md5 failed on $FILE"
rm ${FILE}
continue
else
sync_local
echo
echo " *** Completed websync, please now perform a normal rsync if possible."
echo " Update is current as of the of YYYYMMDD: ${year}${month}${day}"
echo
exit 0
fi
fi
done
done
rm -rf portage
exit 1