NordVPN Status in Xfce Panelleiste anzeigen

Kali-Linux hatte mich zu einem kleinen aber nützlichen Feature inspiriert, dass ich gerne auf meinem Arch-System übernehmen wollte. Es geht dabei um eine Anzeige in der Xfce-Panelleiste, die mir sagt ob ich eine aktive VPN-Verbindung habe, oder eben nicht. Ich wollte so etwas ähnliches haben, das allerdings mehr auf NordVPN zugeschnitten ist. Also begann ich mich zu informieren, was hinter der Anzeige in Kali steckt.

Das Panel-Item für diese Anzeige ist ein zusätzliches Plugin, das nicht von Haus aus mit Xfce geliefert wird. Es heißt Generic Monitor und kann ganz normal über pacman installiert werden.

sudo pacman -Syy
sudo pacman -S xfce4-genmon-plugin

Anschließend kann man das neue Plugin dem Panel hinzufügen. Dazu Rechtsklick auf das Panel, Untermenü „Panel“ -> „Add New Items“. In der aufpoppenden Liste wählt man dann das Generic Monitor-Plugin aus.

In den Einstellungen des Plugins (Rechtsklick auf das Plugin -> Properties) haben wir nun ein paar wenige Einstellungsmöglichkeiten.

  • Command: Das Bash-Script, das ausgeführt wird. Das, was das Script an den Standard-Output auswirft (printf), wird am Ende im GenMon angezeigt.
  • Label: Eine zusätzliche Beschriftung für das Panel-Item. Kann leer gelassen werden, wenn man keine Beschriftung möchte.
  • Period (s): Der Intervall, in dem das Bash-Script ausgeführt wird, angegeben in Sekunden.
  • Die Schriftart

Wir benötigen nun also ein Bash-Script, das uns den Status von nordvpn wiedergibt. nordvpn kommt hierfür praktischerweise mit einem Command, den wir uns zunutze machen können: nordvpn status

Mein Ziel ist es nun in dem GenMon-Panel darzustellen, ob und mit welchem Server ich verbunden bin. Wenn keine aktive NordVPN-Verbindung besteht, soll einfach nur der aktuelle Verbindungsstatus ausgegeben werden (i.d.R. „Disconnected“). Hierfür öffnen wir nun einen Texteditor unserer Wahl und schreiben uns ein neues Bash-Script, das genau diese Aufgabe für uns übernehmen soll. Ich nutze hierfür VS Code, aber ihr dürft natürlich nehmen, was immer ihr möchtet. Ob nun vi, vim, nano, Sublime Text oder etwas ganz anderes, das bleibt ganz euch überlassen.

Hier vorab das vollständige Script. Die Erklärung erfolgt darunter:

#!/bin/sh

nordvpnstatus="$(nordvpn status)"
connected=$(echo "$nordvpnstatus" 2>/dev/null | grep -o -P '(?<=Status: ).*')

if [ "$connected" == "Connected" ]; then 
  currentServer=$(echo "$nordvpnstatus" | grep -o -P '(?<=Current server: ).*')
  printf "<icon>network-vpn-symbolic</icon>"
  printf "<txt>${currentServer}</txt>"
else
  printf "<icon>network-vpn-symbolic</icon>"
  printf "<txt>${connected}</txt>"
fi

In Zeile 1 legen wir fest, wie Arch dieses Script behandeln soll. In unserem Fall soll es das Script mit sh ausführen. In Zeile 3 holen wir uns den Output von „nordvpn status“ und schreiben ihn in die Variable nordvpnstatus. Anschließend suchen wir mit grep innerhalb der Statusvariable nach dem Keyword „Status:  “ und speichern den Wert in die Variable connected.

In Zeile 6 beginnen wir eine IF-ELSE-Abfrage. Wir prüfen, ob der Inhalt der Variable connected gleich „Connected“ ist. Trifft dies zu, holen wir uns aus dem nordvpnstatus wieder mit grep und ein bisschen RegEx den aktuellen NordVPN-Server zu dem wir verbunden sind und speichern ihn in der Variable currentServer.
In Zeile 8 erfolgt die erste Ausgabe: Wir möchten ein Icon angezeigt bekommen, dass eine VPN-Verbindung symbolisch darstellt. In Zeile 9 schreiben wir einen Text. An dieser Stelle binden wir unsere Variable currentServer mit ein, damit die Ausgabe dynamisch angepasst wird und uns immer den aktuellen NordVPN-Server anzeigt.

Der ELSE-Block der ab Zeile 10 startet, definiert die Ausgabe wenn der Status nicht „Connected“ lautet. In diesem Fall sind wir also nicht mit einem NordVPN-Server verbunden und entsprechend nicht anonymisiert im Internet unterwegs. Wir fügen hier wieder in Zeile 11 das Icon für eine VPN-Verbindung ein und in Zeile 12 geben wir den aktuellen Connection-Status aus, der uns laut nordvpn status angezeigt werden würde. Zeile 13 schließt den kompletten IF-Block.

Das Script speichern wir uns nun ab. Ich habe mein Script in meinem Home-Verzeichnis als .nordvpnstatus.sh abgespeichert. Man beachte den Punkt vor dem Dateinamen, dadurch wird die Datei nämlich in der Standardansicht unsichtbar. Als nächstes müssen wir dieses Script noch ausführbar machen. Dazu öffnen wir uns ein Terminal, navigieren falls nötig in unser Home-Verzeichnis und tippen ein:

chmod +x .nordvpnstatus.sh

Nun müssen wir nur noch den Dateipfad zum Shell-Script kopieren und in den Einstellungen von GenMon einfügen (oder eben händisch eintippen). Den vollen Pfad zur Datei bekommt ihr übrigens ganz leicht mit readlink.

readlink -f .nordvpnstatus.sh
/home/damianryse/.nordvpnstatus.sh

Kopiert den Dateipfad, öffnet das Properties-Fenster von GenMon und fügt den Pfad bei Command ein. Das Label-Feld habe ich bei mir leer gelassen, da ich es nicht benötige. Period (s) habe ich auf 1.00 herunter gesetzt, so dass mein Shell-Script sekündlich ausgeführt wird und GenMon aktualisiert. Aber ihr könnt euch das natürlich so einstellen, wie es euch gefällt. Anschließend die neuen Einstellungen mit dem Save-Button bestätigen und GenMon aktualisiert sich auch sofort.

NordVPN ist verbunden und GenMon zeigt uns den aktuellen Server an, über den unsere VPN-Verbindung gerade geroutet wird.
Die Verbindung zu NordVPN ist getrennt. GenMon zeigt uns nun den Status an, den uns auch NordVPN mit nordvpn status anzeigt.

Versucht doch mal an dieser Stelle das Shell-Script nach euren Wünschen anzupassen. Vielleicht möchtet ihr z.B. statt des Servers lieber den Stadtnamen angezeigt bekommen? Tipp: Die notwendige Änderung muss in der Zeile 7 durchgeführt werden.
Eventuell wollt ihr auch beides, die Stadt und den Servernamen? Auch das ist natürlich möglich, erfordert aber eine zusätzliche Zeile. Anbei die Lösung für genau dieses:

#!/bin/sh

nordvpnstatus="$(nordvpn status)"
connected=$(echo "$nordvpnstatus" 2>/dev/null | grep -o -P '(?<=Status: ).*')

if [ "$connected" == "Connected" ]; then 
  currentServer=$(echo "$nordvpnstatus" | grep -o -P '(?<=Current server: ).*')
  currentCity=$(echo "$nordvpnstatus" | grep -o -P '(?<=City: ).*')
  printf "<icon>network-vpn-symbolic</icon>"
  printf "<txt>${currentCity} / ${currentServer}</txt>"
else
  printf "<icon>network-vpn-symbolic</icon>"
  printf "<txt>${connected}</txt>"
fi

 

Viel Spaß beim herum experimentieren und lasst es mich in den Kommentaren gerne wissen, wie ihr Eure Anzeige konfiguriert habt!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert