home *** CD-ROM | disk | FTP | other *** search
/ ftp.ac-grenoble.fr / 2015.02.ftp.ac-grenoble.fr.tar / ftp.ac-grenoble.fr / pub / slis / updates_4.1_rsync / lcslis_dom0_update-4.1 < prev    next >
Text File  |  2009-09-13  |  5KB  |  157 lines

  1. #!/bin/bash
  2. # This script is part of the SLIS Project initiated by the CARMI-Internet
  3. # (AcadΘmie de Grenoble - France 38).
  4. # Ce script fait partie du projet SLIS dΘmarrΘ par le CARMI-Internet
  5. # (AcadΘmie de Grenoble - France 38).
  6. #
  7. # SLIS : Serveur de communications Linux pour l'Internet Scolaire.
  8. # Copyright (C) 1998-2003 Bruno Bzeznik
  9. #
  10. # Comments: 
  11. # This script is run by the crontab once a night for upgrading the SLIS
  12. # The SLIS admin can also run it at any moment it through the interface
  13. # NB: The kernel upgrade can be done overnight only (bettween 0-6)
  14.  
  15. #
  16. # Various variables
  17. #
  18. LOCKFILE="/var/lock/lcslis_dom0_update-4.1"
  19. LOGTAG="lcslis_dom0_update-4.1[$$]"
  20. SCRIPT_STATUS_MSG="Script 'lcslis_dom0_update' version 4.1"
  21. REBOOT_MANDATORY=0
  22.  
  23. # This is the maximum number of seconds you think
  24. # a monitor must leave before suspecting it to be
  25. # freezed.
  26. [ "$SLIM_MAX_AGE" = "" ] &&  SLIM_MAX_AGE=36000
  27.  
  28. # This is the max number of time the script will try 
  29. # to relock when already locked 
  30. [ "$SLIM_RETRY_TIME" = "" ] &&  SLIM_RETRY_TIME=360
  31.  
  32. write_to_log()
  33. {
  34.     logger -t "$LOGTAG" $*
  35. }
  36.  
  37. send_to_slismaster()
  38. {
  39.     echo "$*" | mail "$SLISMASTER" -s "`hostname` : Update: $LOGTAG"
  40. }
  41.  
  42. exit_this_update()
  43. {
  44.     write_to_log $*
  45.     send_to_slismaster $*
  46.     write_to_log "$SCRIPT_STATUS_MSG: failed."
  47.     exit 1
  48. }
  49.  
  50. write_to_log `echo "[$PATH]"` 
  51.  
  52. #
  53. # Locking
  54. #
  55. LOCK_OUTPUT=`lockfile -1 -r 3 -l $SLIM_MAX_AGE -s 0 $LOCKFILE 2>&1`; LOCK_RC=$?
  56.  
  57. #
  58. # If unable to lock (recent lock file found)
  59. #
  60. if [ "$LOCK_RC" != "0" ]; then
  61.     write_to_log "Error: Lock found: update already running!"
  62.     exit 1
  63. fi
  64.  
  65. #
  66. # If a very old lock file is found
  67. #
  68. if [ "`echo $LOCK_OUTPUT | grep -i "forcing lock"`" != "" ]; then
  69.     write_to_log "Warning: forcing lock and killing possibly sleeping processes."
  70.  
  71.     # Perhaps some processes are freezed?
  72.     killall apt-get 2>/dev/null
  73.     sleep 1
  74.     killall dpkg-preconfigure 2>/dev/null
  75.     sleep 1
  76.  
  77.     [ "`dpkg -C`" != "" ] && exit_this_update "Warning: Some packages not installed correctly";
  78.  
  79.     # Then if the lock is older than 10 days, remove the lockfile and lock again.
  80.     LOCKFILE_OLD=`find $LOCKFILE -nowarn -ctime +10 -print`
  81.     if [ "$LOCKFILE_OLD" != "" ]; then
  82.         write_to_log "Info: Very old lock found (more than 10 days), removing it."
  83.         rm -f $LOCKFILE
  84.     fi
  85.     
  86.     # Try to lock another time while waiting for the previous one to finish
  87.     lockfile -5 -r $SLIM_RETRY_TIME $LOCKFILE ; LOCK_RC=$?
  88.     if [ "$LOCK_RC" != "0" ]; then
  89.         MSG="Error: second try for locking failed"
  90.         exit_this_update $MSG
  91.     fi
  92. fi
  93.  
  94. write_to_log "$SCRIPT_STATUS_MSG: starting..."
  95. write_to_log "=== PLEASE WAIT. DO NOT USE SLIS WHILE UPDATING ==="
  96.  
  97. #
  98. # Make updates
  99. #
  100. logger -t "$LOGTAG" "APT: Updating package index files from the dpkg sources..."
  101. APT_RESULT=`apt-get -qq update 2>&1`
  102. if [ $? != 0 ]; then
  103.     write_to_log "ERROR: apt-get update failed. See report below:"
  104.     write_to_log "`echo -n "$APT_RESULT"`"
  105. else
  106.     #
  107.     # APT upgrade
  108.     #
  109.  
  110.     # Ensure that no questions will be asked for
  111.     export DEBIAN_FRONTEND=noninteractive
  112.  
  113.     DPKG_OPTS='-o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold'
  114.  
  115.     #
  116.     # APT dist-upgrade. Install also kernel-image updates, but if any wait nighttime to reboot.
  117.     #
  118.     
  119.     # Get the list of dist-upgrade candidates
  120.     APT_RESULT=`apt-get -dsy dist-upgrade 2>&1`
  121.     CANDIDATES=`echo -n "$APT_RESULT" | grep Inst | awk '{print $2}' | tr '\n' ' '`
  122.  
  123.     write_to_log "candidates : $CANDIDATES"
  124.     if [ "$CANDIDATES" == "" ] ; then
  125.         write_to_log "APT: Upgrading packages: none (system is up-to-date)."
  126.     else
  127.     write_to_log "APT: Upgrading packages: $CANDIDATES"
  128.         write_to_log "APT: Be patient, this may take a long time!..."
  129.     apt-get $DPKG_OPTS --force-yes -y -qq dist-upgrade 2>&1 | logger -t "$LOGTAG"
  130.     write_to_log "APT: Packages upgrading terminated."
  131.  
  132.         NEW_KERNEL=`echo \"$CANDIDATES\" | grep linux-image `
  133.         if [ "$NEW_KERNEL" != "" ]; then
  134.         # A kernel update has been installed - Reboot now if it's nighttime or
  135.         # do it later.
  136.              write_to_log "APT : new kernel install . Reboot will be planned"
  137.              REBOOT_MANDATORY=1
  138.         else
  139.              write_to_log "APT : no new kernel."
  140.     fi
  141.     fi
  142. fi
  143.  
  144. #
  145. # Ending script
  146. #
  147. if [ "$REBOOT_MANDATORY" = "1" ]; then
  148.     
  149.     echo 'shutdown -r +1'| at 4am tomorrow
  150.     write_to_log "$SCRIPT_STATUS_MSG: successed. Reboot planned tomorrow at 4am."
  151. else
  152.     write_to_log "$SCRIPT_STATUS_MSG: successed"
  153. fi
  154.  
  155. rm -f $LOCKFILE
  156.