Workarounds for aai upgrade bugs.
[carnet-upgrade.git] / src / functions.sh
index d5d934b..19c76b3 100644 (file)
@@ -467,7 +467,7 @@ check_grsec_kernel () {
     return 0
   fi
 
-  if [ "$ver" = "${ver#2.6.2[4-9]}" ] || reboot_required; then
+  if [ "$ver" = "${ver#2.6.2[4-9]}" ]; then
     # kernel too old
     notice "
 Prije prelaska na Debian Lenny potrebno je napraviti nadogradnju na najnoviji kernel.
@@ -483,6 +483,18 @@ Nakon toga ponovno pozovite ovu skriptu."
   fi
 }
 
+check_reboot () {
+  reboot_required || return 0
+
+  LC_MESSAGES=hr_HR dialog --backtitle "$title" --yesno "$reboot_warning" 18 +75
+  if [ $? -eq 0 ]; then
+    log "Reboot before continuing."
+    exit 0
+  else
+    log "Proceed without reboot."
+  fi
+}
+
 # check if the latest kernel is booted
 reboot_required () {
   local default_kernel kernel_package running_release running_version
@@ -692,25 +704,45 @@ fix_etc_default_raid2 () {
 # restore original config file (if the new package version is not
 # installed already)
 restore_config () {
-  local file file_backup file_orig
-  local old_umask
+  local file file_backup file_expect file_restore config_changed
+  local cn_package cn_version package version
+
+  # check if new package version is installed
+  cn_package=$1
+  package=$2
+  version=$3
+
+  if [ "$cn_package" ]; then
+     if ! pkg $cn_package; then
+        # do nothing if cn package is not installed
+        return 0
+     fi
+  fi
 
-  # create new files safely
-  old_umask=`umask`
-  umask 0077
+  if [ "$package" ]; then
+     if [ "$version" ]; then
+        # do nothing if package is already upgraded to new version
+        pkg $package lt $version || return 0
+     else
+        # do nothing if package is not installed
+        pkg $package || return 0
+     fi
+  fi
+  shift 3
 
   # restore package files
   for file in $*; do
-    file_orig=/usr/share/carnet-upgrade/files/$file
+    file_expect=/usr/share/carnet-upgrade/files/$file.expect
+    file_restore=/usr/share/carnet-upgrade/files/$file.restore
     file_backup=$file.$backup_ext
 
-    # is config there
-    if [ ! -e $file ]; then
+    # is config files are there
+    if ! [ -e $file -a -e $file_expect -a -e $file_restore ]; then
         continue
     fi 
 
     # is restore needed
-    if cmp $file_orig $file >/dev/null; then
+    if ! cmp $file_expect $file >/dev/null; then
         continue
     fi
 
@@ -719,72 +751,107 @@ restore_config () {
       log "Restoring config file $file"
 
       # backup local changes
-      mv -v $file $file_backup
+      cp -av $file $file_backup
 
       # restore original
-      cp -av $file_orig $file
-      chown --reference $file_backup $file
-      chmod --reference $file_backup $file
+      cp -v $file_restore $file
+
+      config_changed=1
     fi
   done
 
-  umask $old_umask
+  # force reconfiguration at the end if package is not upgraded automatically
+  if [ "$config_changed" -a "$cn_package" ]; then
+     cn_version=$( dpkg -s "$cn_package" | awk '/^Version:/ {print $2}' )
+     post_upgrade "pkg $cn_package gt $cn_version || dpkg-reconfigure $cn_package"
+  fi
 }
 
 # restore modified config to their package defaults
 # so the upgrade doesn't complain so much
 restore_configs () {
+  local hostname domain template config_new
   local config_backup
 
-  pkg base-files lt 4 && restore_config /etc/issue /etc/issue.net
-  pkg libpam-modules lt 0.79 && restore_config /etc/security/limits.conf
-  pkg login lt 1:4.0.18.1 && restore_config /etc/pam.d/login
-  pkg mysql-server lt 5.0.3 && restore_config /etc/init.d/mysql \
-                                    /etc/logrotate.d/mysql-server \
-                                    /etc/mysql/my.cnf
-  pkg ntp lt 1:4.2.2 && restore_config /etc/ntp.conf
-  pkg ntpdate lt 1:4.2.2 && restore_config /etc/default/ntpdate
-  pkg oidentd lt 2.0.8 && restore_config /etc/default/oidentd
-  pkg postgrey lt 1.27 && restore_config /etc/default/postgrey \
-                               /etc/postgrey/whitelist_clients
-  pkg procps lt 1:3.2.7 && restore_config /etc/sysctl.conf
-  pkg sasl2-bin lt 2.1.22 && restore_config /etc/default/saslauthd
-  pkg slapd lt 2.3.30 && restore_config /etc/default/slapd /etc/init.d/slapd
-  pkg squirrelmail lt 2:1.4.9a && restore_config /etc/squirrelmail/apache.conf
-  pkg vsftpd lt 2.0.5 && restore_config /etc/vsftpd.conf
-  pkg xinetd lt 1:2.3.14 && restore_config /etc/xinetd.conf
-
-  # orphaned config file - no owner
-  if pkg logcheck-database lt 1.2.54; then
-      rm -vf /etc/logcheck/ignore.d.server/imap
-  fi
-
-  # aide switched to ucf, move old configs aside
-  if pkg aide lt 0.13.1; then
-      for file in /etc/aide/aide.conf \
-                  /etc/cron.daily/aide \
-                  /etc/default/aide;
-      do
-          if [ ! -e "$file.$backup_ext" ]; then
-              mv -v "$file" "$file.$backup_ext"
-          fi
-
-          rm -vf "$file"
-      done
+  # restore simple configs
+  restore_config kernel-2.6-cn procps 1:3.2.7-11 /etc/sysctl.conf
+  restore_config ntp-cn ntp 1:4.2.4p4+dfsg-8 /etc/ntp.conf
+  restore_config apache2-cn apache2.2-common 2.2.9-10+lenny2 /etc/apache2/ports.conf
+  restore_config postfix-cn sasl2-bin 2.1.22.dfsg1-23 /etc/default/saslauthd
+  restore_config bind9-cn bind9 1:9.5.1.dfsg.P1-1 /etc/bind/named.conf.options
+  restore_config amavisd-cn amavisd-new 1:2.6.1.dfsg-1 /etc/cron.daily/amavisd-new
+  rm -f /etc/cron.daily/amavisd-new.$backup_ext
+  restore_config spamassassin-cn razor 1:2.85-1 /etc/razor/razor-agent.conf
+  restore_config kernel-2.6-cn libpam-modules 1.0.1-5 /etc/security/limits.conf
+  restore_config samba-cn samba-common 2:3.2.5-4lenny2 /etc/samba/smb.conf
+
+  # check if monitrc is template based
+  if [ -f /etc/monit/monitrc -a ! -f /etc/monit/monitrc.$backup_ext ]; then
+     template=/usr/share/carnet-upgrade/files/etc/monit/monitrc.template
+     config_new=$(mktemp /var/lib/carnet-upgrade/monitrc.XXXXXX)
+     hostname=$(hostname)
+     domain=$(hostname --domain)
+
+     # generate config from template
+     cp $template $config_new
+     check_and_sed "@localhost" \
+       "s/@localhost/@$hostname.$domain/g" $config_new || true
+
+     # compare with running config
+     if cmp -s /etc/monit/monitrc $config_new; then
+        # restore if running config is generated template
+        log "Restoring config file /etc/monit/monitrc"
+        cp -av /etc/monit/monitrc /etc/monit/monitrc.$backup_ext
+        cp -v /usr/share/carnet-upgrade/files/etc/monit/monitrc.restore \
+              /etc/monit/monitrc
+     fi
+     rm -f $config_new
   fi
 
-  # register cn changes in ucf managed files
-  for config in /etc/apache/modules.conf \
-                /etc/clamav/clamd.conf \
-                /etc/clamav/freshclam.conf
-  do 
-      config_backup=$config.$backup_ext
-      if [ -e $config -a ! -e $config_backup ]; then
-          log "Saving config file $config"
-          cp -av $config $config_backup
-          ucf $config_backup $config
-      fi
-  done
+#  restore_config base-files 4 /etc/issue /etc/issue.net
+#  restore_config base-files 4 /etc/issue /etc/issue.net
+#  restore_config login 1:4.0.18.1 /etc/pam.d/login
+#  restore_config mysql-server 5.0.3 /etc/init.d/mysql \
+#                                    /etc/logrotate.d/mysql-server \
+#                                    /etc/mysql/my.cnf
+#  restore_config ntpdate 1:4.2.2 /etc/default/ntpdate
+#  restore_config oidentd 2.0.8 /etc/default/oidentd
+#  restore_config slapd 2.3.30 /etc/default/slapd /etc/init.d/slapd
+#  restore_config squirrelmail 2:1.4.9a /etc/squirrelmail/apache.conf
+#  restore_config vsftpd 2.0.5 /etc/vsftpd.conf
+#  restore_config xinetd 1:2.3.14 /etc/xinetd.conf
+#
+#  # orphaned config file - no owner
+#  if pkg logcheck-database lt 1.2.54; then
+#      rm -vf /etc/logcheck/ignore.d.server/imap
+#  fi
+#
+#  # aide switched to ucf, move old configs aside
+#  if pkg aide lt 0.13.1; then
+#      for file in /etc/aide/aide.conf \
+#                  /etc/cron.daily/aide \
+#                  /etc/default/aide;
+#      do
+#          if [ ! -e "$file.$backup_ext" ]; then
+#              mv -v "$file" "$file.$backup_ext"
+#          fi
+#
+#          rm -vf "$file"
+#      done
+#  fi
+#
+#  # register cn changes in ucf managed files
+#  for config in /etc/apache/modules.conf \
+#                /etc/clamav/clamd.conf \
+#                /etc/clamav/freshclam.conf
+#  do 
+#      config_backup=$config.$backup_ext
+#      if [ -e $config -a ! -e $config_backup ]; then
+#          log "Saving config file $config"
+#          cp -av $config $config_backup
+#          ucf $config_backup $config
+#      fi
+#  done
 }
 
 # temporary disable listchanges packages to reduce clutter during upgrade
@@ -813,10 +880,10 @@ apt_listchanges () {
 
 # make a silent installation of carnet and srce keyrings
 install_keyrings () {
-  pkgadd carnet-keyring srce-keyring
+  pkgadd carnet-keyring srce-keyring debian-archive-keyring
   pkgadd dpkg apt debconf python-apt
 
-  dpkg-reconfigure carnet-keyring srce-keyring
+  dpkg-reconfigure carnet-keyring srce-keyring debian-archive-keyring
   apt_update
 }
 
@@ -882,7 +949,7 @@ upgrade_amavis () {
   local conf
 
   # remove init script diversion before upgrade
-  if pkg amavisd-cn lt 3:2.4.2-4; then 
+  if pkg amavisd-cn lt 3:2.6.1-1; then 
     if [ -L /etc/init.d/amavis -a -f /etc/init.d/amavis.amavisd-new ]; then
       rm -vf /etc/init.d/amavis
       dpkg-divert --remove /etc/init.d/amavis
@@ -913,9 +980,62 @@ upgrade_amavis () {
   /etc/init.d/amavis restart
 }
 
-# fix openldap-aai postinst user handling
-upgrade_openldap () {
-  pkg openldap-aai lt 2.3 || return 0
+# handle freerdius config files upgrade
+upgrade_freeradius () {
+  local template config_new password realm
+
+  pkg freeradius-aai lt 2.1.3-0lenny0 || return 0
+
+  # handle static configs
+  restore_config freeradius-aai freeradius 2.1.3-0lenny0 \
+    /etc/freeradius/clients.conf \
+    /etc/freeradius/hints \
+    /etc/freeradius/ldap.attrmap \
+    /etc/freeradius/radiusd.conf
+
+  # handle template based configs
+  template=/usr/share/carnet-upgrade/files/etc/freeradius/eap.conf.template
+  config_new=$(mktemp /var/lib/carnet-upgrade/eap.conf.XXXXXX)
+  password=$(grep -s '^[[:space:]]*private_key_password[[:space:]]*=' \
+    /etc/freeradius/eap.conf)
+  cp $template $config_new
+  sed -i "s/.*#PASSWORD#.*/$password/" $config_new
+  if cmp -s $config_new /etc/freeradius/eap.conf >/dev/null; then
+     log "Restoring config file /etc/freeradius/eap.conf"
+     cp -v /usr/share/carnet-upgrade/files/etc/freeradius/eap.conf.restore \
+           /etc/freeradius/eap.conf
+  fi
+  rm -f $config_new
+  
+  template=/usr/share/carnet-upgrade/files/etc/freeradius/proxy.conf.template
+  config_new=$(mktemp /var/lib/carnet-upgrade/proxy.conf.XXXXXX)
+  realm=$(sed -n '/^[[:space:]]*suffix[[:space:]]*/ { 
+    s///; s/"//g; s/,dc=/./g; s/dc=//; s/.hr$//; p; q }' /etc/ldap/slapd.conf)
+  cp $template $config_new
+  sed -i "s/#REALM#/$realm/" $config_new
+  if cmp -s $config_new /etc/freeradius/proxy.conf >/dev/null; then
+     log "Restoring config file /etc/freeradius/proxy.conf"
+     cp -v /usr/share/carnet-upgrade/files/etc/freeradius/proxy.conf.restore \
+           /etc/freeradius/proxy.conf
+  fi
+  rm -f $config_new
+
+  # install the new packages
+  if ! apt-get -y install freeradius; then
+     # freeradius upgrade fails here, try to fix it by creating certificates
+     [ -x /etc/freeradius/certs/bootstrap ] && /etc/freeradius/certs/bootstrap
+     
+     dpkg --configure -a
+     apt-get -y -f install
+  fi
+
+  # finally try to cleanup this mess
+  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
@@ -923,12 +1043,19 @@ upgrade_openldap () {
   if [ -f $ldif ]; then
     cp -v $ldif $ldif_backup
   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
@@ -989,7 +1116,7 @@ upgrade_dovecot () {
   default_mail_env=$(get_variable default_mail_env /etc/dovecot/dovecot.conf)
 
   # silently upgrade package
-  restore_config /etc/dovecot/dovecot.conf
+  restore_config dovecot-cn dovecot-common 1.0 /etc/dovecot/dovecot.conf
   pkgadd dovecot-cn
 
   # insert old mail location
@@ -1008,6 +1135,51 @@ upgrade_dovecot () {
   fi
 }
 
+# restore munin configs for silent upgrade
+upgrade_munin () {
+  local config backup hostname domain
+
+  for pkg_name in munin munin-node; do
+     pkg $pkg_name lt '1.2.6-10~lenny1' || continue
+
+     config=/etc/munin/$pkg_name.conf
+     backup=$config.$backup_ext
+     if [ -f $config -a ! -f $backup ]; then
+        hostname=$(hostname)
+        domain=$(hostname --domain)
+
+        cp -av $config $backup
+        check_and_sed "$hostname.$domain" \
+          "s/$hostname.$domain/localhost.localdomain/g" $config
+     fi
+     pkgadd $pkg_name
+  done
+
+  # force localhost -> hostname replacement in config files
+  pkgadd munin-cn
+  dpkg-reconfigure munin-cn
+}
+
+# udev.preinst fails if devfs configs still exist
+upgrade_udev () {
+  local config
+
+  for config in /etc/udev/rules.d/devfs.rules \
+                /etc/udev/rules.d/compat-full.rules \
+                /etc/udev/rules.d/compat.rules
+  do
+     if [ -e $config ]; then
+        mv -v $config /etc/udev/
+     fi
+  done
+
+  if [ -f /etc/udev/udev.rules -a ! -f /etc/udev/rules.d/udev.rules ]; then
+     ln -sfv ../udev.rules /etc/udev/rules.d/
+  fi
+
+  pkgadd udev
+}
+
 # fix /etc/dpkg/dpkg.cfg
 comment_force_overwrite () {
   if [ -f /etc/dpkg/dpkg.cfg ]; then