merged from the debian-sid branch
authorMichael Vogt <michael.vogt@ubuntu.com>
Tue, 3 Jun 2008 15:01:06 +0000 (17:01 +0200)
committerMichael Vogt <michael.vogt@ubuntu.com>
Tue, 3 Jun 2008 15:01:06 +0000 (17:01 +0200)
1  2 
debian/apt.cron.daily
debian/changelog

@@@ -102,268 -72,175 +102,279 @@@ update_stamp(
      touch $stamp
  }
  
 -
 -
 -# we check here if autoclean was enough sizewise
 -check_size_constraints()
 +debug_echo()
  {
 -    # min-age in days
 -    MaxAge=0
 -    MinAge=2
 -    MaxSize=0
 -    CacheDir="var/cache/apt"
 -    CacheArchive="archives/"
 -    eval $(apt-config shell MaxAge APT::Archives::MaxAge)
 -    eval $(apt-config shell MinAge APT::Archives::MinAge)
 -    eval $(apt-config shell MaxSize APT::Archives::MaxSize)
 -    eval $(apt-config shell Dir Dir)
 -    eval $(apt-config shell CacheDir Dir::Cache)
 -    eval $(apt-config shell CacheArchive Dir::Cache::archives)
 -
 -    # sanity check
 -    if [ -z "$CacheDir" -o -z "$CacheArchive" ]; then
 -      echo "empty Dir::Cache or Dir::Cache::archives, exiting"
 -      exit
 +    # Display message if $VERBOSE >= 1
 +    if [ "$VERBOSE" -ge 1 ]; then
 +      echo $1 1>&2
      fi
 -    
 -    Cache="${Dir%/}/${CacheDir%/}/${CacheArchive%/}/"
 +}
  
 -    # check age
 -    if [ ! $MaxAge -eq 0 ] && [ ! $MinAge -eq 0 ]; then
 -      find $Cache -name "*.deb"  \( -mtime +$MaxAge -and -ctime +$MaxAge \) -and -not \( -mtime -$MinAge -or -ctime -$MinAge \) -print0 | xargs -r -0 rm -f
 -    elif [ ! $MaxAge -eq 0 ]; then
 -      find $Cache -name "*.deb"  -ctime +$MaxAge -and -mtime +$MaxAge -print0 | xargs -r -0 rm -f
 -    fi
 -    
 -    # check size
 -    if [ ! $MaxSize -eq 0 ]; then
 -      # maxSize is in MB
 -      MaxSize=$(($MaxSize*1024))
 -
 -      #get current time
 -      now=$(date --date=$(date --iso-8601) +%s)
 -      MinAge=$(($MinAge*24*60*60))
 -
 -      # reverse-sort by mtime
 -      for file in $(ls -rt $Cache/*.deb 2>/dev/null); do 
 -          du=$(du -s $Cache)
 -          size=${du%%/*}
 -          # check if the cache is small enough
 -          if [ $size -lt $MaxSize ]; then
 -              break
 -          fi
 +# check apt-config exstance
 +if ! which apt-config >/dev/null ; then
 +      exit 0
 +fi
  
 -          # check for MinAge of the file
 -          if [ ! $MinAge -eq 0 ]; then 
 -              # check both ctime and mtime 
 -              mtime=$(stat -c %Y $file)
 -              ctime=$(stat -c %Z $file)
 -              if [ $mtime -gt $ctime ]; then
 -                  delta=$(($now-$mtime))
 -              else
 -                  delta=$(($now-$ctime))
 -              fi
 -              #echo "$file ($delta), $MinAge"
 -              if [ $delta -le $MinAge ]; then
 -                  #echo "Skiping $file (delta=$delta)"
 -                  break
 -              fi
 -          fi
 +# Set VERBOSE mode from  apt-config (or inherit from environment)
 +eval $(apt-config shell VERBOSE APT::Periodic::Verbose)
 +if [ -z "$VERBOSE" ]; then
 +    VERBOSE="0"
 +fi
 +if [ "$VERBOSE" -le 2 ]; then
 +    # quiet for 0,1,2
 +    XSTDOUT=">/dev/null"
 +    XSTDERR="2>/dev/null"
 +    XAPTOPT="-qq"
 +    XUUPOPT=""
 +else
 +    XSTDOUT=""
 +    XSTDERR=""
 +    XAPTOPT=""
 +    XUUPOPT="-d"
 +fi
 +if [ "$VERBOSE" -ge 3 ]; then
 +    # trace output
 +    set -x
 +fi
 -          # delete oldest file
 -          rm -f $file
 -      done
 +# laptop check, on_ac_power returns:
 +#       0 (true)    System is on main power
 +#       1 (false)   System is not on main power
 +#       255 (false) Power status could not be determined
 +# Desktop systems always return 255 it seems
 +if which on_ac_power >/dev/null; then
 +    on_ac_power
 +    POWER=$?
 +    if [ $POWER -eq 1 ]; then
 +      debug_echo "exit: system on main power."
 +      exit 0
 +    elif [ $POWER -ne 0 ]; then
 +      debug_echo "exit: power status ($POWER) undetermined."
 +      exit 0
      fi
 -}
 +    debug_echo "system is on main power."
 +fi
  
 -# sleep for a random intervall of time (default 30min)
 -# (some code taken from cron-apt, thanks)
 -random_sleep()
 -{
 -    RandomSleep=1800
 -    eval $(apt-config shell RandomSleep APT::Periodic::RandomSleep)
 -    if [ $RandomSleep -eq 0 ]; then
 -      return
 -    fi
 -    if [ -z "$RANDOM" ] ; then
 -        # A fix for shells that do not have this bash feature.
 -      RANDOM=$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -c"1-5")
 -    fi
 -    TIME=$(($RANDOM % $RandomSleep))
 -    sleep $TIME
 -}
 +# check if we can lock the cache and if the cache is clean
 +if which apt-get >/dev/null && ! eval apt-get check $XAPTOPT $XSTDERR ; then
 +    debug_echo "error encountered in cron job with \"apt-get check\"."
 +    exit 0
 +fi
 +# No need to check for apt-get below
  
 -# main
 +# Global current time in seconds since 1970-01-01 00:00:00 UTC
 +now=$(date +%s)
  
 -if ! which apt-config >/dev/null; then
 -      exit 0
 +# Set default values and normalize
 +Dir="/"
 +eval $(apt-config shell Dir Dir)
 +Dir=${Dir%/}
 +
 +CacheDir="var/cache/apt/"
 +eval $(apt-config shell CacheDir Dir::Cache)
 +CacheDir=${CacheDir%/}
 +if [ -z "$CacheDir" ]; then
 +    debug_echo "practically empty Dir::Cache, exiting"
 +    exit 0
  fi
  
 +CacheArchive="archives/"
 +eval $(apt-config shell CacheArchive Dir::Cache::Archives)
 +CacheArchive=${CacheArchive%/}
 +if [ -z "$CacheArchive" ]; then
 +    debug_echo "practically empty Dir::Cache::archives, exiting"
 +    exit 0
 +fi
 +
 +BackupArchiveInterval=0
 +eval $(apt-config shell BackupArchiveInterval APT::Periodic::BackupArchiveInterval)
 +
 +BackupLevel=3
 +eval $(apt-config shell BackupLevel APT::Periodic::BackupLevel)
 +if [ $BackupLevel -le 1 ]; then BackupLevel=2 ; fi
 +
 +CacheBackup="backup/"
 +eval $(apt-config shell CacheBackup Dir::Cache::Backup)
 +CacheBackup=${CacheBackup%/}
 +if [ -z "$CacheBackup" ]; then
 +    echo "practically empty Dir::Cache::Backup, exiting" 1>&2
 +    exit 0
 +fi
 +
 +# Support old Archive for compatibility.
 +# Document only Periodic for all controling parameters of this script.
 +MaxAge=0
 +eval $(apt-config shell MaxAge APT::Archives::MaxAge)
 +eval $(apt-config shell MaxAge APT::Periodic::MaxAge)
 +
 +MinAge=2
 +eval $(apt-config shell MinAge APT::Archives::MinAge)
 +eval $(apt-config shell MinAge APT::Periodic::MinAge)
 +
 +MaxSize=0
 +eval $(apt-config shell MaxSize APT::Archives::MaxSize)
 +eval $(apt-config shell MaxSize APT::Periodic::MaxSize)
 +
  UpdateInterval=0
 +eval $(apt-config shell UpdateInterval APT::Periodic::Update-Package-Lists)
 +
  DownloadUpgradeableInterval=0
 -eval $(apt-config shell UpdateInterval APT::Periodic::Update-Package-Lists DownloadUpgradeableInterval APT::Periodic::Download-Upgradeable-Packages)
 -AutocleanInterval=$DownloadUpgradeableInterval
 -eval $(apt-config shell AutocleanInterval APT::Periodic::AutocleanInterval)
 +eval $(apt-config shell DownloadUpgradeableInterval APT::Periodic::Download-Upgradeable-Packages)
 +
  UnattendedUpgradeInterval=0
  eval $(apt-config shell UnattendedUpgradeInterval APT::Periodic::Unattended-Upgrade)
  
 -# laptop check, on_ac_power returns:
 -#       0 (true)    System is on mains power
 -#       1 (false)   System is not on mains power
 -#       255 (false) Power status could not be determined
 -# Desktop systems always return 255 it seems
 -if which on_ac_power >/dev/null; then
 -    on_ac_power
 -    if [ $? -eq 1 ]; then
 -      exit 0
 -    fi
 -fi
 +AutocleanInterval=0
 +eval $(apt-config shell AutocleanInterval APT::Periodic::AutocleanInterval)
 +
 +Cache="${Dir}/${CacheDir}/${CacheArchive}/"
 +Back="${Dir}/${CacheDir}/${CacheBackup}/"
 +BackX="${Back}${CacheArchive}/"
 +for x in $(seq 0 1 $((${BackupLevel}-1))); do 
 +    eval "Back${x}=${Back}${x}/"
 +done
 +
+ # check if we actually have to do anything
+ if [ $UpdateInterval -eq 0 ] &&
+    [ $DownloadUpgradeableInterval -eq 0 ] &&
+    [ $UnattendedUpgradeInterval -eq 0 ] &&
++   [ $BackupArchiveInterval -eq 0 ] &&
+    [ $AutocleanInterval -eq 0 ]; then
+     exit 0
+ fi
 -# sleep random amount of time to avoid hitting the 
 -# mirrors at the same time
 -random_sleep
 -
 -# check if we can access the cache
 -if ! apt-get check -q -q 2>/dev/null; then
 -    # wait random amount of time before retrying
 -    random_sleep
 -    # check again
 -    if ! apt-get check -q -q 2>/dev/null; then
 -      echo "$0: could not lock the APT cache while performing daily cron job. "
 -      echo "Is another package manager working?"
 -      exit 1
 +# backup after n-days if archive contents changed.
 +# (This uses hardlink to save disk space)
 +BACKUP_ARCHIVE_STAMP=/var/lib/apt/periodic/backup-archive-stamp
 +if check_stamp $BACKUP_ARCHIVE_STAMP $BackupArchiveInterval; then
 +    if [ $({(cd $Cache 2>/dev/null; find . -name "*.deb"); (cd $Back0 2>/dev/null;find . -name "*.deb") ;}| sort|uniq -u|wc -l) -ne 0 ]; then
 +      mkdir -p $Back
 +      rm -rf $Back$((${BackupLevel}-1))
 +      for y in $(seq $((${BackupLevel}-1)) -1 1); do 
 +          eval BackY=${Back}$y
 +          eval BackZ=${Back}$(($y-1))
 +          if [ -e $BackZ ]; then mv -f $BackZ $BackY ; fi
 +      done
 +      cp -la $Cache $Back ; mv -f $BackX $Back0
 +      update_stamp $BACKUP_ARCHIVE_STAMP
 +      debug_echo "backup with hardlinks. (success)"
 +    else
 +
 +      debug_echo "skip backup since same content."
      fi
 +else
 +      debug_echo "skip backup since too new."
  fi
  
 -UPDATE_STAMP=/var/lib/apt/periodic/update-stamp
 -if check_stamp $UPDATE_STAMP $UpdateInterval; then
 -    if apt-get -qq update 2>/dev/null; then
 -        if which dbus-send >/dev/null && pidof dbus-daemon >/dev/null; then
 -            dbus-send --system / app.apt.dbus.updated boolean:true
 -        fi
 -        update_stamp $UPDATE_STAMP
 -    fi
 +# package archive contnts removal by package age
 +if [ $MaxAge -ne 0 ] && [ $MinAge -ne 0 ]; then
 +    find $Cache -name "*.deb"  \( -mtime +$MaxAge -and -ctime +$MaxAge \) -and -not \( -mtime -$MinAge -or -ctime -$MinAge \) -print0 | xargs -r -0 rm -f
 +    debug_echo "aged: ctime <$MaxAge and mtime <$MaxAge and ctime>$MinAge and mtime>$MinAge"
 +elif [ $MaxAge -ne 0 ]; then
 +    find $Cache -name "*.deb"  -ctime +$MaxAge -and -mtime +$MaxAge -print0 | xargs -r -0 rm -f
 +    debug_echo "aged: ctime <$MaxAge and mtime <$MaxAge only"
 +else
 +    debug_echo "skip aging since MaxAge is 0"
  fi
 +    
 +# package archive contnts removal down to $MaxSize
 +if [ $MaxSize -ne 0 ]; then
 +
 +    MinAgeSec=$(($MinAge*24*60*60))
 +
 +    # reverse-sort by mtime
 +    for file in $(ls -rt $Cache/*.deb 2>/dev/null); do 
 +      du=$(du -m -s $Cache)
 +      size=${du%%/*}
 +      # check if the cache is small enough
 +      if [ $size -lt $MaxSize ]; then
 +          debug_echo "end remove by archive size:  size=$size < $MaxSize"
 +          break
 +      fi
 +
 +      # check for MinAge in second of the file
 +      if [ $MinAgeSec -ne 0 ]; then 
 +          # check both ctime and mtime 
 +          mtime=$(stat -c %Y $file)
 +          ctime=$(stat -c %Z $file)
 +          if [ $mtime -gt $ctime ]; then
 +              delta=$(($now-$mtime))
 +          else
 +              delta=$(($now-$ctime))
 +          fi
 +          if [ $delta -le $MinAgeSec ]; then
 +              debug_echo "skip remove by archive size:  $file, delta=$delta < $MinAgeSec"
 +          else
 +              # delete oldest file
 +              debug_echo "remove by archive size: $file, delta=$delta >= $MinAgeSec (sec), size=$size >= $MaxSize"
 +              rm -f $file
 +          fi
 +      fi
  
 -DOWNLOAD_UPGRADEABLE_STAMP=/var/lib/apt/periodic/download-upgradeable-stamp
 -if check_stamp $DOWNLOAD_UPGRADEABLE_STAMP $DownloadUpgradeableInterval; then
 -    apt-get -qq -d dist-upgrade 2>/dev/null
 -    update_stamp $DOWNLOAD_UPGRADEABLE_STAMP
 +    done
  fi
  
 -UPGRADE_STAMP=/var/lib/apt/periodic/upgrade-stamp
 -if check_stamp $UPGRADE_STAMP $UnattendedUpgradeInterval; then
 -    unattended-upgrade
 -    update_stamp $UPGRADE_STAMP
 +# update package lists
 +UPDATE_STAMP=/var/lib/apt/periodic/update-stamp
 +if check_stamp $UPDATE_STAMP $UpdateInterval; then
 +    if eval apt-get $XAPTOPT -y update $XSTDERR; then
 +      debug_echo "download updated metadata (success)."
 +      if which dbus-send >/dev/null && pidof dbus-daemon >/dev/null; then
 +          if dbus-send --system / app.apt.dbus.updated boolean:true ; then
 +              debug_echo "send dbus signal (success)"
 +          else
 +              debug_echo "send dbus signal (error)"
 +          fi
 +      else
 +          debug_echo "dbus signal not send (command not available)"
 +      fi
 +      update_stamp $UPDATE_STAMP
 +      # download all upgradeable packages if it is requested
 +      DOWNLOAD_UPGRADEABLE_STAMP=/var/lib/apt/periodic/download-upgradeable-stamp
 +      if check_stamp $DOWNLOAD_UPGRADEABLE_STAMP $DownloadUpgradeableInterval; then
 +          if eval apt-get $XAPTOPT -y -d dist-upgrade $XSTDERR; then
 +              update_stamp $DOWNLOAD_UPGRADEABLE_STAMP
 +              debug_echo "download upgradable (success)."
 +              # auto upgrade all upgradeable packages
 +              UPGRADE_STAMP=/var/lib/apt/periodic/upgrade-stamp
 +              if which unattended-upgrade >/dev/null && check_stamp $UPGRADE_STAMP $UnattendedUpgradeInterval; then
 +                  if unattended-upgrade $XUUPOPT; then
 +                      update_stamp $UPGRADE_STAMP
 +                      debug_echo "unattended-upgrade (success)."
 +                  else
 +                      debug_echo "unattended-upgrade (error)."
 +                  fi
 +              else
 +                  debug_echo "unattended-upgrade (not run)."
 +              fi
 +          else
 +              debug_echo "download upgradable (error)."
 +          fi
 +      else
 +          debug_echo "download upgradable (not run)."
 +      fi
 +    else
 +      debug_echo "download updated metadata (error)."
 +    fi
 +else
 +    debug_echo "download updated metadata (not run)."
  fi
  
 +# autoclean package archive
  AUTOCLEAN_STAMP=/var/lib/apt/periodic/autoclean-stamp
  if check_stamp $AUTOCLEAN_STAMP $AutocleanInterval; then
 -    apt-get -qq autoclean
 -    update_stamp $AUTOCLEAN_STAMP
 +    if apt-get $XAPTOPT -y autoclean $XSTDERR; then
 +      debug_echo "autoclean (success)."
 +      update_stamp $AUTOCLEAN_STAMP
 +    else
 +      debug_echo "autoclean (error)."
 +    fi
 +else
 +    debug_echo "autoclean (not run)."
  fi
  
 -# check cache size 
 -check_size_constraints
 +#
 +#     vim: set sts=4 ai :
 +#
 +
@@@ -1,22 -1,10 +1,26 @@@
- apt (0.7.14) UNRELEASED; urgency=low
++apt (0.7.15) UNRELEASED; urgency=low
++
++  [ Michael Vogt ]
++  * improve apt progress reporting, display trigger actions
++
++ --
++
+ apt (0.7.14) unstable; urgency=low
  
    [ Christian Perrier ]
    * Mark a message from dselect backend as translatable
      Thanks to Frédéric Bothamy for the patch
      Closes: #322470
  
-   [ Michael Vogt ]
-   * improve apt progress reporting, display trigger actions
-   
 +  [ Osamu Aoki ]
 +  * Updated cron script to support backups by hardlinks and 
 +    verbose levels.  All features turned off by default. 
 +  * Added more error handlings.  Closes: #438803, #462734, #454989, 
 +  * Refactored condition structure to make download and upgrade performed 
 +    if only previous steps succeeded. Closes: #341970
 +  * Documented all cron script related configuration items in 
 +    configure-index.
 +
    [ Program translations ]
    * Simplified Chinese updated. Closes: #473360
    * Catalan fixes. Closes: #387141