#!/bin/bash # FritzBox.sh ### Quelle des Codekerns - Target of die skript core ############################ # https://github.com/Tscherno/Fritzbox.sh # # compatible with Fritz.box Firmware 6.50 and higher, Horst Schmid, 2016-01-05 # # /usr/local/addons/cuxd/user/FritzBox.sh # ################################################################################# ##################################################################################################################################################### # Der Vorbereitungs-Job muss per cron gestartet werden - Thie prerunning job must be started by cron # # /etc/cron.d/fritzbox # # 3,8,13,18,23,28,33,38,43,48,53,58 * * * * root //fritzbox7490.sh -p (-u >login user if required>] #okay # # # # Jo Hartmann V17.0126 # ##################################################################################################################################################### # Deklaration der Dateipfade # Declaration of file pathes CPWMD5="/etc/munin/plugins/pre2run/cpwmd5" FRITZLOGIN="/login_sid.lua" FRITZWEBCM="/cgi-bin/webcm" FRITZHOME="/home/home.lua" CURLFILE="/var/tmp/FritzBoxCurl.txt" LOGFILE="/var/log/fritzbox7490.log" PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" # Wie werden die Webseiten aufgerufen # How to call web pages WEBCLIENT="curl -s" # Deklaration sonstiger Variablen # Declaration of other variables FritzBoxURL="192.168.0.111" Username="" Passwd="" Debug=false # Verarbeitung der Aufruf-Parameter # Processing the script parameters while getopts u:p:d OPT; do case $OPT in u) Username=$OPTARG ;; p) Passwd=$OPTARG ;; d) Debug=true LOGFILE="/dev/stdout" ;; esac done # Anmelde-Routine, Quelle: https://github.com/Tscherno/Fritzbox.sh, Horst Schmid, 2016-01-05 # Login routine, source: https://github.com/Tscherno/Fritzbox.sh, Horst Schmid, 2016-01-05 LOGIN(){ # We need an SessionInfoChallenge SID from the FB. Combined with the PW an # MD5-Checksum needs to be calculated and send back. # 1. Are we already logged in? htmlLoginPage=$($WEBCLIENT "$FritzBoxURL$FRITZLOGIN") SessionInfoChallenge=$(echo "$htmlLoginPage" | sed -n '/.*\([^<]*\)<.*/s//\1/p') SessionInfoSID=$(echo "$htmlLoginPage" | sed -n '/.*\([^<]*\)<.*/s//\1/p') if $Debug; then echo "****************** LOGIN: Challenge $SessionInfoChallenge" >> $LOGFILE; fi if [ "$SessionInfoSID" = "0000000000000000" ]; then if $Debug; then echo "****************** LOGIN: Keine gueltige SID - login aufbauen" >> $LOGFILE; fi CPSTR="$SessionInfoChallenge-$Passwd" # Combine Challenge and Passwd if $Debug; then echo "****************** LOGIN: CPSTR: $CPSTR -> MD5" >> $LOGFILE; fi MD5=`$CPWMD5 $CPSTR` # here the MD5 checksum is calculated RESPONSE="$SessionInfoChallenge-$MD5" if $Debug; then echo "****************** LOGIN: login senden und SID herausfischen, MD5: $MD5" >> $LOGFILE; fi GETDATA="?username=$Username&response=$RESPONSE" if $Debug; then echo "****************** LOGIN: $GETDATA" >> $LOGFILE; fi SID=$($WEBCLIENT "$FritzBoxURL$FRITZLOGIN$GETDATA" | sed -n '/.*\([^<]*\)<.*/s//\1/p') if $Debug; then echo "****************** Logged in with SID=$SID" >> $LOGFILE; fi else SID=$SessionInfoSID if $Debug; then echo "****************** LOGIN: Bereits erfolgreiche SID: $SID" >> $LOGFILE; fi fi if [ "$SID" = "0000000000000000" ]; then if $Debug; then echo "****************** LOGIN: ERROR - Konnte keine gueltige SID ermitteln" >> $LOGFILE; fi fi } # Definition der Linienlänge für die Ausgabe (MEZ oder MESZ?) # Definition of line length for output (CET or CEST?) MESZ=$(echo $(date +"%Z") | awk '{print length($0)-3}') line="#####################################################" if [ "$MESZ" = "1" ]; then line="${line}#";fi # Die alte Log-Datei für Differenzbetrachtungen sichern # Save the old log file for differential views if ! $Debug; then mv ${LOGFILE} ${LOGFILE}.1; fi # Startmeldung zur Ausgabe # Start message for output echo $line > $LOGFILE echo "Startzeit der Auswertung: $(date +"%d.%m.%Y %X %Z") #" >> $LOGFILE echo $line >> $LOGFILE echo >> $LOGFILE # Abrage der Hard-/Software-Eigenschaften, funktioniert ohne Anmeldung! # Query the hardware / software properties, works without login! jBoxInfo=$($WEBCLIENT "$FritzBoxURL/jason_boxinfo.xml") fbName=$(echo "$jBoxInfo" | grep 'j:Name' | sed -n 's,.*>\(.*\)\(.*\)\(.*\)\(.*\)\(.*\) /var/log/fritzbox7490.txt # Verarbeitung der Daten der Seite Online-Monitor # Processing the data of the Online Monitor page _AKT_IP=$(echo "$_PAGE_INET_STAT" | sed -n 's/.*
IP-Adresse: \(.*\)<\/span>.*/\1/p') _VERBAB=$(echo "$_PAGE_INET_STAT" | sed -n 's/.*verbunden seit \(.*\)<\/span>,.*/\1/p') # Verarbeitung der Daten der Seite Online-Zähler # Processing the data of the page Online counter _ONLINE_Zeit=$(echo "${_PAGE_INET_COUN}" | tr -d "\n" | awk 'match($0,/Heute<\/td>.*"time">([0-9,:]+)<\/td>.*Gestern/,arr){print arr[1]};') _VOLUMEN_T=$(echo "${_PAGE_INET_COUN}" | tr -d "\n" | awk 'match($0,/Heute<\/td>.*"vol">([0-9]+)<\/td>.*"vol">.*"vol">.*Gestern/,arr){print arr[1]};') _VOLUMEN_U=$(echo "${_PAGE_INET_COUN}" | tr -d "\n" | awk 'match($0,/Heute<\/td>.*"vol">.*"vol">([0-9]+)<\/td>.*"vol">.*Gestern/,arr){print arr[1]};') _VOLUMEN_D=$(echo "${_PAGE_INET_COUN}" | tr -d "\n" | awk 'match($0,/Heute<\/td>.*"vol">.*"vol">.*"vol">([0-9]+)<\/td>.*Gestern/,arr){print arr[1]};') _ANZ_VERB=$(echo "${_PAGE_INET_COUN}" | tr -d "\n" | awk 'match($0,/Heute<\/td>.*"conn">([0-9,:]+)<\/td>.*Gestern/,arr){print arr[1]};') # Verarbeitung der Daten der Seite DSL-Informationen --> DSL # Processing the data of the page DSL information -> DSL _DATARATE_IN=$(echo "${_PAGE_DSL_STATS}" | awk 'match($0,/Aktuelle Datenrate.*"c3">([0-9]+)<\/td>.*Nahtlose Ratenadaption/,arr){print arr[1]};') _DATARATE_OUT=$(echo "${_PAGE_DSL_STATS}" | awk 'match($0,/Aktuelle Datenrate.*"c4">([0-9]+)<\/td>.*Nahtlose Ratenadaption/,arr){print arr[1]};') _LATENZ_IN=$(echo "${_PAGE_DSL_STATS}" | tr -d "\n" | awk 'match($0,/Latenz.*"c3">([0-9]+) ms<\/td>/,arr){print arr[1]};') _LATENZ_OUT=$(echo "${_PAGE_DSL_STATS}" | tr -d "\n" | awk 'match($0,/Latenz.*"c4">([0-9]+) ms<\/td>/,arr){print arr[1]};') _NOISEMARGIN_IN=$(echo "${_PAGE_DSL_STATS}" | tr -d "\n" | awk 'match($0,/rabstandsmarge.*"c3">([0-9]+)<\/td>.*gertausch/,arr){print arr[1]};') _NOISEMARGIN_OUT=$(echo "${_PAGE_DSL_STATS}" | tr -d "\n" | awk 'match($0,/rabstandsmarge.*"c4">([0-9]+)<\/td>.*gertausch/,arr){print arr[1]};') _DSLLINELOSS_IN=$(echo "${_PAGE_DSL_STATS}" | tr -d "\n" | awk 'match($0,/Leitungsd.*"c3">([0-9]+)<\/td>.*Leistungsreduzierung/,arr){print arr[1]};') _DSLLINELOSS_OUT=$(echo "${_PAGE_DSL_STATS}" | tr -d "\n" | awk 'match($0,/Leitungsd.*"c4">([0-9]+)<\/td>.*Leistungsreduzierung/,arr){print arr[1]};') _DSLESERROR_IN=$(echo "${_PAGE_DSL_STATS}" | tr -d "\n" | awk 'match($0,/FRITZ!Box<\/td>.*"c2">([0-9]+)<\/td>.*Vermittlungsstelle/,arr){print arr[1]};') _DSLESERROR_OUT=$(echo "${_PAGE_DSL_STATS}" | tr -d "\n" | awk 'match($0,/Vermittlungsstelle<\/td>.*"c2">([0-9]+)<\/td>.*table>/,arr){print arr[1]};') _DSLSESERROR_IN=$(echo "${_PAGE_DSL_STATS}" | tr -d "\n" | awk 'match($0,/FRITZ!Box<\/td>.*"c3">([0-9]+)<\/td>.*Vermittlungsstelle/,arr){print arr[1]};') _DSLSESERROR_OUT=$(echo "${_PAGE_DSL_STATS}" | tr -d "\n" | awk 'match($0,/Vermittlungsstelle<\/td>.*"c3">([0-9]+)<\/td>.*table>/,arr){print arr[1]};') _DSLCRCERROR01_IN=$(echo "${_PAGE_DSL_STATS}" | tr -d "\n" | awk 'match($0,/FRITZ!Box<\/td>.*"c4">([0-9,.]+)<\/td>.*Vermittlungsstelle/,arr){print arr[1]};') _DSLCRCERROR01_OUT=$(echo "${_PAGE_DSL_STATS}" | tr -d "\n" | awk 'match($0,/Vermittlungsstelle<\/td>.*"c4">([0-9,.]+)<\/td>.*table>/,arr){print arr[1]};') _DSLCRCERROR15_IN=$(echo "${_PAGE_DSL_STATS}" | tr -d "\n" | awk 'match($0,/FRITZ!Box<\/td>.*"c5">([0-9]+)<\/td>.*Vermittlungsstelle/,arr){print arr[1]};') _DSLCRCERROR15_OUT=$(echo "${_PAGE_DSL_STATS}" | tr -d "\n" | awk 'match($0,/Vermittlungsstelle<\/td>.*"c5">([0-9]+)<\/td>.*table>/,arr){print arr[1]};') #Resyncs der letzten 24h auslesen #_RESYNCS=$(echo "$_PAGE_STATS_GRAPH" | awk 'BEGIN {summe = 0}; match($0, /\[\"sar:status\/StatResync\"\] = \"(.*)\"/, arr){for(i = 1; i <= split(arr[1],splitted,",");i++){summe += int(splitted[i])}};END {print summe};') # Schreiben der Ausgabe Datei # Write the output file echo "AVM Typenbezeichnung: $fbName" >> $LOGFILE echo "Firmeware-Version: $fbVersion1" >> $LOGFILE echo "FritzOS: $fbVersion2" >> $LOGFILE echo "Hardware-Version: $fbHardw" >> $LOGFILE echo "Reversion: $fbRev" >> $LOGFILE echo "Seriennummer: $fbSN" >> $LOGFILE echo "Aktuelle IP-Adresse: $_AKT_IP" >> $LOGFILE echo "Verbunden seit: $_VERBAB" >> $LOGFILE echo "Datenrate IN: $_DATARATE_IN kbit/s" >> $LOGFILE echo "Datenrate OUT: $_DATARATE_OUT kbit/s" >> $LOGFILE echo "Latenz Empfangsrichtung: $_LATENZ_IN ms" >> $LOGFILE echo "Latenz Senderichtung: $_LATENZ_OUT ms" >> $LOGFILE echo "Störabstandsmarge IN: $_NOISEMARGIN_IN db" >> $LOGFILE echo "Störabstandsmarge OUT: $_NOISEMARGIN_OUT db" >> $LOGFILE echo "Leitungsdämpfung IN: $_DSLLINELOSS_IN db" >> $LOGFILE echo "Leitungsdämpfung OUT: $_DSLLINELOSS_OUT db" >> $LOGFILE echo "Sek. m. Fehlern (ES) IN: $_DSLESERROR_IN" >> $LOGFILE echo "Sek. m. Fehlern (ES) OUT: $_DSLESERROR_OUT" >> $LOGFILE echo "Sek. m. v. Fehl. (SES) IN: $_DSLSESERROR_IN" >> $LOGFILE echo "Sek. m. v. Fehl. (SES) OUT: $_DSLSESERROR_OUT" >> $LOGFILE echo "CRC Fehler (je Min) IN: $_DSLCRCERROR01_IN" >> $LOGFILE echo "CRC Fehler (je Min) OUT: $_DSLCRCERROR01_OUT" >> $LOGFILE echo "CRC Fehler (15 Min) IN: $_DSLCRCERROR15_IN" >> $LOGFILE echo "CRC Fehler (15 Min) OUT: $_DSLCRCERROR15_OUT" >> $LOGFILE echo "Stunden Online: $_ONLINE_Zeit" >> $LOGFILE echo "Datenvolumen (gesamt): $_VOLUMEN_T MB" >> $LOGFILE echo "Datenvolumen (upload): $_VOLUMEN_U MB" >> $LOGFILE echo "Datenvolumen (download): $_VOLUMEN_D MB" >> $LOGFILE echo "Anz. der Verbindungen: $_ANZ_VERB" >> $LOGFILE echo >> $LOGFILE echo $line >> $LOGFILE echo "Stoppzeit der Auswertung: $(date +"%d.%m.%Y %X %Z") #" >> $LOGFILE echo $line >> $LOGFILE #echo ${_PAGE_INET_COUN}