Commit 364c3c49 authored by Markus Frosch's avatar Markus Frosch

Added chroot build scripts

parent ad1c2021
#!/bin/bash
#
# Cowbuilder for Univention
#
# wrapper script to install a chroot for cowbuilder
#
# Copyright 2014 Icinga Development Team <info@icinga.org>
# 2014 Markus Frosch <markus@lazyfrosch.de>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# On a Debian system you will find this license at
# /usr/share/common-licenses/GPL-2
##[ CONFIG ]###################################################################
# repository for debootstrap
# this is a path to an extracted installation ISO
#
# please extract the ISOs to that the layout is like this:
#
# $REPO
# |- amd64
# | ` packages
# `- i386
# ` packages
#REPO="http://mirror.mycompany.com/univention/UCS-3.2"
REPO="http://frosch-nb.lazyfrosch.de/~markus/UCS-3.2"
# distribution name
DIST="ucs3"
# root for pbuilder
PBUILDER_ROOT="/var/cache/pbuilder"
# extra repositories, including unmaintained
# NOTE: the unmaintained repos include any -dev package
ONLINEREPOS=(
"deb http://updates.software-univention.de/3.0/maintained/ 3.0-0/<ARCH>/"
"deb http://updates.software-univention.de/3.0/maintained/ 3.0-0/all/"
"deb http://updates.software-univention.de/3.0/unmaintained/ 3.0-0/<ARCH>/"
"deb http://updates.software-univention.de/3.0/unmaintained/ 3.0-0/all/"
"deb http://updates.software-univention.de/3.0/maintained/ 3.0-1/<ARCH>/"
"deb http://updates.software-univention.de/3.0/maintained/ 3.0-1/all/"
"deb http://updates.software-univention.de/3.0/unmaintained/ 3.0-1/<ARCH>/"
"deb http://updates.software-univention.de/3.0/unmaintained/ 3.0-1/all/"
"deb http://updates.software-univention.de/3.0/maintained/ 3.0-2/<ARCH>/"
"deb http://updates.software-univention.de/3.0/maintained/ 3.0-2/all/"
"deb http://updates.software-univention.de/3.0/unmaintained/ 3.0-2/<ARCH>/"
"deb http://updates.software-univention.de/3.0/unmaintained/ 3.0-2/all/"
"deb http://updates.software-univention.de/3.1/maintained/ 3.1-0/<ARCH>/"
"deb http://updates.software-univention.de/3.1/maintained/ 3.1-0/all/"
"deb http://updates.software-univention.de/3.1/unmaintained/ 3.1-0/<ARCH>/"
"deb http://updates.software-univention.de/3.1/unmaintained/ 3.1-0/all/"
"deb http://updates.software-univention.de/3.1/maintained/ 3.1-1/<ARCH>/"
"deb http://updates.software-univention.de/3.1/maintained/ 3.1-1/all/"
"deb http://updates.software-univention.de/3.1/unmaintained/ 3.1-1/<ARCH>/"
"deb http://updates.software-univention.de/3.1/unmaintained/ 3.1-1/all/"
"deb http://updates.software-univention.de/3.2/maintained/ 3.2-0/<ARCH>/"
"deb http://updates.software-univention.de/3.2/maintained/ 3.2-0/all/"
"deb http://updates.software-univention.de/3.2/unmaintained/ 3.2-0/<ARCH>/"
"deb http://updates.software-univention.de/3.2/unmaintained/ 3.2-0/all/"
)
##[ FUNCTIONS ]################################################################
# helper for unmounting stuff in the chroot, for leftovers
unmount() {
mount="$BASE$1"
test -d $mount || return 0
mount=`readlink -f "$mount"`
grep "$mount" /proc/mounts || return 0
echo "Unmounting $1 at $mount"
umount "$mount"
}
##[ INTERNAL ]#################################################################
if [ `id -u` -ne 0 ]; then
echo "You are not root, this script must be run as root!" >&2
echo "Trying to sudo myself..."
set -x
sudo "$0" "$@"
exit $?
fi
# default architecture
DEFAULT_ARCH=`dpkg --print-architecture`
ARCH="$DEFAULT_ARCH"
# default arguments
ARGS=("--distribution" "univention")
# parse interesting arguments
MODE="update"
while [ "$1" != "" ]; do
case "$1" in
--architecture)
ARGS=(${ARGS[@]} "$1")
shift
ARGS=(${ARGS[@]} "$1")
ARCH="$1"
;;
--create|--update|--build|--login|--execute)
MODE="${1#--}"
;;
*)
ARGS=($ARGS "$1")
;;
esac
shift
done
# target directory for the chroot
if [ "$ARCH" != "$DEFAULT_ARCH" ]; then
BASE="$PBUILDER_ROOT/base-${DIST}-${ARCH}.cow"
else
BASE="$PBUILDER_ROOT/base-${DIST}.cow"
fi
if [ "$MODE" = "create" ]; then
# make sure mountpoints are gone
unmount /sys
unmount /proc
unmount /run/shm
# remove old base
if [ -d "$BASE" ]; then
echo "Cleaning up old chroot..."
rm -rf "$BASE"
fi
# build othermirrors
OTHERMIRRORS=""
for mirror in "${ONLINEREPOS[@]}"; do
mirror="${mirror/<ARCH>/$ARCH}"
OTHERMIRRORS="$OTHERMIRRORS|$mirror"
done
OTHERMIRRORS="${OTHERMIRRORS#|}"
fi
echo "Creating chroot with cowbuilder..."
if [ "$MODE" = "create" ]; then
set -x
/usr/sbin/cowbuilder --$MODE \
--basepath "$BASE" \
--mirror "$REPO/$ARCH/packages" \
--othermirror "$OTHERMIRRORS" ${ARGS[@]}
else
set -x
/usr/sbin/cowbuilder --$MODE \
--basepath "$BASE" ${ARGS[@]}
fi
# we will use the functions from the system's debootstrap
#. /usr/share/debootstrap/functions-ucs3
. /usr/share/debootstrap/functions
# set SUITE, because the DVD uses this name
# but we want to use "ucs3" later
SUITE=univention
mirror_style main
download_style apt
finddebs_style from-indices
variants - buildd fakechroot minbase scratchbox
if doing_variant fakechroot; then
test "$FAKECHROOT" = "true" || error 1 FAKECHROOTREQ "This variant requires fakechroot environment to be started"
fi
case $ARCH in
alpha|ia64) LIBC="libc6.1" ;;
kfreebsd-*) LIBC="libc0.1" ;;
hurd-*) LIBC="libc0.3" ;;
*) LIBC="libc6" ;;
esac
work_out_debs () {
required="$(get_debs Priority: required)"
if doing_variant - || doing_variant fakechroot; then
#required="$required $(get_debs Priority: important)"
# ^^ should be getting debconf here somehow maybe
base="$(get_debs Priority: important)"
elif doing_variant buildd || doing_variant scratchbox; then
base="apt $(get_debs Build-Essential: yes)"
elif doing_variant minbase; then
base="apt"
fi
if doing_variant fakechroot; then
# ldd.fake needs binutils
required="$required binutils"
fi
}
first_stage_install () {
extract $required
mkdir -p "$TARGET/var/lib/dpkg"
: >"$TARGET/var/lib/dpkg/status"
: >"$TARGET/var/lib/dpkg/available"
setup_etc
if [ ! -e "$TARGET/etc/fstab" ]; then
echo '# UNCONFIGURED FSTAB FOR BASE SYSTEM' > "$TARGET/etc/fstab"
chown 0:0 "$TARGET/etc/fstab"; chmod 644 "$TARGET/etc/fstab"
fi
if doing_variant fakechroot; then
setup_devices_fakechroot
else
setup_devices
fi
x_feign_install () {
local pkg="$1"
local deb="$(debfor $pkg)"
local ver="$(extract_deb_field "$TARGET/$deb" Version)"
mkdir -p "$TARGET/var/lib/dpkg/info"
echo \
"Package: $pkg
Version: $ver
Status: install ok installed" >> "$TARGET/var/lib/dpkg/status"
touch "$TARGET/var/lib/dpkg/info/${pkg}.list"
}
x_feign_install dpkg
}
second_stage_install () {
x_core_install () {
smallyes '' | in_target dpkg --force-depends --install $(debfor "$@")
}
p () {
baseprog="$(($baseprog + ${1:-1}))"
}
if doing_variant fakechroot; then
setup_proc_fakechroot
elif doing_variant scratchbox; then
true
else
setup_proc
in_target /sbin/ldconfig
fi
DEBIAN_FRONTEND=noninteractive
DEBCONF_NONINTERACTIVE_SEEN=true
export DEBIAN_FRONTEND DEBCONF_NONINTERACTIVE_SEEN
baseprog=0
bases=7
p; progress $baseprog $bases INSTCORE "Installing core packages" #1
info INSTCORE "Installing core packages..."
p; progress $baseprog $bases INSTCORE "Installing core packages" #2
ln -sf mawk "$TARGET/usr/bin/awk"
x_core_install base-files base-passwd
p; progress $baseprog $bases INSTCORE "Installing core packages" #3
x_core_install dpkg
if [ ! -e "$TARGET/etc/localtime" ]; then
ln -sf /usr/share/zoneinfo/UTC "$TARGET/etc/localtime"
fi
if doing_variant fakechroot; then
install_fakechroot_tools
fi
p; progress $baseprog $bases INSTCORE "Installing core packages" #4
x_core_install $LIBC
p; progress $baseprog $bases INSTCORE "Installing core packages" #5
x_core_install perl-base
p; progress $baseprog $bases INSTCORE "Installing core packages" #6
rm "$TARGET/usr/bin/awk"
x_core_install mawk
p; progress $baseprog $bases INSTCORE "Installing core packages" #7
if doing_variant -; then
x_core_install debconf
fi
baseprog=0
bases=$(set -- $required; echo $#)
info UNPACKREQ "Unpacking required packages..."
exec 7>&1
smallyes '' |
(repeatn 5 in_target_failmsg UNPACK_REQ_FAIL_FIVE "Failure while unpacking required packages. This will be attempted up to five times." "" \
dpkg --status-fd 8 --force-depends --unpack $(debfor $required) 8>&1 1>&7 || echo EXITCODE $?) |
dpkg_progress $baseprog $bases UNPACKREQ "Unpacking required packages" UNPACKING
info CONFREQ "Configuring required packages..."
mv "$TARGET/sbin/start-stop-daemon" "$TARGET/sbin/start-stop-daemon.REAL"
echo \
"#!/bin/sh
echo
echo \"Warning: Fake start-stop-daemon called, doing nothing\"" > "$TARGET/sbin/start-stop-daemon"
chmod 755 "$TARGET/sbin/start-stop-daemon"
setup_dselect_method apt
smallyes '' |
(in_target_failmsg CONF_REQ_FAIL "Failure while configuring required packages." "" \
dpkg --status-fd 8 --configure --pending --force-configure-any --force-depends 8>&1 1>&7 || echo EXITCODE $?) |
dpkg_progress $baseprog $bases CONFREQ "Configuring required packages" CONFIGURING
baseprog=0
bases="$(set -- $base; echo $#)"
info UNPACKBASE "Unpacking the base system..."
setup_available $required $base
done_predeps=
while predep=$(get_next_predep); do
# We have to resolve dependencies of pre-dependencies manually because
# dpkg --predep-package doesn't handle this.
predep=$(without "$(without "$(resolve_deps $predep)" "$required")" "$done_predeps")
# XXX: progress is tricky due to how dpkg_progress works
# -- cjwatson 2009-07-29
p; smallyes '' |
in_target dpkg --force-overwrite --force-confold --skip-same-version --install $(debfor $predep)
base=$(without "$base" "$predep")
done_predeps="$done_predeps $predep"
done
smallyes '' |
(repeatn 5 in_target_failmsg INST_BASE_FAIL_FIVE "Failure while installing base packages. This will be re-attempted up to five times." "" \
dpkg --status-fd 8 --force-overwrite --force-confold --skip-same-version --unpack $(debfor $base) 8>&1 1>&7 || echo EXITCODE $?) |
dpkg_progress $baseprog $bases UNPACKBASE "Unpacking base system" UNPACKING
info CONFBASE "Configuring the base system..."
smallyes '' |
(repeatn 5 in_target_failmsg CONF_BASE_FAIL_FIVE "Failure while configuring base packages. This will be re-attempted up to five times." "" \
dpkg --status-fd 8 --force-confold --skip-same-version --configure -a 8>&1 1>&7 || echo EXITCODE $?) |
dpkg_progress $baseprog $bases CONFBASE "Configuring base system" CONFIGURING
mv "$TARGET/sbin/start-stop-daemon.REAL" "$TARGET/sbin/start-stop-daemon"
progress $bases $bases CONFBASE "Configuring base system"
info BASESUCCESS "Base system installed successfully."
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment