balert schrieb
Wie machst du das serverseitig? Irgend ein Daemon der Prüfungen macht und ggf Nachrichten versendet nehme ich an, kannst du Software-Namen nennen?
Ich habe hier lokal einen eigenen Jabber/XMPP Server, und zwar den ejabberd. Gibt es im Wiki auch einen Artikel zum einrichten. Ist nicht allzuschwer, die Daten bleiben somit im eigenen Netz, aber natürlich kannst du jeden bereits existierenden Jabber-Account verwenden.
Alles was ich also egal von welchem Rechner kundtun will wird über ein Skript zu diesem Jabber-Account gesendet. Bin ich online bekommt das mein XMPP-Client (ich nutze psi) solfort mit. Bin ich offline bleiben die Nachrichten erstmal auf dem Jabber-Server (das meine ich mit offline) bis ich mit psi halt wieder mich am jabber-Server einlogge,
Ich nutze das meist nur für kurze Nachrichten (wenn ich etwas auf dem Server lange ausführe und gerne mitkriegen will wann der Vorgang fertig ist) oder halt "Alarme". Die meisten "langen Ausgaben" - also fast alles was mehr als zwei Zeilen hat und was ich durchlesen will - mache ich hingegen per EMail; mit einem EMail-Cliet arbeite ich doch komfortabler (und dank IMAP genauso Rechner- oder ortsunabhängig wie mit Jabber).
Ich mag Ruby als "höhere" Skriptsprache, aber wie Dirk angedeutet hat gibt es auch für perl+python+xxx meistens XMPP-Module. Etwas sehr schnell nutzbares mit Ruby kriegst du z.B. mit:
pacman -S ruby (als root)
gem install xmpp4r (kann als Normaluser ausgeführt werden, gem ist der Paketmanager für Ruby)
In $HOME/.gem/ruby/1.9.1/gems/xmpp4r-0.5/data/doc/xmpp4r/examples/basic findest du nun ein brauchbares Beispielskript namens jabbersend.rb, dieses kopierst du dir z.B. in dein Homeverzeichnis.
Hier trägst du nun bei #settings deine Jabber-Adresse und das Paßwort ein. Produktiv solltest du das Skript an einen Ort im $PATH ablegen (/usr/local/bin z.B.) und nur für den Eigentümer lesbar machen (wg. dem Klartextpaßwort).
Weiterhin solltest du in dem Skript die Zeile gegen Ende:
puts m.to_s
auskommentieren zu:
#puts m.to_s
Ansonsten gibt das Tool die Ausgabe an de Jabber-Server nochmal im Terminal aus, was unschön ist.
Das Skript ist als Beispiel sehr einfach und tut was es soll - natürlich ausbaubar wenn nötig mit allem was das Ruby-xmpp4r-Modul zu bieten hat. Aber das Senden reicht ja erst mal…
Ein kurzer Test:
echo "Hallo" | $HOME/jabbersend.rb -t deinacount@jabber.example.com
sollte dir eine Nachricht auf deinen Jabber-Account zaubern. Für -t halt deinen Account verwenden, du schickst also eine IM an dich.
Nutzen kannst du das dann auf unterschiedlichste Art, bei deinem Server z.B. auf der Kommandozeilen oder in cron-Skripts, z.B.
(Ich kompiliere ein großes Paket (auf dem Server) und will wissen wann es fertig ist)
makepkg ; echo "Ich habe fertig" | jabbersend -s "Servername-als-Titel" me@jabber.example.com
(Oder in deinem Backupskript, vereinfacht):
---------
#/bin/sh
#
rsnapshot
[ $? -ne 0 ] && (echo "Fehler im Backup" | jabbersend -s "Servername-als-Titel" me@jabber.example.com)
------------
(Wenn dein rsnapshot einen Ecitcode ungleich 0 signalisiert (was meist einen Fehler bedeutet) wird dir per IM eine Nachricht gesendet.
(Das Prinzip mit jabbersend ist immer: Du "pipst"(|) den Nachrichtentext an jabbersend. Daß kann per echo !"blabla" geschehen, aber auch Ausgaben von Befehlen. Z.B. sendet dir das den freien Speicherplatz per Jabber):
df -h | jabbersend -s "Servername-als-Titel" me@jabber.example.com)
Was man damit also anfängt ist nur der eigenen Phantasie gezollt…
Abseits von Jabber(als InsstantMessaging) und EMail sind auch noch andere Dinge möglich, dank dem Linux/UNIX-Konzept: kombiniere unterschiedliche Tools und du bekomst eine neue Funktionalität.
Viele haben ja im Windowmanager einen sog. Notify-Daemon laufen um kurze Nachrichten vom System angezeigt zu bekommen. Mittels notify-send kann man den ja lokal nutzen, z.B.:
notify-send "Kaffee ist fertig"
Etwas ähnliches ist das "alte" Tool xmessage (Paket xorg-xmessage): xmessage "Hallo"
Nachteil: beide Tools funktionieren nur lokal, nicht über das Netzwerk. Sonst könnte man sich solche Statusnachrichten anstatt per Jabber auch mit sowas schicken (XMPP hat mehr Vorteile). Und sie sind grob gesagt an den User und an den laufenden X-Server gebunden. Oder geht da was?
Doch. Man kombiniere z.B. xmessage mit dem Tool netcat - und voilá - erhält ein netzwerkfähges xmessage oder notify-send.
Es gibt unterschiedliche netcat-Implementationen, zur Bequemlichkeit brauchen wir sogar zwei unterschiedliche. Ich mache das hier mal mit dem xmessage-Tool.
Auf dem Arbeistplatz/Desktop:
pacman -S xorg-xmessage nmap
(nmap ist ein Portscanner, bringt aber das für unsere Zwecke nützliche ncat mit)
Auf dem entfernten Rechner:
pacman -S openbsd-netcat
Mit ncat machen wir uns nun zu Nutze, daß damit simpelst ein kleiner Netzwerk-Daemon startbar ist. Und zwar als unser Normaluser. ncat/netcat lauscht aber nicht nur, sondern nimmt auch per Verbindungen auf.
Am Desktop also:
Machen wir als User also mal einen Test, erstmal xmessage lokal:
echo "Hallo" | xmessage -file -
Gut, nicht sehr spannend aber es funktioniert… Bringen wir Magie ins Spiel.
ncat -e '/usr/bin/xmessage -file -' -k -l 2222
Hier lauscht ncat nun im Netzwerk auf Port 2222 und wartet auf Eingaben/text. Dieser Text würde dann an xmessage weitergegeben, was es wiederrum auf unseren lokalen Bildschirm ausgibt. Anstatt xmessage würde wie gesagt auch notify-send funktionieren, ich kann es hier nur nicht ausprobieren.
Am Server(oder wo immer auch eine Nachricht erstellt werden soll) würde das so passieren:
echo "Hallo Desktop!" | nc.openbsd -q 1 ws01 2222
lsmod | nc.openbsd -q 1 ws01 2222
ws01 ist hier der Rechnername meines Desktops, muß natürlich dann eurer sein.
Und schwupps: Es sollte ein xmessage-Fenster am Arbeistplatz auftauchen mit der Nachricht.
Dieses Kommando auf der rechten Seite der Pipe (nc.obenbsd) kann man nun für die gleichen Zwecke gebaruchen wie unser jabbersend oben. Aber es hat halt Nachteile: Wenn der Desktop nicht läuft ist die Nachricht weg und sie ist erstmal nicht abrufbar //Edit: bzw. nicht wieder abrufbar wenn gelesen..
Aber es zeigt halt IMHO gut, wie sich (dank der Philosophie Ausgaben nach stdout und Eingaben von sdtin aus/einzugeben) zwei ganz unterschiedliche, aber jedes für sich nützliche, Tools kombinieren lassen um eine neue Funktionalität zu erhalten.
(In punkto Sicherheit ist das natürlich nicht das Gelbe vom Ei, aber in einem privaten, lokalen LAN vertretbar. Real könnte man statt netcat auch ssh(mit Keys) nutzen.)
NB: Wir müssen auf der sendenden Seite ein anderes netcat als z.B ncat nutzen, da ncat (und auch GNU/netcat) nach der Eingabeübernahme sich selbst nicht beenden. Nach einem:
echo "Hallo" | ncat ws01 2222
müßte also erst mit STRG+C der Vorgang terminiert werden damit Hallo auch wirklich beim Empfänger ankommt. nc.openbsd kennt dafür den Schalter -q, beendet sich also in unseren Beispielen nach 1s (und gibt somit durch ein EOF erst den Text zum lauschenden ncat frei). Ohne nc.openbsd müßte das auf eine unschöne Art geschehen, indem der ncat-Prozeß gekillt/terminiert wird. Z.B. würde es korrekt mit ncat sendend AFAIK nur so funktionieren:
echo "Hallo" | ncat ws01 2222 & pid=$! ;sleep 1 ;kill ${pid}
Und das ist unschön.
So, daß ist jetzt wieder mal einer meiner langen Monologe geworden… ;-)