NETWORKMANAGER-DISPATCHER(8) Network management daemons NETWORKMANAGER-DISPATCHER(8)

NetworkManager-dispatcher - اجرای اسکریپت‌های کاربر برای NetworkManager

NetworkManager [OPTIONS...]

سرویس 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" پس از پایین رفتن رابط اجرا شوند.)

لطفاً هرگونه اشکالی که در NetworkManager پیدا می‌کنید را در سامانه ردیابی مشکلات NetworkManager[1] گزارش دهید.

صفحه خانگی NetworkManager[2], NetworkManager(8),

1.
سامانه ردیابی مشکلات NetworkManager
2.
صفحه خانگی NetworkManager
NetworkManager-dispatcher 1