#!/bin/bash GS_SYNC=true GS_RSYNC=false GS_EUPDATEDB=true GS_FETCH=false GS_UPWORLD=true GS_LAYMAN=true GS_DEBUG=false GS_USER="portage" conf="/etc/gentoo-sync.conf" [[ -e ${conf} ]] && . "${conf}" logdir="/var/log" sync_log="${logdir}/rsync.log" up_log="${logdir}/emerge-updates.log" bootstrap() { local prog=$(realpath "$0") if [[ "${FLOCKER}" != "${prog}" ]] ; then exec env -uUNSHARE FLOCKER="${prog}" flock -en "${prog}" "${prog}" "$@" fi if [[ -z ${UNSHARE} ]] ; then if [[ $(id -u) -ne 0 ]] ; then exec sudo env -uUNSHARE FLOCKER="${FLOCKER}" HOME="$HOME" "${prog}" "$@" fi touch "${sync_log}" "${up_log}" chown "${GS_USER}" "${sync_log}" "${up_log}" mount_args= if type -P unshare >&/dev/null ; then test_arg() { unshare "$@" -- true >&/dev/null && uargs+=( "$@" ) || :; } uargs=( -m ) test_arg -u test_arg -i test_arg -p -f --mount-proc test_arg --propagation=private exec unshare "${uargs[@]}" -- \ sudo -u "${GS_USER}" UNSHARE="true" FLOCKER="${FLOCKER}" \ "${prog}" "$@" fi else mount_args='-n' fi unset UNSHARE } bootstrap "$@" usage() { cat <<-EOF Usage: ${0##*/} [options] Options: -h, --help -a, --all, -na, --noall -s, --sync, -ns, --nosync ${GS_SYNC} -r, --rsync, -nr, --norsync ${GS_RSYNC} -d, --database, -nd, --nodatabase ${GS_EUPDATEDB} -f, --fetch, -nf, --nofetch ${GS_FETCH} -w, --world, -nw, --noworld ${GS_UPWORLD} -l, --layman, -nl, --nolayman ${GS_LAYMAN} -x, --debug, -nx, --nodebug ${GS_DEBUG} EOF exit 0 } s() { local x val=$1 shift for x ; do eval GS_${x}=${val}; done } for x ; do case ${x} in -h|--help) usage;; -a|--all) s true SYNC RSYNC EUPDATEDB FETCH UPWORLD LAYMAN DEBUG;; -na|--noall) s false SYNC RSYNC EUPDATEDB FETCH UPWORLD LAYMAN DEBUG;; -s|--sync) s true SYNC;; -ns|--nosync) s false SYNC;; -r|--rsync) s true RSYNC;; -nr|--norsync) s false RSYNC;; -d|--database) s true EUPDATEDB;; -nd|--nodatabase) s false EUPDATEDB;; -f|--fetch) s true FETCH;; -nf|--nofetch) s false FETCH;; -w|--world) s true UPWORLD;; -nw|--noworld) s false UPWORLD;; -l|--layman) s true LAYMAN;; -nl|--nolayman) s false LAYMAN;; -x|--debug) s true DEBUG;; -nx|--nodebug) s false DEBUG;; *) usage;; esac done run() { echo "+ $*" "$@" } if ${GS_DEBUG} ; then set -x run() { "$@" ; } fi export NOCOLOR=true ( id date if ${GS_RSYNC} ; then # For slow systems, run rsync directly. for f in make.globals make.conf ; do for d in /etc /etc/portage /usr/share/portage/config ; do f="${d}/make.globals" [[ -e ${f} ]] && . ${f} && break done done > "${up_log}" : ${PORTAGE_RSYNC_OPTS:=-azO --delete --exclude=/distfiles --exclude=/local --exclude=/packages} : ${SYNC:=rsync://rsync.gentoo.org/gentoo-portage} : ${PORTDIR:=/usr/portage} exec rsync ${PORTAGE_RSYNC_OPTS} ${PORTAGE_RSYNC_EXTRA_OPTS} ${SYNC}/ ${PORTDIR}/ >& "${sync_log}" fi if ${GS_SYNC} ; then run emerge --sync -q date ${GS_EUPDATEDB} && run $(type -P eupdatedb) date ${GS_LAYMAN} && l=$(type -P layman) && run ${l} -S -q date ${GS_FETCH} && run emerge world -Duf #date #q -qr fi date ) >& ${sync_log} if ${GS_UPWORLD} ; then ( repos=( $(portageq repositories_configuration / | awk '$1 == "location" { $1 = $2 = ""; print }') ) bad_pkgs=() good_pkgs=() for p in `qlist -ICS` ; do good=false for repo in ${repos[@]} ; do if [[ -d ${repo}/${p%:*} ]] ; then good=true break fi done if ${good} ; then good_pkgs+=( ${p} ) else bad_pkgs+=( ${p} ) fi done if [[ ${#bad_pkgs[@]} -gt 0 ]] ; then echo 'These packages no longer exist:' printf '\t%s\n' "${bad_pkgs[@]}" echo fi echo 'emerge -u1v --quiet-build y --keep-going $(awk '\''$2 ~ /\// {print $2}'\'' '${up_log}')' emerge -upq --cols \ $(printf '%s\n' ${good_pkgs[*]} | grep -v '^cross-') ) >& ${up_log} : fi