#!/usr/bin/perl -w
# This file was preprocessed, do not edit!
my $infodir="/var/lib/dpkg/info";
use strict;
use Debconf::Db;
use Debconf::Gettext;
use Debconf::Template;
use Debconf::Config;
use Debconf::AutoSelect qw(:all);
use Debconf::Log qw(:all);
Debconf::Config->priority('low');
my $unseen_only=0;
my $all=0;
my $force=0;
my $default_priority=0;
Debconf::Config->getopt( # TODO: i18n this? What's the best way to break it up?
qq{Usage: dpkg-reconfigure [options] packages
  -a,  --all			Reconfigure all packages.
  -u,  --unseen-only		Show only not yet seen questions.
       --default-priority	Use default priority instead of low.
       --force			Force reconfiguration of broken packages.},
	"all|a"			=> \$all,
	"unseen-only|u"		=> \$unseen_only,
	"default-priority"	=> \$default_priority,
	"force"			=> \$force,
);
if ($> != 0) {
	print STDERR sprintf(gettext("%s must be run as root"), $0)."\n";
	exit 1;
}
Debconf::Db->load;
if ($default_priority) {
	Debconf::Config->priority(Debconf::Question->get('debconf/priority')->value);
}
if (lc Debconf::Config->frontend eq 'noninteractive') {
	Debconf::Config->frontend('dialog');
}
my $frontend=make_frontend();
unless ($unseen_only) {
	Debconf::Config->reshow(1);
}
my @packages;
if ($all) {
	@packages=allpackages();
	exit unless @packages;
}
else {
	@packages=@ARGV;
	if (! @packages) {
		print STDERR "$0: ".gettext("please specify a package to reconfigure")."\n";
		exit 1;
	}
}
$ENV{DEBCONF_RECONFIGURE}=1;
foreach my $pkg (@packages) {
	$frontend->default_title($pkg);
	$_=`dpkg --status $pkg`;
	my ($version)=m/Version: (.*)\n/;
	my ($status)=m/Status: (.*)\n/;
	if (! $force) {
		if (! defined $status || $status =~ m/not-installed$/) {
			print STDERR "$0: ".sprintf(gettext("%s is not installed"), $pkg)."\n";
			exit 1;
		}
		if ($status !~ m/ ok installed$/) {
			print STDERR "$0: ".sprintf(gettext("%s is broken or not fully installed"), $pkg)."\n";
			exit 1;
		}
	}
	
	Debconf::Template->load("$infodir/$pkg.templates", $pkg)
		if -e "$infodir/$pkg.templates";
	foreach my $info (['prerm',    'upgrade',     $version],
		          ['config',   'reconfigure', $version],
			  ['postinst', 'configure',   $version]) {
		my $script=shift @$info;
		next unless -x "$infodir/$pkg.$script";
		my $is_confmodule='';
		if ($script ne 'config') {
			open (IN, "<$infodir/$pkg.$script");
			while (<IN>) {
				if (/confmodule/i) {
					$is_confmodule=1;
					last;
				}
			}
			close IN;
		}
		
		if ($script eq 'config' || $is_confmodule) {
			my $confmodule=make_confmodule(
				"$infodir/$pkg.$script", @$info);
	
			$confmodule->owner($pkg);
		
			1 while ($confmodule->communicate);
	
			exit $confmodule->exitcode if $confmodule->exitcode > 0;
		}
		else {
			Debconf::Db->save;
			
			$ENV{DEBIAN_HAS_FRONTEND}='';
			my $ret=system("$infodir/$pkg.$script", @$info);
			if (int($ret / 256) != 0) {
				exit int($ret / 256);
			}
			$ENV{DEBIAN_HAS_FRONTEND}=1;
			
			Debconf::Db->load;
		}
	}
}
$frontend->shutdown;
Debconf::Db->save;
sub allpackages {
	my @ret;
	local $/="\n\n";
	
	open (STATUS, "</var/lib/dpkg/status")
		|| die sprintf(gettext("Cannot read status file: %s"), $!);
	while (<STATUS>) {
		push @ret, $1
			if m/Status:\s*.*\sinstalled\n/ && m/Package:\s*(.*)\n/;
	}
	close STATUS;
	return sort @ret;
}
