| dhcp-eval(5) | File Formats Manual | dhcp-eval(5) |
نام (NAME)
dhcp-eval - ارزیابی شرطی در ISC DHCP
توضیحات (DESCRIPTION)
کارخواه (کلاینت) و کارگزار (سرور) پروتکل DHCP ارائهشده توسط Internet Systems Consortium، هر دو امکان اعمال رفتار شرطی بر اساس محتوای بستههای دریافتی را فراهم میکنند. نحو (syntax) لازم برای تعیین این رفتار شرطی در این سند شرح داده شده است.
مرجع: رفتار شرطی (REFERENCE: CONDITIONAL BEHAVIOUR)
رفتار شرطی را میتوان با استفاده از عبارت if و عبارتهای else یا elsif، یا عبارتهای switch و case تعیین کرد. یک عبارت شرطی میتواند در هر کجایی که یک عبارت معمولی (مانند عبارت option) مجاز است قرار گیرد، و میتواند یک یا چند مورد از این عبارتها را در بر بگیرد.
رفتار شرطی: IF (CONDITIONAL BEHAVIOUR: IF)
یک عبارت شرطی نمونهٔ if در سمت سرور میتواند به صورت زیر باشد:
if option dhcp-user-class = "accounting" {
max-lease-time 17600;
option domain-name "accounting.example.org";
option domain-name-servers ns1.accounting.example.org,
ns2.accounting.example.org;
} elsif option dhcp-user-class = "sales" {
max-lease-time 17600;
option domain-name "sales.example.org";
option domain-name-servers ns1.sales.example.org,
ns2.sales.example.org;
} elsif option dhcp-user-class = "engineering" {
max-lease-time 17600;
option domain-name "engineering.example.org";
option domain-name-servers ns1.engineering.example.org,
ns2.engineering.example.org;
} else {
max-lease-time 600;
option domain-name "misc.example.org";
option domain-name-servers ns1.misc.example.org,
ns2.misc.example.org;
}
در سمت کارخواه، مثالی از ارزیابی شرطی میتواند به این صورت باشد:
# example.org filters DNS at its firewall, so we have to use their DNS
# servers when we connect to their network. If we are not at
# example.org, prefer our own DNS server.
if not option domain-name = "example.org" {
prepend domain-name-servers 127.0.0.1;
}
عبارت if و عبارت ادامهدهندهٔ elsif هر دو عبارتهای بولی (boolean) را به عنوان آرگومان دریافت میکنند. یعنی عبارتهایی را میپذیرند که پس از ارزیابی، یک نتیجهٔ بولی تولید میکنند. اگر نتیجهٔ ارزیابی عبارت درست (true) باشد، دستورات محصور در آکولادهای پس از عبارت if اجرا میشوند و تمام بندهای بعدی elsif و else نادیده گرفته میشوند. در غیر این صورت، عبارت هر بند بعدی elsif بررسی میشود تا زمانی که به یک بند elsif برخورد شود که شرط آن درست ارزیابی گردد. اگر چنین بندی یافت شود، دستورات داخل آکولاد بعد از آن اجرا شده و سپس تمام بندهای بعدی elsif و else نادیده گرفته میشوند. اگر تمام بندهای if و elsif بررسی شوند اما عبارت هیچکدام درست ارزیابی نشود، در صورت وجود بند else، دستورات محصور در آکولادهای پس از else اجرا میشوند. عبارتهای بولی که مقدار null تولید میکنند، در عبارات شرطی به عنوان نادرست (false) در نظر گرفته میشوند.
رفتار شرطی: SWITCH (CONDITIONAL BEHAVIOUR: SWITCH)
مثال بالا را میتوان با ساختار switch نیز بازنویسی کرد.
switch (option dhcp-user-class) {
case "accounting":
max-lease-time 17600;
option domain-name "accounting.example.org";
option domain-name-servers ns1.accounting.example.org,
ns2.accounting.example.org;
case "sales":
max-lease-time 17600;
option domain-name "sales.example.org";
option domain-name-servers ns1.sales.example.org,
ns2.sales.example.org;
break;
case "engineering":
max-lease-time 17600;
option domain-name "engineering.example.org";
option domain-name-servers ns1.engineering.example.org,
ns2.engineering.example.org;
break;
default:
max-lease-time 600;
option domain-name "misc.example.org";
option domain-name-servers ns1.misc.example.org,
ns2.misc.example.org;
break;
}
عبارت switch و عبارتهای case میتوانند عبارتهای دادهای یا عبارتهای عددی باشند. در یک عبارت switch، همهٔ آنها باید از یک نوع داده باشند. سرور عبارت مربوط به دستور switch را ارزیابی کرده و سپس عبارتهای دستورات case را تا زمان یافتن تطابق، ارزیابی میکند.
اگر تطابقی پیدا شود، اجرای دستورات از آن case تا عبارت break بعدی آغاز میشود. اگر تطابقی پیدا نشود، اجرا از عبارت default شروع شده و مجدداً تا عبارت break بعدی پیش میرود. در صورتی که هیچ تطابقی وجود نداشته باشد و default نیز تعریف نشده باشد، هیچ عملی صورت نمیگیرد.
عبارتهای بولی (BOOLEAN EXPRESSIONS)
فهرست زیر، مجموعهٔ عبارتهای بولی است که در حال حاضر توسط توزیع DHCP پشتیبانی میشوند:
data-expression-1 = data-expression-2
عملگر = مقادیر دو عبارت دادهای را مقایسه میکند؛ در صورت برابر بودن مقدار true و در صورت نابرابری مقدار false را برمیگرداند. اگر هر یک از طرفهای چپ یا راست null باشند، نتیجه نیز null خواهد بود.
data-expression-1 ~= data-expression-2 data-expression-1 ~~ data-expression-2
عملگرهای ~= و ~~ (که در همهٔ سیستمها در دسترس نیستند) تطابق با عبارات منظم گستردهٔ regex(7) را روی مقادیر دو عبارت دادهای انجام میدهند؛ در صورتی که data-expression-1 با عبارت منظم حاصل از ارزیابی data-expression-2 تطابق داشته باشد مقدار true، و در صورت عدم تطابق یا بروز خطا مقدار false را برمیگردانند. اگر سمت چپ یا سمت راست null یا رشتهٔ خالی باشد، نتیجه نیز false خواهد بود. تفاوت عملگر ~~ با عملگر ~= در این است که به بزرگی و کوچکی حروف حساس نیست (case-insensitive).
boolean-expression-1 and boolean-expression-2
boolean-expression-1 or boolean-expression-2
not boolean-expression
exists option-name
عبارتهای دادهای (DATA EXPRESSIONS)
بسیاری از عبارتهای بولی فوق به نتایج ارزیابی عبارتهای دادهای وابستهاند. فهرستی از این عبارتها در اینجا ارائه شده است.
substring (data-expr, offset, length)
suffix (data-expr, length)
lcase (data-expr)
ucase (data-expr)
option option-name
config-option option-name
gethostname()
hardware
packet (offset, length)
string
colon-separated hexadecimal list
concat (data-expr1, ..., data-exprN)
reverse (numeric-expr1, data-expr2)
leased-address
binary-to-ascii (numeric-expr1, numeric-expr2, data-expr1, data-expr2)
به عنوان مثالی از سه نوع عبارت پیشین، برای تولید نام یک رکورد PTR برای آدرس IP اختصاصیافته به یک کارخواه، میتوان عبارت زیر را نوشت:
concat (binary-to-ascii (10, 8, ".",
reverse (1, leased-address)),
".in-addr.arpa.");
encode-int (numeric-expr, width)
pick-first-value (data-expr1 [ ... exprn ] )
host-decl-name
عبارتهای عددی (NUMERIC EXPRESSIONS)
عبارتهای عددی عبارتهایی هستند که به یک عدد صحیح ارزیابی میشوند. به طور کلی، نباید فرض کرد که حداکثر اندازهٔ چنین عدد صحیحی در کمتر از ۳۲ بیت قابل نمایش است، اما دقت چنین اعدادی ممکن است بیش از ۳۲ بیت باشد.
علاوه بر عملگرهای زیر، چندین تابع ریاضی استاندارد نیز در دسترس هستند. آنها عبارتند از:
عملیات (operation) نماد (symbol) جمع (add) + تفریق (subtract) - تقسیم (divide) / ضرب (multiply) * باقیمانده (modulus) % and بیتی (bitwise and) & or بیتی (bitwise or) | xor بیتی (bitwise xor) ^
extract-int (data-expr, width)
lease-time
number
client-state
- •
- Booting - کارخواه DHCP در وضعیت INIT است و هنوز آدرس IP ندارد. پیام بعدی که فرستاده میشود DHCPDISCOVER خواهد بود که به صورت همهپخشی (broadcast) ارسال میگردد.
- •
- Reboot - کارخواه DHCP در وضعیت INIT-REBOOT است. دارای آدرس IP است، اما هنوز از آن استفاده نمیکند. پیام بعدی که ارسال میشود DHCPREQUEST خواهد بود که همهپخشی میشود. اگر پاسخی دریافت نشود، کارخواه به آدرس خود متصل شده و به وضعیت BOUND تغییر وضعیت میدهد.
- •
- Select - کارخواه DHCP در وضعیت SELECTING است - حداقل یک پیام DHCPOFFER دریافت کرده است، اما منتظر است تا ببیند آیا پیامهای DHCPOFFER دیگری از سرورهای دیگر دریافت میکند یا خیر. در وضعیت SELECTING هیچ پیامی ارسال نمیشود.
- •
- Request - کارخواه DHCP در وضعیت REQUESTING است - حداقل یک پیام DHCPOFFER دریافت کرده و انتخاب کرده است که کدامیک را درخواست کند. پیام بعدی که ارسال خواهد شد پیام DHCPREQUEST است که همهپخشی میشود.
- •
- Bound - کارخواه DHCP در وضعیت BOUND است - دارای یک آدرس IP است. در این وضعیت هیچ پیامی ارسال نمیشود.
- •
- Renew - کارخواه DHCP در وضعیت RENEWING است - دارای آدرس IP است و در تلاش است برای تمدید آن با کارگزار ارتباط برقرار کند. پیام بعدی ارسالی یک پیام DHCPREQUEST خواهد بود که مستقیماً (تکپخشی / unicast) به سرور ارسال میشود.
- •
- Rebind - کارخواه DHCP در وضعیت REBINDING است - دارای آدرس IP است و سعی میکند برای تمدید آن با هر سروری تماس بگیرد. پیام بعدی ارسالی یک DHCPREQUEST خواهد بود که به صورت همهپخشی ارسال میشود.
مرجع: عبارتهای عملیاتی (REFERENCE: ACTION EXPRESSIONS)
log (priority, data-expr)
دستورات ثبت لاگ (logging) میتوانند برای ارسال اطلاعات به کانالهای استاندارد ثبت رویداد استفاده شوند. یک دستور ثبت لاگ شامل یک اولویت اختیاری (fatal، error، info، یا debug) و یک عبارت دادهای است.
دستورات ثبت وقایع تنها یک عبارت دادهای به عنوان آرگومان میپذیرند، بنابراین اگر میخواهید چندین مقدار داده را خروجی دهید، باید از عملگر concat برای الحاق آنها استفاده کنید.
execute (command-path [, data-expr1, ... data-exprN]);
دستور execute یک دستور خارجی را اجرا میکند. آرگومان اول یک رشتهٔ متنی شامل نام یا مسیر دستوری است که باید اجرا شود. سایر آرگومانها، در صورت وجود، یا رشتههای متنی هستند یا عبارتهای دادهای که پس از ارزیابی به رشتههای متنی تبدیل میشوند، تا به عنوان آرگومانهای خط فرمان به دستور پاس داده شوند.
دستور execute همگام (synchronous) است؛ برنامه تا زمان پایان اجرای دستور خارجی متوقف (بلاک) خواهد شد. لطفاً توجه داشته باشید که اجرای طولانیمدت برنامهها (برای نمونه در یک بخش "on commit" در dhcpd.conf) ممکن است منجر به افت کارایی و سررسید زمان (timeout) شود. تنها برنامههای خارجی با زمان اجرای بسیار کوتاه برای استفاده مناسب هستند.
ارسال دادههای ارائهشده توسط کاربر به یک برنامهٔ خارجی میتواند خطرناک باشد. اطمینان حاصل کنید که برنامهٔ خارجی بافرهای ورودی را از نظر اعتبار بررسی میکند. نویسههای غیرقابل چاپ ASCII به کدهای گریز هشتهشتی زبان dhcpd.conf ("\nnn") تبدیل میشوند، اطمینان حاصل کنید که دستور خارجی شما آنها را به همین صورت مدیریت میکند.
امکان استفاده از دستور execute در هر زمینهای وجود دارد، نه فقط در رویدادها. اگر آن را در یک دامنهٔ معمولی (scope) در فایل پیکربندی قرار دهید، هر بار که آن دامنه ارزیابی شود، آن دستور را اجرا خواهید کرد.
parse-vendor-option;
دستور parse-vendor-option تلاش میکند یک گزینهٔ ارائهدهنده (کد ۴۳ - vendor option) را تجزیه کند. این دستور تنها هنگام پردازش یک بسته روی سرور کاربرد دارد و مستلزم آن است که مدیر سیستم پیشتر از دستور vendor-option-space برای انتخاب یک فضای معتبر ارائهدهنده (vendor space) استفاده کرده باشد.
این قابلیت زمانی استفاده میشود که سرور بسته به مقادیری که کلاینت در گزینهٔ سازنده قرار داده است نیاز به انجام اقدامات مختلفی داشته باشد و زیرگزینهها در مکانهای ثابتی قرار نداشته باشند. این دستور به عنوان یک عمل پیادهسازی شده تا به مدیر سیستم اجازه دهد گزینههای ورودی را بررسی کرده و فضای مناسب ارائهدهنده را انتخاب کند.
مرجع: بهروزرسانیهای پویای دیاناس (REFERENCE: DYNAMIC DNS UPDATES)
برای کسب اطلاعات بیشتر در مورد DDNS، به صفحات راهنمای dhcpd.conf و dhclient.conf مراجعه کنید.
همچنین ببینید (SEE ALSO)
dhcpd.conf(5)، dhcpd.leases(5)، dhclient.conf(5)، dhcp-options(5)، dhcpd(8)، dhclient(8)، RFC2132، RFC2131.
نویسندگان (AUTHORS)
اطلاعات تکمیلی دربارهٔ Internet Systems Consortium در پیوند زیر در دسترس است: https://www.isc.org