Use dpkg-divert to disable apt-listchanges.
[carnet-upgrade.git] / src / functions.sh
index 7a14d80..25ef535 100644 (file)
@@ -304,11 +304,24 @@ upgrade () {
 
 # funkcija utrpa ispravan sources.list
 create_sources_list () {
-    [ -f /etc/apt/sources.list -a ! -f /etc/apt/sources.list.cn4-upgrade ] && mv /etc/apt/sources.list /etc/apt/sources.list.cn4-upgrade
-    cp /usr/share/carnet-upgrade/files/etc/apt/sources.list /etc/apt
-    notice "Novi sadrzaj datoteke /etc/apt/sources.list:
+    local sl sl_new
+    sl=/etc/apt/sources.list
+    sl_new=/usr/share/carnet-upgrade/files/etc/apt/sources.list
+
+    # check if already installed
+    if ! cmp $sl $sl_new >/dev/null; then
+
+        # backup old version
+        if [ -f $sl -a ! -f $sl.$backup_ext ]; then
+            cp $sl $sl.$backup_ext
+        fi
+
+        # install new version
+        cp $sl_new $sl
+        notice "Novi sadrzaj datoteke /etc/apt/sources.list:
 
 `cat /etc/apt/sources.list`"
+    fi
 }
 
 
@@ -328,11 +341,8 @@ add_group_proc () {
     log "groupadd -g 99 proc"
 
     # update oidentd so it uses the proc group
-    if [ -x /etc/init.d/oidentd -a -f /etc/default/oidentd ]; then
-       if check_and_sed '^OIDENT_GROUP=oident' \
-                         's/^\(OIDENT_GROUP\)=.*/\1=proc/' \
-                         /etc/default/oidentd;
-        then
+    if [ -x /etc/init.d/oidentd ]; then
+        if gpasswd -a oident proc; then
             /etc/init.d/oidentd restart
         fi
     fi
@@ -341,7 +351,7 @@ add_group_proc () {
 
 # backup_slapd_db
 backup_slapd_db () {
-  local ldap_backup=/var/backups/slapcat.cn4-upgrade
+  local ldap_backup=/var/backups/slapcat.$backup_ext
 
   if [ ! -f $ldap_backup ]; then
     [ -x /etc/init.d/freeradius ] && /etc/init.d/freeradius stop || true
@@ -364,7 +374,7 @@ backup_slapd_db () {
 
 # backup etc direktorija
 backup_etc_dir () {
-  local etc_backup=/var/backups/etc.cn4-upgrade.tar.gz
+  local etc_backup=/var/backups/etc.$backup_ext.tar.gz
 
   if [ ! -f $etc_backup ]; then
     if tar cfz $etc_backup /etc 2> /dev/null; then
@@ -380,32 +390,45 @@ backup_etc_dir () {
 # fixaj /etc/default/raid2
 fix_etc_default_raid2 () {
   if [ -f /etc/default/raid2 ]; then
-    sed "s/^AUTOSTART.*/AUTOSTART=true/g" /etc/default/raid2 > /etc/default/raid2.cn4-upgrade.$$
-    chown --reference=/etc/default/raid2 /etc/default/raid2.cn4-upgrade.$$
-    chmod --reference=/etc/default/raid2 /etc/default/raid2.cn4-upgrade.$$
+    sed "s/^AUTOSTART.*/AUTOSTART=true/g" /etc/default/raid2 > /etc/default/raid2.$backup_ext.$$
+    chown --reference=/etc/default/raid2 /etc/default/raid2.$backup_ext.$$
+    chmod --reference=/etc/default/raid2 /etc/default/raid2.$backup_ext.$$
 
-    if ! cmp -s /etc/default/raid2.cn4-upgrade.$$ /etc/default/raid2; then
+    if ! cmp -s /etc/default/raid2.$backup_ext.$$ /etc/default/raid2; then
       log "Fixed /etc/default/raid2 AUTOSTART option."
-      mv /etc/default/raid2.cn4-upgrade.$$ /etc/default/raid2
+      mv /etc/default/raid2.$backup_ext.$$ /etc/default/raid2
     else
-      rm /etc/default/raid2.cn4-upgrade.$$
+      rm /etc/default/raid2.$backup_ext.$$
     fi
   fi
 }
 
-# restore distribution config file
+# restore original config file (if the new package version is not
+# installed already)
 restore_config () {
-  local file file_backup
+  local file file_backup file_orig
+  local pkg=$1 ver=$2
+  shift 2
+
+  # check package version
+  pkg $pkg lt $ver || return 0
+
+  # restore package files
+  for file in $*; do
+    file_orig=/usr/share/carnet-upgrade/files/$file
+    file_backup=$file.$backup_ext
+
+    if cmp $file_orig $file >/dev/null; then
+        continue # original file is already in place
+    fi
 
-  for file in "$@"; do
-    file_backup=$file.cn4-upgrade
     if [ -e $file -a ! -e $file_backup ]; then
       # backup file
       mv $file $file_backup
 
       # install original
       log Restoring config file $file
-      cp /usr/share/carnet-upgrade/files/$file $file
+      cp $file_orig $file
     fi
   done
 }
@@ -413,38 +436,70 @@ restore_config () {
 # restore modified config to their package defaults
 # so the upgrade doesn't complain so much
 restore_configs () {
-  restore_config /etc/bind/named.conf.options
-  restore_config /etc/default/ntpdate
-  restore_config /etc/default/oidentd
-  restore_config /etc/default/postgrey
-  restore_config /etc/default/saslauthd
-  restore_config /etc/default/slapd
-  restore_config /etc/dovecot/dovecot.conf
-  restore_config /etc/init.d/mysql
-  restore_config /etc/init.d/slapd
-  restore_config /etc/issue
-  restore_config /etc/issue.net
-  restore_config /etc/logrotate.d/mysql-server
-  restore_config /etc/mysql/my.cnf
-  restore_config /etc/ntp.conf
-  restore_config /etc/pam.d/login
-  restore_config /etc/php4/apache/php.ini
-  restore_config /etc/php4/cgi/php.ini
-  restore_config /etc/php4/cli/php.ini
-  restore_config /etc/postgrey/whitelist_clients
-  restore_config /etc/security/limits.conf
-  restore_config /etc/squirrelmail/apache.conf
-  restore_config /etc/sysctl.conf
-  restore_config /etc/vsftpd.conf
-  restore_config /etc/xinetd.conf
+  restore_config base-files 4 /etc/issue /etc/issue.net
+  restore_config bind9 1:9.3.4 /etc/bind/named.conf.options
+  restore_config dovecot-common 1.0 /etc/dovecot/dovecot.conf
+  restore_config libapache-mod-php4 6:4.4.4 /etc/php4/apache/php.ini
+  restore_config libpam-modules 0.79 /etc/security/limits.conf
+  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 ntp 1:4.2.2 /etc/ntp.conf
+  restore_config ntpdate 1:4.2.2 /etc/default/ntpdate
+  restore_config oidentd 2.0.8 /etc/default/oidentd
+  restore_config php4-cgi 6:4.4.4 /etc/php4/cgi/php.ini
+  restore_config php4-cli 6:4.4.4 /etc/php4/cli/php.ini
+  restore_config postgrey 1.27 /etc/default/postgrey \
+                               /etc/postgrey/whitelist_clients
+  restore_config procps 1:3.2.7 /etc/sysctl.conf
+  restore_config sasl2-bin 2.1.22 /etc/default/saslauthd
+  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
-  rm -f /etc/logcheck/ignore.d.server/imap
+  if pkg logcheck-database lt 1.2.54; then
+      rm -f /etc/logcheck/ignore.d.server/imap
+  fi
 
   # aide switched to ucf, move old configs aside
-  for file in /etc/aide/aide.conf /etc/cron.daily/aide /etc/default/aide; do
-      [ ! -e "$file.cn4-upgrade" ] && mv "$file" "$file.cn4-upgrade"
-      rm -f "$file"
+  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 "$file" "$file.$backup_ext"
+          fi
+
+          rm -f "$file"
+      done
+  fi
+}
+
+# temporary disable listchanges packages to reduce clutter during upgrade
+apt_listchanges () {
+  local file command=$1
+
+  for file in /etc/apt/apt.conf.d/20listchanges \
+              /etc/apt/apt.conf.d/20listchanges-cn
+  do
+      case $command in
+           disable)
+               if [ -f $file ]; then
+                   dpkg-divert --local --rename --divert $file.$backup_ext \
+                               --add $file || true
+               fi
+               ;;
+
+           enable)
+               if [ -f $file.$backup_ext ]; then
+                   dpkg-divert --remove $file || true
+               fi
+               ;;
+     esac
   done
 }
 
@@ -457,6 +512,16 @@ install_keyrings () {
   update
 }
 
+# remove skey (not supported anymore)
+remove_skey () {
+  pkgrm skey-cn libpam-skey
+
+  if getent group skey > /dev/null; then
+    groupdel skey || true
+    log "groupdel skey"
+  fi
+}
+
 # make a silent upgrade to new libc6
 upgrade_libc () {
   DEBIAN_FRONTEND=noninteractive pkgadd libc6
@@ -469,14 +534,32 @@ upgrade_apache () {
   mkdir -p /etc/apache2
   touch /etc/apache2/httpd.conf
 
+  # register cn changes in modules.conf
+  modules_conf=/etc/apache/modules.conf
+  if [ ! -e "$modules_conf.$backup_ext" ]; then
+      cp "$modules_conf" "$modules_conf.$backup_ext"
+      ucf $modules_conf $modules_conf
+  fi
+
   # temporary remove packages conflicting with apache2
   delpkg=""
   for p in aosi-aai aosi-www-aai \
            php4-cn php4-odbc php4-xslt \
            squirrelmail-cn; do
-     pkg p && delpkg="$delpkg $p"
+
+     # remember installed packages
+     if pkg $p; then
+         delpkg="$delpkg $p"
+     fi
   done
-  eval pkgrm apache-common $delpkg
+
+  # remove problematic stuff
+  if [ "$delpkg" ]; then
+      eval apt-get --yes remove $delpkg
+  fi
+
+  # remove old apache
+  pkgrm apache apache-common
 
   # install new packages
   eval pkgadd apache2-cn apache2-mpm-prefork \
@@ -493,8 +576,8 @@ upgrade_amavis () {
 
   # move old config aside
   local conf=/etc/amavis/amavisd.conf
-  if [ -e $conf -a ! -e $conf.cn4-upgrade ]; then
-    mv $conf $conf.cn4-upgrade
+  if [ -e $conf -a ! -e $conf.$backup_ext ]; then
+    mv $conf $conf.$backup_ext
   fi
 
   # install new packages