comparison misc/updatedcc.in @ 0:c7f6b056b673

First import of vendor version
author Peter Gervai <grin@grin.hu>
date Tue, 10 Mar 2009 13:49:58 +0100
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:c7f6b056b673
1 #! /bin/sh
2
3 # Fetch, build, install, and start a new version of the DCC just
4 # as it was configured last time.
5
6 # This script should only be used after the DCC has been correctly configured.
7
8 # If this script fails in its efforts to use wget, curl, fetch, or ftp
9 # to download a new tarball, then manually download a tarball to
10 # build subdirectory in the DCC home directory, probably @prefix@/build.
11 # This script unpacks the newest DCC tarball it finds in that directory,
12 # which will probably be the manually download file.
13
14
15 # This script should usually not be used if large configuration changes are
16 # needed. Instead use `./configure ...; make install` as usual. That will
17 # create a new version of this script with the ./configure settings captured.
18 # However, -eENV=VAL and -cCONF=VAL can be used to tweak an installation,
19 # as in `updatedcc -c--with-uid=dcc` `updatedcc -c--without-uid`
20 # or `updatedcc -e DBGFLAGS=-g`
21
22 # -e ENV=VAL set environment variable ENV to VAL before running ./configure
23
24 # -c CONF=VAL add "CONF=VAL" to the end of the settings given ./configure
25
26 # -s base-URL fetch the tarball using base-URL instead of the default.
27 # The name of the tarball is appended to base-URL.
28
29 # -V x.y.z try to fetch version x.y.z of the tarball instead of the
30 # the most recent verison
31
32 # -C pfile fetch theDCC source using parameters in pfile
33
34 # -T tgt target instead of "install" for `make`
35
36 # -U only fetch, unpack, and configure the tarball. Do not compile
37 # or install the software.
38
39 # -K cron (kron) mode; configure, compile, and install only
40 # if the fetched version differs, and be silent when
41 # nothing is done
42
43 # -x debug
44 # -v verbose
45
46
47 # This script should be run as root, but can be run as the non-root
48 # user that runs dccm and dccd. If not run as root, it cannot install
49 # man pages or user commands including cdcc and dccproc.
50
51 # The following environment variables are set by this script to their values
52 # when ./configure or this script was last run:
53 # Unsetting variables that are not set often yields a non-zero command status
54 # so do this before watching for error from mkdir and so forth
55 export @UPDATEDCC_ENV@
56 unset @UPDATEDCC_ENV@
57 ENV_SET="@UPDATEDCC_ENV_SET@"
58 @UPDATEDCC_ENV_SET@
59 @UPDATEDCC_ENV_EXPORT@
60
61
62 # Copyright (c) 2008 by Rhyolite Software, LLC
63 #
64 # This agreement is not applicable to any entity which sells anti-spam
65 # solutions to others or provides an anti-spam solution as part of a
66 # security solution sold to other entities, or to a private network
67 # which employs the DCC or uses data provided by operation of the DCC
68 # but does not provide corresponding data to other users.
69 #
70 # Permission to use, copy, modify, and distribute this software without
71 # changes for any purpose with or without fee is hereby granted, provided
72 # that the above copyright notice and this permission notice appear in all
73 # copies and any distributed versions or copies are either unchanged
74 # or not called anything similar to "DCC" or "Distributed Checksum
75 # Clearinghouse".
76 #
77 # Parties not eligible to receive a license under this agreement can
78 # obtain a commercial license to use DCC by contacting Rhyolite Software
79 # at sales@rhyolite.com.
80 #
81 # A commercial license would be for Distributed Checksum and Reputation
82 # Clearinghouse software. That software includes additional features. This
83 # free license for Distributed ChecksumClearinghouse Software does not in any
84 # way grant permision to use Distributed Checksum and Reputation Clearinghouse
85 # software
86 #
87 # THE SOFTWARE IS PROVIDED "AS IS" AND RHYOLITE SOFTWARE, LLC DISCLAIMS ALL
88 # WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
89 # OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RHYOLITE SOFTWARE, LLC
90 # BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
91 # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
92 # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
93 # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
94 # SOFTWARE.
95 # Rhyolite Software DCC 1.3.103-1.111 $Revision$
96 # @configure_input@
97
98 # English messages so grep can suppress them;
99 # simple collating sequence for sort
100 # sane gcc error messages
101 LC_ALL=C; export LC_ALL
102
103
104 RELEASE=1.3.103
105 HTTP_REFERER=DCC-$RELEASE-script; export HTTP_REFERER
106
107 DCC_HOMEDIR=@prefix@
108 DCC_LIBEXEC=@libexecdir@ # in case dcc_conf has disappeared
109 . $DCC_HOMEDIR/dcc_conf
110 BDIR=$DCC_HOMEDIR/build
111 DCCDIR=$BDIR/dcc
112 OK_MARK=$BDIR/.updatedcc_ok
113 BURLS=
114 VERSION=
115
116 ME=`basename $0`
117 USAGE="$ME: [-xvUK] [-e ENV=VAL] [-c CONF=VAL] [-s base-URL] [-V x.y.z]\\
118 [-C pfile] [-T make-tgt]"
119 VERBOSE=
120 DEBUG=
121 UNPACK=
122 CRON=
123 CONFS=
124 PFILE="@UPDATEDCC_PFILE@"
125 MAKE_TGT=install
126 while getopts "xvUKe:c:s:V:p:C:T:" c; do
127 case $c in
128 x) set -x; DEBUG=-x VERBOSE=yes;;
129 v) VERBOSE=yes;;
130 U) UNPACK=yes;;
131 K) CRON=yes;;
132 e) # quote any odd characters
133 SETTING=`echo "$OPTARG" | sed -e 's/\([^-_/:=+,.a-zA-Z0-9]\)/\\\\\1/g'`
134 eval "$SETTING"
135 export `expr "$OPTARG" : '\([^=]*\).*' || true`
136 ENV_SET="$ENV_SET $SETTING"
137 ;;
138 c) CONFS="$CONFS $OPTARG";;
139 s) BURLS="$BURLS $OPTARG";;
140 V) VERSION=`expr "X$OPTARG" : 'X\([1-9]\.[1-9][0-9]*\.[1-9][0-9]*\)'`
141 if test "$VERSION" != "$OPTARG"; then
142 echo "invalid -V $OPTARG" 1>&2; exit 1;
143 fi
144 ;;
145 C) PFILE="$OPTARG";;
146 T) MAKE_TGT="$OPTARG";;
147 p) echo "All 3 DCC tarballs are now the same";;
148 *) echo "$USAGE" 1>&2; exit 1;;
149 esac
150 done
151 shift `expr $OPTIND - 1 || true`
152 if test "$#" -ne 0; then
153 echo "$USAGE" 1>&2; exit 1
154 fi
155
156 if test -z "$VERBOSE"; then
157 WGETQUIET='-nv'
158 CURLQUIET=
159 CONFQUIET='--quiet'
160 MQUIET=
161 else
162 WGETQUIET=
163 CURLQUIET=
164 CONFQUIET=
165 MQUIET='#'
166 fi
167
168 # assume cron mode if stdin is not a tty
169 if test -z "$CRON" && test -n "`tty 2>&1 | grep 'not a tty'`"; then
170 echo "assume -K because stdin is not a tty"
171 CRON=assumed
172 fi
173 exec </dev/null
174 if test -n "$CRON"; then
175 # be quite in cron mode unless told otherwise
176 if test -z "$VERBOSE" -a "$CRON" != assumed; then
177 WGETQUIET='-q'
178 CURLQUIET='-s'
179 exec >/dev/null
180 fi
181 exec 3>&1 # preserve stdout in case cron mode does work
182
183 if test -n "$UNPACK"; then
184 echo "-u (unpack only) and -K (cron mode) are incompatible" 1>&2
185 exit 1
186 fi
187 if test -n "$VERSION"; then
188 echo "-V$VERSION and -K (cron mode) are incompatible" 1>&2
189 exit 1
190 fi
191 # Do nothing if we have run recently.
192 # Pick a somewhat random number of days to reduce the crowds that
193 # otherwise happen on anniversaries of releases.
194 DAYS=`ps | cksum | sed -e 's/ /9/g' -e 's/[^0-9]*\([0-9]\{1,6\}\).*/\1/'`
195 DAYS=`expr '(' $DAYS % 3 ')' + 6`
196 if test -d $DCCDIR \
197 && test -n "`find $OK_MARK -mtime -$DAYS 2>/dev/null`"; then
198 echo "less than $DAYS days since the last updatedcc -K; stop"
199 exit 0
200 fi
201 fi
202
203
204 # see if we have permission
205 set -e
206 if test ! -d $BDIR; then
207 rm -f $BDIR || true
208 mkdir $BDIR
209 fi
210 cd $BDIR
211 if test ! -d $DCCDIR; then
212 rm -f $DCCDIR || true
213 mkdir $DCCDIR
214 fi
215 set +e
216 for NM in "$DCC_HOMEDIR" "$DCC_LIBEXEC"; do
217 if test -n "$NM" -a ! -w "$NM"; then
218 echo "cannot write $NM; must $ME be run as root?" 1>&2
219 exit 1
220 fi
221 done
222 find $DCCDIR -type d | while read SUBDIR; do
223 if test ! -w $SUBDIR; then
224 echo "cannot write $SUBDIR; must $ME be run as root?" 1>&2
225 # but maybe this is ok
226 break
227 fi
228 done
229
230 if test -z "$PFILE"; then
231 if test -n "@UPDATEDCC_PFILE@"; then
232 CONFS="--without-updatedcc-pfile $CONFS"
233 fi
234 # quietly use $DCC_HOMEDIR/.updatedcc_pfile if it exists
235 if test -s "$DCC_HOMEDIR/.updatedcc_pfile"; then
236 PFILE="$DCC_HOMEDIR/.updatedcc_pfile"
237 fi
238 else
239 PFILE=`echo $PFILE | sed "s@^[^/]@$DCC_HOMEDIR/&@"`
240 # add it to the configuration if it is not the default
241 if test "$PFILE" != "$DCC_HOMEDIR/.updatedcc_pfile"; then
242 CONFS="--with-updatedcc-pfile=$PFILE $CONFS"
243 fi
244 fi
245 if test -f "$PFILE" -a ! -r "$PFILE"; then
246 echo "cannot read $PFILE; must $ME be run as root?" 1>&2
247 fi
248 if test -n "$PFILE"; then
249 . $PFILE
250 fi
251
252 if test -z "$BURLS"; then
253 # $SERVER is set from $DCC_HOMEDIR/.updatedcc_pfile
254 if test -n "$SERVER"; then
255 BURLS="$SERVER"
256 else
257 BURLS="http://www.dcc-servers.net/dcc/source http://www.rhyolite.com/dcc/source ftp://ftp.dcc-servers.net/src/dcc ftp://ftp.rhyolite.com/src/dcc"
258 fi
259 fi
260
261 if test -z "$VERSION"; then
262 DLTBALL="dcc.tar.Z"
263 TBALL=
264 TBALL_PATH="$DLTBALL"
265 else
266 DLTBALL="dcc-$VERSION.tar.Z"
267 TBALL="$DLTBALL"
268 TBALL_PATH="old/$DLTBALL"
269 fi
270 # don't blab the password needlessly
271 print_url () {
272 PURL=`echo "$2" | sed -e 's%^\([fhtp]*://\)[^/@:]\{1,\}:[^/@:]\{1,\}@%\1%'`
273 echo "using $1 to get $PURL"
274 }
275
276
277 TRAPS="0 1 2 15"
278 stop_dccd () {
279 if test "$DCC_UPDATEDCC_FAST" = yes; then
280 return
281 fi
282 DCC_UPDATEDCC_FAST= export DCC_UPDATEDCC_FAST
283
284 # trapped signals on some systems must start by turning themselves off,
285 # especially #0
286 trap "trap $TRAPS; echo 'stopping update; please wait'; $DCC_RESTART" $TRAPS
287
288 # start stopping dccd now in the hope that it will have released the
289 # sockets and database files by the time we need to restart it.
290 $DCC_LIBEXEC/stop-dccd $DEBUG
291 # switch to a working server
292 @bindir@/cdcc -q rtt >/dev/null 2>&1 || true
293 }
294
295 if test -n "$UNPACK"; then
296 DCC_RESTART=
297 else
298 DCC_RESTART="$DCC_LIBEXEC/rcDCC $DEBUG start"
299 if test -z "$CRON"; then
300 # let compiling be slow instead of stopping the server in cron mode
301 stop_dccd
302 fi
303 fi
304
305
306 # use fetch, wget, curl, or ftp that understands URLs
307 # notice '-c --with-fetch_cmd=X'
308 PGM=`echo "X $confs" | sed -n -e 's/.*--with-fetch[-_]cmd=\([^ ]*\)/\1/p'`
309 if test -z "$PGM"; then
310 PGM=@FETCH_CMD@
311 fi
312 PGM_B=`basename $PGM`
313 SUCCESS=
314 oldTZ=$TZ; TZ=UTC; export TZ # Solaris FTP is confused by dates
315 if test "$PGM_B" = wget; then
316 for BURL in $BURLS; do
317 URL="$BURL/$TBALL_PATH"
318 print_url "$PGM_B" "$URL"
319 # Do not use --mirror because -r results in a 0 exit status
320 # even on failure.
321 # Do not use --no-remove-listing, -nr, or --dont-remove-listing
322 # because none of them are supported by all versions of wget.
323 # At least some versions of wget exit with 0 after having done
324 # nothing but emitting a usage message.
325 if $PGM $WGETQUIET -nd --no-host-directories -N \
326 --retr-symlinks --passive-ftp @FETCH_WGET_OPTS@ "$URL"; then
327 if test -s $DLTBALL; then
328 # notice if we get an HTTP error document with or without
329 # HTTP headers
330 if test -z "`sed -n -e 2q \
331 -e 's/.*DOCTYPE.*/HTML/p' \
332 -e 's/<HEAD>/HTML/p' -e 's/<head>/HTML/p' \
333 $DLTBALL`"; then
334 SUCCESS="yes"
335 break
336 fi
337 # do not leave a broken file
338 rm -f $DLTBALL
339 fi
340 fi
341 echo
342 done
343 PGM_B=
344 fi
345
346 if test "$PGM_B" = fetch; then
347 for BURL in $BURLS; do
348 URL="$BURL/$TBALL_PATH"
349 print_url "$PGM_B" "$URL"
350 if $PGM -p -q -m "$URL"; then
351 if test -s $DLTBALL; then
352 SUCCESS="yes"
353 break
354 fi
355 fi
356 echo
357 done
358 PGM_B=
359 fi
360
361 if test "$PGM_B" = curl; then
362 for BURL in $BURLS; do
363 URL="$BURL/$TBALL_PATH"
364 print_url "$PGM_B" "$URL"
365 if $PGM @FETCH_CURL_OPTS@ -R --connect-timeout 30 --max-time 600 \
366 $CURLQUIET "$URL" -o $DLTBALL; then
367 # --fail does not work on at least some versions of curl
368 if test -s $DLTBALL; then
369 # notice if we get an HTTP error document with or without
370 # HTTP headers
371 if test -z "`sed -n -e 2q \
372 -e 's/.*DOCTYPE.*/HTML/p' \
373 -e 's/<HEAD>/HTML/p' -e 's/<head>/HTML/p' \
374 $DLTBALL`"; then
375 SUCCESS="yes"
376 break
377 fi
378 # do not leave a broken file
379 rm -f $DLTBALL
380 fi
381 fi
382 echo
383 done
384 PGM_B=
385 fi
386
387 # try FTP if it is the right choice or the right choice has not worked
388 if test "$PGM_B" = ftp -o ! -s $DLTBALL; then
389 if test "$PGM_B" != ftp ; then
390 PGM_B=ftp
391 PGM=ftp
392 fi
393 for BURL in $BURLS; do
394 URL="$BURL/$TBALL_PATH"
395 print_url "$PGM_B" "$URL"
396 if $PGM -p "$URL"; then
397 if test -s $DLTBALL; then
398 SUCCESS="yes"
399 break
400 fi
401 fi
402 echo
403 done
404 # if that did not work, try ancient anonymous FTP
405 if test ! -s $DLTBALL; then
406 for URL in $BURLS; do
407 HOST=`expr "$URL" : "ftp://\([^/]*\)/"`
408 SRC=`expr "$URL" : "ftp://[^/]*/\(.*\)"`
409 if test -z "$HOST" -o -z "$SRC"; then
410 continue
411 fi
412 USR=`expr "$HOST" : "\([^/:]*\):"`
413 if test -z "$USR"; then
414 USR=anonymous
415 PASSWD=`hostname`
416 else
417 PASSWD=`expr "$HOST" : "$USR:\(.*\)@.*"`
418 HOST=`expr "$HOST" : ".*@\(.*\)"`
419 fi
420 echo "try old anonymous FTP with $HOST and $SRC"
421 (echo "user $USR $PASSWD "; \
422 echo "binary"; \
423 echo "get $SRC/$DLTBALL $DLTBALL") \
424 | ftp -n $HOST
425 if test -s $DLTBALL; then
426 SUCCESS="yes"
427 break
428 fi
429 # some versions of ftp like to leave empty files
430 rm -f $DLTBALL
431 done
432 fi
433 PGM_B=
434 fi
435
436 if test -n "$PGM_B"; then
437 echo "unrecognized fetch program $PGM_B" 1>&2; exit 1
438 fi
439 if test -z "$oldTZ"; then
440 unset TZ
441 else
442 TZ=$oldTZ
443 fi
444 if test -z "$SUCCESS" -o ! -s $DLTBALL; then
445 echo
446 echo "failed to fetch a new copy of $DLTBALL" 1>&2
447 if test -n "$PFILE"; then
448 echo "is $PFILE correct?" 1>&2
449 fi
450 # try to install an existing tar ball if not in cron mode
451 if test -n "$CRON"; then
452 exit 1
453 fi
454 echo
455 fi
456 set -e
457
458 # pick the newest tarball, possibly one fetched manually and already present
459 # instead of the official tarball fetched by this script.
460 if test -z "$TBALL"; then
461 TBALL=`ls -Lt dcc*.tar.Z | head -1`
462 fi
463 if test ! -s "$TBALL"; then
464 echo "failed to fetch tarball; nothing to install" 1>&2
465 exit 1
466 fi
467
468 NEW_DCC=`zcat "$TBALL" | tar -tf - \
469 | sed -n -e '2q' -e 's@\(dcc-[0-9.]*\)/.*@\1@p'`
470 if test -z "$NEW_DCC"; then
471 echo "failed to find version in $TBALL" 1>&2
472 exit 1
473 fi
474
475 # finished if we should only install new versions
476 if test -n "$CRON"; then
477 exec 1>&3 # restore stdout
478 if test "$NEW_DCC" = "dcc-$RELEASE" \
479 && test -z "`find $TBALL -follow -newer $DCCDIR`"; then
480 echo "new $TBALL is the same version $RELEASE; stop"
481 touch $OK_MARK
482 exit 0
483 fi
484 stop_dccd
485 fi
486
487 # Move the unpacked tarball into the build directory named dcc
488 # while preserving any foreign files.
489 # Empty the target build directory of old DCC source and generated files.
490 MNM=.manifest
491 if test -d dcc; then
492 if test ! -f dcc/$MNM; then
493 if test `find dcc -type f -print | wc -l` -gt 50; then
494 # deal with old versions without .manifest files
495 echo delete $DCCDIR
496 rm -rf dcc
497 fi
498 else
499 cd dcc
500 set +e
501 @DCCMAKE@ purge >/dev/null 2>&1
502 cd $BDIR
503 rmdir dcc 2>/dev/null
504 set -e
505 if test -d dcc; then
506 find dcc -type f -print \
507 | sed -e '1s/./preserving &/' -e '2,$s/./ &/'
508 cd $BDIR
509 fi
510 fi
511 fi
512
513 echo "unpack $TBALL into $DCCDIR"
514 rm -rf $NEW_DCC
515 zcat $TBALL | tar -xf - 2>&1 | head
516
517 if test -n "$UNPACK"; then
518 echo "will configure but *NOT* build or install $NEW_DCC"
519 else
520 echo "will configure, build, and install $NEW_DCC"
521 fi
522 if test ! -d dcc; then
523 rm -rf dcc
524 mv $NEW_DCC dcc
525 else
526 # install top directories for preserved files first
527 find $NEW_DCC -name $MNM -print | sort | while read NM; do
528 DIR=`expr $NM : "$NEW_DCC/\(.*\)/$MNM" || true`
529 if test -z "$DIR"; then
530 DIR=.
531 fi
532 if test ! -d $NEW_DCC/$DIR; then
533 # we already moved this directory
534 continue
535 fi
536 # if we can, move the entire directory from the directory in the
537 # unpacked tarball to the corresponding build directory
538 if test ! -d $DCCDIR/$DIR; then
539 # first remove a possible stray file with the target name
540 rm -f $DCCDIR/$DIR || true
541 mv $NEW_DCC/$DIR $DCCDIR/$DIR
542 continue
543 fi
544 # otherwise move individual files from the unpacked tarball directory
545 cd $NEW_DCC/$DIR
546 mv `cat $MNM` $DCCDIR/$DIR
547 cd $BDIR
548 done
549 rm -rf $NEW_DCC
550 fi
551
552 cd $DCCDIR
553
554 # turn off FreeBSD blather about object directories
555 if test -z "$MAKEOBJDIRPREFIX"; then
556 MAKEOBJDIRPREFIX=; export MAKEOBJDIRPREFIX
557 fi
558
559 if test -n "$ENV_SET"; then
560 echo "+ $ENV_SET"
561 fi
562 echo "+ ./configure @UPDATEDCC_PARMS@ $CONFQUIET $CONFS"
563 ./configure @UPDATEDCC_PARMS@ $CONFQUIET $CONFS
564
565 if test -n "$UNPACK"; then
566 exit
567 fi
568 trap "trap $TRAPS; echo 'stopping; please wait'; \
569 $DCC_RESTART; @DCCMAKE@ purge >/dev/null 2>&1" $TRAPS
570
571 @DCCMAKE@ $MAKE_TGT \
572 | sed -e "$MQUIET/^[a-z0-9_]*.c: In function .*/d" \
573 -e "$MQUIET/ warning: .%.. yields only last 2 digits of year/d" \
574 -e "$MQUIET/^make.*is up to date/d" \
575 -e "$MQUIET/^make.*Nothing to be done for/d" \
576 -e "$MQUIET/^[a-z\/]*cc/s/-W[-a-z]*//g" \
577 -e "$MQUIET/^[a-z\/]*cc/s@-m[0-9a-z=]*@@g" \
578 -e "$MQUIET/^[a-z\/]*cc/s@-D_FILE_OFFSET_BITS=64@@g" \
579 -e "$MQUIET/^[a-z\/]*cc/s@-D_LARGEFILE_SOURCE@@g" \
580 -e "$MQUIET/^[a-z\/]*cc/s@-D_REENTRANT@@g" \
581 -e "$MQUIET/^[a-z\/]*cc/s@-I[-a-zA-Z0-9/.]*@@g" \
582 -e "$MQUIET/^[a-z\/]*cc/s@-I[-a-zA-Z0-9/.]*@@g" \
583 -e "$MQUIET/^[a-z\/]*cc/s@-fno-strict-aliasing@@g" \
584 -e "$MQUIET/^[a-z\/]*cc/s@-pipe@@g" \
585 -e "$MQUIET/^building static .* library/d" \
586 -e "$MQUIET/^ranlib/d" \
587 -e "$MQUIET/^rm -f \.depend/d" \
588 -e "$MQUIET/^mkdep/d" \
589 -e "$MQUIET/^echo .* >> \.depend/d" \
590 -e "$MQUIET/^g*cc/s@[ ]\{1,\}@ @g"
591
592 touch $OK_MARK
593
594 # finally start the new version and switch back to the local server
595 trap $TRAPS
596 $DCC_RESTART
597 @bindir@/cdcc -q rtt >/dev/null 2>&1