Viel Spaß

Verwenden Sie das Flag -h mit einem beliebigen happy-*-Befehl, um die Hilfe und eine Liste der Optionen für diesen Befehl aufzurufen.

Statusdateien

Happy speichert und verwaltet seinen Topologiezustand sorgfältig in einer JSON-Datei mit einem einzelnen Datensatz. Mithilfe dieser Statusdatei kann Happy die entsprechenden Befehle zum Erstellen oder Entfernen einer Topologie ausführen.

Die Standardstatusdatei befindet sich unter ~/.happy_state.json. Der Standardstatusname ist happy, wie in der happy-state-Ausgabe zu sehen:

happy-state

State Name:  happy

Parallele Status

Happy unterstützt mehrere parallele Zustände. Der aktuelle Status wird durch die Umgebungsvariable HAPPY_STATE_ID bestimmt. Wenn HAPPY_STATE_ID in der Umgebung nicht vorhanden ist, wird der Standardstatuswert happy verwendet.

HAPPY_STATE_ID wird bei der Happy-Installation nicht erstellt. Erstellen Sie eine mit einem anderen Wert als state, um sofort zu einem anderen Status des Typs „Glücklich“ zu wechseln.

export HAPPY_STATE_ID="sunny"

Jetzt prüfen wir die happy-state-Ergebnisse in einem anderen Bundesstaat:

happy-state

State Name:  sunny

Jeder Status wird in einer eigenen ~/.${HAPPY_STATE_ID}_state.json-Datei verwaltet. Führen Sie den Befehl export HAPPY_STATE_ID="<state-name>" noch einmal aus, um zwischen den Status zu wechseln.

Deinstallation mit parallelen Status

Wenn Sie parallele „Happy“-Status verwenden und „Happy“ deinstallieren möchten, müssen Sie happy-state-delete mit jedem aktiven Status ausführen. So werden alle von Happy erstellten Netzwerknamenräume aus Ihrem System entfernt, ohne dass die Linux-Hostnetzwerkkonfiguration beeinträchtigt wird.

Beispiel mit den beiden Status happy und sunny:

export HAPPY_STATE_ID="sunny"
happy-state-delete
export HAPPY_STATE_ID="happy"
happy-state-delete

Entfernen Sie bei Bedarf jede Parallelstatusdatei manuell:

rm -f ~/.sunny_state.json
rm -f ~/.sunny_state.json.lock
rm -f ~/.happy_state.json
rm -f ~/.happy_state.json.lock

Logs

Happy sendet standardmäßig Protokolle an syslog. Eine zweite Protokollsicherung wird an /tmp/${HAPPY_STATE_ID}_debug_log.txt gesendet.

Wenn Sie Happy-Protokolle aufrufen möchten, führen Sie happy-state -l in einem separaten Terminalfenster aus. Wenn Sie Happy-Befehle eingeben, werden in den Protokollen die Shell-Befehle Happy-Probleme im Hintergrund angezeigt. Dies ist ein gutes Verständnis dafür, wie Happy funktioniert, wenn Sie an Linux-Netzwerk-Namespaces interessiert sind.

Mit happy-node-add node00 wird beispielsweise ein Happy-Knoten erstellt. Die Logausgabe für diesen Befehl sieht so aus:

DEBUG [HappyHost:_namespaceExists():56] Happy: namespace happy000 does not exist
DEBUG [Driver:writeState():365] Happy: writing Happy state to file
DEBUG [Driver:CallCmd():416] Happy [happy]: > sudo ip netns add happy000
DEBUG [HappyHost:_namespaceExists():56] Happy: namespace happy000 exists
DEBUG [Driver:CallCmd():416] Happy [happy]: > sudo ip netns exec happy000 ifconfig lo up

Alle Driver:CallCmd()-Zeilen sind die Shell-Befehle, die von Happy aufgerufen werden. Sehen wir uns die einzelnen Zeilen des Logs an:

# Check to see if the target namespace (happy000) exists
DEBUG [HappyHost:_namespaceExists():56] Happy: namespace happy000 does not exist

# Write the link between node00 and happy000 in ~/.happy_state.json
DEBUG [Driver:writeState():365] Happy: writing Happy state to file

# Create the network namespace for the node
DEBUG [Driver:CallCmd():416] Happy [happy]: > sudo ip netns add happy000

# Check to see if the target namespace (happy000) exists
DEBUG [HappyHost:_namespaceExists():56] Happy: namespace happy000 exists

# Bring up the loopback interface within the happy000 namespace
DEBUG [Driver:CallCmd():416] Happy [happy]: > sudo ip netns exec happy000 ifconfig lo up

Beispieltopologien

Beispieltopologien sind sowohl im Happy- als auch im OpenWeave-Repository zum Testen enthalten. Außerdem können Sie die Befehle zum Erstellen komplexer Topologien kennenlernen.

Topologien sind im JSON- und Shell-Script-Format.

JSON

JSON-Topologiedateien werden mit den Befehlen happy-state-load oder weave-state-load geladen. Wenn die Topologie Weave enthält, müssen Sie weave-state-load verwenden, um die Topologie zu laden. Andernfalls werden die Weave-spezifischen Befehle übersprungen.

Eine Topologie ohne Weave:

happy-state-load thread_wifi_ap_internet.json

Eine Topologie mit Weave:

weave-state-load three_nodes_on_thread_weave.json

Wenn Sie Ihre aktuelle Topologie als separate JSON-Datei für spätere Verwendung speichern möchten (z. B. in einem Testfall-Script), verwenden Sie happy-shell -s:

happy-shell -s my_topology.json

Dadurch wird die Topologiestatusdatei im Verzeichnis $HOME gespeichert.

Shell-Scripts

Shell-Script-Topologiedateien enthalten die Happy- und Weave-Befehle zum Erstellen der Topologien in den entsprechenden JSON-Dateien. Diese Skripts haben standardmäßig keine ausführbaren Berechtigungen. Sie können auf zwei Arten ausgeführt werden:

Mit dem Befehl bash:

bash thread_wifi_ap_internet.sh

Durch Anwenden von ausführbaren Berechtigungen:

chmod +x thread_wifi_ap_internet.sh
./thread_wifi_ap_internet.sh

Konfiguration

Happy verfügt über drei Konfigurationsdateien:

KonfigurationsdateiBeschreibung
~/.happy_conf.jsonKonfigurationsvariablen für den privaten Gebrauch oder die Verwendung von Plug-ins. Legen Sie diese Werte mit dem Befehl happy-configuration fest.
<path-to-happy>/happy/conf/main_config.jsonPrimäre Happy-Konfigurationsvariablen.
<path-to-happy>/happy/conf/log_config.jsonLogkonfiguration.

Konfigurationsvariablen hinzufügen

Wir empfehlen, mit dem Befehl happy-configuration alle persönlichen oder Plug-in-Variablen festzulegen, die über die Standardwerte hinausgehen, die für Ihre spezifische Bereitstellung von Happy benötigt werden.

Wenn Sie Happy beispielsweise mitteilen möchten, wo sich das Weave-Verzeichnis test-apps für Testscripts befindet, legen Sie die Variable weave_path fest:

happy-configuration weave_path <path-to-openweave-core>/build/x86_64-unknown-linux-gnu/src/test-apps

Happy speichert Konfigurationsvariablen in ~/.happy_conf.json.

Prozesse in Knoten

Happy bietet Befehle zum Starten und Beenden von Prozessen in simulierten Knoten.

So starten Sie einen Prozess:

happy-process-start <node-name> <custom-process-name> <command>

So führen Sie beispielsweise kontinuierlich einen Ping in einem Knoten namens ThreadNode aus:

happy-process-start ThreadNode ContinuousPing ping 8.8.8.8

Im obigen Beispiel ist „ContinuousPing“ der benutzerdefinierte Name für den Prozess, den Happy zum Verwalten des Prozesses verwendet. Mit happy-process-wait können Sie die Prozessausführung pausieren und mit happy-process-stop den Prozess beenden.

Die Prozessausgabe befindet sich in /tmp. Prüfen Sie beispielsweise nach dem Starten des ContinuousPing-Prozesses das Verzeichnis /tmp:

ls /tmp/happy*
/tmp/happy_018691_1524087014.192197_ContinuousPing.out

Diese .out-Datei enthält die Ausgabe für den ContinuousPing-Prozess.

Nutzung von sudo

Happy ändert die Netzwerkkonfiguration, die vom Linux-Kernel gesteuert wird. Da nur root die Kernelkonfiguration ändern kann, werden Sie von Happy während des Betriebs aufgefordert, das sudo-Passwort einzugeben.

Happy verwendet die Systemumgebungsvariable $SUDO, um sudo aufzurufen. Wenn $SUDO nicht definiert ist, führt Happy einen normalen sudo-Aufruf aus.

Python-Scripting

Nach der Installation können Happy Python-Pakete mit der folgenden import-Anweisung in eine Python-Umgebung importiert werden:

import happy

Die einzelnen in /happy gefundenen Befehlsmodule werden so importiert:

import happy.HappyNodeAdd

Rufen Sie die Funktion option() auf, um die Moduloptionen abzurufen. So rufen Sie beispielsweise HappyNodeAdd-Moduloptionen ab:

module options
import happy.HappyNodeAdd
options = happy.HappyNodeAdd.option()