滿意用量

請搭配任何 happy-* 指令使用 -h 旗標,查看該指令的說明和選項清單。

狀態檔案

Happy 會在 JSON 檔案中儲存及小心維護其拓樸狀態,且只會儲存單一記錄。使用這個狀態檔案,Happy 就能執行適當的指令,建立或移除拓樸。

預設狀態檔案位於 ~/.happy_state.json。預設的狀態名稱為 happy,如 happy-state 輸出內容所示:

happy-state

State Name:  happy

平行狀態

Happy 支援多個並行狀態同時存在。目前狀態由 HAPPY_STATE_ID 環境變數決定。如果環境中沒有 HAPPY_STATE_ID,系統會使用 happy 的預設狀態值。

「Happy」安裝期間未建立「HAPPY_STATE_ID」。請建立值為 state 以外的值,立即切換至其他 Happy 狀態。

export HAPPY_STATE_ID="sunny"

接著,我們來查看 happy-state 在不同狀態下的結果:

happy-state

State Name:  sunny

每個狀態都會保留在專屬的 ~/.${HAPPY_STATE_ID}_state.json 檔案中。如要切換狀態,請再次執行 export HAPPY_STATE_ID="<state-name>" 指令。

使用並行狀態解除安裝

如果您使用平行 Happy 狀態,並且想要解除安裝 Happy,請務必針對每個啟用的狀態執行 happy-state-delete。這樣可確保 Happy 建立的所有網路命名空間都會從系統中移除,不會影響 Linux 主機網路設定。

例如,假設有兩個狀態是 happysunny

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

視需要手動移除每個平行狀態檔案:

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

記錄

根據預設,Happy 會將記錄傳送至 syslog。第二個記錄檔備份會傳送至 /tmp/${HAPPY_STATE_ID}_debug_log.txt

如要查看 Happy 記錄,請在獨立的終端機視窗中執行 happy-state -l。輸入 Happy 指令時,記錄會顯示背景中執行的殼層指令 Happy 問題。如果您對 Linux 網路命名空間有興趣,這是瞭解 Happy 的運作方式的好方法。

舉例來說,happy-node-add node00 會建立快樂節點。這個指令的記錄輸出如下:

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

所有 Driver:CallCmd() 行都是 Happy 呼叫的殼層指令。請參考記錄中的每一行:

# 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

範例拓撲

我們在 Happy 和 OpenWeave 存放區中都納入了可供測試的拓樸結構範例。還能透過這些指令學習指令,進而建構複雜的拓撲。

拓樸圖採用 JSON 和 Shell 指令碼格式。

JSON

系統會使用 happy-state-loadweave-state-load 指令載入 JSON 拓樸檔案。如果拓樸包含 Weave,您必須使用 weave-state-load 載入拓樸,否則會略過 Weave 專屬指令。

例如,不含 Weave 的拓撲:

happy-state-load thread_wifi_ap_internet.json

含有 Weave 的拓撲:

weave-state-load three_nodes_on_thread_weave.json

如要將目前的拓樸儲存為單獨的 JSON 檔案,以供日後使用 (例如 測試案例指令碼),請使用 happy-shell -s

happy-shell -s my_topology.json

這項操作會將拓撲狀態檔案儲存在 $HOME 目錄中。

殼層指令碼

殼層指令碼定格檔包含 Happy 和 Weave 指令組合,可在對應的 JSON 檔案中建立定格。根據預設,這些指令碼沒有可執行的權限。您可以透過兩種方式執行這些指令碼:

使用 bash 指令:

bash thread_wifi_ap_internet.sh

套用可執行權限:

chmod +x thread_wifi_ap_internet.sh
./thread_wifi_ap_internet.sh

設定

Happy 有三個設定檔:

Configuration File (設定檔)說明
~/.happy_conf.json個人或外掛程式使用的組態變數。請使用 happy-configuration 指令設定這些值。
<path-to-happy>/happy/conf/main_config.json主要快樂設定變數。
<path-to-happy>/happy/conf/log_config.json記錄設定。

新增設定變數

建議您使用 happy-configuration 指令來設定任何個人或外掛程式變數,而不使用預設的 Happy 部署作業。

舉例來說,如要讓 Happy 知道在哪裡可以找到測試指令碼的 Weave test-apps 目錄,請設定 weave_path 變數:

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

Happy 會在 ~/.happy_conf.json 中儲存設定變數。

節點中的程序

Happy 提供命令,可在模擬節點中啟動及停止程序。

如何啟動程序:

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

舉例來說,如要在名為 ThreadNode 的節點中持續執行 ping 作業,請按照下列步驟操作:

happy-process-start ThreadNode ContinuousPing ping 8.8.8.8

在上述範例中,ContinuousPing 是使用者定義的程序名稱,Happy 會使用這個名稱來管理該程序。使用 happy-process-wait 可暫停程序執行作業,使用 happy-process-stop 則可終止程序。

程序輸出位於 /tmp。舉例來說,啟動 ContinuousPing 程序後,請檢查 /tmp 目錄:

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

這個 .out 檔案包含 ContinuousPing 程序的輸出內容。

sudo 的用量

快樂地變更由 Linux 核心控管的網路設定。由於只有 root 可以變更核心設定,因此 Happy 會在作業期間提示您輸入 sudo 密碼。

Happy 會使用 $SUDO 系統環境變數呼叫 sudo。如未定義 $SUDO,Happy 會發出一般的 sudo 呼叫。

Python 指令碼

安裝完成後,您可以使用以下 import 陳述式,將 Happy Python 套件匯入至 Python 環境:

import happy

/happy 中找到的個別指令模組會匯入如下:

import happy.HappyNodeAdd

如要擷取模組選項,請呼叫 option() 函式。例如,如要擷取 HappyNodeAdd 模組選項:

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