mkCTM revision 19892
1#!/usr/local/bin/tclsh7.4 2 3############################################################################# 4### Do we already have this delta ? 5############################################################################# 6 7proc find_delta {nbr} { 8 global CTMname CTMdest 9 if {[file exists [format "%s/$CTMname.%04d" $CTMdest $nbr]]} { return 1 } 10 if {[file exists [format "%s/$CTMname.%04d.gz" $CTMdest $nbr]]} { return 1 } 11 return 0 12} 13 14############################################################################# 15### The top level code... 16############################################################################# 17 18set CTMSW /home/ctm/SW 19 20cd $CTMSW 21 22# Defaults... 23set CTMapply 1 24set CTMignore {^///} 25set CTMbogus {\.core$} 26set CTMmail {} 27set CTMqueue {} 28set CTMqueuemail {} 29set CTMmaxctm 10000000 30set CTMmaxmsg 100000 31set CTMsuff {} 32set CTMdate [exec date -u +%Y%m%d%H%M%SZ] 33set CTMtmp {} 34set CTMcopy {} 35set CTMdest {} 36set CTMprefix . 37set CTMtest 0 38set CTMspecial 0 39set CTMscan . 40set CTMfirst 0 41set max_damage 100 42 43set damage 0 44set changes 0 45 46source $argv 47exec sh -c "date -u '+%y%m%d%H%M%S $argv'" >> ${CTMSW}/log 48 49if {$CTMtmp == ""} { 50 set CTMtmp $CTMSW/../tmp/${CTMname}_${CTMsuff} 51} 52if {$CTMcopy == ""} { 53 set CTMcopy $CTMSW/../$CTMname 54} 55if {$CTMdest == ""} { 56 set CTMdest $CTMSW/../CTM-pub/$CTMname 57} 58 59# Make sure we only run one at a time... 60 61set CTMlock Lck.${CTMname}.${CTMdate}.[pid] 62exec rm -f ${CTMlock} 63exec echo starting > ${CTMlock} 64if {[catch "exec ln $CTMlock LCK.$CTMname" a]} { 65 puts "Not going, lock exists..." 66 exec rm -f $CTMlock 67 exit 1 68} 69exec rm -f $CTMlock 70set CTMlock LCK.$CTMname 71 72set CTMscratch ${CTMtmp}.tmp 73 74while 1 { 75 if { ! $CTMspecial} { 76 if {$CTMfirst} { 77 set CTMnbr 0 78 } else { 79 set CTMnbr [lindex [exec cat $CTMcopy/.ctm_status] 1] 80 } 81 82 if {$CTMnbr > 0 && ![find_delta $CTMnbr]} { 83 puts "$CTMname delta $CTMnbr doesn't exist..." 84 exec rm -f $CTMlock 85 exit 1 86 } 87 88 incr CTMnbr 89 90 if {[find_delta $CTMnbr]} { 91 puts "$CTMname delta $CTMnbr does already exist..." 92 exec rm -f $CTMlock 93 exit 1 94 } 95 96 set fo [open $CTMref/.ctm_status w] 97 puts $fo "$CTMname $CTMnbr" 98 close $fo 99 incr changes -1 100 101 } else { 102 set CTMnbr [lindex [exec cat $CTMref/.ctm_status] 1] 103 } 104 105 puts "Doing CTMname $CTMname CTMnbr $CTMnbr$CTMsuff CTMdate $CTMdate" 106 flush stdout 107 exec sh -c "rm -f ${CTMtmp}.* ${CTMtmp}:*" >&@ stdout 108 109 set nm [format "%s.%04d%s" $CTMname $CTMnbr $CTMsuff] 110 111 set x1 $CTMcopy 112 if {$x1 == ""} { 113 exec mkdir ${CTMtmp}.dir 114 set x1 ${CTMtmp}.dir 115 } 116 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] 117 118 if {$r1} { 119 if {[lindex $errorCode 2] == 4} { 120 puts "No changes, stopping." 121 exec rm -f $CTMlock 122 exit 0 123 } 124 puts "problems, stopping now." 125 puts "errorCode $errorCode" 126 puts "$r2" 127 exec rm -f $CTMlock 128 exit 1 129 } 130 131 puts "mkctm done" 132 133 if {$CTMtest} { 134 puts "testing, stopping now." 135 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