blob: e6587a9fc895bd2a7d9c81f55de4d617c5155df5 [file] [log] [blame]
#!/usr/bin/perl -w
# Debconf configuration script for spamassassin
# Re-written in perl because sh sucks.
# Duncan Findlay, May 2003
use Debconf::Client::ConfModule ':all';
# Numerous bug reports were filed about the handling of old
# configuration files in /etc/spamassassin. To stem the volume of such
# reports, files should be checked against their default md5sums and
# automatically deleted if they match.
# Why is this so complicated?
# 1. I want to make the upgrade from woody as easy as possible. Thus,
# if woody's configuration files are present and unmodified, I want to
# suggest that they be deleted.
# 2. I want to try to detect if
# spamproxyd is in use, as it is not present in versions after 2.42-1
# If you can simplify this, be my guest. I'd love a patch.
my %md5sums220 = (
'10_misc.cf' => '375793c39e49fba64da80e11c759d82b',
'20_body_tests.cf' => '63a69c13b4b058461fd9a54cdb9f3018',
'20_head_tests.cf' => '716bfe7de71d7af62be88368426fa4ad',
'20_uri_tests.cf' => '0b69de24a719312768bc0e42473e7fab',
'25_body_tests_es.cf' => 'e3443e08de32c286923d42ba6c5604d0',
'25_body_tests_pl.cf' => 'a7d7783111e978e725fb7a6a3ff1ee45',
'25_head_tests_pl.cf' => 'dfcc0ea9493cd4556c89f94788d0c0c0',
'30_text_es.cf' => 'b159eee227a3fb31077740633ee284f2',
'30_text_pl.cf' => 'e80d3fd80e1fbb4aab2bd317ffdfc94f',
'40_spam_phrases.cf' => 'f8bf9b6756225376c72973c221617c70',
'50_scores.cf' => 'be92571fcad701fed8e3876c26254161',
'60_whitelist.cf' => '13fa135e93eef55704910a448a7b453f',
'65_debian.cf' => 'ae26803254c798140d6afac61c5e3d21'
);
my $command = shift;
if ($command eq "configure") {
my $version_raw = shift;
if ( !$version_raw ) {
exit 0; # not an upgrade
}
$version_raw =~ /(\d+)\.(\d+)/ or warn "Unknown version!";
my $version_maj = $1;
my $version_min = $2;
my $offer_quit = 0;
if ($version_maj <= 2 && $version_min < 40 ) {
if (check_for_spamproxyd()) {
my $ret = show_warning("upgrade/2.40w", "critical", 0);
$offer_quit = 1 if !$ret;
} else {
my $ret = show_warning("upgrade/2.40", "high", 0);
$offer_quit = 1 if !$ret;
}
}
if ($offer_quit) {
my $ret = show_warning("upgrade/cancel", "critical", 1);
if (!$ret) {
# Not showing critical? Their problem, not mine.
go();
my ($ret, $value) = get("spamassassin/upgrade/cancel");
if ($value eq "Cancel") {
stop();
exit 1; # They don't want to continue
}
}
}
if ($version_maj <= 2 && $version_min <= 42) {
if ($version_raw eq "2.20-1woody" &&
check_for_unmodified_220_files() ) {
# We want to set this to yes, but only the first time it's seen.
# If it's already been seen, leave it.
my ($ret, $value) = fget("spamassassin/upgrade/2.42u", "seen");
if ($value eq "false") {
set("spamassassin/upgrade/2.42u", "Yes");
}
show_warning("upgrade/2.42u", "medium", 0);
} elsif (check_for_old_files()) {
show_warning("upgrade/2.42m", "high", 0);
}
}
} elsif ( $command eq "reconfigure" ) {
# just offer to delete files
if ( check_for_unmodified_220_files() ) {
# We want to set this to yes, but only the first time it's seen.
# If it's already been seen, leave it.
my ($ret, $value) = fget("spamassassin/upgrade/2.42u", "seen");
if ($value eq "false") {
set("spamassassin/upgrade/2.42u", "Yes");
}
show_warning("upgrade/2.42u", "medium", 0);
} elsif (check_for_old_files()) {
show_warning("upgrade/2.42m", "high", 1);
}
}
go(); # C'mon, lets go already.
# Subroutines
sub check_for_unmodified_220_files {
foreach $file (keys %md5sums220) {
if (-e "/etc/spamassassin/$file") {
my $md5sum = `md5sum /etc/spamassassin/$file`;
my ($md5) = split (/\s/, $md5sum);
if ($md5 ne $md5sums220{$file}) {
return 0; # Files have been modified!
}
} else {
return 0; # File deleted... may be admin's choice. Better be
# safe than sorry.
}
}
return 1;
}
sub check_for_spamproxyd {
if (open (PS, 'ps ax |')) {
while (<PS>) {
if (/spamproxyd/) {
close PS;
return 1;
}
}
close PS;
} else {
warn "Can't open pipe from ps.";
}
return 0;
}
sub check_for_old_files {
my @files = glob("/etc/spamassassin/[0-6][0-9]_*.cf");
if (scalar(@files) > 0) { # files exist
return 1;
}
return 1 if -e "/etc/spamassassin/triplets.txt";
return 1 if -e "/etc/spamassassin/languages";
return 0;
}
sub show_warning {
my ($template, $severity, $reshow) = @_;
fset("spamassassin/$template", "seen", "false") if $reshow;
my ($ret) = input($severity, "spamassassin/$template");
return $ret;
}