mkCTM revision 19835
190792Sgshapiro#!/usr/local/bin/tclsh7.4 2261363Sgshapiro 390792Sgshapiro############################################################################# 490792Sgshapiro### Do we already have this delta ? 590792Sgshapiro############################################################################# 690792Sgshapiro 790792Sgshapiroproc find_delta {nbr} { 890792Sgshapiro global CTMname CTMdest 9266692Sgshapiro if {[file exists [format "%s/$CTMname.%04d" $CTMdest $nbr]]} { return 1 } 1090792Sgshapiro if {[file exists [format "%s/$CTMname.%04d.gz" $CTMdest $nbr]]} { return 1 } 1190792Sgshapiro return 0 1290792Sgshapiro} 1390792Sgshapiro 1490792Sgshapiro############################################################################# 1590792Sgshapiro### The top level code... 1690792Sgshapiro############################################################################# 1790792Sgshapiro 1890792Sgshapiroset CTMSW /home/ctm/SW 1990792Sgshapiro 2090792Sgshapirocd $CTMSW 2190792Sgshapiro 2290792Sgshapiro# Defaults... 2390792Sgshapiroset CTMapply 1 2490792Sgshapiroset CTMignore {^///} 2590792Sgshapiroset CTMbogus {\.core$} 2690792Sgshapiroset CTMmail {} 2790792Sgshapiroset CTMqueue {} 2890792Sgshapiroset CTMqueuemail {} 2990792Sgshapiroset CTMmaxctm 10000000 3090792Sgshapiroset CTMmaxmsg 100000 31132943Sgshapiroset CTMsuff {} 3290792Sgshapiroset CTMdate [exec date -u +%Y%m%d%H%M%SZ] 3390792Sgshapiroset CTMtmp {} 34132943Sgshapiroset CTMcopy {} 3590792Sgshapiroset CTMdest {} 3690792Sgshapiroset CTMprefix . 3790792Sgshapiroset CTMtest 0 3890792Sgshapiroset CTMspecial 0 39132943Sgshapiroset CTMscan . 40132943Sgshapiroset CTMfirst 0 41132943Sgshapiroset max_damage 100 4290792Sgshapiro 4390792Sgshapiroset damage 0 4490792Sgshapiroset changes 0 4590792Sgshapiro 4690792Sgshapirosource $argv 47132943Sgshapiroexec sh -c "date -u '+%y%m%d%H%M%S $argv'" >> ${CTMSW}/log 4890792Sgshapiro 4990792Sgshapiroif {$CTMtmp == ""} { 50132943Sgshapiro set CTMtmp $CTMSW/../tmp/${CTMname}_${CTMsuff} 5190792Sgshapiro} 5290792Sgshapiroif {$CTMcopy == ""} { 5390792Sgshapiro set CTMcopy $CTMSW/../$CTMname 5490792Sgshapiro} 5590792Sgshapiroif {$CTMdest == ""} { 5690792Sgshapiro set CTMdest $CTMSW/../CTM-pub/$CTMname 5790792Sgshapiro} 5890792Sgshapiro 5990792Sgshapiro# Make sure we only run one at a time... 6090792Sgshapiro 6190792Sgshapiroset CTMlock Lck.${CTMname}.${CTMdate}.[pid] 6290792Sgshapiroexec rm -f ${CTMlock} 6390792Sgshapiroexec echo starting > ${CTMlock} 6490792Sgshapiroif {[catch "exec ln $CTMlock LCK.$CTMname" a]} { 6590792Sgshapiro puts "Not going, lock exists..." 6690792Sgshapiro exec rm -f $CTMlock 6790792Sgshapiro exit 1 6890792Sgshapiro} 6990792Sgshapiroexec rm -f $CTMlock 7090792Sgshapiroset CTMlock LCK.$CTMname 7190792Sgshapiro 7290792Sgshapiroset CTMscratch ${CTMtmp}.tmp 7390792Sgshapiro 7490792Sgshapirowhile 1 { 7590792Sgshapiro if { ! $CTMspecial} { 7690792Sgshapiro if {$CTMfirst} { 7790792Sgshapiro set CTMnbr 0 7890792Sgshapiro } else { 7990792Sgshapiro set CTMnbr [lindex [exec cat $CTMcopy/.ctm_status] 1] 8090792Sgshapiro } 8190792Sgshapiro 8290792Sgshapiro if {$CTMnbr > 0 && ![find_delta $CTMnbr]} { 8390792Sgshapiro puts "$CTMname delta $CTMnbr doesn't exist..." 8490792Sgshapiro exec rm -f $CTMlock 8590792Sgshapiro exit 1 8690792Sgshapiro } 8790792Sgshapiro 8890792Sgshapiro incr CTMnbr 8990792Sgshapiro 9090792Sgshapiro if {[find_delta $CTMnbr]} { 9190792Sgshapiro puts "$CTMname delta $CTMnbr does already exist..." 9290792Sgshapiro exec rm -f $CTMlock 9390792Sgshapiro exit 1 9490792Sgshapiro } 9590792Sgshapiro 9690792Sgshapiro set fo [open $CTMref/.ctm_status w] 9790792Sgshapiro puts $fo "$CTMname $CTMnbr" 9890792Sgshapiro close $fo 9990792Sgshapiro incr changes -1 10090792Sgshapiro 10190792Sgshapiro } else { 10290792Sgshapiro set CTMnbr [lindex [exec cat $CTMref/.ctm_status] 1] 10390792Sgshapiro } 10490792Sgshapiro 10590792Sgshapiro puts "Doing CTMname $CTMname CTMnbr $CTMnbr$CTMsuff CTMdate $CTMdate" 10690792Sgshapiro flush stdout 10790792Sgshapiro exec sh -c "rm -f ${CTMtmp}.* ${CTMtmp}:*" >&@ stdout 10890792Sgshapiro 10990792Sgshapiro set nm [format "%s.%04d%s" $CTMname $CTMnbr $CTMsuff] 11090792Sgshapiro 11190792Sgshapiro set x1 $CTMcopy 11290792Sgshapiro if {$x1 == ""} { 11390792Sgshapiro exec mkdir ${CTMtmp}.dir 11490792Sgshapiro set x1 ${CTMtmp}.dir 11590792Sgshapiro } 11690792Sgshapiro 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] 11790792Sgshapiro 11890792Sgshapiro if {$r1} { 11990792Sgshapiro if {[lindex $errorCode 2] == 4} { 12090792Sgshapiro puts "No changes, stopping." 12190792Sgshapiro exec rm -f $CTMlock 12290792Sgshapiro exit 0 123132943Sgshapiro } 12490792Sgshapiro puts "problems, stopping now." 12590792Sgshapiro puts "errorCode $errorCode" 126132943Sgshapiro puts "$r2" 12790792Sgshapiro exec rm -f $CTMlock 12890792Sgshapiro exit 1 12990792Sgshapiro } 13090792Sgshapiro 13190792Sgshapiro puts "mkctm done" 13290792Sgshapiro 13390792Sgshapiro if {$CTMtest} { 13490792Sgshapiro puts "testing, stopping now." 13590792Sgshapiro exec rm -f $CTMlock 136 exit 0 137 } 138 if {$CTMapply} { 139 puts "Applying delta" 140 flush stdout 141 exec echo now applying > $CTMlock 142 exec sh -e -c "cd $CTMcopy ; $CTMSW/ctm -v -v -v ${CTMtmp}:${nm}.gz" >& ${CTMtmp}.apply 143 exec echo did apply > $CTMlock 144 } 145 puts "Moving delta" 146 flush stdout 147 exec mv ${CTMtmp}:${nm}.gz $CTMdest/.CTMtmp_${nm}.gz >&@ stdout 148 exec mv $CTMdest/.CTMtmp_${nm}.gz $CTMdest/${nm}.gz >&@ stdout 149 exec echo moved > $CTMlock 150 151 exec sh -c "rm -rf ${CTMtmp}.*" >&@ stdout 152 153 if {$CTMmail != ""} { 154 puts "Mailing delta" 155 flush stdout 156 exec $CTMSW/ctm_smail -m $CTMmaxmsg -c $CTMmaxctm $CTMdest/${nm}.gz $CTMmail >&@ stdout 157 if {$CTMqueue != "" && $CTMqueuemail != ""} { 158 puts "Queueing delta" 159 flush stdout 160 exec $CTMSW/ctm_smail -m $CTMmaxmsg -c $CTMmaxctm -q $CTMqueue $CTMdest/${nm}.gz $CTMqueuemail >&@ stdout 161 puts "Sending initial two deltas" 162 flush stdout 163 exec $CTMSW/ctm_dequeue -n 2 $CTMqueue >&@ stdout 164 } 165 } 166 exec echo mailed > $CTMlock 167 168 # If we did an absolute delta: stop. 169 if {$CTMsuff != ""} break 170 171 # Make a absolute delta (!) every 100 deltas 172 if {$CTMnbr == 0 || ($CTMnbr % 100)} break 173 174 # Make an absolute delta too... 175 set CTMref $CTMcopy 176 set CTMsuff A 177 set CTMcopy "" 178 set CTMmail "" 179 set CTMqueue "" 180 set CTMqueuemail "" 181 set CTMapply 0 182 set CTMspecial 1 183 exec rm -f $CTMlock 184} 185puts "done." 186exec rm -f $CTMlock 187