سرویس NetworkManager-dispatcher
یک سرویس
فعالشونده
از طریق D-Bus
است که
اسکریپتهای
ارائهشده
توسط کاربر
را هنگام
وقوع
تغییرات
خاص در NetworkManager
اجرا
میکند.
سرویس NetworkManager-dispatcher
اسکریپتهای
موجود در
دایرکتوری
/{etc,usr/lib}/NetworkManager/dispatcher.d یا
زیردایرکتوریهای
آن را به
ترتیب
الفبایی در
پاسخ به
رویدادهای
شبکه اجرا
خواهد کرد.
فایلهای
موجود در /etc
نسبت به
فایلهای
همنام در /usr/lib
اولویت
دارند. هر
اسکریپت
باید یک
فایل
اجرایی
معمولی با
مالکیت root
باشد. افزون
بر این،
نباید توسط
گروه یا
دیگران
قابل نوشتن
باشد، و
نباید
دارای بیت setuid
باشد.
هر
اسکریپت دو
آرگومان
دریافت
میکند؛
اولی نام
رابط
دستگاهی
است که
عملیات روی
آن رخ داده
است و دومی
کنش (action) است.
برای
کنشهای
مربوط به
دستگاه،
رابط همان
نام رابط
هسته است که
برای
پیکربندی IP
مناسب است.
بنابراین،
بسته به
مورد، یکی
از مقادیر
VPN_IP_IFACE، DEVICE_IP_IFACE یا DEVICE_IFACE
خواهد بود.
برای کنش hostname
نام دستگاه
همیشه
برابر با "none"
است. برای
connectivity-change و dns-change
این مقدار
خالی است.
کنشها
عبارتند
از:
pre-up
رابط به
شبکه متصل
شده است اما
هنوز
بهطور
کامل فعال
نشده است.
اسکریپتهایی
که برای این
رویداد عمل
میکنند
باید در
دایرکتوری
/etc/NetworkManager/dispatcher.d/pre-up.d قرار
داده شوند
یا پیوند
نمادین (symlink)
شوند، و NetworkManager
پیش از
اعلام
فعالسازی
کامل رابط
به
برنامهها،
منتظر
اتمام
اجرای
اسکریپت
خواهد
ماند.
up
رابط
فعال شده
است.
pre-down
رابط
غیرفعال
خواهد شد
اما هنوز از
شبکه قطع
نشده است.
اسکریپتهایی
که برای این
رویداد عمل
میکنند
باید در
دایرکتوری
/etc/NetworkManager/dispatcher.d/pre-down.d قرار
داده شوند
یا پیوند
نمادین
شوند، و NetworkManager
پیش از قطع
رابط از
شبکهاش،
منتظر
اتمام
اجرای
اسکریپت
خواهد ماند.
توجه داشته
باشید که
این رویداد
برای
قطعشدنهای
اجباری،
مانند قطع
شدن سیگنال
حامل (carrier) یا
تضعیف
سیگنال
بیسیم،
منتشر
نمیشود.
این رویداد
تنها زمانی
منتشر
میشود که
فرصتی برای
رسیدگی
تمیز به
رویداد قطع
اتصال شبکه
وجود داشته
باشد.
down
رابط
غیرفعال
شده است.
vpn-pre-up
اتصال VPN
به شبکه
متصل شده
است اما
هنوز
بهطور
کامل فعال
نشده است.
اسکریپتهایی
که برای این
رویداد عمل
میکنند
باید در
دایرکتوری
/etc/NetworkManager/dispatcher.d/pre-up.d قرار
داده شوند
یا پیوند
نمادین
شوند، و NetworkManager
پیش از
اعلام
فعالسازی
کامل VPN به
برنامهها،
منتظر
اتمام
اجرای
اسکریپت
خواهد
ماند.
vpn-up
یک اتصال
VPN فعال شده
است.
vpn-pre-down
اتصال VPN
غیرفعال
خواهد شد
اما هنوز از
شبکه قطع
نشده است.
اسکریپتهایی
که برای این
رویداد عمل
میکنند
باید در
دایرکتوری
/etc/NetworkManager/dispatcher.d/pre-down.d قرار
داده شوند
یا پیوند
نمادین
شوند، و NetworkManager
پیش از قطع VPN
از
شبکهاش،
منتظر
اتمام
اجرای
اسکریپت
خواهد ماند.
توجه داشته
باشید که
این رویداد
برای
قطعشدنهای
اجباری،
مانند بسته
شدن
غیرمنتظره VPN
یا از دست
رفتن اتصال
کلی، منتشر
نمیشود.
این رویداد
تنها زمانی
منتشر
میشود که
فرصتی برای
رسیدگی
تمیز به
رویداد قطع
اتصال VPN وجود
داشته
باشد.
vpn-down
یک اتصال
VPN غیرفعال
شده است.
hostname
نام
میزبان (hostname)
سیستم
بهروزرسانی
شده است.
برای
دریافت آن
از gethostname(2)
استفاده
کنید. نام
رابط
(آرگومان
نخست) خالی
است و هیچ
متغیر
محیطی برای
این کنش
تنظیم
نمیشود.
dhcp4-change
اجاره (lease)
در DHCPv4 تغییر
کرده است
(تمدید،
اتصال مجدد
و غیره).
dhcp6-change
اجاره در
DHCPv6 تغییر
کرده است
(تمدید،
اتصال مجدد
و غیره).
connectivity-change
وضعیت
اتصال شبکه
تغییر کرده
است (عدم
اتصال،
آنلاین شدن
و غیره).
reapply
اتصال
مجدداً روی
دستگاه
اعمال شد.
dns-change
پیکربندی
DNS تغییر کرده
است. این کنش
حتی اگر NetworkManager
طوری
پیکربندی
شده باشد که
resolv.conf را مدیریت
نکند (برای
نمونه از
طریق dns=none)
برانگیخته
میشود. در
چنین
حالتی،
اسکریپت
توزیعکننده
میتواند
با نگاه
کردن به
فایل /run/NetworkManager/resolv.conf
پیکربندی DNS
ارائهشده
توسط
اتصالات
فعال کنونی
را کشف کند.
device-add
این کنش
زمانی
فراخوانی
میشود که
یک اتصال از
نوع generic ویژگی
generic.device-handler را
تنظیم کرده
باشد. این
ویژگی نام
اسکریپت
توزیعکنندهای
را مشخص
میکند که
باید در
دایرکتوری
/{etc,usr/lib}
/NetworkManager/dispatcher.d/device
اجرا شود.
توجه داشته
باشید که
برخلاف
سایر
کنشها،
تنها یک
اسکریپت
اجرا
میشود.
اسکریپت
باید هر
اقدام لازم
برای ایجاد
دستگاه
مربوط به
اتصال generic را
انجام دهد.
در صورت
خاتمه
موفقیتآمیز،
اسکریپت
مقدار صفر
را
برمیگرداند.
در غیر این
صورت، برای
نشان دادن
خطا یک
مقدار
غیرصفر
برمیگرداند.
اسکریپت
میتواند
با نوشتن در
خروجی
استاندارد
(stdout)، مقادیر
را به NetworkManager
بازگرداند؛
هر خط باید
شامل یک نام
کلید به
همراه
علامت
مساوی '=' و
مقدار کلید
باشد.
کلیدهایی
که در حال
حاضر
شناخته
میشوند
عبارتند
از:
IFINDEX
نمایانگر
نمایه رابط
(interface index) مربوط به
رابط
ایجادشده
توسط
اسکریپت
است. این
کلید هنگام
موفقیت
اسکریپت
الزامی
است؛ اگر
تنظیم
نشود،
فعالسازی
شکست خواهد
خورد. در
صورت شکست
اسکریپت،
این کلید
نادیده
گرفته
میشود.
ERROR
یک پیام
خطا که دلیل
شکست
اسکریپت را
مشخص
میکند
تعیین
مینماید.
در صورت
موفقیت
اسکریپت
نادیده
گرفته
میشود.
از آنجا که
سرویس
توزیعکننده
برای تجزیه
این کلیدها
خروجی
استاندارد
را دریافت
میکند، هر
چیزی که در stdout
نوشته شود
در گزارش
لاگ ژورنال
سرویس
توزیعکننده
نمایش داده
نخواهد شد.
اگر
میخواهید
پیامهایی
را در
ژورنال چاپ
کنید (مثلاً
برای
اشکالزدایی)،
از stderr
استفاده
کنید. تنها
نخستین ۸
کیلوبایت (8KiB)
از stdout و در
میان آن
تنها ۶۴ خط
نخست در نظر
گرفته
میشوند؛
باقی
نادیده
گرفته
میشود.
device-delete
این کنش
همتای device-add است
و برای حذف
دستگاه
مربوط به یک
اتصال generic
فراخوانی
میشود.
تمامی
جنبههای
شرحدادهشده
برای device-add در
مورد این
کنش نیز صدق
میکنند،
با این
استثنا که
کلید IFINDEX
نادیده
گرفته
میشود.
نیازی به
حذف پیوند
هسته در
گرداننده (handler)
نیست زیرا
NetworkManager قبلاً
این کار را
انجام
میدهد؛
بنابراین
این کنش
برای
هرگونه
پاکسازی
اضافی مورد
نیاز مفید
است.
محیط اجرا
(environment) حاوی
اطلاعات
بیشتری
درباره
رابط و
اتصال است.
متغیرهای
زیر برای
استفاده در
اسکریپتهای
توزیعکننده
در دسترس
هستند:
NM_DISPATCHER_ACTION
کنش
توزیعکننده
مانند "up" یا
"dhcp4-change"، همسان
با آرگومان
نخست خط
فرمان. از
نسخه 1.12.0 NetworkManager به
بعد.
CONNECTION_UUID
شناسه
یکتای
جهانی (UUID)
نمایه
اتصال.
CONNECTION_ID
نام (ID)
نمایه
اتصال.
CONNECTION_DBUS_PATH
مسیر D-Bus
اتصال در
NetworkManager.
CONNECTION_FILENAME
نام فایل
پشتیبان
نمایه
اتصال (در
صورت وجود).
CONNECTION_EXTERNAL
اگر
مقدار آن "1"
باشد، نشان
میدهد که
اتصال یک
پیکربندی
شبکه
ایجادشده
در خارج از
NetworkManager را توصیف
میکند.
DEVICE_IFACE
نام رابط
کنترلی
دستگاه.
بسته به نوع
دستگاه،
این نام با
DEVICE_IP_IFACE متفاوت
است. برای
نمونه برای
دستگاههای
ADSL میتواند 'atm0'
یا برای
دستگاههای
WWAN ممکن است 'ttyUSB0'
باشد.
DEVICE_IP_IFACE
نام رابط
IP دستگاه. این
همان رابط
شبکهای
است که
آدرسهای IP و
مسیرها روی
آن
پیکربندی
خواهند شد.
IP4_ADDRESS_N
آدرس IPv4 در
قالب "address/prefix gateway"،
که در آن N
عددی از 0 تا
(تعداد
آدرسهای IPv4
منهای ۱) است.
مورد gateway در
این متغیر
منسوخ شده
است، به جای
آن از IP4_GATEWAY
استفاده
کنید.
IP4_NUM_ADDRESSES
این
متغیر حاوی
تعداد
آدرسهای IPv4
است که
اسکریپت
ممکن است
انتظار
داشته
باشد.
IP4_GATEWAY
آدرس
گیتوی
(دروازه) IPv4 با
قالببندی
سنتی اعداد
و نقطه.
IP4_ROUTE_N
مسیر IPv4 در
قالب "address/prefix next-hop
metric"، که در آن N
عددی از 0 تا
(تعداد
مسیرهای IPv4
منهای ۱)
است.
IP4_NUM_ROUTES
این
متغیر حاوی
تعداد
مسیرهای IPv4
است که
اسکریپت
ممکن است
انتظار
داشته
باشد.
IP4_NAMESERVERS
این
متغیر حاوی
فهرستی از
سرورهای DNS
است که با
فاصله از هم
جدا
شدهاند.
IP4_DOMAINS
این
متغیر حاوی
فهرستی از
دامنههای
جستجو است
که با فاصله
از هم جدا
شدهاند.
DHCP4_<dhcp-option-name>
اگر
اتصال برای
پیکربندی
آدرس از DHCP
استفاده
کرده باشد،
پیکربندی DHCP
دریافتشده
با استفاده
از نامهای
استاندارد
گزینههای DHCP
با پیشوند
"DHCP4_" در
متغیرهای
محیطی
ارسال
میشود،
مانند
"DHCP4_HOST_NAME=foobar".
IP6_<name> و DHCP6_<name>
متغیرهای
مشابه IPv4 برای
IPv6 نیز در
دسترس
هستند، اما
پیشوندهای
آنها به
ترتیب IP6_ و DHCP6_
است.
CONNECTIVITY_STATE
وضعیت
اتصال
شبکه، که
میتواند
مقادیر
تعریفشده
توسط نوع NMConnectivityState
از API مربوط به
org.freedesktop.NetworkManager D-Bus را
بگیرد: UNKNOWN، NONE،
PORTAL، LIMITED یا FULL.
توجه: این
متغیر فقط
برای
کنشهای connectivity-change
تنظیم
میشود.
در صورت
استفاده از
VPN، متغیر VPN_IP_IFACE
تنظیم
میشود، و
متغیرهای *IP4_
و *IP6_ با
پیشوند VPN
نیز
برونریزی
(export) میشوند،
مانند VPN_IP4_ADDRESS_0 و
VPN_IP4_NUM_ADDRESSES.
محتوای
تنظیم user
برای
اتصالی که
در حال فعال
شدن است نیز
از طریق
متغیرهای
محیطی
ارسال
میشود. هر
کلید در
متغیری با
نام CONNECTION_USER_
متصلشده
به کدگذاری
نام کلید
ذخیره
میشود. این
کدگذاری به
صورت زیر
عمل
میکند:
•حروف
کوچک به
حروف بزرگ
تبدیل
میشوند
•حروف
بزرگ با یک
زیرخط (underscore)
پیشوندگذاری
میشوند
•اعداد
تغییر
نمیکنند
•نقطه با
دو زیرخط
جایگزین
میشود
•هر
نویسه دیگر
با یک زیرخط
و به دنبال
آن نمایش
هشتهشتی
(اکتال) ۳
رقمی آن
کدگذاری
میشود
برای
نمونه،
کلید test.foo-Bar2 در
متغیری با
نام CONNECTION_USER_TEST__FOO_055_BAR2
ذخیره
میشود.
اسکریپتهای
توزیعکننده
یکی پس از
دیگری، اما
به صورت
ناهمگام (asynchronous)
از فرایند
اصلی NetworkManager
اجرا
میشوند و
در صورتی که
اجرای
آنها بیش
از حد طول
بکشد،
متوقف (kill)
خواهند شد.
اگر
اسکریپت
شما ممکن
است زمان
نامشخصی
برای تکمیل
نیاز داشته
باشد، باید
یک فرایند
فرزند (child process)
ایجاد کنید
و فرایند
والد
بلافاصله
خاتمه یابد.
اسکریپتهایی
که
پیوندهای
نمادین
اشارهکننده
به داخل
دایرکتوری
/etc/NetworkManager/dispatcher.d/no-wait.d/
هستند،
بلافاصله،
بدون
انتظار
برای پایان
اسکریپتهای
پیشین و به
صورت موازی
اجرا
میشوند.
همچنین
توجه داشته
باشید که
وقتی یک
اسکریپت در
صف قرار
گرفت،
همواره
اجرا خواهد
شد، حتی اگر
یک رویداد
بعدی آن را
منسوخ یا
بیاستفاده
کند. (برای
نمونه، اگر
یک رابط
بالا بیاید
و سپس
سریعاً
دوباره
پایین
برود، این
احتمال
وجود دارد
که یک یا چند
اسکریپت "up"
پس از پایین
رفتن رابط
اجرا شوند.)