#!/usr/bin/perl
# This file was preprocessed, do not edit!



use warnings;
use strict;

if (exists $ENV{DEBCONF_USE_CDEBCONF} and $ENV{DEBCONF_USE_CDEBCONF} ne '') {
    exec "/usr/lib/cdebconf/dpkg-reconfigure", @ARGV;
}

use Cwd;
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 $force=0;
my $default_priority=0;
my $reload=1;
Debconf::Config->getopt(
gettext(qq{Usage: dpkg-reconfigure [options] packages
  -u,  --unseen-only		Show only not yet seen questions.
       --default-priority	Use default priority instead of low.
       --force			Force reconfiguration of broken packages.
       --no-reload		Do not reload templates. (Use with caution.)}),
	"unseen-only|u"		=> \$unseen_only,
	"default-priority"	=> \$default_priority,
	"force"			=> \$force,
	"reload!"		=> \$reload,
);

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_forced) {
	Debconf::Config->frontend('dialog');
}

my $frontend=make_frontend();

unless ($unseen_only) {
	Debconf::Config->reshow(1);
}

my @packages=@ARGV;
if (! @packages) {
	print STDERR "$0: ".gettext("please specify a package to reconfigure")."\n";
	exit 1;
}

$ENV{DEBCONF_RECONFIGURE}=1;

my %initial_triggers=map { $_ => 1 } triggers_pending();

my $original_cwd=getcwd();

foreach my $pkg (@packages) {
	$frontend->default_title($pkg);
	$frontend->info(undef);

	$_=`dpkg --status $pkg`;
	my ($version)=m/Version: (.*)\n/;
	my ($status)=m/Status: (.*)\n/;
	my ($package)=m/Package: (.*)\n/;
	my ($arch)=m/Architecture: (.*)\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;
		}
	}

	my @control_paths=`dpkg-query --control-path $pkg`;
	map { my $line = $_; chomp $line; $line } @control_paths;
	my $control_path = sub {
		my $file = shift;
		my $path = (grep { /\.\Q$file\E$/ } @control_paths)[0];
		chomp($path) if defined $path;
		return $path;
	};

	if ($reload) {
		my $templates=$control_path->('templates');
		if ($templates and -e $templates) {
			Debconf::Template->load($templates, $pkg);
		}
	}

	foreach my $info (['prerm',    'upgrade',     $version],
			  ['preinst',  'upgrade',     $version],
			  ['config',   'reconfigure', $version],
			  ['postinst', 'configure',   $version]) {
		my $script=shift @$info;
		my $path_script=$control_path->($script);

		next unless $path_script and -x $path_script;

		my $is_confmodule='';

		$ENV{DPKG_MAINTSCRIPT_PACKAGE}=$package;
		$ENV{DPKG_MAINTSCRIPT_ARCH}=$arch;
		$ENV{DPKG_MAINTSCRIPT_NAME}=$script;

		if ($script ne 'config') {
			open (my $in, "<", $path_script);
			while (<$in>) {
				if (/confmodule/i) {
					$is_confmodule=1;
					last;
				}
			}
			close $in;
		}

		chdir('/');
		if ($script eq 'config' || $is_confmodule) {
			my $confmodule=make_confmodule($path_script, @$info);

			$confmodule->owner($pkg);

			1 while ($confmodule->communicate);

			exit $confmodule->exitcode if $confmodule->exitcode > 0;
		}
		else {
			run_external($path_script, @$info);
		}
		chdir($original_cwd);
	}
}

my @new_triggers;
do {
	@new_triggers=();
	foreach my $trigpend (triggers_pending()) {
		push @new_triggers, $trigpend
			if not exists $initial_triggers{$trigpend};
	}
	if (@new_triggers) {
		chdir('/');
		run_external("dpkg", "--configure", @new_triggers);
		chdir($original_cwd);
	}
} while (@new_triggers);

$frontend->shutdown;

Debconf::Db->save;

sub run_external {
	Debconf::Db->save;

	delete $ENV{DEBIAN_HAS_FRONTEND};
	my $ret=system(@_);
	if (int($ret / 256) != 0) {
		exit int($ret / 256);
	}
	$ENV{DEBIAN_HAS_FRONTEND}=1;

	Debconf::Db->load;
}

sub triggers_pending {
	my @ret;
	local $_;

	open (my $query, '-|', 'dpkg-query', '-W',
		'-f', '${Package} ${binary:Package}\t${Triggers-Pending}\n');
	while (<$query>) {
		chomp;
		my ($pkgnames, $triggers) = split /\t/;
		if (length $triggers) {
			my ($pkg, $binpkg) = split ' ', $pkgnames;
			push @ret, (length $binpkg ? $binpkg : $pkg);
		}
	}
	close $query;

	return @ret;
}

