]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - usr.sbin/ctm/mkCTM/mkCTM
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / usr.sbin / ctm / mkCTM / mkCTM
1 #!/usr/local/bin/tclsh7.4
2 #
3 # $FreeBSD$
4
5 #############################################################################
6 ### Do we already have this delta ?
7 #############################################################################
8
9 proc 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
20 set CTMSW       /home/ctm/SW
21
22 cd $CTMSW
23
24 # Defaults...
25 set CTMapply 1
26 set CTMignore {^///}
27 set CTMbogus {\.core$}
28 set CTMmail {}
29 set CTMqueue {}
30 set CTMqueuemail {}
31 set CTMmaxctm 10000000
32 set CTMmaxmsg 100000
33 set CTMsuff {}
34 set CTMdate     [exec date -u +%Y%m%d%H%M%SZ]
35 set CTMtmp  {}
36 set CTMcopy  {}
37 set CTMdest  {}
38 set CTMprefix  .
39 set CTMtest 0
40 set CTMspecial 0
41 set CTMscan .
42 set CTMfirst 0
43 set max_damage 100
44
45 set damage 0
46 set changes 0
47
48 source $argv
49 exec sh -c "date -u '+%Y%m%d%H%M%S $argv'" >> ${CTMSW}/log
50
51 if {$CTMtmp == ""} {
52     set CTMtmp $CTMSW/../tmp/${CTMname}_${CTMsuff}
53 }
54 if {$CTMcopy == ""} {
55     set CTMcopy $CTMSW/../$CTMname
56 }
57 if {$CTMdest == ""} {
58     set CTMdest $CTMSW/../CTM-pub/$CTMname
59 }
60
61 # Make sure we only run one at a time...
62
63 set CTMlock Lck.${CTMname}.${CTMdate}.[pid]
64 exec rm -f ${CTMlock}
65 exec echo starting > ${CTMlock}
66 if {[catch "exec ln $CTMlock LCK.$CTMname" a]} {
67         puts "Not going, lock exists..."
68         exec rm -f $CTMlock
69         exit 1
70 }
71 exec rm -f $CTMlock
72 set CTMlock LCK.$CTMname
73
74 set CTMscratch ${CTMtmp}.tmp
75
76 while 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 }
187 puts "done."
188 exec rm -f $CTMlock