diff --git a/.gitignore b/.gitignore index 7c9b3a5..251f61e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ -check_webservice_load.conf -BAK/* +*.swl +/conf/*.conf +/BAK/* diff --git a/check_remote_websites.sh b/check_remote_websites.sh new file mode 100755 index 0000000..b92aae7 --- /dev/null +++ b/check_remote_websites.sh @@ -0,0 +1,247 @@ +#!/usr/bin/env bash + + +working_dir="$(dirname $(realpath $0))" +conf_file="${working_dir}/conf/check_remote_websites.conf" + +LOCK_DIR="/tmp/check_remote_websites.LOCK" + +declare -a alert_email_arr + +# ------------- +# --- Read Configurations from $conf_file +# ------------- + +if [[ ! -f "$conf_file" ]]; then + echo "" + echo -e " [ Fatal ] Configuration file '$(basename ${conf_file})' not found!" + echo "" + echo -e "\tScript terminated.." + echo "" + exit 1 +else + source "$conf_file" +fi + +for _email in $alert_email_addresses ; do + alert_email_arr+=("$_email") +done + +[[ -n "$sender_address" ]] || sender_address="check_websites@$(hostname -f)" +[[ -n "$content_type" ]] || content_type='Content-Type: text/plain;\n charset="utf-8"' + +[[ -n "$TIME_OUT" ]] || TIME_OUT=240 +TIME_OUT_MAX="$(expr ${TIME_OUT} + 5)" + + +# ------------- +# - Job is already running? +# ------------- + +# - If job already runs, stop execution.. +# - +if mkdir "$LOCK_DIR" 2> /dev/null ; then + + ## - Remove lockdir when the script finishes, or when it receives a signal + trap clean_up SIGHUP SIGINT SIGTERM + +else + + datum="$(date +"%d.%m.%Y %H:%M")" + + msg="[ Error ]: A previos instance of \"`basename $0`\" seems already be running.\n\n Exiting now.." + + echo "" + echo "[ Error ]: A previos instance of that script \"`basename $0`\" seems already be running." + echo "" + echo -e " Exiting now.." + echo "" + + for _email in ${alert_email_arr[@]} ; do + echo -e "To:${_email}\n${content_type}\nSubject:Error cronjob `basename $0` -- $datum\n${msg}\n" \ + | sendmail -F "Error `hostname -f`" -f $sender_address $_email + done + + exit 1 + +fi + + +# ------------- +# --- Some functions +# ------------- + +clean_up() { + + # Perform program exit housekeeping + rm -rf "$LOCK_DIR" + exit $1 +} + +echononl(){ + if $terminal && $LOGGING ; then + echo X\\c > /tmp/shprompt$$ + if [ `wc -c /tmp/shprompt$$ | awk '{print $1}'` -eq 1 ]; then + echo -e -n "$*\\c" 1>&2 + else + echo -e -n "$*" 1>&2 + fi + rm /tmp/shprompt$$ + fi +} + +fatal(){ + echo "" + if $terminal ; then + echo -e "[ \033[31m\033[1mError\033[m ]: $*" + echo "" + echo -e "\t\033[31m\033[1mScript was interupted\033[m!" + else + echo " [ Fatal ]: $*" + echo "" + echo " Script was terminated...." + fi + echo "" + clean_up 1 +} + +error (){ + echo "" + if $terminal ; then + echo -e "\t[ \033[31m\033[1mError\033[m ]: $*" + else + echo "[ Error ]: $*" + fi + echo "" +} + +warn (){ + echo "" + if $terminal ; then + echo -e "\t[ \033[33m\033[1mWarning\033[m ]: $*" + else + echo "[ Warning ]: $*" + fi + echo "" +} + +echo_done() { + if $terminal && $LOGGING ; then + echo -e "\033[75G[ \033[32mdone\033[m ]" + else + if $LOGGING ; then + echo " [ done ]" + fi + fi +} +echo_ok() { + if $terminal && $LOGGING ; then + echo -e "\033[75G[ \033[32mok\033[m ]" + else + if $LOGGING ; then + echo " [ ok ]" + fi + fi +} +echo_failed(){ + if $terminal && $LOGGING ; then + echo -e "\033[75G[ \033[1;31mfailed\033[m ]" + else + if $LOGGING ; then + echo " [ failed ]" + fi + fi +} +echo_skipped() { + if $terminal && $LOGGING ; then + echo -e "\033[75G[ \033[33m\033[1mskipped\033[m ]" + else + if $LOGGING ; then + echo " [ skipped ]" + fi + fi +} + + + + +# ------------- +# --- Check some prerequisites +# ------------- + +# - Running in a terminal? +# - +if [[ -t 1 ]] ; then + terminal=true + LOGGING=true +else + terminal=false + LOGGING=false +fi + + +# - Systemd supported ? +# - +systemd=$(which systemd) +systemctl=$(which systemctl) + +systemd_supported=false +if [[ -n "$systemd" ]] && [[ -n "$systemctl" ]] ; then + systemd_supported=true +fi + + +if $LOGGING ; then + echo "" +fi + +if [[ -n "$WEBSITES_TO_CHECK" ]] ; then + for _site in $WEBSITES_TO_CHECK ; do + echononl " Check site \033[1m$_site\033[m .." + response="$(curl --max-time $TIME_OUT --connect-timeout 30 \ + -I -k -L --write-out %{http_code} --silent --output /dev/null $_site 2> ${LOCK_DIR}/err.msg)" + if [[ "$response" -eq 200 ]]; then + echo_ok + else + echo_failed + if [[ -s "$(cat ${LOCK_DIR}/err.msg)" ]] ; then + error "$(cat ${LOCK_DIR}/err.msg)" + fi + websites_failed_arr+=("$_site") + fi + done +else + warn "No Website to check given (empty var 'WEBSITES_TO_CHECK')" +fi + +if [[ ${#websites_failed_arr[@]} -gt 0 ]] ; then + #if [[ ${#websites_failed_arr[@]} -eq 1 ]] ; then + # err_msg="\n[ Error ]: Website ${websites_failed_arr[0]} does NOT respond as exspected\n" + # error "Website ${websites_failed_arr[0]} does NOT respond as exspected" + #else + error "Some Websites does not respond as expected:" + err_msg="\n[ Error ]: Some Websites does not respond as expected:\n\n" + for _site in ${websites_failed_arr[@]} ; do + err_msg+=" $_site\n" + if $LOGGING ; then + echo -e "\t \033[1m$_site\033[m" + #echo -e "\n\tWebsite \033[1m$_site\033[m does NOT respond as exspected" + else + echo " $_site" + fi + done + #fi + + datum="$(date +"%d.%m.%Y %H:%M")" + for _email in ${alert_email_arr[@]} ; do + echo -e "To:${_email}\n${content_type}\nSubject:Error: Website(s) not reachable - ${datum}\n$err_msg" \ + | /usr/sbin/sendmail -F "$company - Check Websites" -f $sender_address $_email + done +fi + +if $LOGGING ; then + echo "" +fi +clean_up 0 + +#curl --max-time 35 --connect-timeout 30 -L --write-out %{http_code} --silent --output /dev/null https:/ats.warenform.de diff --git a/conf/check_remote_websites.conf.sample b/conf/check_remote_websites.conf.sample new file mode 100644 index 0000000..5e00e25 --- /dev/null +++ b/conf/check_remote_websites.conf.sample @@ -0,0 +1,58 @@ +#--------------------------------------- +#----------------------------- +# Settings for script check_remote_websites.sh +#----------------------------- +#--------------------------------------- + +# - WEBSITES_TO_CHECK +# - +# - Contains a list of websites, whichn will be checked +# - +# - blank seperated list of URLs +# - +# - Example: WEBSITES_TO_CHECK=" +# - https://webmail.oopen.de +# - https://webmail.initiativenserver.de +# - https://webmail.interventionistische-linke.org +# - http://www.oopen.de" +# - +WEBSITES_TO_CHECK="" + +# - TIME_OUT +# - +# - Timeout for curl request of each website +# - +# - Defaults to: TIME_OUT=240 +# - +#TIME_OUT=240 + + +# --- +# - E-Mail settings for sending script messages +# --- + +# - company +# - +# - Example: company="O.OPEN" +# - +company="" + +# - sender_address +# - +# - Defaults to: sender_address="root@$(hostname -f)" +# - +#sender_address="check_websites@$(hostname -f)" + +# - content_type +# - +# - Defaults to: content_type='Content-Type: text/plain;\n charset="utf-8"' +# - +#content_type='Content-Type: text/plain;\n charset="utf-8"' + +# - alert_email_addresses +# - +# - blank separated list of e-mail addresses +# +# - Example: alert_email_addresses="ckubu@oopen.de axel@warenform.net" +# - +alert_email_addresses=""