]> git.decadent.org.uk Git - dak.git/blob - config/debian/cron.dinstall
generate incoming.d.o view
[dak.git] / config / debian / cron.dinstall
1 #!/bin/bash
2 # No way I try to deal with a crippled sh just for POSIX foo.
3
4 # Copyright (C) 2009-2012 Joerg Jaspert <joerg@debian.org>
5 #
6 # This program is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU General Public License as
8 # published by the Free Software Foundation; version 2.
9 #
10 # This program is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 # General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18
19 # Homer: Are you saying you're never going to eat any animal again? What
20 #        about bacon?
21 # Lisa: No.
22 # Homer: Ham?
23 # Lisa: No.
24 # Homer: Pork chops?
25 # Lisa: Dad, those all come from the same animal.
26 # Homer: Heh heh heh. Ooh, yeah, right, Lisa. A wonderful, magical animal.
27
28 # exit on errors
29 set -e
30 set -o pipefail
31 # make sure to only use defined variables
32 set -u
33 # ERR traps should be inherited from functions too. (And command
34 # substitutions and subshells and whatnot, but for us the functions is
35 # the important part here)
36 set -E
37
38 # import the general variable set.
39 export SCRIPTVARS=/srv/ftp-master.debian.org/dak/config/debian/vars
40 . $SCRIPTVARS
41
42 ########################################################################
43 # Functions                                                            #
44 ########################################################################
45 # common functions are "outsourced"
46 . "${configdir}/common"
47
48 # source the dinstall functions
49 . "${configdir}/dinstall.functions"
50
51 ########################################################################
52 ########################################################################
53
54 # Function to save which stage we are in, so we can restart an interrupted
55 # dinstall. Or even run actions in parallel, if we dare to, by simply
56 # backgrounding the call to this function. But that should only really be
57 # done for things we don't care much about.
58 #
59 # This should be called with the first argument being an array, with the
60 # members
61 #  - FUNC - the function name to call
62 #  - ARGS - Possible arguments to hand to the function. Can be the empty string
63 #  - TIME - The timestamp name. Can be the empty string
64 #  - ERR  - if this is the string false, then the call will be surrounded by
65 #           set +e ... set -e calls, so errors in the function do not exit
66 #           dinstall. Can be the empty string, meaning true.
67 #
68 # MAKE SURE TO KEEP THIS THE LAST FUNCTION, AFTER ALL THE VARIOUS ONES
69 # ADDED FOR DINSTALL FEATURES!
70 function stage() {
71     ARGS='GO[@]'
72     local "${!ARGS}"
73
74     error=${ERR:-"true"}
75
76     ARGS=${ARGS:-""}
77     STAGEFILE="${stagedir}/${FUNC}_${ARGS}"
78     STAGEFILE=${STAGEFILE// /_}
79     if [ -f "${STAGEFILE}" ]; then
80         stamptime=$(/usr/bin/stat -c %Z "${STAGEFILE}")
81         unixtime=$(date +%s)
82         difference=$(( $unixtime - $stamptime ))
83         if [ ${difference} -ge 14400 ]; then
84             log_error "Did already run ${FUNC}, stagefile exists, but that was ${difference} seconds ago. Please check."
85         else
86             log "Did already run ${FUNC}, not calling again..."
87         fi
88         return
89     fi
90
91     debug "Now calling function ${FUNC}. Arguments: ${ARGS}. Timestamp: ${TIME}"
92
93     # Make sure we are always at the same place. If a function wants to be elsewhere,
94     # it has to cd first!
95     cd ${configdir}
96
97     # Now redirect the output into $STAGEFILE.log. In case it errors out somewhere our
98     # errorhandler trap can then mail the contents of $STAGEFILE.log only, instead of a whole
99     # dinstall logfile. Short error mails ftw!
100     exec >> "${STAGEFILE}.log" 2>&1
101
102     if [ -f "${LOCK_STOP}" ]; then
103         log "${LOCK_STOP} exists, exiting immediately"
104         exit 42
105     fi
106
107     if [ "${error}" = "false" ]; then
108         set +e
109     fi
110     ${FUNC} ${ARGS}
111
112     # No matter what happened in the function, we make sure we have set -e default state back
113     set -e
114
115     # Make sure we are always at the same place.
116     cd ${configdir}
117
118     # We always use the same umask. If a function wants to do different, fine, but we reset.
119     umask 022
120
121     touch "${STAGEFILE}"
122
123     if [ -n "${TIME}" ]; then
124         ts "${TIME}"
125     fi
126
127     # And the output goes back to the normal logfile
128     exec >> "$LOGFILE" 2>&1
129
130     # Now we should make sure that we have a usable dinstall.log, so append the $STAGEFILE.log
131     # to it.
132     cat "${STAGEFILE}.log" >> "${LOGFILE}"
133     rm -f "${STAGEFILE}.log"
134
135     if [ -f "${LOCK_STOP}" ]; then
136         log "${LOCK_STOP} exists, exiting immediately"
137         exit 42
138     fi
139 }
140
141 ########################################################################
142
143 # We need logs.
144 LOGFILE="$logdir/dinstall.log"
145
146 exec >> "$LOGFILE" 2>&1
147
148 # And now source our default config
149 . "${configdir}/dinstall.variables"
150
151 # Make sure we start out with a sane umask setting
152 umask 022
153
154 # And use one locale, no matter what the caller has set
155 export LANG=C
156 export LC_ALL=C
157
158 touch "${DINSTALLSTART}"
159 ts "startup"
160 DINSTALLBEGIN="$(date -u +"%a %b %d %T %Z %Y (%s)")"
161 state "Startup"
162
163 lockfile -l 3600 "${LOCK_DAILY}"
164 trap onerror ERR
165 trap remove_daily_lock EXIT TERM HUP INT QUIT
166
167 touch "${LOCK_BRITNEY}"
168
169 GO=(
170     FUNC="savetimestamp"
171     TIME=""
172     ARGS=""
173     ERR="false"
174 )
175 stage $GO
176
177 GO=(
178     FUNC="qa1"
179     TIME="init"
180     ARGS=""
181     ERR="false"
182 )
183 stage $GO &
184
185 GO=(
186     FUNC="pg_timestamp"
187     TIME="pg_dump1"
188     ARGS="predinstall"
189     ERR=""
190 )
191 stage $GO
192
193 GO=(
194     FUNC="updates"
195     TIME="External Updates"
196     ARGS=""
197     ERR="false"
198 )
199 stage $GO
200
201 GO=(
202     FUNC="i18n1"
203     TIME="i18n 1"
204     ARGS=""
205     ERR="false"
206 )
207 stage $GO
208
209 lockfile "$LOCK_ACCEPTED"
210 lockfile "$LOCK_NEW"
211 trap remove_all_locks EXIT TERM HUP INT QUIT
212
213 GO=(
214     FUNC="punew"
215     TIME="p-u-new"
216     ARGS="stable-new"
217     ERR="false"
218 )
219 stage $GO
220
221 GO=(
222     FUNC="opunew"
223     TIME="o-p-u-new"
224     ARGS="oldstable-new"
225     ERR="false"
226 )
227 stage $GO
228
229 GO=(
230     FUNC="newstage"
231     TIME="newstage"
232     ARGS=""
233     ERR=""
234 )
235 stage $GO
236
237 GO=(
238     FUNC="cruft"
239     TIME="cruft"
240     ARGS=""
241     ERR=""
242 )
243 stage $GO
244
245 state "indices"
246
247 GO=(
248     FUNC="dominate"
249     TIME="dominate"
250     ARGS=""
251     ERR=""
252 )
253 stage $GO
254
255 GO=(
256     FUNC="filelist"
257     TIME="generate-filelist"
258     ARGS=""
259     ERR=""
260 )
261 #stage $GO
262
263 GO=(
264     FUNC="fingerprints"
265     TIME="import-keyring"
266     ARGS=""
267     ERR="false"
268 )
269 stage $GO
270
271 GO=(
272     FUNC="overrides"
273     TIME="overrides"
274     ARGS=""
275     ERR=""
276 )
277 stage $GO
278
279 GO=(
280     FUNC="mpfm"
281     TIME="pkg-file-mapping"
282     ARGS=""
283     ERR="false"
284 )
285 stage $GO
286
287 state "packages/contents"
288 GO=(
289     FUNC="packages"
290     TIME="apt-ftparchive"
291     ARGS=""
292     ERR=""
293 )
294 stage $GO
295
296 state "dists/"
297 GO=(
298     FUNC="pdiff"
299     TIME="pdiff"
300     ARGS=""
301     ERR=""
302 )
303 stage $GO
304
305 GO=(
306     FUNC="gitpdiff"
307     TIME="gitpdiff"
308     ARGS=""
309     ERR=""
310 )
311 #stage $GO
312
313 GO=(
314     FUNC="release"
315     TIME="release files"
316     ARGS=""
317     ERR=""
318 )
319 stage $GO
320
321 GO=(
322     FUNC="dakcleanup"
323     TIME="cleanup"
324     ARGS=""
325     ERR=""
326 )
327 stage $GO
328
329 GO=(
330     FUNC="buildd_dir"
331     TIME="buildd_dir"
332     ARGS=""
333     ERR=""
334 )
335 stage $GO
336
337 state "scripts"
338 GO=(
339     FUNC="mkmaintainers"
340     TIME="mkmaintainers"
341     ARGS=""
342     ERR=""
343 )
344 stage $GO
345
346 GO=(
347     FUNC="copyoverrides"
348     TIME="copyoverrides"
349     ARGS=""
350     ERR=""
351 )
352 stage $GO
353
354 GO=(
355     FUNC="mklslar"
356     TIME="mklslar"
357     ARGS=""
358     ERR=""
359 )
360 stage $GO
361
362 GO=(
363     FUNC="mkfilesindices"
364     TIME="mkfilesindices"
365     ARGS=""
366     ERR=""
367 )
368 stage $GO
369
370 GO=(
371     FUNC="mkchecksums"
372     TIME="mkchecksums"
373     ARGS=""
374     ERR=""
375 )
376 stage $GO
377
378 GO=(
379     FUNC="mirror"
380     TIME="mirror hardlinks"
381     ARGS=""
382     ERR=""
383 )
384 stage $GO
385
386 GO=(
387     FUNC="ddaccess"
388     TIME="ddaccessible sync"
389     ARGS=""
390     ERR="false"
391 )
392 stage $GO
393
394 remove_all_locks
395 trap - EXIT TERM HUP INT QUIT
396
397 ts "locked part finished"
398 state "postlock"
399
400 GO=(
401     FUNC="changelogs"
402     TIME="changelogs"
403     ARGS=""
404     ERR="false"
405 )
406 stage $GO &
407
408 GO=(
409     FUNC="pg_timestamp"
410     TIME="pg_dump2"
411     ARGS="postdinstall"
412     ERR=""
413 )
414 stage $GO
415
416 GO=(
417     FUNC="expire"
418     TIME="expire_dumps"
419     ARGS=""
420     ERR=""
421 )
422 stage $GO &
423
424 GO=(
425     FUNC="transitionsclean"
426     TIME="transitionsclean"
427     ARGS=""
428     ERR=""
429 )
430 stage $GO &
431
432 GO=(
433     FUNC="dm"
434     TIME=""
435     ARGS=""
436     ERR=""
437 )
438 stage $GO &
439
440 GO=(
441     FUNC="bts"
442     TIME=""
443     ARGS=""
444     ERR="false"
445 )
446 stage $GO &
447
448 GO=(
449     FUNC="mirrorpush"
450     TIME="mirrorpush"
451     ARGS=""
452     ERR="false"
453 )
454 stage $GO &
455
456 GO=(
457     FUNC="i18n2"
458     TIME="i18n 2"
459     ARGS=""
460     ERR="false"
461 )
462 stage $GO &
463
464 GO=(
465     FUNC="stats"
466     TIME="stats"
467     ARGS=""
468     ERR="false"
469 )
470 stage $GO &
471
472 GO=(
473     FUNC="testingsourcelist"
474     TIME=""
475     ARGS=""
476     ERR="false"
477 )
478 stage $GO &
479
480 rm -f "${LOCK_BRITNEY}"
481
482 GO=(
483     FUNC="cleantransactions"
484     TIME=""
485     ARGS=""
486     ERR=""
487 )
488 stage $GO
489
490 GO=(
491     FUNC="aptftpcleanup"
492     TIME="apt-ftparchive cleanup"
493     ARGS=""
494     ERR="false"
495 )
496 #stage $GO
497
498 # we need to wait for the background processes before the end of dinstall
499 wait
500
501 log "Daily cron scripts successful, all done"
502
503 exec > "$logdir/afterdinstall.log" 2>&1
504
505 GO=(
506     FUNC="renamelogfile"
507     TIME=""
508     ARGS=""
509     ERR="false"
510 )
511 stage $GO
512 state "all done"
513
514
515 # Now, at the very (successful) end of dinstall, make sure we remove
516 # our stage files, so the next dinstall run will do it all again.
517 rm -f ${stagedir}/*
518 touch "${DINSTALLEND}"