#!/bin/bash # RC_OK=0 RC_WARN=1 RC_CRIT=2 RC_UNKNOWN=3 CURL=/usr/bin/curl usage() { echo "usage: check_fritz -d -h hostname -f [-w ] [-c crit]" echo " -d: enable debug output" echo " -w: warn limit, depends on function" echo " -c: critical limit, depends on function" echo "functions:" echo " linkuptime = connection time in seconds." echo " connection = connection status". echo " ipaddress = external ip address". echo " upstream = maximum upstream on current connection." echo " downstream = maximum downstream on current connection." exit ${RC_UNKNOWN} } require_number() { VAR=$1 MSG=$2 if [[ ! "${VAR}" =~ ^[0-9]+$ ]] ; then echo "ERROR - ${MSG} (${VAR})" exit ${RC_UNKNOWN} fi } require_ip() { VAR=$1 MSG=$2 # echo "Check if ip address: $1" if [[ ! "${VAR}" =~ ^[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3} ]] ; then echo "ERROR - ${MSG} (${VAR})" exit ${RC_UNKNOWN} fi } find_xml_value() { XML=$1 VAL=$2 echo "${XML}" | grep "${VAL}" | sed "s/<${VAL}>\([^<]*\)<\/${VAL}>/\1/" } check_greater() { VAL=$1 WARN=$2 CRIT=$3 MSG=$4 if [ ${VAL} -gt ${WARN} ] || [ ${WARN} -eq 0 ]; then echo "OK - ${MSG}" exit ${RC_OK} elif [ ${VAL} -gt ${CRIT} ] || [ ${CRIT} -eq 0 ]; then echo "WARNING - ${MSG}" exit ${RC_WARN} else echo "CRITICAL - ${MSG}" exit ${RC_CRIT} fi } HOSTNAME=192.168.178.1 PORT=49000 CHECK=linkuptime DEBUG=0 WARN=0 CRIT=0 while getopts h:f:w:c:d OPTNAME; do case "${OPTNAME}" in h) HOSTNAME="${OPTARG}" ;; f) CHECK="${OPTARG}" ;; d) DEBUG=1 ;; w) WARN="${OPTARG}" ;; c) CRIT="${OPTARG}" ;; *) usage ;; esac done case ${CHECK} in linkuptime|connection) VERB=GetStatusInfo URL=WANIPConn1 NS=WANIPConnection ;; ipaddress) VERB=GetExternalIPAddress URL=WANIPConn1 NS=WANIPConnection ;; downstream|upstream) VERB=GetAddonInfos URL=WANCommonIFC1 NS=WANCommonInterfaceConfig ;; *) echo "ERROR - Unknown service check ${CHECK}" exit ${RC_UNKNOWN} ;; esac STATUS=`curl "http://${HOSTNAME}:${PORT}/igdupnp/control/${URL}" \ -H "Content-Type: text/xml; charset="utf-8"" \ -H "SoapAction:urn:schemas-upnp-org:service:${NS}:1#${VERB}" \ -d " " \ -s` if [ "$?" -ne "0" ]; then echo "ERROR - Could not retrieve status from FRITZ!Box" exit ${RC_CRIT} fi if [ ${DEBUG} -eq 1 ]; then echo "DEBUG - Status:" echo "${STATUS}" fi case ${CHECK} in linkuptime) UPTIME=$(find_xml_value "${STATUS}" NewUptime) require_number "${UPTIME}" "Could not parse uptime" HOURS=$((${UPTIME}/3600)) MINUTES=$(((${UPTIME}-(${HOURS}*3600))/60)) SECONDS=$((${UPTIME}-(${HOURS}*3600)-(${MINUTES}*60))) RESULT="Link uptime ${UPTIME} seconds (${HOURS}h ${MINUTES}m ${SECONDS}s)| uptime=${UPTIME} " check_greater ${UPTIME} 1 0 "${RESULT}" ;; ipaddress) IPADDRESS=$(find_xml_value "${STATUS}" NewExternalIPAddress) require_ip "${IPADDRESS}" "Could not parse IP address" RESULT="The external IP address is: ${IPADDRESS}" echo ${RESULT} ;; upstream) UPSTREAM=$(find_xml_value "${STATUS}" NewByteSendRate) require_number "${UPSTREAM}" "Could not parse upstream" KBUP=$((${UPSTREAM}/1024)) RESULT="Upstream ${UPSTREAM} bits per second | Upstream=${UPSTREAM}" check_greater ${UPSTREAM} ${WARN} ${CRIT} "${RESULT} " ;; downstream) DOWNSTREAM=$(find_xml_value "${STATUS}" NewByteReceiveRate) require_number "${DOWNSTREAM}" "Could not parse downstream" KBDOWN=$((${DOWNSTREAM}/1024)) RESULT="Downstream ${DOWNSTREAM} bits per second | Downstream=${DOWNSTREAM}" check_greater ${DOWNSTREAM} ${WARN} ${CRIT} "${RESULT}" ;; connection) STATE=$(find_xml_value "${STATUS}" NewConnectionStatus) case ${STATE} in Connected) echo "OK - Connected" exit ${RC_OK} ;; Connecting | Disconnected) echo "WARNING - Connection lost" exit ${RC_WARN} ;; *) echo "ERROR - Unknown connection state ${STATE}" exit ${RC_UNKNOWN} ;; esac ;; *) echo "ERROR - Unknown service check ${CHECK}" exit ${RC_UNKNOWN} esac