]> git.sesse.net Git - backup.sh/commitdiff
now uses pee instead of tee to speed up idx file creation
authorroot <empty>
Mon, 17 Dec 2007 20:05:05 +0000 (20:05 +0000)
committerroot <empty>
Mon, 17 Dec 2007 20:05:05 +0000 (20:05 +0000)
backup.sh

index 10aa460d28641d62f9c2a72137e96711bff5e351..a16ca3fb3e65512b35c587a585cab4f7f2da4a53 100755 (executable)
--- a/backup.sh
+++ b/backup.sh
@@ -27,8 +27,8 @@
 # in English, we should probably stick to that.
 
 # TODO(sesse, 2007-12-16): 
-#  * Bruk tee i stedet for en separat tar ztvf-prosess
 #  * Sjekk hvorfor .idx-filene til UD er blitt 0 for siste fullbackuper
+#  * Rydde uleselig kode fra linje 211 og litt nedover
 
 # Configuration
 LOCKFILE=/home/backup/backuprun.lockfile
@@ -114,10 +114,10 @@ backup()
    tar=tar
  fi
 
- #expand the exclude-path for use with tar
+ # expand the exclude-path for use with tar
  exf=`ssh root@$computer "ls ~/.backup/exclude"`
 
- #We try to run tar on the remote computer
+ # We try to run tar on the remote computer
  #    z gzip it
  #    c create archive
  #    C change to directory first
@@ -125,29 +125,32 @@ backup()
  #    $lastcmd only files newer than this
  #    --one-file-system don't traverse file systems
  #    --exclude-from file to get exclusion pattern from
- #    And at last, redirect stdout to stderr, to get output logged.
+ #    Pipe the stuff over ssh to ourselves, run pee to cat the contents to a
+ #    file and build a file list, respectivly.  
  TARFILE=$DATE.tmp
  TARCMD="ssh root@$computer \"$tar --one-file-system -zcf - -C $filesystem . $lastcmd \
-       --exclude-from=$exf\" > $TARFILE"
+       --exclude-from=$exf\" | pee \"cat > $TARFILE\" \"tar tvf -\""
  echo `date`" $computer: Running $TARCMD" >&2
- eval $TARCMD;
+ eval $TARCMD > $DATE.idx
+
  if [ -s $TARFILE ]; then
+  # File is >0 in size, we assume it worked.
+
+  # Move tar file in place
   mv $TARFILE $DATE.tgz
-  #make a filelist.
-  #update the datefile if the filelist is ok.
-  tar tvfz $DATE.tgz > $DATE.idx 2>&1 &&
-    echo $DATEs > ../.date            &&
-    touch -t $DATE ../.date
 
-  #make a sortet filelist
+  # Update timestamp
+  echo $DATEs > ../.date && touch -t $DATE ../.date
+
+  # Make a sorted filelist
   grep -v ^d $DATE.idx | sort -n -r -k 2 > $DATE.sdx
 
-  #fix perm
+  # Fix permissions
   chmod 600 *tgz                      #only for us
   chmod 644 *sdx *idx 2>/dev/null     #everyone can read
 
  else
-  #it did not work
+  # Something wrong happened.
   rm $TARFILE
   echo `date`" $computer: $TARFILE empty. $backuplevel backup of $computer:$filesystem failed and deleted"
 
@@ -157,12 +160,11 @@ backup()
 
 }
 
-#Løper gjennom listen av unixmaskiner som vi skal ta backup av
 for computer in $unixcomputers
 do
 ( 
- # Check that the target filesystem is mounted 
- # (actually check that it's not the root filesystem)
+ # Check that the target filesystem is mounted (actually check that it's not
+ # the root filesystem)
  rootfilesystem=`df -P /`
  targetfilesystem=`df -P "$storagedir/$computer"`
  if [ "$rootfilesystem" == "$targetfilesystem" ]; then
@@ -182,33 +184,30 @@ do
   continue;
  fi
  
- #tømmer variabelen for sikkerhets skyld
  filesystems=""
 
- #Sjekker nest siste felt i fstab. Om det er 0 tar vi ikke backup
+ # Check dump bit in fstab
  filesystems=`ssh -n root@$computer "cat /etc/fstab" \
   | grep -v nfs \
   | grep -v "^#" \
   | grep -v "^$" \
   | awk '{ if ( $(NF-1) != "0" ) print $2}' `
 
- #clean up our dir at this client
+ # Clean up our dir at this client
  if ! ssh root@$computer "rm -r ~/.backup ; mkdir -m 700 ~/.backup"; then
   echo `date`" $computer: Could not create backup staging area at $computer:~/.backup - skipping backup of $computer"
-  # We don't want to return 0
   R=1
   continue;
  fi
 
- #try to copy $exclude to $computer
+ # Try to copy $exclude to $computer
  if ! scp $exclude root@$computer:~/.backup/exclude > /dev/null; then
   echo `date`" $computer: Could not copy exclude.txt to $computer - skipping backup of $computer"
-  # We don't want to return 0
   R=1
   continue;
  fi
 
- #try to copy preeexec and postexec if they exist
+ # Try to copy preeexec and postexec if they exist
 # TODO: Gah, clean this mess!
  [ -f $confdir/preexec.$computer ] && (
     scp $confdir/preexec.$computer  root@$computer:~/.backup/preexec >&2 ||
@@ -225,7 +224,7 @@ do
      )
     )
 
- #try to run preexec if it exist
+ # Try to run preexec if it exist
  if ! ssh root@$computer "[ ! -f ~/.backup/preexec ] || /bin/bash -x ~/.backup/preexec" >&2; then
        echo `date`" $computer: Could not run $computer:~/.backup/preexec - skipping backup of $computer"
        R=1
@@ -235,45 +234,43 @@ do
 
  for filesystem in $filesystems
  do
-  #lager en variant uten tegnet "/" eller $ (gjelder NT)
+  # Remove / and $ (for Windows) for path names
   sfilesystem=`echo $filesystem | tr '\/\$' '__'`
 
-  #lager det som trengs av kataloger
+  # Prepare storage area
   mkdir -m 755 -p $storagedir/$computer/$sfilesystem/{full,daglig} 2>/dev/null
-
   echo $filesystem > ${storagedir}/${computer}/.${sfilesystem}.name 
   chmod 644 ${storagedir}/${computer}/.${sfilesystem}.name
 
-  #set default backuplevel
+  # Default backuplevel
   backuplevel=daglig
 
   if [ ! -f $storagedir/$computer/$sfilesystem/.date ]
   then
-   #take the first full backup of this filesystem on this computer
+   # Take the first full backup of this filesystem on this computer
    backuplevel=full
    echo $DATEs > $storagedir/$computer/$sfilesystem/.date
   fi
 
-  #sjekker om det er på tide med en full
+  # Check if we want a full backup
   if [ -z "`find $storagedir/$computer/$sfilesystem/full/ -name \*tgz -mtime -$dagermellomfulle`" ]; then
    backuplevel=full
   fi
  
-  #gå ned i rett katalog, eller dø 
-  # TODO bør sende mail om dette skjer!
+  # We want to be here
   cd $storagedir/$computer/$sfilesystem/$backuplevel || die
 
-  #perform the actual backup
+  # Perform the actual backup
   backup
 
-  # Sjekk om det skal være et annet antall fulle backuper av en boks
+  # Check if this box has a custom number of full backups
   if [ -f $confdir/maksfulle.$computer ] ; then
     mf=$((`cat $confdir/maksfulle.$computer`+1))
   else
     mf=$(($maksantallfulle+1))
   fi
 
-  #delete complete backups
+  # Delete old full backups
   for full in `ls -1t $storagedir/$computer/$sfilesystem/full/*tgz | tail -n +$mf`
   do
    prefix=`echo $full | sed "s/\.[^.]*$//"`
@@ -281,7 +278,7 @@ do
    rm $prefix*
   done
 
-  #delete incremental backups older than the oldest complete backup
+  # Delete incremental backups older than the oldest full backup
   oldf=`ls -t1 $storagedir/$computer/$sfilesystem/full/*tgz | tail -1`
   find \
      $storagedir/$computer/$sfilesystem/daglig \
@@ -291,7 +288,7 @@ do
      -exec rm {} \; >&2
  done
 
- #try to run postexec if it exist
+ # Try to run postexec if it exist
  if ! ssh root@$computer "[ ! -f ~/.backup/postexec ] || /bin/bash -x ~/.backup/postexec" >&2; then
        echo `date`" $computer: Could not run $computer:~/.backup/postexec"
        R=1
@@ -307,7 +304,7 @@ rm $LOCKFILE
 
 # Did anything go wrong?
 # (IMPORTANT NOTE: The R-business does not work as expected, since this script
-# forks itself.
+# forks itself).
 if [ $R != 0 ]; then
        echo `date`": Backup run ended with errors, check logs."
        exit 1