]> git.decadent.org.uk Git - dak.git/blobdiff - config/debian/cronscript
There can be only one
[dak.git] / config / debian / cronscript
index ffaf977ea8557c344c2d3cb26f0b69ca21aa2079..3f3dd52dbbd3184b26a2c06da74b436886206d3c 100755 (executable)
@@ -27,6 +27,9 @@
 
 # exit on errors
 set -e
+# A pipeline's return status is the value of the last (rightmost)
+# command to exit with a non-zero status, or zero if all commands exit
+# successfully.
 set -o pipefail
 # make sure to only use defined variables
 set -u
@@ -35,15 +38,42 @@ set -u
 # the important part here)
 set -E
 
+# The extglob shell option is enabled using the shopt builtin, several
+# extended pattern matching operators are recognized. We use it for
+# the POSSIBLEARGS and the first case ${ARGS} matching
+shopt -s extglob
+
 # And use one locale, no matter what the caller has set
-export LANG=C
-export LC_ALL=C
-
-ARG=${1:-"meh"}
-# While this check can be done in the following case, some assumptions
-# down there are easier if we sorted out calls without an arg before.
-if [[ ${ARG} == meh ]]; then
-    cat - <<EOF
+export LANG=C.UTF-8
+export LC_ALL=C.UTF-8
+
+# import the general variable set.
+export SCRIPTVARS=/srv/ftp-master.debian.org/dak/config/debian/vars
+. $SCRIPTVARS
+
+# One arg please
+declare -lr ARG=${1:-"meh"}
+
+# program name is the (lower cased) first argument.
+PROGRAM="${ARG}"
+
+# And the following types of cronscripts exists
+declare -lr POSSIBLEARGS='+(unchecked|dinstall|hourly|daily|weekly|monthly|yearly)'
+
+# set DEBUG if you want to see a little more logs (needs to be used more)
+DEBUG=${DEBUG:-0}
+
+# Check if the argument is a known one. If so, lock us so that only
+# one copy of the type of cronscript runs. The $type.tasks file is
+# mandantory, so use that for locking.
+case ${ARG} in
+    ${POSSIBLEARGS})
+        # Only one of me should ever run.
+        FLOCKER=${FLOCKER:-""}
+        [  "${FLOCKER}"  != "${configdir}/${PROGRAM}.tasks" ] && exec env FLOCKER="${configdir}/${PROGRAM}.tasks" flock -E 0 -en "${configdir}/${PROGRAM}.tasks" "$0" "$@" || :
+        ;;
+    *)
+        cat - <<EOF
 This is the FTPMaster cronscript. It needs an argument or it won't do
 anything for you.
 
@@ -51,30 +81,21 @@ Currently accepted Arguments:
 
    unchecked - Process the unchecked queue
    dinstall  - Run a dinstall
-   hourly, daily, weekly - Run that part
+   yearly, hourly, daily, weekly - Run that part
 
 EOF
-    exit 0
-fi
-
-# Make sure we start out with a sane umask setting
-umask 022
-
-# import the general variable set.
-export SCRIPTVARS=/srv/ftp-master.debian.org/dak/config/debian/vars
-. $SCRIPTVARS
+        exit 0
+        ;;
+esac
 
 # common functions are "outsourced"
 . "${configdir}/common"
 
-# program name is the (lower cased) first argument.
-PROGRAM="${ARG,,}"
-
 # Timestamp when we started
 NOW=$(date "+%Y.%m.%d-%H:%M:%S")
 
 # Which list of tasks should we run?
-TASKLIST="${configdir}/${PROGRAM}.tasks"
+declare -r TASKLIST="${configdir}/${PROGRAM}.tasks"
 
 # A logfile for every cron script
 LOGFILE="${logdir}/${PROGRAM}_${NOW}.log"
@@ -90,7 +111,7 @@ done
 # Get rid of tempfiles at the end
 trap cleanup EXIT TERM HUP INT QUIT
 
-case ${ARG,,} in
+case ${ARG} in
     unchecked)
         # Do not run during dinstall
         if [[ -e ${LOCK_DAILY} ]]; then
@@ -101,15 +122,11 @@ case ${ARG,,} in
             # log "aborting cron.unchecked because $LOCK_UNCHECKED has already been locked"
             exit 0
         fi
-        TEMPFILES="${TEMPFILES} ${LOCK_UNCHECKED}"
+        TMPFILES="${TMPFILES} ${LOCK_UNCHECKED}"
         ;;
     dinstall)
         ;;
     hourly)
-        # Only one of me should ever run.
-        FLOCKER=${FLOCKER:-""}
-        [  "${FLOCKER}"  != "${configdir}/${PROGRAM}.variables" ] && exec env FLOCKER="${configdir}/${PROGRAM}.variables" flock -E 0 -en "${configdir}/${PROGRAM}.variables" "$0"
-        "$@" || :
         ;;
     daily)
         ;;
@@ -117,6 +134,8 @@ case ${ARG,,} in
         ;;
     monthly)
         ;;
+    yearly)
+        ;;
     *)
         error "Unknown arg ${ARG}"
         exit 42
@@ -124,7 +143,7 @@ case ${ARG,,} in
 esac
 
 # An easy access by name for the current log
-ln -sf ${LOGFILE} ${PROGRAM}
+ln -sf ${LOGFILE} ${logdir}/${PROGRAM}
 
 # And from here, all output to the log please
 exec >> "$LOGFILE" 2>&1
@@ -209,7 +228,7 @@ log "Cron script successful, all done"
 # and ensure its no longer used
 exec > "$logdir/after${PROGRAM}.log" 2>&1
 
-case ${ARG,,} in
+case ${ARG} in
     unchecked)
         ;;
     dinstall)
@@ -225,11 +244,17 @@ case ${ARG,,} in
         ;;
     monthly)
         ;;
+    yearly)
+        ;;
 esac
 
 # Now, at the very (successful) end of this run, make sure we remove
 # our stage files, so the next dinstall run will do it all again.
 rm -f ${stagedir}/*
 bzip2 -9 ${LOGFILE}
+
+# Logfile should be gone, remove the symlink
+[[ -L ${logdir}/${PROGRAM} ]] && [[ ! -f ${logdir}/${PROGRAM} ]] && rm -f ${logdir}/${PROGRAM} || log "Logfile still exists or symlink gone already? Something fishy going on"
+
 # FIXME: Mail the log when its non-empty
 [[ -s "${logdir}/after${PROGRAM}.log" ]] || rm "${logdir}/after${PROGRAM}.log"