diskimage-builder/diskimage_builder/elements/gentoo/bin/install-packages
Matthew Thode 6f51fbe355
Make Gentoo package updates work more often
Some package updates are more complex and require things like --backtrack=99 to
be passed to emerge.  We also try harder to ensure the system is in a consistent
state as a last step.

Change-Id: Ia5d3514e8b2a6cb2d656ade997cebb798d9c0a47
2017-04-22 19:34:11 -05:00

156 lines
4.0 KiB
Bash
Executable File

#!/bin/bash
# Copyright 2016 Matthew Thode
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
if [[ "${DIB_DEBUG_TRACE:-0}" -gt 0 ]]; then
set -x
fi
set -eu
set -o pipefail
ACTION='install'
SCRIPTNAME="$(basename $0)"
function show_options {
echo "Usage: ${SCRIPTNAME} [package ...]"
echo
echo 'Options:'
echo ' -u -- update all packages'
echo ' -e -- erase/remove packages'
exit 0
}
function fix_shm {
# make /dev/shm dir if it doesn't exist
# mount tmpfs and chown it
# existing programs could be using /dev/shm
# This means it cannot be moved or backed
# up as a copy easily. The only remaining
# option is to move the link if it exists
# as a link. Existing programs will still
# hold the file handle of the original
# location open and new programs can use
# the fixed /dev/shm.
if [[ "${RUN_ONCE_SHM}" == '1' ]]; then
if [[ ! -d /dev/shm ]]; then
if [[ ! -e /dev/shm ]]; then
if [[ -L /dev/shm ]]; then
mv /dev/shm /dev/shm.orig
fi
mkdir /dev/shm
fi
fi
mount -t tmpfs none /dev/shm
chmod 1777 /dev/shm
RUN_ONCE_SHM='0'
fi
}
function unfix_shm {
# unmount tmpfs
# care about anything still using it
if [[ "${RUN_ONCE_SHM}" == '0' ]]; then
umount /dev/shm
if fuser /dev/shm; then
rmdir /dev/shm
fi
if [[ -e /dev/shm.orig ]]; then
mv /dev/shm.orig /dev/shm
fi
fi
}
function install_gentoo_packages {
RUN_ONCE_SHM='1'
if grep -q /dev/shm /proc/mounts; then
emerge $@
elif [[ -k /dev/shm ]]; then
emerge $@
else
fix_shm
emerge $@
unfix_shm
fi
}
TEMP="$(getopt -o huem: -n ${SCRIPTNAME} -- ${@})"
if [[ "${?}" != 0 ]]; then
echo 'Terminating...' >&2
exit 1
fi
eval set -- "${TEMP}"
while true; do
case "${1}" in
-u )
if [[ ! -f /usr/portage/profiles ]]; then
emerge-webrsync -q
fi
install_gentoo_packages -uDNv --with-bdeps=y --backtrack=99 --jobs=2 @world
install_gentoo_packages --verbose=n --depclean
install_gentoo_packages -v --usepkg=n @preserved-rebuild
etc-update --automode -5
eselect news read new
exit 0;
;;
-e )
ACTION='remove'
shift
;;
-m )
MAP_ELEMENT="${2}"
shift 2
;;
-h )
show_options
;;
-- )
shift
break
;;
* )
echo "Error: unsupported option ${1}."
exit 1
;;
esac
done
PKGS="${@}"
if [[ -n "${MAP_ELEMENT:-}" ]]; then
PKGS="$(pkg-map --element ${MAP_ELEMENT} ${@})"
if [[ "${?}" != 0 ]]; then
echo "bin/pkg-map error. ${PKGS}"
exit 1
fi
fi
if [[ -z "${PKGS}" ]]; then
echo "Not running install-packages ${ACTION} with empty packages list"
else
if [[ "${ACTION}" == 'install' ]]; then
if [[ ! -f /usr/portage/profiles ]]; then
emerge-webrsync -q
fi
install_gentoo_packages -q --jobs=2 --changed-use "${PKGS}"
elif [[ "${ACTION}" == 'remove' ]]; then
if [[ ! -f /usr/portage/profiles ]]; then
emerge-webrsync -q
fi
install_gentoo_packages -C "${PKGS}"
else
echo 'something when really wrong, install action is not install or remove'
fi
fi