Posts mit dem Label sh werden angezeigt. Alle Posts anzeigen
Posts mit dem Label sh werden angezeigt. Alle Posts anzeigen

28.02.2014

LTE-Empfangsqualität abfragen (Diagnose-Logfile)

Neulich hab ich mich beschwert, dass man beim alten Modell des LTE-Routers (Telekom LTE 1 bzw. Huawei B390s) nicht die Empfangsqualität abfragen kann.

Und es geht doch! Zwar ziemlich versteckt in den Tiefen der "Erweiterten Einstellungen", aber man kann es doch abfragen.

Wie üblich in Ihrem freundlichen Service-Blog auch gleich wieder die Möglichkeit, diese Daten automatisiert per Skript abzufragen und damit ggfs. regelmäßig zu protokollieren.

Der übliche Trick: mit dem ersten wget-Aufruf geschieht der Login, das Session-Cookie wird gespeichert, und mit dem zweiten Aufruf wird dann die interessante Seite abgerufen.
#!/bin/sh

PATH=/opt/bin:/opt/sbin${PATH:+:$PATH}

H=vodafonemobile.cpe
C=/tmp/cookies.txt
U1="http://"$H"/login.cgi"
U2="http://"$H"/diagnosis_export.cgi?configId=$(date +%s)&FileName=diagnosis.txt"

wget --save-cookies "$C" \
     --keep-session-cookies \
     -q --tries=1 \
     -O /dev/null \
     --post-data 'Username=admin&Password=yourpw' \
     "$U1"

wget --load-cookies "$C" \
     -q --tries=1 \
     -O - \
     "$U2" | \
awk '
{if (NR>=5&&NR<=42){print}}
'

rm -f "$C"
Der Output sieht dann in etwa so aus wie da unten.

Besonders interessant sind die Zeilen bei "RSRP" und "RSRQ". Mit den Werten -90dBm und -8 dB zeigt mir der Router 4 von 5 Balken an. Laut Telekom-Auskunft sind Werte bis -60/-2 möglich, das wäre super-super-optimal. Wenn man das Gerät in der Ausrichtung verändert, darf  RSRP ruhig etwas schlechter werden, falls man dadurch RSRQ verbessern kann. Optimal wäre, wenn beide Werte größer werden (-90 --> -60, -8 --> -2).

Auch sehr hübsch: man erfährt den Funkmast, mit dem der Router verbunden ist, und zwar mit dem Parameter "CellId".

~~~~~~Product Information~~~~~~
003    Model:               B390s-2                    PASS
004    Software Version:    V200R001C35SP12            PASS
005    Hardware Version:    B390-B390RW2A Ver.C        PASS
006    SN:                  4UA5TC1110400163           PASS
007    IMEI:                354637040077555            PASS
008    LAN MAC Address:     F4:C7:14:**:**:**           PASS
009    WLAN MAC Address:    F4:C7:14:**:**:**           PASS
010    Check AT-Port:        Available                  PASS

~~~~~~LTE State~~~~~~
011    Dialing Mode:                                   PASS
012    APN:                  internet.home              PASS
013    DNS:                  8.8.8.8                    PASS
014    PDN Type:             IPv4                       PASS
015    Service Status:       Normal Service            PASS
016    Connection Status:    LTE STATE CONNECTED       PASS
017    Frequency:            816000 kHz               PASS
018    Bandwidth:            10MHz                    PASS
019    CellId:               392                       PASS

020    IP Address:           2.162.**.***             PASS
021    RSRP:                 -90dBm                    PASS

022    RSSI:                 -66dBm                    PASS
023    RSRQ:                 -7dB                      PASS 

024    Roam:                  no                       PASS
025    Antenna State:        Built-In                  PASS

~~~~~~DHCP~~~~~~
026    Gateway IP Address:    192.168.42.1           PASS
027    DHCP Enabled:          false                  PASS
028    Subnet Mask:          255.255.255.0          PASS
029    DHCP_ip_pool_start:    N/A                    PASS
030    DHCP_ip_pool_end:     N/A                     PASS
031    DHCP_lease_time(s):    N/A                     PASS

~~~~~~SIM/PIN State~~~~~~
032    sim_state:             SIM Card detected       PASS
033    PIN code:             READY                    PASS
 

05.02.2014

Notfall-Update für Adobe Flash player - mal wieder

Und schon wieder ein außerplanmäßiges Update des Flash-Players für Windows, Mac OS und Linux. heise empfiehlt aufgrund der Dringlichkeit die sofortige manuelle Installation. Das Problem wird schon von Bösewichten ausgenutzt. Man sollte sich nicht auf das automatischen Update-Verfahren verlassen, das in den Flash-Player eingebaut ist.

Wie üblich in ihrem freundlichen Service-Blog die passende Automation zum Herunterladen und Installieren.
Falls ein Proxy verwendet wird, das "rem" bzw. "#" entfernen.

Das Tool wget wird bei Windows noch benötigt wie hier beschrieben. Bei Linux sollte es schon vorhanden sein, da es von vielen anderen Programmen intern verwendet wird.

Für Windows wie üblich beide Varianten, ActiveX und Netscape Plugin.
@echo off

rem set http_proxy=http://192.168.100.100:3128/
set VNP=12.0.0.70
set VAX=12.0.0.70

set H=fpdownload.macromedia.com
set P=/get/flashplayer/current/licensing/win
set AX=install_flash_player_12_active_x.exe
set NP=install_flash_player_12_plugin.exe

wget http://%H%%P%/%AX% -O flash-%VAX%_ax.exe
.\flash-%VAX%_ax -install
wget http://%H%%P%/%NP% -O flash-%VNP%_np.exe
.\flash-%VNP%_np -install

Für Linux 64 bit rpm (als root ausführen oder "sudo rpm" schreiben):
#!/bin/sh

# http_proxy=http://192.168.100.100:3128/

VL=11.2.202.341

H=fpdownload.macromedia.com
PL=/get/flashplayer/current/licensing/linux

DL() { wget -N "$1/$2"; mv "$2" "$3"; }

echo Linux 64 bit rpm ...
DL http://${H}${PL} \
   flash-plugin-${VL}-release.x86_64.rpm \
   flash-${VL}.x86_64.rpm
rpm -F --force
flash-${VL}.x86_64.rpm
[Update 20140205: Tippfehler in der Windows-Versionsnummer, Hinweis auf wget für Windows]
[Update 20140221: Neue Flashversionsnummern gemäß 2. heise-Meldung]

05.06.2013

Verbrauchtes LTE-Volumen protokollieren

Ich beschäftige mich weiter mit der Telekom, heute zur Abwechslung mal wieder ein technischer Beitrag, der beschreibt, wie man den Überblick über das schon verbrauchte Volumen behalten kann.

Bekanntlich ist unser Haushalt seit letztem Jahr mit LTE unterwegs im Internet. Bedauerlicherweise gibt es nur Verträge mit Pseudo-Flatrate, die nach einer bestimmten verbrauchten Datenmenge im Monat von der Nominalgeschwindigkeit ("bis zu" 16 MBit/s) auf DSL-light-Geschwindigkeit (384 KBit/s) gedrosselt werden.

Zu dieser Kontingentierung gehört übrigens auch mein Upload. Wenn ich also Bilder hochlade, um Papierabzüge zu bestellen, wird das voll gezählt.

Um das verbrauchte Volumen abzurufen, gibt es eine Info-Seite bei der Telekom, die mir berichtet, wieviel von meinem Kontingent schon verbraucht ist. Mit ein bißchen Getrickse in einem Skript kann ich daraus die zwei Zahlen extrahieren, die ich wissen will, und die protokollieren.

Mein Artikel besteht also aus zwei Teilen: dem Skript zum Abfragen, und einem (wahlweise zwei) Cron-Jobs zur regelmäßigen Aufzeichnung.

Das Skript ist sehr einfach: es verwendet eine "regular expression" in perl, um die Zahlen und die zugehörigen Maßeinheiten (KB, MB, GB) aus dem HTML-Wust herauszufischen.

Übrigens muss man kein Linux haben, um diese kleinen Hilfsmittel einzusetzen: wget, perl und die GNU Kommandozeilenwerkzeuge gibt es auch für Windows. Alternativ kann man auch die komplette CygWin-Umgebung installieren. Mit einem Cron-Job wird es etwas schwieriger, aber wenn man einen PC hat, der immer angeschaltet ist, kann man mit dem Windows-Befehl at auch so etwas zusammenbauen. Die Hilfefunktion wird mit at /? aufgerufen.

Zurück zum eigentlichen Thema: mein erster Versuch, um das HTML anzuschauen, war übrigens diese Kommandozeile:

wget -SO- http://pass.telekom.de/portal/home |\
  perl -pe 's!>!>\n!go' |\
  grep -B1 verbraucht

Diese drei Befehle fragen die Info-Seite ab (wget), und nach jedem HTML-Tag wird mit einem simplen perl-Einzeiler ein Zeilenumbruch eingefügt. Durch die nun entstandene Zeilenstruktur kann der "grep"-Befehl ein Stichwort finden ("verbraucht") und die gesamte Zeile, in der dieses Stichwort vorkommt, ausgeben. Außerdem hätte ich gern die Zeile davor ebenfalls in der Anzeige (der Switch -B anzahl zeigt soviele Zeilen vorher - "Before" - ebenfalls an - diese Option funktioniert nur beim GNU grep, nicht bei AIX, Solaris, etc.).

Mit genau demselben Prinzip, nur etwas aufgehübscht, funktioniert die eigentliche Protokollierung. Da das Werk als Cron-Job laufen soll, muss ich mich selbst um vernünftige Umgebungsvariablen wie PATH kümmern; in Cron-Jobs gibt es nur Minimaleinstellungen.

#!/bin/sh

PATH=/opt/bin:/usr/bin:/usr/local/bin:/usr/local/sbin${PATH:+:$PATH}

date=
file=

while getopts "df:" opt
do
  case "$opt" in
  d) date="%Y%m%d-%H%M%S ";;
  f) file="$OPTARG";;
  esac
done
shift $(expr $OPTIND - 1)

if [ -n "$file" ]
then
  d="${file%/*}"
  test -d "$d" || mkdir -p "$d"
fi

q=$(wget -qO- http://pass.telekom.de/portal/home |\
  perl -ne '
    print("$1 $2 $3 $4\n")
   
if (m#<span.*?>([0-9,.]+).*([KMG]B)</span> von ([0-9,.]+).*([KMG]B) mit voller Geschwindigkeit verbraucht#i)')
test "$(/bin/tty)" = "not a tty" || date +"$date$q"
test -n "$file" && date +"%Y%m%d-%H%M%S $q" >> $file

Die Ausgabe wird hier auf Wunsch noch mit dem Datum der Abfrage versehen, und wenn man mit -f einen Dateinamen angibt, wird die Ausgabe zusätzlich noch an diese Datei angehängt.

Ein paar kleine Tricks will ich ein bißchen näher erklären:

  • PATH=...${PATH:+:$PATH} - hier prüfe ich, ob in der Variablen PATH überhaupt irgendetwas enthalten ist. Falls ja, hänge ich einen Doppelpunkt und den alten Inhalt hinten dran und setze vorn neue Pfadnamen davor.
  • d="${file%/*}" - Vom Dateinamen in $file schneide ich alles nach dem letzten / ab. Als Ergebnis steht in der Variablen $d der Pfadname der Datei.
  • test -d "$d" prüft, ob dieses Verzeichnis existiert, und erzeugt es ggfs. mit mkdir -p mit allen Unterverzeichnissen dazwischen.
  • In einem Cron-Job ist eine Ausgabe auf die Konsole sinnlos, deshalb prüfe ich, ob der Befehl /bin/tty mir das Ergebnis "not a tty" liefert.
  • Der date-Befehl akzeptiert +Formatstring. Ich baue einfach das aktuelle Ergebnis in den Formatstring mit ein: date +"$date$q"

Mit einem Cron-Job wird dieses Skript nun stündlich aufgerufen:

57 * * * * /usr/local/bin/lte-quota.sh -f /var/spool/lte-quota.txt >/dev/null 2>&1

Und einmal am Tag lasse ich mir den aktuellen Stand auch noch als Mail zuschicken:

1 8 * * * (/bin/tail -1 /var/spool/lte-quota.txt | /bin/mail -s "LTE quota" ths) >/dev/null 2>&1
Das Ergebnis sieht dann bei mir etwa so aus:

20130603-225703 1,7 GB 30 GB
20130603-235702 1,9 GB 30 GB
20130604-005702 1,9 GB 30 GB
20130604-015702 1,9 GB 30 GB
20130604-025702 1,9 GB 30 GB
20130604-035702 1,9 GB 30 GB
20130604-045702 1,9 GB 30 GB
20130604-055702 2 GB 30 GB
[Update: die Telekom-Seite hat sich geändert, im Skript Regex angepasst]

22.03.2013

Huawei-LTE-Router per Skript resetten

Mal wieder ein kleines Skript aus der Abteilung "Nützliches für Kommandozeilenbastler".
Der LTE-Router von Huawei hat ab und zu mal Schluckauf und muss neu gestartet werden. Das umfasst den Aufruf der Adminseite mit einem Browser, Anmelden und durch drei Webseiten durchklicken, bis der Router sich wirklich zu einem Reset bequemt.

Mit demselben Trick wie neulich (Statusabfrage des Transfervolumens) ist es möglich, das Problem mit dem zweimaligen Aufruf von wget zu erschlagen. Beim ersten wget-Aufruf wird eine Anmeldung mit User und Passwort durchgeführt und das Session-Cookie gespeichert. Mit dem zweiten Aufruf wird dann direkt die URL aufgerufen, die den Reboot erzwingt (und die ganzen "Sind Sie sicher?"-Abfragen überspringt).

An der rot markierten Stelle "YOURPASSWORD" muss das eigene Router-Passwort eingesetzt werden. Wenn es Sonderzeichen enthält, müssen die als Entities geschrieben werden (Plus als %2B, Minus %2D, @ als %40 usw.). Ebenso muss an der rot markierten Stelle der Hostname oder die IP-Adresse des LTE-Routers eingesetzt werden (Telekom: speedport.ip, Vodafone: vodafonemobile.cpe, oder schlicht die IP, wenn die fix ist).

#!/bin/sh
verbose=0

while getopts "v" opt
do
  case "$opt" in
  v) verbose=1;;
  esac
done
shift $(expr $OPTIND - 1)


PATH=/opt/bin:/opt/sbin${PATH:+:$PATH}
LTE=192.168.42.1


C=/tmp/cookies.txt
U1="http://$LTE/login.cgi"
U2="http://$LTE/reboot.cgi"


wget --save-cookies "$C" \
     --keep-session-cookies \
     -q --tries=1 \
     -O /dev/null \
     --post-data 'Username=admin&Password=YOURPASSWORD' \
"$U1"
wget --load-cookies "$C" \
     -q --tries=1 \
     -O /dev/null \
     "$U2"
rm -f "$C"


c=1
echo -n "# waiting for ping "
until [ $c -gt 20 ]
do
  echo -n "."
  sleep 5
  c=$(expr $c + 1)
  ping -qc1 $LTE > /dev/null && break
done
echo " rc=$?"

11.01.2013

Daten aus dem LTE-Router von Huawei mit Skript auslesen

Von meinem alten DSL-Router war ich eine halbwegs informative Webansicht mit den relevanten Verbindungsdaten gewöhnt, dort konnte ich meine öffentliche IP-Adresse, meine Up- und Download-Geschwindigkeit und einige andere nette Daten abfragen und mitprotokollieren.

Der neue LTE-Router hingegen (Huawei B390s aka Telekom LTE 1) hat ein gar schreckliches Webinterface, und ohne Authentisierung rückt er gar keine Infos heraus. Nicht mal die Statusseite bekommt man mit einem harmlosen wget-Aufruf ;(, sondern nur eine Fehlerseite mit Javascript.

Aber wget ist schlau genug; man muss zwei Aufrufe durchführen und beim Aufruf der Login-Funktion (erster Aufruf) die Logindaten als "POST data" mitschicken und beim Beenden alle Cookies inklusive Sessions-Cookies speichern. Dann klappt's auch mit dem Huawei ;)

Hier ist ein Shellscript, das das Transfervolumen (in+out) und IP-Adresse zeigen und protokollieren kann. Das Passwort steht hartkodiert im wget-Aufruf nach --post-data. Das Skript sollte also mit chmod 700 behandelt werden, damit das keiner nachgucken kann. Falls im Passwort Sonderzeichen vorkommen, müssen die in der %-Schreibweise escape'd werden (+ ist %2B, # ist %23, ? ist %3F usw.).

Ohne Parameter aufgerufen werden alle Infos auf die Konsole ausgegeben.
Mit -f dateiname landen die Infos zusätzlich in einer Statusdatei (die IP nur, wenn sie sich von der vorher gespeicherten unterscheidet).
Mit -i, -o, -I kann man einschränken, dass man nur Volumen-In, Volumen-Out, IP sehen will.

#!/bin/sh

showin=0
showout=0
showip=0
status=

while getopts "ioIf:" opt
do
    case "$opt" in
    i) showin=1;;
    o) showout=1;;
    I) showip=1;;
    f) status="$OPTARG";;
    esac
done
shift $(expr $OPTIND - 1)

if [ "$showin$showout$showip" = "000" ]
then
    showin=1
    showout=1
    showip=1
fi

PATH=/opt/bin:/opt/sbin${PATH:+:$PATH}

C=/tmp/cookies.txt
U1="http://vodafonemobile.cpe/login.cgi"
U2="http://vodafonemobile.cpe/basic_status.asp"

wget --save-cookies "$C" \
     --keep-session-cookies \
     -q --tries=1 \
     -O /dev/null \
     --post-data 'Username=admin&Password=PASSWORT_ESCAPED' \
     "$U1"

wget --load-cookies "$C" \
     -q --tries=1 \
     -O - \
     "$U2" | \
awk -F, '
/total_volum_array = /{printf"%d %d ",$3,$4}
/WanIp = /            {gsub(/[(")]/,"",$2);printf"%s\n",$2}
' > /var/log/status-lte.txt
read in out ip < /var/log/status-lte.txt

if [ "$showin$showout" != "00" ]
then
    test $showin  -eq 1 && echo $in
    test $showout -eq 1 && echo $out
    if [ -n "$status" ]
    then
        date +"%Y%m%d-%T $in $out" >> "$status"
    fi
fi

if [ $showip -eq 1 ]
then
    echo $ip
# want echo to file?
    if [ -n "$status" ]
    then
# file exists?
        if [ -f "$status" ]
        then
            lastip=$(tail -1 "$status" | awk '{print$NF}')
            test "$lastip" != "$ip" && date +"%Y%m%d-%T $ip" >> "$status"
        else
# create new
            date +"%Y%m%d-%T $ip" >> "$status"
        fi
    fi
fi

rm -f "$C"