Last active
August 29, 2015 14:06
-
-
Save ccoenen/c8487672ddc8f73419a9 to your computer and use it in GitHub Desktop.
upnp2mrtg fork
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# | |
# MINOR CHANGES IN THIS VERSION, NOT ACTUALLY THE ORIGINAL RELEASE! | |
# | |
# upnp2mrtg - Monitoring AVM Fritz!Box With MRTG | |
# This versions have been reported as working: 3030, 5050, 7050, 7141 and 7170 | |
# | |
# Copyright (C) 2005 Michael Tomschitz <[email protected]> | |
# | |
# This program is free software; you can redistribute it and/or modify | |
# it under the terms of the GNU General Public License as published by | |
# the Free Software Foundation; either version 2 of the License, or | |
# (at your option) any later version. | |
# | |
# This program is distributed in the hope that it will be useful, | |
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
# GNU General Public License for more details. | |
# | |
# You should have received a copy of the GNU General Public License | |
# along with this program; if not, write to the Free Software | |
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
# | |
# The latest version of this software can be obtained here: | |
# | |
# http://www.ANetzB.de/upnp2mrtg/ | |
# | |
# $Id: upnp2mrtg,v 1.9-experiment 2008/02/09 15:37:57 tomcat Exp $ | |
# default configuration | |
HOST="fritz.box" | |
PORT="49000" | |
NETCAT="netcat" | |
# if available, read configuration | |
test -f /etc/upnp2mrtg.cfg && . /etc/upnp2mrtg.cfg | |
case $NETCAT in | |
bash) nc="shell_netcat" ;; | |
netcat) nc="netcat" ;; | |
nc_q) nc="nc -q 1" ;; | |
*) nc="nc" ;; | |
esac | |
ver_txt="upnp2mrtg, version $Revision: 1.9 $ | |
Copyright (C) 2005-2008 Michael Tomschitz | |
upnp2mrtg comes with ABSOLUTELY NO WARRANTY. This is free software, | |
and you are welcome to redistribute it under certain conditions." | |
help_txt="\ | |
Usage: upnp2mrtg [-a <host>] [-p <port>] [-P] [-d] [-h] [-i] [-t] [-v] [-V] | |
-a <host> hostname or ip adress of upnp device (default: $HOST) | |
-p <port> port to connect (default: $PORT) | |
-P query packets instead of bytes | |
-s output connection duration in seconds instead of formatted | |
-d debug mode | |
-h show help and exit | |
-i <outfile> get all igd description | |
-t test connection | |
-v show upnp2mrtg version and exit | |
-V be verbose for testing | |
" | |
while getopts "a:dhi:p:PstvV" option; do | |
case $option in | |
a) HOST="$OPTARG";; | |
d) set -x ;; | |
h) echo "$help_txt"; exit 0;; | |
i) MODE=igd; IGDXML="$OPTARG";; | |
p) PORT="$OPTARG";; | |
P) PACKET_MODE=true;; | |
s) OUTPUT_SECONDS=true;; | |
t) MODE="test";; | |
v) echo "$ver_txt"; exit 0;; | |
V) VERBOSE=true;; | |
?) exit 1;; | |
esac | |
done | |
# functions | |
request_header () { | |
echo "POST /upnp/control/$4 HTTP/1.0 | |
HOST: $1:$2 | |
CONTENT-LENGTH: $3 | |
CONTENT-TYPE: text/xml; charset=\"utf-8\" | |
SOAPACTION: \"urn:schemas-upnp-org:service:$5:1#$6\"" | |
} | |
soap_form () { | |
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?> | |
<s:Envelope | |
xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" | |
s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"> | |
<s:Body> | |
<u:$1 xmlns:u=\"urn:schemas-upnp-org:service:$2:1\" /> | |
</s:Body> | |
</s:Envelope>" | |
} | |
get_attribute () { | |
_get_attribute_start_tag () { echo "${2#*<$1>*}"; } | |
_get_attribute_end_tag () { echo "${2%*</$1>*}"; } | |
_get_attribute_tag () { _get_attribute_start_tag "$1" "`_get_attribute_end_tag $1 "$2"`" ; } | |
_get_attribute_num () { echo $#; } | |
if [ `_get_attribute_num $1` -gt 1 ]; then | |
get_attribute "${1#* }" "`_get_attribute_tag "${1%% *}" "$2"`" | |
else | |
_get_attribute_tag "${1}" "$2" | |
fi | |
} | |
modulo_time () { | |
echo "$((${1} / ${2})) $((${1} % ${2}))" | |
} | |
shell_netcat () { | |
exec 5<>/dev/tcp/$1/$2; cat >&5; cat <&5; | |
} | |
get_response () { | |
_get_response_rs="`echo "$1" | $nc $HOST $PORT 2>/dev/null`" | |
_get_response_rv=$? | |
echo "$_get_response_rs" | |
if ${VERBOSE:-false}; then | |
echo | |
echo "---- REQUEST: ----">&2 | |
echo "$1">&2 | |
echo "---- RESPONSE: ----">&2 | |
echo "$_get_response_rs">&2 | |
echo "----">&2 | |
fi | |
return $_get_response_rv | |
} | |
request_header_http () { | |
echo "GET $3 HTTP/1.0 | |
" | |
} | |
ws_operation () { | |
request="`soap_form "$1" WANCommonInterfaceConfig`" | |
post="`request_header $HOST $PORT ${#request} WANCommonIFC1 WANCommonInterfaceConfig "$1"` | |
$request" | |
rs="`get_response "$post"`" | |
if [ $? -eq 0 ]; then | |
echo "`get_attribute "$2" "$rs"`" | |
fi | |
} | |
case $MODE in | |
test) | |
echo "GET /any.xml HTTP/1.0 | |
" | $nc $HOST $PORT >/dev/null | |
if [ $? -eq 0 ]; then | |
echo "OK"; exit 0 | |
else | |
echo "Connection Error"; exit 1 | |
fi;; | |
igd) | |
if [ -f "$IGDXML" ];then | |
echo "ERROR: $IGDXML: File exists.">&2; exit 1 | |
fi | |
for igd in any igdconnSCPD igddesc igddslSCPD igdicfgSCPD; do | |
request="`request_header_http $HOST $PORT /$igd.xml` | |
" | |
rs="`get_response "$request"`" | |
if [ "$IGDXML" = "-" ]; then | |
echo "---- $igd.xml ---- | |
$rs" | |
else | |
echo "---- $igd.xml ---- | |
$rs" >> "$IGDXML" | |
fi | |
done;; | |
*) | |
# get uptime | |
request="`soap_form GetStatusInfo WANIPConnection`" | |
post="`request_header $HOST $PORT ${#request} WANIPConn1 WANIPConnection GetStatusInfo` | |
$request" | |
# rs="`echo "$post" | $nc $HOST $PORT 2>/dev/null`" | |
rs="`get_response "$post"`" | |
if [ $? -eq 0 ]; then | |
ut=`get_attribute NewUptime "$rs"` | |
# calculate days + hours, minutes, seconds | |
s=`modulo_time $ut 60` | |
m=`modulo_time ${s% *} 60` | |
h=`modulo_time ${m% *} 24` | |
fi | |
# get data in/out | |
if ${PACKET_MODE:-false}; then | |
b1="`ws_operation GetTotalPacketsReceived NewTotalPacketsReceived`" | |
b2="`ws_operation GetTotalPacketsSent NewTotalPacketsSent`" | |
else | |
b1="`ws_operation GetAddonInfos NewTotalBytesReceived`" | |
b2="`ws_operation GetAddonInfos NewTotalBytesSent`" | |
fi | |
b3=`ws_operation GetCommonLinkProperties NewLayer1DownstreamMaxBitRate` | |
b4=`ws_operation GetCommonLinkProperties NewLayer1UpstreamMaxBitRate` | |
# output for mrtg | |
if ${OUTPUT_SECONDS:-false}; then | |
printf "%s\n%s\n%s\n%s\n%s\nFRITZ!Box\n" \ | |
"${b1:-UNKNOWN}" "${b2:-UNKNOWN}" "${b3:-UNKNOWN}" "${b4:-UNKNOWN}" "${ut:-UNKNOWN}" | |
else | |
printf "%s\n%s\n%d days %.2d:%.2d:%.2d h (online)\nFRITZ!Box\n" \ | |
"${b1:-UNKNOWN}" "${b2:-UNKNOWN}" "${h% *}" "${h#* }" "${m#* }" "${s#* }" | |
fi | |
;; | |
esac |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment