שימוש מהנה

אפשר להשתמש בדגל -h עם כל פקודה מסוג happy-* כדי להציג את העזרה ואת רשימת האפשרויות של הפקודה הזו.

קבצים של המדינה

Happy שומר ומנהל בקפידה את מצב הטופולוגיה שלו בקובץ JSON עם רשומה אחת. באמצעות קובץ המצב הזה, Happy יכול להריץ את הפקודות המתאימות כדי ליצור או להסיר טופולוגיה.

קובץ המצב שמוגדר כברירת מחדל נמצא ב-~/.happy_state.json. שם ברירת המחדל של המצב הוא happy, כפי שמופיע בפלט happy-state:

happy-state

State Name:  happy

מצבים מקבילים

ב-Happy יש תמיכה במספר מצבים מקבילים שיכולים להתקיים זה לצד זה. המצב הנוכחי נקבע על ידי משתנה הסביבה HAPPY_STATE_ID. אם הערך HAPPY_STATE_ID לא קיים בסביבה, המערכת תשתמש בערך ברירת המחדל של המצב happy.

HAPPY_STATE_ID לא נוצר במהלך ההתקנה של Happy. כדי לעבור באופן מיידי למצב Happy אחר, צריך ליצור משתנה עם ערך שאינו state.

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.

לדוגמה, עם שני המצבים happy ו-sunny:

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. זוהי דרך טובה להבין איך Happy עובד, אם אתם מתעניינים במרחבי שמות של רשתות ב-Linux.

לדוגמה, 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 ובפורמט של סקריפט מעטפת.

JSON

קובצי טופוגרפיה של JSON נטענים באמצעות הפקודות happy-state-load או weave-state-load. אם הטופולוגיה כוללת את 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 יש שלושה קובצי תצורה:

קובץ תצורהתיאור
~/.happy_conf.jsonמשתני תצורה לשימוש אישי או לשימוש בפלאגין. כדי להגדיר את הערכים האלה, משתמשים בפקודה happy-configuration.
<path-to-happy>/happy/conf/main_config.jsonמשתני תצורה ראשיים של Happy.
<path-to-happy>/happy/conf/log_config.jsonהגדרת יומן.

הוספת משתני תצורה

מומלץ להשתמש בפקודה happy-configuration כדי להגדיר משתנים אישיים או משתנים פעילים מעבר לברירות המחדל שדרושה לפריסה הספציפית של Happy.

לדוגמה, כדי להודיע ל-Happy איפה נמצאת הספרייה test-apps של Weave ל-test scripts, מגדירים את המשתנה 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>

לדוגמה, כדי להריץ ping באופן רציף בצומת בשם ThreadNode:

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

שינויים בתצורת הרשת שנשלטת על ידי הליבה (kernel) של Linux. מכיוון שרק root יכול לשנות את תצורת הליבה, Happy מנחה אותך להזין את הסיסמה sudo במהלך הפעולה.

Happy משתמש במשתנה הסביבה המערכתי $SUDO כדי לקרוא ל-sudo. אם לא מגדירים את הערך $SUDO, Happy יבצע קריאת sudo רגילה.

כתיבת סקריפטים ב-Python

אחרי ההתקנה, אפשר לייבא חבילות של Happy Python לסביבת Python באמצעות הצהרת import הבאה:

import happy

מודולים נפרדים של פקודות שנמצאים ב-/happy מיובאים באופן הבא:

import happy.HappyNodeAdd

כדי לאחזר את אפשרויות המודול, קוראים לפונקציה option(). לדוגמה, כדי לאחזר את האפשרויות של המודול HappyNodeAdd:

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