home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / debian / pkg / image / postinst < prev    next >
Encoding:
Text File  |  2006-07-12  |  45.2 KB  |  1,299 lines

  1. #! /usr/bin/perl
  2. #                              -*- Mode: Cperl -*-
  3. # debian.postinst ---
  4. # Author           : Manoj Srivastava ( srivasta@pilgrim.umass.edu )
  5. # Created On       : Sat Apr 27 05:55:26 1996
  6. # Created On Node  : melkor.pilgrim.umass.edu
  7. # Last Modified By : Manoj Srivastava
  8. # Last Modified On : Tue Mar 21 20:47:31 2006
  9. # Last Machine Used: glaurung.internal.golden-gryphon.com
  10. # Update Count     : 336
  11. # Status           : Unknown, Use with caution!
  12. # HISTORY          :
  13. # Description      :
  14. #
  15. #    $Id: image.postinst,v 1.125 2003/10/07 16:24:20 srivasta Exp $
  16. #
  17.  
  18. #
  19. #use strict; #for debugging
  20. use Cwd 'abs_path';
  21. use Debconf::Client::ConfModule qw(:all);
  22. version('2.0');
  23. my $capb=capb("backup");
  24.  
  25. $|=1;
  26.  
  27. # Predefined values:
  28. my $version           = "=V";
  29. my $link_in_boot      = "=IB";  # Should be empty, mostly
  30. my $no_symlink        = "=S";   # Should be empty, mostly
  31. my $reverse_symlink   = "=R";   # Should be empty, mostly
  32. my $do_symlink        = "Yes";  # target machine defined
  33. my $do_boot_enable    = "Yes";  # target machine defined
  34. my $do_bootfloppy     = "Yes";  # target machine defined
  35. my $do_bootloader     = "Yes";  # target machine defined
  36. my $move_image        = '';     # target machine defined
  37. my $kimage            = "=K";   # Should be empty, mostly
  38. my $loader            = "=L"; # lilo, silo, quik, palo, vmelilo, nettrom, arcboot or delo
  39. my $image_dir         = "=D";        # where the image is located
  40. my $clobber_modules   = '';          # target machine defined
  41. my $relative_links    = "";          # target machine defined
  42. my $initrd            = "=I";        # initrd kernel
  43. my $mkimage           = "=M";   # command to generate the initrd image
  44. my $do_initrd         = '';     # Normally we do not
  45. my $warn_initrd       = 'YES';  # Normally we do
  46. my $use_hard_links    = ''; # hardlinks do not work across fs boundaries
  47. my $postinst_hook     = '';          #Normally we do not
  48. my $postrm_hook       = '';          #Normally we do not
  49. my $preinst_hook      = '';          #Normally we do not
  50. my $prerm_hook        = '';          #Normally we do not
  51. my $minimal_swap      = '';          # Do not swap symlinks
  52. my $ignore_depmod_err = '';          # normally we do not
  53. my $relink_src_link   = 'YES'; # There is no harm in checking the link
  54. my $relink_build_link = 'YES'; # There is no harm in checking the link
  55. my $force_build_link  = '';    # There is no harm in checking the link
  56. my $official_image    = "=OF";  # only true for official images
  57. my $arch              = "=A"; #  should be same as dpkg --print-installation-architecture
  58. my $kernel_arch       = "=B";
  59. my $ramdisk           = "=MK";  # List of tools to create initial ram fs.
  60. my $initrddep         = "=MD";  # List of dependencies for such tools
  61. my $update_initramfs  = "/usr/sbin/update-initramfs";
  62. my $notifier          = "/usr/share/update-notifier/notify-reboot-required";
  63. my $package_name    = "=ST-image-$version";
  64.  
  65. $ramdisk = $update_initramfs if (-x $update_initramfs);
  66.  
  67. my $Loader          = "NoLOADER"; #
  68. $Loader             = "LILO"     if $loader =~ /^lilo/io;
  69. $Loader             = "SILO"     if $loader =~ /^silo/io;
  70. $Loader             = "QUIK"     if $loader =~ /^quik/io;
  71. $Loader             = "yaboot"   if $loader =~ /^yaboot/io;
  72. $Loader             = "PALO"     if $loader =~ /^palo/io;
  73. $Loader             = "NETTROM"  if $loader =~ /^nettrom/io;
  74. $Loader             = "VMELILO"  if $loader =~ /^vmelilo/io;
  75. $Loader             = "ZIPL"     if $loader =~ /^zipl/io;
  76. $Loader             = "ELILO"    if $loader =~ /^elilo/io;
  77. $Loader             = "ARCBOOT"  if $loader =~ /^arcboot/io;
  78. $Loader             = "DELO"     if $loader =~ /^delo/io;
  79.  
  80. # This should not point to /tmp, because of security risks.
  81. my $temp_file_name = "/var/log/$loader" . "_log.$$";
  82.  
  83. #known variables
  84. my $image_dest      = "/";
  85. my $realimageloc    = "/$image_dir/";
  86. my $have_conffile   = "";
  87. my $silent_modules  = '';
  88. my $silent_loader   = '';
  89. my $modules_base    = '/lib/modules';
  90. my $CONF_LOC        = '/etc/kernel-img.conf';
  91.  
  92. # Ignore all invocations except when called on to configure.
  93. exit 0 unless $ARGV[0] =~ /configure/;
  94.  
  95. my $DEBUG = 0;
  96.  
  97. # Do some preliminary sanity checks here to ensure we actually have an
  98. # valid image dir
  99. chdir('/')           or die "could not chdir to /:$!\n";
  100. die "Internal Error: ($image_dir) is not a directory!\n"
  101.   unless -d $image_dir;
  102.  
  103. # remove multiple leading slashes; make sure there is at least one.
  104. $realimageloc  =~ s|^/*|/|o;
  105. $realimageloc  =~ s|/+|/|o;
  106. die "Internal Error: ($realimageloc) is not a directory!\n"
  107.   unless -d $realimageloc;
  108.  
  109. if (-r "$CONF_LOC" && -f "$CONF_LOC"  ) {
  110.   if (open(CONF, "$CONF_LOC")) {
  111.     while (<CONF>) {
  112.       chomp;
  113.       s/\#.*$//g;
  114.       next if /^\s*$/;
  115.  
  116.       $do_symlink      = "" if /do_symlinks\s*=\s*(no|false|0)\s*$/ig;
  117.       $no_symlink      = "" if /no_symlinks\s*=\s*(no|false|0)\s*$/ig;
  118.       $reverse_symlink = "" if /reverse_symlink\s*=\s*(no|false|0)\s*$/ig;
  119.       $link_in_boot    = "" if /image_in_boot\s*=\s*(no|false|0)\s*$/ig;
  120.       $link_in_boot    = "" if /link_in_boot\s*=\s*(no|false|0)\s*$/ig;
  121.       $move_image      = "" if /move_image\s*=\s*(no|false|0)\s*$/ig;
  122.       $clobber_modules = '' if /clobber_modules\s*=\s*(no|false|0)\s*$/ig;
  123.       $do_boot_enable  = '' if /do_boot_enable\s*=\s*(no|false|0)\s*$/ig;
  124.       $do_bootfloppy   = '' if /do_bootfloppy\s*=\s*(no|false|0)\s*$/ig;
  125.       $relative_links  = '' if /relative_links \s*=\s*(no|false|0)\s*$/ig;
  126.       $do_bootloader   = '' if /do_bootloader\s*=\s*(no|false|0)\s*$/ig;
  127.       $do_initrd       = '' if /do_initrd\s*=\s*(no|false|0)\s*$/ig;
  128.       $warn_initrd     = '' if /warn_initrd\s*=\s*(no|false|0)\s*$/ig;
  129.       $use_hard_links  = '' if /use_hard_links\s*=\s*(no|false|0)\s*$/ig;
  130.       $silent_modules  = '' if /silent_modules\s*=\s*(no|false|0)\s*$/ig;
  131.       $silent_loader   = '' if /silent_loader\s*=\s*(no|false|0)\s*$/ig;
  132.       $minimal_swap    = '' if /minimal_swap\s*=\s*(no|false|0)\s*$/ig;
  133.       $ignore_depmod_err = '' if /ignore_depmod_err\s*=\s*(no|false|0)\s*$/ig;
  134.       $relink_src_link   = '' if /relink_src_link\s*=\s*(no|false|0)\s*$/ig;
  135.       $relink_build_link = '' if /relink_build_link\s*=\s*(no|false|0)\s*$/ig;
  136.       $force_build_link  = '' if /force_build_link\s*=\s*(no|false|0)\s*$/ig;
  137.  
  138.       $do_symlink      = "Yes" if /do_symlinks\s*=\s*(yes|true|1)\s*$/ig;
  139.       $no_symlink      = "Yes" if /no_symlinks\s*=\s*(yes|true|1)\s*$/ig;
  140.       $reverse_symlink = "Yes" if /reverse_symlinks\s*=\s*(yes|true|1)\s*$/ig;
  141.       $link_in_boot    = "Yes" if /image_in_boot\s*=\s*(yes|true|1)\s*$/ig;
  142.       $link_in_boot    = "Yes" if /link_in_boot\s*=\s*(yes|true|1)\s*$/ig;
  143.       $move_image      = "Yes" if /move_image\s*=\s*(yes|true|1)\s*$/ig;
  144.       $clobber_modules = "Yes" if /clobber_modules\s*=\s*(yes|true|1)\s*$/ig;
  145.       $do_boot_enable  = "Yes" if /do_boot_enable\s*=\s*(yes|true|1)\s*$/ig;
  146.       $do_bootfloppy   = "Yes" if /do_bootfloppy\s*=\s*(yes|true|1)\s*$/ig;
  147.       $do_bootloader   = "Yes" if /do_bootloader\s*=\s*(yes|true|1)\s*$/ig;
  148.       $relative_links  = "Yes" if /relative_links\s*=\s*(yes|true|1)\s*$/ig;
  149.       $do_initrd       = "Yes" if /do_initrd\s*=\s*(yes|true|1)\s*$/ig;
  150.       $warn_initrd     = "Yes" if /warn_initrd\s*=\s*(yes|true|1)\s*$/ig;
  151.       $use_hard_links  = "Yes" if /use_hard_links\s*=\s*(yes|true|1)\s*$/ig;
  152.       $silent_modules  = 'Yes' if /silent_modules\s*=\s*(yes|true|1)\s*$/ig;
  153.       $silent_loader   = 'Yes' if /silent_loader\s*=\s*(yes|true|1)\s*$/ig;
  154.       $minimal_swap    = 'Yes' if /minimal_swap\s*=\s*(yes|true|1)\s*$/ig;
  155.       $ignore_depmod_err = 'Yes' if /ignore_depmod_err\s*=\s*(yes|true|1)\s*$/ig;
  156.       $relink_src_link   = 'Yes' if /relink_src_link\s*=\s*(yes|true|1)\s*$/ig;
  157.       $relink_build_link = 'Yes' if /relink_build_link\s*=\s*(yes|true|1)\s*$/ig;
  158.       $force_build_link = 'Yes' if /force_build_link\s*=\s*(yes|true|1)\s*$/ig;
  159.  
  160.       $image_dest      = "$1"  if /image_dest\s*=\s*(\S+)/ig;
  161.       $postinst_hook   = "$1"  if /postinst_hook\s*=\s*(\S+)/ig;
  162.       $postrm_hook     = "$1"  if /postrm_hook\s*=\s*(\S+)/ig;
  163.       $preinst_hook    = "$1"  if /preinst_hook\s*=\s*(\S+)/ig;
  164.       $prerm_hook      = "$1"  if /prerm_hook\s*=\s*(\S+)/ig;
  165.       $mkimage         = "$1"  if /mkimage\s*=\s*(.+)$/ig;
  166.       $ramdisk         = "$1"  if /ramdisk\s*=\s*(.+)$/ig;
  167.     }
  168.     close CONF;
  169.     $have_conffile = "Yes";
  170.   }
  171. }
  172.  
  173.  
  174.  
  175. # For some versions of kernel-package, we had this warning in the
  176. # postinst, but the rules did not really interpolate the value in.
  177. # Here is a sanity check.
  178. my $pattern = "=" . "I";
  179. $initrd=~ s/^$pattern$//;
  180.  
  181. if ($link_in_boot) {
  182.   $image_dest = "/$image_dir/";
  183.   $image_dest =~ s|^/*|/|o;
  184. }
  185.  
  186. $image_dest = "$image_dest/";
  187. $image_dest =~ s|/+$|/|o;
  188.  
  189. if (! -d "$image_dest") {
  190.   die "Expected Image Destination dir ($image_dest) to be a valid directory!\n";
  191. }
  192.  
  193. # sanity
  194. if (!($do_bootfloppy || $do_bootloader)) {
  195.   $do_boot_enable = '';
  196. }
  197. if ($do_symlink && $no_symlink) {
  198.   warn "Both do_symlinks and no_symlinks options enabled; disabling no_symlinks\n";
  199.   $no_symlink = 0;
  200. }
  201.  
  202. # Official powerpc images may silently upgrade
  203. if ($official_image =~ /^\s*YES\s*$/o && $arch =~ m/powerpc/) {
  204.   $silent_modules = 'Yes';
  205. }
  206.  
  207.  
  208.  
  209. # most of our work is done in $image_dest (nominally /)
  210. chdir("$image_dest") or die "could not chdir to $image_dest:$!\n";
  211.  
  212. # Paranoid check to make sure that the correct value is put in there
  213. if    (! $kimage)                 { $kimage = "vmlinuz"; } # Hmm. empty
  214. elsif ($kimage =~ m/^b?zImage$/o) { $kimage = "vmlinuz"; } # these produce vmlinuz
  215. elsif ($kimage =~ m/^[iI]mage$/o) { my $nop = $kimage;   }
  216. elsif ($kimage =~ m/^vmlinux$/o)  { my $nop = $kimage;   }
  217. else                              { $kimage = "vmlinuz"; } # Default
  218.  
  219. $ENV{KERNEL_ARCH}=$kernel_arch if $kernel_arch;
  220.  
  221.  
  222. die "Internal Error: Could not find image (" . $realimageloc
  223.   . "$kimage-$version)\n" unless -e $realimageloc
  224.   . "$kimage-$version";
  225.  
  226. # search for the boot loader in the path
  227. my $loader_exec;
  228. ($loader_exec = $loader)  =~ s|.*/||;
  229. my ($loaderloc) = grep -x, map "$_/$loader_exec",
  230.   map { length($_) ? $_ : "." }  split /:/, $ENV{PATH};
  231.  
  232.  
  233. ######################################################################
  234. ## Fix the build link
  235. ######################################################################
  236. sub fix_build_link {
  237.   return unless -d "$modules_base/$version";
  238.   # if we saved a build link in preinst, restore the link
  239.   if (! -e "$modules_base/$version/build" && 
  240.       -l "$modules_base/$version/build.save" ) {
  241.     rename("$modules_base/$version/build.save", "$modules_base/$version/build") ||
  242.       die "failed to move $modules_base/$version/build:$!";
  243.   }
  244.   if ($relink_build_link || $force_build_link) {
  245.     my $build_target;
  246.     my $real_target = '';
  247.     if (-l "$modules_base/$version/build") {
  248.       $build_target = readlink "$modules_base/$version/build";
  249.     } else {
  250.       return;
  251.     }
  252.     # Determine what the real file name is, and test that for existence
  253.     $real_target = abs_path($build_target) if defined($build_target);
  254.     if (!defined($build_target) || ! -d "$real_target") { # Danglink link
  255.       warn qq(
  256.  Hmm. There is a symbolic link $modules_base/$version/build
  257.  However, I can not read it: $!
  258.  Therefore, I am deleting $modules_base/$version/build\n
  259. );
  260.       my $num = unlink "$modules_base/$version/build";
  261.       if ($num != 1) {
  262.         warn "error unlinking $modules_base/$version/build";
  263.       } else {
  264.         if ($force_build_link || -d "/usr/src/=ST-headers-$version") {
  265.           my $result = symlink ("/usr/src/=ST-headers-$version",
  266.                                 "$modules_base/$version/build");
  267.           if (! $result) {
  268.             warn "Could not link /usr/src/=ST-headers-$version to $modules_base/$version/build:$!"
  269.           }
  270.         }
  271.       }
  272.     }
  273.   }
  274. }
  275.  
  276. if ($relink_build_link || $force_build_link) {
  277.   &fix_build_link();
  278. }
  279. ######################################################################
  280. ## Fix the source link
  281. ######################################################################
  282. sub fix_source_link {
  283.   return unless -d "$modules_base/$version";
  284.   if ($relink_src_link) {
  285.     my $source_target;
  286.     my $real_target = '';
  287.  
  288.     if (-l "$modules_base/$version/source") {
  289.       $source_target = readlink "$modules_base/$version/source";
  290.     } else {
  291.       return;
  292.     }
  293.     # Determine what the real file name is, and test that for existence
  294.     $real_target = abs_path($source_target) if defined($source_target);
  295.     if (!defined($source_target) || ! -d "$real_target") { # Danglink link
  296.       warn qq(
  297.  Hmm. The package shipped with a symbolic link $modules_base/$version/source
  298.  However, I can not read the target: $!
  299.  Therefore, I am deleting $modules_base/$version/source\n
  300. );
  301.       my $num = unlink "$modules_base/$version/source";
  302.       if ($num != 1) {
  303.         warn "error unlinking $modules_base/$version/source";
  304.       }
  305.     }
  306.   }
  307. }
  308.  
  309. if ($relink_src_link) {
  310.   &fix_source_link();
  311. }
  312. ######################################################################
  313. ######################################################################
  314. ###########        Test whether a relative symlinkwould be OK #######
  315. ######################################################################
  316. ######################################################################
  317. sub test_relative {
  318.   my %params = @_;
  319.   my $cwd;
  320.  
  321.   die "Internal Error: Missing Required paramater 'Old Dir' "
  322.     unless $params{'Old Dir'};
  323.   die "Internal Error: Missing Required paramater New Dir' "
  324.     unless $params{'New Dir'};
  325.  
  326.  
  327.   die "Internal Error: No such dir $params{'Old Dir'} "
  328.     unless -d $params{'Old Dir'};
  329.   die "Internal Error: No such dir $params{'New Dir'} "
  330.     unless -d $params{'New Dir'};
  331.  
  332.   warn "Test relative: testing $params{'Old Dir'} -> $params{'New Dir'}"
  333.     if $DEBUG;
  334.   chomp($cwd = `pwd`);
  335.   chdir ($params{'New Dir'}) or die "Could not chdir to $params{'New Dir'}:$!";
  336.   my $ok = 0;
  337.   $params{'Old Dir'}  =~ s|^/*||o;
  338.   if (-d $params{'Old Dir'} ) {
  339.     if (defined $params{'Test File'}) {
  340.       if (-e $params{'Old Dir'} . $params{'Test File'}) {
  341.         $ok  = 1;
  342.       }
  343.     } else {
  344.       $ok = 1;                  # well, backward compatibility
  345.     }
  346.   }
  347.   chdir ($cwd) or die "Could not chdir to $params{'New Dir'}:$!";
  348.   return $ok;
  349. }
  350.  
  351. ######################################################################
  352. ######################################################################
  353. ############
  354. ######################################################################
  355. ######################################################################
  356. sub CanonicalizePath {
  357.   my $path = join '/', @_;
  358.   my @work = split '/', $path;
  359.   my @out;
  360.   my $is_absolute;
  361.  
  362.   if (@work && $work[0] eq "") {
  363.     $is_absolute = 1; shift @work;
  364.   }
  365.  
  366.   while (@work) {
  367.     my $seg = shift @work;
  368.     if ($seg eq "." || $seg eq "") {
  369.     } elsif ($seg eq "..") {
  370.       if (@out && $out[-1] ne "..") {
  371.         pop @out;
  372.       } else {
  373.         # Leading "..", or "../..", etc.
  374.         push @out, $seg;
  375.       }
  376.     } else {
  377.       push @out, $seg;
  378.     }
  379.   }
  380.  
  381.   unshift @out, "" if $is_absolute;
  382.   return join('/', @out);
  383. }
  384. ######################################################################
  385. ######################################################################
  386. ############
  387. ######################################################################
  388. ######################################################################
  389.  
  390. sub spath {
  391.   my %params = @_;
  392.  
  393.   die "Missing Required paramater 'Old'" unless $params{'Old'};
  394.   die "Missing Required paramater 'New'" unless  $params{'New'};
  395.  
  396.   my @olddir  = split '/', CanonicalizePath $params{'Old'};
  397.   my @newdir  = split '/', CanonicalizePath $params{'New'};
  398.   my @outdir  = @olddir;
  399.  
  400.   my $out = '';
  401.   my $i;
  402.   for ($i = 0; $i <= $#olddir && $i <= $#newdir; $i++) {
  403.     $out++ if ($olddir[$i] ne $newdir[$i]);
  404.     shift @outdir unless $out;
  405.     unshift @outdir, ".." if $out;
  406.   }
  407.   if ($#newdir > $#olddir) {
  408.     for ($i=$#olddir; $i < $#newdir; $i++) {
  409.       unshift @outdir, "..";
  410.     }
  411.   }
  412.   return join ('/', @outdir);
  413. }
  414. ######################################################################
  415. ######################################################################
  416. ############
  417. ######################################################################
  418. ######################################################################
  419.  
  420.  
  421. # This routine actually moves the kernel image
  422. # From: $realimageloc/$kimage-$version (/boot/vmlinuz-2.6.12)
  423. # To:   $image_dest/$kimage-$version   (/vmlinuz-2.6.12)
  424. # Note that the image is moved to a versioned destination, but ordinary
  425. # symlinks we create otherwise are not normally versioned
  426. sub really_move_image {
  427.   my $src_dir  = $_[0];
  428.   my $target   = $_[1];
  429.   my $dest_dir = $_[2];
  430.  
  431.   warn "Really move image: src_dir=$src_dir, target=$target,\n destdir=$dest_dir"
  432.     if $DEBUG;
  433.   if (-e "$target") {
  434.     # we should be in dir $dest_dir == $image_dest /, normally
  435.     rename("$target", "$target.$$") ||
  436.       die "failed to move " . $dest_dir . "$target:$!";
  437.     warn "mv $target $target.$$" if $DEBUG;
  438.   }
  439.   warn "mv -f $src_dir$target $target" if $DEBUG;
  440.   my $ret = system("mv -f " . $src_dir . "$target " .
  441.                    " $target");
  442.   if ($ret) {
  443.     die("Failed to move " . $src_dir . "$target to "
  444.         . $dest_dir . "$target.\n");
  445.   }
  446.   # Ok, now we may clobber the previous .old files
  447.   if (-e "$target.$$") {
  448.     rename("$target.$$", "$target.old") ||
  449.       die "failed to move " . $dest_dir . "$target:$!";
  450.     warn "mv $target.$$ $target " if $DEBUG;
  451.   }
  452. }
  453.  
  454. # Normally called after really_move_image; and only called if we asked for 
  455. # reversed link this routine reverses the symbolic link that is notmally 
  456. # created. Since the real kernel image has been moved over to 
  457. # $image_dest/$kimage-$version. So, this routine links
  458. # From:   $image_dest/$kimage-$version   (/vmlinuz-2.6.12)
  459. # To:     $realimageloc/$kimage-$version (/boot/vmlinuz-2.6.12)
  460. sub really_reverse_link {
  461.   my $src_dir    = $_[0];
  462.   my $link_name  = $_[1];
  463.   my $dest_dir   = $_[2];
  464.   warn "Really reverse link: src_dir=$src_dir, link name=$link_name\n" .
  465.     "\tdestdir=$dest_dir" if $DEBUG;
  466.  
  467.   my $Old = $dest_dir;
  468.   if (test_relative ('Old Dir' => $Old, 'New Dir' => $src_dir,
  469.                      'Test File' => "$link_name")) {
  470.     $Old   =~ s|^/*||o;
  471.   } elsif ($relative_links) {
  472.     $Old = spath('Old' => "$Old", 'New' => "$src_dir" );
  473.   }
  474.   if ($use_hard_links =~ m/YES/i) {
  475.     link($Old . "$link_name", $src_dir . "$link_name") ||
  476.       die("Failed to symbolic-link " . $dest_dir . "$link_name to " . $src_dir
  477.           . "$link_name .\n");
  478.     warn "ln " . $Old . "$link_name " . $src_dir . "$link_name"  if $DEBUG;
  479.   }
  480.   else {
  481.     symlink($Old . "$link_name", $src_dir . "$link_name") ||
  482.       die("Failed to link " . $dest_dir . "$link_name to " . $src_dir . 
  483.           "$link_name .\n");
  484.     warn "ln -s " . $Old . "$link_name " . $src_dir . "$link_name" if $DEBUG;
  485.   }
  486. }
  487.  
  488. # This routine is invoked if there is a symbolic link in place
  489. # in $image_dest/$kimage -- so a symlink exists in the destination.
  490. # What we are trying to determine is if we need to move the symbolic link over
  491. # to the the .old location
  492. sub move_p {
  493.   my $kimage     = $_[0];       # Name of the symbolic link
  494.   my $image_dest = $_[1];       # The directory the links goes into
  495.   my $image_name = $_[2]; 
  496.   my $src_dir    = $_[3]; 
  497.   my $force_move = 0;
  498.   warn "Move?: kimage=$kimage, image_dest=$image_dest, \n" .
  499.     "\timage_name=$image_name, src_dir=$src_dir" if $DEBUG;
  500.  
  501.   if ($no_symlink || $reverse_symlink) {
  502.     # we do not want links, yet we have a symbolic link here!
  503.     warn "found a symbolic link in " . $image_dest . "$kimage \n" .
  504.       "even though no_symlink is defined\n" if $no_symlink;
  505.     warn "found a symbolic link in " . $image_dest . "$kimage \n" .
  506.       "even though reverse_symlink is defined\n" if $reverse_symlink;
  507.     # make sure we change this state of affairs
  508.     $force_move = 1;
  509.     return $force_move;
  510.   }
  511.  
  512.   warn "DEBUG: OK. We found symlink, and we should have a symlink here.\n"
  513.     if $DEBUG;
  514.   my $vmlinuz_target = readlink "$kimage";
  515.   my $real_target = '';
  516.   my $target = CanonicalizePath("$realimageloc" . "$kimage-$version");
  517.   $real_target = abs_path($vmlinuz_target) if defined($vmlinuz_target);
  518.  
  519.   if (!defined($vmlinuz_target) || ! -f "$real_target") {
  520.     # what, a dangling symlink?
  521.     warn "The link "  . $image_dest . "$kimage is a dangling link" .
  522.       "to $real_target\n";
  523.     $force_move = 1;
  524.     return $force_move;
  525.   }
  526.  
  527.  
  528.   warn "DEBUG: The link $kimage points to ($vmlinuz_target)\n" if $DEBUG;
  529.   warn "DEBUG: ($vmlinuz_target) is really ($real_target)\n" if $DEBUG;
  530.   my $cwd;
  531.   chomp ($cwd=`pwd`);
  532.   if ($vmlinuz_target !~ m|^/|o) {
  533.     $vmlinuz_target = $cwd . "/" . $vmlinuz_target;
  534.     $vmlinuz_target =~ s|/+|/|o;
  535.   }
  536.   $vmlinuz_target = CanonicalizePath($vmlinuz_target);
  537.  
  538.   if ("$vmlinuz_target" ne "$target") {
  539.     warn "DEBUG: We need to handle this.\n" if $DEBUG;
  540.     if ($minimal_swap) {
  541.       warn "DEBUG: Minimal swap.\n" if $DEBUG;
  542.       if (-l "$kimage.old") {
  543.         warn "DEBUG: There is an old link at $kimage.old\n" if $DEBUG;
  544.         my $old_target = readlink "$kimage.old";
  545.         my $real_old_target = '';
  546.         $real_old_target=abs_path($old_target) if defined ($old_target);
  547.  
  548.         if ($real_old_target  && -f "$real_old_target") {
  549.           if ($old_target !~ m|^/|o) {
  550.             $old_target = $cwd . "/" . $old_target;
  551.             $old_target =~ s|/+|/|o;
  552.           }
  553.           $old_target = CanonicalizePath($old_target);
  554.           if ("$old_target"  ne "$target") {
  555.             $force_move = 1;
  556.             warn "DEBUG: Old link ($old_target) does not point to us ($target)\n"
  557.               if $DEBUG;
  558.           } 
  559.           else {            # The .old points to the current
  560.             warn "$kimage.old --> $target -- doing nothing";
  561.             $force_move = 0;
  562.           }
  563.         } 
  564.         else { 
  565.           warn "DEBUG: Well, the old link does not exist -- so we move\n"
  566.             if $DEBUG;
  567.           $force_move = 1;
  568.         }
  569.       } 
  570.       else {
  571.         warn "DEBUG: No .old link -- OK to move\n"
  572.           if $DEBUG;
  573.         $force_move = 1;
  574.       }
  575.     } 
  576.     else {
  577.       warn "DEBUG: ok, minimal swap is no-- so we move.\n"
  578.         if $DEBUG;
  579.       $force_move = 1;
  580.     }
  581.   }
  582.   else {                  # already have proper link
  583.     warn "$kimage($vmlinuz_target) points to $target ($real_target) -- doing nothing";
  584.     $force_move = 0;
  585.   }
  586.   return $force_move;
  587. }
  588.  
  589.  
  590. # This routine moves the symbolic link around (/vmlinuz -> /vmlinuz.old)
  591. # It pays attention to whether we should the fact whether we should be using
  592. # hard links or not.
  593. sub really_move_link {
  594.   my $kimage     = $_[0];       # Name of the symbolic link
  595.   my $image_dest = $_[1];       # The directory the links goes into
  596.   my $image_name = $_[2]; 
  597.   my $src_dir    = $_[3]; 
  598.   warn "really_move_link: kimage=$kimage, image_dest=$image_dest\n" .
  599.     "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG;
  600.  
  601.   # don't clobber $kimage.old quite yet
  602.   rename("$kimage", "$kimage.$$") ||
  603.     die "failed to move " . $image_dest . "$kimage:$!";
  604.   warn "mv $kimage $kimage.$$" if $DEBUG;
  605.   my $Old = $src_dir;
  606.   my $cwd;
  607.  
  608.   chomp($cwd=`pwd`);
  609.   if (test_relative ('Old Dir' => $Old, 'New Dir' => $cwd,
  610.                      'Test File' => "$image_name")) {
  611.     $Old   =~ s|^/*||o;
  612.   }
  613.   elsif ($relative_links) {
  614.     $Old = spath('Old' => "$Old", 'New' => $cwd);
  615.   }
  616.   if ($use_hard_links =~ m/YES/i) {
  617.     warn "ln " . $Old . "$image_name " . "$kimage" if $DEBUG;
  618.     if (! link($Old . "$image_name", "$kimage")) {
  619.       rename("$kimage.$$", "$kimage");
  620.       die("Failed to link " . $realimageloc .
  621.           "$image_name to "  . $image_dest . "$kimage .\n");
  622.     }
  623.   } 
  624.   else {
  625.     warn "ln -s " . $Old . "$image_name " . "$kimage" if $DEBUG;
  626.     if (! symlink($Old . "$image_name", "$kimage")) {
  627.       rename("$kimage.$$", "$kimage");
  628.       die("Failed to symbolic-link " . $realimageloc .
  629.           "$image_name to " . $image_dest . "$kimage .\n");
  630.     }
  631.   }
  632.  
  633.   # Ok, now we may clobber the previous .old file
  634.   if (-l "$kimage.old" || ! -e "$kimage.old" ) {
  635.     rename("$kimage.$$", "$kimage.old");
  636.     warn "mv $kimage.$$ $kimage.old" if $DEBUG;
  637.   }
  638.   else {
  639.     warn "$kimage.old is not a symlink, not clobbering\n";
  640.     warn "rm $kimage.$$";
  641.     unlink "$kimage.$$" if $DEBUG;
  642.   }
  643. }
  644.  
  645. # This routine handles a request to do symlinks, but there is no
  646. # symlink file already there.  Either we are supposed to use copy, or we are
  647. # installing on a pristine system, or the user does not want symbolic links at
  648. # all.  We use a configuration file to tell the last two cases apart, creating
  649. # a config file if needed.
  650. sub handle_missing_link {
  651.   my $kimage     = $_[0];       # Name of the symbolic link
  652.   my $image_dest = $_[1];       # The directory the links goes into
  653.   my $image_name = $_[2]; 
  654.   my $src_dir    = $_[3]; 
  655.   warn "handle_missing_link: kimage=$kimage, image_dest=$image_dest\n" .
  656.     "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG;
  657.  
  658.   if ($no_symlink) {
  659.     warn "cp -a --backup=t $realimageloc$image_name $kimage" if $DEBUG;
  660.     my $ret = system("cp -a --backup=t " . $realimageloc .
  661.                      "$image_name "   . " $kimage");
  662.     if ($ret) {
  663.       die("Failed to copy " . $realimageloc . "$image_name to "
  664.           . $image_dest . "$kimage .\n");
  665.     }
  666.   } 
  667.   elsif ($reverse_symlink) {
  668.     warn "mv -f $realimageloc$image_name $kimage" if $DEBUG;
  669.     my $ret = system("mv -f " . $realimageloc . "$image_name "
  670.                      . "$kimage");
  671.     if ($ret) {
  672.       die("Failed to move " . $realimageloc . "$image_name to "
  673.           . $image_dest . "$kimage .\n");
  674.     }
  675.   } 
  676.   else {
  677.     if (! $have_conffile) {
  678.       my $ret;
  679.       my $answer='';
  680.       $do_symlink = "Yes";
  681.       my $question = "${package_name}/postinst/create-kimage-link-$version";
  682.  
  683.       ($ret,$answer) = get("$question");
  684.       die "Error retreiving answer for $question: $answer" if $ret;
  685.  
  686.       $answer =~ s/^\s+//;
  687.       $answer =~ s/\s+$//;
  688.       $do_symlink = "No" if $answer =~ /^(f|n)/i;
  689.         
  690.       if (open(CONF, ">$CONF_LOC")) {
  691.         print CONF "# Kernel Image management overrides\n";
  692.         print CONF "# See kernel-img.conf(5) for details\n";
  693.         if ($loader =~ /palo/i) {
  694.           print CONF "link_in_boot = Yes\n";
  695.           print CONF "do_symlinks = Yes\n";
  696.           print CONF "relative_links = Yes\n";
  697.           print CONF "do_bootloader = No\n";
  698.         } else {
  699.           print CONF "do_symlinks = $do_symlink\n";
  700.         }
  701.         close CONF;
  702.       }
  703.       $have_conffile = "Yes";
  704.     }
  705.   }
  706.  
  707.   if (! $no_symlink && $do_symlink =~ /Yes/i) {
  708.     if ($reverse_symlink) {
  709.       my $Old = $image_dest;
  710.       if (test_relative ('Old Dir' => $Old,
  711.                          'New Dir' => $realimageloc,
  712.                          'Test File' => "$kimage")) {
  713.         $Old   =~ s|^/*||o;
  714.       } elsif ($relative_links) {
  715.         $Old = spath('Old' => "$Old", 'New' => $realimageloc);
  716.       }
  717.       symlink($Old . "$kimage", $realimageloc . "$image_name")
  718.         || die("Failed to symbolic-link " . $realimageloc
  719.                . "$image_name to " . $image_dest . "$kimage .\n");
  720.       warn "ln -s " . $Old . "$kimage " . $realimageloc . "$image_name" if $DEBUG;
  721.     }
  722.     else {
  723.       my $Old = $realimageloc;
  724.       if (test_relative ('Old Dir' => $Old,
  725.                          'New Dir' => $image_dest,
  726.                          'Test File' => "$image_name")) {
  727.         $Old   =~ s|^/*||o;
  728.       } elsif ($relative_links) {
  729.         $Old = spath('Old' => "$Old", 'New' => $image_dest);
  730.       }
  731.       symlink($Old . "$image_name", "$kimage") ||
  732.         die("Failed to symbolic-link " . $realimageloc
  733.             . "$image_name to "  . $image_dest . "$kimage .\n");
  734.       warn "ln -s " . $Old . "$image_name " . "$kimage" if $DEBUG;
  735.     }
  736.   }
  737. }
  738.  
  739. # This routine handles the rest of the cases, where the user has requested 
  740. # non-traditional handling, like using cp, or reverse symlinks, or hard links.
  741. sub handle_non_symlinks {
  742.   my $kimage     = $_[0];       # Name of the symbolic link
  743.   my $image_dest = $_[1];       # The directory the links goes into
  744.   my $image_name = $_[2]; 
  745.   my $src_dir    = $_[3]; 
  746.   warn "handle_non_link: kimage=$kimage, image_dest=$image_dest\n" .
  747.     "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG;
  748.  
  749.   # Save the current image. We do this in all four cases
  750.   rename("$kimage", "$kimage.$$") || 
  751.     die "failed to move " . $image_dest . "$kimage:$!";
  752.   warn "mv $kimage $kimage.$$" if $DEBUG;
  753.  
  754.   ##,#### 
  755.   # case One
  756.   #`####
  757.   if ($no_symlink) {
  758.     # Maybe /$image_dest is on a dos system?
  759.     warn "cp -a --backup=t $realimageloc$image_name $kimage" if $DEBUG;
  760.     my $ret = system("cp -a --backup=t " . $realimageloc
  761.                      . "$image_name " . "$kimage");
  762.     if ($ret) {
  763.       if (-e "$kimage.$$") {
  764.         rename("$kimage.$$", "$kimage");
  765.         warn "mv $kimage.$$ $kimage" if $DEBUG;
  766.       }
  767.       die("Failed to copy " . $realimageloc . "$image_name to "
  768.           . $image_dest . "$kimage .\n");
  769.     }
  770.   }
  771.   ##,#### 
  772.   # case Two
  773.   #`####
  774.   elsif ($reverse_symlink) {  # Maybe /$image_dest is on a dos system?
  775.     warn "mv -f  $realimageloc$image_name $kimage" if $DEBUG;
  776.     my $ret = system("mv -f " . $realimageloc . "$image_name "
  777.                      . $image_dest . "$kimage");
  778.     if ($ret) {
  779.       if (-e "$kimage.$$") {
  780.         rename("$kimage.$$", "$kimage");
  781.         warn "mv $kimage.$$ $kimage" if $DEBUG;
  782.       }
  783.       die("Failed to move " . $realimageloc . "$image_name to "
  784.           . $image_dest . "$kimage .\n");
  785.     }
  786.     my $Old = $image_dest;
  787.     if (test_relative ('Old Dir' => $Old, 'New Dir' => $realimageloc,
  788.                        'Test File' => "$kimage")) {
  789.       $Old   =~ s|^/*||o;
  790.     } elsif ($relative_links) {
  791.       $Old = spath('Old' => "$Old", 'New' => $realimageloc);
  792.     }
  793.     if ($use_hard_links =~ m/YES/i) {
  794.       warn "ln " . $Old . "$kimage " . $realimageloc . "$image_name" if $DEBUG;
  795.       if (! link($Old . "$kimage", $realimageloc . "$image_name")) {
  796.         warn "Could not link " . $image_dest .
  797.           "$kimage to $image_name :$!";
  798.       }
  799.     }
  800.     else {
  801.       warn "ln -s " . $Old . "$kimage " . $realimageloc . "$image_name" if $DEBUG;
  802.       if (! symlink($Old . "$kimage", $realimageloc . "$image_name")) {
  803.         warn "Could not symlink " . $image_dest .
  804.           "$kimage to $image_name :$!";
  805.       }
  806.     }
  807.   }
  808.   ##,####
  809.   # case Three
  810.   #`####
  811.   elsif ($use_hard_links =~ m/YES/i ) {
  812.     # Ok then. this ought to be a hard link, and hence fair game
  813.     # don't clobber $kimage.old quite yet
  814.     my $Old = $realimageloc;
  815.     my $cwd;
  816.     chomp($cwd=`pwd`);
  817.     if (test_relative ('Old Dir' => $Old, 'New Dir' => $cwd,
  818.                        'Test File' => "$image_name")) {
  819.       $Old   =~ s|^/*||o;
  820.     } elsif ($relative_links) {
  821.       $Old = spath('Old' => "$Old", 'New' => $cwd);
  822.     }
  823.     warn "ln " . $Old . "$image_name " . "$kimage" if $DEBUG;
  824.     if (! link($Old . "$image_name", "$kimage")) {
  825.       warn "mv $kimage.$$ $kimage" if $DEBUG;
  826.       rename("$kimage.$$", "$kimage");
  827.       die("Failed to link " . $realimageloc . "$image_name to "
  828.           . $image_dest . "$kimage .\n");
  829.     }
  830.   }
  831.   ##,####
  832.   # case Four
  833.   #`####
  834.   else {
  835.     # We just use cp
  836.     warn "cp -a --backup=t $realimageloc$image_name $kimage" if $DEBUG;
  837.     my $ret = system("cp -a --backup=t " . $realimageloc
  838.                      . "$image_name " . "$kimage");
  839.     if ($ret) {
  840.       if (-e "$kimage.$$") {
  841.         warn "mv $kimage.$$ $kimage" if $DEBUG;
  842.         rename("$kimage.$$", "$kimage");
  843.       }
  844.       die("Failed to copy " . $realimageloc . "$image_name to "
  845.           . $image_dest . "$kimage .\n");
  846.     }
  847.   }
  848.   # Ok, now we may clobber the previous .old file
  849.   warn "mv $kimage.$$ $kimage.old if -e $kimage.$$" if $DEBUG;
  850.   rename("$kimage.$$", "$kimage.old") if -e "$kimage.$$";
  851. }
  852.  
  853. # This routine is responsible for setting up the symbolic links
  854. # So, the actual kernel image lives in
  855. # $realimageloc/$image_name (/boot/vmlinuz-2.6.12).
  856. # This routine creates symbolic links in $image_dest/$kimage (/vmlinuz)
  857. sub image_magic {
  858.   my $kimage     = $_[0];       # Name of the symbolic link
  859.   my $image_dest = $_[1];       # The directory the links goes into
  860.   my $image_name = "$kimage-$version";
  861.   my $src_dir    = $realimageloc;
  862.   warn "image_magic: kimage=$kimage, image_dest=$image_dest\n" .
  863.     "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG;
  864.  
  865.   # Well, in any case, if the destination (the symlink we are trying
  866.   # to create) is a directory, we should do nothing, except throw a
  867.   # diagnostic.
  868.   if (-d "$kimage" ) {
  869.     die ("Hmm. $kimage is a directory, which I did not expect.  I am\n" .
  870.          "trying to create a symbolic link with that name linked to \n" .
  871.          "$image_dest . Since a directory exists here, my assumptions \n" .
  872.          "are way off, and I am aborting.\n" );
  873.     exit (3);
  874.   }
  875.  
  876.   if ($move_image) {   # Maybe $image_dest is in on dos, or something?
  877.     #                   source dir,    link name,        dest dir
  878.     really_move_image(  $realimageloc, $image_name, $image_dest);
  879.     really_reverse_link($realimageloc, $image_name, $image_dest)
  880.       if $reverse_symlink;
  881.     return;
  882.   }
  883.  
  884.   if (-l "$kimage") {           # There is a symbolic link
  885.     warn "DEBUG: There is a symlink for $kimage\n" if $DEBUG;
  886.     my $force_move = move_p($kimage, $image_dest, $image_name, $src_dir);
  887.  
  888.     if ($force_move) {
  889.       really_move_link($kimage, $image_dest, $image_name, $src_dir);
  890.     }
  891.   }
  892.   elsif (! -e "$kimage") {
  893.     # Hmm. Pristine system? How can that be? Installing from scratch?
  894.     # Or maybe the user does not want a symbolic link here.
  895.     # Possibly they do not want a link here. (we should be in /
  896.     # here[$image_dest, really]
  897.     handle_missing_link($kimage, $image_dest, $image_name, $src_dir);
  898.   }
  899.   elsif (-e "$kimage" ) {
  900.     # OK, $kimage exists -- but is not a link
  901.     handle_non_symlinks($kimage, $image_dest, $image_name, $src_dir);
  902.   }
  903. }
  904.  
  905. ######################################################################
  906. ######################################################################
  907. ######################################################################
  908. ######################################################################
  909.  
  910. # We may not have any modules installed
  911. if ( -d "$modules_base/$version" ) {
  912.   print STDERR "Running depmod.\n";
  913.   my $ret = system("depmod -a -F $realimageloc/System.map-$version $version");
  914.   my $exit_value  = $? >> 8;
  915.   my $signal_num  = $? & 127;
  916.   my $dumped_core = $? & 128;
  917.   if ($ret) {
  918.     if ( -f "$modules_base/$version/modules.dep") {
  919.       unlink "$modules_base/$version/modules.dep" unless $initrd;
  920.     }
  921.     my $seen;
  922.     my $answer;
  923.     my $question = "${package_name}/postinst/depmod-error-$version";
  924.     if ($initrd) {
  925.       $question = "${package_name}/postinst/depmod-error-initrd-$version";
  926.     }
  927.     ($ret,$seen) = fset ("$question", 'seen', 'false');
  928.     die "Error setting debconf flags in $question: $seen" if $ret;
  929.  
  930.     $ret = subst("$question", 'modules_base', "$modules_base");
  931.     die "Error setting debconf substitutions in $question: $seen" if $ret;
  932.  
  933.     $ret = subst("$question", 'SIGNAL', ", and got a signal $signal_num");
  934.     die "Error setting debconf substitutions in $question: $seen" if $ret;
  935.  
  936.     if ($dumped_core) {
  937.       $ret = subst("$question", 'CORE', ", and dumped core");
  938.       die "Error setting debconf substitutions in $question: $seen" if $ret;
  939.     }
  940.     else {
  941.       $ret = subst("$question", 'CORE', " ");
  942.       die "Error setting debconf substitutions in $question: $seen" if $ret;
  943.     }
  944.  
  945.     ($ret,$seen) = input('medium', "$question");
  946.     if ($ret && $ret != 30 ) {
  947.       die "Error setting debconf question $question: $seen";
  948.     }
  949.  
  950.     ($ret,$seen) = go ();
  951.     if ($ret && $ret != 30 ) {
  952.       die "Error asking debconf question $question: $seen";
  953.     }
  954.  
  955.     ($ret,$answer) = get("$question");
  956.     die "Error retreiving answer for $question: $answer" if $ret;
  957.  
  958.     if (! $ignore_depmod_err) {
  959.       if ($answer =~ /^(y|t)/i) {
  960.         exit(1);
  961.       }
  962.       else {
  963.         print STDERR "Ok, continuing as directed\n";
  964.       }
  965.     }
  966.   }
  967. }
  968.  
  969.  
  970.  
  971. sub find_initrd_tool {
  972.   my $hostversion = shift;
  973.   my $version = shift;
  974.   print STDERR "Finding valid ramdisk creators.\n";
  975.   my @ramdisks =
  976.     grep {
  977.       my $args = 
  978.         "$_ " .
  979.           "--supported-host-version=$hostversion " .
  980.             "--supported-target-version=$version " .
  981.               "1>/dev/null 2>&1"
  982.                 ;
  983.       system($args) == 0;
  984.     }
  985.       split (/[:,\s]+/, $ramdisk);
  986. }
  987.  
  988. # The initrd symlink should probably be in the same dir that the
  989. # symlinks are in
  990. if ($initrd) {
  991.   my $success = 0;
  992.  
  993.   # Update-initramfs is called slightly different than mkinitrd and
  994.   # mkinitramfs. XXX It should really be made compatible with this stuff
  995.   # some how.
  996.   if ($ramdisk eq $update_initramfs) {
  997.     my $upgrading = 1;
  998.     if (! defined $ARGV[1] || ! $ARGV[1] || $ARGV[1] =~ m/<unknown>/og) {
  999.       $upgrading = 0;
  1000.     }
  1001.     my $ret = system("$ramdisk " . ($upgrading ? "-u" : "-c") . " -k " . $version);
  1002.     $success = 1 unless $ret;
  1003.   } else {
  1004.   # XXX: Start non-indented
  1005.   chomp (my $hostversion = `uname -r`);
  1006.   my @ramdisklist;
  1007.   @ramdisklist = find_initrd_tool($hostversion, $version, $ramdisk) if $ramdisk;
  1008.   die "Failed to find suitable ramdisk generation tool for kernel version \n" .
  1009.     "$version on running kernel $hostversion in $ramdisk\n"
  1010.       if $#ramdisklist < 0;
  1011.  
  1012.   for $ramdisk_cmd (@ramdisklist) {
  1013.     print STDERR "Using $ramdisk_cmd to build the ramdisk.\n";
  1014.     print STDERR "Other valid candidates: @ramdisklist\n" if $#ramdisklist > 0;
  1015.  
  1016.     my $initrd_path = $realimageloc . "initrd.img-$version";
  1017.     my $ret = system("$ramdisk_cmd " .
  1018.                      ($mkimage ? "-m '$mkimage' " : "") .
  1019.                      "-o $initrd_path.new $modules_base/$version");
  1020.     if ($ret) {
  1021.       warn "$ramdisk_cmd failed to create initrd image.\n";
  1022.     }
  1023.     else {
  1024.       rename("$initrd_path.new", "$initrd_path")
  1025.         or die("Failed to rename initrd ($initrd_path)\n");
  1026.       $success = 1;
  1027.       last;
  1028.     }
  1029.   }
  1030.   # XXX: End non-idented
  1031.   }
  1032.   die "Failed to create initrd image.\n" unless $success;
  1033.   if (! defined $ARGV[1] || ! $ARGV[1] || $ARGV[1] =~ m/<unknown>/og) {
  1034.     image_magic("initrd.img", $image_dest);
  1035.   }
  1036.   else {
  1037.     if (! -e "initrd.img") {
  1038.       handle_missing_link("initrd.img", $image_dest, "initrd.img-$version",
  1039.                           $realimageloc);
  1040.     }
  1041.     else {
  1042.       print STDERR
  1043.         "Not updating initrd symbolic links since we are being updated/reinstalled \n";
  1044.       print STDERR
  1045.         "($ARGV[1] was configured last, according to dpkg)\n";
  1046.     }
  1047.   }
  1048.  
  1049.   if ($initrd && -l "initrd" ) {
  1050.     my $ret;
  1051.     my $seen;
  1052.     my $answer;
  1053.     my $question = "${package_name}/postinst/old-initrd-link-$version";
  1054.  
  1055.     ($ret,$answer) = get("$question");
  1056.     die "Error retreiving answer for $question: $answer" if $ret;
  1057.  
  1058.     $answer =~ s/^\s+//;
  1059.     $answer =~ s/\s+$//;
  1060.     if ($answer =~ /^(y|t)/i) {
  1061.       unlink "initrd";
  1062.     }
  1063.   }
  1064.  
  1065.   if ($initrd && -l "$image_dir/initrd" && ! $link_in_boot) {
  1066.     my $ret;
  1067.     my $seen;
  1068.     my $answer;
  1069.     my $question = "${package_name}/postinst/old-dir-initrd-link-$version";
  1070.  
  1071.     ($ret,$answer) = get("$question");
  1072.     die "Error retreiving answer for $question: $answer" if $ret;
  1073.  
  1074.     $answer =~ s/^\s+//;
  1075.     $answer =~ s/\s+$//;
  1076.     if ($answer =~ /^(y|t)/i) {
  1077.       unlink "$image_dir/initrd";
  1078.     }
  1079.   }
  1080. }
  1081. else {                        # Not making an initrd emage
  1082.   if (-l "initrd.img") {
  1083.     # Ooh, last image was an initrd image? in any case, we should move it. 
  1084.     my $target = readlink "initrd.img";
  1085.     my $real_target = '';
  1086.     $real_target = abs_path($target) if defined ($target);
  1087.  
  1088.     if (!defined($target) || ! -f "$real_target") {
  1089.       # Eh. dangling link. can safely be removed.
  1090.       unlink("initrd.img");
  1091.     } else {
  1092.       if (-l "initrd.img.old" || ! -e "initrd.img.old" ) {
  1093.         rename("initrd.img", "initrd.img.old");
  1094.       } else {
  1095.         warn "initrd.img.old is not a symlink, not clobbering\n";
  1096.         unlink("initrd.img");
  1097.       }
  1098.     }
  1099.   }
  1100. }
  1101.  
  1102. # Warn of a reboot
  1103. if (-x $notifier) {
  1104.   system($notifier);
  1105. }
  1106.  
  1107. # Only change the symlinks if we are not being upgraded
  1108. if (! defined $ARGV[1] || ! $ARGV[1] || $ARGV[1] =~ m/<unknown>/og) {
  1109.   image_magic($kimage, $image_dest);
  1110. }
  1111. else {
  1112.   if (! -e "$kimage") {
  1113.     handle_missing_link($kimage, $image_dest, "$kimage-$version", 
  1114.                         $realimageloc);
  1115.   }
  1116.   else {
  1117.     print STDERR
  1118.       "Not updating image symbolic links since we are being updated/reinstalled \n";
  1119.     print STDERR
  1120.       "($ARGV[1] was configured last, according to dpkg)\n";
  1121.   }
  1122. }
  1123.  
  1124. # We used to have System.* files in /
  1125. if (-e "/System.map" || -e "/System.old") {
  1126.   my $ret;
  1127.   my $answer;
  1128.   my $question = "${package_name}/postinst/old-system-map-link-$version";
  1129.  
  1130.   ($ret,$answer) = get("$question");
  1131.   die "Error retreiving answer for $question: $answer" if $ret;
  1132.  
  1133.   $answer =~ s/^\s+//;
  1134.   $answer =~ s/\s+$//;
  1135.   if ($answer =~ /^(y|t)/i) {
  1136.     unlink '/System.map' if -e '/System.map';
  1137.     unlink '/System.old' if -e '/System.old';
  1138.     print STDERR "Obsolete links removed.\n";
  1139.   }
  1140. }
  1141.  
  1142. # creating some info about kernel and initrd
  1143. if ($DEBUG) {
  1144.   my $ksize=sprintf("%.0f",(stat($realimageloc .
  1145.                                  "$kimage-$version"))[7]/1024)."kB";
  1146.   my $initrdsize='';
  1147.   if ($initrd) {
  1148.     $initrdsize=sprintf("%.0f",(stat($realimageloc .
  1149.                                      "initrd.img-$version"))[7]/1024)."kB";
  1150.   }
  1151.  
  1152.   print STDERR <<"EOMSG";
  1153. A new kernel image has been installed at $realimageloc$kimage-$version
  1154.  (Size: $ksize)
  1155.  
  1156. Symbolic links, unless otherwise specified, can be found in $image_dest
  1157.  
  1158. EOMSG
  1159.   ;
  1160.  
  1161.   if ($initrd) {
  1162.     print STDERR <<"EOMSGA";
  1163.  
  1164.  Initial rootdisk image: ${realimageloc}initrd.img-$version (Size: $initrdsize)
  1165. EOMSGA
  1166.     ;
  1167.   }
  1168. }
  1169.  
  1170. LOADER: {
  1171.   last unless $do_boot_enable; # Exit if explicitly asked to
  1172.  
  1173.   last if $loader =~ /silo/i; # SILO does not have to be executed.
  1174.   last if $loader =~ /yaboot/i; # yaboot does not have to be executed.
  1175.   last if $loader =~ /milo/i; # MILO does not have to be executed.
  1176.   last if $loader =~ /nettrom/i; # NETTROM does not have to be executed.
  1177.   last if $loader =~ /arcboot/i; # ARCBOOT does not have to be executed.
  1178.   last if $loader =~ /delo/i; # DELO does not have to be executed.
  1179.   if ($official_image =~ /^\s*YES\s*$/o) {
  1180.     last if $loader =~ /quik/i; # maintainer asked quik invocation to be ignored
  1181.   }
  1182.  
  1183.   last unless $loaderloc;
  1184.   last unless -x $loaderloc;
  1185.   last unless $do_bootloader;
  1186.  
  1187.   if (-T "/etc/$loader.conf") {
  1188.     # Trust and use the existing lilo.conf.
  1189.     print STDERR "You already have a $Loader configuration in /etc/$loader.conf\n";
  1190.     my $ret = &run_lilo();
  1191.     exit $ret if $ret;
  1192.   }
  1193. }
  1194.  
  1195. # set the env var stem
  1196. $ENV{'STEM'} = "=ST";
  1197.  
  1198. ## Run user hook script here, if any
  1199. if (-x "$postinst_hook") {
  1200.   print STDERR "Running postinst hook $postinst_hook.\n";
  1201.   system ("$postinst_hook $version $realimageloc$kimage-$version") &&
  1202.     warn "User hook script $postinst_hook failed";
  1203. }
  1204.  
  1205. if (-d "/etc/kernel/postinst.d") {
  1206.   print STDERR "Examining /etc/kernel/postinst.d.\n";
  1207.   system ("run-parts --verbose --exit-on-error --arg=$version " .
  1208.           "--arg=$realimageloc$kimage-$version " .
  1209.           "/etc/kernel/postinst.d") &&
  1210.             die "Failed to process /etc/kernel/postinst.d";
  1211. }
  1212.  
  1213. if (-d "/etc/kernel/postinst.d/$version") {
  1214.   print STDERR "Examining /etc/kernel/postinst.d/$version.\n";
  1215.   system ("run-parts --verbose --exit-on-error --arg=$version " .
  1216.           "--arg=$realimageloc$kimage-$version " .
  1217.           "/etc/kernel/postinst.d/$version") &&
  1218.             die "Failed to process /etc/kernel/postinst.d/$version";
  1219. }
  1220.  
  1221.  
  1222. sub run_lilo (){
  1223.   my $ret;
  1224.   if ($loader =~ /^lilo/io or $loader =~ /vmelilo/io) {
  1225.     print STDERR "Testing $loader.conf ... \n";
  1226.     unlink $temp_file_name;     # security
  1227.     $ret = system("$loaderloc -t >$temp_file_name 2>&1");
  1228.     if ($ret) {
  1229.       my $seen;
  1230.       my $note = "${package_name}/postinst/bootloader-test-error-$version";
  1231.  
  1232.       ($ret,$seen) = fset ("$note", 'seen', 'false');
  1233.       die "Error setting debconf flags in $note: $seen" if $ret;
  1234.  
  1235.       $ret = subst("$note", 'loader', "$loader");
  1236.       die "Error setting debconf substitutions in $note: $seen" if $ret;
  1237.  
  1238.       $ret = subst("$note", 'temp_file_name', "$temp_file_name");
  1239.       die "Error setting debconf substitutions in $note: $seen" if $ret;
  1240.  
  1241.       ($ret,$seen) = input('critical', "$note");
  1242.       if ($ret && $ret != 30 ) {
  1243.         die "Error setting debconf note $note: $seen";
  1244.       }
  1245.  
  1246.       ($ret,$seen) = go ();
  1247.       if ($ret && $ret != 30 ) {
  1248.         die "Error asking debconf question $note: $seen";
  1249.       }
  1250.       return $ret;
  1251.     }
  1252.     unlink "$temp_file_name";
  1253.     print STDERR "Testing successful.\n";
  1254.     print STDERR "Installing the ";
  1255.     print STDERR "partition " if $loader =~ /^lilo/io;
  1256.     print STDERR "boot sector... \n";
  1257.   }
  1258.  
  1259.   print STDERR "Running $loaderloc  ... \n";
  1260.   if ($loader =~ /^elilo/io) {
  1261.     $ret = system("$loaderloc 2>&1 | tee $temp_file_name");
  1262.   } else {
  1263.     $ret = system("$loaderloc >$temp_file_name 2>&1");
  1264.   }
  1265.   if ($ret) {
  1266.     my $ret;
  1267.     my $seen;
  1268.     my $note = "${package_name}/postinst/bootloader-error-$version";
  1269.  
  1270.     ($ret,$seen) = fset ("$note", 'seen', 'false');
  1271.     die "Error setting debconf flags in $note: $seen" if $ret;
  1272.  
  1273.     $ret = subst("$note", 'locader', "$loader");
  1274.     die "Error setting debconf substitutions in $note: $seen" if $ret;
  1275.  
  1276.     $ret = subst("$note", 'temp_file_name', "$temp_file_name");
  1277.     die "Error setting debconf substitutions in $note: $seen" if $ret;
  1278.  
  1279.     ($ret,$seen) = input('critical', "$note");
  1280.     if ($ret && $ret != 30 ) {
  1281.       die "Error setting debconf note $note: $seen";
  1282.     }
  1283.  
  1284.     ($ret,$seen) = go ();
  1285.     if ($ret && $ret != 30 ) {
  1286.       die "Error asking debconf question $note: $seen";
  1287.     }
  1288.     return $ret;
  1289.   }
  1290.   unlink $temp_file_name;
  1291.   print STDERR "Installation successful.\n";
  1292.   return 0;
  1293. }
  1294.  
  1295. exit 0;
  1296.  
  1297. __END__
  1298.  
  1299.