Subversion Repositories oSiteChecker

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#!/bin/bash

#
# Script that checks if given sites are up and sends an e-mail if they are not.
# You should not run this script on the same servers your monitoring,
# neither should your e-mail account reside on a server behind same firewall as the sites your checking.
#
# Developer: oSource Development
# DevTeam: Marcus Uddenhed
# Version: 0.5.0
# Web: http://www.osource.se
# Updated: 2017-08-31
#
# Requires: mailx (http://heirloom.sourceforge.net/mailx.html)
#
# Licensed under BSDL license, see license information on our homepage.
#

#### Global variables ####
# Sites
checkSite[1]="https://";                                                        # Add sites that you want to monitor, can be as many as you want.
checkSite[2]="http://";

# Retries
rInterval=8                                                                                     # How many times should it retry until it set the site as down.
rTime=20                                                                                        # How many seconds shold it wait between retries.

# Mail
sendMail=yes                                                                            # Should i send an e-mail with failed sites.
mailFrom=""                                             # From whom shall this mail be sent?
mailTo=""                                                                                       # To whom shall the mail be sent? Seperate recipients with a ","
smtpHost=""                                                                                     # The SMTP mail server that is going to process the mail.
smtpAuth=yes                                                                            # Does the SMTP mail server require authentication(yes/no).
smtpUser=""                                                                                     # Username if smtpAuth is set to yes.
smtpPass=""                                                                                     # password if smtpAuth is set to yes.
smtpPort=587                                                                            # Standard for non authenticated SMTP is 25, 587 is for authenticated SMTP.

# Logging
logStatus=yes                                                                           # Should we log to local logfile(yes/no).
logPath="/var/log"                                                                      # Where should we put the log file(omit the traling slash).
logName="oSiteChecker.log"                                                      # name of log file.

#### Do not edit anything below unless you know what you are doing. ####

check_sites() {
        # Declare $is variable
        is=0

        # Start control
        for i in "${checkSite[@]}"
        do
                CURL=$(curl -s --head $i)
                if echo $CURL | grep "200 OK" > /dev/null
                then
                        # add entry to log file if logging enabled
                        if [ $logStatus == "yes" ]
                        then
                                echo `date +%F` `date +%T` "$i" "Host up" >> $logPath/$logName
                        else
                                # if logging set to no send to null
                                echo "" > /dev/null
                        fi
                else
                        # Collect all sites that do not respond as they should for further processing.
                        siteArray[ $is ]="${i}"
                        (( is++ ))
                fi
        done

    # Check to see if any sites been reported as down.
        if [ ${#siteArray[@]} -ne 0 ]
        then
                # Test each failed site in a given amount of times.
                for ((n=1;n<=$rInterval;n++))
                do
                        # Go through failed sites again to eliminate temporary glicthes.
                        for i in "${siteArray[@]}"
                        do
                                CURL=$(curl -s --head $i)
                                if echo $CURL | grep "200 OK" > /dev/null
                                then
                                        # remove succesful sites from array.
                                        delete=(${i})
                                        siteArray=( "${siteArray[@]/$delete}" )
                                else
                                        # Keeps failed site in array.
                                        echo "" > /dev/null
                                fi
                        done

                        # Clean empty lines in siteArray
                        tmpArray=()
                        for value in "${siteArray[@]}"
                        do
                                [[ $value != "" ]] && tmpArray+=($value)
                        done
                        siteArray=("${tmpArray[@]}")
                        unset tmpArray

                        # Debug
                        #for i in "${siteArray[@]}"
                        #do
                        #       echo ${i}
                        #done

                        # Sleeps for an amount of time between checking site status again.
                        sleep $rTime
                done
        fi

        # notification action
        if [ ${#siteArray[@]} -ne 0 ]
        then
        #echo ${#siteArray[@]}
                # Send an email with status
                if [ $sendMail == "yes" ]
                then
                        # Temp path for mailbody.txt
                        tmpPath=/tmp

                        # Set mail subject
                        mailSubject="Connectivity test failed"

                        # Build mail body
                        echo "Hi" > $tmpPath/mailbody.txt
                        echo "" >> $tmpPath/mailbody.txt
                        echo "One or more servers is not responding as the should, see complete list below." >> $tmpPath/mailbody.txt
                        echo "" >> $tmpPath/mailbody.txt
                        for i in "${siteArray[@]}"
                        do
                                echo ${i} >> $tmpPath/mailbody.txt
                        done
                        #echo "Test - Array size:" ${#siteArray[@]} >> $tmpPath/mailbody.txt
                        echo "" >> $tmpPath/mailbody.txt
                        echo "Sent:" `date +%Y-%m-%d` `date +%H:%M` >> $tmpPath/mailbody.txt
                        echo "" >> $tmpPath/mailbody.txt
                        echo "Regards" >> $tmpPath/mailbody.txt
                        echo "" >> $tmpPath/mailbody.txt
                        echo "Your $(cat /etc/hostname) server." >> $tmpPath/mailbody.txt

                        # Send data
                        MAILRC=/dev/null mailx -n
                        if [ $smtpAuth = "no" ]
                        then
                                env MAILRC=/dev/null from=$mailFrom smtp=$smtpHost:$smtpPort mailx -v -n -s "$mailSubject" $mailTo  <$tmpPath/mailbody.txt
                        fi
                        if [ $smtpAuth = "yes" ]
                        then
                                env MAILRC=/dev/null from=$mailFrom smtp=$smtpHost:$smtpPort smtp-auth-user=$smtpUser smtp-auth-password=$smtpPass smtp-use-starttls=yes ssl-verify=ignore smtp-auth=login mailx -n -s "$mailSubject" $mailTo <$tmpPath/mailbody.txt
                        fi

                        # Remove temporary mailbody.txt file
                        rm $tmpPath/mailbody.txt
                else
                        echo "" > /dev/null
                fi

                # add entry to log file if logging enabled
                if [ $logStatus == "yes" ]
                then
                        for i in "${siteArray[@]}"
                        do
                                echo `date +%F` `date +%T` ${i} "Host down" >> $logPath/$logName
                        done
                fi
        fi
}

mail_test() {
        # Temp path for mailbody.txt
        tmpPath=/tmp

        # Set mail subject
        mailSubject="Mail test"

        # Build mail body
        echo "Hi" > $tmpPath/mailbody.txt
        echo "" >> $tmpPath/mailbody.txt
        echo "This is a test mail to see that the mail function works." >> $tmpPath/mailbody.txt
        echo "" >> $tmpPath/mailbody.txt
        echo "Sent:" `date +%Y-%m-%d` `date +%H:%M` >> $tmpPath/mailbody.txt
        echo "" >> $tmpPath/mailbody.txt
        echo "Regards" >> $tmpPath/mailbody.txt
        echo "" >> $tmpPath/mailbody.txt
        echo "Your $(cat /etc/hostname) server." >> $tmpPath/mailbody.txt

        # Send data
        MAILRC=/dev/null mailx -n
        if [ $smtpAuth = "no" ]
        then
                env MAILRC=/dev/null from=$mailFrom smtp=$smtpHost:$smtpPort mailx -v -n -s "$mailSubject" $mailTo  <$tmpPath/mailbody.txt
        fi
        if [ $smtpAuth = "yes" ]
        then
                env MAILRC=/dev/null from=$mailFrom smtp=$smtpHost:$smtpPort smtp-auth-user=$smtpUser smtp-auth-password=$smtpPass smtp-use-starttls=yes ssl-verify=ignore smtp-auth=login mailx -n -s "$mailSubject" $mailTo <$tmpPath/mailbody.txt
        fi

        # Remove temporary mailbody.txt file
        rm $tmpPath/mailbody.txt
}

case $1 in
        --check)
                check_sites
        ;;
    --mail-test)
                mail_test
    ;;
        *)
                script_help
        ;;
esac