[Fli4l_dev] iconv für fli4l oder Alternative gesucht

Thomas Grunenberg tho_gru at gmx.de
So Mai 12 20:44:31 CEST 2019


Am 12.05.2019 um 13:30 schrieb Stefan Puschek:
> Hallo NG,
> 
> mein fli4l (4.0er Version) soll meine dahinter hängende Fritzbox 7270v2 
> überwachen - genauer gesagt, er soll prüfen ob alle 4 eingetragenen 
> VOIP-Acounts "laufen".
> 
> Bevor jemand fragt: der Router muss die Aufgabe übernehmen, denn der 
> eisfair läuft nicht 24/7...
> 
> Die gesuchte Info sieht man in der Web-Oberfläche der FB unter 
> Übersicht; auf meinem eisfair läuft mein Skript - am Router fehlt mir 
> dafür iconv...
> 
> das Skript (im Netz gefunden und von mir angepasst):
> #!/bin/bash
> _BOXURL="http://192.168.6.134" # die FB
> _USERNAME=""
> _PASSWORD="geheim"
> _REQUESTPAGE="/home/home.lua" # Seite Übersicht
> _OUTPUTFILE="OUTPUT.TXT"
> _CHALLENGE=$(curl -s ${_BOXURL}/login.lua | grep "^g_challenge" | awk -F 
> '"' '{ print $2 }')
> _MD5=$(echo -n ${_CHALLENGE}"-"${_PASSWORD} | iconv -f ISO8859-1 -t 
> UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}')
> _RESPONSE="${_CHALLENGE}-${_MD5}"
> _SID=$(curl -i -s -k -d 'response='${_RESPONSE} -d 'page=' -d 
> "username=${_USERNAME}" "${_BOXURL}/login.lua" | grep "Location:" | grep 
> -Poi 'sid=[a-f\d]+' | cut -d '=' -f2)
> curl -s "${_BOXURL}${_REQUESTPAGE}" -d "sid=${_SID}" | grep -c 
> "Rufnummern aktiv"
> 
> was macht in diesem Fall iconv? es wandelt einen ascii-String um in 
> utf-16le
> 
> aus $68 $61 $6c $6c $6f
> wird $68 $00 $61 $00 $6C $00 $6C $00 $6F $00
> d.h. an jedes byte wird ein Nullbyte angehängt;
> 
> wie mache ich das am Besten auf dem Router?
> 
> Gibts ein Paket, das iconv enthält?
> 
> Wer weiss was?
> 
> Groetjes
> Stefan
Moin, moin,

Wenn ich es richtig verstehe, ist folgender Befehl der entscheidende:
curl -s "${_BOXURL}${_REQUESTPAGE}" -d "sid=${_SID}" ...

Das Problem ist, wo kommt die SID her, richtig? Ich mache das so:
Ich hole mir die URL, um das Telefonbuch zu laden (obwohl mich das 
Telefonbuch nicht interessiert) und extrahiere dort die SID...
FBphoneBookURL=$(curl -s --anyauth -u "${FBuser}:${FBpass}" --insecure \
  -X POST "https://${FBaddr}:${FBportSSL}${control_url}" \
  -H 'Content-Type: text/xml; charset=\"utf-8\"' \
  -H "SoapAction:${urn}#GetPhonebook" \
  -d "<?xml version=\"1.0\" encoding=\"utf-8\"?>
         <s:Envelope xmlns:s=\"http://schemas.xmlsoap.or/soap/envelope/\"
 
s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">
         <s:Body>
         <u:GetPhonebook xmlns:u=\"${urn}\">
	<NewPhonebookID>0</NewPhonebookID>
         </u:GetPhonebook>
         </s:Body>
         </s:Envelope>" |
grep "NewPhonebookURL" | sed -e 's/<NewPhonebookURL>//g' -e 
's/<\/NewPhonebookURL>//g' )
SID=$(echo "${FBphoneBookURL}" | sed -n -e 
's/.*\?sid=\([0-9a-f]*\)\&.*/\1/p')

Die control_url und die urn entstehen so:
control_url="$(get_control_url x_contact)"
urn="$(get_urn X_AVM-DE_OnTel:1)"

Dafür werden folgende Funktionen genutzt:
get_control_url() {
curl -s "http://${FBaddr}:${FBport}/tr64desc.xml" |
sed -e '/'"${1}"'<\/controlURL\>/!d' -e 's/^<controlURL>//' -e 
's/<\/controlURL>.*$//'
}
get_urn() {
curl -s "http://${FBaddr}:${FBport}/tr64desc.xml" |
sed -e '/'"${1}"'<\/serviceType\>/!d' -e 's/^<serviceType>//' -e 
's/<\/serviceType>.*$//'
}

Anbei habe ich das komplette Script gehängt, mit dem ich das Systemlog 
meiner FritzBox auf den fli lade, bevor ich einen Reset der FritzBox 
durchführe.

Gruß
Thomas
-------------- nächster Teil --------------
#!/bin/sh

set -u

FBaddr="fritz.box"
FBport="48765"

FBuser="..." # FritzBox UPnP User, muss in der FritzBox aktiviert sein
FBpass="..." # Passwort für obigen User

get_control_url() {
	curl -s "http://${FBaddr}:${FBport}/tr64desc.xml" |
		sed -e '/'"${1}"'<\/controlURL\>/!d' -e 's/^<controlURL>//' -e 's/<\/controlURL>.*$//'
}


get_urn() {
	curl -s "http://${FBaddr}:${FBport}/tr64desc.xml" |
		sed -e '/'"${1}"'<\/serviceType\>/!d' -e 's/^<serviceType>//' -e 's/<\/serviceType>.*$//'
}

control_url="$(get_control_url deviceinfo)"
urn="$(get_urn DeviceInfo:1)"

FBportSSL=$(curl -s -m 5 -X POST "http://${FBaddr}:${FBport}${control_url}" \
              -H "Content-Type: text/xml; charset=\"utf-8\"" \
              -H "SoapAction:${urn}#GetSecurityPort" \
              -d "<?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:GetSecurityPort xmlns:u=\"${urn}\">
                  </u:GetSecurityPort>
                  </s:Body>
                  </s:Envelope>" | \
              grep 'NewSecurityPort' | sed 's#^.*<NewSecurityPort>\(.*\)<.*$#\1#')

#echo SSL port for TR-064 is ${FBportSSL}

control_url="$(get_control_url x_contact)"
urn="$(get_urn X_AVM-DE_OnTel:1)"

FBphoneBookURL=$(curl -s --anyauth -u "${FBuser}:${FBpass}" --insecure \
    -X POST "https://${FBaddr}:${FBportSSL}${control_url}" \
    -H 'Content-Type: text/xml; charset=\"utf-8\"' \
    -H "SoapAction:${urn}#GetPhonebook" \
    -d "<?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:GetPhonebook xmlns:u=\"${urn}\">
	<NewPhonebookID>0</NewPhonebookID>
        </u:GetPhonebook>
        </s:Body>
        </s:Envelope>" |
	grep "NewPhonebookURL" | sed -e 's/<NewPhonebookURL>//g' -e 's/<\/NewPhonebookURL>//g' )
	
SID=$(echo "${FBphoneBookURL}" | sed -n -e 's/.*\?sid=\([0-9a-f]*\)\&.*/\1/p')

filter_log() {
	echo "######## $(date -u) ########"
	sed -e 's/\],\[/\],\n\[/g' |  # Zeilen splitten
	sed -Ee 's/^.*\[{1,}"/"/' |   # Zeilenanfang
	sed -Ee 's/"\]{1,}.*$/"/'     # Zeilenende
}

LOGdir=/var/lib/persistent/fb-test
LOGfile=FB-log-$(date +"%Y%m%d").log
FILE="${LOGdir}/${LOGfile}"

curl -s --insecure "https://${FBaddr}/query.lua?mq_log=logger:status/log&sid=${SID}" |
filter_log >> "${FILE}"


Mehr Informationen über die Mailingliste Fli4l_dev