1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
|
#!/bin/sh
set -e
. /usr/share/debconf/confmodule
# Avoid perl warnings in any of the chroot calls below
export LANG=C
REMOUNT_CD=""
DIVERTS='/usr/bin/scrollkeeper-update /usr/bin/scrollkeeper-rebuilddb /usr/bin/fc-cache'
log() {
logger -t pkgsel "$@"
}
warning() {
log "warning: $@"
}
cleanup() {
for divert in $DIVERTS; do
rm -f "/target$divert"
log-output -t pkgsel chroot /target dpkg-divert \
--package pkgsel --rename --quiet --remove "$divert"
done
}
aptfailed() {
ret=$?
if [ "$ret" != 0 ]; then
# In case packages failed to install, try to clean up.
in-target dpkg --configure -a || true
# TODO useful error message here (for ret != 30)
db_progress INFO pkgsel/progress/cleanup
if ! cleanup; then
log "cleanup failed"
fi
db_progress STOP
load_install_cd
exit $ret
fi
}
load_install_cd() {
if [ "$REMOUNT_CD" ]; then
load-install-cd "/target" || true
fi
}
db_progress START 0 1000 debian-installer/pkgsel/title
db_progress INFO pkgsel/progress/init
# d-i debconf variables used by packages
debconf-copydb -p \
"^(debian-installer/language|debian-installer/country|debian-installer/keymap|passwd/username)$" \
configdb target_configdb
# temporarily divert programs that take a long time
for divert in $DIVERTS; do
log-output -t pkgsel chroot /target dpkg-divert --package pkgsel \
--rename --quiet --add "$divert"
ln -sf /bin/true "/target$divert"
done
db_progress STEP 10
# Unmount the installation CD to allow CD changing; as it may be needed
# again after pkgsel, make sure it is reloaded before exiting
if [ -e /var/lib/install-cd.id ]; then
log-output -t pkgsel umount /cdrom || true
REMOUNT_CD=1
fi
db_get pkgsel/upgrade
if [ "$RET" = none ]; then
tasksel_start=50
else
upgrade_type="$RET"
# Convert to apt-get command names.
case "$RET" in
safe-upgrade) upgrade_type=upgrade;;
full-upgrade) upgrade_type=dist-upgrade;;
esac
db_progress INFO pkgsel/progress/upgrade
sleep 2 # allow the message to be seen
log "checking for (security) updates to the base system"
# Exclude Recommends to avoid installing new packages as part of
# an upgrade.
in-target sh -c "debconf-apt-progress --from 50 --to 100 --logstderr -- apt-get -q --no-install-recommends -y -o DPkg::options=--force-confnew '$upgrade_type'" || aptfailed
tasksel_start=100
fi
partsdir="/usr/lib/pre-pkgsel.d"
if [ -d "$partsdir" ]; then
log "running pre-pkgsel hook scripts"
scriptcount=$(ls "$partsdir"/* 2>/dev/null | wc -l)
if [ $scriptcount -lt 10 ]; then
scripts_range=$(($scriptcount * 10))
else
scripts_range=100
fi
scripts_start=$tasksel_start
tasksel_start=$(($scripts_start + $scripts_range))
scriptcur=0
for script in $(ls "$partsdir"/* 2>/dev/null); do
base=$(basename $script | sed 's/[0-9]*//')
if ! db_progress INFO pkgsel/progress/$base; then
db_subst pkgsel/progress/fallback SCRIPT "$base"
db_progress INFO pkgsel/progress/fallback
fi
if [ -x "$script" ]; then
# be careful to preserve exit code
if log-output -t pkgsel "$script"; then
:
else
warning "$script returned error code $?"
fi
else
error "Unable to execute $script"
fi
# Advance progress bar
scriptcur=$(($scriptcur + 1))
db_progress SET $(($scripts_start + $scripts_range * $scriptcur / $scriptcount))
done
fi
db_get pkgsel/include
if [ "$RET" ]; then
tasksel_end=900
else
tasksel_end=950
fi
log "starting tasksel"
db_progress INFO pkgsel/progress/tasksel
in-target sh -c "tasksel --new-install --debconf-apt-progress='--from $tasksel_start --to $tasksel_end --logstderr'" || aptfailed
if db_get pkgsel/include/install-recommends; then
log "The template pkgsel/include/install-recommends is no longer used; please use base-installer/install-recommends instead"
fi
db_get pkgsel/include
if [ "$RET" ]; then
log "installing additional packages"
# Allow comma-separation so that this can more easily be preseeded
# at the kernel command line.
RET="$(printf '%s' "$RET" | sed 's/,/ /g')"
in-target sh -c "debconf-apt-progress --from 900 --to 950 --logstderr -- apt-get -q -y install -- $RET" || aptfailed
fi
log "finishing up"
db_progress INFO pkgsel/progress/cleanup
if ! cleanup; then
log "cleanup failed"
fi
db_progress STEP 20
if [ -x /target/usr/bin/scrollkeeper-update ]; then
log-output -t pkgsel chroot /target scrollkeeper-update -q || true
fi
if [ -x /target/usr/bin/fc-cache ]; then
chroot /target fc-cache -f -v >/target/var/log/fontconfig.log 2>&1 \
|| true
fi
db_progress STEP 30
db_progress STOP
load_install_cd
|