X-Git-Url: http://ftp.carnet.hr/carnet-debian/scm?a=blobdiff_plain;f=src%2Ffunctions.sh;h=0fee7ca38ac0fa4b2ab36348633dcc205f107484;hb=a15294f52fc01f32e55378ef8f3ef8973700e743;hp=1c1dcdf4542f50693f6138faf1c0e52920868c05;hpb=04955f721fdc6e0ecd6a69d116609abd7e5eaffd;p=carnet-upgrade.git diff --git a/src/functions.sh b/src/functions.sh index 1c1dcdf..0fee7ca 100644 --- a/src/functions.sh +++ b/src/functions.sh @@ -128,11 +128,26 @@ apt_autoremove () { } } +# remove stale package information from available +# warning, in file '/var/lib/dpkg/available' +# near line 58185 package 'vim-cn': missing architecture +cleanup_available () { + log "Cleaning dpkg available file" + + available=$(mktemp /var/lib/carnet-upgrade/available.XXXXXX) + apt-cache dumpavail > $available + + dpkg --clear-avail + dpkg --update-avail $available + + rm -f $available +} + remove_x() { LC_MESSAGES=hr_HR dialog --backtitle "$title" --yesno "$msg_remove_x" 18 75 if [ $? -eq 0 ]; then log "Removing X Window System" - pkgrm x11-common + pkgrm xserver-xorg else log "Skipping X Window System removal" fi @@ -500,7 +515,12 @@ install_new () { create_sources_list () { local sl sl_new sl=/etc/apt/sources.list - sl_new=/usr/share/carnet-upgrade/files/etc/apt/sources.list + sl_new=$( copy_template $sl ) + + # comment aai repository if not in use + if ! pkg srce-keyring; then + sed -i 's/^\(deb.*ftp.srce.hr\)/#\1/' $sl_new + fi # check if already installed if ! cmp $sl $sl_new >/dev/null; then @@ -516,8 +536,9 @@ create_sources_list () { `cat /etc/apt/sources.list`" fi -} + rm $sl_new +} # funkcija koja brise grupu proc remove_group_proc () { @@ -733,6 +754,10 @@ restore_configs () { restore_file /etc/issue.net fi + if pkg slapd lt 2.4.23-7.2; then + restore_file /etc/default/slapd + fi + # dovecot won't start with these options if pkg dovecot-cn && pkg dovecot-common lt 1:1.2.15-7; then sed -i 's/^\( *\)\(sieve\(_storage\)\?=.*\)/\1#\2/' \ @@ -762,15 +787,14 @@ apt_listchanges () { case $command in disable) if [ -f $file ]; then - dpkg-divert --local --rename --divert $file.$backup_ext \ + dpkg-divert --local --rename --divert $file.disabled \ --add $file || true fi ;; enable) - if [ -f $file.$backup_ext ]; then - dpkg-divert --remove $file || true - fi + # cleanup the diversion even if the file is already removed + dpkg-divert --rename --remove $file || true ;; esac done @@ -778,9 +802,14 @@ apt_listchanges () { # make a silent installation of carnet and srce keyrings install_keyrings () { - pkgadd carnet-keyring srce-keyring debian-archive-keyring + pkgadd carnet-keyring debian-archive-keyring + dpkg-reconfigure carnet-keyring debian-archive-keyring + + if pkg srce-keyring; then + pkgadd srce-keyring + dpkg-reconfigure srce-keyring + fi - dpkg-reconfigure carnet-keyring srce-keyring debian-archive-keyring apt_update } @@ -799,15 +828,20 @@ is_orphaned () { # remove old and unused libraries remove_orphaned () { - local package + local package remove apt_autoremove + remove= for package in $orphaned_packages; do if is_orphaned $package; then - pkgrm $package + remove="$remove $package" fi done + + if [ "$remove" ]; then + pkgrm $remove + fi } # monit it causing problems for postinst scripts @@ -823,9 +857,19 @@ disable_monit () { apt-get remove --yes monit # stop the binary pkill -9 monit || true + # move away init for insserv to work + mv /etc/init.d/monit /var/lib/carnet-upgrade/ fi } +# allow monit to run again +enable_monit () { + if [ -f /var/lib/carnet-upgrade/monit ]; then + mv /var/lib/carnet-upgrade/monit /etc/init.d/monit + pkgadd monit-cn + fi +} + # check which of the given packages are installed grep_installed () { local package installed @@ -852,7 +896,7 @@ pkgupgrade () { # make a silent upgrade to new libc6 upgrade_libc () { - DEBIAN_FRONTEND=noninteractive pkgupgrade libc6 libc6-dev tzdata udev + DEBIAN_FRONTEND=noninteractive pkgupgrade libc6 libc6-dev tzdata } # upgrade apache2/php5 @@ -881,56 +925,37 @@ upgrade_amavis () { # handle freerdius upgrade upgrade_freeradius () { - local template config_new password realm hostname basedn + local password - pkg freeradius-aai lt 2.1.3-0lenny0 || return 0 + pkg freeradius-aai lt 2.1.10-1 || return 0 - # aai team prevents a clean upgrade + # aai team prevents a normal upgrade cp -av /etc/freeradius /etc/freeradius.$backup_ext pkgrm freeradius-aai freeradius-ldap freeradius + rm -rf /etc/freeradius/certs pkgadd freeradius-aai -} -# prepare for slapd upgrade (caused by freeradius installation) -prepare_openldap () { - pkg openldap-aai lt 2.4 || return 0 - - # openldap-aai expects org.ldif to exists - local ldif=/var/lib/ldap/org.ldif - local ldif_backup=/var/lib/carnet-upgrade/org.ldif - if [ -f $ldif ]; then - cp -v $ldif $ldif_backup + # sync localhost passwords + if pkg libpam-radius-auth && [ -f "/etc/pam_radius_auth.conf" ]; then + pkgadd libpam-radius-auth + password=$( + sed -n '/^[[:space:]]*client[[:space:]]\+localhost/,/^[[:space:]]*}/ { /^[[:space:]]*secret[[:space:]]*=[[:space:]]*\([^[:space:]]*\)/s//\1/p }' /etc/freeradius/clients.conf + ) + if [ "$password" ] \ + && ! grep -q "^127.0.0.1[[:space:]]\+$password[[:space:]]\+" \ + /etc/pam_radius_auth.conf + then + sed -i.$backup_ext "s/^\(127.0.0.1[[:space:]]*\)[^[:space:]]*\(.*\)/\1$password\2/" /etc/pam_radius_auth.conf + fi fi } -# fix openldap-aai postinst user handling -upgrade_openldap () { - pkg openldap-aai lt 2.4 || return 0 - - # slapd postinst fails if move_old_database is false - echo 'slapd slapd/move_old_database boolean true' | debconf-set-selections - pkgadd slapd - - # slapd removes org.ldif during switch from ldap -> openldap user - local ldif=/var/lib/ldap/org.ldif - local ldif_backup=/var/lib/carnet-upgrade/org.ldif - if [ -f $ldif_backup -a ! -f $ldif ]; then - cp -v $ldif_backup $ldif - fi - - # openldap-aai postinst fails here because of database permissions - apt-get -y install openldap-aai || true - chown -R openldap:openldap /var/lib/ldap - /etc/init.d/slapd restart - dpkg --configure -a - - # remove ldap user if openldap works - if getent passwd ldap > /dev/null && \ - getent passwd openldap > /dev/null && \ - pgrep -U openldap slapd > /dev/null - then - log "userdel ldap (replaced by openldap)" - userdel ldap || true +# handle mysql 5.0 to 5.1 upgrade +upgrade_mysql () { + if pkg mysql-server || pkg mysql-server-5.0; then + pkgadd mysql-server + dpkg -P mysql-server-5.0 + /etc/init.d/mysql restart fi } @@ -972,6 +997,12 @@ get_variable () { upgrade_munin () { local config backup hostname domain + # new htmldir location + if [ -d /var/www/munin -a ! -e /var/cache/munin/www ]; then + mkdir -p /var/cache/munin + mv /var/www/munin /var/cache/munin/www + fi + for pkg_name in munin munin-node; do pkg $pkg_name lt '1.4.5-3' || continue @@ -1031,16 +1062,29 @@ check_archives_space() { fi } -check_kernel_space() { - local available_disk_space kernel_size linux_images metapkg pkg ret - available_disk_space=$(free_space /) +# calculate the list of linux-image packages from kernel-2.6-cn dependencies +get_cn_kernels() { + local cn_kernels linux_images metapkg pkg + + cn_kernels= linux_images=$(apt-cache show kernel-2.6-cn | grep ^Depends: \ | grep -o 'linux-image[^, ]*') for metapkg in $linux_images; do pkg=$(apt-cache show $metapkg | grep ^Depends: \ | grep -o 'linux-image[^, ]*' | head -1) - [ "$pkg" ] || continue + [ "$pkg" ] && cn_kernels="$cn_kernels $pkg" + done + + echo $cn_kernels +} +# check if there is enough space on / for the new kernel package +check_kernel_space() { + local available_disk_space kernel_size linux_images pkg ret + available_disk_space=$(free_space /) + + linux_images=$( get_cn_kernels ) + for pkg in $linux_images; do kernel_size=$(installed_size $pkg) ret=$? [ $ret -eq 0 ] && break @@ -1069,6 +1113,82 @@ check_kernel_space() { fi } +# free some space on / partition by cleaning old unused kernels +clean_old_kernels() { + local installed keep pkg keep remove delete name dialog_list selection + + # find all installed kernels + installed=$( + dpkg -l | egrep '^ii linux-image-[0-9]+[.][0-9]+[.][0-9]+-' \ + | awk '{print $2}' + ) + log "Found kernel packages: $installed" + + # leave current and new kernels + keep="linux-image-$(uname -r) $(get_cn_kernels)" + log "Keep kernel packages: $keep" + + # check what to remove + remove= + for pkg in $installed; do + delete=yes + for name in $keep; do + [ "$pkg" = "$name" ] && delete= + done + if [ "$delete" = yes ]; then + remove="$remove $pkg" + fi + done + log "Obsolete kernel packages: $remove" + + if [ "$remove" ]; then + for pkg in $remove; do + dialog_list="$dialog_list $pkg '' off" + done + + # user selects the packages to delete + selection=$( mktemp /var/lib/carnet-upgrade/selection.XXXXXX ) + eval LC_MESSAGES=hr_HR dialog --nocancel --backtitle \""$title"\" \ + --checklist \""$msg_remove_kernels"\" 20 75 6 $dialog_list 2>$selection + + selected=$( tr -d \" < $selection ) + rm -f $selection + + if [ "$selected" ]; then + log "Removing kernel packages: $selected" + pkgrm $selected + fi + fi +} + +# prevent sysv-rc migration problems +clean_initd_packages() { + local list removed pkg dialog_list selection selected + + list=$( dpkg -S /etc/init.d/\* | grep -v ^diversion | cut -d: -f1 | sort -u ) + removed=$( dpkg -l $list | sed -n 's/^r.[[:space:]]\+\([^[:space:]]\+\).*/\1/p' ) + log "Found removed packages: $removed" + + if [ "$removed" ]; then + for pkg in $removed; do + dialog_list="$dialog_list $pkg '' off" + done + + # user selects the packages to delete + selection=$( mktemp /var/lib/carnet-upgrade/selection.XXXXXX ) + eval LC_MESSAGES=hr_HR dialog --nocancel --backtitle \""$title"\" \ + --checklist \""$msg_remove_initd"\" 20 75 6 $dialog_list 2>$selection + + selected=$( tr -d \" < $selection ) + rm -f $selection + + if [ "$selected" ]; then + log "Purging packages: $selected" + dpkg -P $selected + fi + fi +} + free_space() { df --portability --block-size=1M "$1" | tail -1 | awk '{print $4}' }