Weekly Snap: Require.JS, Managing SSH Connections & Protocol Handlers in Firefox

2 – 6 July featured the OSMC, Birger’s sabbatical and tips for developers and systems administrators.
Achim gave us his tips for managing SSH connections manually and Jannis recommended Require.JS as an efficient solution for organising code in JavaScript.
Dirk then showed how to integrate protocol handlers into Firefox, while Birger shared his first thoughts on his sabbatical and how he found Bulletproof Networks, his employer Down Under.
Eva counted 107 days down to the OSMC with Thomas Gelf’s presentation on “Monitoring at Large – the World is not Enough” and reflected on the whirlwind of emails, ticket reservations and preparations for the upcoming Puppet Camp and OSMC. She also encouraged OSMC guests to bring a companion along.

Protokoll-Handler in Firefox oder wie komm ich schnell zu meinen Problemen

Eine der schnellsten und komfortabelsten Möglichkeiten auf ein problematisches System zuzugreifen ist für mich auf einen Link in der Überwachung zu klicken. Somit ist nur die Frage wie bekomme ich die Möglichkeit auf eine URL zu klicken und es öffnet sich meine SSH-Verbindung, mein VNC-Fenster oder die Remotedesktop-Sitzung?
Die Lösung hierfür heißt auf der einen Seite action_url (oder notes_url) in Nagios oder Icinga, auf der anderen Seite muss ich meinen Browser noch dazu bringen mit entsprechenden URLs umzugehen. Chrome reicht diese einfach an das System weiter, was gut funktioniert wie mir gesagt wurde. Der Internet Explorer und Firefox brauchen dagegen etwas Hilfe. Natürlich gibt es für beide Lösungen wie entsprechende Plugins, hier wäre für den IE der Putty-Fork Kitty oder für den Firefox das javascript-basierende Addon Firessh zu nennen.
Nun ja, ich arbeite am liebsten mit Firefox, einfach aus der Historie heraus, und ich nutze am liebsten meine gewohnten Werkzeuge, also ist alles vorherige schön und gut, aber nicht was ich will. Außerdem handelt es sich um keine allumfassende Möglichkeit, wenn ich noch weitere Protokolle einbinden will.
Daher möchte ich am Beispiel von ssh zeigen wie man entsprechende Protokoll-Handler in Firefox einbaut. Die Vorgehensweise funktioniert so ab Firefox 3.6:

  1. Erstellen eines Scripts zum Öffnen des Links
  2. Öffnen von about:config in Firefox und bestätigen der Sicherheitsabfrage
  3. Erstellen eines neuen Boolean network.protocol-handler.expose.ssh über Rechtsklick und zuweisen des Werts false
  4. Schließen von Firefox und erneutes öffnen (in aktuellen Versionen nicht mehr nötig)
  5. Öffnen eines SSH-Links wie ssh://user@host:port
  6. Auswählen des Skripts zum Öffnen der Links, Haken für Auswahl merken setzen!

Hiermit ist es möglich beliebige Protokolle einzubinden, nur die Verwendung von file:// und smb:// lässt Firefox aus Sicherheitsgründen nicht zu!
Und damit nun nicht jeder ein eigenes Skript basteln muss noch zwei Beispielskripte, die ich mir mal auf die schnelle gebastelt hatte.
Die URLs haben hierbei folgenden Aufbau:

  • ssh://user@host:port
  • telnet://user@host:port
  • rdesktop://user@host:port
  • vnc://host:display

Das erste Beispielskript ist für die Verwendung unter Linux mit Gnome gedacht und zerlegt die URL und baut daraus einen Connectionstring für ssh oder telnet, welches innerhalb eines neuen Gnome-Terminals ausgeführt wird, und startet auch rdesktop und vncviewer.

#!/bin/bash
protocol=$(echo $1 | cut -d : -f 1)
address=$(echo $1 | cut -d / -f 3)
user=$(echo $address | grep @ | cut -d @ -f 1)
port=$(echo $address | grep : | cut -d : -f 2)
host=$(echo $address | cut -d @ -f 2 | cut -d : -f 1)
case $protocol in
ssh)
connectstring=$(echo "$([ -z $user ] || echo "$user@")$host$([ -z $port ] || echo "-p $port")")
gnome-terminal --window -e "$protocol $connectstring"
;;
telnet)
connectstring=$(echo "$host $([ -z $port ] || echo "$port")$([ -z $user ] || echo "-l $user")")
gnome-terminal --window -e "$protocol $connectstring"
;;
rdesktop)
connectstring=$(echo "$([ -z $user ] || echo "-u $user ")$host$([ -z $port ] || echo ":$port")")
rdesktop -g 1280x960 $connectstring
;;
vnc)
connectstring=$(echo "$host$([ -z $port ] || echo":$port")")
vncviewer $connectstring
;;
esac

Mein Beispielskript für Windows ist weniger elegant und kann nicht mit Ports umgehen, dieses öffnet Putty für ssh und telnet bzw. Realvnc für vnc mit festem Pfad sowie mstsc für Remotedesktop.

@ECHO OFF
set parameter=%1%
echo %parameter% |findstr ssh:// >nul:
if not errorlevel 1 GOTO SSH
echo %parameter% |findstr telnet:// >nul:
if not errorlevel 1 GOTO TELNET
echo %parameter% |findstr rdesktop:// >nul:
if not errorlevel 1 GOTO RDESKTOP
echo %parameter% |findstr vnc:// >nul:
if not errorlevel 1 GOTO VNC
GOTO END
:SSH
set host=%parameter:ssh://=%
START C:\Programme\PuTTY\putty.exe -ssh %host%
GOTO END
:TELNET
set host=%parameter:telnet://=%
START C:\Programme\PuTTY\putty.exe -telnet %host%
GOTO END
:RDESKTOP
set host=%parameter:rdesktop://=%
START %SystemRoot%\system32\mstsc.exe -v:%host%
GOTO END
:VNC
set host=%parameter:vnc://=%
START C:\Programme\RealVNC\VNC4\vncviewer.exe %host%
GOTO END
:END

Die Anwendung ist natürlich nicht nur auf Nagios bzw. Icinga beschränkt, auch Check_interfacetable_v3t integriert standardmäßig einen Link für den ssh- oder telnet-Zugriff auf das überwachte System, Mediawiki lässt es zu entsprechende URLs einzubauen und natürlich alle Software, die es erlaubt beliebige URLs anzugeben.
Ich hoffe der ein oder andere hat Verwendung hierfür und wünsche dann viel Spaß mit den nun noch schneller erreichten Systemen.

Dirk Götz
Dirk Götz
Senior Consultant

Dirk ist Red Hat Spezialist und arbeitet bei NETWAYS im Bereich Consulting für Icinga, Puppet, Ansible, Foreman und andere Systems-Management-Lösungen. Früher war er bei einem Träger der gesetzlichen Rentenversicherung als Senior Administrator beschäftigt und auch für die Ausbildung der Azubis verantwortlich wie nun bei NETWAYS.

JavaScript Performance: Warum 'nativ' nicht immer besser ist.

Eigentlich wollte ich den heutigen Artikel neuen JavaScript Array-Features widmen, die am kommen oder schon da sind (forEach(), indexOf(), Iteratoren, Generatoren, etc.). Garnieren wollte ich das ganze mit ein paar Benchmarks, um bestenfalls zu zeigen dass die ‘nativen’ Arraymethoden der Browser meine selbstgeschriebenen Equivalente vor Neid erblassen lassen und was die Zukunft bringt. Doch das wäre wohl zu einfach gewesen…
Das Ergebnis war überraschend: Während meine Benchmarks im v8 (d.h. die JS-Engine von Chrome) zwar zeigten, dass manche meiner Methoden nur einen kleinen Tick langsamer waren (manche aber auch schneller), war es bei Spidermonkey (die Firefox engine) genau umgekehrt: Sobald dort die Tracing Engine aktiviert war (was Standard seit FF > 3.5 ist), lief mein eigener Code mit einer viel besseren Performance (z.T um den Faktor x6) als die ‘nativen’ SpiderMonkey-Methoden, die in C++ geschrieben waren.

Was komisch klingt liegt an der Art und Weise wie Fuchs optimiert: Mein eigener Code wird zur Laufzeit ge’traced’ (grob gesagt: Es wird verfolgt, ob die Typen der Variablen gleichbleibend sind und dementsprechend wenn möglich auf Typkonvertierungen und -überprüfungen verzichtet – wer Details will findet eine gute Einführung im Mozilla Blog ). Dementsprechend werden bei meinem selbstgeschriebenen Code weniger Operationen pro Durchgang benötigt. Bei den nativen Methoden ist dass anscheinend anders: Eine kleine Wanderung in den C++ Code von Spidermonkey zeigte, dass z.B. die Array.prototype.every() Methode Typen immer überprüft und konvertiert und ich schätze, dass hier derzeit kein Tracing stattfindet.
Die größten Performancesprünge lagen dabei interessanterweise bei Methoden, die Funktionen als Argumente nehmen, wie z.b. Array.map(), Array.filter(), Array.forEach().
Hier noch mein Benchmark zum selber Ausprobieren. Natürlich ist das immer ein Szenario und deckt damit nicht jeden Fall ab – ein anderer Benchmark kann ein völlig anderes Ergebnis liefern, ein neuerer Browser andere Werte, etc. Ich habe die Funktionen was Argumente und Verhalten angeht nachgeschrieben, allerdings ist ein 1:1 Vergleich immer schwer und das Szenario (wie bei einem Benchmark üblich) natürlich extrem (10000 Elemente im Array und 1000 Durchgänge).
Das eigentliche Fazit: Gerade bei neuen Methoden wie den JavaScript 1.6+ Array Funktionen, die nicht bei jedem Browser vorhanden sind sollte immer erst geprüft ob sich der Aufwand lohnt, oder ob man auf ‘konservative’ Methoden zurückgreift. Cross-Browser-Kompatibilität erfordert immer Mehraufwand, und dieser wird nur gerechtfertigt wenn unterm Strich ein Mehrwert herauskommt. Und darauf will ich hinaus: Wir Webentwickler werden zwar einige neue Features wie Iteratoren und Generatoren bekommen (Firefox unterstützt diese auch schon bereits) – trotzdem ergibt es oft Sinn, lieber auf Helferfunktionen von Core-Toolset wie Prototype, JQuery oder ExtJS zu setzen, die browserübergreifend die selben Funktionalitäten anbieten. Die ‘neueren’ Methoden sind  a) nicht in jedem Browser vorhanden, und b) evtl. sogar langsamer, oder nur minimal schneller – womit sie derzeit für den Produktiveinsatz ausscheiden.
Ich will hier natürlich keinen Fortschritt aufhalten: Es ist gut, dass sinnvolle Hilfsmethoden wie filter() oder map() Einzug in den Standard finden und ich werde sie sicher auch selbst nutzen wenn Sie verbreitet genug sind. Allerdings sollte man für den Produktiveinsatz eher mit geschärften Bewusstsein an neue (Sprach-)Features wagen.

Firefox 3 & Download Day

Heute erscheint (endlich) die finale Version von Firefox 3 und gleichzeitig hat Mozilla den Download Day ausgerufen. Es soll versucht werden innerhalb von 24 Stunden einen Weltrekord für die meisten Downloads aufzustellen. Da Sie den neuen Firefox ja sowieso herunterladen werden, können Sie es dann auch gleich heute machen und so mithelfen, dass der Rekordversuch möglichst gut gelingt. Wobei, gelingen wird er auf jeden Fall, denn so wie ich die Website verstanden habe, gibt es noch gar keinen alten Rekord, den es zu schlagen gilt. Es geht nur darum mit einer möglichst imposanten Anzahl an Downloads in Guinness Buch der Rekorde zu kommen. Das neue Release soll ab 10:00 Uhr (US Westküste) verfügbar sein; bei uns entspricht dass dann 19:00 Uhr.

Julian Hein
Julian Hein
Executive Chairman

Julian ist Gründer und Eigentümer der NETWAYS Gruppe und kümmert sich um die strategische Ausrichtung des Unternehmens. Neben seinem technischen und betriebswirtschaftlichen Background ist Julian häufig auch kreativer Kopf und Namensgeber, beispielsweise auch für Icinga. Darüber hinaus ist er als CPO (Chief Plugin Officer) auch für die konzernweite Pluginstrategie verantwortlich und stösst regelmässig auf technische Herausforderungen, die sonst noch kein Mensch zuvor gesehen hat.

Nagios Addon für Firefox

Für den Firefox Browser gibt es ein interessantes AddOn für alle Nagios User. Mit dem Nagios Checker von Petr Simek kann man sich den Status seines Netzwerks einfach und platzsparend in der Statuszeile des Browsers anzeigen lassen. Das Plugin ruft sich alle benötigten Infos direkt aus dem Webinterface eines oder sogar mehrerer Nagios Server ab. Normalerweise sieht man nur eine grobe Statusangabe, aber per Mouse Over hat man auch Zugriff auf alle Details. Gerade mit der Möglichkeit die Statusdaten mehrerer Nagiosserver konsolidiert an einer Stelle einzusehen, bietet das Tool einen echten Mehrwert.

Julian Hein
Julian Hein
Executive Chairman

Julian ist Gründer und Eigentümer der NETWAYS Gruppe und kümmert sich um die strategische Ausrichtung des Unternehmens. Neben seinem technischen und betriebswirtschaftlichen Background ist Julian häufig auch kreativer Kopf und Namensgeber, beispielsweise auch für Icinga. Darüber hinaus ist er als CPO (Chief Plugin Officer) auch für die konzernweite Pluginstrategie verantwortlich und stösst regelmässig auf technische Herausforderungen, die sonst noch kein Mensch zuvor gesehen hat.

Netscape ist Geschichte

AOL Time Warner hat alle Entwickler, die am einst so erfolgreichen Netscape Browser gearbeitet haben, entlassen. Der Browser lebt jetzt nur noch als Open Source Projekt Mozilla weiter.

Julian Hein
Julian Hein
Executive Chairman

Julian ist Gründer und Eigentümer der NETWAYS Gruppe und kümmert sich um die strategische Ausrichtung des Unternehmens. Neben seinem technischen und betriebswirtschaftlichen Background ist Julian häufig auch kreativer Kopf und Namensgeber, beispielsweise auch für Icinga. Darüber hinaus ist er als CPO (Chief Plugin Officer) auch für die konzernweite Pluginstrategie verantwortlich und stösst regelmässig auf technische Herausforderungen, die sonst noch kein Mensch zuvor gesehen hat.