]>
Commit | Line | Data |
---|---|---|
fef4fb4a LO |
1 | #! /usr/bin/perl |
2 | # -*- Mode: Cperl -*- | |
3 | # image.postrm --- | |
4 | # Author : Manoj Srivastava ( srivasta@glaurung.green-gryphon.com ) | |
5 | # Created On : Sat May 15 11:05:13 1999 | |
6 | # Created On Node : glaurung.green-gryphon.com | |
7 | # Last Modified By : Manoj Srivastava | |
8 | # Last Modified On : Wed Sep 13 11:26:19 2006 | |
9 | # Last Machine Used: glaurung.internal.golden-gryphon.com | |
10 | # Update Count : 57 | |
11 | # Status : Unknown, Use with caution! | |
12 | # HISTORY : | |
13 | # Description : | |
14 | # | |
15 | # $Id: image.postrm,v 1.31 2003/10/07 16:24:20 srivasta Exp $ | |
16 | # | |
17 | ||
18 | ||
19 | # | |
20 | #use strict; #for debugging | |
21 | use Cwd 'abs_path'; | |
22 | ||
23 | $|=1; | |
24 | ||
25 | # Predefined values: | |
26 | my $version = "=V"; | |
27 | my $link_in_boot = ""; # Should be empty, mostly | |
28 | my $no_symlink = ""; # Should be empty, mostly | |
29 | my $reverse_symlink = ""; # Should be empty, mostly | |
30 | my $do_symlink = "Yes"; # target machine defined | |
31 | my $do_boot_enable = "Yes"; # target machine defined | |
32 | my $do_bootfloppy = "Yes"; # target machine defined | |
33 | my $do_bootloader = "Yes"; # target machine defined | |
34 | my $move_image = ''; # target machine defined | |
35 | my $kimage = "=K"; # Should be empty, mostly | |
36 | my $loader = "=L"; # lilo, silo, quik, palo, vmelilo, or nettrom | |
37 | my $image_dir = "/boot"; # where the image is located | |
38 | my $clobber_modules = ''; # target machine defined | |
39 | my $initrd = "YES"; # initrd kernel | |
40 | my $do_initrd = ''; # Normally, we don't | |
41 | my $warn_initrd = 'YES'; # Normally we do | |
42 | my $use_hard_links = ''; # hardlinks do not work across fs boundaries | |
43 | my $postinst_hook = ''; #Normally we do not | |
44 | my $postrm_hook = ''; #Normally we do not | |
45 | my $preinst_hook = ''; #Normally we do not | |
46 | my $prerm_hook = ''; #Normally we do not | |
47 | my $minimal_swap = ''; # Do not swap symlinks | |
48 | my $ignore_depmod_err = ''; # normally we do not | |
49 | my $relink_build_link = 'YES'; # There is no harm in checking the link | |
50 | my $force_build_link = ''; # we shall not create a dangling link | |
51 | my $kernel_arch = "=B"; | |
52 | my $ramdisk = "/usr/sbin/update-initramfs"; | |
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 | # This should not point to /tmp, because of security risks. | |
68 | my $temp_file_name = "/var/log/$loader" . "_log.$$"; | |
69 | ||
70 | #known variables | |
71 | my @boilerplate = (); | |
72 | my @silotemplate = (); | |
73 | my @quiktemplate = (); | |
74 | my @palotemplate = (); | |
75 | my @vmelilotemplate = (); | |
76 | my $bootdevice = ''; | |
77 | my $rootdevice = ''; | |
78 | my $rootdisk = ''; | |
79 | my $rootpartition = ''; | |
80 | my $image_dest = "/"; | |
81 | my $realimageloc = "/$image_dir/"; | |
82 | my $have_conffile = ""; | |
83 | my $CONF_LOC = '/etc/kernel-img.conf'; | |
84 | my $relative_links = ''; | |
85 | my $silent_modules = ''; | |
86 | my $silent_loader = ''; | |
87 | my $warn_reboot = 'Yes'; # Warn that we are installing a version of | |
88 | # the kernel we are running | |
89 | ||
90 | chdir('/') or die "could not chdir to /:$!\n"; | |
91 | # remove multiple leading slashes; make sure there is at least one. | |
92 | $realimageloc =~ s|^/*|/|o; | |
93 | $realimageloc =~ s|/+|/|o; | |
94 | ||
95 | ||
96 | if (-r "$CONF_LOC" && -f "$CONF_LOC" ) { | |
97 | if (open(CONF, "$CONF_LOC")) { | |
98 | while (<CONF>) { | |
99 | chomp; | |
100 | s/\#.*$//g; | |
101 | next if /^\s*$/; | |
102 | ||
103 | $do_symlink = "" if /^\s*do_symlinks\s*=\s*(no|false|0)\s*$/ig; | |
104 | $no_symlink = "" if /^\s*no_symlinks\s*=\s*(no|false|0)\s*$/ig; | |
105 | $reverse_symlink = "" if /^\s*reverse_symlinks\s*=\s*(no|false|0)\s*$/ig; | |
106 | $link_in_boot = "" if /^\s*image_in_boot\s*=\s*(no|false|0)\s*$/ig; | |
107 | $link_in_boot = "" if /^\s*link_in_boot\s*=\s*(no|false|0)\s*$/ig; | |
108 | $move_image = "" if /^\s*move_image\s*=\s*(no|false|0)\s*$/ig; | |
109 | $clobber_modules = '' if /^\s*clobber_modules\s*=\s*(no|false|0)\s*$/ig; | |
110 | $do_boot_enable = '' if /^\s*do_boot_enable\s*=\s*(no|false|0)\s*$/ig; | |
111 | $do_bootfloppy = '' if /^\s*do_bootfloppy\s*=\s*(no|false|0)\s*$/ig; | |
112 | $relative_links = '' if /^\s*relative_links \s*=\s*(no|false|0)\s*$/ig; | |
113 | $do_bootloader = '' if /^\s*do_bootloader\s*=\s*(no|false|0)\s*$/ig; | |
114 | $do_initrd = '' if /^\s*do_initrd\s*=\s*(no|false|0)\s*$/ig; | |
115 | $warn_initrd = '' if /^\s*warn_initrd\s*=\s*(no|false|0)\s*$/ig; | |
116 | $use_hard_links = '' if /^\s*use_hard_links\s*=\s*(no|false|0)\s*$/ig; | |
117 | $silent_modules = '' if /^\s*silent_modules\s*=\s*(no|false|0)\s*$/ig; | |
118 | $silent_loader = '' if /^\s*silent_loader\s*=\s*(no|false|0)\s*$/ig; | |
119 | $warn_reboot = '' if /^\s*warn_reboot\s*=\s*(no|false|0)\s*$/ig; | |
120 | $minimal_swap = '' if /^\s*minimal_swap\s*=\s*(no|false|0)\s*$/ig; | |
121 | $ignore_depmod_err = '' if /^\s*ignore_depmod_err\s*=\s*(no|false|0)\s*$/ig; | |
122 | $relink_build_link = '' if /^\s*relink_build_link\s*=\s*(no|false|0)\s*$/ig; | |
123 | $force_build_link = '' if /^\s*force_build_link\s*=\s*(no|false|0)\s*$/ig; | |
124 | ||
125 | $do_symlink = "Yes" if /^\s*do_symlinks\s*=\s*(yes|true|1)\s*$/ig; | |
126 | $no_symlink = "Yes" if /^\s*no_symlinks\s*=\s*(yes|true|1)\s*$/ig; | |
127 | $reverse_symlink = "Yes" if /^\s*reverse_symlinks\s*=\s*(yes|true|1)\s*$/ig; | |
128 | $link_in_boot = "Yes" if /^\s*image_in_boot\s*=\s*(yes|true|1)\s*$/ig; | |
129 | $link_in_boot = "Yes" if /^\s*link_in_boot\s*=\s*(yes|true|1)\s*$/ig; | |
130 | $move_image = "Yes" if /^\s*move_image\s*=\s*(yes|true|1)\s*$/ig; | |
131 | $clobber_modules = "Yes" if /^\s*clobber_modules\s*=\s*(yes|true|1)\s*$/ig; | |
132 | $do_boot_enable = "Yes" if /^\s*do_boot_enable\s*=\s*(yes|true|1)\s*$/ig; | |
133 | $do_bootfloppy = "Yes" if /^\s*do_bootfloppy\s*=\s*(yes|true|1)\s*$/ig; | |
134 | $do_bootloader = "Yes" if /^\s*do_bootloader\s*=\s*(yes|true|1)\s*$/ig; | |
135 | $relative_links = "Yes" if /^\s*relative_links\s*=\s*(yes|true|1)\s*$/ig; | |
136 | $do_initrd = "Yes" if /^\s*do_initrd\s*=\s*(yes|true|1)\s*$/ig; | |
137 | $warn_initrd = "Yes" if /^\s*warn_initrd\s*=\s*(yes|true|1)\s*$/ig; | |
138 | $use_hard_links = "Yes" if /^\s*use_hard_links\s*=\s*(yes|true|1)\s*$/ig; | |
139 | $silent_modules = 'Yes' if /^\s*silent_modules\s*=\s*(yes|true|1)\s*$/ig; | |
140 | $silent_loader = 'Yes' if /^\s*silent_loader\s*=\s*(yes|true|1)\s*$/ig; | |
141 | $warn_reboot = 'Yes' if /^\s*warn_reboot\s*=\s*(yes|true|1)\s*$/ig; | |
142 | $minimal_swap = 'Yes' if /^\s*minimal_swap\s*=\s*(yes|true|1)\s*$/ig; | |
143 | $ignore_depmod_err = 'Yes' if /^\s*ignore_depmod_err\s*=\s*(yes|true|1)\s*$/ig; | |
144 | $relink_build_link = 'Yes' if /^\s*relink_build_link\s*=\s*(yes|true|1)\s*$/ig; | |
145 | $force_build_link = 'Yes' if /^\s*force_build_link\s*=\s*(yes|true|1)\s*$/ig; | |
146 | ||
147 | $image_dest = "$1" if /^\s*image_dest\s*=\s*(\S+)/ig; | |
148 | $postinst_hook = "$1" if /^\s*postinst_hook\s*=\s*(\S+)/ig; | |
149 | $postrm_hook = "$1" if /^\s*postrm_hook\s*=\s*(\S+)/ig; | |
150 | $preinst_hook = "$1" if /^\s*preinst_hook\s*=\s*(\S+)/ig; | |
151 | $prerm_hook = "$1" if /^\s*prerm_hook\s*=\s*(\S+)/ig; | |
152 | $ramdisk = "$1" if /^\s*ramdisk\s*=\s*(.+)$/ig; | |
153 | } | |
154 | close CONF; | |
155 | $have_conffile = "Yes"; | |
156 | } | |
157 | } | |
158 | ||
ab9c49b0 MHC |
159 | $initrd = '' if (! -x "$ramdisk"); |
160 | ||
fef4fb4a LO |
161 | if ($link_in_boot) { |
162 | $image_dest = "/$image_dir/"; | |
163 | $image_dest =~ s|^/*|/|o; | |
164 | } | |
165 | ||
166 | $image_dest = "$image_dest/"; | |
167 | $image_dest =~ s|/+$|/|o; | |
168 | ||
169 | # The destdir may be gone by now. | |
170 | if (-d "$image_dest") { | |
171 | chdir("$image_dest") or die "could not chdir to $image_dest:$!\n"; | |
172 | } | |
173 | ||
174 | # Paranoid check to make sure that the correct value is put in there | |
175 | if (! $kimage) {$kimage = "vmlinuz"} # Hmm. empty | |
176 | elsif ($kimage =~ m/^b?uImage$/o) {$kimage = "vmlinuz"} # these produce vmlinuz | |
177 | elsif ($kimage =~ m/^b?zImage$/o) {$kimage = "vmlinuz"} # these produce vmlinuz | |
178 | elsif ($kimage =~ m/^[iI]mage$/o) { my $nop = $kimage;} | |
179 | elsif ($kimage =~ m/^vmlinux$/o) { my $nop = $kimage;} | |
180 | else {$kimage = "vmlinuz"} # default | |
181 | ||
182 | $ENV{KERNEL_ARCH}=$kernel_arch if $kernel_arch; | |
183 | ||
184 | ||
185 | ###################################################################### | |
186 | ###################################################################### | |
187 | ############ | |
188 | ###################################################################### | |
189 | ###################################################################### | |
190 | sub remove_sym_link { | |
191 | my $bad_image = $_[0]; | |
192 | ||
193 | warn "Removing symbolic link $bad_image \n"; | |
194 | if ($loader =~ /lilo/i) | |
195 | { | |
196 | warn "Unless you used the optional flag in lilo, \n"; | |
197 | } | |
198 | warn " you may need to re-run your boot loader" . ($loader ? "[$loader]":"") | |
199 | . "\n"; | |
200 | # Remove the dangling link | |
201 | unlink "$bad_image"; | |
202 | } | |
203 | ||
204 | ###################################################################### | |
205 | ###################################################################### | |
206 | ############ | |
207 | ###################################################################### | |
208 | ###################################################################### | |
209 | sub CanonicalizePath { | |
210 | my $path = join '/', @_; | |
211 | my @work = split '/', $path; | |
212 | my @out; | |
213 | my $is_absolute; | |
214 | ||
215 | if (@work && $work[0] eq "") { $is_absolute = 1; shift @work; } | |
216 | ||
217 | while (@work) { | |
218 | my $seg = shift @work; | |
219 | if ($seg eq "." || $seg eq "") { | |
220 | } elsif ($seg eq "..") { | |
221 | if (@out && $out[-1] ne "..") { | |
222 | pop @out; | |
223 | } else { | |
224 | # Leading "..", or "../..", etc. | |
225 | push @out, $seg; | |
226 | } | |
227 | } else { | |
228 | push @out, $seg; | |
229 | } | |
230 | } | |
231 | ||
232 | unshift @out, "" if $is_absolute; | |
233 | return join('/', @out); | |
234 | } | |
235 | ||
236 | ###################################################################### | |
237 | ###################################################################### | |
238 | ############ | |
239 | ###################################################################### | |
240 | ###################################################################### | |
241 | # This removes dangling symlinks. What do we do about hard links? Surely a | |
242 | # something with the nane $image_dest . "$kimage" ought not to be left behind? | |
243 | sub image_magic { | |
244 | my $kimage = $_[0]; | |
245 | my $image_dest = $_[1]; | |
246 | ||
247 | if (-l "$kimage") { | |
248 | # There is a symbolic link | |
249 | my $force_move = 0; | |
250 | my $vmlinuz_target = readlink "$kimage"; | |
251 | my $real_target = ''; | |
252 | $real_target = abs_path($vmlinuz_target) if defined ($vmlinuz_target); | |
253 | if (!defined($vmlinuz_target) || ! -f "$real_target") { | |
254 | # what, a dangling symlink? | |
255 | warn "The link " . $image_dest . "$kimage is a damaged link\n"; | |
256 | # Remove the dangling link | |
257 | &remove_sym_link("$kimage"); | |
258 | } | |
259 | else { | |
260 | my $canonical_target = CanonicalizePath("$vmlinuz_target"); | |
261 | if (! -e $canonical_target) { | |
262 | warn "The link " . $image_dest . "$kimage is a dangling link\n"; | |
263 | &remove_sym_link("$kimage"); | |
264 | } | |
265 | } | |
266 | } | |
267 | } | |
268 | ||
269 | # set the env var stem | |
270 | $ENV{'STEM'} = "linux"; | |
271 | ||
272 | sub exec_script { | |
273 | my $type = shift; | |
274 | my $script = shift; | |
275 | print STDERR "Running $type hook script $script.\n"; | |
276 | system ("$script $version $realimageloc$kimage-$version") && | |
277 | print STDERR "User $type hook script [$script] "; | |
278 | if ($?) { | |
279 | if ($? == -1) { | |
280 | print STDERR "failed to execute: $!\n"; | |
281 | } | |
282 | elsif ($? & 127) { | |
283 | printf STDERR "died with signal %d, %s coredump\n", | |
284 | ($? & 127), ($? & 128) ? 'with' : 'without'; | |
285 | } | |
286 | else { | |
287 | printf STDERR "exited with value %d\n", $? >> 8; | |
288 | } | |
289 | } | |
290 | } | |
291 | sub run_hook { | |
292 | my $type = shift; | |
293 | my $script = shift; | |
294 | if ($script =~ m,^/,) { | |
295 | # Full path provided for the hook script | |
296 | if (-x "$script") { | |
297 | &exec_script($type,$script); | |
298 | } | |
299 | else { | |
300 | warn "The provided $type hook script [$script] could not be run.\n"; | |
301 | } | |
302 | } | |
303 | else { | |
304 | # Look for it in a safe path | |
305 | for my $path ('/bin', '/sbin', '/usr/bin', '/usr/sbin') { | |
306 | if (-x "$path/$script") { | |
307 | &exec_script($type, "$path/$script"); | |
308 | return 0; | |
309 | } | |
310 | } | |
311 | # No luck | |
312 | print STDERR "Could not find $type hook script [$script].\n"; | |
313 | warn "Looked in: '/bin', '/sbin', '/usr/bin', '/usr/sbin'\n"; | |
314 | } | |
315 | } | |
316 | ||
317 | my $options; | |
318 | for (@ARGV) { | |
319 | s,','\\'',g; | |
320 | $options .= " '$_'"; | |
321 | } | |
322 | $ENV{'DEB_MAINT_PARAMS'}="$options"; | |
323 | ||
324 | ## Run user hook script here, if any | |
325 | if ($postrm_hook) { | |
326 | &run_hook("postrm", $postrm_hook); | |
327 | } | |
328 | if (-d "/etc/kernel/postrm.d") { | |
329 | warn "Examining /etc/kernel/postrm.d .\n"; | |
330 | system ("run-parts --verbose --exit-on-error --arg=$version " . | |
331 | "--arg=$realimageloc$kimage-$version " . | |
332 | "/etc/kernel/postrm.d") && | |
333 | die "Failed to process /etc/kernel/postrm.d"; | |
334 | } | |
335 | if (-d "/etc/kernel/postrm.d/$version") { | |
336 | warn "Examining /etc/kernel/postrm.d/$version .\n"; | |
337 | system ("run-parts --verbose --exit-on-error --arg=$version " . | |
338 | "--arg=$realimageloc$kimage-$version " . | |
339 | "/etc/kernel/postrm.d/$version") && | |
340 | die "Failed to process /etc/kernel/postrm.d/$version"; | |
341 | } | |
342 | ||
343 | # check and remove damaged and dangling symlinks | |
344 | if ($ARGV[0] !~ /upgrade/) { | |
345 | system("$ramdisk -d -k " . $version . " > /dev/null 2>&1"); | |
346 | if (-f $realimageloc . "initrd.img-$version.bak") { | |
347 | unlink $realimageloc . "initrd.img-$version.bak"; | |
348 | } | |
349 | image_magic($kimage, $image_dest); | |
350 | image_magic($kimage . ".old", $image_dest); | |
351 | image_magic("initrd.img", $image_dest) if $initrd; | |
352 | image_magic("initrd.img.old", $image_dest) if $initrd; | |
353 | } | |
354 | ||
355 | exit 0; | |
356 | ||
357 | __END__ | |
358 | ||
359 | ||
360 | ||
361 | ||
362 | ||
363 |