אפשר להשתמש בדגל -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 לצורך בדיקה. השתמשו בהם גם כדי ללמוד את הפקודות לבניית טופולוגיות מורכבות.
- שמח:
/topologies
- OpenWeave:
/src/test-apps/happy/topologies/standalone
הטופולוגיות הן בפורמט 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()