1
0
Fork 0

Add watchd to watch directories

watchd will poll the sha1sum of a specified directory listing and notify
whenever that sha1sum changes.  This allows active monitoring of all files in
that specific directory.
This commit is contained in:
Andrew Tomaka 2015-03-06 07:55:58 -05:00
parent 9054b195f5
commit 1212f892fd

99
bin/watchd Executable file
View file

@ -0,0 +1,99 @@
#!/bin/bash
readonly PROGRAM_NAME=$(basename "$0")
readonly PROGRAM_LOC=$(readlink -m "$(dirname $0)")
readonly ARGS="$@"
readonly ARG_COUNT="$#"
LAST_SHA=0
usage () {
echo "usage: $PROGRAM_NAME [DIRECTORY] [WAIT_TIME]"
}
error () {
local readonly message=$1; shift
echo "$PROGRAM_NAME: $message"
usage
exit 1
}
current_sha () {
ls -lR "$DIRECTORY" \
| sha1sum
}
sha_changed? () {
[[ "$(current_sha)" != "$LAST_SHA" ]]
}
update_sha () {
LAST_SHA=$(current_sha)
}
alert_update () {
now=$(date +"%Y-%m-%d %I:%M:%S")
echo "[$now] Directory Updated"
}
is_dir? () {
local readonly directory=$1; shift
[[ -d $directory ]]
}
is_int? () {
local readonly number=$1; shift
[[ $number =~ ^[0-9]+$ ]]
}
is_empty? () {
local var=$1; shift
[[ -z $var ]]
}
check_arguments () {
if is_empty? "$DIRECTORY" || is_empty? "$WAIT_TIME"; then
error "missing operand"
fi
if ! is_dir? "$DIRECTORY"; then
error "$DIRECTORY is not a directory"
fi
if ! is_int? "$WAIT_TIME"; then
error "$WAIT_TIME is not an integer"
fi
}
run () {
while true; do
if sha_changed?; then
update_sha
alert_update
fi
sleep "$WAIT_TIME"
done
}
main () {
local readonly d=$1; shift
local readonly w=$1; shift
readonly DIRECTORY=${d:-$(pwd)}
readonly WAIT_TIME=${w:-15}
check_arguments
update_sha
echo "--------------------------------------------------------------------------------"
echo "+ Monitoring $DIRECTORY at interval $WAIT_TIME seconds"
echo "--------------------------------------------------------------------------------"
run
}
main $ARGS