Geektool

Update: 28. Februar 2017

Geektool ist eine kleine spannende Software, mit der man seinen Macdesktop wunderbar pimpen kann. Es ist allerdings keine "Klick-Klick"-Software. Man sollte zumindest schonmal was von der Existenz des Terminals gehört und keine Scheu vor der Kommandozeile haben, denn die meisten Sachen werden über Shell Skripte programmiert.

Die grundlegende Bedienung von Geektool werde ich hier nicht beschreiben. Das haben schon viele andere getan. Ich erkläre hier meinen Desktop und die Skripte, die dahinter stecken.

Und so sieht mein Bildschirm aus:

Ich lasse mir diverse Informationen zum System anzeigen. Im ersten Block sind dies allgemeine Angaben zum Rechner und zum OS und die aktuellen IP Adressen. Der zweite Block widmet sich der Auslastung von CPU und RAM. Dann kommen der WLAN Accesspoint, die eingestellte Netzwerkumgebung und die Laufzeit des Rechners. Zum Schluss noch ein paar Daten zu den gemounteten Dateisystemen (sowohl lokale Geräte wie interne SSD und USB Sticks als auch Netzlaufwerke - hier die Freigaben auf meinem Homeserver)

Ich habe alle Skripte auf Github veröffentlicht. Verbesserungen sind willkommen!

Update: 28. Februar 2017

 

Das Einfachste an der gesamten Geschichte sind die Systeminformationen. Hier ist das passende Skript dazu:

01: hostname=$(scutil --get ComputerName)
02: username=$(whoami)
03: mem=$(sysctl -n hw.memsize | awk '{print $0/1073741824" GB RAM"}')
04: cpu=$(sysctl -n machdep.cpu.brand_string)
05: os=$(sw_vers | grep 'ProductName' | awk '{print $2" "$3" "$4}')
06: osversion=$(sw_vers | grep 'ProductVersion' | awk '{print $2}')
07: myen0=$(ifconfig en0 | grep "inet " | awk '{print $2}')
08: if [ "$myen0" = "" ]
09: then
10: myen0="N/A"
11: fi
12: myen1=$(ifconfig en1 | grep "inet " | awk '{print $2}')
13: if [ "$myen1" = "" ]
14: then
15: myen1="N/A"
16: fi
17: mywan=$(dig +short myip.opendns.com @resolver1.opendns.com)
18: if [ "$mywan" = "" ]
19: then
20: mywan="N/A"
21: fi
22:
23: echo "Hostname: \t\t $hostname"
24: echo "Username: \t\t $username"
25: echo "Memory: \t\t $mem"
26: echo "CPU: \t\t\t $cpu"
27: echo "OS: \t\t\t\t $os $osversion"
28: echo "Ethernet IP: \t\t $myen0"
29: echo "Wireless IP: \t\t $myen1"
30: echo "Internet IP: \t\t $mywan"

Zeilen 1 bis 6:
Die Systeminformationen werden zunächst abgefragt und in entsprechenden Variablen abgelegt.

Zeile 7:
Die IP Adresse der Ethernetschnittstelle wird abgefragt. Ja, mein Macbook Pro hat mehr als nur ein paar USB-C Buchsen ;-)

Zeilen 8 bis 11:
Sollte die Ethernetschnittstelle keine IP haben, wird die Variable "myen0" mit "N/A" belegt.

Zeilen 12 bis 16:
Der selbe Vorgang wird für die WLAN Schnittstelle wiederholt.

Zeile 17:
Meine externe IP Adresse wird abgefragt. Ich hab im Netz meistens Beispiele gefunden, die die Internet IP per http bei Dyndns abgerufen haben. Diese Abfrage führte bei mir jedoch regelmäßig  zu timeout Fehlern. Die Abfrage per dig funktioniert bei mir deutlich besser.

Zeilen 18 bis 21:
Bei einer fehlenden IP Adresse wird auch hier die Variable mit "N/A" belegt.

Zeilen 23 bis 30:
Die abgefragten Informationen werden auf dem Bildschirm angezeigt. Je nach Schriftart müsst ihr die Anzahl der Tabulatorsprünge (\t) anpassen.

Alle Skripte findet Ihr zum Download auf Github. Verbesserungen sind willkommen!

Update: 28. Februar 2017

Dieses Skript zeigt mir wie viel Last ich meinem Rechner gerade zumute. Ein relativ kurzes Refresh Intervall ist hier natürlich Pflicht. Hier sind das Skript:

01: cpuload=$(top -l1 -n0 | awk '/CPU/')
02: mem=$(top -l1 -n0 | awk '/PhysMem/')
03:
04: echo CPU:
05: echo $cpuload | awk '{print "Benutzer: \t\t " $3}'
06: echo $cpuload | awk '{print "System: \t\t\t " $5}'
07: echo $cpuload | awk '{print "Frei: \t\t\t " $7}'
08: echo
09: echo RAM:
10: echo $mem | awk '{print "Aktiv: \t\t\t " $2+0 " MB"}'
11: echo $mem | awk '{print "Frei: \t\t\t " $6+0 " MB"}'

Zeile 1:
Die Daten der CPU werden abgerufen und in der Variablen "cpuload" abgelegt.

Zele 2: 
Der Vorgang wird für den Arbeitsspeicher wiederholt.

Zeilen 4 bis 11:
Ausgabe der Daten auf dem Bildschirm. Die Anzahl der Tabulatorsprünge (\t) müsst Ihr je nach gewählter Schriftart anpassen.

Alle Skripte findet Ihr zum Download auf Github. Verbesserungen sind willkommen!

Update: 28. Februar 2017

Mit diesem Skript lasse ich mir die SSID der WLAN Basisstation und die derzeit aktivierte Netzwerkumgebung anzeigen. Je nach Einsatzort meines Macbooks muss ich die Netzwerkumgebung ändern. Umso ärgerlicher ist es, wenn man dann wieder zu Hause ist und der Rechner verweigert die Internetverbindung, weil zum Beispiel der eingetragene DNS Server in meinem Heimnetz nicht vorhanden ist. Deshalb habe ich hier auch noch ein kleines Bonbon eingebaut. Alle Netzwerkumgebungen die nicht die Umgebung "Automatisch" sind, werden in rot angezeigt. Die Farbe wird über einen ANSI Escape Code eingestellt. Doch zunächst das gesamte Listing:

01: netz=$(networksetup -getairportnetwork en1 | cut -f2 -d: | sed 's/^[ \t]*//')
02:
03: checkairport=$(echo $netz | awk '{print $3 $4}')
04: if [ "$checkairport" = "notassociated" ]
05: then
06: netz="N/A"
07: fi
08: 
09: umgebung=$(networksetup -getcurrentlocation | sed 's/Automatic/Automatisch/')
10:
11: red="\x1b[31m"
12: reset="\x1b[39m"
13: farbe=$reset
14:
15: if [ "$umgebung" != "Automatisch" ]
16: then
17: farbe=$red
18: fi
19:
20: echo "SSID:\t\t\t $netz"
21: echo "Umgebung:\t\t $farbe$umgebung$reset"

Zeile 1:
Die SSID des aktuell verbundenen Netzwerkes wird abgefragt. Da die Ausgabe zunächst das Format "Current Wi-Fi Network: [SSID]" hat, wird mit dem cut Befehl alles vor dem Doppelpunkt abgeschnitten und mit sed das Leerzeichen vor der Bezeichnung der SSID entfernt.

Zeile 3:
Wenn der Rechner nicht mit einer WLAN Basisstation verbunden ist, wird die Variable "netz" in  Zeile 1 mit dem Text "You are not associated with an AirPort network. Wi-Fi power is currently off." belegt.

Die Hilfsvariable "checkairport" erhält die Worte 3 und 4 der abgerufenen SSID. Sollte der Rechner keine WLAN Verbindung haben, wären das "not" und "associated".

Zeilen 4 bis 7:
Wenn "checkairport" den Bergiff "notassociated" enthält, wird die Variable "netz" mit "N/A" belegt.

Zeile 9:
Der Name der aktuellen Netzwerkumgebung wird ausgelesen und dabei das englische "Automatic" ins Deutsche übersetzt. Da ich alle weiteren Netzwerkumgebungen angelegt habe, tragen diese bereits deutsche Bezeichnungen. Nur die Apple Standardumgebung führt unterhalb der grafischen Oberfläche die englische Bezeichnung.

Zeile 11:
Der Variablen "red" wird der ANSI Escape Code für die rote Schriftfarbe übergeben.

Zeile 12:
Die Variable "reset" wird mit dem ANSI Escape Code für die Standard Schriftfarbe belegt. Dies ist die Farbe, die bei Geektool im Konfigurationsfenster festgelegt wurde.

Zeile 13:
Als Textfarbe wird zunächst die Standardfarbe festgelegt.

Zeile 15 bis 18:
Wenn der Name der Netzwerkumgebung nicht "Automatisch" lautet, wird die rote Textfarbe gewählt.

Zeilen 20 und 21:
Die Ausgabe der SSID und der Netzwerkumgebung.  

Alle Skripte findet Ihr zum Download auf Github. Verbesserungen sind willkommen!

Update: 10. März 2017 

An der Ausgabe der Uptime habe ich mir lange Zeit die Finger blutig getippt. Das Problem dabei ist nicht die Anzeige, wie lange der Rechner schon läuft, sondern eine schöne Formatierung in deutscher Sprache.

Der Befehl "uptime" im Terminal, zeigt zwar (unter Anderem) auch die Laufzeit des Systems an, allerdings nur ganz rudimentär formatiert. Ich hatte bereits ein funktionierendes Skript, der Code war aber grauenhaft. Jeder Ausgabefehler wurde mit einer neuen if..then Abfrage korrigiert. Dadurch habe ich ein wahres Verzweigungsmonster gebaut. Hier das neue, schlanke Skript: 

01: einheit=$(uptime | awk '{print $4 }' | sed 's/,//' | sed 's/s//')
02: subeinheit=$(uptime | awk '{print $6 }' | sed 's/,//' | sed 's/s//')
03: ok=false

04: case "$einheit" in
05: "ecs") ausgabe=$(uptime | awk '{print $3+0 " " $4}' | sed 's/secs,/Sekunden/');ok=true;;
06: "min" ) ausgabe=$(uptime | awk '{print $3+0 " " $4}' | sed 's/mins,/Minuten/' | sed 's/min,/Minute/');ok=true;;
07: "hr") ausgabe=$(uptime | awk '{print $3+0 " " $4}' | sed 's/hrs,/Stunden/' | sed 's/hr,/Stunde/');ok=true;;
08: esac

09: if [ "$ok" = "false" ]
10: then
11: if [ "$einheit" = "day" ] || [ "$einheit" = "days" ]
12: then
13: if [ "$subeinheit" = "ecs" ]
14: then
15: ausgabe=$(uptime | awk '{print $3 " " $4 " " $5 }' | sed 's/days,/Tage/' | sed 's/day,/Tag/')" Sekunden"
16: elif [ "$subeinheit" = "min" ]
17: then
18: ausgabe=$(uptime | awk '{print $3 " " $4 " " $5 }' | sed 's/days,/Tage/' | sed 's/day,/Tag/')" min"
19: else
20: ausgabe=$(uptime | awk '{print $3 " " $4 " " $5 }' | sed 's/days,/Tage/' | sed 's/day,/Tag/' | sed 's/:/h /' | sed 's/,/min/')
21: fi
22: else
23: ausgabe=$(uptime | awk '{print $3 }' | sed 's/:/h /' | sed 's/,/min/')
24: fi
25: fi

26: echo "Uptime: \t\t\t $ausgabe"

Zeile 1:
Die "größte" Einheit der Laufzeit wird abgefragt. Wenn der Rechner gerade gestartet wurde, dann lautet sie "secs", und steigert sich über "mins" bis "days".

Zeile 2:
Es wird eine Untereinheit abgefragt. Wenn der Rechner mehr als einen Tag läuft beginnt die Ausgabe nach "1 day" ärgerlicherweise wieder mit "secs", steigert sich dann auf "min". Um die Einteilung in Einheit und Untereinheit besser zu verstehen seht Euch am Besten mal die Ausgabe von "uptime" nach unterschiedlichsten Laufzeiten mal an.

Zeile 3:
Die Variable "ok" ist eine Hilfsvariable. Sie wird mit "false" initialisiert.

Zeile 4 bis 8:
Über eine case..in Verzweigung wird die Augabe generiert falls die Haupteinheit Sekunden, Minuten oder Stunden beträgt. Das bedeutet der Zeitraum vom Start des Rechners bis zur ersten vollen Stunde und jede weitere volle Stunde wird mit dieser Verzweigung abgedeckt. Wenn die case..in Verzweigung erfolgreich war wird die Hilfsvariable "ok" mit "true" belegt. 

Zeilen 9 und 10:
Wenn die case..in Verzweigung die nicht erfolgreich war, geht es mit den nächsten Abfragen weiter.

Zeilen 11 bis 15:
Wenn der Rechner gerade die vollen Tage überschritten hat, wird hiermit die erste Minute (Zeitanzeige in Sekunden) abgedeckt.

Zeilen 16 bis 18:
Der Zeitraum nach dem Überschreiten eines vollen Tages ab der ersten Minute bis zur ersten Stunde wird hiermit angezeigt.

Zeile 20:
Die Ausgabe in Tagen, Stunden und Minuten wird generiert.

Zeile 23:
Der Zeitraum nach der ersten Stunde bis zum Tageswechsel wird abgedeckt.

Zeile 26:
Die Ausgabe wird auf dem Bildschirm ausgegeben 

Die Formatierung der Ausgabe von "uptime" ist sehr uneinheitlich und deshalb müssen hier so viele unterschiedliche Situaionen abgedeckt werden. Ich sammele mal bei Gelegenheit diverse Ausgaben um hier die Problematik nochmal genauer aufzuzeigen.

Alle Skripte findet Ihr zum Download auf Github. Verbesserungen sind willkommen!