]> 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
 
 # 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
 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 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
 # 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.
 
 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
 
    unchecked - Process the unchecked queue
    dinstall  - Run a dinstall
-   hourly, daily, weekly - Run that part
+   yearly, hourly, daily, weekly - Run that part
 
 EOF
 
 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"
 
 
 # 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?
 # 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"
 
 # 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
 
 # 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
     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
             # log "aborting cron.unchecked because $LOCK_UNCHECKED has already been locked"
             exit 0
         fi
-        TEMPFILES="${TEMPFILES} ${LOCK_UNCHECKED}"
+        TMPFILES="${TMPFILES} ${LOCK_UNCHECKED}"
         ;;
     dinstall)
         ;;
     hourly)
         ;;
     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)
         ;;
         ;;
     daily)
         ;;
@@ -117,6 +134,8 @@ case ${ARG,,} in
         ;;
     monthly)
         ;;
         ;;
     monthly)
         ;;
+    yearly)
+        ;;
     *)
         error "Unknown arg ${ARG}"
         exit 42
     *)
         error "Unknown arg ${ARG}"
         exit 42
@@ -124,7 +143,7 @@ case ${ARG,,} in
 esac
 
 # An easy access by name for the current log
 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
 
 # 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
 
 # and ensure its no longer used
 exec > "$logdir/after${PROGRAM}.log" 2>&1
 
-case ${ARG,,} in
+case ${ARG} in
     unchecked)
         ;;
     dinstall)
     unchecked)
         ;;
     dinstall)
@@ -225,11 +244,17 @@ case ${ARG,,} in
         ;;
     monthly)
         ;;
         ;;
     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}
 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"
 # FIXME: Mail the log when its non-empty
 [[ -s "${logdir}/after${PROGRAM}.log" ]] || rm "${logdir}/after${PROGRAM}.log"