#!/bin/sh
# Apt configurator.
# Copyright GPL 1999-2004 by Joey Hess
set -e

# Options passed from base-config
VARDIR=$1
GROUP=$2
METHOD=$3

# If this is not called from base-config, and the first parameter is "probe",
# it will do cd autoprobing on startup.
if [ "$VARDIR" = probe ]; then
	CDPROBE=1
fi

# Where is the mirrors master list?
MIRRORLIST=/usr/lib/base-config/Mirrors.masterlist

. /usr/share/debconf/confmodule

TEXTDOMAIN=base-config
export TEXTDOMAIN

# Get the configuration from /etc/apt/apt.conf
APTGET="/usr/bin/apt-get"
APTETC="/etc/apt/"
APTCDROM="/usr/bin/apt-cdrom"
RES=`apt-config shell \
	APTGET Dir::Bin::apt-get/d \
	APTETC Dir::Etc/d \
	APTCDROM Dir::Bin::apt-cdrom/d`
eval $RES

country_i18n () {
  # conversion country name using iso_3166 table
    case "$1" in
      local)
        perl -e '
		use Locale::gettext;
		use POSIX;
		textdomain("iso_3166");
		print gettext(shift);
		' $2
      ;;
      C)
        perl -e '
		use Locale::gettext;
		use POSIX;
		textdomain("iso_3166");
		$country=shift;
		$ret= "";

		open (T, "/usr/share/zoneinfo/iso3166.tab");
		while (<T>) {
			next if /^#/;
			chomp;
			($code, $long)=split(/\t/, $_);
			if (gettext($long) eq $country) {
			    $ret = $long;
			    close T;
			}
		}
		close T;
		print $ret ? $ret : $country;
		' $2
      ;;
    esac
}

# Pass in a URI type; this function returns a list of countries
# that have mirrors in them that match the type.
country_list () {
	# translators: there MUST be a comma followed by a space at the end
	# of your translation, or things will break!
	gettext "enter information manually, "
	perl -ne '
		BEGIN {
			use Locale::gettext;
			use POSIX;
			textdomain("iso_3166");
			$type=shift;
			open (T, "/usr/share/zoneinfo/iso3166.tab");
			while (<T>) {
				next if /^#/;
				chomp;
				($code, $long)=split(/\t/, $_);
				$co{$code}=$long;
			}
			close T;
			$/="\n\n";
		}
		if (/Archive-$type:/) {
			($c)=/Country: (.*?)\s+.*\n/;
			$countries{gettext($co{$c})}=1 if $c;
		}
		END { print join(", ", sort(keys %countries)) }
	' $1 $MIRRORLIST
}

# Pass in a URI type and a country; this function returns a 
# list of mirrors of the correct type in the country.
# The list is ordered with push mirrors at the top.
# Other orderings can be added here.
mirror_list () {
	perl -ne '
		BEGIN {
			$type=shift;
			$country=shift;
			open (T, "/usr/share/zoneinfo/iso3166.tab");
			while (<T>) {
				next if /^#/;
				chomp;
				($code, $long)=split(/\t/, $_);
				if ($long eq $country) {
					$country=$code;
				        close T;
				}
			}
			close T;
			$/="\n\n";
		}
		if (/Archive-$type:/ && /Country: $country\s+.*\n/) {
			($s)=/Site: (.*?)\n/;
			($t)=/Type: (.*?)\n/;
			$rating=0;
			$rating=1 if $t=~/push/i;
			$rating=2 if $t=~/push-primary/i;
			$mirrors{$s}=$rating;
		}
		END { print join(", ",
			sort { $mirrors{$b} <=> $mirrors{$a} }
			(keys %mirrors)) }
	' $1 "$2" $MIRRORLIST
}

# Pass in the URI type and the hostname of a mirror; this returns the
# directory the debian mirror is located in on that host.
mirror_dir () {
	perl -ne '
		BEGIN { $/="\n\n"; $type=shift; $mirror=shift }
		if (/Site: $mirror/ && /Archive-$type: (.*)\n/) {
			print $1;
			exit;
		}
	' $1 $2 $MIRRORLIST
}

# After mounting a cd, call this function to scan
# it with apt-cdrom, which also adds it to the sources.list.
# The cd will then be unmounted.
scan_cd () {
	clear >/dev/tty </dev/tty
	gettext "Scanning CD, this will take a minute."
	echo
	# Touch file because apt-cdrom bails if it doesn't exist.
	touch ${APTETC}sources.list
	if $APTCDROM add --no-mount </dev/tty >/dev/tty; then
		umount /cdrom 2>/dev/null || true
		clear >/dev/tty </dev/tty
		return 0
	else
		umount /cdrom 2>/dev/null || true
		clear >/dev/tty </dev/tty
		# Apt didn't like the cdrom for some reason.
		db_fset apt-setup/cd/bad seen false
		db_input critical apt-setup/cd/bad || true
		db_go || true
		return 1
	fi
}

# This function should be called only after one cd has been successfully
# scanned. It prompts the user if there are more cd's to scan and
# scans them. Pass in the device that is known to be the cd drive.
handle_rest_cds () {
	# Warty specific change: we will never ship "another CD". (See #355)
	if [ -e "$TMPFILE" ]; then return 0; fi
	LOOP=1
	while [ "$LOOP" ]; do
		# Make sure the cd is unmounted, we may be prompting
		# them to change cd's.
		umount /cdrom 2>/dev/null || true

		db_set apt-setup/cd/another false
		db_fset apt-setup/cd/another seen false
		db_input high apt-setup/cd/another || true
		db_go || true
		db_get apt-setup/cd/another
		if [ "$RET" = true ]; then
			while ! mount $1 /cdrom -o ro -t iso9660
			do
				db_fset apt-setup/cd/dev seen false
				db_input critical apt-setup/cd/dev || true
				db_go || continue 2
				db_get apt-setup/cd/dev
				CDDEV="$RET"
			done
			scan_cd || true
		else
			LOOP=''
		fi
	done
}

# This function will ask the user if they want to add another
# apt source. If so, it returns true.
add_another () {
	# Default to adding another source if all the current sources do
	# not provide at least 300 packages. If it's closer to 200, then
	# they may be using a netinst cdrom or something, and should add
	# more sources.
	PACKAGE_COUNT=$(LC_ALL=C apt-cache stats | grep 'Normal Packages:' | awk '{ print $3 }')
	if [ "$PACKAGE_COUNT" -ge 300 ]; then
		prio=medium
		db_set apt-setup/another false
	else
		prio=high
		db_set apt-setup/another true
	fi
	
	#  Several notes for translators:
	#  * The singular form is only there to make use of plural forms;
	#  * If package count is 0, a separate error message should be displayed.
	#  * This sentence is part of a longer paragraph, full stop is omitted here.
	#  * "${PACKAGE_COUNT}" must not be translated.
	MESSAGE=$(ngettext 'The Debian package management tool, apt, is now configured, and can install ${PACKAGE_COUNT} package' 'The Debian package management tool, apt, is now configured, and can install ${PACKAGE_COUNT} packages' $PACKAGE_COUNT | sed -e "s/\${PACKAGE_COUNT}/$PACKAGE_COUNT/")
	db_subst apt-setup/another MESSAGE $MESSAGE

	db_fset apt-setup/another seen false
	db_input $prio apt-setup/another || return 1
	db_go || return 1 # effectively backup to the menu.
	db_get apt-setup/another
	if [ "$RET" = true ]; then
		return 0
	else
		return 1
	fi
}

db_capb backup
db_settitle apt-setup/title

MAINLOOP=1

# First, try to do cdrom autodetection. This is so in the most common case,
# you don't have to configure anything at all.

# If /dev/cdrom exists, use it.
if [ -e /dev/cdrom ]; then
	CDDEV=/dev/cdrom
	db_set apt-setup/cd/dev "$CDDEV"
else
	# If there is a fstab entry for /cdrom or /media/cdrom0, use its device.
	CDDEV=$(grep "[[:space:]]/media/cdrom0/*[[:space:]]" /etc/fstab | awk '{print $1}')
	if [ -z "$CDDEV" ]; then
		CDDEV=$(grep "[[:space:]]/cdrom/*[[:space:]]" /etc/fstab | awk '{print $1}')
	fi
	if [ -n "$CDDEV" ] && [ -e "$CDDEV" ]; then
		db_set apt-setup/cd/dev "$CDDEV"
	fi
fi

if [ "$CDPROBE" ] && [ "$CDDEV" ]; then
	umount /cdrom 2>/dev/null || true
	# Try mounting the detected cd rom.
	if mount $CDDEV /cdrom -o ro -t iso9660 2>/dev/null && scan_cd; then
		handle_rest_cds $CDDEV
		MAINLOOP=''
	else
		# Unable to mount it, or the cd was bad. Make sure that cdrom
		# is the default, and just go on to ask them where they want
		# apt to install from.
		# Warty change: no need to set a default if we are guessing
		if [ ! -e "$TMPFILE" ]; then
			db_set apt-setup/uri_type "cdrom"
		fi
		db_subst apt-setup/uri_type note $(gettext 'You probably used a CD to install the Debian base system, but it is not currently in the drive. You should probably just insert it and select "cdrom".')
	fi
fi

if [ -e "$TMPFILE" ]; then
	SCANNED="`grep "^Scanned: " "$TMPFILE" | awk '{print $2}'`"
	if [ "$SCANNED" = yes ]; then
		# d-i has already done the work
		MAINLOOP=
	fi
fi

while [ "$MAINLOOP" ] || add_another; do
	# Ask what source apt should install from.
	# Warty change: dynamically choose priority to hide questions (See: #296 and #353)
	promptpri="critical"
	if [ -e "$TMPFILE" ]; then
		# try to be sure that $TMPFILE hasn't been mangled
		URI="`grep "^Uritype: " "$TMPFILE" | awk '{print $2}'`"
		if [ "$URI" != "unknown" ] && [ "x$URI" != "x" ]; then
			promptpri="medium"
			db_set apt-setup/uri_type "$URI"
		fi
	fi
	db_fset apt-setup/uri_type seen false
	db_input "$promptpri" apt-setup/uri_type || true
	db_go || exit 30
	db_get apt-setup/uri_type
	URI="$RET"
	# Clear any note that is on the uri_type, now that they've seen it.
	db_subst apt-setup/uri_type note ""

	# If they chose to use CD, there is little point in asking
	# these questions, since the CD's they insert will answer them for us.
	# Same goes if they are entering manually.
	# Warty change: we setup apt to fetch from the net anyway.
	if [ "$URI" != "edit sources list by hand" ]; then
		db_beginblock
		db_fset mirror/suite seen false
		db_input low mirror/suite || true
		db_fset apt-setup/non-free seen false
		db_set apt-setup/non-free true
		db_input low apt-setup/non-free || true
		db_fset apt-setup/universe seen false
		db_set apt-setup/universe false
		db_input low apt-setup/universe || true
		db_endblock
		db_go || continue

		# If they choose not use non-free, ask about contrib, with a
		# default of no. If they chose to use non-free, they get
		# contrib too..
		#db_get apt-setup/non-free
		#if [ "$RET" = false ]; then
		#	db_fset apt-setup/contrib seen false
		#	db_set apt-setup/contrib false
		#	db_input low apt-setup/contrib || true
		#	db_go || continue
		#else
		#	db_set apt-setup/contrib true
		#fi
	fi

	case "$URI" in
	ftp|http)
		# Warty change: Automatically detect mirror (See: #296)
		promptpri="critical"
		if [ -e "$TMPFILE" ]; then
			# Check if we autodetected a mirror
			MIRROR="`grep "^Mirror: " "$TMPFILE" | awk '{print $2}'`"
			if [ "x$MIRROR" != "x" ]; then
				# This compare the mirror with the official list.
				# if it is an official mirror it is safe not to ask anything
				# otherwise we will ask.
				if [ "`mirror_dir $URI $MIRROR`" ]; then
					promptpri="medium"
					db_set apt-setup/hostname "$MIRROR"
					db_set apt-setup/directory "`mirror_dir $URI $MIRROR`"
				fi
			fi
		fi

	    # Warty change: skip questions if we autodetected (See: #353)
	    # NOTE: 4 spaces ident to left. I know it's hugly but it makes
	    #       things easier to merge later on
	    if [ "$promptpri" = "critical" ]; then

		# Ask them which country they're in.
		db_subst apt-setup/country countries "`country_list $URI`"
		db_fget apt-setup/country seen
		if [ "$RET" = "false" ]; then
		  # Set default country
		  db_get debian-installer/country
		  COUNTRY=$(perl -e '
			$countrycode=shift;
			open (T, "/usr/share/zoneinfo/iso3166.tab");
			while (<T>) {
				next if /^#/;
				chomp;
				($code, $long)=split(/\t/, $_);
				if ($code eq $countrycode) {
					print "$long";
				        close T;
				}
			}
			close T;
		   ' $RET)
		   if [ -n "$COUNTRY" ]; then
		     db_set apt-setup/country "$COUNTRY"
		   fi
		fi
		db_get apt-setup/country
		IFS=","
		db_set apt-setup/country $(country_i18n local "$RET")
		unset IFS
		db_get apt-setup/country
		db_fset apt-setup/country seen false
		db_input critical apt-setup/country || true
		db_go || continue

		db_get apt-setup/country
		if [ "$RET, " != "$(gettext 'enter information manually, ')" ]; then
		   IFS=","
		   db_set apt-setup/country $(country_i18n C "$RET")
		   unset IFS
		else
		   db_set apt-setup/country 'enter information manually'
		fi

		db_get apt-setup/country
		if [ "$RET" != "enter information manually" ]; then
			# Now prompt with the mirrors in the selected country.
			db_subst apt-setup/mirror mirrors "`mirror_list $URI \"$RET\"`"
			db_fset apt-setup/mirror seen false
			db_input critical apt-setup/mirror || true
			db_go || continue
			
			# Now shove the data about the mirror into some other
			# questions.
			db_get apt-setup/mirror
			MIRROR="$RET"
			db_set apt-setup/hostname $MIRROR
			db_set apt-setup/directory "`mirror_dir $URI $MIRROR`"
		else
			# They elected to enter info manually.
			# Prompt for hostname and directory the mirror is in.
			db_beginblock
			db_fset apt-setup/hostname seen false
			db_input critical apt-setup/hostname || true
			db_fset apt-setup/directory seen false
			db_input critical apt-setup/directory || true
			db_endblock
			db_go || continue
		fi
	    fi

		# Ask about a proxy if no proxy is yet defined.
		if [ "$URI" = "http" ] && [ -z "$http_proxy" ]; then
			if [ ! -e "$APTETC/apt.conf" ] || \
			   ! grep -iq 'Acquire::http::Proxy' $APTETC/apt.conf; then
				db_fset mirror/http/proxy seen false
				# Warty change: lower priority if we are autodetecting (See: #353)
				db_input $promptpri mirror/http/proxy || true
				db_go || continue
			fi
		fi
	;;
	cdrom)
		# We've already probed earlier to try to figure out the
		# cd device.
		LOOP=1
		LOOPCOUNT=5
		while [ "$LOOP" ]; do
			# Make sure the cd is unmounted, we may be prompting
			# them to change cd's.
			umount /cdrom 2>/dev/null || true
		
			# Prompt for the cd device if it wasn't autodetected.
			# TODO: We could give them a list of likely devices..
			#       This is unfriendly right now.
			if [ -z "$CDDEV" ]; then
				db_input critical apt-setup/cd/dev || true
				db_go || continue 2
				db_get apt-setup/cd/dev
				CDDEV="$RET"
				# Make /dev/cdrom link now, with device
				# they entered. This is for later use by
				# apt.
				if [ "$CDDEV" ] && [ "$CDDEV" != '/dev/cdrom' ]; then
					ln -sf $CDDEV /dev/cdrom
				fi
			fi
			
			# Now try to mount the cdrom.
			if mount $CDDEV /cdrom -o ro -t iso9660; then
				LOOP=""
				if scan_cd; then
					handle_rest_cds $CDDEV
					MAINLOOP=""
				fi
			else
				# Only loop LOOPCOUNT times.
				LOOPCOUNT=`expr $LOOPCOUNT - 1` || true
				if [ "0" -ge "$LOOPCOUNT" ]; then
					exit 1
				fi
				
				if [ "$LOOPCOUNT" = 4 ]; then
					# Display a less scary "missing CD"
					# message on the first loop.
					db_fset apt-setup/cd/missing seen false
					db_input critical apt-setup/cd/missing || true
					db_go || continue 2
				else
					# Loop and prompt again for cd device.
					db_fset apt-setup/cd/dev seen false
					CDDEV=""
				fi
			fi
		done
		continue
	;;
	
	filesystem)
		# they need to have a mirror already mounted somewhere.
		URI=file
		LOOP=1
		LOOPCOUNT=5
		while [ "$LOOP" ]; do
			db_fset apt-setup/directory seen false
			db_input critical apt-setup/directory || true
			db_go || continue 2
			db_get apt-setup/directory
			
			# A very simple mirror sanity check.
			if [ ! -d "$RET" ]; then
				db_fset apt-setup/baddir seen false
				db_input critical apt-setup/baddir || true
				db_go || true
			elif [ ! -d "$RET/dists" ]; then
				db_fset apt-setup/not-mirror seen false
				db_input critical apt-setup/not-mirror || true
				db_go || true
			else
				LOOP=''
			fi
			
			# Only try LOOPCOUNT times.
			LOOPCOUNT=`expr $LOOPCOUNT - 1` || true
			if [ "0" -ge "$LOOPCOUNT" ]; then
				exit 1
			fi
		done
	;;
	*)
		touch ${APTETC}sources.list
		cp -f ${APTETC}sources.list ${APTETC}sources.list.bak
		# Just run an editor on the sources.list file, then
		# check the result. If it fails, show the problem and loop.
		if [ -z "$EDITOR" ]; then
			EDITOR=/usr/bin/editor
		fi
		EDITOK=""
		while [ ! "$EDITOK" ]; do
			touch ${APTETC}sources.list
			$EDITOR ${APTETC}sources.list >/dev/tty </dev/tty
			tempfile=`tempfile`
			clear >/dev/tty </dev/tty
			gettext "Testing apt sources..."
			echo
			if $APTGET -o APT::Get::List-Cleanup=false -o Dir::Etc::sourcelist=${APTETC}sources.list update 2>$tempfile; then
				clear >/dev/tty </dev/tty
				EDITOK=1
			else
				clear >/dev/tty </dev/tty
				db_fset apt-setup/badedit seen false
				db_subst apt-setup/badedit apt_error `tr '\n' ' ' < $tempfile`
				db_input critical apt-setup/badedit || true
				db_go || true
				db_get apt-setup/badedit
				if [ "$RET" != "edit" ]; then
					mv -f ${APTETC}sources.list.bak ${APTETC}sources.list
					continue 2
				fi
			fi
		done
		MAINLOOP=""
		rm -f ${APTETC}sources.list.bak
		continue
	esac

	# The temporary file to use as sources.list for testing
	# new items.
	tmpsources=`tempfile`

	db_get apt-setup/hostname
	HOST="$RET"
	db_get apt-setup/directory
	DIR="$RET"
	db_get mirror/suite
	DIST="$RET"

	db_get apt-setup/non-free
	if [ "$RET" = true ]; then
		NONFREE=" restricted"
	else
		NONFREE=""
	fi
	db_get apt-setup/universe
	if [ "$RET" = true ]; then
		UNIVERSE=" universe"
	else
		UNIVERSE=""
	fi

	if [ "$URI" = ftp ] || [ "$URI" = http ]; then
		SEP=//
	else
		SEP=""
	fi
	if [ "$URI" = file ]; then
		HOST=""
	fi

	echo "deb $URI:$SEP$HOST$DIR $DIST main$NONFREE$UNIVERSE" >> $tmpsources
	SRCENTRY="deb-src $URI:$SEP$HOST$DIR $DIST main$NONFREE$UNIVERSE"

	# If there is a http proxy, make apt use it temporarily.
	db_get mirror/http/proxy
	if [ "$RET" ]; then
		PROXY_OPTS="-o Acquire::http::Proxy=\"$RET\""
	else
		PROXY_OPTS=""
	fi

	# As a final sanity check, run apt-get update, and catch the
	# return code and errors.
	tempfile=`tempfile`
	clear >/dev/tty </dev/tty
	gettext "Testing apt sources..."
	echo
	if ! $APTGET $PROXY_OPTS -o APT::Get::List-Cleanup=false -o Dir::Etc::sourcelist=$tmpsources update 2>$tempfile; then
		clear >/dev/tty </dev/tty
		# Show the user the error message and loop.
		db_subst apt-setup/badsource apt_error `tr '\n' ' ' < $tempfile`
		db_fset apt-setup/badsource seen false
		db_input critical apt-setup/badsource || true
		db_go || true
		rm -f $tempfile $tmpsources
		continue
	fi
	# Success, so add the entry to the real sources.list
	touch ${APTETC}sources.list
	echo "" >> ${APTETC}sources.list
	cat $tmpsources >> ${APTETC}sources.list
	MAINLOOP=""
	
	# Success, so add proxy information if not already present.
	db_get mirror/http/proxy
	if [ "$RET" ]; then
		touch $APTETC/apt.conf
		if ! grep -iq 'Acquire::http::Proxy' $APTETC/apt.conf; then
			echo "Acquire::http::Proxy \"$RET\";" >> $APTETC/apt.conf
		fi
	fi
	
	# We have a deb-src line to add too. Test it, see if it works. If not,
	# don't fail, just don't add it.
	echo "$SRCENTRY" > $tmpsources
	if $APTGET -o APT::Get::List-Cleanup=false -o Dir::Etc::sourcelist=$tmpsources update 2>/dev/null; then
		echo "$SRCENTRY" >> ${APTETC}sources.list
	fi
	clear >/dev/tty </dev/tty

	rm -f $tempfile $tmpsources
done

# Warty change add extra apt-lines and needs to be done outside MAINLOOP
# because cdrom installation has 2000 different exceptions.

# get mirror information
# if we are installing from cd we will get the default and on net install
# we will get the user selection

db_get apt-setup/hostname
HOST="$RET"
if [ -z "$HOST" ]; then
	HOST="archive.ubuntu.com"
fi
db_get apt-setup/directory
DIR="$RET"
db_get mirror/suite
DIST="$RET"
db_get apt-setup/non-free
if [ "$RET" = true ]; then
	NONFREE=" restricted"
else
	NONFREE=""
fi

# URI is defined only in the main loop that we do not enter always.
if [ -z "$URI" ]; then
	URI=cdrom
fi

if [ "$URI" = "cdrom" ] && ! grep -q 'ncomment the following' ${APTETC}sources.list && ! grep -q '^[^#]*$HOST' ${APTETC}sources.list; then
	LINE="http://$HOST$DIR $DIST main$NONFREE"

	COMMENT="# "
	SRCCOMMENT="# "

	db_fset apt-setup/network-updates seen false
	db_input high apt-setup/network-updates || true
	db_go || true
	db_get apt-setup/network-updates
	if [ "$RET" = true ]; then
		tmpsources=`tempfile`
		tempfile=`tempfile`
		echo "deb $LINE" > $tmpsources
		clear >/dev/tty </dev/tty
		gettext "Testing apt sources..."
		echo
		echo "" >> ${APTETC}sources.list
		if ! $APTGET -o APT::Get::List-Cleanup=false -o Dir::Etc::sourcelist=$tmpsources update 2>$tempfile; then
			# We add the lines with COMMENT since apt failed
			echo "## Uncomment the following two lines to fetch updated software from the network" >> ${APTETC}sources.list
		else
			COMMENT=""
			# checking the src too
			echo "deb-src $LINE" > $tmpsources
			clear >/dev/tty </dev/tty
			gettext "Testing apt sources..."
			echo
			if ! $APTGET -o APT::Get::List-Cleanup=false -o Dir::Etc::sourcelist=$tmpsources update 2>$tempfile; then
				SRCCOMMENT="# "
			else
				SRCCOMMENT=""
			fi
		fi

		rm -f $tmpsources $tempfile
	else
		echo >> ${APTETC}sources.list
		echo "## Uncomment the following two lines to fetch updated software from the network" >> ${APTETC}sources.list
	fi

	echo "${COMMENT}deb $LINE" >> ${APTETC}sources.list
	echo "${SRCCOMMENT}deb-src $LINE" >> ${APTETC}sources.list
fi

if ([ "$URI" = "cdrom" ] || [ "$URI" = "http" ] || [ "$URI" = "ftp" ]) && ! grep -q 'universe' ${APTETC}sources.list; then
	db_get apt-setup/universe
	echo >> ${APTETC}sources.list
	COMMENT=
	if [ "$RET" = false ]; then
		cat <<EOF >> ${APTETC}sources.list
## Uncomment the following two lines to add software from the 'universe'
## repository.
EOF
		COMMENT="# "
	fi
	cat <<EOF >> ${APTETC}sources.list
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## universe WILL NOT receive any review or updates from the Ubuntu security
## team.
${COMMENT}deb http://$HOST$DIR $DIST universe
${COMMENT}deb-src http://$HOST$DIR $DIST universe
EOF
fi

# Finally, see about adding a security.ubuntu.com entry. Deal with these
# situations:
# * already have it in sources.list
# * Add it always, if security.ubuntu.com is reachable make it available
#   otherwise add it commented out.

if apt-cache policy | grep "o=Ubuntu,a=" && \
   ! grep -q '^[^#]*security.ubuntu.com' ${APTETC}sources.list; then
	# Figure out what line to add (we're definitely going to add something,
	# even if it's just a comment).
	#
	# To determine if universe and restricted should be included, grep
	# the file to see if they are listed in it.
	#DISTS="main"
	#for dist in non-free contrib; do
	#	if grep -q '^[^#]*'$dist ${APTETC}sources.list; then
	#		DISTS="$DISTS $component"
	#	fi
	#done

	# Figure out which suite to use.
	#if apt-cache policy | grep "o=Debian,a=" | grep -q 'a=testing'; then
	#    SUITE="testing"
	#else
	#    SUITE="stable"
	#fi

	LINE="http://security.ubuntu.com/ubuntu $DIST-security main$NONFREE"

	COMMENT="# "
	SRCCOMMENT="# "

	# Now find out if they want the entry to be added. (The question
	# won't be asked at all for network installs.)
	db_get apt-setup/network-updates
	if [ "$RET" = true ]; then
		# Ask about a proxy if no proxy is yet defined.
		if [ -z "$http_proxy" ]; then
			if [ ! -e "$APTETC/apt.conf" ] || \
			   ! grep -iq 'Acquire::http::Proxy' $APTETC/apt.conf; then
				db_input medium mirror/http/proxy || true
				db_go || continue
			fi
		fi
		# Test it.
		tmpsources=`tempfile`
		echo "deb $LINE" > $tmpsources
		clear >/dev/tty </dev/tty
		gettext "Testing apt sources..."
		echo
		tempfile=`tempfile`
		if ! $APTGET -o APT::Get::List-Cleanup=false -o Dir::Etc::sourcelist=$tmpsources update 2>$tempfile; then
			# Display failure message
			clear >/dev/tty </dev/tty
			db_subst apt-setup/network-updates-failed site security.ubuntu.com
			db_subst apt-setup/network-updates-failed apt_error `tr '\n' ' ' < $tempfile`
			db_fset apt-setup/network-updates-failed seen false
			db_input medium apt-setup/network-updates-failed || true
			db_go || true
		else
			# Success. Don't comment them out.
			COMMENT=""
			echo "deb-src $LINE" > $tmpsources
			clear >/dev/tty </dev/tty
			gettext "Testing apt sources..."
			echo
			if ! $APTGET -o APT::Get::List-Cleanup=false -o Dir::Etc::sourcelist=$tmpsources update 2>$tempfile; then
				SRCCOMMENT="# "
			else
				SRCCOMMENT=""
			fi
		fi
	
		rm -f $tempfile $tmpsources
	fi

	# Now add the entry, commented out or not. (Don't add the commented
	# version if a commented version already exists.)
	if [ -z "$COMMENT" ] || ! grep -q '#.*security.ubuntu.com' ${APTETC}sources.list; then
		echo "" >>${APTETC}sources.list
		echo "${COMMENT}deb $LINE" >>${APTETC}sources.list
		echo "${SRCCOMMENT}deb-src $LINE" >>${APTETC}sources.list
	fi
fi

