“push” von mryipyop auf flickr
Unter KDE gibt es ein großartiges Benachrichtigungssystem, welches alle KDE-Programme benutzen und allerlei Informationen darüber an den Benutzer weiterreichen. Soweit so gut und ich bin im Großen und Ganzen auch sehr zufrieden damit. Allerdings hat das System einen Nachteil: Ich bekomme die Benachrichtigungen nur mit, wenn ich auch am Rechner sitze, nicht aber wenn ich woanders bin.
Stellen wir uns mal folgende Scenarios vor:
- Es wird ein Torrent gestartet und ich gehe runter ins Wohnzimmer und werde, wenn der Download fertig ist, dadrüber benachrichtigt, gehe kurz hoch und arbeite weiter.
- Oder es wird ein langer Kopier- oder Encodiervorgang gestartet währenddessen ich was anderes mache und auch zu gegebener Zeit benachrichtigt werde.
Die erste Frage wäre: Wie soll ich benachrichtigt werden, wenn ich nicht am PC sitze? Eigentlich relativ einfach, denn eine Sache habe ich immer bei mir: mein iPhone. Es muss also ein Weg gefunden werden, Benachrichtigungen auf’s iPhone zu schicken.
Mail würde, dank Pushmail, gehen, ist aber doch relativ aufwendig, wenn man nicht gerade einen Mailserver bei sich installeirt hat, scheidet also aus. Ebenso würde SMS gehen (und dann auch mit jedem Telefon), aber auch dafür braucht man erstmal einen HTTP-SMS-Gateway oder ähnliches, außerdem kostet es für jede Nachricht Geld. Also auch eher ungeeignet. (Allerdings mit dem Vorteil der Platformunabhängigkeit – SMS kann jedes Handy. Und so teuer sind SMS-Gateways auch nicht.)
Push Notifications mit Prowl
Das Mittel der Wahl heißt Push-Notification-Service und kommt von Apple. Dieser Service ermöglicht es über eine Internetverbindug Pushnachrichten an ein iPhone zu schicken. Um diesen Dienst benutzen zu können, muss man ein registrierter Apple-Developer sein, oder man benutzt den Webservice “Prowl” mit zugehöriger iPhone Applikation gleichen Namens.
Nachdem man sich bei Prowl registriert, sich die App gekauft und mit seinem Account verlinkt hat, bekommt man einen API-Key, mit dem man sich über eine HTTP-API Nachrichten auf’s iPhone schicken kann.
Wer nicht direkt mit der HTTP-API sprechen will, für den stehen diverse Bibliotheken bei Prowl bereit, die einem diese Arbeit für die verschiedensten (Script-)Sprachen abnehmen. Schauen wir uns mal ein Beispiel in Ruby an:
#!/usr/bin/ruby
#folgende libs müssen zuerst über rubygem installiert werden:
require 'rubygems'
require 'prowl'
require 'net/https'
#Festlegen von ein paar Standardwerten:
#Dein Prowl API-Key
@apikey = "1234567890abcdefgh"
#Name des Programms, von dem die Nachricht kommt
@application = "Programm XY"
#Welches Event ist passiert?
@event = "Event"
#Die beschreibung des Events
@description = "something happend..."
#Welche Priorität hat die Nachricht?
#5 Werte von -2 (niedrig) bis +2 (hoch)
# Standard ist 0 (normal)
@priority = 0
#durchgehen der Attribute
ARGV.each_with_index do |arg, index|
if arg == "-a"
@application = ARGV[index + 1]
elsif arg == "-e"
@event = ARGV[index + 1]
elsif arg == "-d"
@description = ARGV[index + 1]
elsif arg == "-p"
@priority = ARGV[index + 1].to_i
end
end
#hier wird die Nachricht verschickt:
Prowl.add(
:apikey => @apikey,
:application => @application,
:event => @event,
:description => @description,
:priority => @priority
) |
Führt man dieses Script nun einfach so aus, kommt folgende Nachricht auf dem iPhone an:
Oder man gibt dem Script Argumente mit:
prowl -a Konsole -e Encoden -p 1 -d "Urlaubsvideo ist fertig" |
Dann bekommt man folgende Meldung:
Soweit so gut, nun kann ich also durch anhängen von “; prowl” hinter einem Befehl mir nach Beendigung des vorangegangen Befehls eine Nachricht auf’s iPhone schicken lassen. Schöner wäre es aber, wenn ich nicht immer daran denken müsste.
Emerge überschreiben
Unter Gentoo verbringt man viel Zeit mit kompilieren, vorzugsweise, wenn man gerade nicht am Rechner sitzt. Umso ärgerlicher ist es dann, wenn man nach zwei Stunden nachschaut und sieht, dass der Vorgang nach 5 Minuten aufgrund eines Fehlers abgebrochen hat.Da ich aber nicht immer den ganzen prowl-Kram hinten anhängen möchte (und wahrscheinlich auch nur bei jedem vierten Mal dran denken würde) und ich außerdem auch gerne wissen möchte, ob er nun erfolgreich fertig kompiliert hat oder in einen Fehler gelaufen ist, muss eine andere Lösung her.
Man kann relativ einfach vorhandene Programme überschreiben in dem man Beispielsweise in ~/.bin ein Script gleichen Namens anlegt. (Man darf nur nicht vergessen, die Argumente an den Befehl zu übergeben). Im Falle von emerge habe ich mir also unter /root/.bin folgendes Script abgelegt:
#!/bin/bash
#Alle Argumente zusammenfassen
args=("$@")
#und an das eigentliche emerge übergeben
/usr/bin/emerge $@
#das zuletzt verarbeitete Paket raussuchen
LAST="$(tac /var/log/emerge.log | awk '$2 == ">>>" {print $4,$5,$6,$7; exit;}')"
#checken ob emerge erfolgreich war (exit=0) oder nicht (exit!=0)
#und je nachdem die entsprechenden Nachrichten verschicken.
if [ $? -eq 0 ]
then
/usr/local/bin/prowl -a Konsole -e emerge -d "Kompilieren erfolgreich" -p 0
else
/usr/local/bin/prowl -a Konsole -e emerge -d "Fehler bei Paket $LAST" -p 1
fi |
nun kann ich einfach weiterhin wie gewohnt emerge xyz eingeben, bekomme aber am Ende je nach Ausgang des Befehls eine Nachricht gepusht. Dieses Vorgehen lässt sich unter Ubuntu natürlich auch mit apt-get verwirklichen, oder mit einem anderen Programm seiner Wahl.
Torrent fertig – Transmission
Das andere Beispiel von oben waren Torrent-Downloads. Ich nutze Transmission als Client und dieser besitzt eine Scriptingschnitstelle, die es ermöglicht am Ende eines Downloades ein Script auszuführen. Dazu geht man in den Menüpunkt Bearbeiten > Eigenschaften > Torrents > Script ausführen wenn Download fertig. Dort habe ich momentan folgendes kleine Bashscript hinterlegt:
#!/bin/bash
/usr/local/bin/prowl -a Transmission -e Fertig -d "$TR_TORRENT_NAME fertig runtergeladen." -p 0 |
Es stehen durch Transmission einige Variablen bereit, eine davon ist $TR_TORRENT_NAME, welche den Namen des Torrents beinhaltet. Weitere findet man hier https://trac.transmissionbt.com/wiki/Scripts
Fazit:
Die Liste der Dinge die man mit diesem System machen kann ist lang, zum Beispiel kann man jeden fehlgeschlagenen Loginversuch auf seinem Root-Server im Internet per Push-Nachricht verschicken, oder sich seinen eigenen Mail- oder Twitter-Push bauen, oder, oder, oder…
Getoppt werden würde das ganze nur noch, wenn es so funktionieren würde wie unter OSX: Dort ist Prowl ein Plugin für das globale Benachrichtigungsystem Growl (daher auch der Name) und es leitet alle Nachrichten einfach weiter, bzw. diejenigen, die man weitergeleitet haben möchte. So eine Schnitstelle zum KDE-Benachrichtigungssystem wäre fantastisch, jemand interesse das mal zu coden? ;)
Ich hoffe ich konnte eure Fantasie ein wenig anregen mit mein paar Beispielen und freue mich auf zahlreiche weitere Vorschläge für Anwendungsfälle!
Nicht zuletzt ein Dankeschön an @kayssun für seinen entscheidenden Hinweis :)
(Ach ja, Entschuldigung für den sperrigen Titel, mir viel einfach nichts besseres ein… ;) )