periodic.sh revision 231568
128112Spst#!/bin/sh -
228112Spst#
350479Speter# $FreeBSD: head/usr.sbin/periodic/periodic.sh 231568 2012-02-12 23:18:05Z brooks $
428112Spst#
528112Spst# Run nightly periodic scripts
628112Spst#
728112Spst# usage: periodic { daily | weekly | monthly } - run standard periodic scripts
828112Spst#        periodic /absolute/path/to/directory  - run periodic scripts in dir
928112Spst#
1028112Spst
1128143Spstusage () {
1228112Spst    echo "usage: $0 <directory of files to execute>" 1>&2
1328143Spst    echo "or     $0 { daily | weekly | monthly }"    1>&2
1428112Spst    exit 1
1528143Spst}
1628143Spst
17231568Sbrooksoutput_pipe()
18231568Sbrooks{
19231568Sbrooks    # Where's our output going ?
20231568Sbrooks    eval output=\$${1##*/}_output
21231568Sbrooks    case "$output" in
22231568Sbrooks    /*) pipe="cat >>$output";;
23231568Sbrooks    "") pipe=cat;;
24231568Sbrooks    *)  pipe="mail -E -s '$host ${1##*/} run output' $output";;
25231568Sbrooks    esac
26231568Sbrooks    eval $pipe
27231568Sbrooks}
28231568Sbrooks
2928143Spstif [ $# -lt 1 ] ; then
3028143Spst    usage
3128112Spstfi
3228112Spst
3344008Sjkh# If possible, check the global system configuration file, 
3444008Sjkh# to see if there are additional dirs to check
3561981Sbrianif [ -r /etc/defaults/periodic.conf ]; then
3661981Sbrian    . /etc/defaults/periodic.conf
3761981Sbrian    source_periodic_confs
3828143Spstfi
3928143Spst
4042239Sbillfhost=`hostname`
4158767Scpiazzaexport host
42231568Sbrooks
43231568Sbrooks# If we were called normally, then create a lock file for each argument
44231568Sbrooks# in turn and reinvoke ourselves with the LOCKED argument.  This prevents
45231568Sbrooks# very long running jobs from being overlapped by another run as this is
46231568Sbrooks# will lead the system running progressivly slower and more and more jobs 
47231568Sbrooks# are run at once.
48231568Sbrooksif [ $1 != "LOCKED" ]; then
49231568Sbrooks    ret=0
50231568Sbrooks    for arg; do
51231568Sbrooks        lockfile=/var/run/periodic.${arg##*/}.lock
52231568Sbrooks        lockf -t 0 "${lockfile}" /bin/sh $0 LOCKED "$arg"
53231568Sbrooks        case $? in
54231568Sbrooks        0) ;;
55231568Sbrooks        73) #EX_CANTCREATE
56231568Sbrooks            echo "can't create ${lockfile}" | output_pipe $arg
57231568Sbrooks            ret=1
58231568Sbrooks            ;;
59231568Sbrooks        75) #EX_TEMPFAIL
60231568Sbrooks            echo "$host ${arg##*/} prior run still in progress" | \
61231568Sbrooks                output_pipe $arg
62231568Sbrooks            ret=1
63231568Sbrooks            ;;
64231568Sbrooks        *)
65231568Sbrooks            ret=1
66231568Sbrooks            ;;
67231568Sbrooks        esac
68231568Sbrooks    done
69231568Sbrooks    exit $ret
70231568Sbrooksfi
71231568Sbrooks
72231568Sbrooksif [ $# -ne 2 ]; then
73231568Sbrooks    usage
74231568Sbrooksfi
75231568Sbrooksshift
76231568Sbrooksarg=$1
77231568Sbrooks
7868226Skristmp_output=`mktemp ${TMPDIR:-/tmp}/periodic.XXXXXXXXXX`
7928112Spst
8028143Spst# Execute each executable file in the directory list.  If the x bit is not
8128112Spst# set, assume the user didn't really want us to muck with it (it's a
8228112Spst# README file or has been disabled).
8328112Spst
84231568Sbrookssuccess=YES info=YES badconfig=NO empty_output=YES	# Defaults when ${run}_* aren't YES/NO
85231568Sbrooksfor var in success info badconfig empty_output; do
86231568Sbrooks    case $(eval echo "\$${arg##*/}_show_$var") in
87231568Sbrooks    [Yy][Ee][Ss]) eval $var=YES;;
88231568Sbrooks    [Nn][Oo])     eval $var=NO;;
8965843Sbrian    esac
90231568Sbrooksdone
9165843Sbrian
92231568Sbrookscase $arg in
93231568Sbrooks/*) if [ -d "$arg" ]; then
94231568Sbrooks        dirlist="$arg"
95231568Sbrooks    else
96231568Sbrooks        echo "$0: $arg not found" >&2 
97231568Sbrooks        continue
98231568Sbrooks    fi
99231568Sbrooks    ;;
100231568Sbrooks*)  dirlist=
101231568Sbrooks    for top in /etc/periodic ${local_periodic}; do
102231568Sbrooks        [ -d $top/$arg ] && dirlist="$dirlist $top/$arg"
10365843Sbrian    done
104231568Sbrooks    ;;
105231568Sbrooksesac
10665843Sbrian
107231568Sbrooks{
108231568Sbrooks    empty=TRUE
109231568Sbrooks    processed=0
110231568Sbrooks    for dir in $dirlist; do
111231568Sbrooks        for file in $dir/*; do
112231568Sbrooks            if [ -x $file -a ! -d $file ]; then
113231568Sbrooks                output=TRUE
114231568Sbrooks                processed=$(($processed + 1))
115231568Sbrooks                $file </dev/null >$tmp_output 2>&1
116231568Sbrooks                rc=$?
117231568Sbrooks                if [ -s $tmp_output ]; then
118231568Sbrooks                    case $rc in
119231568Sbrooks                    0)  [ $success = NO ] && output=FALSE;;
120231568Sbrooks                    1)  [ $info = NO ] && output=FALSE;;
121231568Sbrooks                    2)  [ $badconfig = NO ] && output=FALSE;;
122231568Sbrooks                    esac
123231568Sbrooks                    [ $output = TRUE ] && { cat $tmp_output; empty=FALSE; }
12465956Sbrian                fi
125231568Sbrooks                cp /dev/null $tmp_output
126231568Sbrooks            fi
12765956Sbrian        done
128231568Sbrooks    done
129231568Sbrooks    if [ $empty = TRUE ]; then
130231568Sbrooks        if [ $empty_output = TRUE ]; then
131170990Sdwmalone            [ $processed = 1 ] && plural= || plural=s
132170990Sdwmalone            echo "No output from the $processed file$plural processed"
13365956Sbrian        fi
134231568Sbrooks    else
135231568Sbrooks        echo ""
136231568Sbrooks        echo "-- End of $arg output --"
137231568Sbrooks    fi
138231568Sbrooks} | output_pipe ${arg}
139231568Sbrooks
14069188Skrisrm -f $tmp_output
141