115702Sphk#!/usr/local/bin/tclsh7.4 2108533Sschweikh# 3108533Sschweikh# $FreeBSD$ 42886Sphk 56563Sphk############################################################################# 66563Sphk### Do we already have this delta ? 76563Sphk############################################################################# 86563Sphk 96563Sphkproc find_delta {nbr} { 106563Sphk global CTMname CTMdest 116563Sphk if {[file exists [format "%s/$CTMname.%04d" $CTMdest $nbr]]} { return 1 } 126563Sphk if {[file exists [format "%s/$CTMname.%04d.gz" $CTMdest $nbr]]} { return 1 } 136563Sphk return 0 146563Sphk} 156563Sphk 166563Sphk############################################################################# 176563Sphk### The top level code... 186563Sphk############################################################################# 196563Sphk 206563Sphkset CTMSW /home/ctm/SW 216563Sphk 226563Sphkcd $CTMSW 236563Sphk 246563Sphk# Defaults... 256563Sphkset CTMapply 1 2619813Sphkset CTMignore {^///} 2719813Sphkset CTMbogus {\.core$} 286563Sphkset CTMmail {} 2918110Speterset CTMqueue {} 3018110Speterset CTMqueuemail {} 3118110Speterset CTMmaxctm 10000000 3218110Speterset CTMmaxmsg 100000 336563Sphkset CTMsuff {} 346563Sphkset CTMdate [exec date -u +%Y%m%d%H%M%SZ] 356563Sphkset CTMtmp {} 366563Sphkset CTMcopy {} 376563Sphkset CTMdest {} 386563Sphkset CTMprefix . 396563Sphkset CTMtest 0 406777Sphkset CTMspecial 0 417463Sphkset CTMscan . 427463Sphkset CTMfirst 0 4319813Sphkset max_damage 100 446563Sphk 456563Sphkset damage 0 466563Sphkset changes 0 476563Sphk 486563Sphksource $argv 4942832Sdannyexec sh -c "date -u '+%Y%m%d%H%M%S $argv'" >> ${CTMSW}/log 506563Sphk 516563Sphkif {$CTMtmp == ""} { 526563Sphk set CTMtmp $CTMSW/../tmp/${CTMname}_${CTMsuff} 536563Sphk} 546563Sphkif {$CTMcopy == ""} { 556563Sphk set CTMcopy $CTMSW/../$CTMname 566563Sphk} 576563Sphkif {$CTMdest == ""} { 586563Sphk set CTMdest $CTMSW/../CTM-pub/$CTMname 596563Sphk} 606563Sphk 616788Sphk# Make sure we only run one at a time... 626788Sphk 6315702Sphkset CTMlock Lck.${CTMname}.${CTMdate}.[pid] 646788Sphkexec rm -f ${CTMlock} 656788Sphkexec echo starting > ${CTMlock} 667463Sphkif {[catch "exec ln $CTMlock LCK.$CTMname" a]} { 676788Sphk puts "Not going, lock exists..." 686788Sphk exec rm -f $CTMlock 6919813Sphk exit 1 706788Sphk} 716788Sphkexec rm -f $CTMlock 726788Sphkset CTMlock LCK.$CTMname 736788Sphk 746563Sphkset CTMscratch ${CTMtmp}.tmp 756563Sphk 762886Sphkwhile 1 { 776777Sphk if { ! $CTMspecial} { 787463Sphk if {$CTMfirst} { 797463Sphk set CTMnbr 0 807463Sphk } else { 817463Sphk set CTMnbr [lindex [exec cat $CTMcopy/.ctm_status] 1] 827463Sphk } 832886Sphk 847463Sphk if {$CTMnbr > 0 && ![find_delta $CTMnbr]} { 856563Sphk puts "$CTMname delta $CTMnbr doesn't exist..." 866788Sphk exec rm -f $CTMlock 8719813Sphk exit 1 886563Sphk } 892886Sphk 906563Sphk incr CTMnbr 912886Sphk 926563Sphk if {[find_delta $CTMnbr]} { 936563Sphk puts "$CTMname delta $CTMnbr does already exist..." 946788Sphk exec rm -f $CTMlock 9519813Sphk exit 1 966563Sphk } 972886Sphk 986563Sphk set fo [open $CTMref/.ctm_status w] 996563Sphk puts $fo "$CTMname $CTMnbr" 1006563Sphk close $fo 1016563Sphk incr changes -1 1023833Sphk 1036563Sphk } else { 1046563Sphk set CTMnbr [lindex [exec cat $CTMref/.ctm_status] 1] 1056777Sphk } 1066777Sphk 1076777Sphk puts "Doing CTMname $CTMname CTMnbr $CTMnbr$CTMsuff CTMdate $CTMdate" 1086563Sphk flush stdout 1096563Sphk exec sh -c "rm -f ${CTMtmp}.* ${CTMtmp}:*" >&@ stdout 1102886Sphk 11119813Sphk set nm [format "%s.%04d%s" $CTMname $CTMnbr $CTMsuff] 1122886Sphk 11319813Sphk set x1 $CTMcopy 11419813Sphk if {$x1 == ""} { 11519813Sphk exec mkdir ${CTMtmp}.dir 11619813Sphk set x1 ${CTMtmp}.dir 1175014Sphk } 11819892Sphk set r1 [catch "exec ${CTMSW}/mkctm -I ${CTMignore} -B ${CTMbogus} -l ${CTMtmp}.log -D $max_damage $CTMname $CTMnbr $CTMdate . $x1 $CTMref | md5 -p | gzip -9 > ${CTMtmp}:${nm}.gz 2>@ stderr" r2] 1195014Sphk 12019813Sphk if {$r1} { 12119835Sphk if {[lindex $errorCode 2] == 4} { 12219835Sphk puts "No changes, stopping." 12319835Sphk exec rm -f $CTMlock 12419835Sphk exit 0 12519835Sphk } 12619813Sphk puts "problems, stopping now." 12719813Sphk puts "errorCode $errorCode" 12819813Sphk puts "$r2" 1296788Sphk exec rm -f $CTMlock 13019813Sphk exit 1 1316563Sphk } 13219813Sphk 13319813Sphk puts "mkctm done" 1342886Sphk 1356563Sphk if {$CTMtest} { 1366563Sphk puts "testing, stopping now." 1376788Sphk exec rm -f $CTMlock 1386563Sphk exit 0 1396563Sphk } 1406563Sphk if {$CTMapply} { 1416563Sphk puts "Applying delta" 1426563Sphk flush stdout 1436788Sphk exec echo now applying > $CTMlock 14419813Sphk exec sh -e -c "cd $CTMcopy ; $CTMSW/ctm -v -v -v ${CTMtmp}:${nm}.gz" >& ${CTMtmp}.apply 1456788Sphk exec echo did apply > $CTMlock 1466563Sphk } 1476563Sphk puts "Moving delta" 1486563Sphk flush stdout 1496563Sphk exec mv ${CTMtmp}:${nm}.gz $CTMdest/.CTMtmp_${nm}.gz >&@ stdout 1506563Sphk exec mv $CTMdest/.CTMtmp_${nm}.gz $CTMdest/${nm}.gz >&@ stdout 1516788Sphk exec echo moved > $CTMlock 1526563Sphk 15319813Sphk exec sh -c "rm -rf ${CTMtmp}.*" >&@ stdout 15419813Sphk 1556563Sphk if {$CTMmail != ""} { 1566563Sphk puts "Mailing delta" 1576563Sphk flush stdout 15818110Speter exec $CTMSW/ctm_smail -m $CTMmaxmsg -c $CTMmaxctm $CTMdest/${nm}.gz $CTMmail >&@ stdout 15918110Speter if {$CTMqueue != "" && $CTMqueuemail != ""} { 16018110Speter puts "Queueing delta" 16118110Speter flush stdout 16218110Speter exec $CTMSW/ctm_smail -m $CTMmaxmsg -c $CTMmaxctm -q $CTMqueue $CTMdest/${nm}.gz $CTMqueuemail >&@ stdout 16318115Speter puts "Sending initial two deltas" 16418115Speter flush stdout 16518115Speter exec $CTMSW/ctm_dequeue -n 2 $CTMqueue >&@ stdout 16618110Speter } 1676563Sphk } 1686788Sphk exec echo mailed > $CTMlock 1696563Sphk 1706563Sphk # If we did an absolute delta: stop. 1716563Sphk if {$CTMsuff != ""} break 1726563Sphk 173108533Sschweikh # Make an absolute delta (!) every 100 deltas 1747463Sphk if {$CTMnbr == 0 || ($CTMnbr % 100)} break 1756563Sphk 1766563Sphk # Make an absolute delta too... 1776563Sphk set CTMref $CTMcopy 1786563Sphk set CTMsuff A 1796563Sphk set CTMcopy "" 1806563Sphk set CTMmail "" 18118110Speter set CTMqueue "" 18218110Speter set CTMqueuemail "" 1836563Sphk set CTMapply 0 1846777Sphk set CTMspecial 1 1857463Sphk exec rm -f $CTMlock 1865014Sphk} 1876563Sphkputs "done." 1886788Sphkexec rm -f $CTMlock 189