199 lines
4.3 KiB
Perl
Executable File
199 lines
4.3 KiB
Perl
Executable File
#!/usr/bin/perl -w
|
|
# This file was preprocessed, do not edit!
|
|
|
|
|
|
|
|
if (exists $ENV{DEBCONF_USE_CDEBCONF} and $ENV{DEBCONF_USE_CDEBCONF} ne '') {
|
|
exec "/usr/lib/cdebconf/dpkg-reconfigure", @ARGV;
|
|
}
|
|
|
|
use strict;
|
|
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 chomp, @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],
|
|
['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 (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 (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;
|
|
}
|
|
|