Hello community, here is the log from the commit of package mkinitrd for openSUSE:Factory checked in at Wed Jun 22 10:48:16 CEST 2011. -------- --- mkinitrd/mkinitrd.changes 2011-06-16 15:39:59.000000000 +0200 +++ /mounts/work_src_done/STABLE/mkinitrd/mkinitrd.changes 2011-06-21 11:14:31.000000000 +0200 @@ -1,0 +2,19 @@ +Tue Jun 21 09:11:06 UTC 2011 - mmarek@novell.com + +- purge-kernels: Change the variable to multiversion.kernels to + match the syntax of other zypp variables. + +------------------------------------------------------------------- +Mon Jun 20 08:58:35 UTC 2011 - mmarek@novell.com + +- purge-kernels: Change the multiversion_kernels variable to a + comma separated list, update help. + +------------------------------------------------------------------- +Sun Jun 19 13:25:10 UTC 2011 - mmarek@novell.com + +- Add purge-kernels script to automatically delete old kernel packages + on boot, based on configuration in /etc/zypp/zypp.conf, variable + multiversion_kernels (fate#312018). + +------------------------------------------------------------------- calling whatdependson for head-i586 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ mkinitrd.spec ++++++ --- /var/tmp/diff_new_pack.zydSZO/_old 2011-06-22 10:48:03.000000000 +0200 +++ /var/tmp/diff_new_pack.zydSZO/_new 2011-06-22 10:48:03.000000000 +0200 @@ -31,7 +31,7 @@ %endif AutoReqProv: on Version: 2.7.0 -Release: 11 +Release: 13 Conflicts: udev < 118 Requires: dhcpcd PreReq: %fillup_prereq @@ -112,12 +112,14 @@ %install_mkinitrd /usr/bin/perl /sbin/mkinitrd_setup EOF install -m 755 etc/boot.loadmodules $RPM_BUILD_ROOT/etc/init.d/ +install -m 755 etc/purge-kernels.init $RPM_BUILD_ROOT/etc/init.d/purge-kernels install -m 644 etc/sysconfig.kernel-mkinitrd $RPM_BUILD_ROOT/var/adm/fillup-templates/ %post %{remove_and_set -n kernel SKIP_RUNNING_KERNEL NO_KMS_IN_INITRD} %{fillup_only -an kernel} %{insserv_force_if_yast /etc/init.d/boot.loadmodules} +%{fillup_and_insserv -f -Y purge-kernels} case "$NO_KMS_IN_INITRD" in no) sed -i -e "s@^KMS_IN_INITRD=.*@KMS_IN_INITRD=\"yes\"@" /etc/sysconfig/kernel ;; @@ -125,6 +127,9 @@ sed -i -e "s@^KMS_IN_INITRD=.*@KMS_IN_INITRD=\"no\"@" /etc/sysconfig/kernel ;; esac +%postun +%insserv_cleanup + %posttrans /sbin/mkinitrd_setup @@ -140,6 +145,7 @@ %dir /lib/mkinitrd/setup %config /etc/rpm/macros.mkinitrd /etc/init.d/boot.loadmodules +/etc/init.d/purge-kernels /lib/mkinitrd/scripts/*.sh /lib/mkinitrd/bin/* /bin/lsinitrd @@ -147,6 +153,7 @@ /sbin/mkinitrd_setup /sbin/module_upgrade /sbin/installkernel +/sbin/purge-kernels /var/adm/fillup-templates/sysconfig.kernel-%name %doc %{_mandir}/man5/mkinitrd.5.gz %doc %{_mandir}/man8/mkinitrd.8.gz ++++++ mkinitrd.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mkinitrd-2.7.0/etc/purge-kernels.init new/mkinitrd-2.7.0/etc/purge-kernels.init --- old/mkinitrd-2.7.0/etc/purge-kernels.init 1970-01-01 01:00:00.000000000 +0100 +++ new/mkinitrd-2.7.0/etc/purge-kernels.init 2011-06-21 11:13:33.000000000 +0200 @@ -0,0 +1,35 @@ +#! /bin/sh +# +# Copyright (c) 2011 Novell, Inc. +# +### BEGIN INIT INFO +# Provides: purge-kernels +# Required-Start: $local_fs +# Required-Stop: $null +# Default-Start: 3 5 +# Default-Stop: $null +# Short-Description: Purge old kernels +# Description: Purge old kernel as configured in /etc/zypp/zypp.conf +### END INIT INFO + +case "$1" in +start) + ;; +stop|try-restart|restart|force-reload|reload|status) + # not applicable + exit 0 + ;; +*) + echo "Usage: $0 start" + exit 1 +esac +if test ! -e /boot/do_purge_kernels; then + exit 0 +fi + +. /etc/rc.status +echo "Removing old kernel packages..." +rm -f /boot/do_purge_kernels +/sbin/purge-kernels +rc_status -v +rc_exit diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mkinitrd-2.7.0/mkinitrd.changes new/mkinitrd-2.7.0/mkinitrd.changes --- old/mkinitrd-2.7.0/mkinitrd.changes 2011-06-16 15:33:46.000000000 +0200 +++ new/mkinitrd-2.7.0/mkinitrd.changes 2011-06-21 11:13:33.000000000 +0200 @@ -1,4 +1,23 @@ ------------------------------------------------------------------- +Tue Jun 21 09:11:06 UTC 2011 - mmarek@novell.com + +- purge-kernels: Change the variable to multiversion.kernels to + match the syntax of other zypp variables. + +------------------------------------------------------------------- +Mon Jun 20 08:58:35 UTC 2011 - mmarek@novell.com + +- purge-kernels: Change the multiversion_kernels variable to a + comma separated list, update help. + +------------------------------------------------------------------- +Sun Jun 19 13:25:10 UTC 2011 - mmarek@novell.com + +- Add purge-kernels script to automatically delete old kernel packages + on boot, based on configuration in /etc/zypp/zypp.conf, variable + multiversion_kernels (fate#312018). + +------------------------------------------------------------------- Thu Jun 16 13:31:38 UTC 2011 - mmarek@novell.com - Call udevadm trigger --action=add, because the default is "change" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mkinitrd-2.7.0/mkinitrd.spec new/mkinitrd-2.7.0/mkinitrd.spec --- old/mkinitrd-2.7.0/mkinitrd.spec 2011-06-16 15:33:46.000000000 +0200 +++ new/mkinitrd-2.7.0/mkinitrd.spec 2011-06-21 11:13:33.000000000 +0200 @@ -112,12 +112,14 @@ %install_mkinitrd /usr/bin/perl /sbin/mkinitrd_setup EOF install -m 755 etc/boot.loadmodules $RPM_BUILD_ROOT/etc/init.d/ +install -m 755 etc/purge-kernels.init $RPM_BUILD_ROOT/etc/init.d/purge-kernels install -m 644 etc/sysconfig.kernel-mkinitrd $RPM_BUILD_ROOT/var/adm/fillup-templates/ %post %{remove_and_set -n kernel SKIP_RUNNING_KERNEL NO_KMS_IN_INITRD} %{fillup_only -an kernel} %{insserv_force_if_yast /etc/init.d/boot.loadmodules} +%{fillup_and_insserv -f -Y purge-kernels} case "$NO_KMS_IN_INITRD" in no) sed -i -e "s@^KMS_IN_INITRD=.*@KMS_IN_INITRD=\"yes\"@" /etc/sysconfig/kernel ;; @@ -125,6 +127,9 @@ sed -i -e "s@^KMS_IN_INITRD=.*@KMS_IN_INITRD=\"no\"@" /etc/sysconfig/kernel ;; esac +%postun +%insserv_cleanup + %posttrans /sbin/mkinitrd_setup @@ -140,6 +145,7 @@ %dir /lib/mkinitrd/setup %config /etc/rpm/macros.mkinitrd /etc/init.d/boot.loadmodules +/etc/init.d/purge-kernels /lib/mkinitrd/scripts/*.sh /lib/mkinitrd/bin/* /bin/lsinitrd @@ -147,6 +153,7 @@ /sbin/mkinitrd_setup /sbin/module_upgrade /sbin/installkernel +/sbin/purge-kernels /var/adm/fillup-templates/sysconfig.kernel-%name %doc %{_mandir}/man5/mkinitrd.5.gz %doc %{_mandir}/man8/mkinitrd.8.gz diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mkinitrd-2.7.0/sbin/Makefile new/mkinitrd-2.7.0/sbin/Makefile --- old/mkinitrd-2.7.0/sbin/Makefile 2011-06-16 15:33:46.000000000 +0200 +++ new/mkinitrd-2.7.0/sbin/Makefile 2011-06-21 11:13:33.000000000 +0200 @@ -5,7 +5,7 @@ sbindir = /sbin bindir = /bin -PRGS = mkinitrd installkernel module_upgrade mkinitrd_setup +PRGS = mkinitrd installkernel module_upgrade mkinitrd_setup purge-kernels UPRGS = lsinitrd all: install install: install_prgs install_uprgs diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mkinitrd-2.7.0/sbin/purge-kernels new/mkinitrd-2.7.0/sbin/purge-kernels --- old/mkinitrd-2.7.0/sbin/purge-kernels 1970-01-01 01:00:00.000000000 +0100 +++ new/mkinitrd-2.7.0/sbin/purge-kernels 2011-06-21 11:13:33.000000000 +0200 @@ -0,0 +1,269 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +sub usage { + print "Usage: $0 [--test]\n"; + print "Reads list of kernels to keep from /etc/zypp/zypp.conf:multiversion.kernels\n"; + print "kernels can be given as <version>, latest(-N), running, oldest(+N).\n"; +} + +# arch/flavor => version-release => [ subpackages ] +my %kernels; +my %kmps; + +my @keep_spec; +my ($want_running, $running_version, $running_flavor); + +# do not actually delete anything +my $test_only; + +sub load_config { + my $file = "/etc/zypp/zypp.conf"; + my @kernels; + + if (!-e $file) { + print STDERR "$0: /etc/zypp/zypp.conf does not exist, exiting.\n"; + exit 0; + } + open(my $fh, '<', $file) or die "$0: $file: $!\n"; + while (<$fh>) { + chomp; + next unless /^\s*multiversion\.kernels\b/; + s/^[^=]*=\s*//; + @kernels = split(/,\s*/); + last; + } + close($fh); + for my $kernel (@kernels) { + if ($kernel =~ /^\s*(latest|oldest|running)(\s*[-+]\s*\d+)?\s*$/) { + my $new = { whence => $1, offset => $2 || 0 }; + $new->{offset} =~ s/\s*//g; + if ($new->{whence} eq "running") { + $want_running = 1; + } + push (@keep_spec, $new); + } elsif ($kernel =~ /^\d+\.\d+/) { + my $new = { version => $kernel }; + push (@keep_spec, $new); + } elsif ($kernel =~ /^\s*$/) { + next; + } else { + print STDERR "$0: Ignoring unknow kernel specification in\n"; + print STDERR "/etc/zypp/zypp.conf:multiversion.kernels: $kernel\n"; + } + } +} + +sub add_package { + my ($name, $vr, $arch) = @_; + my ($flavor, $table); + + #print STDERR "add_package: $name $vr $arch\n"; + if ($name eq "kernel-firmware" || $name eq "kernel-coverage") { + return; + } + if ($name =~ /^kernel-/) { + ($flavor = $name) =~ s/^kernel-//; + $table = \%kernels; + } elsif ($name =~ /-kmp-/) { + ($flavor = $name) =~ s/.*-kmp-//; + $table = \%kmps; + } + $flavor =~ s/-.*//; # XXX: No dashes in flavor names + if ($flavor eq "devel") { + # kernel-devel is a subpackage of kernel-source + $flavor = "source"; + } + $table->{"$arch/$flavor"} ||= {}; + $table->{"$arch/$flavor"}{$vr} ||= []; + push(@{$table->{"$arch/$flavor"}{$vr}}, "$name-$vr.$arch"); +} + +sub load_packages { + open(my $pipe, '-|', 'rpm', '-qa', '--qf', '%{n} %{v}-%{r} %{arch}\n', + 'kernel-*', '*-kmp-*') or die "rpm: $!\n"; + while (<$pipe>) { + chomp; + my ($name, $vr, $arch) = split; + add_package($name, $vr, $arch); + } +} + +sub sort_versions { + my @versions = @_; + + pipe (my $read, my $write); + my $pid = fork(); + if (!defined($pid)) { + die "Cannot fork: $!\n"; + } elsif ($pid == 0) { + # child + close($read); + open STDOUT, '>&', $write; + open(my $fh, '|-', "/usr/lib/rpm/rpmsort") or die "/usr/lib/rpm/rpmsort: $!\n"; + print $fh join("\n", @versions), "\n"; + close($fh); + die "rpmsort failed ($?)\n" if $? != 0; + + exit 0; + } + # parent + close($write); + @versions = <$read>; + chomp @versions; + close($read); + waitpid($pid, 0); + die "rpmsort failed ($?)\n" if $? != 0; + + return @versions; +} + +# return true if VER1 is a prefix of VER2 (to handle the .x rebuild counter) +sub version_match { + my ($ver1, $ver2) = @_; + + return ($ver1 eq substr($ver2, 0, length($ver1))); +} + +sub list_old_packages { + my ($flavor) = @_; + + # ignore kernel-source for now + return if $flavor =~ /\/source$/; + + my $kernels = $kernels{$flavor}; + my @versions = sort_versions(keys(%$kernels)); + my %idx = ( + oldest => 0, + latest => scalar(@versions) - 1, + ); + if ($want_running && $running_flavor eq $flavor) { + for (my $i = scalar(@versions) - 1; $i >= 0; $i--) { + if (version_match($running_version, $versions[$i])) { + $idx{running} = $i; + last; + } + } + if (!exists($idx{running})) { + print STDERR "$0: Running kernel $running_version-$running_flavor not installed.\n"; + print "NOT removing any packages for flavor $flavor.\n"; + return; + } + } + my %delete = map { $_ => 1 } @versions; + for my $keep (@keep_spec) { + if ($keep->{version}) { + for my $ver (@versions) { + if (version_match($keep->{version}, $ver)) { + $delete{$ver} = 0; + } + } + } elsif ($keep->{whence}) { + next unless exists($idx{$keep->{whence}}); + my $idx = $idx{$keep->{whence}}; + $idx += $keep->{offset}; + next unless $idx >= 0 && $idx < scalar(@versions); + $delete{$versions[$idx]} = 0; + } else { + die "??"; + } + } + my @packages; + for my $ver (grep { $delete{$_} } @versions) { + push(@packages, @{$kernels->{$ver}}); + } + return @packages; +} + +sub remove_packages { + my @packages = @_; + + while (1) { + pipe(my $read, my $write); + my $pid = fork(); + if (!defined($pid)) { + die "Cannot fork: $!\n"; + } elsif($pid == 0) { + # child + close($read); + open STDOUT, '>&', $write; + open STDERR, '>&', $write; + $ENV{LC_ALL} = "C"; + my @cmd = qw(rpm -e); + push(@cmd, "--test") if $test_only; + exec(@cmd, @packages) or die "rpm: $!\n"; + } + # parent + close($write); + my @out = <$read>; + chomp @out; + close($read); + waitpid($pid, 0); + if ($? == 0) { + print "Removed:\n ", join("\n ", @packages), "\n"; + return 1; + } + my ($retry, @problems); + my %old_packages = map { $_ => 1 } @packages; + my %new_packages; + for (@out) { + if (/ is needed by \(installed\) (.*-kmp-.*)/ && + !$old_packages{$1}) { + push(@packages, $1) unless $new_packages{$1}; + $new_packages{$1} = 1; + $retry = 1; + } else { + push(@problems, $_); + } + } + if (!$retry) { + print STDERR join("\n", @problems), "\n"; + print STDERR "$0: giving up.\n"; + return 0; + } + } +} + +for my $arg (@ARGV) { + if ($arg eq "-h" || $arg eq "--help") { + usage(); + exit; + } elsif ($arg eq "--test") { + $test_only = 1; + } elsif ($arg =~ /^-/) { + print STDERR "Unknown option: $arg\n"; + usage(); + exit 1; + } +} +load_config(); +if (!@keep_spec) { + print STDERR "$0: multiversion.kernels not configured in /etc/zypp/zypp.conf, exiting.\n"; + exit 0; +} + +load_packages(); +if ($want_running) { + $running_version = `uname -r`; + chomp($running_version); + ($running_flavor = $running_version) =~ s/.*-//; + $running_version =~ s/-[^-]*$//; + my $arch = `uname -m`; + chomp($arch); + $arch =~ s/^i.86$/i586/; + $running_flavor = "$arch/$running_flavor"; +} +my @remove; +for my $flavor (sort(keys(%kernels))) { + push(@remove, list_old_packages($flavor)); +} +if (!@remove) { + print STDERR "$0: Nothing to do.\n"; + exit 0; +} +if (remove_packages(@remove)) { + exit 0; +} +exit 1; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... -- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org