[linux] 01/03: linux-image: Rewrite maintainer scripts in shell
debian-kernel at lists.debian.org
debian-kernel at lists.debian.org
Sun Jun 5 01:12:42 UTC 2016
This is an automated email from the git hooks/post-receive script.
benh pushed a commit to branch master
in repository linux.
commit e4657e0ec4a56692e3137d1a03e8821cc362a370
Author: Ben Hutchings <ben at decadent.org.uk>
Date: Sun May 29 22:41:18 2016 +0100
linux-image: Rewrite maintainer scripts in shell
Use the new linux-update-symlinks command for symlink updates.
Drop support for minimal_swap, no_symlinks, use_hard_links and *_hook
parameters in /etc/kernel-img.conf.
Thanks to Aurelien Jarno and Santiago Vila for pointing out the
ischroot command and that it's in an essential package (i.e. doesn't
add a dependency).
---
debian/changelog | 4 +
debian/templates/control.image.in | 2 +-
debian/templates/image.postinst.in | 549 ++-----------------------------------
debian/templates/image.postrm.in | 247 ++---------------
debian/templates/image.preinst.in | 85 +-----
debian/templates/image.prerm.in | 177 +++---------
6 files changed, 102 insertions(+), 962 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index 9a48bed..19af46f 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 <ben at decadent.org.uk> Sat, 04 Jun 2016 18:33:11 +0100
diff --git a/debian/templates/control.image.in b/debian/templates/control.image.in
index 3dfaf3b..ef9e759 100644
--- a/debian/templates/control.image.in
+++ b/debian/templates/control.image.in
@@ -1,6 +1,6 @@
Package: linux-image- at abiname@@localversion@
Build-Profiles: <!stage1>
-Depends: kmod, linux-base, ${misc:Depends}
+Depends: kmod, linux-base (>= 4.1~), ${misc:Depends}
Recommends: firmware-linux-free, ${kernel:Recommends}
Suggests: linux-doc- at version@, debian-kernel-handbook
Breaks: udev (<< 208-8~)
diff --git a/debian/templates/image.postinst.in b/debian/templates/image.postinst.in
index 01da283..09960b8 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
-# 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');
-}
-
-$|=1;
-
-# 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
-
-#known variables
-my $image_dest = "/";
-my $realimageloc = "/boot/";
-my $have_conffile = "";
-
-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 (<CONF>) {
- 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;
- }
+version=@abiname@@localversion@
+image_path=/boot/@image-stem at -$version
- 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 [ "$1" != configure ]; then
+ exit 0
+fi
- 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/<unknown>/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";
+# Workaround for bug #817083 - ensure debconf template is loaded now
+# so we can use it in prerm script.
+. /usr/share/debconf/confmodule
-## Run user hook script here, if any
-if ($postinst_hook) {
- &run_hook("postinst", $postinst_hook);
-}
+depmod $version
-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";
-}
+if [ -z "$2" ]; then
+ change=install
+else
+ change=upgrade
+fi
+linux-update-symlinks $change $version $image_path
-exit 0;
+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
-__END__
+exit 0
diff --git a/debian/templates/image.postrm.in b/debian/templates/image.postrm.in
index 40cca7f..1a52e7b 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 ();
-
-$|=1;
-# Predefined values:
-my $version = "@abiname@@localversion@";
-my $link_in_boot = "";
-my $kimage = "@image-stem@";
-my $postrm_hook = ''; #Normally we do not
-
-#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");
- }
- }
- }
-}
-
-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__
+#!/bin/sh -e
+
+version=@abiname@@localversion@
+image_path=/boot/@image-stem at -$version
+
+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
+
+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
+
+exit 0
diff --git a/debian/templates/image.preinst.in b/debian/templates/image.preinst.in
index aa52aa0..e723bed 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 at -$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 (<CONF>) {
- 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 aa59764..f4af3a5 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 at -$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 (<CONF>) {
- 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";
-
- ($ret,$seen) = fset ("$question", 'seen', 'false');
- die "Error setting debconf flags in $question: $seen" if $ret;
-
- $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__
+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
+
+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
+
+exit 0
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/kernel/linux.git
More information about the Kernel-svn-changes
mailing list