#!/bin/bash
# run-parts - concept taken from Debian

# keep going when something fails
set +e

if [ $# -lt 1 ]; then
        echo "Usage: run-parts [--list | --test] <dir>"
        exit 1
fi

while [ $# -gt 1 ]; do
        case $1 in
                --list)
                        list=1
                        shift
                        break
                        ;;
                --test)
                        test=1
                        shift
                        break
                        ;;
                --)
                        # -- end of options
                        shift
                        break
                        ;;
                *)
                        # directory
                        break
                        ;;
        esac
done

if [ ! -d $1 ]; then
        echo "Not a directory: $1"
        exit 1
fi

if [ -f /etc/sysconfig/run-parts ]; then
        . /etc/sysconfig/run-parts
fi

# Ignore *~ and *, scripts
for i in $(LC_ALL=C; echo ${1%/}/*[^~,]) ; do
        [ -d $i ] && continue
        # Don't run *.{rpmsave,rpmorig,rpmnew,swp,cfsaved} scripts
        [ "${i%.cfsaved}" != "${i}" ] && continue
        [ "${i%.rpmsave}" != "${i}" ] && continue
        [ "${i%.rpmorig}" != "${i}" ] && continue
        [ "${i%.rpmnew}" != "${i}" ] && continue
        [ "${i%.swp}" != "${i}" ] && continue
        [ "${i%,v}" != "${i}" ] && continue

        # jobs.deny prevents specific files from being executed
        # jobs.allow prohibits all non-named jobs from being run.
        # can be used in conjunction but there's no reason to do so.
        if [ -r $1/jobs.deny ]; then
                grep -q "^$(basename $i)$" $1/jobs.deny && continue
        fi
        if [ -r $1/jobs.allow ]; then
                grep -q "^$(basename $i)$" $1/jobs.allow || continue
        fi

        if [ -e $i ]; then
                if [ -r $1/whitelist ]; then
                        grep -q "^$(basename $i)$" $1/whitelist && continue
                fi

                if [ ${list:-0} = 1 ]; then
                        echo $i;
                elif [ -x $i ]; then
                        if [ ${test:-0} = 1 ]; then
                                echo $i;
                                continue
                        fi
                        if [ "$RANDOMIZE" != "" ]; then
                                let "rtime = $RANDOM"
                                if [ "$RANDOMTIME" != "" ]; then
                                        let "rtime %= $RANDOMTIME"
                                else
                                        let "rtime %= 300"
                                fi
                                sleep $rtime
                        fi

                        # run executable files
                        logger -p cron.notice -t "run-parts($1)[$$]" "starting $                                                                                                                                                                                                                                             (basename $i)"
                        $i 2>&1 | awk -v "progname=$i" \
                              'progname {
                                   print progname ":\n"
                                   progname="";
                               }
                               { print; }'
                        logger -i -p cron.notice -t "run-parts($1)" "finished $(                                                                                                                                                                                                                                             basename $i)"
                fi
        fi
done

exit 0