Add script 'check-connectivity.sh'.
This commit is contained in:
parent
8c8cbba378
commit
67b6587917
479
check-connectivity.sh
Executable file
479
check-connectivity.sh
Executable file
@ -0,0 +1,479 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
script_name="$(basename $(realpath $0))"
|
||||||
|
working_dir="$(dirname $(realpath $0))"
|
||||||
|
|
||||||
|
conf_file="${working_dir}/conf/${script_name%%.*}.conf"
|
||||||
|
|
||||||
|
LOCK_DIR="/tmp/$(basename $0).$$.LOCK"
|
||||||
|
log_file="${LOCK_DIR}/${script_name%%.*}.log"
|
||||||
|
|
||||||
|
PROBLEM_FOUND=false
|
||||||
|
|
||||||
|
LINK_UP=false
|
||||||
|
RESTART_CHECK_FILE="/tmp/${script_name%%.*}.NEED-RESTART"
|
||||||
|
|
||||||
|
|
||||||
|
# ----------
|
||||||
|
# Base Function(s)
|
||||||
|
# ----------
|
||||||
|
|
||||||
|
clean_up() {
|
||||||
|
|
||||||
|
# Perform program exit housekeeping
|
||||||
|
rm -rf "$LOCK_DIR"
|
||||||
|
blank_line
|
||||||
|
exit $1
|
||||||
|
}
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
|
||||||
|
|
||||||
|
[[ -n "$1" ]] && error "$1"
|
||||||
|
|
||||||
|
|
||||||
|
[[ $terminal ]] && echo -e "
|
||||||
|
\033[1mUsage:\033[m
|
||||||
|
|
||||||
|
$(basename $0)
|
||||||
|
|
||||||
|
\033[1mDescription\033[m
|
||||||
|
|
||||||
|
Script checks presence of some basic network settings and do some basic connectivity
|
||||||
|
tests. If fundamental problems found, then restart machine if this i not the firts time.
|
||||||
|
If this i the first time, file \033[1m$RESTART_CHECK_FILE\033[m is created.
|
||||||
|
|
||||||
|
\033[1mOptions\033[m
|
||||||
|
|
||||||
|
No Options present
|
||||||
|
|
||||||
|
\033[1mFiles\033[m
|
||||||
|
|
||||||
|
$conf_file: Configuration file
|
||||||
|
|
||||||
|
\033[1mExample:\033[m
|
||||||
|
|
||||||
|
Chech connectivity of this machine
|
||||||
|
|
||||||
|
$(basename $0)
|
||||||
|
|
||||||
|
"
|
||||||
|
|
||||||
|
clean_up 1
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
echononl(){
|
||||||
|
if $terminal ; 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
|
||||||
|
}
|
||||||
|
|
||||||
|
error (){
|
||||||
|
echo ""
|
||||||
|
if $terminal ; then
|
||||||
|
echo -e " [ \033[31m\033[1mError\033[m ] $*"
|
||||||
|
else
|
||||||
|
echo " [ Error ] $*"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
warn (){
|
||||||
|
echo ""
|
||||||
|
if $terminal ; then
|
||||||
|
echo -e " [ \033[33m\033[1mWarn\033[m ] $*"
|
||||||
|
else
|
||||||
|
echo " [ Warn ] $*"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
info (){
|
||||||
|
if $terminal ; then
|
||||||
|
echo ""
|
||||||
|
echo -e " [ \033[32m\033[1mInfo\033[m ] $*"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
echo_ok() {
|
||||||
|
if $terminal ; then
|
||||||
|
echo -e "\033[75G[ \033[32mok\033[m ]"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
echo_failed(){
|
||||||
|
if $terminal ; then
|
||||||
|
echo -e "\033[75G[ \033[1;31mfailed\033[m ]"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
echo_skipped() {
|
||||||
|
if $terminal ; then
|
||||||
|
echo -e "\033[75G[ \033[33m\033[1mskipped\033[m ]"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
trim() {
|
||||||
|
local var="$*"
|
||||||
|
var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters
|
||||||
|
var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters
|
||||||
|
echo -n "$var"
|
||||||
|
}
|
||||||
|
|
||||||
|
blank_line() {
|
||||||
|
if $terminal ; then
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Check if at least one interface has physical link is up
|
||||||
|
#
|
||||||
|
online() {
|
||||||
|
|
||||||
|
# Call this functionin a subshell to avoid exiting main programm
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# $(online) && echo -e '\033[32m\033[1mOnline\033[m' || echo -e '\033[31m\033[1mOFFLINE\033[m'
|
||||||
|
#
|
||||||
|
find /sys/class/net/ -maxdepth 1 -mindepth 1 \
|
||||||
|
! -name "*lo*" \
|
||||||
|
! -name "*tun*" \
|
||||||
|
! -name "*veth*" \
|
||||||
|
-exec sh -c 'cat "$0"/carrier 2>&1' {} \; | grep -q -E '^1$' && exit 0
|
||||||
|
|
||||||
|
# using ethtool also works:
|
||||||
|
#
|
||||||
|
#-exec sh -c 'ethtool $(basename "$0") 2>&1' {} \; | grep 'ink detected' | grep -i -q 'yes' && exit 0
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# ----------
|
||||||
|
# - Jobhandling
|
||||||
|
# ----------
|
||||||
|
|
||||||
|
# - Run 'clean_up' for signals SIGHUP SIGINT SIGTERM
|
||||||
|
# -
|
||||||
|
trap clean_up SIGHUP SIGINT SIGTERM
|
||||||
|
|
||||||
|
# - Create lock directory '$LOCK_DIR"
|
||||||
|
#
|
||||||
|
mkdir "$LOCK_DIR"
|
||||||
|
|
||||||
|
|
||||||
|
# ----------
|
||||||
|
# - Some checks ..
|
||||||
|
# ----------
|
||||||
|
|
||||||
|
# - Running in a terminal?
|
||||||
|
# -
|
||||||
|
if [[ -t 1 ]] ; then
|
||||||
|
terminal=true
|
||||||
|
else
|
||||||
|
terminal=false
|
||||||
|
fi
|
||||||
|
|
||||||
|
# - Print help?
|
||||||
|
# -
|
||||||
|
if [[ "$(trim $*)" = "-h" ]] || [[ "$(trim $*)" = "--help" ]] ; then
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# ==========
|
||||||
|
# - Begin Main Script
|
||||||
|
# ==========
|
||||||
|
|
||||||
|
# ----------
|
||||||
|
# - Headline
|
||||||
|
# ----------
|
||||||
|
|
||||||
|
if $terminal ; then
|
||||||
|
echo ""
|
||||||
|
echo -e "\033[1m----------\033[m"
|
||||||
|
echo -e "\033[32m\033[1mRunning script \033[m\033[1m$script_name\033[32m .. \033[m"
|
||||||
|
echo -e "\033[1m----------\033[m"
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ----------
|
||||||
|
# Read Configurations from $conf_file
|
||||||
|
# ----------
|
||||||
|
|
||||||
|
|
||||||
|
# - Give your default values here
|
||||||
|
# -
|
||||||
|
DEFAULT_IPV6_PRESENT=true
|
||||||
|
DEFAULT_CHECK_HOSTS="www.oopen.de www.google.de www.heise.de www.debian.org"
|
||||||
|
|
||||||
|
echononl "Load Configurations from file '$(basename "$conf_file")'."
|
||||||
|
if [[ -f "$conf_file" ]]; then
|
||||||
|
source "$conf_file"
|
||||||
|
echo_ok
|
||||||
|
else
|
||||||
|
echo_skipped
|
||||||
|
warn "No configuration file found. Loading script default values.."
|
||||||
|
fi
|
||||||
|
|
||||||
|
[[ -z "$IPV6_PRESENT" ]] && IPV6_PRESENT="$DEFAULT_IPV6_PRESENT"
|
||||||
|
[[ -z "$DNS_CHECK_HOSTS" ]] && DNS_CHECK_HOSTS="$DEFAULT_CHECK_HOSTS"
|
||||||
|
[[ -z "$HTTPS_CHECK_HOSTS" ]] && HTTPS_CHECK_HOSTS="$DEFAULT_CHECK_HOSTS"
|
||||||
|
|
||||||
|
|
||||||
|
blank_line
|
||||||
|
|
||||||
|
|
||||||
|
echononl "Check if at least one interface has physical link is up"
|
||||||
|
if ! $(online) ; then
|
||||||
|
echo_failed
|
||||||
|
PROBLEM_FOUND=true
|
||||||
|
else
|
||||||
|
echo_ok
|
||||||
|
LINK_UP=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $LINK_UP ; then
|
||||||
|
info 'Machine has at least one interface with physical link is up.'
|
||||||
|
else
|
||||||
|
error 'Machine is OFFLINE'
|
||||||
|
if [[ -f "$RESTART_CHECK_FILE" ]] ; then
|
||||||
|
|
||||||
|
_file_mod_time=$(date --utc --reference=$RESTART_CHECK_FILE +%s)
|
||||||
|
_now=$(date +%s)
|
||||||
|
_delta=$(($_now-$_file_mod_time))
|
||||||
|
echo "_delta=: $_delta"
|
||||||
|
|
||||||
|
if [[ $_delta -gt 3900 ]] ; then
|
||||||
|
touch "$RESTART_CHECK_FILE"
|
||||||
|
else
|
||||||
|
/sbin/reboot -f
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
touch "$RESTART_CHECK_FILE"
|
||||||
|
fi
|
||||||
|
clean_up 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# ---
|
||||||
|
# Routing ok?
|
||||||
|
# ---
|
||||||
|
|
||||||
|
# Determin IPv4 default gateway(s)
|
||||||
|
#
|
||||||
|
DEFAULT_GW_4="$(/sbin/ip -4 route | awk '/default/ { print $3 }')"
|
||||||
|
if [[ -z "$DEFAULT_GW_4" ]] ; then
|
||||||
|
DEFAULT_GW_4="$(/sbin/ip -4 route | awk '/nexthop/ { print $3 }')"
|
||||||
|
fi
|
||||||
|
|
||||||
|
declare -a DEFAULT_GW_4_ARR=()
|
||||||
|
for _ip in $DEFAULT_GW_4 ; do
|
||||||
|
DEFAULT_GW_4_ARR+=("$_ip")
|
||||||
|
done
|
||||||
|
|
||||||
|
echononl "Check if IPv4 default route is set.."
|
||||||
|
|
||||||
|
if [[ ${#DEFAULT_GW_4_ARR[@]} -gt 0 ]] ; then
|
||||||
|
echo_ok
|
||||||
|
if [[ ${#DEFAULT_GW_4_ARR[@]} -eq 1 ]] ; then
|
||||||
|
info "Default IPv4 Gateway(s): ${DEFAULT_GW_4_ARR[@]}"
|
||||||
|
else
|
||||||
|
msg="Default IPv4 Gateway(s): ${DEFAULT_GW_4_ARR[0]}"
|
||||||
|
for index in "${!DEFAULT_GW_4_ARR[@]}"; do
|
||||||
|
[[ $index -eq 0 ]] && continue
|
||||||
|
msg="$msg
|
||||||
|
${DEFAULT_GW_4_ARR[$index]}"
|
||||||
|
done
|
||||||
|
info "$msg"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo_failed
|
||||||
|
PROBLEM_FOUND=true
|
||||||
|
|
||||||
|
error "No default route IPV4is set."
|
||||||
|
|
||||||
|
if [[ -f "$RESTART_CHECK_FILE" ]] ; then
|
||||||
|
|
||||||
|
_file_mod_time=$(date --utc --reference=$RESTART_CHECK_FILE +%s)
|
||||||
|
_now=$(date +%s)
|
||||||
|
_delta=$(($_now-$_file_mod_time))
|
||||||
|
echo "_delta=: $_delta"
|
||||||
|
|
||||||
|
if [[ $_delta -gt 3900 ]] ; then
|
||||||
|
touch "$RESTART_CHECK_FILE"
|
||||||
|
else
|
||||||
|
/sbin/reboot -f
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
touch "$RESTART_CHECK_FILE"
|
||||||
|
fi
|
||||||
|
clean_up 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Determin IPv6 default gateway(s)
|
||||||
|
#
|
||||||
|
if $IPV6_PRESENT ; then
|
||||||
|
DEFAULT_GW_6="$(/sbin/ip -6 route | awk '/default/ { print $3 }')"
|
||||||
|
|
||||||
|
declare -a DEFAULT_GW_6_ARR=()
|
||||||
|
for _ip in $DEFAULT_GW_6 ; do
|
||||||
|
DEFAULT_GW_6_ARR+=("$_ip")
|
||||||
|
done
|
||||||
|
|
||||||
|
echononl "Check if IPv6 default route is set.."
|
||||||
|
if [[ ${#DEFAULT_GW_6_ARR[@]} -gt 0 ]] ; then
|
||||||
|
echo_ok
|
||||||
|
if [[ ${#DEFAULT_GW_6_ARR[@]} -eq 1 ]] ; then
|
||||||
|
info "Default IPv6 Gateway(s): ${DEFAULT_GW_6_ARR[@]}"
|
||||||
|
else
|
||||||
|
msg="Default IPv6 Gateway(s): ${DEFAULT_GW_6_ARR[0]}"
|
||||||
|
for index in "${!DEFAULT_GW_6_ARR[@]}"; do
|
||||||
|
[[ $index -eq 0 ]] && continue
|
||||||
|
msg="$msg
|
||||||
|
${DEFAULT_GW_6_ARR[$index]}"
|
||||||
|
done
|
||||||
|
info "$msg"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo_failed
|
||||||
|
|
||||||
|
warn "No default route IPv6 is set."
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# ---
|
||||||
|
# Nameservice ok?
|
||||||
|
# ---
|
||||||
|
|
||||||
|
FOUND_NS_PROBLEM=true
|
||||||
|
|
||||||
|
# Check if nameserver entry at /etc/resolv.conf ist present
|
||||||
|
#
|
||||||
|
echononl "Check if nameserver entry at /etc/resolv.conf ist present.."
|
||||||
|
FIRST_NS="$(cat /etc/resolv.conf | awk '/nameserver/ {print $2}' | awk 'NR == 1 {print; exit}')"
|
||||||
|
if [[ -n "$FIRST_NS" ]] ; then
|
||||||
|
echo_ok
|
||||||
|
FOUND_NS_PROBLEM=false
|
||||||
|
|
||||||
|
info "Found nameserver \033[1m$FIRST_NS\033[m at '/etc/resolv.conf'."
|
||||||
|
else
|
||||||
|
echo_failed
|
||||||
|
error "No nameserverentry at '/etc/resolv.conf' found."
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Check if nameservice works..
|
||||||
|
#
|
||||||
|
echononl "Check if first nameserver works.."
|
||||||
|
if ! $FOUND_NS_PROBLEM ; then
|
||||||
|
|
||||||
|
FOUND_NS_PROBLEM=true
|
||||||
|
|
||||||
|
for _hostname in $DNS_CHECK_HOSTS ; do
|
||||||
|
if [[ -n "$(dig +short @$FIRST_NS $_hostname)" ]] ; then
|
||||||
|
FOUND_NS_PROBLEM=false
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if $FOUND_NS_PROBLEM ; then
|
||||||
|
echo_failed
|
||||||
|
PROBLEM_FOUND=true
|
||||||
|
|
||||||
|
error "First nameserver located at /etc/resolv.conf does not work properly."
|
||||||
|
|
||||||
|
if [[ -f "$RESTART_CHECK_FILE" ]] ; then
|
||||||
|
|
||||||
|
_file_mod_time=$(date --utc --reference=$RESTART_CHECK_FILE +%s)
|
||||||
|
_now=$(date +%s)
|
||||||
|
_delta=$(($_now-$_file_mod_time))
|
||||||
|
echo "_delta=: $_delta"
|
||||||
|
|
||||||
|
if [[ $_delta -gt 3900 ]] ; then
|
||||||
|
touch "$RESTART_CHECK_FILE"
|
||||||
|
else
|
||||||
|
/sbin/reboot -f
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
touch "$RESTART_CHECK_FILE"
|
||||||
|
fi
|
||||||
|
clean_up 1
|
||||||
|
else
|
||||||
|
echo_ok
|
||||||
|
|
||||||
|
info "Nameserver works as expected."
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo_skipped
|
||||||
|
warn "Test was not triggert because of nameserver problems.."
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# ---
|
||||||
|
# Website reachable?
|
||||||
|
# ---
|
||||||
|
|
||||||
|
FOUND_CHECK_HOST_PROBLEM=true
|
||||||
|
|
||||||
|
# Check if some websites reachable..
|
||||||
|
#
|
||||||
|
for _host in $HTTPS_CHECK_HOSTS ; do
|
||||||
|
echononl "Check if website \033[1m$_host\033[m is reachable.."
|
||||||
|
if ! $FOUND_NS_PROBLEM ; then
|
||||||
|
|
||||||
|
case "$(curl -s --max-time 2 -I $_host | sed 's/^[^ ]* *\([0-9]\).*/\1/; 1q')" in
|
||||||
|
[23]) echo_ok
|
||||||
|
FOUND_CHECK_HOST_PROBLEM=false
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
5) echo_failed
|
||||||
|
error "The web proxy won't let us through"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*) echo_failed
|
||||||
|
error "Something is wrong with HTTP connections. Go check it."
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
echo_skipped
|
||||||
|
warn "Test was not triggert because of nameserver problems.."
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
if $FOUND_CHECK_HOST_PROBLEM ; then
|
||||||
|
|
||||||
|
PROBLEM_FOUND=true
|
||||||
|
|
||||||
|
if [[ -f "$RESTART_CHECK_FILE" ]] ; then
|
||||||
|
|
||||||
|
_file_mod_time=$(date --utc --reference=$RESTART_CHECK_FILE +%s)
|
||||||
|
_now=$(date +%s)
|
||||||
|
_delta=$(($_now-$_file_mod_time))
|
||||||
|
echo "_delta=: $_delta"
|
||||||
|
|
||||||
|
if [[ $_delta -gt 3900 ]] ; then
|
||||||
|
touch "$RESTART_CHECK_FILE"
|
||||||
|
else
|
||||||
|
/sbin/reboot -f
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
touch "$RESTART_CHECK_FILE"
|
||||||
|
fi
|
||||||
|
clean_up 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
! $PROBLEM_FOUND && rm -f "$RESTART_CHECK_FILE"
|
||||||
|
clean_up 0
|
33
conf/check-connectivity.conf.sample
Normal file
33
conf/check-connectivity.conf.sample
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# -------------------------------------------
|
||||||
|
# - Settings for script check-connectivity.sh
|
||||||
|
# -------------------------------------------
|
||||||
|
|
||||||
|
# - IPV6_PRESENT
|
||||||
|
# -
|
||||||
|
# - Possible values: true/false
|
||||||
|
# -
|
||||||
|
# - Example:
|
||||||
|
# - IPV6_PRESENT=false
|
||||||
|
# -
|
||||||
|
# - Default value: true
|
||||||
|
# -
|
||||||
|
#IPV6_PRESENT=true
|
||||||
|
|
||||||
|
|
||||||
|
# - DNS_CHECK_HOSTS
|
||||||
|
# -
|
||||||
|
# - Blank sepatated list of hostnames checked by lokal nameservice simply
|
||||||
|
# - for their ip-addresses
|
||||||
|
# -
|
||||||
|
# - Defaults to: DNS_CHECK_HOSTS="www.oopen.de www.google.com www.heise.de"
|
||||||
|
# -
|
||||||
|
#DNS_CHECK_HOSTS="www.oopen.de www.google.com www.heise.de www.debian.org"
|
||||||
|
|
||||||
|
|
||||||
|
# - HTTPS_CHECK_HOSTS
|
||||||
|
# -
|
||||||
|
# - Blank sepatated list of websites which will be checked for accessibility
|
||||||
|
# -
|
||||||
|
# - Defaults to: HTTPS_CHECK_HOSTS="www.oopen.de www.google.com www.heise.de"
|
||||||
|
# -
|
||||||
|
#HTTPS_CHECK_HOSTS="www.oopen.de www.google.com www.heise.de www.debian.org"
|
Loading…
Reference in New Issue
Block a user