[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