[1] | 1 | #!/bin/sh
|
---|
| 2 | #
|
---|
[275] | 3 | # $Id: mondo-makefilelist 275 2006-01-03 15:59:29Z bcornec $
|
---|
| 4 |
|
---|
| 5 | #
|
---|
[1] | 6 | # mondo-makefilelist
|
---|
| 7 | # ...an off-shoot of mondo-archive
|
---|
| 8 | #
|
---|
| 9 | # 12/09/2003
|
---|
| 10 | # - changed 'find -newer' to 'find -cnewer' for differential backup
|
---|
| 11 | #
|
---|
| 12 | # 01/02/2003
|
---|
| 13 | # - only add _existant_ dirs&files to EXCLUDE_THESE_PLEASE
|
---|
| 14 | #
|
---|
| 15 | # 12/20/2002
|
---|
| 16 | # - exclude /media/cdrom,cdrecorder,floppy
|
---|
| 17 | #
|
---|
| 18 | # 11/18/2002
|
---|
| 19 | # - exclude tmp.mondo.* and mondo.scratch.* using
|
---|
| 20 | # sensible wildcards (finally!)
|
---|
| 21 | #
|
---|
| 22 | # 11/07/2002
|
---|
| 23 | # - changed gawk to awk for Debian users *sigh*
|
---|
| 24 | #
|
---|
| 25 | # 10/29/2002
|
---|
| 26 | # - replaced convoluted grep with wc (KP)
|
---|
| 27 | #
|
---|
| 28 | # 04/01 - 07/31
|
---|
| 29 | # - exclude /root/images/mindi
|
---|
| 30 | # - backup differential datestamp, just in case
|
---|
| 31 | # - changed $i to $j (Karsten)
|
---|
| 32 | # - exclude pagefile.sys (WinXP virtual memory file) from backup
|
---|
| 33 | #
|
---|
| 34 | # 03/01 - 03/31
|
---|
| 35 | # - added -E patch to exclude files and/or dirs properly (Andy Glass)
|
---|
| 36 | # - remove ' from either side of line 46's find() command
|
---|
| 37 | # - patch from Andy Glass to make Mondo more SUN-friendly when
|
---|
| 38 | # handling /etc/fstab and "-" entries
|
---|
| 39 | #
|
---|
| 40 | # 02/01 - 02/28
|
---|
| 41 | # - added a patch from KirkJT to support pathnames containing spaces
|
---|
| 42 | # - do not allow user to exclude /dev/* from filelist, just mountlist
|
---|
| 43 | # - exclude .autofsck from each partition's root dir
|
---|
| 44 | # - fixed -D (differential) bug
|
---|
| 45 | #
|
---|
| 46 | # 01/29/2002
|
---|
| 47 | # - separated from mondo-archive, which was then ported to C
|
---|
| 48 | ######################################################################
|
---|
| 49 |
|
---|
| 50 |
|
---|
| 51 |
|
---|
| 52 |
|
---|
| 53 | DATEFILE=/var/cache/mondo-archive/last-backup
|
---|
| 54 |
|
---|
| 55 | FatalError() {
|
---|
| 56 | echo "$1" >> $LOGFILE
|
---|
| 57 | echo "$1" >> /dev/stderr
|
---|
| 58 | exit 1
|
---|
| 59 | }
|
---|
| 60 |
|
---|
| 61 |
|
---|
| 62 |
|
---|
| 63 |
|
---|
| 64 | MakeFilelist() {
|
---|
| 65 | local excluded i exlist call bkpaths output paths_to_exclude j
|
---|
| 66 | bkpaths=$1
|
---|
| 67 | output=$2
|
---|
| 68 | paths_to_exclude=$3
|
---|
| 69 | mkdir -p /var/cache/mondo-archive
|
---|
| 70 | # Mikael Hultgren - 03/07/2002
|
---|
| 71 | call="find $bkpaths"
|
---|
| 72 | # end patch
|
---|
| 73 | for i in $paths_to_exclude ; do
|
---|
| 74 | j=`echo /"$i/" | awk -F "/" '{ for(i=1;i<NF;i++) { if (length($i)>=1) {printf "/%s",$i;};}; print ""; }'`
|
---|
| 75 | j=$(echo $j | sed 's/\\_/ /g')
|
---|
| 76 | call="$call -path '$j' -prune -o"
|
---|
| 77 | done
|
---|
| 78 | # Conor Daly - 12/09/2003
|
---|
| 79 | # change '-newer' to '-cnewer'
|
---|
| 80 | [ "$USE_DIFFERENTIAL" = "yes" ] && call="$call -cnewer $DATEFILE -a"
|
---|
| 81 | call="$call -print"
|
---|
| 82 | echo "call to find = $call" >> $LOGFILE
|
---|
| 83 | eval $call > $TMP/filelist 2> $TMP/find.log
|
---|
| 84 | # cp $TMP/filelist /tmp/filelist
|
---|
| 85 | res=`grep -v "Permission denied" $TMP/find.log`
|
---|
| 86 | if [ "$res" != "" ] ; then
|
---|
[275] | 87 | cat $TMP/find.log | tee -a $LOGFILE
|
---|
[1] | 88 | fi
|
---|
| 89 | # include various directory _paths_ (not contents of dirs: that comes later)
|
---|
| 90 | for i in $paths_to_exclude ; do
|
---|
| 91 | echo "$i" >> $TMP/filelist ; # backup the dirpath, NOT contents
|
---|
| 92 | done
|
---|
| 93 | for i in $paths_to_exclude $bkpaths ; do
|
---|
| 94 | echo "$i" | cut -d'/' -f1 >> $TMP/filelist
|
---|
| 95 | echo "$i" | cut -d'/' -f1,2 >> $TMP/filelist
|
---|
| 96 | echo "$i" | cut -d'/' -f1,2,3 >> $TMP/filelist
|
---|
| 97 | echo "$i" | cut -d'/' -f1,2,3,4 >> $TMP/filelist
|
---|
| 98 | echo "$i" | cut -d'/' -f1,2,3,4,5 >> $TMP/filelist
|
---|
| 99 | echo "$i" | cut -d'/' -f1,2,3,4,5,6 >> $TMP/filelist
|
---|
| 100 | echo "$i" | cut -d'/' -f1,2,3,4,5,6,7 >> $TMP/filelist
|
---|
| 101 | done
|
---|
| 102 | # exclude lost+found folders, Win9x hibernation file and Win9x swap file
|
---|
[273] | 103 | sort $TMP/filelist -u | \
|
---|
[1] | 104 | grep -v "/win386\.swp" | grep -v "/vmmhiber\.w9x" | \
|
---|
| 105 | grep -v "/hiberfil\.sys" | grep -v "/win386.swp" | grep -v "/pagefile\.sys" | \
|
---|
| 106 | grep -v "/tmp\.mondo\.[0-9]+*" | grep -v "/mondo\.scratch\.[0-9]+*" > $output
|
---|
| 107 |
|
---|
| 108 | # Patch from Andy Glass - 03/03/2002
|
---|
[275] | 109 | for i in `tr -s '\t' ' ' < /etc/fstab | cut -d' ' -f2 | grep -v '-'` ; do
|
---|
[1] | 110 | # End patch
|
---|
[273] | 111 | grep -vx "$i/lost+found" $output | grep -vx $i"lost+found" > $output.MID
|
---|
[1] | 112 | sync
|
---|
| 113 | mv -f $output.MID $output
|
---|
| 114 | done
|
---|
| 115 | # exclude .journal files (ext3)
|
---|
[275] | 116 | for i in `tr -s '\t' ' ' < /etc/fstab | grep "ext3" | cut -d' ' -f2` ; do
|
---|
[273] | 117 | grep -vx "$i/\.journal" $output | grep -vx "$i\.journal" | grep -vx "$i\.autofsck" > $output.MID
|
---|
[1] | 118 | sync
|
---|
| 119 | mv -f $output.MID $output
|
---|
| 120 | done
|
---|
| 121 | # exclude /var/log/pacct and Mondo's temp files
|
---|
[273] | 122 | grep -vx "" $output | grep -v "/var/log/pacct" | grep -v "tmp\.mondo\.$$" | grep -vx "/var/log/mondo-archive\.log" | grep -v "mondo\.scratch\.$$" > $output.MID
|
---|
[1] | 123 | mv -f $output.MID $output
|
---|
| 124 | cp -f $output $TMP/filelist
|
---|
| 125 | # exclude /var/run/*.pid (lockfiles)
|
---|
[273] | 126 | # grep -vx "/var/run/[^\.]*\.pid" $output > $output.MID
|
---|
[1] | 127 | # mv -f $output.MID $output
|
---|
| 128 | }
|
---|
| 129 |
|
---|
| 130 |
|
---|
| 131 |
|
---|
| 132 |
|
---|
| 133 |
|
---|
| 134 |
|
---|
| 135 |
|
---|
| 136 | ############################ main ############################
|
---|
| 137 |
|
---|
| 138 | if [ "$#" -ne "6" ] ; then
|
---|
| 139 | echo "mondo-makefilelist <logfile> <tmpdir> <scratchdir> <archivepath> <exclude_paths> <differential>" >> /dev/stderr
|
---|
| 140 | exit 1
|
---|
| 141 | fi
|
---|
| 142 |
|
---|
| 143 | LOGFILE=$1
|
---|
| 144 | TMP=$2
|
---|
| 145 | scratchdir=$3
|
---|
| 146 | archivepath="$4"
|
---|
| 147 | EXCLUDE_PATHS="$5"
|
---|
| 148 | USE_DIFFERENTIAL="$6"
|
---|
| 149 |
|
---|
| 150 | mkdir -p $DATEFILE &> /dev/null
|
---|
| 151 | rmdir $DATEFILE &> /dev/null
|
---|
| 152 | # If previous aborted backup then restore the old datestamp first :)
|
---|
| 153 | [ -e "$DATEFILE.aborted" ] && mv -f $DATEFILE.aborted $DATEFILE
|
---|
| 154 | # Now, take a backup of current datestamp. If backup is not aborted
|
---|
| 155 | # then main() will delete backup datestamp. Cool. However, if it _is_
|
---|
| 156 | # aborted then it won't, which means I'll find the backup datestamp
|
---|
| 157 | # next time, recover it, and so on.
|
---|
| 158 | cp -f $DATEFILE $DATEFILE.aborted 2> /dev/null
|
---|
| 159 |
|
---|
| 160 | if [ "$USE_DIFFERENTIAL" ] ; then
|
---|
| 161 | echo "Differential backup" >> $LOGFILE
|
---|
| 162 | if [ ! -e "$DATEFILE" ] ; then
|
---|
| 163 | echo "No datestamp. Reverting to full backup." >> $LOGFILE
|
---|
| 164 | USE_DIFFERENTIAL=""
|
---|
| 165 | rm -f $DATEFILE; echo "`date +%s`" > $DATEFILE
|
---|
| 166 | fi
|
---|
| 167 | else
|
---|
| 168 | echo "Full backup. Updating datestamp." >> $LOGFILE
|
---|
| 169 | echo "`date +%s`" > $DATEFILE || FatalError "Unable to write to $DATEFILE"
|
---|
| 170 | fi
|
---|
| 171 |
|
---|
| 172 | mkdir -p $scratchdir/archives
|
---|
| 173 | exclude_these_please=""
|
---|
| 174 | for i in $LOGFILE $scratchdir $TMP /mnt/cdrom /mnt/floppy /media/cdrom /media/cdrecorder /media/floppy /proc $EXCLUDE_PATHS /tmp /root/images/mondo /root/images/mindi ; do
|
---|
| 175 | [ "`echo "$i" | grep -x "/dev/.*"`" = "" ] && [ -e "$i" ] && exclude_these_please="$exclude_these_please $i"
|
---|
| 176 | done
|
---|
| 177 | MakeFilelist "$archivepath" $TMP/filelist.full "$exclude_these_please"
|
---|
| 178 | > $TMP/cklist.full
|
---|
| 179 | mv -f $TMP/filelist.full $TMP/filelist.blah
|
---|
| 180 | ## See if EXCLUDE_PATHS includes a file of two
|
---|
| 181 | for X in $EXCLUDE_PATHS ; do
|
---|
| 182 | if [ ! -d $X ] ; then
|
---|
[273] | 183 | grep -v $X $TMP/filelist.blah > $TMP/filelist.full
|
---|
[1] | 184 | mv -f $TMP/filelist.full $TMP/filelist.blah
|
---|
| 185 | fi
|
---|
| 186 | done
|
---|
[273] | 187 | grep -v "mojo-jojo-123" $TMP/filelist.blah > $TMP/filelist.full
|
---|
[1] | 188 | [ ! -e "$TMP/filelist.full" ] && FatalError "Serious error when removing mojo jojo from fielist"
|
---|
| 189 | cp $TMP/filelist.full /tmp
|
---|
| 190 | cp -f $TMP/filelist.full "$scratchdir"/archives/
|
---|
| 191 | cp -f $TMP/filelist.full /var/cache/mondo-archive/
|
---|
| 192 | [ ! -e "$TMP/filelist.full" ] && FatalError "Who let the dogs out? (Who!? Who!?)"
|
---|
| 193 | #total_files_to_backup=`grep -n "" $TMP/filelist.full | tail -n1 | cut -d':' -f1`
|
---|
| 194 | total_files_to_backup=`cat $TMP/filelist.full | wc -l`
|
---|
| 195 | echo "Backing up $total_files_to_backup files" >> $LOGFILE
|
---|
| 196 | exit 0
|
---|
| 197 |
|
---|