Select Page

NETWAYS Blog

Mehrfachauswahl in Icinga Web 2

Icinga Web 2 bringt viele Interfaceverbesserungen, eine von den etwas weniger offensichtlichen ist der neue komfortablere Weg mehrere Hosts und Services gleichzeitig auszuwählen: Statt wie in der alten Weboberfläche über eine Liste von Checkboxen, funktioniert die Mehrfachauswahl jetzt über Strg und Shift wie in Desktopanwendungen.
Hier ein kleines Beispiel der praktischen Anwendung der Funktion:
1. Wir sehen auf dem Dashboard dass mehrere Hosts down und unbestätigt sind.
1-probleme-auf-dashboard
2. Mit der gedrückten Shift-Taste selektieren wir ein Intervall von 10 Hosts gleichzeitig, indem wir auf den ersten und letzten Host drücken. Durch die Auswahl öffnet sich die Detailansicht, die uns alle verfügbaren Aktionen auf den selektierten Hosts zeigt.
2-multiselection
3. In der Detailansicht können wir alle Host-Probleme bestätigen und sehen anschließend im Dashboard sofort die Auswirkungen unserer Aktion.
3-acknowledge
4-done
Neben Shift für die Auswahl von Intervallen, kann zusätzlich noch Strg verwendet werden um mehrere Objekte einzeln auszuwählen.

PHP SPL: Verkettete Listen

Eine nützliche Klasse die durch SPL ihren Einzug in PHP gefunden hat, ist die SplDoublyLinkedList, die Implementierung einer doppelt verketteten Liste.
Eine verkettete Liste ist eine dynamisch erweiterbare Datenstruktur, die beliebig viele Elemente speichern und enumerieren kann. In vielen Sprachen, in denen die Größe von Arrays bereits statisch beim Erstellen festgelegt wird, sind Listen deshalb ein wichtiger Grundbaustein um wachsende Datenstrukturen zu Implementieren. Da Arrays in PHP diese Einschränkungen nicht haben und damit generell bereits alle Möglichkeiten einer Liste bieten, gab es lange Zeit keine Implementierung in der PHP-Standardbibliothek.
Das verwenden einer SplDoubleLinkedList macht aber in vielen Bereich dennoch Sinn, da diese das Einfügen von Elementen an bestimmten Positionen einfacher und performanter macht. Wenn wir in einem normalen Array ein Element an einem bestimmten Index einfügen wollen ohne ein Element zu überschreiben, können wir array_splice verwenden.

$N = 10000;
$arr = array('foo', 'bar', 'baz');
for ($i = 0; $i < $N; $i++) {
    array_splice($arr, 1, 0, $item);
}

Wie wir feststellen ist diese Implementierung nicht sonderlich performant und das Einfügen von 10000 Elementen dauert bereits fast 10 Sekunden.

time php -f ./insert_at_array.php
real 0m10.116s
user 0m10.077s
sys 0m0.024s

Die SplDoublyLinkedList beherrscht seit Version 5.5 die Funktion SplDoublyLinkedList::add, die ein Element an eine bestimmte Position in die Liste einfügen kann.

$N = 10000;
$list = new SplDoublyLinkedList();
$list->push('foo');
$list->push('bar');
$list->push('baz');
for ($i = 0; $i < $N; $i++) {
    $list->add(1, $i);
}

Time verrät uns, dass diese Implementierung mit 47ms mehr als 200 mal schneller durchläuft als die mit regulären Arrays.

time php -f ./insert_at_list.php
real 0m0.047s
user 0m0.036s
sys 0m0.008s

Erklären lässt sich dieser Unterschied mit der internen Implementierung von Arrays in PHP. Diese sind in PHP eigentlich Hash-Tabellen, weshalb beim Aufruf von array_splice, alle nachfolgenden Elemente mit einem neuen Index versehen werden müssen. In einer verketteten Liste wird der Index eines Elements nicht gespeichert, sondern nur anhand der Position in der Kette aus Elementen definiert. Hier genügt es die Referenzen des Vorgängers und des Nachfolgers zu ändern um alle Nachfolger einen Index nach hinten zu verschieben.
 

Effizienter "bashen" mit Alias

Jeder der wie ich häufig mit dem Terminal arbeitet, erwischt sich vermutlich öfter dabei die selben Befehle unnötigerweise mehrfach einzugeben, obwohl die Shell sehr viele Mechanismen kennt um einem so etwas zu ersparen.
Neben der Möglichkeit mit den Pfeiltasten vergangene Eingaben abzurufen oder mit Tab zu vervollständigen, kann man auch einfach den Befehl alias verwenden um neue eigene Kurzbefehle zu definieren, die dann für die aktuelle Terminal-Session gültig sind. In diesem Blogpost will ich euch einige Aliasse vorstellen die mir das Leben leichter machen.

Größe aller Ordner ausgeben

Wer die Größe aller aktuellen Unterordner im Terminal herausfinden will, kann den Befehl du verwenden. Dieser gibt die Ausgabe allerdings in Bytes und unsortiert aus und wird rekursiv alle Unterordner anzeigen,  was wenig hilfreich ist. Mit ein paar Optionen kann man die Ausgabe allerdings anpassen:

alias duh='du -h --max-depth=1 | sort -h'
Freien Platz aller Festplatten anzeigen

Wie der Befehl du gibt auch df die Ausgabe in Bytes aus und lässt nützliche Informationen wie den Typ des Dateisystems weg.

alias df='df -kTh'
Nach Prozessen suchen

Mit p schnell nach bestimmten Prozessen suchen:

alias p="ps -e | grep -i "
Pakete installieren

Statt dem langen sudo apt-get install <pkg> kann man auch einfach einen kurzen Alias für den häufig verwendeten Befehl verwenden.

alias get='sudo apt-get install'
Dauerhaft speichern

Wenn die Aliase länger als die aktuelle Session halten sollen, kann man die Befehle in die ~/.bash_profile (oder unter Ubuntu die extra dafür reservierte ~/.bash_aliases) eintragen. Mit ein wenig Googeln findet man noch unzählige weitere nützliche Aliase, mit denen man sich das Leben im Terminal leichter machen kann.

Terminal-Farben für SSH-Hosts vergeben

Wer öfter mit SSH arbeitet, läuft schnell Gefahr die Übersicht über die offenen Remote-Terminals zu verlieren. Damit man nicht versehentlich Befehle auf dem falschen Host ausführt, wäre es sinnvoll die Farben automatisch zu wechseln, sobald man sich mit SSH auf einem neuen Host einloggt. Wenn man ein bisschen sucht, findet man für das Problem gleich mehrere Lösungen, die aber alle einige Nachteile haben: Oft funktionieren diese Lösungen nur für einen bestimmten Terminal-Emulator oder die Farben verschwinden nach dem ersten clear gleich wieder.
Wer eine umfassende Lösung will, kann das Programm Colorize verwenden. Colorize führt ein beliebiges Programm in einem virtuellen Terminal aus und ändert dabei die verwendeten Farben, ohne dass ein neues Terminal-Fenster geöffnet werden muss.
Zuerst compilen wir das Programm und verschieben es nach /usr/local:

./make
sudo cp ./colorize /usr/local/bin/colorize

Um die Farben für die einzelnen Hosts zu konfigurieren, wird die neue Datei ~/.ssh/host_colors erstellt. Jedem Host auf jeder Zeile kann im ersten Eintrag eine Hintergrundfarbe und im zweiten Eintrag eine Textfarbe zugewiesen werden. Bei den Farben muss eventuell ein bisschen probiert werden, da die Terminals oft nicht alle Farben unterstützen.

my.production.host 0x990000 0xffffff

Als nächstes muss in der ~/.bash_aliases noch eine Alias gesetzt werden, in dem ssh über colorize aufgerufen wird. Dabei wird die Konfiguration für den Host aus der eben erstellen host_colors geladen:

function colorssh() {
   if [ $# -gt 2 ]
     then
       # colorize only for simple ssh commands
       ssh "#@"
       return;
   fi
   host=$1;
   array=(`cat ~/.ssh/host_colors | egrep "^\s*$host\s+" | sed -e "s/^\s*//" | sed -e "s/\s\s*/ /"`)
   backg=${array[1]}
   foreg=${array[2]}
   if [ -z $backg ]
     then
       backg="0x111111";
   fi
   if [ -z $foreg ]
    then
      foreg="0xffffff";
    fi
   colorize -b $backg -f $foreg ssh "$@"
}
alias ssh=colorssh

Wenn man jetzt mit ssh den Host my.production.host öffnet, wird sich die die Farbe beim Start automatisch ändern.

An der Farbe kann man schnell erkennen, auf welchem Host sich das Terminal momentan befindet.

An der Farbe kann man schnell erkennen, auf welchem Host sich das Terminal momentan befindet.

Ordner im Netzwerk mit Csync synchronisieren

Wer einen Laptop zusammen mit einem Desktop oder Fileserver besitzt, wird schnell das Problem bekommen dass alle Dokumente und Dateien über mehrere Computer verteilt liegen und man unterwegs mit dem Laptop nie die passenden dabei hat. Die bekannteste Lösung für das Problem ist natürlich ein Cloud-Storage wie Dropbox oder OwnCloud. Wenn die Datenmengen sehr groß sind und man keine eigene Installation von OwnCloud im Heimnetzwerk verwalten will, ist so eine Lösung allerdings nicht wirklich geeignet.

Csync ist ein leichtgewichtiges Terminalprogramm mit dem Dateien und Ordner über das Netzwerk synchronisiert werden können. Die Namensverwandtschaft mit dem bekannten Rsync ist dabei kein Zufall, da Csync sehr ähnlich funktioniert. Der große Unterschied zu Rsync ist jedoch, dass Csync zwei Ordner bidirektional synchronisiert, was bedeutet dass Änderungen in beiden Ordnern erkannt werden um diese auf einen gemeinsamen Stand zu bringen. Wer das Programm installieren möchte findet hier eine Anleitung um Csync aus den Sourcen zu bauen, oder hier ein fertiges .DEB-Paket für 64-Bit Ubuntu/Mint.

Csync kann nach der Installation aus dem Terminal aufgerufen werden:

csync [SOURCE] [DESTINATION]

Source und Destionation können entweder lokale Ordner, oder Pfade auf Geräten im Netzwerk sein. Um auch entfernte Rechner zugreifen zu können muss ein SMB-Account mit Lese- und Schreibzugriff vorhanden sein.

csync ~/Music smb://matthias:passwort@MeinFileserver/Matthias/Music

Dieser Befehl würde alle Dateien in “Music” mit dem Fileserver synchronisieren. Dabei ist es egal ob Dateien auf dem Fileserver oder zuerst auf dem Laptop hinzugefügt oder gelöscht werden, da Csync anhand des Änderungsdatums und der gespeicherten Zustandsdaten erkennt welche Änderung im Netzwerk synchronisiert werden muss.

Wenn man möchte dass die Synchronisierung regelmäßig durchgeführt wird, kann man zum Beispiel CRON verwenden um den Befehl in gewissen Zeitabständen zu wiederholen lassen. Dieser Eintrag im Crontab würde Csync einmal pro Stunde aufrufen:

 0  * * * * csync /home/matthias/Music smb://matthias:passwort@MeinFileserver/Matthias/Music