]>
Commit | Line | Data |
---|---|---|
356bd1e1 LO |
1 | #! /usr/bin/perl |
2 | # -*- Mode: Cperl -*- | |
3 | # image.preinst --- | |
4 | # Author : Manoj Srivastava ( srivasta@tiamat.datasync.com ) | |
5 | # Created On : Sun Jun 14 03:38:02 1998 | |
6 | # Created On Node : tiamat.datasync.com | |
7 | # Last Modified By : Manoj Srivastava | |
8 | # Last Modified On : Sun Sep 24 14:04:42 2006 | |
9 | # Last Machine Used: glaurung.internal.golden-gryphon.com | |
10 | # Update Count : 99 | |
11 | # Status : Unknown, Use with caution! | |
12 | # HISTORY : | |
13 | # Description : | |
14 | # | |
15 | # | |
16 | ||
17 | # | |
18 | #use strict; #for debugging | |
19 | ||
20 | use Debconf::Client::ConfModule qw(:all); | |
21 | version('2.0'); | |
22 | my $capb=capb("backup"); | |
23 | ||
24 | $|=1; | |
25 | ||
26 | # Predefined values: | |
27 | my $version = "=V"; | |
28 | my $link_in_boot = ""; # Should be empty, mostly | |
29 | my $no_symlink = ""; # Should be empty, mostly | |
30 | my $reverse_symlink = ""; # Should be empty, mostly | |
31 | my $do_symlink = "Yes"; # target machine defined | |
32 | my $do_boot_enable = "Yes"; # target machine defined | |
33 | my $do_bootfloppy = "Yes"; # target machine defined | |
34 | my $do_bootloader = "Yes"; # target machine defined | |
35 | my $move_image = ''; # target machine defined | |
36 | my $kimage = "=K"; # Should be empty, mostly | |
37 | my $loader = "=L"; # lilo, silo, quik, palo, vmelilo, nettrom | |
38 | # or elilo | |
39 | my $image_dir = "/boot"; # where the image is located | |
40 | my $initrd = "YES"; # initrd kernel | |
41 | my $use_hard_links = ''; # hardlinks do not wirk across fs boundaries | |
42 | my $postinst_hook = ''; #Normally we do not | |
43 | my $postrm_hook = ''; #Normally we do not | |
44 | my $preinst_hook = ''; #Normally we do not | |
45 | my $prerm_hook = ''; #Normally we do not | |
46 | my $minimal_swap = ''; # Do not swap symlinks | |
47 | my $ignore_depmod_err = ''; # normally we do not | |
48 | my $relink_src_link = 'YES'; # There is no harm in checking the link | |
49 | my $relink_build_link = 'YES'; # There is no harm in checking the link | |
50 | my $force_build_link = ''; # There is no harm in checking the link | |
51 | my $kernel_arch = "=B"; | |
52 | my $ramdisk = "/usr/sbin/update-initramfs"; # List of tools to create initial ram fs. | |
53 | my $package_name = "linux-image-$version"; | |
54 | ||
55 | my $Loader = "NoLOADER"; # | |
56 | $Loader = "LILO" if $loader =~ /^lilo/io; | |
57 | $Loader = "SILO" if $loader =~ /^silo/io; | |
58 | $Loader = "QUIK" if $loader =~ /^quik/io; | |
59 | $Loader = "yaboot" if $loader =~ /^yaboot/io; | |
60 | $Loader = "PALO" if $loader =~ /^palo/io; | |
61 | $Loader = "NETTROM" if $loader =~ /^nettrom/io; | |
62 | $Loader = "VMELILO" if $loader =~ /^vmelilo/io; | |
63 | $Loader = "ZIPL" if $loader =~ /^zipl/io; | |
64 | $Loader = "ELILO" if $loader =~ /^elilo/io; | |
65 | ||
66 | ||
67 | #known variables | |
68 | my @boilerplate = (); | |
69 | my @silotemplate = (); | |
70 | my @quiktemplate = (); | |
71 | my @palotemplate = (); | |
72 | my @vmelilotemplate = (); | |
73 | my $bootdevice = ''; | |
74 | my $rootdevice = ''; | |
75 | my $rootdisk = ''; | |
76 | my $rootpartition = ''; | |
77 | my $image_dest = "/"; | |
78 | my $realimageloc = "/$image_dir/"; | |
79 | my $have_conffile = ""; | |
80 | my $CONF_LOC = '/etc/kernel-img.conf'; | |
81 | my $relative_links = ''; | |
82 | my $silent_loader = ''; | |
83 | my $warn_reboot = ''; # Warn that we are installing a version of | |
84 | # the kernel we are running | |
85 | ||
86 | my $modules_base = '/lib/modules'; | |
87 | ||
88 | die "Pre inst Internal error. Aborting." unless $version; | |
89 | ||
90 | exit 0 if $ARGV[0] =~ /abort-upgrade/; | |
91 | exit 1 unless $ARGV[0] =~ /(install|upgrade)/; | |
92 | ||
93 | $arch = `uname -i`; | |
94 | if ($arch =~ m/86/) { | |
95 | system ("grep -q ' pae ' /proc/cpuinfo"); | |
96 | if ($?) { | |
97 | print STDERR "This kernel does not support a non-PAE CPU.\n"; | |
98 | exit 1; | |
99 | } | |
100 | } | |
101 | ||
102 | # remove multiple leading slashes; make sure there is at least one. | |
103 | $realimageloc =~ s|^/*|/|o; | |
104 | $realimageloc =~ s|/+|/|o; | |
105 | ||
106 | if (-r "$CONF_LOC" && -f "$CONF_LOC" ) { | |
107 | if (open(CONF, "$CONF_LOC")) { | |
108 | while (<CONF>) { | |
109 | chomp; | |
110 | s/\#.*$//g; | |
111 | next if /^\s*$/; | |
112 | ||
113 | $do_symlink = "" if /^\s*do_symlinks\s*=\s*(no|false|0)\s*$/ig; | |
114 | $no_symlink = "" if /^\s*no_symlinks\s*=\s*(no|false|0)\s*$/ig; | |
115 | $reverse_symlink = "" if /^\s*reverse_symlinks\s*=\s*(no|false|0)\s*$/ig; | |
116 | $link_in_boot = "" if /^\s*image_in_boot\s*=\s*(no|false|0)\s*$/ig; | |
117 | $link_in_boot = "" if /^\s*link_in_boot\s*=\s*(no|false|0)\s*$/ig; | |
118 | $move_image = "" if /^\s*move_image\s*=\s*(no|false|0)\s*$/ig; | |
119 | $do_boot_enable = '' if /^\s*do_boot_enable\s*=\s*(no|false|0)\s*$/ig; | |
120 | $do_bootfloppy = '' if /^\s*do_bootfloppy\s*=\s*(no|false|0)\s*$/ig; | |
121 | $do_bootloader = '' if /^\s*do_bootloader\s*=\s*(no|false|0)\s*$/ig; | |
122 | $relative_links = '' if /^\s*relative_links \s*=\s*(no|false|0)\s*$/ig; | |
123 | $use_hard_links = '' if /^\s*use_hard_links\s*=\s*(no|false|0)\s*$/ig; | |
124 | $silent_loader = '' if /^\s*silent_loader\s*=\s*(no|false|0)\s*$/ig; | |
125 | $warn_reboot = '' if /^\s*warn_reboot\s*=\s*(no|false|0)\s*$/ig; | |
126 | $minimal_swap = '' if /^\s*minimal_swap\s*=\s*(no|false|0)\s*$/ig; | |
127 | $ignore_depmod_err = '' if /^\s*ignore_depmod_err\s*=\s*(no|false|0)\s*$/ig; | |
128 | $relink_src_link = '' if /^\s*relink_src_link\s*=\s*(no|false|0)\s*$/ig; | |
129 | $relink_build_link = '' if /^\s*relink_build_link\s*=\s*(no|false|0)\s*$/ig; | |
130 | $force_build_link = '' if /^\s*force_build_link\s*=\s*(no|false|0)\s*$/ig; | |
131 | ||
132 | $do_symlink = "Yes" if /^\s*do_symlinks\s*=\s*(yes|true|1)\s*$/ig; | |
133 | $no_symlink = "Yes" if /^\s*no_symlinks\s*=\s*(yes|true|1)\s*$/ig; | |
134 | $reverse_symlink = "Yes" if /^\s*reverse_symlinks\s*=\s*(yes|true|1)\s*$/ig; | |
135 | $link_in_boot = "Yes" if /^\s*image_in_boot\s*=\s*(yes|true|1)\s*$/ig; | |
136 | $link_in_boot = "Yes" if /^\s*link_in_boot\s*=\s*(yes|true|1)\s*$/ig; | |
137 | $move_image = "Yes" if /^\s*move_image\s*=\s*(yes|true|1)\s*$/ig; | |
138 | $do_boot_enable = "Yes" if /^\s*do_boot_enable\s*=\s*(yes|true|1)\s*$/ig; | |
139 | $do_bootfloppy = "Yes" if /^\s*do_bootfloppy\s*=\s*(yes|true|1)\s*$/ig; | |
140 | $do_bootloader = "Yes" if /^\s*do_bootloader\s*=\s*(yes|true|1)\s*$/ig; | |
141 | $relative_links = "Yes" if /^\s*relative_links\s*=\s*(yes|true|1)\s*$/ig; | |
142 | $use_hard_links = "Yes" if /^\s*use_hard_links\s*=\s*(yes|true|1)\s*$/ig; | |
143 | $silent_loader = 'Yes' if /^\s*silent_loader\s*=\s*(yes|true|1)\s*$/ig; | |
144 | $warn_reboot = 'Yes' if /^\s*warn_reboot\s*=\s*(yes|true|1)\s*$/ig; | |
145 | $minimal_swap = 'Yes' if /^\s*minimal_swap\s*=\s*(yes|true|1)\s*$/ig; | |
146 | $ignore_depmod_err = 'Yes' if /^\s*ignore_depmod_err\s*=\s*(yes|true|1)\s*$/ig; | |
147 | $relink_src_link = 'Yes' if /^\s*relink_src_link\s*=\s*(yes|true|1)\s*$/ig; | |
148 | $relink_build_link = 'Yes' if /^\s*relink_build_link\s*=\s*(yes|true|1)\s*$/ig; | |
149 | $force_build_link = 'Yes' if /^\s*force_build_link\s*=\s*(yes|true|1)\s*$/ig; | |
150 | ||
151 | $image_dest = "$1" if /^\s*image_dest\s*=\s*(\S+)/ig; | |
152 | $postinst_hook = "$1" if /^\s*postinst_hook\s*=\s*(\S+)/ig; | |
153 | $postrm_hook = "$1" if /^\s*postrm_hook\s*=\s*(\S+)/ig; | |
154 | $preinst_hook = "$1" if /^\s*preinst_hook\s*=\s*(\S+)/ig; | |
155 | $prerm_hook = "$1" if /^\s*prerm_hook\s*=\s*(\S+)/ig; | |
156 | $ramdisk = "$1" if /^\s*ramdisk\s*=\s*(.+)$/ig; | |
157 | } | |
158 | close CONF; | |
159 | $have_conffile = "Yes"; | |
160 | $have_conffile = "Yes"; # stop perl complaining | |
161 | } | |
162 | } | |
163 | ||
e1a4215d MHC |
164 | $initrd = '' if (! -x "$ramdisk"); |
165 | ||
356bd1e1 LO |
166 | $ENV{KERNEL_ARCH}=$kernel_arch if $kernel_arch; |
167 | ||
168 | # About to upgrade this package from version $2 TO THIS VERSION. | |
169 | # "prerm upgrade" has already been called for the old version of | |
170 | # this package. | |
171 | ||
172 | sub find_initrd_tool { | |
173 | my $hostversion = shift; | |
174 | my $version = shift; | |
175 | my @ramdisks = | |
176 | grep { | |
177 | my $args = | |
178 | "$_ " . | |
179 | "--supported-host-version=$hostversion " . | |
180 | "--supported-target-version=$version " . | |
181 | "1>/dev/null 2>&1" | |
182 | ; | |
183 | system($args) == 0; | |
184 | } | |
185 | split (/[:,\s]+/, $ramdisk); | |
186 | } | |
187 | ||
188 | sub check { | |
189 | my $version = shift; | |
190 | my $lib_modules="$modules_base/$version"; | |
191 | my $message = ''; | |
192 | ||
193 | if (-d "$lib_modules") { | |
194 | opendir(DIR, $lib_modules) || die "can’t opendir $lib_modules: $!"; | |
195 | my @children = readdir(DIR); | |
196 | if ($#children > 1) { | |
197 | my @dirs = grep { -d "$lib_modules/$_" } @children; | |
198 | if ($#dirs > 1) { # we have subdirs | |
199 | my $dir_message=''; | |
200 | for my $dir (@dirs) { | |
201 | if ($dir =~/kernel$/) { | |
202 | $dir_message="An older install was detected.\n"; | |
203 | } | |
204 | else { | |
205 | $dir_message="Module sub-directories were detected.\n" | |
206 | unless $dir_message; | |
207 | } | |
208 | } | |
209 | $message += $dir_message if $dir_message; | |
210 | } | |
211 | ||
212 | my @links = grep { -l "$lib_modules/$_" } @children; | |
213 | if ($#links > -1) { | |
214 | my $links_message = ''; | |
215 | for my $link (@links) { | |
216 | next if ($link =~ /^build$/); | |
217 | next if ($link =~ /^source$/); | |
218 | $links_message = "Symbolic links were detected in $modules_base/$version.\n"; | |
219 | } | |
220 | $message += $links_message if $links_message; | |
221 | } | |
222 | my @files = grep { -f "$lib_modules/$_" } @children; | |
223 | $message += "Additional files also exist in $modules_base/$version.\n" | |
224 | if ($#files > -1); | |
225 | } | |
226 | } | |
227 | else { $message .= "$lib_modules does not exist. ";} | |
228 | return $message; | |
229 | } | |
230 | ||
231 | if (-d "$modules_base/$version") { | |
232 | my $errors=check($version); | |
233 | warn "Info:\n$errors\n" if $errors; | |
234 | } | |
235 | ||
236 | # set the env var stem | |
237 | $ENV{'STEM'} = "linux"; | |
238 | ||
239 | sub exec_script { | |
240 | my $type = shift; | |
241 | my $script = shift; | |
242 | print STDERR "Running $type hook script $script.\n"; | |
243 | system ("$script $version $realimageloc$kimage-$version") && | |
244 | print STDERR "User $type hook script [$script] "; | |
245 | if ($?) { | |
246 | if ($? == -1) { | |
247 | print STDERR "failed to execute: $!\n"; | |
248 | } | |
249 | elsif ($? & 127) { | |
250 | printf STDERR "died with signal %d, %s coredump\n", | |
251 | ($? & 127), ($? & 128) ? 'with' : 'without'; | |
252 | } | |
253 | else { | |
254 | printf STDERR "exited with value %d\n", $? >> 8; | |
255 | } | |
256 | exit $? >> 8; | |
257 | } | |
258 | } | |
259 | sub run_hook { | |
260 | my $type = shift; | |
261 | my $script = shift; | |
262 | if ($script =~ m,^/,) { | |
263 | # Full path provided for the hook script | |
264 | if (-x "$script") { | |
265 | &exec_script($type,$script); | |
266 | } | |
267 | else { | |
268 | die "The provided $type hook script [$script] could not be run.\n"; | |
269 | } | |
270 | } | |
271 | else { | |
272 | # Look for it in a safe path | |
273 | for my $path ('/bin', '/sbin', '/usr/bin', '/usr/sbin') { | |
274 | if (-x "$path/$script") { | |
275 | &exec_script($type, "$path/$script"); | |
276 | return 0; | |
277 | } | |
278 | } | |
279 | # No luck | |
280 | print STDERR "Could not find $type hook script [$script].\n"; | |
281 | die "Looked in: '/bin', '/sbin', '/usr/bin', '/usr/sbin'\n"; | |
282 | } | |
283 | } | |
284 | ||
285 | ||
286 | my $options; | |
287 | for (@ARGV) { | |
288 | s,','\\'',g; | |
289 | $options .= " '$_'"; | |
290 | } | |
291 | $ENV{'DEB_MAINT_PARAMS'}="$options"; | |
292 | ||
293 | ## Run user hook script here, if any | |
294 | if (-x "$preinst_hook") { | |
295 | &run_hook("preinst", $preinst_hook); | |
296 | } | |
297 | if (-d "/etc/kernel/preinst.d") { | |
298 | print STDERR "Examining /etc/kernel/preinst.d/\n"; | |
299 | system ("run-parts --verbose --exit-on-error --arg=$version" . | |
300 | " --arg=$realimageloc$kimage-$version" . | |
301 | " /etc/kernel/preinst.d") && | |
302 | die "Failed to process /etc/kernel/preinst.d"; | |
303 | } | |
304 | if (-d "/etc/kernel/preinst.d/$version") { | |
305 | print STDERR "Examining /etc/kernel/preinst.d/$version.\n"; | |
306 | system ("run-parts --verbose --exit-on-error --arg=$version" . | |
307 | " --arg=$realimageloc$kimage-$version" . | |
308 | " /etc/kernel/preinst.d/$version") && | |
309 | die "Failed to process /etc/kernel/preinst.d/$version"; | |
310 | } | |
311 | print STDERR "Done.\n"; | |
312 | ||
313 | exit 0; | |
314 | ||
315 | __END__ | |
316 | ||
317 |