]>
Commit | Line | Data |
---|---|---|
0d34a427 LO |
1 | #! /usr/bin/perl |
2 | # -*- Mode: Perl -*- | |
3 | # image.prerm --- | |
4 | # Author : root ( root@melkor.pilgrim.umass.edu ) | |
5 | # Created On : Fri May 17 03:28:59 1996 | |
6 | # Created On Node : melkor.pilgrim.umass.edu | |
7 | # Last Modified By : Manoj Srivastava | |
8 | # Last Modified On : Sat Aug 5 13:14:17 2006 | |
9 | # Last Machine Used: glaurung.internal.golden-gryphon.com | |
10 | # Update Count : 85 | |
11 | # Status : Unknown, Use with caution! | |
12 | # HISTORY : | |
13 | # Description : | |
14 | # | |
15 | # | |
16 | # $Id: image.prerm,v 1.22 2003/10/07 16:24:20 srivasta Exp $ | |
17 | # | |
18 | # | |
19 | #use strict; | |
20 | ||
21 | $|=1; | |
22 | # Predefined values: | |
23 | my $version = "=V"; | |
24 | my $link_in_boot = ""; # Should be empty, mostly | |
25 | my $no_symlink = ""; # Should be empty, mostly | |
26 | my $reverse_symlink = ""; # Should be empty, mostly | |
27 | my $do_symlinks = "Yes"; # target machine defined | |
28 | my $do_boot_enable = "Yes"; # target machine defined | |
29 | my $do_bootfloppy = "Yes"; # target machine defined | |
30 | my $do_bootloader = "Yes"; # target machine defined | |
31 | my $move_image = ''; # target machine defined | |
32 | my $kimage = "=K"; # Should be empty, mostly | |
33 | my $loader = "=L"; # lilo, silo, quik, palo, vmelilo, or nettrom | |
34 | my $image_dir = "/boot"; # where the image is located | |
35 | my $clobber_modules = ''; # target machine defined | |
36 | my $initrd = "YES"; # initrd kernel | |
37 | my $use_hard_links = ''; # hardlinks do not wirk across fs boundaries | |
38 | my $postinst_hook = ''; #Normally we do not | |
39 | my $postrm_hook = ''; #Normally we do not | |
40 | my $preinst_hook = ''; #Normally we do not | |
41 | my $prerm_hook = ''; #Normally we do not | |
42 | my $minimal_swap = ''; # Do not swap symlinks | |
43 | my $ignore_depmod_err = ''; # normally we do not | |
44 | my $relink_build_link = 'YES'; # There is no harm in checking the link | |
45 | my $force_build_link = ''; # There is no harm in checking the link | |
46 | my $kernel_arch = "=B"; | |
47 | my $ramdisk = "/usr/sbin/update-initramfs"; | |
48 | my $package_name = "linux-image-$version"; | |
49 | ||
50 | my $Loader = "NoLOADER"; # | |
51 | $Loader = "LILO" if $loader =~ /^lilo/io; | |
52 | $Loader = "SILO" if $loader =~ /^silo/io; | |
53 | $Loader = "QUIK" if $loader =~ /^quik/io; | |
54 | $Loader = "yaboot" if $loader =~ /^yaboot/io; | |
55 | $Loader = "PALO" if $loader =~ /^palo/io; | |
56 | $Loader = "NETTROM" if $loader =~ /^nettrom/io; | |
57 | $Loader = "VMELILO" if $loader =~ /^vmelilo/io; | |
58 | $Loader = "ZIPL" if $loader =~ /^zipl/io; | |
59 | $Loader = "ELILO" if $loader =~ /^elilo/io; | |
60 | ||
61 | ||
62 | # This should not point to /tmp, because of security risks. | |
63 | my $temp_file_name = "/var/log/$loader" . "_log.$$"; | |
64 | ||
65 | #known variables | |
66 | my $image_dest = "/"; | |
67 | my $realimageloc = "/$image_dir/"; | |
68 | my $have_conffile = ""; | |
69 | my $CONF_LOC = '/etc/kernel-img.conf'; | |
70 | my $relative_links = ''; | |
71 | my $silent_loader = ''; | |
72 | my $warn_reboot = 'Yes'; # Warn that we are installing a version of | |
73 | # the kernel we are running | |
74 | ||
75 | # remove multiple leading slashes; make sure there is at least one. | |
76 | $realimageloc =~ s|^/*|/|o; | |
77 | $realimageloc =~ s|/+|/|o; | |
78 | ||
79 | my $DEBUG = 0; | |
80 | ||
81 | # Variables used | |
82 | my $image=''; | |
83 | my $ret=0; | |
84 | my $seen=''; | |
85 | my $answer=''; | |
86 | my $running = ''; | |
87 | my $WouldInvalidate = 0; | |
88 | ||
89 | if ($ARGV[0] && ($ARGV[0] =~ /remove/ || $ARGV[0] =~ /upgrade/)) { | |
90 | if (-l "/usr/doc/linux-image-$version") { | |
91 | unlink "/usr/doc/linux-image-$version"; | |
92 | } | |
93 | } | |
94 | ||
95 | # Ignore all invocations uxcept when called on to remove | |
96 | exit 0 unless ($ARGV[0] && $ARGV[0] =~ /remove/) ; | |
97 | ||
98 | # Paranoid check to make sure that the correct value is put in there | |
99 | if (! $kimage) { $kimage = "vmlinuz";} # Hmm. empty | |
100 | elsif ($kimage =~ m/^b?uImage$/o) { $kimage = "vmlinuz";} # these produce vmlinuz | |
101 | elsif ($kimage =~ m/^b?zImage$/o) { $kimage = "vmlinuz";} # these produce vmlinuz | |
102 | elsif ($kimage =~ m/^[iI]mage$/o) { my $nop = $kimage; } | |
103 | elsif ($kimage =~ m/^vmlinux$/o) { my $nop = $kimage; } | |
104 | else { $kimage = "vmlinuz";} # Default | |
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 | $clobber_modules = '' if /^\s*clobber_modules\s*=\s*(no|false|0)\s*$/ig; | |
120 | $do_boot_enable = '' if /^\s*do_boot_enable\s*=\s*(no|false|0)\s*$/ig; | |
121 | $do_bootfloppy = '' if /^\s*do_bootfloppy\s*=\s*(no|false|0)\s*$/ig; | |
122 | $relative_links = '' if /^\s*relative_links \s*=\s*(no|false|0)\s*$/ig; | |
123 | $do_bootloader = '' if /^\s*do_bootloader\s*=\s*(no|false|0)\s*$/ig; | |
124 | $do_initrd = '' if /^\s*do_initrd\s*=\s*(no|false|0)\s*$/ig; | |
125 | $use_hard_links = '' if /^\s*use_hard_links\s*=\s*(no|false|0)\s*$/ig; | |
126 | $silent_loader = '' if /^\s*silent_loader\s*=\s*(no|false|0)\s*$/ig; | |
127 | $warn_reboot = '' if /^\s*warn_reboot\s*=\s*(no|false|0)\s*$/ig; | |
128 | $minimal_swap = '' if /^\s*minimal_swap\s*=\s*(no|false|0)\s*$/ig; | |
129 | $ignore_depmod_err = '' if /^\s*ignore_depmod_err\s*=\s*(no|false|0)\s*$/ig; | |
130 | $relink_build_link = '' if /^\s*relink_build_link\s*=\s*(no|false|0)\s*$/ig; | |
131 | $force_build_link = '' if /^\s*force_build_link\s*=\s*(no|false|0)\s*$/ig; | |
132 | ||
133 | ||
134 | $do_symlink = "Yes" if /^\s*do_symlinks\s*=\s*(yes|true|1)\s*$/ig; | |
135 | $no_symlink = "Yes" if /^\s*no_symlinks\s*=\s*(yes|true|1)\s*$/ig; | |
136 | $reverse_symlink = "Yes" if /^\s*reverse_symlinks\s*=\s*(yes|true|1)\s*$/ig; | |
137 | $link_in_boot = "Yes" if /^\s*image_in_boot\s*=\s*(yes|true|1)\s*$/ig; | |
138 | $link_in_boot = "Yes" if /^\s*link_in_boot\s*=\s*(yes|true|1)\s*$/ig; | |
139 | $move_image = "Yes" if /^\s*move_image\s*=\s*(yes|true|1)\s*$/ig; | |
140 | $clobber_modules = "Yes" if /^\s*clobber_modules\s*=\s*(yes|true|1)\s*$/ig; | |
141 | $do_boot_enable = "Yes" if /^\s*do_boot_enable\s*=\s*(yes|true|1)\s*$/ig; | |
142 | $do_bootfloppy = "Yes" if /^\s*do_bootfloppy\s*=\s*(yes|true|1)\s*$/ig; | |
143 | $do_bootloader = "Yes" if /^\s*do_bootloader\s*=\s*(yes|true|1)\s*$/ig; | |
144 | $relative_links = "Yes" if /^\s*relative_links\s*=\s*(yes|true|1)\s*$/ig; | |
145 | $do_initrd = "Yes" if /^\s*do_initrd\s*=\s*(yes|true|1)\s*$/ig; | |
146 | $use_hard_links = "Yes" if /^\s*use_hard_links\s*=\s*(yes|true|1)\s*$/ig; | |
147 | $silent_loader = 'Yes' if /^\s*silent_loader\s*=\s*(yes|true|1)\s*$/ig; | |
148 | $warn_reboot = 'Yes' if /^\s*warn_reboot\s*=\s*(yes|true|1)\s*$/ig; | |
149 | $minimal_swap = 'Yes' if /^\s*minimal_swap\s*=\s*(yes|true|1)\s*$/ig; | |
150 | $ignore_depmod_err = 'Yes' if /^\s*ignore_depmod_err\s*=\s*(yes|true|1)\s*$/ig; | |
151 | $relink_build_link = 'Yes' if /^\s*relink_build_link\s*=\s*(yes|true|1)\s*$/ig; | |
152 | $force_build_link = 'Yes' if /^\s*force_build_link\s*=\s*(yes|true|1)\s*$/ig; | |
153 | ||
154 | $image_dest = "$1" if /^\s*image_dest\s*=\s*(\S+)/ig; | |
155 | $postinst_hook = "$1" if /^\s*postinst_hook\s*=\s*(\S+)/ig; | |
156 | $postrm_hook = "$1" if /^\s*postrm_hook\s*=\s*(\S+)/ig; | |
157 | $preinst_hook = "$1" if /^\s*preinst_hook\s*=\s*(\S+)/ig; | |
158 | $prerm_hook = "$1" if /^\s*prerm_hook\s*=\s*(\S+)/ig; | |
159 | $ramdisk = "$1" if /^\s*ramdisk\s*=\s*(.+)$/ig; | |
160 | } | |
161 | close CONF; | |
162 | $have_conffile = "Yes"; | |
163 | } | |
164 | } | |
165 | ||
2c21160b | 166 | $initrd = '' if (! -x "$ramdisk"); |
0d34a427 LO |
167 | |
168 | $ENV{KERNEL_ARCH}=$kernel_arch if $kernel_arch; | |
169 | ||
170 | #check to see if we are trying to remove a running kernel | |
171 | # if so we abort right now. | |
172 | chop($running=`uname -r`); | |
173 | if ($running eq $version) { | |
174 | print STDERR "WARN: Proceeding with removing running kernel image.\n"; | |
175 | } | |
176 | ||
177 | #Now, they have an alternate kernel which they are currently running | |
178 | ||
179 | # This is just us being nice to lilo users. | |
180 | ||
181 | chdir("/") or die "could not chdir to /:$!\n"; | |
182 | ||
183 | if (-f "/etc/$loader.conf") { #I know, could be a link, but .. | |
184 | open (LILO, "/etc/$loader.conf") || &success(); # this is not critical | |
185 | while (<LILO>) { | |
186 | chop; | |
187 | s/\#.*//; # nix the comments | |
188 | next unless /^\s*image\s*=\s(\S+)/o; | |
189 | $image = $1; | |
190 | if ($image && -e $image) { | |
191 | while (defined($image) && -l $image) { | |
192 | $image = readlink ($image); | |
193 | } | |
194 | if (defined($image) && -e $image) { | |
195 | $WouldInvalidate |= $image =~ /$kimage-$version/; | |
196 | } | |
197 | else { | |
198 | &success(); # invalid $loader.conf file | |
199 | } | |
200 | } | |
201 | else { | |
202 | &success(); # invalid $loader.conf file | |
203 | } | |
204 | } | |
205 | close (LILO); | |
206 | if ($WouldInvalidate) { | |
207 | print STFERR "WARN: Proceeding with removing running kernel image.\n"; | |
208 | &success(); | |
209 | } | |
210 | } | |
211 | ||
212 | ||
213 | # set the env var stem | |
214 | $ENV{'STEM'} = "linux"; | |
215 | ||
216 | sub exec_script { | |
217 | my $type = shift; | |
218 | my $script = shift; | |
219 | print STDERR "Running $type hook script $script.\n"; | |
220 | system ("$script $version $realimageloc$kimage-$version") && | |
221 | print STDERR "User $type hook script [$script] "; | |
222 | if ($?) { | |
223 | if ($? == -1) { | |
224 | print STDERR "failed to execute: $!\n"; | |
225 | } | |
226 | elsif ($? & 127) { | |
227 | printf STDERR "died with signal %d, %s coredump\n", | |
228 | ($? & 127), ($? & 128) ? 'with' : 'without'; | |
229 | } | |
230 | else { | |
231 | printf STDERR "exited with value %d\n", $? >> 8; | |
232 | } | |
233 | exit $? >> 8; | |
234 | } | |
235 | } | |
236 | sub run_hook { | |
237 | my $type = shift; | |
238 | my $script = shift; | |
239 | if ($script =~ m,^/,) { | |
240 | # Full path provided for the hook script | |
241 | if (-x "$script") { | |
242 | &exec_script($type,$script); | |
243 | } | |
244 | else { | |
245 | die "The provided $type hook script [$script] could not be run.\n"; | |
246 | } | |
247 | } | |
248 | else { | |
249 | # Look for it in a safe path | |
250 | for my $path ('/bin', '/sbin', '/usr/bin', '/usr/sbin') { | |
251 | if (-x "$path/$script") { | |
252 | &exec_script($type, "$path/$script"); | |
253 | return 0; | |
254 | } | |
255 | } | |
256 | # No luck | |
257 | print STDERR "Could not find $type hook script [$script].\n"; | |
258 | die "Looked in: '/bin', '/sbin', '/usr/bin', '/usr/sbin'\n"; | |
259 | } | |
260 | } | |
261 | ||
262 | ||
263 | my $options; | |
264 | for (@ARGV) { | |
265 | s,','\\'',g; | |
266 | $options .= " '$_'"; | |
267 | } | |
268 | $ENV{'DEB_MAINT_PARAMS'}="$options"; | |
269 | ||
270 | ## Run user hook script here, if any | |
271 | if (-x "$prerm_hook") { | |
272 | &run_hook("prerm", $prerm_hook); | |
273 | } | |
274 | if (-d "/etc/kernel/prerm.d") { | |
275 | print STDERR "Examining /etc/kernel/prerm.d.\n"; | |
276 | system ("run-parts --verbose --exit-on-error --arg=$version " . | |
277 | "--arg=$realimageloc$kimage-$version /etc/kernel/prerm.d") && | |
278 | die "Failed to process /etc/kernel/prerm.d"; | |
279 | } | |
280 | if (-d "/etc/kernel/prerm.d/$version") { | |
281 | print STDERR "Examining /etc/kernel/prerm.d/$version.\n"; | |
282 | system ("run-parts --verbose --exit-on-error --arg=$version" . | |
283 | " --arg=$realimageloc$kimage-$version " . | |
284 | "/etc/kernel/prerm.d/$version") && | |
285 | die "Failed to process /etc/kernel/prerm.d/$version"; | |
286 | } | |
287 | ||
288 | sub success () { | |
289 | # NOTE: need to keep this list in sync with rules.d/2-binary-arch.mk | |
290 | my %files_to_keep = ( | |
291 | 'modules.builtin' => 1, | |
292 | 'modules.order' => 1, | |
293 | ); | |
294 | my $short; | |
295 | for my $file (</lib/modules/$version/modules.*>) { | |
296 | $short = $file; $short =~ s,.*/,,; | |
297 | if (!defined $files_to_keep{$short}) { | |
298 | unlink "$file"; | |
299 | } | |
300 | } | |
301 | exit 0; | |
302 | } | |
303 | ||
304 | ||
305 | ||
306 | &success(); | |
307 | exit 0; | |
308 | __END__ | |
309 | ||
310 | ||
311 | ||
312 | ||
313 |