xref: /freebsd/usr.sbin/periodic/periodic.sh (revision c678bc4f13a340ad88debe321afd0097db2590cb)
1#!/bin/sh -
2#
3# $FreeBSD$
4#
5# Run nightly periodic scripts
6#
7# usage: periodic { daily | weekly | monthly } - run standard periodic scripts
8#        periodic /absolute/path/to/directory  - run periodic scripts in dir
9#
10
11usage () {
12    echo "usage: $0 <directory of files to execute>" 1>&2
13    echo "or     $0 { daily | weekly | monthly }"    1>&2
14    exit 1
15}
16
17if [ $# -lt 1 ] ; then
18    usage
19fi
20
21# If possible, check the global system configuration file,
22# to see if there are additional dirs to check
23if [ -r /etc/defaults/periodic.conf ]; then
24    . /etc/defaults/periodic.conf
25    source_periodic_confs
26fi
27
28host=`hostname`
29export host
30tmp_output=`mktemp ${TMPDIR:-/tmp}/periodic.XXXXXXXXXX`
31
32# Execute each executable file in the directory list.  If the x bit is not
33# set, assume the user didn't really want us to muck with it (it's a
34# README file or has been disabled).
35
36for arg
37do
38    # Where's our output going ?
39    eval output=\$${arg##*/}_output
40    case "$output" in
41    /*) pipe="cat >>$output";;
42    "") pipe=cat;;
43    *)  pipe="mail -s '$host ${arg##*/} run output' $output";;
44    esac
45
46    success=YES info=YES badconfig=NO	# Defaults when ${run}_* aren't YES/NO
47    for var in success info badconfig
48    do
49        case $(eval echo "\$${arg##*/}_show_$var") in
50        [Yy][Ee][Ss]) eval $var=YES;;
51        [Nn][Oo])     eval $var=NO;;
52        esac
53    done
54
55    case $arg in
56    /*) if [ -d "$arg" ]
57        then
58            dirlist="$arg"
59        else
60            echo "$0: $arg not found" >&2
61            continue
62        fi;;
63    *)  dirlist=
64        for top in /etc/periodic ${local_periodic}
65        do
66            [ -d $top/$arg ] && dirlist="$dirlist $top/$arg"
67        done;;
68    esac
69
70    {
71        empty=TRUE
72        processed=0
73        for dir in $dirlist
74        do
75            for file in $dir/*
76            do
77                if [ -x $file -a ! -d $file ]
78                then
79                    output=TRUE
80                    processed=$(($processed + 1))
81                    $file </dev/null >$tmp_output 2>&1
82                    rc=$?
83                    if [ -s $tmp_output ]
84                    then
85                      case $rc in
86                      0)  [ $success = NO ] && output=FALSE;;
87                      1)  [ $info = NO ] && output=FALSE;;
88                      2)  [ $badconfig = NO ] && output=FALSE;;
89                      esac
90                      [ $output = TRUE ] && { cat $tmp_output; empty=FALSE; }
91                    fi
92                    cp /dev/null $tmp_output
93                fi
94            done
95        done
96        if [ $empty = TRUE ]
97        then
98          [ $processed = 1 ] && plural= || plural=s
99          echo "No output from the $processed file$plural processed"
100        fi
101    } | eval $pipe
102done
103rm -f $tmp_output
104