#!/bin/bash
# No way I try to deal with a crippled sh just for POSIX foo.
-# Copyright (C) 2009-2012 Joerg Jaspert <joerg@debian.org>
+# Copyright (C) 2009-2015 Joerg Jaspert <joerg@debian.org>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
ARGS='GO[@]'
local "${!ARGS}"
- error=${ERR:-"true"}
+ local error=${ERR:-"true"}
ARGS=${ARGS:-""}
log "########## DINSTALL BEGIN: ${FUNC} ${ARGS} ##########"
- STAGEFILE="${stagedir}/${FUNC}_${ARGS}"
+ local STAGEFILE="${stagedir}/${FUNC}_${ARGS}"
STAGEFILE=${STAGEFILE// /_}
if [ -f "${STAGEFILE}" ]; then
- stamptime=$(/usr/bin/stat -c %Z "${STAGEFILE}")
- unixtime=$(date +%s)
- difference=$(( $unixtime - $stamptime ))
+ local stamptime=$(/usr/bin/stat -c %Z "${STAGEFILE}")
+ local unixtime=$(date +%s)
+ local difference=$(( $unixtime - $stamptime ))
if [ ${difference} -ge 14400 ]; then
log_error "Did already run ${FUNC}, stagefile exists, but that was ${difference} seconds ago. Please check."
else
debug "Now calling function ${FUNC}. Arguments: ${ARGS}. Timestamp: ${TIME}"
- # Make sure we are always at the same place. If a function wants to be elsewhere,
- # it has to cd first!
+ # Make sure we are always at the same place. If a function wants
+ # to be elsewhere, it has to cd first!
cd ${configdir}
- # Now redirect the output into $STAGEFILE.log. In case it errors out somewhere our
- # errorhandler trap can then mail the contents of $STAGEFILE.log only, instead of a whole
- # dinstall logfile. Short error mails ftw!
+ # Now redirect the output into $STAGEFILE.log. In case it errors
+ # out somewhere our errorhandler trap can then mail the contents
+ # of $STAGEFILE.log only, instead of a whole dinstall logfile.
+ # Short error mails ftw!
exec >> "${STAGEFILE}.log" 2>&1
if [ -f "${LOCK_STOP}" ]; then
exit 42
fi
+ # Do we care about trouble in the function we call?
if [ "${error}" = "false" ]; then
set +e
fi
${FUNC} ${ARGS}
- # No matter what happened in the function, we make sure we have set -e default state back
+ # No matter what happened in the function, we make sure we have
+ # set -e default state back
set -e
# Make sure we are always at the same place.
cd ${configdir}
- # We always use the same umask. If a function wants to do different, fine, but we reset.
+ # We always use the same umask. If a function wants to do
+ # different, fine, but we reset.
umask 022
touch "${STAGEFILE}"
# And the output goes back to the normal logfile
exec >> "$LOGFILE" 2>&1
- # Now we should make sure that we have a usable dinstall.log, so append the $STAGEFILE.log
- # to it.
+ # Now we should make sure that we have a usable dinstall.log, so
+ # append the $STAGEFILE.log to it.
cat "${STAGEFILE}.log" >> "${LOGFILE}"
rm -f "${STAGEFILE}.log"
touch "${LOCK_BRITNEY}"
# This loop simply wants to be fed by a list of values (see below)
-# which consists of 5 values currently.
+# made out of 5 columns.
# The first four are the array values for the stage function, the
-# fifths tells us if we should background the stage call.
+# fifth tells us if we should background the stage call.
#
# - FUNC - the function name to call
# - ARGS - Possible arguments to hand to the function. Can be the empty string
#
# ATTENTION: Spaces in arguments or timestamp names need to be escaped by \
#
-# ATTENTION: There are two special values for the first column (FUNC).
-# STATE - do not call stage function, call the state
-# function to update the public statefile "where is dinstall"
-# NOSTAGE - do not call stage function, call the command directly.
+# NOTE 1: There are two special values for the first column (FUNC).
+# STATE - do not call stage function, call the state
+# function to update the public statefile "where is dinstall"
+# NOSTAGE - do not call stage function, call the command directly.
+#
+# Note 2: If you want to hand an empty value to the stage function,
+# use the word "none" in the list below.
while read FUNC ARGS TIME ERR BACKGROUND; do
debug "FUNC: $FUNC ARGS: $ARGS TIME: $TIME ERR: $ERR BG: $BACKGROUND"
fi
done
+ # ERR/BACKGROUND are boolean, check that they are.
+ for var in ERR BACKGROUND; do
+ if [[ ${!var} != false ]] && [[ ${!var} != true ]]; then
+ error "Illegal value ${!var} for ${var} (should be true or false), line for function ${FUNC}"
+ fi
+ done
+
case ${FUNC} in
STATE)
state ${ARGS}
;;
esac
done < <(cat - <<EOF
-savetimestamp none none false false
-qa1 init none false true
-pg_timestamp pg_dump1 predinstall false false
-updates External\ Updates none false false
-i18n1 i18n\ 1 none false false
-dep11 dep11\ 1 none false false
-NOSTAGE lockaccepted none false false
-punew p-u-new stable-new false false
-opunew o-p-u-new oldstable-new false false
-backports_policy backports-policy none false false
-cruft cruft none false false
-STATE indices none false false
-dominate dominate none false false
-autocruft autocruft unstable\ experimental false false
-fingerprints import-keyring none false false
-overrides overrides none false false
-mpfm pkg-file-mapping none false false
-STATE packages/contents none false false
-packages apt-ftparchive none false false
-STATE dists/ none false false
-pdiff pdiff none false false
-release release\ files none false false
-dakcleanup cleanup none false false
-STATE scripts none false false
-mkmaintainers mkmaintainers none false false
-copyoverrides copyoverrides none false false
-mklslar mklslar none false false
-mkfilesindices mkfilesindices none false false
-mkchecksums mkchecksums none false false
-mirror mirror\ hardlinks none false false
-ddaccess ddaccessible\ sync none false false
-NOSTAGE remove_locks none false false
-STATE postlock none false false
-changelogs changelogs none false true
-pg_timestamp pg_dump2 postdinstall false false
-expire expire_dumps none false true
-transitionsclean transitionsclean none false true
-dm none none false true
-bts none none false true
-mirrorpush mirrorpush none false true
-mirrorpush-backports mirrorpush-backports none false true
-i18n2 i18n\ 2 none false true
-stats stats none false true
-testingsourcelist none none false true
-NOSTAGE rm\ -f\ "\${LOCK_BRITNEY}" none false false
-cleantransactions none none false false
+savetimestamp none none false false
+qa1 none init true true
+pg_timestamp predinstall pg_dump1 false false
+updates none External\ Updates false false
+i18n1 none i18n\ 1 false false
+dep11 none dep11\ 1 false false
+NOSTAGE lockaccepted none false false
+punew stable-new p-u-new false false
+opunew oldstable-new o-p-u-new false false
+backports_policy none backports-policy false false
+cruft none cruft false false
+STATE indices none false false
+dominate none dominate false false
+autocruft none autocruft false false
+fingerprints none import-keyring false false
+overrides none overrides false false
+mpfm none pkg-file-mapping false false
+STATE packages/contents none false false
+packages none apt-ftparchive false false
+STATE dists/ none false false
+pdiff none pdiff false false
+release none release\ files false false
+dakcleanup none cleanup false false
+STATE scripts none false false
+mkmaintainers none mkmaintainers false false
+copyoverrides none copyoverrides false false
+mklslar none mklslar false false
+mkfilesindices none mkfilesindices false false
+mkchecksums none mkchecksums false false
+mirror none mirror\ hardlinks false false
+NOSTAGE remove_locks none false false
+STATE postlock none false false
+ddaccess none ddaccessible\ sync true true
+changelogs none changelogs false true
+pg_timestamp postdinstall pg_dump2 false false
+expire none expire_dumps false true
+transitionsclean none transitionsclean false true
+dm none none false true
+bts none none false true
+mirrorpush none mirrorpush false true
+mirrorpush-backports none mirrorpush-backports false true
+i18n2 none i18n\ 2 false true
+stats none stats false true
+testingsourcelist none none false true
+NOSTAGE rm\ -f\ "\${LOCK_BRITNEY}" none false false
+cleantransactions none none false false
EOF
)
exec > "$logdir/afterdinstall.log" 2>&1
-GO=(
- FUNC="renamelogfile"
- TIME=""
- ARGS=""
- ERR="false"
-)
-stage $GO
-state "all done"
+if [ -f "${dbdir}/dinstallstart" ]; then
+ NOW=$(cat "${dbdir}/dinstallstart")
+ mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
+ logstats "$logdir/dinstall_${NOW}.log"
+ bzip2 -9 "$logdir/dinstall_${NOW}.log"
+else
+ error "Problem, I don't know when dinstall started, unable to do log statistics."
+ NOW=`date "+%Y.%m.%d-%H:%M:%S"`
+ mv "$LOGFILE" "$logdir/dinstall_${NOW}.log"
+ bzip2 -9 "$logdir/dinstall_${NOW}.log"
+fi
+state "all done"
# Now, at the very (successful) end of dinstall, make sure we remove
# our stage files, so the next dinstall run will do it all again.