Allow passing additional parameters to rsync
[public/mirror.git] / csc-sync-debian
1 #! /bin/bash
2
3 if [[ $# < 3 ]]; then
4   echo 'Usage: sync local_dir rsync_host rsync_dir [trace_host [trace_dir]]'
5   exit 1
6 fi
7
8 set -e
9
10 RSYNC="rsync"
11 TOP_DIR=/mirror
12 TO=$TOP_DIR/root/$1
13 RSYNC_HOST=$2
14 RSYNC_DIR=$3
15 if [ $# = 4 ]; then
16     TRACE_HOST=$4
17 fi
18 TRACE_DIR=project/trace
19 if [ $# = 5 ]; then
20     TRACE_DIR=$5
21 fi
22 LOGDIR=/var/log/mirror/$1_$2
23 ADDRESS=129.97.134.71
24
25 mkdir -p $LOGDIR
26
27 # This script originates from http://www.debian.org/mirror/anonftpsync
28
29 # CVS: cvs.debian.org:/cvs/webwml - webwml/english/mirror/anonftpsync
30 # Version: $Id: anonftpsync,v 1.33 2007/09/12 15:19:03 joy Exp $ 
31
32 # Note: You MUST have rsync 2.6.4 or newer, which is available in sarge
33 # and all newer Debian releases, or at http://rsync.samba.org/
34
35 # Don't forget:
36 # chmod u+x anonftpsync
37
38 # Set the variables below to fit your site. You can then use cron to have
39 # this script run daily to automatically update your copy of the archive.
40
41 # TO is the destination for the base of the Debian mirror directory
42 # (the dir that holds dists/ and ls-lR).
43 # (mandatory)
44
45 #TO=
46
47 # RSYNC_HOST is the site you have chosen from the mirrors file.
48 # (http://www.debian.org/mirror/list-full)
49 # (mandatory)
50
51 #RSYNC_HOST=
52
53 # RSYNC_DIR is the directory given in the "Packages over rsync:" line of
54 # the mirrors file for the site you have chosen to mirror.
55 # (mandatory)
56
57 #RSYNC_DIR=
58
59 # LOGDIR is the directory where the logs will be written to
60 # (mandatory)
61
62 #LOGDIR=
63
64 # ARCH_EXCLUDE can be used to exclude a complete architecture from
65 # mirrorring. Please use as space seperated list.
66 # Possible values are:
67 # alpha, amd64, arm, hppa, hurd-i386, i386, ia64, m68k, mipsel, mips, powerpc, s390, sh and sparc
68 #
69 # There is one special value: source
70 # This is not an architecture but will exclude all source code in /pool
71 #
72 # eg.
73 # ARCH_EXCLUDE="alpha arm hppa hurd-i386 ia64 m68k mipsel mips s390 sparc"
74
75 # With a blank ARCH_EXCLUDE you will mirror all available architectures
76 # (optional)
77
78 # EXCLUDE is a list of parameters listing patterns that rsync will exclude, in
79 # addition to the architectures excluded by ARCH_EXCLUDE.
80 #
81 # Use ARCH_EXCLUDE to exclude specific architectures or all sources
82 #
83 # --exclude stable, testing, unstable options DON'T remove the packages of
84 # the given distribution. If you want do so, use debmirror instead.
85 #
86 # The following example would exclude mostly everything:
87 #EXCLUDE="\
88 #  --exclude stable/ --exclude testing/ --exclude unstable/ \
89 #  --exclude source/ \
90 #  --exclude *.orig.tar.gz --exclude *.diff.gz --exclude *.dsc \
91 #  --exclude /contrib/ --exclude /non-free/ \
92 # "
93
94 # With a blank EXCLUDE you will mirror the entire archive, except the
95 # architectures excluded by ARCH_EXCLUDE.
96 # (optional)
97
98 EXCLUDE=
99
100 # LOCK_TIMEOUT is a timeout in minutes.  Defaults to 360 (6 hours).
101 # This program creates a lock to ensure that only one copy
102 # of it is mirroring any one archive at any one time.
103 # Locks held for longer than the timeout are broken, unless
104 # a running rsync process appears to be connected to $RSYNC_HOST.
105
106 LOCK_TIMEOUT=360
107
108 # There should be no need to edit anything below this point, unless there
109 # are problems.
110
111 #-----------------------------------------------------------------------------#
112
113 # If you are accessing a rsync server/module which is password-protected,
114 # uncomment the following lines (and edit the other file).
115
116 # . ftpsync.conf
117 # export RSYNC_PASSWORD
118 # RSYNC_HOST=$RSYNC_USER@$RSYNC_HOST
119
120 #-----------------------------------------------------------------------------#
121
122 # Check for some environment variables
123 if [ -z $TO ] || [ -z $RSYNC_HOST ] || [ -z $RSYNC_DIR ] || [ -z $LOGDIR ]; then
124         echo "One of the following variables seems to be empty:"
125         echo "TO, RSYNC_HOST, RSYNC_DIR or LOGDIR"
126         exit 2
127 fi
128
129 if ! [ -d ${TO}/${TRACE_DIR} ]; then
130         # we are running mirror script for the first time
131         umask 002
132         mkdir -p ${TO}/${TRACE_DIR}
133 fi
134
135 # Note: on some non-Debian systems, hostname doesn't accept -f option.
136 # If that's the case on your system, make sure hostname prints the full
137 # hostname, and remove the -f option. If there's no hostname command,
138 # explicitly replace `hostname -f` with the hostname.
139
140 HOSTNAME=`hostname -f`
141
142 # The hostname must match the "Site" field written in the list of mirrors.
143 # If hostname doesn't returns the correct value, fill and uncomment below 
144 HOSTNAME=mirror.csclub.uwaterloo.ca
145  
146 LOCK="${TO}/Archive-Update-in-Progress-${HOSTNAME}"
147
148 # The temp directory used by rsync --delay-updates is not
149 # world-readable remotely. It must be excluded to avoid errors. 
150 TMP_EXCLUDE="--exclude .~tmp~/"
151
152 # Exclude architectures defined in $ARCH_EXCLUDE
153 for ARCH in $ARCH_EXCLUDE; do
154         EXCLUDE=$EXCLUDE"\
155                 --exclude binary-$ARCH/ \
156                 --exclude disks-$ARCH/ \
157                 --exclude installer-$ARCH/ \
158                 --exclude Contents-$ARCH.gz \
159                 --exclude Contents-$ARCH.diff/ \
160                 --exclude arch-$ARCH.files \
161                 --exclude arch-$ARCH.list.gz \
162                 --exclude *_$ARCH.deb \
163                 --exclude *_$ARCH.udeb "
164         if [ "$ARCH" == "source" ]; then
165                 SOURCE_EXCLUDE="\
166                 --exclude source/ \
167                 --exclude *.tar.gz \
168                 --exclude *.diff.gz \
169                 --exclude *.dsc "
170         fi
171 done
172
173 # Logfile
174 LOGFILE=$LOGDIR/mirror.log
175
176 # Get in the right directory and set the umask to be group writable
177
178 cd $HOME
179 umask 002
180
181 # Check to see if another sync is in progress
182 if [ -f "$LOCK" ]; then
183 # Note: this requires the findutils find; for other finds, adjust as necessary
184   if [ "`find $LOCK -maxdepth 1 -amin -$LOCK_TIMEOUT`" = "" ]; then
185 # Note: this requires the procps ps; for other ps', adjust as necessary
186     if ps ax | grep '[r]'sync | grep -q $RSYNC_HOST; then
187       echo "stale lock found, but a rsync is still running, aiee!" > /dev/stderr
188       exit 1
189     else
190       echo "stale lock found (not accessed in the last $LOCK_TIMEOUT minutes), forcing update!"
191       rm -f $LOCK
192     fi
193   else
194     echo "current lock file exists, unable to start rsync!"
195     exit 1
196   fi
197 fi
198
199 touch $LOCK
200 # Note: on some non-Debian systems, trap doesn't accept "exit" as signal
201 # specification. If that's the case on your system, try using "0".
202 trap "rm -f $LOCK" exit
203
204 set +e
205
206 # check if we need to sync
207 if [[ "$TRACE_HOST" != "" ]]; then
208     TRACE_OLD_TIME=`stat -c%Y $TO/$TRACE_DIR/$TRACE_HOST 2> /dev/null`
209     TRACE_NEW_FILE=/tmp/$RSYNC_HOST_$RSYNC_DIR_$RANDOM
210     $RSYNC -tv --address=$ADDRESS \
211         $RSYNC_HOST::$RSYNC_DIR/$TRACE_DIR/$TRACE_HOST \
212         $TRACE_NEW_FILE >> $LOGFILE 2>&1
213     TRACE_NEW_TIME=`stat -c%Y $TRACE_NEW_FILE`
214     rm -f $TRACE_NEW_FILE
215     if [ "$TRACE_OLD_TIME" = "$TRACE_NEW_TIME" ]; then
216         echo 'Trace file for' $RSYNC_HOST::$RSYNC_DIR \
217             'unchanged, not rsyncing.' >> $LOGFILE
218         exit 0
219     fi
220 fi
221
222 # First sync /pool
223 $RSYNC -rlHtv \
224      $TMP_EXCLUDE $EXCLUDE $SOURCE_EXCLUDE \
225      --timeout=3600 --address=$ADDRESS \
226      $RSYNC_HOST::$RSYNC_DIR/pool/ $TO/pool/ >> $LOGFILE 2>&1
227 result=$?
228
229 if [ 0 = $result ]; then
230         # Now sync the remaining stuff
231         $RSYNC -rlHtv --delay-updates --delete-after \
232              --exclude "Archive-Update-in-Progress-${HOSTNAME}" \
233              --exclude "${TRACE_DIR}/${HOSTNAME}" \
234              --timeout=3600 --address=$ADDRESS \
235              $TMP_EXCLUDE $EXCLUDE $SOURCE_EXCLUDE \
236              $RSYNC_HOST::$RSYNC_DIR $TO >> $LOGFILE 2>&1
237
238         mkdir -p ${TO}/${TRACE_DIR}
239         LANG=C date -u > "${TO}/${TRACE_DIR}/${HOSTNAME}"
240 else
241         echo "ERROR: Help, something weird happened" | tee -a $LOGFILE
242         echo "mirroring /pool exited with exitcode" $result | tee -a $LOGFILE
243 fi
244
245 savelog $LOGFILE >/dev/null
246
247 rm $LOCK