Kernel and init script cleanup.
[carnet-upgrade.git] / src / functions.sh
index 95dd0e3..0fee7ca 100644 (file)
@@ -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,6 +925,8 @@ upgrade_amavis () {
 
 # handle freerdius upgrade
 upgrade_freeradius () {
+  local password
+
   pkg freeradius-aai lt 2.1.10-1 || return 0
 
   # aai team prevents a normal upgrade
@@ -888,21 +934,28 @@ upgrade_freeradius () {
   pkgrm freeradius-aai freeradius-ldap freeradius
   rm -rf /etc/freeradius/certs
   pkgadd freeradius-aai
-}
 
-# handle openldap upgrade
-upgrade_openldap () {
-  # aai does not depend on the new openldap version
-  pkgadd slapd
-  pkgadd openldap-aai
+  # 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
 }
 
 # handle mysql 5.0 to 5.1 upgrade
 upgrade_mysql () {
   if pkg mysql-server || pkg mysql-server-5.0; then
      pkgadd mysql-server
-     pkgrm mysql-server-5.0
-     /etc/init.d/mysql start
+     dpkg -P mysql-server-5.0
+     /etc/init.d/mysql restart
   fi
 }
 
@@ -944,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
 
@@ -1003,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
@@ -1041,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}'
 }