11.01.2013

Alle Java-Versionen per Skript deinstallieren

Aus der Abteilung "Skripte, die die Welt nicht braucht" anlässlich der wiederholten kritischen Sicherheitslücken in der Java Runtime hier ein Skript, mit dem man unter Windows sämtliche Versionen der JRE und JDK deinstallieren kann. Wie im Artikel berichtet, ist es nicht ganz einfach, die JRE nur im Browser abzuschalten, deshalb wird die komplette Deinstallation empfohlen, wenn man es nicht wirklich braucht.

Das Skript (cmd) ruft eine Hilfsfunktion in VBS auf, um die Registry nach dem Uninstall-Befehl zu durchsuchen; das VBS generiert gleich ein passendes Skript in cmd-Syntax, das dann vom Hauptskript aufgerufen wird.
Beide Skripte (uninstall-java.cmd und .vbs) kann man dann auf ein Netzlaufwerk legen oder mit einem USB-Stick von jedem betroffenen PC aus starten, um alle JRE- und JDK-Instanzen zu entfernen. Wenn auf dem Netzlaufwerk keine Schreibrechte sind, muss das .cmd leicht angepasst werden und die temporäre Datei z.B. in %TEMP% angelegt werden. Ich hab's in meinem Fall gern, dass die Uninstall-Befehle in diesem Verzeichnis bleiben.
[Update: die Schreibrechte werden im .cmd benötigt, nicht im .vbs]

uninstall-java.vbs

const HKEY_LOCAL_MACHINE=&H80000002
Set StdOut=WScript.StdOut
Set StdErr=WScript.StdErr

Set o=GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")

Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"

o.EnumKey HKEY_LOCAL_MACHINE, Key, SubKeys

For Each subkey In SubKeys
  o.GetStringValue HKEY_LOCAL_MACHINE,Key&"\"&subkey,"DisplayName",name
  name=" "&name
  if (Instr(name,"Development Kit")) Then
    StdErr.WriteLine "JDK "&name
  End If
  if (InStr(name,"Java(TM)") or InStr(name,"J2SE") or InStr(name,"Java ")) Then
  StdErr.WriteLine Key&"\"&subkey
    StdOut.WriteLine "@echo "&name
    o.GetStringValue HKEY_LOCAL_MACHINE,Key&"\"&subkey,"DisplayVersion",ver
    StdOut.WriteLine "REM "&subkey&" => JRE "&ver
    o.GetStringValue HKEY_LOCAL_MACHINE,Key&"\"&subkey,"UninstallString",uninst
    StdOut.WriteLine "REM "&uninst
    uninst=Replace(uninst,"/X","/passive /qb /X")
    uninst=Replace(uninst,"/I","/passive /qb /X")
    if (uninst <> "") Then
      StdOut.WriteLine uninst
    End If
  End If
Next

uninstall-java.cmd

@ECHO off
cd /D %~dp0
cscript //nologo //B uninstall-java.vbs > uninst-java-%COMPUTERNAME%.cmd 2> java-%COMPUTERNAME%.txt
call uninst-java-%COMPUTERNAME%.cmd

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"

07.01.2013

LTE ist toll und die Pseudo-Flatrate nervt

LTE an sich ist schon klasse. Ich bin im Oktober auf "call und surf comfort via Funk" umgestiegen. Über die 10 GB Limit habe ich mir damals keine Gedanken gemacht. Mich hat nur die Verbesserung von 384/64 auf 7200/1200 gelockt.

Allerdings hab ich zwei Teenager im Haus und sowohl meine Frau, meine Schwiegermutter als auch ich sind durchaus gern im Internet unterwegs.
Damit sind 10 GB Volumen schon nach weniger als zwei Wochen erreicht. Mit dem Handy schaffe ich im Schnitt 500 MB im Monat, meine Tochter kommt mit Whatsapp auf 2-3 GB pro Monat. Mittlerweile gibt es schon eine "Schere im Kopf", ob ich eine bestimmte Seite oder Dienst überhaupt aufrufe, weil ich nicht so sicher bin, wie groß die anfallende Datenmenge ist. So macht Surfen keinen Spaß ;-(

Letzte Woche bin ich auf den neuen Tarif "L" umgestiegen mit 30 GB Volumen, und angeblich könne man auf Zuruf im Kundencenter nochmals 30 GB für 9,95 dazubuchen. Tja, wenn man könnte. Nur leider teilte mir die Hotline mit, dass dies erst im nächsten Quartal technisch fertiggestellt ist. Und leider muss man diese Erweiterung jeden Monat neu bestellen, wenn die 30 GB ausgeschöpft sind. Es ist nicht möglich, mehr als 30 GB fest zu buchen, und es gibt auch keinen Tarif ohne Volumenlimit.
*DAS NERVT*!

Bis dahin muss ich also mit einer Zwangsdrosselung auf 384/64 leben (also meine bisherige DSL-Geschwindigkeit).

Noch dazu habe ich gefühlt den Eindruck, dass entweder der Router oder die Verbindung an sich unzuverlässiger ist, ich muss ungefähr alle zwei Tage den Router neu starten, damit ich wieder Verbindung habe.

Sorry, so verstehe ich "Leben in der Cloud" nicht, wenn man dann durch so ein lächerliches Volumen doch wieder ausgebremst wird. Streaming von Musik oder Filmen kann ich damit auch abhaken, nach ein oder zwei Filmen pro Woche ist Schluss mit Lustig.