In bold what you need to change to make it work for you.
#!/usr/local/bin/bash # A script to alert the programmer by email when # one or more log files in a dir become not empty. # To be used in a crontab, e.g.: # ## use /usr/loca/bin/bash to run commands, overriding the default set by cron #SHELL=/usr/local/bin/bash ## run once a the end of the day #0 20 * * * $HOME/bin/alert_not_empty.sh dir=/path/to/logs/ files=(file1_log file2_log) notempty=() for file in "${files[@]}"; do if [ -s "$dir/$file" ]; then notempty=( "${notempty[@]}" "$file" ) fi done if [ ${#notempty[@]} -ne 0 ]; then notempty=$(printf "%s\n" "${notempty[@]}") # You can use mail or mailx, but what if sendmail is disabled for remove # delivery? (e.g. for security reasons). Let's help ourselves a bit LOL # Use "host -t mx yourispdomain.name" to find out yourispmailserver exec 1<>/dev/tcp/gmail-smtp-in.l.google.com/25 a=$(cat <<mailend yourserver.domain.name MAIL FROM: <yourusername@yourserver.domain.name> RCPT TO: <youremail@yourispdomain.name> DATA From: yourusername@yourserver.domain.name To: youremail@yourispdomain.name Subject: message subject You have to check the following log files: $notempty . QUIT MAILEND ) # Needed to write whole commands in one go. IFS=' ' # This converts a to an indexed array b. declare -a b=($a) for x in "${b[@]}"; do # We always sleep after each line, even in data mode. # This is slower, but makes the implementation simpler. # For slow connections, 1 second may not be enough. sleep 5 # Send command. Be sure to use DOS end of lines # or some SMTP servers may choke on the commands. echo -ne "$x\r\n" done fi
Here's a more advanced versions: it has debugging output, actually reads replies and is much faster when sending the body of the email, since it doesn't sleep after each line has been sent:
function read_reply { # DEBUG. echo -n "sleeping..." # Sleep to make sure a reply has arrived. sleep 10 # DEBUG. echo -en "\nread reply..." # Read reply. read -u 3 # DEBUG. echo # DEBUG: print replies. echo "$REPLY" } # Needed to write whole commands in one go IFS=' ' # This converts a to an indexed array b! declare -a b=($a) # At the beginning, we are in command mode. # The only other mode is data mode. cmd=true # Read server greeting to begin. read_reply for x in "${b[@]}" do # Send command. Be sure to use DOS end of lines. echo -ne "$x\r\n" >&3 # DEBUG: print commands. echo "$x" [ "$x" = "." ] && cmd=true $cmd && read_reply [ "$x" = "DATA" ] && cmd=false done
No comments:
Post a Comment