diff options
Diffstat (limited to 'bin/bfh-chroot')
-rwxr-xr-x | bin/bfh-chroot | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/bin/bfh-chroot b/bin/bfh-chroot new file mode 100755 index 0000000..a611cd6 --- /dev/null +++ b/bin/bfh-chroot @@ -0,0 +1,328 @@ +#!/bin/sh + +set -e + +COMMAND="${1:-enter}" + +if [ -n "${2}" ] +then + DISTRIBUTION="$(echo ${2} | awk -F- '{ print $1 }')" +else + DISTRIBUTION="${2:-sid}" +fi + +if [ -n "${3}" ] +then + ARCHITECTURE="${3:-$(dpkg --print-architecture)}" +else + ARCHITECTURE="$(echo ${2} | awk -F- '{ print $2 }')" + ARCHITECTURE="${ARCHITECTURE:-amd64}" +fi + +case "${DISTRIBUTION}" in + *) + MIRROR="debian.ethz.ch" + ;; +esac + +CHROOT="/srv/chroots/${DISTRIBUTION}-${ARCHITECTURE}" + +Chroot () +{ + if [ "${ARCHITECTURE}" = "$(dpkg --print-architecture)" ] + then + chroot "${CHROOT}" /usr/bin/env -i HOME="/root" PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" TERM="${TERM}" ${@} + else + linux32 chroot "${CHROOT}" /usr/bin/env -i HOME="/root" PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" TERM="${TERM}" ${@} + fi +} + +case "${COMMAND}" in + create) + if [ ! -d "${CHROOT}" ] + then + debootstrap --arch=${ARCHITECTURE} --include=progress-linux ${DISTRIBUTION} "${CHROOT}" http://${MIRROR}/debian + else + echo "${CHROOT}: file or directory already exists." + exit 1 + fi + + # Configure apt + +cat > "${CHROOT}/etc/apt/apt.conf.d/chroot.conf" << EOF +Acquire::PDiffs "false"; +APT::Clean-Installed "true"; +APT::Install-Recommends "false"; +APT::Install-Suggests "false"; +EOF + +cat > "${CHROOT}/etc/apt/sources.list" << EOF +deb http://${MIRROR}/debian ${DISTRIBUTION} main contrib non-free +EOF + + case "${DISTRIBUTION}" in + sid) + +cat >> "${CHROOT}/etc/apt/sources.list" << EOF +deb http://${MIRROR}/debian experimental main contrib non-free +EOF + + ;; + + buster) + +cat > "${CHROOT}/etc/apt/sources.list.d/progress-linux.sources" << EOF +Types: deb +URIs: https://cdn.deb.progress-linux.org/packages +Suites: engywuck-backports +Components: main contrib non-free restricted +PDiffs: no +Signed-By: /usr/share/progress-linux/pgp-keys/apt.progress-linux.org.gpg +EOF + + ;; + esac + + # Configure bash + +cat > "${CHROOT}/etc/profile.d/chroot.sh" << EOF +#!/bin/sh + +alias ls="ls --color=auto" + +export DEBEMAIL="maintainers@lists.progress-linux.org" +export DEBFULLNAME="Progress Linux Maintainers" + +export LANG="en_US.UTF-8" +export LANGUAGE="en_US:en" +export LC_ALL="C.UTF-8" +EOF + + # Configure dpkg + if [ -e "${CHROOT}/etc/dpkg" ] + then + +cat > "${CHROOT}/etc/dpkg/dpkg.cfg.d/chroot" << EOF +force-unsafe-io +EOF + + fi + + if [ -e "${CHROOT}/sbin/start-stop-daemon" ] + then + mv "${CHROOT}/sbin/start-stop-daemon" "${CHROOT}/sbin/start-stop-daemon.orig" + fi + +cat > "${CHROOT}/sbin/start-stop-daemon" << EOF +#!/bin/sh + +exit 0 +EOF + + chmod 0755 "${CHROOT}/sbin/start-stop-daemon" + + # Configure sysv-rc + if [ -e "${CHROOT}/usr/sbin/policy-rc.d" ] + then + mv "${CHROOT}/usr/sbin/policy-rc.d" "${CHROOT}/usr/sbin/policy-rc.d.orig" + fi + +cat > "${CHROOT}/usr/sbin/policy-rc.d" << EOF +#!/bin/sh + +echo "All runlevel operations denied by policy" >&2 + +exit 101 +EOF + + chmod 0755 "${CHROOT}/usr/sbin/policy-rc.d" + + # Configure debian + echo "${DISTRIBUTION}_${ARCHITECTURE}" > "${CHROOT}/etc/debian_chroot" + + Chroot apt update + Chroot apt upgrade --yes + Chroot apt dist-upgrade --yes + + Chroot apt install --yes \ + build-essential debhelper fakeroot + + Chroot apt install --yes \ + gnupg sudo wget + + Chroot apt install --yes \ + git rsync ca-certificates wget + + Chroot apt clean + + echo "Root password" + + Chroot "passwd" + Chroot "adduser --home /build --ingroup sudo build" + + echo ". /etc/profile" >> "${CHROOT}/build/.bashrc" + + case $(cat /etc/hostname) in + all*) + BASH_HISTORY="indep" + ;; + + source*) + BASH_HISTORY="source" + ;; + + *) + BASH_HISTORY="arch" + ;; + esac + + case "${BASH_HISTORY}" in + arch) + +cat > "${CHROOT}/build/.bash_history" << EOF +cd */ && sudo apt-get build-dep -y . && dpkg-buildpackage -B && cd .. && rm -rf */ +sudo apt-get install -y -t engywuck-backports debhelper +clear && bbuild.sh -b binary-arch -d buster-backports -p +rsync -aPv --progress --stats * apt.bfh.science::upload && rm -rf * +EOF + + ;; + + indep) + +cat > "${CHROOT}/build/.bash_history" << EOF +cd */ && sudo apt-get build-dep -y . && dpkg-buildpackage -A && cd .. && rm -rf */ +sudo apt-get install -y -t engywuck-backports debhelper +clear && bbuild.sh -b binary-indep -d buster-backports -p +rsync -aPv --progress --stats * apt.bfh.science::upload && rm -rf * +EOF + + ;; + + source) + +cat > "${CHROOT}/build/.bash_history" << EOF +cd */ && sudo apt-get build-dep -y . && dpkg-buildpackage -A && cd .. && rm -rf */ +sudo apt-get install -y -t engywuck-backports debhelper +clear && bbuild.sh -b source -d buster-backports -p +rsync -aPv --progress --stats * apt.bfh.science::upload && rm -rf * +EOF + + ;; + esac + + chown 1000:1000 "${CHROOT}/build/.bash_history" + + echo "build ALL=NOPASSWD: ALL" >> "${CHROOT}/etc/sudoers" + ;; + + chroot) + Chroot "su - build" + ;; + + update) + Chroot chmod 777 /dev/ptmx + Chroot apt-get --force-yes --yes update + Chroot apt-get --force-yes --yes upgrade + Chroot apt-get --force-yes --yes dist-upgrade + Chroot apt-get --force-yes --yes clean + ;; + + save) + killall -9 syslogd > /dev/null 2>&1 || true + killall -9 klogd > /dev/null 2>&1 || true + + for FILESYSTEM in /sys /proc /lib/init/rw /dev/shm /dev/pts /dev + do + umount -f "${CHROOT}/${FILESYSTEM}" > /dev/null 2>&1 || true + done + + rm -f "${CHROOT}/root/.bash_history" + rm -f "${CHROOT}/root/.viminfo" + rm -f "${CHROOT}/build/.viminfo" + rm -rf "${CHROOT}/var/tmp/vi.recover" + rm -f "${CHROOT}/etc/machine-id" + + case $(cat /etc/hostname) in + all*) + BASH_HISTORY="indep" + ;; + + source*) + BASH_HISTORY="source" + ;; + + *) + BASH_HISTORY="arch" + ;; + esac + + case "${BASH_HISTORY}" in + arch) + +cat > "${CHROOT}/build/.bash_history" << EOF +cd */ && sudo apt-get build-dep -y . && dpkg-buildpackage -B && cd .. && rm -rf */ +sudo apt-get install -y -t engywuck-backports debhelper +clear && bbuild.sh -b binary-arch -d buster-backports -p +rsync -aPv --progress --stats * apt.bfh.science::upload && rm -rf * +EOF + + ;; + + indep) + +cat > "${CHROOT}/build/.bash_history" << EOF +cd */ && sudo apt-get build-dep -y . && dpkg-buildpackage -A && cd .. && rm -rf */ +sudo apt-get install -y -t engywuck-backports debhelper +clear && bbuild.sh -b binary-indep -d buster-backports -p +rsync -aPv --progress --stats * apt.bfh.science::upload && rm -rf * +EOF + + ;; + + source) + +cat > "${CHROOT}/build/.bash_history" << EOF +cd */ && sudo apt-get build-dep -y . && dpkg-buildpackage -A && cd .. && rm -rf */ +sudo apt-get install -y -t engywuck-backports debhelper +clear && bbuild.sh -b source -d buster-backports -p +rsync -aPv --progress --stats * apt.bfh.science::upload && rm -rf * +EOF + ;; + esac + + rsync -av --delete "${CHROOT}"/ "${CHROOT}".orig + + mount proc-$(basename ${CHROOT}) "${CHROOT}/proc" -t proc + mount devpts-$(basename ${CHROOT}) "${CHROOT}/dev/pts" -t devpts + mount sysfs-$(basename ${CHROOT}) "${CHROOT}/sys" -t sysfs + mount /dev/shm -o bind "${CHROOT}/dev/shm" + ;; + + restore) + killall -9 syslogd > /dev/null 2>&1 || true + killall -9 klogd > /dev/null 2>&1 || true + + for FILESYSTEM in /sys /proc /lib/init/rw /dev/shm /dev/pts /dev + do + umount -f "${CHROOT}/${FILESYSTEM}" > /dev/null 2>&1 || true + done + + rsync -av --delete "${CHROOT}".orig/ "${CHROOT}" + + mount proc-$(basename ${CHROOT}) "${CHROOT}/proc" -t proc + mount devpts-$(basename ${CHROOT}) "${CHROOT}/dev/pts" -t devpts + mount sysfs-$(basename ${CHROOT}) "${CHROOT}/sys" -t sysfs + mount /dev/shm -o bind "${CHROOT}/dev/shm" + ;; + + reset) + "${0}" restore ${DISTRIBUTION} ${ARCHITECTURE} + "${0}" update ${DISTRIBUTION} ${ARCHITECTURE} + "${0}" save ${DISTRIBUTION} ${ARCHITECTURE} + ;; + + *) + echo "Wrong option." + exit 1 +esac |