مع أطيب التحيّات،

استخدِم العلامة -h مع أي أمر happy-* لعرض المساعدة وقائمة options لهذا الأمر.

ملفات الحالة

تخزِّن Happy وتحافظ بعناية على حالة الشبكة في ملف JSON يحتوي على سجلّ واحد. باستخدام ملف الحالة هذا، يمكن لـ "هابي" تنفيذ الأوامر المناسبة ل إنشاء طوبولوجيا أو إزالتها.

يمكن العثور على ملف الحالة التلقائية في ~/.happy_state.json. اسم الحالة التلقائية هو happy، كما هو موضّح في ناتج happy-state:

happy-state

State Name:  happy

الدول المتوازية

تتيح حالة "سعيد" حالات متوازية متعدّدة متزامنة. يتم تحديد الحالة الحالية حسب متغيّر البيئة HAPPY_STATE_ID. إذا لم يكُن HAPPY_STATE_ID في البيئة، سيتم استخدام قيمة الحالة التلقائية التي تبلغ happy.

لم يتم إنشاء HAPPY_STATE_ID أثناء تثبيت 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 مع تفعيل كل حالة. يضمن ذلك إزالة جميع مساحات имен الشبكة التي أنشأها "سعيد" من نظامك بدون التأثير في إعدادات شبكة مضيف 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

السجلّات

يُرسِل "سعيد" السجلّات إلى syslog تلقائيًا. يتم إرسال نسخة احتياطية ثانية من السجلّ إلى /tmp/${HAPPY_STATE_ID}_debug_log.txt.

لعرض سجلات Happy، يمكنك تشغيل happy-state -l في نافذة وحدة طرفية منفصلة. عند إدخال أوامر Happy، تعرض السجلات مشاكل Happy لأوامر shell في الخلفية. هذه طريقة جيدة لفهم آلية عمل 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() هي أوامر shell التي يطلبها 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 Script.

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.

النصوص البرمجية لنظام التشغيل Shell

تحتوي ملفات المخططات في نصوص Shell البرمجية على مجموعة من أوامر 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.

على سبيل المثال، لإعلام "هابي" بمكان العثور على دليل 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:

happy-process-start ThreadNode ContinuousPing ping 8.8.8.8

في المثال أعلاه، ContinuousPing هو الاسم الذي يحدّده المستخدم للعملية التي يستخدمها "سعيد" لإدارة العملية. يمكنك استخدام happy-process-wait لتعليق تنفيذ العملية وhappy-process-stop لإنهاء العملية.

يمكن العثور على ناتج العملية في /tmp. على سبيل المثال، بعد بدء عملية ContinuousPing ، تحقَّق من الدليل /tmp:

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

يحتوي ملف .out هذا على ناتج عملية ContinuousPing.

استخدام sudo

يغيّر "سعيد" إعدادات الشبكة التي يتم التحكّم فيها من خلال نواة Linux. بما أنّ root وحده يمكنه تغيير إعدادات kernel، يطلب منك Happy إدخال كلمة مرور sudo أثناء العملية.

يستخدم Happy متغيّر بيئة النظام $SUDO للاتصال بـ sudo. إذا لم يتم تحديد $SUDO، تجري Happy مكالمة sudo عادية.

البرمجة النصية في بايثون

بعد التثبيت، يمكن استيراد حزم Happy Python إلى بيئة Python باستخدام عبارة import التالية:

import happy

يتم استيراد وحدات الأوامر الفردية المتوفّرة في /happy على النحو التالي:

import happy.HappyNodeAdd

لاسترداد خيارات الوحدة، استخدِم الدالة option(). على سبيل المثال، لاسترداد خيارات وحدة HappyNodeAdd:

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