diff --git a/debian/changelog b/debian/changelog index 9a48bed24..19af46f8f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,6 +2,10 @@ linux (4.6-1~exp3) UNRELEASED; urgency=medium * [mips*r6*] Disable these architectures until dak recognises them as valid in the control file + * linux-image: Rewrite maintainer scripts in shell, using the new + linux-update-symlinks command (Closes: #692333, #815850). Drop support + for minimal_swap, no_symlinks, use_hard_links and *_hook parameters in + /etc/kernel-img.conf (Closes: #730073). -- Ben Hutchings Sat, 04 Jun 2016 18:33:11 +0100 diff --git a/debian/templates/control.image.in b/debian/templates/control.image.in index 3dfaf3b91..ef9e75962 100644 --- a/debian/templates/control.image.in +++ b/debian/templates/control.image.in @@ -1,6 +1,6 @@ Package: linux-image-@abiname@@localversion@ Build-Profiles: -Depends: kmod, linux-base, ${misc:Depends} +Depends: kmod, linux-base (>= 4.1~), ${misc:Depends} Recommends: firmware-linux-free, ${kernel:Recommends} Suggests: linux-doc-@version@, debian-kernel-handbook Breaks: udev (<< 208-8~) diff --git a/debian/templates/image.postinst.in b/debian/templates/image.postinst.in index 01da283b0..09960b85e 100755 --- a/debian/templates/image.postinst.in +++ b/debian/templates/image.postinst.in @@ -1,535 +1,28 @@ -#! /usr/bin/perl -# -use strict; -use warnings; -use Cwd 'abs_path'; -use POSIX (); +#!/bin/sh -e + +version=@abiname@@localversion@ +image_path=/boot/@image-stem@-$version + +if [ "$1" != configure ]; then + exit 0 +fi # Workaround for bug #817083 - ensure debconf template is loaded now # so we can use it in prerm script. -{ - use Debconf::Client::ConfModule qw(:all); - version('2.0'); -} +. /usr/share/debconf/confmodule -$|=1; +depmod $version -# Predefined values: -my $version = "@abiname@@localversion@"; -my $link_in_boot = ""; -my $no_symlink = ""; -my $do_symlink = "Yes"; # target machine defined -my $kimage = "@image-stem@"; -my $mkimage = ""; # command to generate the initrd image -my $use_hard_links = ''; # hardlinks do not work across fs boundaries -my $postinst_hook = ''; #Normally we do not -my $minimal_swap = ''; # Do not swap symlinks +if [ -z "$2" ]; then + change=install +else + change=upgrade +fi +linux-update-symlinks $change $version $image_path -#known variables -my $image_dest = "/"; -my $realimageloc = "/boot/"; -my $have_conffile = ""; +if [ -d /etc/kernel/postinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postinst.d +fi -my $CONF_LOC = '/etc/kernel-img.conf'; - -# Ignore all invocations except when called on to configure. -exit 0 unless $ARGV[0] =~ /configure/; - -my $DEBUG = 0; - -# Do some preliminary sanity checks here to ensure we actually have an -# valid image dir -chdir('/') or die "could not chdir to /:$!\n"; -die "Internal Error: ($realimageloc) is not a directory!\n" - unless -d $realimageloc; - -if (-r "$CONF_LOC" && -f "$CONF_LOC" ) { - if (open(CONF, "$CONF_LOC")) { - while () { - chomp; - s/\#.*$//g; - next if /^\s*$/; - - $do_symlink = "" if /do_symlinks\s*=\s*(no|false|0)\s*$/i; - $no_symlink = "" if /no_symlinks\s*=\s*(no|false|0)\s*$/i; - $link_in_boot = "" if /link_in_boot\s*=\s*(no|false|0)\s*$/i; - $use_hard_links = '' if /use_hard_links\s*=\s*(no|false|0)\s*$/i; - $minimal_swap = '' if /minimal_swap\s*=\s*(no|false|0)\s*$/i; - - $do_symlink = "Yes" if /do_symlinks\s*=\s*(yes|true|1)\s*$/i; - $no_symlink = "Yes" if /no_symlinks\s*=\s*(yes|true|1)\s*$/i; - $link_in_boot = "Yes" if /link_in_boot\s*=\s*(yes|true|1)\s*$/i; - $use_hard_links = "Yes" if /use_hard_links\s*=\s*(yes|true|1)\s*$/i; - $minimal_swap = 'Yes' if /minimal_swap\s*=\s*(yes|true|1)\s*$/i; - - $image_dest = "$1" if /image_dest\s*=\s*(\S+)/i; - $postinst_hook = "$1" if /postinst_hook\s*=\s*(\S+)/i; - $mkimage = "$1" if /mkimage\s*=\s*(.+)$/i; - } - close CONF; - $have_conffile = "Yes"; - } -} - - -if ($link_in_boot) { - $image_dest = $realimageloc; -} - -# Tack on at least one trainling / -$image_dest = "$image_dest/"; -$image_dest =~ s|^/*|/|o; -$image_dest =~ s|/+$|/|o; - -if (! -d "$image_dest") { - die "Expected Image Destination dir ($image_dest) to be a valid directory!\n"; -} - -# sanity -if ($do_symlink && $no_symlink) { - warn "Both do_symlinks and no_symlinks options enabled; disabling no_symlinks\n"; - $no_symlink = 0; -} - -# most of our work is done in $image_dest (nominally /) -chdir("$image_dest") or die "could not chdir to $image_dest:$!\n"; - - -die "Internal Error: Could not find image (" . $realimageloc - . "$kimage-$version)\n" unless -e $realimageloc - . "$kimage-$version"; - - -###################################################################### -###################################################################### -########### Test whether a relative symlinkwould be OK ####### -###################################################################### -###################################################################### -sub test_relative { - my %params = @_; - my $cwd; - - die "Internal Error: Missing Required paramater 'Old Dir' " - unless $params{'Old Dir'}; - die "Internal Error: Missing Required paramater New Dir' " - unless $params{'New Dir'}; - - - die "Internal Error: No such dir $params{'Old Dir'} " - unless -d $params{'Old Dir'}; - die "Internal Error: No such dir $params{'New Dir'} " - unless -d $params{'New Dir'}; - - warn "Test relative: testing $params{'Old Dir'} -> $params{'New Dir'}" - if $DEBUG; - chomp($cwd = `pwd`); - chdir ($params{'New Dir'}) or die "Could not chdir to $params{'New Dir'}:$!"; - my $ok = 0; - $params{'Old Dir'} =~ s|^/*||o; - if (-d $params{'Old Dir'} ) { - if (defined $params{'Test File'}) { - if (-e $params{'Old Dir'} . $params{'Test File'}) { - $ok = 1; - } - } else { - $ok = 1; # well, backward compatibility - } - } - chdir ($cwd) or die "Could not chdir to $params{'New Dir'}:$!"; - return $ok; -} - - -sub spath { - my %params = @_; - - die "Missing Required paramater 'Old'" unless $params{'Old'}; - die "Missing Required paramater 'New'" unless $params{'New'}; - - my @olddir = split '/', `readlink -q -m $params{'Old'}`; - my @newdir = split '/', `readlink -q -m $params{'New'}`; - my @outdir = @olddir; - - my $out = ''; - my $i; - for ($i = 0; $i <= $#olddir && $i <= $#newdir; $i++) { - $out++ if ($olddir[$i] ne $newdir[$i]); - shift @outdir unless $out; - unshift @outdir, ".." if $out; - } - if ($#newdir > $#olddir) { - for ($i=0; $i < $#newdir; $i++) { - unshift @outdir, ".."; - } - } - return join ('/', @outdir); -} - -# This routine is invoked if there is a symbolic link in place -# in $image_dest/$kimage -- so a symlink exists in the destination. -# What we are trying to determine is if we need to move the symbolic link over -# to the the .old location -sub move_p { - my $kimage = $_[0]; # Name of the symbolic link - my $image_dest = $_[1]; # The directory the links goes into - my $image_name = $_[2]; - my $src_dir = $_[3]; - my $force_move = 0; - warn "Move?: kimage=$kimage, image_dest=$image_dest, \n" . - "\timage_name=$image_name, src_dir=$src_dir" if $DEBUG; - - if ($no_symlink) { - # we do not want links, yet we have a symbolic link here! - warn "found a symbolic link in " . $image_dest . "$kimage \n" . - "even though no_symlink is defined\n" if $no_symlink; - # make sure we change this state of affairs - $force_move = 1; - return $force_move; - } - - warn "DEBUG: OK. We found symlink, and we should have a symlink here.\n" - if $DEBUG; - my $vmlinuz_target = readlink "$kimage"; - my $real_target = ''; - my $target = `readlink -q -m "${realimageloc}${kimage}-$version"`; - $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 dangling link " . - "to $real_target\n"; - $force_move = 1; - return $force_move; - } - - - warn "DEBUG: The link $kimage points to ($vmlinuz_target)\n" if $DEBUG; - warn "DEBUG: ($vmlinuz_target) is really ($real_target)\n" if $DEBUG; - my $cwd; - chomp ($cwd=`pwd`); - if ($vmlinuz_target !~ m|^/|o) { - $vmlinuz_target = $cwd . "/" . $vmlinuz_target; - $vmlinuz_target =~ s|/+|/|o; - } - $vmlinuz_target = `readlink -q -m $vmlinuz_target`; - - if ("$vmlinuz_target" ne "$target") { - warn "DEBUG: We need to handle this.\n" if $DEBUG; - if ($minimal_swap) { - warn "DEBUG: Minimal swap.\n" if $DEBUG; - if (-l "$kimage.old") { - warn "DEBUG: There is an old link at $kimage.old\n" if $DEBUG; - my $old_target = readlink "$kimage.old"; - my $real_old_target = ''; - $real_old_target=abs_path($old_target) if defined ($old_target); - - if ($real_old_target && -f "$real_old_target") { - if ($old_target !~ m|^/|o) { - $old_target = $cwd . "/" . $old_target; - $old_target =~ s|/+|/|o; - } - $old_target = `readlink -q -m $old_target`; - if ("$old_target" ne "$target") { - $force_move = 1; - warn "DEBUG: Old link ($old_target) does not point to us ($target)\n" - if $DEBUG; - } - else { # The .old points to the current - warn "$kimage.old --> $target -- doing nothing"; - $force_move = 0; - } - } - else { - warn "DEBUG: Well, the old link does not exist -- so we move\n" - if $DEBUG; - $force_move = 1; - } - } - else { - warn "DEBUG: No .old link -- OK to move\n" - if $DEBUG; - $force_move = 1; - } - } - else { - warn "DEBUG: ok, minimal swap is no-- so we move.\n" - if $DEBUG; - $force_move = 1; - } - } - else { # already have proper link - warn "$kimage($vmlinuz_target) points to $target ($real_target) -- doing nothing"; - $force_move = 0; - } - return $force_move; -} - - -# This routine moves the symbolic link around (/vmlinuz -> /vmlinuz.old) -# It pays attention to whether we should the fact whether we should be using -# hard links or not. -sub really_move_link { - my $kimage = $_[0]; # Name of the symbolic link - my $image_dest = $_[1]; # The directory the links goes into - my $image_name = $_[2]; - my $src_dir = $_[3]; - warn "really_move_link: kimage=$kimage, image_dest=$image_dest\n" . - "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG; - - # don't clobber $kimage.old quite yet - rename("$kimage", "$kimage.$$") || - die "failed to move " . $image_dest . "$kimage:$!"; - my $Old = $src_dir; - my $cwd; - - chomp($cwd=`pwd`); - if (test_relative ('Old Dir' => $Old, 'New Dir' => $cwd, - 'Test File' => "$image_name")) { - $Old =~ s|^/*||o; - } - # Special case is they are in the same dir - my $rel_path = spath('Old' => "$Old", 'New' => "$cwd" ); - $Old ="" if $rel_path =~ m/^\s*$/o; - - if ($use_hard_links =~ m/YES/i) { - if (! link("${Old}${image_name}", "$kimage")) { - rename("$kimage.$$", "$kimage"); - die("Failed to link ${Old}${image_name} to " . - "${image_dest}${kimage}.\n"); - } - } - else { - if (! symlink("${Old}${image_name}", "$kimage")) { - rename("$kimage.$$", "$kimage"); - die("Failed to symbolic-link ${Old}${image_name} to " . - "${image_dest}${kimage}.\n"); - } - } - - # Ok, now we may clobber the previous .old file - if (-l "$kimage.old" || ! -e "$kimage.old" ) { - rename("$kimage.$$", "$kimage.old"); - } - else { - warn "$kimage.old is not a symlink, not clobbering\n"; - warn "rm $kimage.$$"; - } -} - -# This routine handles a request to do symlinks, but there is no -# symlink file already there. Either we are supposed to use copy, or we are -# installing on a pristine system, or the user does not want symbolic links at -# all. We use a configuration file to tell the last two cases apart, creating -# a config file if needed. -sub handle_missing_link { - my $kimage = $_[0]; # Name of the symbolic link - my $image_dest = $_[1]; # The directory the links goes into - my $image_name = $_[2]; - my $src_dir = $_[3]; - warn "handle_missing_link: kimage=$kimage, image_dest=$image_dest\n" . - "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG; - - if ($no_symlink) { - my $ret = system("cp -a --backup=t " . $realimageloc . - "$image_name " . " $kimage"); - if ($ret) { - die("Failed to copy " . $realimageloc . "$image_name to " - . $image_dest . "$kimage .\n"); - } - } - - if (! $no_symlink && $do_symlink =~ /Yes/i) { - my $Old = $realimageloc; - my $New = $image_dest; - my $Name = "$image_name"; - my $Link_Dest = "$kimage"; - - if (test_relative ('Old Dir' => $Old, - 'New Dir' => $New, - 'Test File' => $Name)) { - $Old =~ s|^/*||o; - } - # Special case is they are in the same dir - my $rel_path = spath('Old' => "$Old", 'New' => "$New" ); - $Old ="" if $rel_path =~ m/^\s*$/o; - - symlink($Old . "$Name", "$Link_Dest") || - die("Failed to symbolic-link ${Old}$Name to $Link_Dest.\n"); - - } -} - -# This routine handles the rest of the cases, where the user has requested -# non-traditional handling, like using cp or hard links. -sub handle_non_symlinks { - my $kimage = $_[0]; # Name of the symbolic link - my $image_dest = $_[1]; # The directory the links goes into - my $image_name = $_[2]; - my $src_dir = $_[3]; - warn "handle_non_link: kimage=$kimage, image_dest=$image_dest\n" . - "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG; - - # Save the current image. We do this in all four cases - rename("$kimage", "$kimage.$$") || - die "failed to move " . $image_dest . "$kimage:$!"; - - ##,#### - # case One - #`#### - if ($no_symlink) { - # Maybe /$image_dest is on a dos system? - my $ret = system("cp -a --backup=t " . $realimageloc - . "$image_name " . "$kimage"); - if ($ret) { - if (-e "$kimage.$$") { - rename("$kimage.$$", "$kimage"); - } - die("Failed to copy " . $realimageloc . "$image_name to " - . $image_dest . "$kimage .\n"); - } - } - ##,#### - # case Two - #`#### - elsif ($use_hard_links =~ m/YES/i ) { - # Ok then. this ought to be a hard link, and hence fair game - # don't clobber $kimage.old quite yet - my $Old = $realimageloc; - my $cwd; - chomp($cwd=`pwd`); - if (test_relative ('Old Dir' => $Old, 'New Dir' => $cwd, - 'Test File' => "$image_name")) { - $Old =~ s|^/*||o; - } - # Special case is they are in the same dir - my $rel_path = spath('Old' => "$Old", 'New' => "$cwd" ); - $Old ="" if $rel_path =~ m/^\s*$/o; - - if (! link($Old . "$image_name", "$kimage")) { - rename("$kimage.$$", "$kimage"); - die("Failed to hard link " . $realimageloc . "$image_name to " - . $image_dest . "$kimage .\n"); - } - } - ##,#### - # case Three - #`#### - else { - # We just use cp - my $ret = system("cp -a --backup=t " . $realimageloc - . "$image_name " . "$kimage"); - if ($ret) { - if (-e "$kimage.$$") { - rename("$kimage.$$", "$kimage"); - } - die("Failed to copy " . $realimageloc . "$image_name to " - . $image_dest . "$kimage .\n"); - } - } - # Ok, now we may clobber the previous .old file - rename("$kimage.$$", "$kimage.old") if -e "$kimage.$$"; -} - -# This routine is responsible for setting up the symbolic links -# So, the actual kernel image lives in -# $realimageloc/$image_name (/boot/vmlinuz-2.6.12). -# This routine creates symbolic links in $image_dest/$kimage (/vmlinuz) -sub image_magic { - my $kimage = $_[0]; # Name of the symbolic link - my $image_dest = $_[1]; # The directory the links goes into - my $image_name = "$kimage-$version"; - my $src_dir = $realimageloc; - warn "image_magic: kimage=$kimage, image_dest=$image_dest\n" . - "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG; - - if (-l "$kimage") { # There is a symbolic link - warn "DEBUG: There is a symlink for $kimage\n" if $DEBUG; - my $force_move = move_p($kimage, $image_dest, $image_name, $src_dir); - - if ($force_move) { - really_move_link($kimage, $image_dest, $image_name, $src_dir); - } - } - elsif (! -e "$kimage") { - # Hmm. Pristine system? How can that be? Installing from scratch? - # Or maybe the user does not want a symbolic link here. - # Possibly they do not want a link here. (we should be in / - # here[$image_dest, really] - handle_missing_link($kimage, $image_dest, $image_name, $src_dir); - } - elsif (-e "$kimage" ) { - # OK, $kimage exists -- but is not a link - handle_non_symlinks($kimage, $image_dest, $image_name, $src_dir); - } -} - -###################################################################### -###################################################################### -###################################################################### -###################################################################### - -sub system_failure_message { - if ($? < 0) { - return "$!"; - } elsif (POSIX::WIFSIGNALED($?)) { - return sprintf('signal %d', POSIX::WTERMSIG($?)); - } else { - return sprintf('exit code %d', POSIX::WEXITSTATUS($?)); - } -} - -if (system("depmod -a -F $realimageloc/System.map-$version $version")) { - die ("depmod failed: " . system_failure_message()); -} - - -# Only change the symlinks if we are not being upgraded -if (! defined $ARGV[1] || ! $ARGV[1] || $ARGV[1] =~ m//o) { - image_magic($kimage, $image_dest); - image_magic("initrd.img", $image_dest); -} -else { - lstat($kimage); - if (! -e _) { - handle_missing_link($kimage, $image_dest, "$kimage-$version", - $realimageloc); - } - lstat("initrd.img"); - if (! -e _) { - handle_missing_link("initrd.img", $image_dest, "initrd.img-$version", - $realimageloc); - } -} - -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 ($postinst_hook) { - &run_hook("postinst", $postinst_hook); -} - -if (-d "/etc/kernel/postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "--arg=$realimageloc$kimage-$version " . - "/etc/kernel/postinst.d") && - die "Failed to process /etc/kernel/postinst.d"; -} - -exit 0; - -__END__ +exit 0 diff --git a/debian/templates/image.postrm.in b/debian/templates/image.postrm.in index 40cca7f11..1a52e7b47 100755 --- a/debian/templates/image.postrm.in +++ b/debian/templates/image.postrm.in @@ -1,218 +1,29 @@ -#! /usr/bin/perl -# -use strict; -use warnings; -use Cwd 'abs_path'; -use POSIX (); +#!/bin/sh -e -$|=1; -# Predefined values: -my $version = "@abiname@@localversion@"; -my $link_in_boot = ""; -my $kimage = "@image-stem@"; -my $postrm_hook = ''; #Normally we do not +version=@abiname@@localversion@ +image_path=/boot/@image-stem@-$version -#known variables -my $image_dest = "/"; -my $realimageloc = "/boot/"; -my $CONF_LOC = '/etc/kernel-img.conf'; +if [ -d /etc/kernel/postrm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/postrm.d +fi -chdir('/') or die "could not chdir to /:$!\n"; +if [ "$1" != upgrade ] && command -v linux-update-symlinks >/dev/null; then + linux-update-symlinks remove $version $image_path +fi +if [ "$1" = purge ]; then + for extra_file in 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; do + eval rm -f /lib/modules/$version/$extra_file + done + rmdir /lib/modules/$version +fi -if (-r "$CONF_LOC" && -f "$CONF_LOC" ) { - if (open(CONF, "$CONF_LOC")) { - while () { - 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"); - } - } - } -} - -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__ +exit 0 diff --git a/debian/templates/image.preinst.in b/debian/templates/image.preinst.in index aa52aa088..e723bed03 100755 --- a/debian/templates/image.preinst.in +++ b/debian/templates/image.preinst.in @@ -1,78 +1,15 @@ -#! /usr/bin/perl -# -use strict; -use warnings; -use POSIX (); +#!/bin/sh -e -$|=1; +version=@abiname@@localversion@ +image_path=/boot/@image-stem@-$version -# Predefined values: -my $version = "@abiname@@localversion@"; -my $kimage = "@image-stem@"; -my $preinst_hook = ''; #Normally we do not +if [ "$1" = abort-upgrade ]; then + exit 0 +fi -#known variables -my $realimageloc = "/boot/"; -my $CONF_LOC = '/etc/kernel-img.conf'; +if [ -d /etc/kernel/preinst.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/preinst.d +fi -my $modules_base = '/lib/modules'; - -die "Pre inst Internal error. Aborting." unless $version; - -exit 0 if $ARGV[0] =~ /abort-upgrade/; -exit 1 unless $ARGV[0] =~ /(install|upgrade)/; - -if (-r "$CONF_LOC" && -f "$CONF_LOC" ) { - if (open(CONF, "$CONF_LOC")) { - while () { - chomp; - s/\#.*$//g; - next if /^\s*$/; - - $preinst_hook = "$1" if /preinst_hook\s*=\s*(\S+)/i; - } - close CONF; - } -} - -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 (-x "$preinst_hook") { - &run_hook("preinst", $preinst_hook); -} -if (-d "/etc/kernel/preinst.d") { - system ("run-parts --report --exit-on-error --arg=$version" . - " --arg=$realimageloc$kimage-$version" . - " /etc/kernel/preinst.d") && - die "Failed to process /etc/kernel/preinst.d"; -} - -exit 0; - -__END__ +exit 0 diff --git a/debian/templates/image.prerm.in b/debian/templates/image.prerm.in index aa5976404..f4af3a591 100755 --- a/debian/templates/image.prerm.in +++ b/debian/templates/image.prerm.in @@ -1,149 +1,44 @@ -#! /usr/bin/perl -# -use strict; -use warnings; -use POSIX (); -use Debconf::Client::ConfModule qw(:all); -use FileHandle; -version('2.0'); -my $capb=capb("backup"); +#!/bin/sh -e -$|=1; -# Predefined values: -my $version = "@abiname@@localversion@"; -my $kimage = "@image-stem@"; -my $prerm_hook = ''; #Normally we do not -my $package_name = "linux-image-$version"; +version=@abiname@@localversion@ +image_path=/boot/@image-stem@-$version +package_name=linux-image-$version -#known variables -my $realimageloc = "/boot/"; -my $CONF_LOC = '/etc/kernel-img.conf'; - -# Variables used -my $ret=0; -my $seen=''; -my $answer=''; -my $running = ''; - -# Ignore all invocations uxcept when called on to remove -exit 0 unless ($ARGV[0] && $ARGV[0] =~ /remove/) ; - -if (-r "$CONF_LOC" && -f "$CONF_LOC" ) { - if (open(CONF, "$CONF_LOC")) { - while () { - chomp; - s/\#.*$//g; - next if /^\s*$/; - - $prerm_hook = "$1" if /prerm_hook\s*=\s*(\S+)/i; - } - close CONF; - } -} +if [ "$1" != remove ]; then + exit 0 +fi +. /usr/share/debconf/confmodule # Are we in a container? Check for $container in pid 1's environment. -sub in_container { - my $res = 0; - if (my $fh = new FileHandle('/proc/1/environ', 'r')) { - local $/ = "\0"; - $res = grep(/^container=/, <$fh>); - close($fh); - } - return $res; +in_container() { + grep -qz '^container=' /proc/1/environ } - -# Are we in in a chroot? Compare root device and inode numbers with pid 1. -sub in_chroot { - my @my_root_st = stat('/'); - my @pid1_root_st = stat('/proc/1/root'); - - return @my_root_st && @pid1_root_st && - ($my_root_st[0] != $pid1_root_st[0] || $my_root_st[1] != $pid1_root_st[1]); -} - - # Check to see if we are trying to remove a running kernel. -chop($running=`uname -r`); -if (!in_container() && !in_chroot() && $running eq $version) { - # If we can ask debconf questions, ask whether that's intended - # and abort if not. - if (exists($ENV{'DEBIAN_FRONTEND'}) && - $ENV{'DEBIAN_FRONTEND'} eq 'noninteractive') { - print STDERR "W: removing running kernel image.\n"; - } else { - my $question = "${package_name}/prerm/removing-running-kernel-$version"; +if ! in_container && ! ischroot && [ "$(uname -r)" = $version ]; then + # If we can ask debconf questions, ask whether that's intended + # and abort if not. + if [ "$DEBIAN_FRONTEND" = noninteractive ]; then + echo >&2 "W: removing running kernel image." + else + question=${package_name}/prerm/removing-running-kernel-$version + db_fset $question seen false + db_subst $question running $version + db_input critical $question + db_go + db_get $question + if [ $RET = true ]; then + echo >&2 "Aborting removal of running kernel image." + exit 1 + fi + echo >&2 "Ok, proceeding with removing running kernel image." + fi +fi - ($ret,$seen) = fset ("$question", 'seen', 'false'); - die "Error setting debconf flags in $question: $seen" if $ret; +if [ -d /etc/kernel/prerm.d ]; then + DEB_MAINT_PARAMS="$*" run-parts --report --exit-on-error --arg=$version \ + --arg=$image_path /etc/kernel/prerm.d +fi - $ret = subst("$question", 'running', "$running"); - die "Error setting debconf substitutions in $question: $seen" if $ret; - - ($ret,$seen) = input('critical', "$question"); - if ($ret && $ret != 30 ) { - die "Error setting debconf question $question: $seen"; - } - - ($ret,$seen) = go (); - if ($ret && $ret != 30 ) { - die "Error asking debconf question $question: $seen"; - } - - ($ret,$answer) = get("$question"); - die "Error retreiving answer for $question: $answer" if $ret; - - if ($answer =~ /^(y|t)/i) { - print STDERR "Aborting removal of running kernel image.\n"; - exit 1; #Operation not permitted - } - else { - print STDERR "Ok, proceeding with removing running kernel image.\n"; - } - } -} - -#Now, they have an alternate kernel which they are currently running - -chdir("/") or die "could not chdir to /:$!\n"; - -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 (-x "$prerm_hook") { - &run_hook("prerm", $prerm_hook); -} -if (-d "/etc/kernel/prerm.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "--arg=$realimageloc$kimage-$version /etc/kernel/prerm.d") && - die "Failed to process /etc/kernel/prerm.d"; -} - -exit 0; -__END__ +exit 0