00ae1ff6f2a29808d6acd366cb5dc9c040888510
[carnet-upgrade.git] / src / functions.sh
1 # Ivan 'ico' Rako <irako@srce.hr>
2 # Zoran 'jelly' Dzelajlija <jelly@srce.hr>
3
4 notice () {
5   dialog --backtitle "$title" --msgbox "$*" 18 75
6 }
7
8 first_warning () {
9   dialog --backtitle "$title" --yesno "$msg_first_warning" 18 75
10 }
11
12 pkg() {
13   local version
14   dpkg -l "$1" 2> /dev/null | egrep -q "^.i" || return 1
15   [ -z "$2" ] && return 0
16   version=$(dpkg -s "$1" | awk '/^Version:/ {print $2}')
17   dpkg --compare-versions "$version" "$2" "$3" 2>&1 > /dev/null
18 }
19
20 log() {
21   logfile=${logfile:=/var/log/carnet-upgrade.log}
22   touch $logfile
23   echo "$(date +'%Y-%m-%d %H:%M:%S') $*" >> $logfile
24   echo "CN: $*"
25 }
26
27 # find first free uid/gid in range
28 # find_id passwd 100 999
29 find_id() {
30   local i db first last ids
31   db=$1
32   first=$2
33   last=$3
34   ids=$(getent $db | awk -F: "\$3 >= $first && \$3 <= $last {print \$3}")
35   for i in $(seq $first $last)
36   do
37     if ! echo $ids | grep -q $i; then
38       echo $i
39       return 0
40     fi
41   done
42   return 1
43 }
44
45 # safe in-place s///
46 check_and_sed() {
47   [ "$DEBIAN_SCRIPT_DEBUG" ] && set -vx
48   local s sedcmd ret i
49   s="$1"
50   shift
51   sedcmd="$1"
52   shift
53   ret=2
54   for i in $*
55   do
56     [ -e "$i" ]        || continue
57     egrep -q "$s" "$i" || continue
58     [ -h "$i" ]        && i=$(readlink -f "$i")
59     sed "$sedcmd" "$i" > "$i.dpkg-tmp"
60     chown --reference "$i" "$i.dpkg-tmp"
61     chmod --reference "$i" "$i.dpkg-tmp"
62     mv "$i.dpkg-tmp" "$i"
63     ret=0
64   done
65   if [ "$ret" -eq 0 ]; then
66     log "Done \"$sedcmd\" to $*"
67   fi
68   return $ret
69 }
70
71 #
72 # Update uid for user from reserved system range (0-99) to dynamic system
73 # range (100-999).  Optionally update ownerships of given directories.
74 # $0 user [directory ...]
75 #
76 check_and_update_ugid() {
77   local user newgid newuid
78   user=$1
79   if [ "$(getent passwd $user | awk -F: '$3 >= 100 {print "ok"; exit 0}')" ]; then
80     return 0
81   fi
82   shift
83   newgid=$(find_id group 100 999)
84   newuid=$(find_id passwd 100 999)
85   # other directories/files
86   chown -R $newuid:$newgid $*
87   groupmod -g $newgid $user
88   usermod -u $newuid -g $newgid $user
89   log "Fixed $user user uid/gid."
90 }
91
92 pkgadd () {
93   [ -n "$*" ] || return 0
94   log "Installing $* ..."
95   apt-get -y$s install $* || {
96     dpkg --configure -a
97     apt-get -yf install
98     apt-get -y$s install $*
99   }
100 }
101
102 pkgrm () {
103   [ -n "$*" ] || return 0
104   log "Removing $* ..."
105   apt-get -y$s --purge remove $* || {
106     dpkg --configure -a
107     apt-get -yf install
108     apt-get -y$s --purge remove $*
109   }
110 }
111
112 update() {
113   log "Running apt-get update ..."
114   apt-get -y$s update || {
115     apt-get -yf install
116     apt-get -y$s update
117   }
118   apt-get autoclean
119   apt-get -dy$s dist-upgrade
120 }
121
122 dist_upgrade () {
123   log "Running dist-upgrade ..."
124   apt-get -y$s dist-upgrade || {
125     dpkg --configure -a
126     apt-get -y$s dist-upgrade
127   }
128 }
129
130 remove_bloat() {
131   local to_remove add_this i j n text to_show cmd tmpfile installed
132   local update_selections pkgs_to_deselect pkgs_to_remove oldifs pkglist
133   text="$msg_remove_bloat"
134
135   [ "$DEBUG" ] && set -x
136   n=0
137   pkglist=$(mktemp /var/lib/carnet-upgrade/pkglist.XXXXXX)
138   COLUMNS=200 dpkg -l | awk '$1 ~ /^.i/ { print $2 }' > $pkglist
139   for i in $(echo "$bloats" | sed 's/           */      /g'| awk -F'    ' '{print $2}')
140   do
141     if grep -q "^$i$" $pkglist; then
142       installed="$installed $i"
143       add_this="$(echo "$bloats" | egrep "      .*\b${i}\b" | sed 's/           */      /g'| awk -F'    ' '{print $1}')"
144       if ! echo "$to_show" | grep -q "$add_this"; then
145         to_show="$to_show \"$add_this\" \"\" on"
146         n=$(($n+1))
147       fi
148     fi
149   done
150   [ "$DEBUG" ] || rm -f $pkglist
151   [ -z "$to_show" ] && return 0
152   test $n -gt 8 && n=8
153   tmpfile=$(mktemp /var/lib/carnet-upgrade/dialog-tmp.XXXXXX)
154   cmd="dialog --nocancel --backtitle \""$title"\" --checklist \""$text"\" 20 75 $n $to_show"
155   [ "$DEBUG" ] && set +x
156     eval $cmd 2> $tmpfile
157   [ "$DEBUG" ] && set -x
158   to_remove="$(cat $tmpfile | sed 's/\"\ \"/    /g; s/\"\ *//g; s/\\//g')"
159   [ "$DEBUG" ] || rm -f $tmpfile 
160   [ "$DEBUG" ] && echo "DEBUG: to_remove=$to_remove" 1>&2
161   oldifs="$IFS"
162   IFS=" " # tab
163   for i in $(echo "$to_remove")
164   do
165     IFS="$oldifs"
166     for j in $(echo "$bloats" | grep "^$i" | sed 's/            */      /g'| awk -F'    ' '{print $2}')
167     do
168       # hopefully this will tell apt not to reinstall them at upgrade time
169       update_selections="${update_selections}
170         $j      deinstall"
171       pkgs_to_deselect="$pkgs_to_deselect $j"
172       # only remove those that really are installed
173       if echo "$installed" | grep -q "$j"; then
174         pkgs_to_remove="$pkgs_to_remove $j"
175       fi
176     done
177   done
178   [ "$DEBUG" ] && echo "DEBUG: pkgs_to_remove=$pkgs_to_remove" 1>&2
179   # Finally, remove those
180   if [ -n "$update_selections" ]; then
181     echo "$update_selections" | dpkg --set-selections
182     log "Deselected:${pkgs_to_deselect}"
183   fi
184   eval pkgrm $pkgs_to_remove
185 }
186
187 post_upgrade() {
188   touch "$post_upgrade_queuetab"
189   if ! grep -q "true    $*" "$post_upgrade_queuetab"; then
190     echo "true  $*" >> "$post_upgrade_queuetab"
191   fi
192 }
193
194 run_post_upgrade() {
195   if [ -f "$post_upgrade_queuetab" ]; then
196     run_actions post_upgrade "$post_upgrade_queuetab"
197     mv "$post_upgrade_queuetab" "${post_upgrade_queuetab}.done.$(date '+%Y-%m-%d.%H:%M:%S')"
198   fi      
199 }
200
201 ###
202
203 run_actions() {
204   local line lineno lineno2 f n name action checkmsg check
205   [ "$DEBUG" ] && set -vx
206   name="$1"
207   f="$2"
208   [ -f "$f" ] ||   return 2 # no such file
209   n=$(wc -l "$f" | awk '{print $1}')
210   [ "$n" -lt 1 ] && return 1 # no lines to process
211   log "run_actions ($name) started, processing $n lines from \"$f\"."
212   log "-----"
213   lineno=0
214   lineno2=0
215   while [ "$lineno" -lt "$n" ]
216   do
217     lineno=$(($lineno+1))
218     lineno2=$lineno
219     line=$(head -$lineno "$f" | tail -1)
220     if echo $line | grep -q '^#'; then  # comment
221       continue
222     fi
223     while echo "$line" | egrep -q '\\$' # continuation
224     do
225       lineno2=$(($lineno2+1))
226       line=$(echo -n "$line"| sed 's/\\$//'; head -$lineno2 "$f" | tail -1)
227     done
228     check=$(echo "$line" | sed 's/              */      /g'| awk -F'    ' '{print $1}')
229     action=$(echo "$line" | sed 's/             */      /g'| awk -F'    ' '{print $2}')
230     checkmsg=""
231     [ "$check" != "true" ] && checkmsg="if '$check'"
232     if eval $check; then
233       log "$(printf 'action %02d' $lineno) starting: '${action}' $checkmsg "
234       if ! eval $action; then
235         log "$(printf 'action %02d' $lineno) failed: '${action}' $checkmsg "
236         display_action_failure "$action"
237         exit 1
238       else  
239         log "$(printf 'action %02d' $lineno) finished: '${action}' $checkmsg"
240       fi
241     else
242       log "$(printf 'action %02d' $lineno) skipping: '${action}' $checkmsg"
243     fi
244     [ "$lineno2" -gt "$lineno" ] && lineno=$lineno2
245   done
246   log "run_actions ($1) finished"
247   log "-----"
248 }
249
250 # report action failure
251 display_action_failure () {
252   local action=$1
253
254   notice "
255 Doslo je do greske prilikom izvrsavanja akcije '$action'. Detalje problema moguce je vidjeti u log datotekama:
256
257   /var/log/carnet-upgrade.log
258   /var/log/carnet-upgrade.typescript
259
260 Da bi dovrsili zapocete operacije nad paketima pokrenite:
261
262   # dpkg --configure -a
263   # apt-get -f install
264
265 Nakon toga ponovno pozovite carnet-upgrade skriptu."
266 }
267
268 # funkcija vraca popis paketa koje treba upgradeati
269 what_upgrade () {
270   local IFSOLD name version package
271
272   for package in `echo "$needed_versions" | awk '{print $1}'| grep -v ^$`; do
273     IFSOLD="$IFS"
274     IFS="       " # tab
275     read name version <<-EOPTS
276         $(echo "$needed_versions" | sed 's/             */      /g' | grep ^$package)
277         EOPTS
278     IFS="$IFSOLD"
279     if pkg "$name" lt "$version"; then
280         echo -n " $name"
281     fi
282   done
283 }
284
285 # funkcija za ispis paketa koje treba upgradeati
286 check_upgrade () {
287   local upgrade
288   upgrade="`what_upgrade`"
289
290   if [ "$upgrade" ]; then
291     notice "
292 Prije prelaska na Debian Etch potrebno je napraviti nadogradnju ovih paketa:
293   $upgrade
294
295 Pokrenite:
296   # apt-get update
297   # apt-get dist-upgrade
298 ili:
299   # apt-get update
300   # apt-get install${upgrade}
301   
302 Nakon toga ponovno pozovite ovu skriptu."
303     log "carnet-upgrade aborted, upgrade of$upgrade needed."
304     exit 1
305   fi
306 }
307
308 # if apache is installed make sure it's version 2
309 check_apache_version () {
310
311   if pkg apache-cn && ! pkg apache2-cn; then
312     notice "
313 Prije prelaska na Debian Etch potrebno je napraviti nadogradnju sa Apache 1.3 na Apache 2.0.
314
315 Pokrenite:
316   # apt-get update
317   # apt-get install apache2-cn
318   
319 Nakon toga ponovno pozovite ovu skriptu."
320     log "carnet-upgrade aborted, upgrade to apache2-cn needed."
321     exit 1
322   fi
323 }
324
325 upgrade () {
326   local i to_install packages
327   case "$1" in
328     first)
329       packages="$packages_first"
330     ;;
331     second)
332       packages="$packages_second"
333     ;;
334     *)
335     return 1
336   esac
337
338   for i in $(echo $packages)
339   do
340     pkg $i && to_install="$to_install $i"
341   done
342
343   if [ -n "$to_install" ];then
344     eval pkgadd $to_install
345   else
346     return 0
347   fi
348 }
349
350 # funkcija utrpa ispravan sources.list
351 create_sources_list () {
352     local sl sl_new
353     sl=/etc/apt/sources.list
354     sl_new=/usr/share/carnet-upgrade/files/etc/apt/sources.list
355
356     # check if already installed
357     if ! cmp $sl $sl_new >/dev/null; then
358
359         # backup old version
360         if [ -f $sl -a ! -f $sl.$backup_ext ]; then
361             cp -av $sl $sl.$backup_ext
362         fi
363
364         # install new version
365         cp -av $sl_new $sl
366         notice "Novi sadrzaj datoteke /etc/apt/sources.list:
367
368 `cat /etc/apt/sources.list`"
369     fi
370 }
371
372
373 # funkcija koja brise grupu proc
374 remove_group_proc () {
375   if getent group proc > /dev/null; then
376     groupdel proc || true
377     log "groupdel proc (temporarily)"
378     post_upgrade add_group_proc
379   fi
380 }
381
382 add_group_proc () {
383   if ! getent group proc > /dev/null; then
384     # grsec uses gid 99 for /proc files
385     groupadd -g 99 proc 
386     log "groupadd -g 99 proc"
387
388     # update oidentd so it uses the proc group
389     if [ -x /etc/init.d/oidentd ]; then
390         if gpasswd -a oident proc; then
391             /etc/init.d/oidentd restart
392         fi
393     fi
394   fi
395 }
396
397 # backup ldap database
398 backup_slapd_db () {
399   local ldap_backup=/var/backups/slapcat.$backup_ext.gz
400   local old_umask result
401
402   if [ ! -f $ldap_backup ]; then
403     [ -x /etc/init.d/freeradius ] && /etc/init.d/freeradius stop || true
404
405     if [ -x /etc/init.d/slapd -a -d /var/lib/ldap ]; then
406       /etc/init.d/slapd stop || true
407       old_umask=`umask`
408       umask 0077 # protect the backup file
409       slapcat | gzip --best > $ldap_backup
410       result=$?
411       umask $old_umask
412       /etc/init.d/slapd start || true
413
414       if [ "$result" -eq 0 ]; then
415         log "$ldap_backup created"
416         notice "Napravljen backup slapd baze u $ldap_backup."
417       else
418         log "$ldap_backup was not created"
419         notice "Backup slapd baze u $ldap_backup nije uspio."
420         exit 1
421       fi
422     fi
423
424     [ -x /etc/init.d/freeradius ] && /etc/init.d/freeradius start || true
425   else
426     log "slapd backup already at $ldap_backup, skipping."
427     notice "Backup slapd baze u $ldap_backup vec postoji!"
428   fi
429 }
430
431 # backup etc direktorija
432 backup_etc_dir () {
433   local etc_backup=/var/backups/etc.$backup_ext.tar.gz
434   local old_umask
435
436   if [ ! -f $etc_backup ]; then
437     old_umask=`umask`
438     umask 0077 # protect the backup file
439
440     if tar cfz $etc_backup /etc 2> /dev/null; then
441       log "$etc_backup created"
442       notice "Napravljen backup /etc direktorija u $etc_backup."
443     else
444       log "$etc_backup was not created"
445       notice "Backup /etc direktorija u $etc_backup nije uspio."
446       exit 1
447     fi
448     umask $old_umask
449   else
450     log "/etc backup already present in $etc_backup, skipping."
451     notice "Backup /etc direktorija u $etc_backup vec postoji!"
452   fi
453 }
454
455 # fixaj /etc/default/raid2
456 fix_etc_default_raid2 () {
457   if [ -f /etc/default/raid2 ]; then
458     sed "s/^AUTOSTART.*/AUTOSTART=true/g" /etc/default/raid2 > /etc/default/raid2.$backup_ext.$$
459     chown --reference=/etc/default/raid2 /etc/default/raid2.$backup_ext.$$
460     chmod --reference=/etc/default/raid2 /etc/default/raid2.$backup_ext.$$
461
462     if ! cmp -s /etc/default/raid2.$backup_ext.$$ /etc/default/raid2; then
463       log "Fixed /etc/default/raid2 AUTOSTART option."
464       mv -v /etc/default/raid2.$backup_ext.$$ /etc/default/raid2
465     else
466       rm -v /etc/default/raid2.$backup_ext.$$
467     fi
468   fi
469 }
470
471 # restore original config file (if the new package version is not
472 # installed already)
473 restore_config () {
474   local file file_backup file_orig
475   local old_umask
476
477   # create new files safely
478   old_umask=`umask`
479   umask 0077
480
481   # restore package files
482   for file in $*; do
483     file_orig=/usr/share/carnet-upgrade/files/$file
484     file_backup=$file.$backup_ext
485
486     # is config there
487     if [ ! -e $file ]; then
488         continue
489     fi 
490
491     # is restore needed
492     if cmp $file_orig $file >/dev/null; then
493         continue
494     fi
495
496     # backup and restore
497     if [ ! -e $file_backup ]; then
498       log "Restoring config file $file"
499
500       # backup local changes
501       mv -v $file $file_backup
502
503       # restore original
504       cp -av $file_orig $file
505       chown --reference $file_backup $file
506       chmod --reference $file_backup $file
507     fi
508   done
509
510   umask $old_umask
511 }
512
513 # restore modified config to their package defaults
514 # so the upgrade doesn't complain so much
515 restore_configs () {
516   local config_backup
517
518   pkg base-files lt 4 && restore_config /etc/issue /etc/issue.net
519   pkg libpam-modules lt 0.79 && restore_config /etc/security/limits.conf
520   pkg login lt 1:4.0.18.1 && restore_config /etc/pam.d/login
521   pkg mysql-server lt 5.0.3 && restore_config /etc/init.d/mysql \
522                                     /etc/logrotate.d/mysql-server \
523                                     /etc/mysql/my.cnf
524   pkg ntp lt 1:4.2.2 && restore_config /etc/ntp.conf
525   pkg ntpdate lt 1:4.2.2 && restore_config /etc/default/ntpdate
526   pkg oidentd lt 2.0.8 && restore_config /etc/default/oidentd
527   pkg postgrey lt 1.27 && restore_config /etc/default/postgrey \
528                                /etc/postgrey/whitelist_clients
529   pkg procps lt 1:3.2.7 && restore_config /etc/sysctl.conf
530   pkg sasl2-bin lt 2.1.22 && restore_config /etc/default/saslauthd
531   pkg slapd lt 2.3.30 && restore_config /etc/default/slapd /etc/init.d/slapd
532   pkg squirrelmail lt 2:1.4.9a && restore_config /etc/squirrelmail/apache.conf
533   pkg vsftpd lt 2.0.5 && restore_config /etc/vsftpd.conf
534   pkg xinetd lt 1:2.3.14 && restore_config /etc/xinetd.conf
535
536   # orphaned config file - no owner
537   if pkg logcheck-database lt 1.2.54; then
538       rm -vf /etc/logcheck/ignore.d.server/imap
539   fi
540
541   # aide switched to ucf, move old configs aside
542   if pkg aide lt 0.13.1; then
543       for file in /etc/aide/aide.conf \
544                   /etc/cron.daily/aide \
545                   /etc/default/aide;
546       do
547           if [ ! -e "$file.$backup_ext" ]; then
548               mv -v "$file" "$file.$backup_ext"
549           fi
550
551           rm -vf "$file"
552       done
553   fi
554
555   # register cn changes in ucf managed files
556   for config in /etc/apache/modules.conf \
557                 /etc/clamav/clamd.conf \
558                 /etc/clamav/freshclam.conf
559   do 
560       config_backup=$config.$backup_ext
561       if [ -e $config -a ! -e $config_backup ]; then
562           log "Saving config file $config"
563           cp -av $config $config_backup
564           ucf $config_backup $config
565       fi
566   done
567 }
568
569 # temporary disable listchanges packages to reduce clutter during upgrade
570 apt_listchanges () {
571   local file command=$1
572
573   for file in /etc/apt/apt.conf.d/20listchanges \
574               /etc/apt/apt.conf.d/20listchanges-cn
575   do
576       case $command in
577            disable)
578                if [ -f $file ]; then
579                    dpkg-divert --local --rename --divert $file.$backup_ext \
580                                --add $file || true
581                fi
582                ;;
583
584            enable)
585                if [ -f $file.$backup_ext ]; then
586                    dpkg-divert --remove $file || true
587                fi
588                ;;
589      esac
590   done
591 }
592
593 # make a silent installation of carnet and srce keyrings
594 install_keyrings () {
595   pkgadd carnet-keyring srce-keyring
596   pkgadd dpkg apt debconf python-apt
597
598   dpkg-reconfigure carnet-keyring srce-keyring
599   update
600 }
601
602 # remove skey (not supported anymore)
603 remove_skey () {
604   pkgrm skey-cn libpam-skey
605
606   if getent group skey > /dev/null; then
607     groupdel skey || true
608     log "groupdel skey"
609   fi
610 }
611
612 # monit it causing problems for postinst scripts
613 # restarting daemons so try to disable it
614 disable_monit () {
615   if pkg monit-cn; then
616     pkgrm monit-cn # disables monit in prerm
617   fi
618
619   # if configured manually
620   if pkg monit; then
621     # remove the binary but leave the config
622     apt-get remove --yes monit
623     # stop the binary
624     pkill -9 monit || true
625   fi
626 }
627
628 # make a silent upgrade to new libc6
629 upgrade_libc () {
630   DEBIAN_FRONTEND=noninteractive pkgadd libc6
631 }
632
633 # upgrade apache2 to etch
634 upgrade_apache2 () {
635   local package packages
636
637   for package in \
638       libapache2-mod-php4 \
639       php4-cli \
640       php4-cgi \
641       php4-cn \
642       apache2-cn \
643       php4-odbc \
644       php4-suhosin
645   do
646       if pkg $package; then
647           packages="$packages $package"
648       fi
649   done
650
651   for package in $(echo $packages); do
652       pkgadd $package
653   done
654 }
655
656 upgrade_amavis () {
657   local conf
658
659   # remove init script diversion
660   if [ -L /etc/init.d/amavis -a -f /etc/init.d/amavis.amavisd-new ]; then
661     rm -vf /etc/init.d/amavis
662     dpkg-divert --quiet --remove /etc/init.d/amavis
663   fi
664
665   # move old config aside
666   for conf in /etc/amavisd.conf /etc/amavis/amavisd.conf; do
667     if [ -e $conf -a ! -e $conf.$backup_ext ]; then
668       mv -v $conf $conf.$backup_ext
669     fi
670   done
671
672   # install new packages
673   pkgadd amavisd-cn amavisd-new
674
675   # fix new packages
676   check_and_sed '^clamd.*5.clamav.log$' \
677                 's/^\(clamd.*\)5.clamav.log$/\14\tsocket/g' \
678                 /etc/init.d/amavisd-cn || true
679
680   # start new packages
681   /etc/init.d/amavis restart
682 }
683
684 # fix openldap-aai postinst user handling
685 upgrade_openldap () {
686   pkg openldap-aai lt 2.3 || return 0
687
688   # openldap-aai expects org.ldif to exists
689   local ldif=/var/lib/ldap/org.ldif
690   local ldif_backup=/var/lib/carnet-upgrade/org.ldif
691   if [ -f $ldif ]; then
692     cp -v $ldif $ldif_backup
693   fi
694
695   # slapd postinst fails if move_old_database is false
696   echo 'slapd slapd/move_old_database boolean true' | debconf-set-selections 
697   pkgadd slapd
698
699   # slapd removes org.ldif during switch from ldap -> openldap user
700   if [ -f $ldif_backup -a ! -f $ldif ]; then
701     cp -v $ldif_backup $ldif
702   fi
703
704   # openldap-aai postinst fails here because of database permissions
705   apt-get -y install openldap-aai || true
706   chown -R openldap:openldap /var/lib/ldap
707   /etc/init.d/slapd restart
708   dpkg --configure -a
709
710   # remove ldap user if openldap works
711   if getent passwd ldap      > /dev/null && \
712      getent passwd openldap  > /dev/null && \
713      pgrep -U openldap slapd > /dev/null
714   then
715      log "userdel ldap (replaced by openldap)"
716      userdel ldap || true
717   fi
718 }
719
720 # fix postgresql deinstallation during upgrade
721 upgrade_postgresql () {
722   if check_services show 2>&1 | grep -qw postgresql; then
723      apt-get install -y postgresql || apt-get -yf install
724   fi
725 }
726
727 # upgrade the MTA
728 upgrade_postfix () {
729   pkgadd postfix-cn
730
731   if pkg postgrey; then
732      pkgrm postgrey # not used by postfix-cn anymore
733   fi
734 }
735
736 get_variable () {
737   local name=$1 file=$2 val
738
739   if [ -f "$file" ]; then
740      val=$(sed -n "/^[[:space:]]*$name[[:space:]]*=/s/[[:space:]]*//gp" $file)
741      val=${val#*=}
742   fi
743
744   echo $val
745 }
746
747 # preserve mail location on upgrade
748 upgrade_dovecot () {
749   local default_mail_env mail_location
750
751   # check if already upgraded
752   if ! pkg dovecot-common lt 1.0; then
753       return
754   fi
755
756   # save old mail location
757   default_mail_env=$(get_variable default_mail_env /etc/dovecot/dovecot.conf)
758
759   # silently upgrade package
760   restore_config /etc/dovecot/dovecot.conf
761   pkgadd dovecot-cn
762
763   # insert old mail location
764   mail_location=$(get_variable mail_location /etc/dovecot/dovecot.conf)
765   if [ "$default_mail_env" -a ! "$mail_location" ]; then
766       check_and_sed '^#mail_location[[:space:]]*=' \
767                    "s|#mail_location[[:space:]]*=.*|mail_location = $default_mail_env|" /etc/dovecot/dovecot.conf || return 0
768
769       if [ -x /etc/init.d/dovecot ]; then
770           if [ -x /usr/sbin/invoke-rc.d ]; then
771               /usr/sbin/invoke-rc.d dovecot restart
772           else
773               /etc/init.d/dovecot restart
774           fi
775       fi
776   fi
777 }
778
779 # fix /etc/dpkg/dpkg.cfg
780 comment_force_overwrite () {
781   if [ -f /etc/dpkg/dpkg.cfg ]; then
782     if check_and_sed '^force-overwrite' \
783                   's,\(^force-overwrite\),#\1,' \
784                   /etc/dpkg/dpkg.cfg; then
785       notice "$msg_comment_force_overwrite"
786     fi
787   fi
788 }
789
790 fix_issue () {
791   cat > /etc/issue <<EOF
792 Debian GNU/Linux 4.0 (CARNet Debian 4.0) \\n \\l
793 EOF
794
795   cat > /etc/issue.net <<EOF
796 Debian GNU/Linux 4.0 (CARNet Debian 4.0) %h
797 EOF
798 }
799
800 check_disk_space() {
801   local available_disk_space
802   available_disk_space=$(df -m /var|tail -1|awk '{print $4}')
803   if [ $available_disk_space -lt $min_var_space ]; then
804     log "carnet-upgrade aborted: not enough space on /var (need ${min_var_space}MB)"
805     notice "Premalo mjesta na /var particiji. Potrebno je imati barem ${min_var_space}MB."
806     exit 1
807   fi
808 }