linux/debian/templates/image.postrm.in

236 lines
6.3 KiB
Perl
Executable File

#! /usr/bin/perl
#
use strict;
use warnings;
use Cwd 'abs_path';
use POSIX ();
# Debconf may not be around here.
my $have_debconf = 0;
my $capb;
eval {require Debconf::Client::ConfModule;};
if ( ! $@ )
{
$have_debconf++;
import Debconf::Client::ConfModule ':all';
version('2.0');
$capb=capb("backup");
}
$|=1;
# Predefined values:
my $version = "@abiname@@localversion@";
my $link_in_boot = "";
my $kimage = "@image-stem@";
my $postrm_hook = ''; #Normally we do not
my $package_name = "linux-image-$version";
#known variables
my $image_dest = "/";
my $realimageloc = "/boot/";
my $CONF_LOC = '/etc/kernel-img.conf';
chdir('/') or die "could not chdir to /:$!\n";
if (-r "$CONF_LOC" && -f "$CONF_LOC" ) {
if (open(CONF, "$CONF_LOC")) {
while (<CONF>) {
chomp;
s/\#.*$//g;
next if /^\s*$/;
$link_in_boot = "" if /link_in_boot\s*=\s*(no|false|0)\s*$/i;
$link_in_boot = "Yes" if /link_in_boot\s*=\s*(yes|true|1)\s*$/i;
$image_dest = "$1" if /image_dest\s*=\s*(\S+)/i;
$postrm_hook = "$1" if /postrm_hook\s*=\s*(\S+)/i;
}
close CONF;
}
}
if ($link_in_boot) {
$image_dest = $realimageloc;
}
$image_dest = "$image_dest/";
$image_dest =~ s|/+$|/|o;
# The destdir may be gone by now.
if (-d "$image_dest") {
chdir("$image_dest") or die "could not chdir to $image_dest:$!\n";
}
######################################################################
######################################################################
############
######################################################################
######################################################################
sub remove_sym_link {
my $bad_image = $_[0];
warn "Removing symbolic link $bad_image \n";
warn "You may need to re-run your boot loader\n";
# Remove the dangling link
unlink "$bad_image";
}
######################################################################
######################################################################
############
######################################################################
######################################################################
sub CanonicalizePath {
my $path = join '/', @_;
my @work = split '/', $path;
my @out;
my $is_absolute;
if (@work && $work[0] eq "") { $is_absolute = 1; shift @work; }
while (@work) {
my $seg = shift @work;
if ($seg eq "." || $seg eq "") {
} elsif ($seg eq "..") {
if (@out && $out[-1] ne "..") {
pop @out;
} else {
# Leading "..", or "../..", etc.
push @out, $seg;
}
} else {
push @out, $seg;
}
}
unshift @out, "" if $is_absolute;
return join('/', @out);
}
######################################################################
######################################################################
############
######################################################################
######################################################################
# This removes dangling symlinks. What do we do about hard links? Surely a
# something with the nane $image_dest . "$kimage" ought not to be left behind?
sub image_magic {
my $kimage = $_[0];
my $image_dest = $_[1];
if (-l "$kimage") {
# There is a symbolic link
my $force_move = 0;
my $vmlinuz_target = readlink "$kimage";
my $real_target = '';
$real_target = abs_path($vmlinuz_target) if defined ($vmlinuz_target);
if (!defined($vmlinuz_target) || ! -f "$real_target") {
# what, a dangling symlink?
warn "The link " . $image_dest . "$kimage is a damaged link\n";
# Remove the dangling link
&remove_sym_link("$kimage");
}
else {
my $canonical_target = CanonicalizePath("$vmlinuz_target");
if (! -e $canonical_target) {
warn "The link " . $image_dest . "$kimage is a dangling link\n";
&remove_sym_link("$kimage");
}
}
}
}
# set the env var stem
$ENV{'STEM'} = "linux";
sub system_failure_message {
if ($? < 0) {
return "$!";
} elsif (POSIX::WIFSIGNALED($?)) {
return sprintf('signal %d', POSIX::WTERMSIG($?));
} else {
return sprintf('exit code %d', POSIX::WEXITSTATUS($?));
}
}
sub run_hook {
my $type = shift;
my $script = shift;
print STDERR "Running $script.\n";
if (system ("$script $version $realimageloc$kimage-$version")) {
die ("$script failed: " . system_failure_message());
}
}
my $options;
for (@ARGV) {
s,','\\'',g;
$options .= " '$_'";
}
$ENV{'DEB_MAINT_PARAMS'}="$options";
## Run user hook script here, if any
if ($postrm_hook) {
&run_hook("postrm", $postrm_hook);
}
if (-d "/etc/kernel/postrm.d") {
system ("run-parts --report --exit-on-error --arg=$version " .
"--arg=$realimageloc$kimage-$version " .
"/etc/kernel/postrm.d") &&
die "Failed to process /etc/kernel/postrm.d";
}
# purge initramfs and related
if ($ARGV[0] !~ /upgrade/) {
if (-f $realimageloc . "initrd.img-$version") {
unlink $realimageloc . "initrd.img-$version";
}
if (-f $realimageloc . "initrd.img-$version.bak") {
unlink $realimageloc . "initrd.img-$version.bak";
}
if (-f "/var/lib/initramfs-tools/$version") {
unlink "/var/lib/initramfs-tools/$version";
}
# check and remove damaged and dangling symlinks
image_magic($kimage, $image_dest);
image_magic($kimage . ".old", $image_dest);
image_magic("initrd.img", $image_dest);
image_magic("initrd.img.old", $image_dest);
}
# Ignore all invocations except when called on to purge.
exit 0 unless $ARGV[0] =~ /purge/;
my $ret = purge();
my @files_to_remove = qw{
modules.dep modules.isapnpmap modules.pcimap
modules.usbmap modules.parportmap
modules.generic_string modules.ieee1394map
modules.ieee1394map modules.pnpbiosmap
modules.alias modules.ccwmap modules.inputmap
modules.symbols modules.ofmap
modules.seriomap modules.*.bin
modules.softdep modules.devname
};
foreach my $extra_file (@files_to_remove) {
for (glob("/lib/modules/$version/$extra_file")) {
unlink;
}
}
if (-d "/lib/modules/$version" ) {
system ("rmdir", "/lib/modules/$version");
}
exit 0;
__END__