mirror_style release
download_style apt

work_out_debs () {

    required="base-files base-passwd bash bsdutils debconf debianutils diff dpkg fileutils findutils grep gzip hostname libc6 libdb2 libdb3 libgdbmg1 libncurses5 libpam-modules libpam-runtime libpam0g libperl5.6 libpopt0 libreadline4 libstdc++2.10-glibc2.2 login makedev mawk modutils mount ncurses-base ncurses-bin passwd perl-base procps sed shellutils slang1 sysvinit tar textutils util-linux sparc-utils e2fsprogs"

    base="adduser apt base-config console-common console-data cron nullmailer ifupdown klogd libcap1 libident libldap2 liblockfile1 libpcre3 libsasl7 logrotate mailx net-tools netkit-ping nvi libpcap0 sysklogd tasksel $additional"

    without_package () {
        echo "$2" | tr ' ' '\n' | grep -v "^$1$" | tr '\n' ' '
    }

    all_debs="$required $base"
    for x in $exclude; do
      all_debs="$(without_package "$x" "$all_debs")"
    done
    
}

install_debs () {
    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

    setup_proc
    setup_devices

    in_target /sbin/ldconfig

    p () {
	baseprog="$(($baseprog + ${1:-1}))"
    }

    x_feign_install () {
        local pkg="$1"
        local deb="$(debfor $pkg)"
        local ver="$(
            ar -p "$TARGET/$deb" control.tar.gz | zcat |
                tar -O -xf - control ./control 2>/dev/null |
                sed -ne 's/^Version: *//Ip' | head -n 1
        )"

        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_core_install () {
	smallyes '' | in_target dpkg --force-depends --install $(debfor "$@")
    }

    x_feign_install dpkg

    DEBIAN_FRONTEND=Noninteractive
    export DEBIAN_FRONTEND

    baseprog=0
    bases=40

    p; progress $baseprog $bases "Installing base system" #1
    info "Installing core packages..."

    p; progress $baseprog $bases #2
    ln -s mawk $TARGET/usr/bin/awk
    x_core_install base-files base-passwd
    p; progress $baseprog $bases #3
    x_core_install dpkg

    if [ ! -e "$TARGET/etc/localtime" ]; then
        ln -sf /usr/share/zoneinfo/UTC "$TARGET/etc/localtime"
    fi

    p; progress $baseprog $bases #4
    x_core_install libc6

    p; progress $baseprog $bases #5
    x_core_install perl-base
    p; progress $baseprog $bases #6
    rm $TARGET/usr/bin/awk
    x_core_install mawk
    p; progress $baseprog $bases #7
    x_core_install debconf

    info "Unpacking required packages..."

    p; progress $baseprog $bases #8
    smallyes '' | repeat 5 in_target_failmsg "Failure while unpacking required packages.  This will be attempted up to five times." dpkg --force-depends --unpack $(debfor $required)
    p 10; progress $baseprog $bases #18

    info "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
    on_exit "in_target_nofail umount /dev/pts"

    p; progress $baseprog $bases #19
    smallyes '' | in_target_failmsg "Failure while configuring required packages." dpkg --configure --pending --force-configure-any --force-depends
    p 10; progress $baseprog $bases #29 

    info "Installing base packages..."

    p; progress $baseprog $bases #30
    smallyes '' | repeat 5 in_target_failmsg "Failure while installing base packages.  This will be re-attempted up to five times." dpkg --force-auto-select --force-overwrite --force-confold --skip-same-version --unpack $(debfor $base)

    mv "$TARGET/usr/sbin/sendmail" "$TARGET/usr/sbin/sendmail--"
    ln -s /bin/true "$TARGET/usr/sbin/sendmail"

    smallyes '' | repeat 5 in_target_failmsg "Failure while configuring base packages.  This will be attempted 5 times." dpkg  --force-confold --skip-same-version  --configure -a

    mv "$TARGET/usr/sbin/sendmail--" "$TARGET/usr/sbin/sendmail"

    p 9; progress $baseprog $bases #39

    mv "$TARGET/sbin/start-stop-daemon.REAL" "$TARGET/sbin/start-stop-daemon"

    info "Installing JDP-recommended sources.list"

        echo \
"# Recommended sources.list from JDP
# See http://www.dnd.utwente.nl/js/ for more info

deb http://ftp.nl.debian.org/debian stable main non-free contrib
deb-src http://ftp.nl.debian.org/debian stable main non-free contrib
deb http://ftp.nl.debian.org/debian-non-US stable/non-US main contrib non-free
deb-src http://ftp.nl.debian.org/debian-non-US stable/non-US main contrib non-free
deb http://security.debian.org/ stable/updates main contrib non-free
deb-src http://security.debian.org/ stable/updates main contrib non-free
deb http://www.dnd.utwente.nl/js/debian/ stable .
deb-src http://www.dnd.utwente.nl/js/debian/ stable .
" > "$TARGET/etc/apt/sources.list"

    info "Installing template fstab"
	echo \
"10.0.0.7:/export/aluminium / nfs defaults,rw,nolock,intr,hard 0 0
proc /proc proc defaults" >> "$TARGET/etc/fstab"

    info "Installing template hostname"
	echo "carbon" >> "$TARGET/etc/hostname"
	
    info "Installing template network/interfaces"
	echo \
"
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 10.0.0.6
	network 10.0.0.0
	netmask 255.255.255.0
	broadcast 10.255.255.255
	gateway 10.0.0.1" >> "$TARGET/etc/network/interfaces"

    progress $bases $bases #40
    info "Base system installed successfully."
    info "Remember to edit etc/fstab etc/network/interfaces etc/hostname"
    info "And set a root password"
}
