1#!/usr/local/bin/tclsh7.4 2# 3# $FreeBSD$ 4 5############################################################################# 6### Do we already have this delta ? 7############################################################################# 8 9proc find_delta {nbr} { 10 global CTMname CTMdest 11 if {[file exists [format "%s/$CTMname.%04d" $CTMdest $nbr]]} { return 1 } 12 if {[file exists [format "%s/$CTMname.%04d.gz" $CTMdest $nbr]]} { return 1 } 13 return 0 14} 15 16############################################################################# 17### The top level code... 18############################################################################# 19 20set CTMSW /home/ctm/SW 21 22cd $CTMSW 23 24# Defaults... 25set CTMapply 1 26set CTMignore {^///} 27set CTMbogus {\.core$} 28set CTMmail {} 29set CTMqueue {} 30set CTMqueuemail {} 31set CTMmaxctm 10000000 32set CTMmaxmsg 100000 33set CTMsuff {} 34set CTMdate [exec date -u +%Y%m%d%H%M%SZ] 35set CTMtmp {} 36set CTMcopy {} 37set CTMdest {} 38set CTMprefix . 39set CTMtest 0 40set CTMspecial 0 41set CTMscan . 42set CTMfirst 0 43set max_damage 100 44 45set damage 0 46set changes 0 47 48source $argv 49exec sh -c "date -u '+%Y%m%d%H%M%S $argv'" >> ${CTMSW}/log 50 51if {$CTMtmp == ""} { 52 set CTMtmp $CTMSW/../tmp/${CTMname}_${CTMsuff} 53} 54if {$CTMcopy == ""} { 55 set CTMcopy $CTMSW/../$CTMname 56} 57if {$CTMdest == ""} { 58 set CTMdest $CTMSW/../CTM-pub/$CTMname 59} 60 61# Make sure we only run one at a time... 62 63set CTMlock Lck.${CTMname}.${CTMdate}.[pid] 64exec rm -f ${CTMlock} 65exec echo starting > ${CTMlock} 66if {[catch "exec ln $CTMlock LCK.$CTMname" a]} { 67 puts "Not going, lock exists..." 68 exec rm -f $CTMlock 69 exit 1 70} 71exec rm -f $CTMlock 72set CTMlock LCK.$CTMname 73 74set CTMscratch ${CTMtmp}.tmp 75 76while 1 { 77 if { ! $CTMspecial} { 78 if {$CTMfirst} { 79 set CTMnbr 0 80 } else { 81 set CTMnbr [lindex [exec cat $CTMcopy/.ctm_status] 1] 82 } 83 84 if {$CTMnbr > 0 && ![find_delta $CTMnbr]} { 85 puts "$CTMname delta $CTMnbr doesn't exist..." 86 exec rm -f $CTMlock 87 exit 1 88 } 89 90 incr CTMnbr 91 92 if {[find_delta $CTMnbr]} { 93 puts "$CTMname delta $CTMnbr does already exist..." 94 exec rm -f $CTMlock 95 exit 1 96 } 97 98 set fo [open $CTMref/.ctm_status w] 99 puts $fo "$CTMname $CTMnbr" 100 close $fo 101 incr changes -1 102 103 } else { 104 set CTMnbr [lindex [exec cat $CTMref/.ctm_status] 1] 105 } 106 107 puts "Doing CTMname $CTMname CTMnbr $CTMnbr$CTMsuff CTMdate $CTMdate" 108 flush stdout 109 exec sh -c "rm -f ${CTMtmp}.* ${CTMtmp}:*" >&@ stdout 110 111 set nm [format "%s.%04d%s" $CTMname $CTMnbr $CTMsuff] 112 113 set x1 $CTMcopy 114 if {$x1 == ""} { 115 exec mkdir ${CTMtmp}.dir 116 set x1 ${CTMtmp}.dir 117 } 118 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] 119 120 if {$r1} { 121 if {[lindex $errorCode 2] == 4} { 122 puts "No changes, stopping." 123 exec rm -f $CTMlock 124 exit 0 125 } 126 puts "problems, stopping now." 127 puts "errorCode $errorCode" 128 puts "$r2" 129 exec rm -f $CTMlock 130 exit 1 131 } 132 133 puts "mkctm done" 134 135 if {$CTMtest} { 136 puts "testing, stopping now." 137 exec rm -f $CTMlock 138 exit 0 139 } 140 if {$CTMapply} { 141 puts "Applying delta" 142 flush stdout 143 exec echo now applying > $CTMlock 144 exec sh -e -c "cd $CTMcopy ; $CTMSW/ctm -v -v -v ${CTMtmp}:${nm}.gz" >& ${CTMtmp}.apply 145 exec echo did apply > $CTMlock 146 } 147 puts "Moving delta" 148 flush stdout 149 exec mv ${CTMtmp}:${nm}.gz $CTMdest/.CTMtmp_${nm}.gz >&@ stdout 150 exec mv $CTMdest/.CTMtmp_${nm}.gz $CTMdest/${nm}.gz >&@ stdout 151 exec echo moved > $CTMlock 152 153 exec sh -c "rm -rf ${CTMtmp}.*" >&@ stdout 154 155 if {$CTMmail != ""} { 156 puts "Mailing delta" 157 flush stdout 158 exec $CTMSW/ctm_smail -m $CTMmaxmsg -c $CTMmaxctm $CTMdest/${nm}.gz $CTMmail >&@ stdout 159 if {$CTMqueue != "" && $CTMqueuemail != ""} { 160 puts "Queueing delta" 161 flush stdout 162 exec $CTMSW/ctm_smail -m $CTMmaxmsg -c $CTMmaxctm -q $CTMqueue $CTMdest/${nm}.gz $CTMqueuemail >&@ stdout 163 puts "Sending initial two deltas" 164 flush stdout 165 exec $CTMSW/ctm_dequeue -n 2 $CTMqueue >&@ stdout 166 } 167 } 168 exec echo mailed > $CTMlock 169 170 # If we did an absolute delta: stop. 171 if {$CTMsuff != ""} break 172 173 # Make an absolute delta (!) every 100 deltas 174 if {$CTMnbr == 0 || ($CTMnbr % 100)} break 175 176 # Make an absolute delta too... 177 set CTMref $CTMcopy 178 set CTMsuff A 179 set CTMcopy "" 180 set CTMmail "" 181 set CTMqueue "" 182 set CTMqueuemail "" 183 set CTMapply 0 184 set CTMspecial 1 185 exec rm -f $CTMlock 186} 187puts "done." 188exec rm -f $CTMlock 189