#!/bin/zsh setopt extendedglob keepver=() arch=i586 mydir=$(pwd) for url ( \ http://download.opensuse.org/update/11.1/rpm/$arch/ \ http://download.opensuse.org/repositories/Kernel://HEAD/openSUSE_11.1/$arch/ \ ) { versions=($(wget -nv $url -O-|perl -nE'say if (undef,$_) = m{}')) if [[ ! $#versions -gt 0 ]] { echo Could not get kernel version, aborting... exit 1 } tempdir=$(mktemp -d) if [[ $tempdir != /* ]] { echo No valid tempdir found, got $tempdir, aborting... exit 2 } trap ' trap - INT cd $tempdir rm *(L0) cd rmdir $tempdir return $((128+$1)) ' INT cd $tempdir touch $versions keepver+=$(ls -rv|head -1) rm *(L0) cd rmdir $tempdir trap - INT } echo echo Newest stable kernel: $keepver[1] echo Newest head kernel: \ $keepver[2] echo echo Getting installed packages list... inst_kernel_pkgs=($(rpm -qa kernel\*)) keep_stable=(${(M)inst_kernel_pkgs:#*-$keepver[1]}) keep_head=(${(M)inst_kernel_pkgs:#*-$keepver[2]}) error==false if [[ ! $#keep_stable -gt 0 ]] { echo Linux $keepver[1] \(the most recent stable kernel\) is not installed error==true } if [[ ! $#keep_head -gt 0 ]] { echo Linux $keepver[2] \(the most recent head kernel\) is not installed error==true } if { $error } { echo Aborting... exit 3 } inst_kernel_pkg_names=(${keep_stable/-$keepver[1]} ${keep_head/-$keepver[2]}) remove_kernel_pkgs2=($inst_kernel_pkgs) remove_kernel_pkgs2=(${remove_kernel_pkgs2:#*-$keepver[1]}) remove_kernel_pkgs2=(${remove_kernel_pkgs2:#*-$keepver[2]}) remove_kernel_pkgs=() typeset -U remove_kernel_pkgs for pkg_name ($inst_kernel_pkg_names) { remove_kernel_pkgs+=(${(M)remove_kernel_pkgs2:#$pkg_name-[[:digit:]].[[:digit:]][^-]#-[^-]#[[:digit:]]}) } running=$(uname -r) running2=${running%-*} running=${running##*-}-${running2%%-*}-$(echo ${running2#*-}|tr - .) running_removes=(${(M)remove_kernel_pkgs:#kernel-$running.*}) if [[ $#running_removes -gt 0 ]] { echo You are not running the most recent kernel, but we want to remove $running echo Aborting... exit 4 } if [[ ! $#remove_kernel_pkgs -gt 0 ]] { echo No stale kernels found. Nothing to do. exit } echo Going to remove the following packages: print -l ${(n)remove_kernel_pkgs} echo echo TODO: sudo rpm -ev $remove_kernel_pkgs echo -n Really uninstall\? \[yn\] if { read -q } { sudo rpm -ev $remove_kernel_pkgs } \ else { echo run $0 again if you want to clean old kernels at any time } cd $mydir