View RSS Feed

مجتبی شمس نجاتی

اسکریپت نویسی در میکروتیک (بخش دوم) - آشنایی با ابزار Scheduler و شرط

Rating: 2 votes, 5.00 average.
توسط - 2014-02-20 - 12:44 AM (بازدید: 9119)
  
در بخش قبل با مقدمات و راه های مختلف اجرای اسکریپت در میکروتیک آشنا شدیم.

در این بخش قصد داریم یک اسکریپت ایجاد کنیم که توسط ابزار scheduler هر یک دقیقه یکبار بطور اتوماتیک اجرا شود.
عملکرد این اسکریپت به این صورت است که بین دو سرور مختلف dns چک شود که کدام سرور packet-loss کمتری دارد و بعنوان سرور dns روتر انتخاب شود.

هدف از این تمرین آشنایی بیشتر با ساختار اسکریپت و همچنین استفاده از شرط (if else) می باشد. (این اسکریپت بهترین راه انتخاب سرور dns نیست هدف تمرین و یادگیری است)

فرض می کنیم دو dns server مد نظر ماست:
  1. سرور 4.2.2.4
  2. سرور 8.8.8.8


اولین گام ایجاد اسکریپت است. برای این منظور وارد system > scripts می شویم. اسکریپت جدید با نام s1 و source زیر ایجاد می کنیم.
کد:
:global ping1 [/ping 4.2.2.4 count=5]; :global ping2 [/ping 8.8.8.8 count=5]; 
:if ($ping1>$ping2) do={[/ip dns set servers=4.2.2.4]} else={[/ip dns set servers=8.8.8.8]};
یا از طریق دستور زیر
کد:
system scripts add name=s1 source=":global ping1 [/ping 4.2.2.4 count=5]; :global ping2 [/ping 8.8.8.8 count=5]; 
:if (\$ping1>\$ping2) do={[/ip dns set servers=4.2.2.4]} else={[/ip dns set servers=8.8.8.8]};"
نکته: در دستور فوق برای اینکه کاراکتر $ را بعنوان string وارد source کنیم و نه مقدارش را، از کاراکتر \ قبل $ استفاده می کنیم.

توضیح اسکریپت:

کد:
:global ping1 [/ping 4.2.2.4 count=5];

در قسمت قبل با متغیر محلی local: آشنا شدیم، برای تعریف متغیر عمومی از global: استفاده می کنیم.
متغیر با نام ping1 تعریف می کنیم. مقادیر حاصل از اجرای دستور داخل [] بعنوان مقدار متغیر ping1 می باشد.
مقدار حاصل از دستور
ping 4.2.2.4 count=5 برابر است با تعداد ping های موفق از 5 دستور ping ارسال شده به سمت 4.2.2.4.
بعنوان مثال اگر از 5 دستور ping ارسال شده به 4.2.2.4 تعداد دو timeout داشته باشیم، متغیر ping1 مقدار 3 می گیرد.

کد:
:global ping2 [/ping 8.8.8.8 count=5];

خط دوم برنامه مشابه خط اول است با این تفاوت که متغیر ping2 برای 8.8.8.8 ایجاد می شود.

کد:
:if ($ping1>$ping2) do={[/ip dns set servers=4.2.2.4]} else={[/ip dns set servers=8.8.8.8]};

قسمت اصلی اسکریپت دو متغیر قبل را با هم مقایسه می کند و هر کدام که packet-loss کمتری داشت، بعنوان dns server انتخاب می شود.

برای اجرای اسکریپت می توانیم از دستور زیر استفاده کنیم:
کد:
system scripts run s1
تا اینجا توانستیم گام اول یعنی ایجاد اسکریپت انجام دهیم. بعد از اجرای اسکریپت می توانید متغیر های تولید شده همراه با مقادیرشان را از قسمت system > scripts > environment مشاهده کنید.

پس ساختار کلی شرط
در اسکریپت میکروتیک به شکل زیر است:
کد:
:if (شرط) do={عملیاتی که در صورت درست بودن شرط باید انجام شود} else={عملیاتی که در صورت نادرست بودن شرط باید انجام شود}
حال که اسکریپت بدون اشکال ایجاد شد،
دومین گام زمانبند کردن اسکریپت است.
برای این منظور می توانیم از قسمت system > scheduler یک زمانبند جدید با نام دلخواه ایجاد کنیم، برای مشخص کردن فاصله زمانی بین دو اجرای اسکریپت از interval استفاده می کنیم و در نهایت در قسمت on event نام اسکریپتی که ایجاد کردیم را وارد می کنیم یعنی s1.

توسط دستور زیر هم می توانیم scheduler را ایجاد کنیم:
کد:
system scheduler add name=sch-dns interval=60s on-event=s1
پس از ایجاد scheduler هر 60 ثانیه یکبار اسکریپت s1 فوق اجرا می شود. و بعد از چند ثانیه dns server تغییر می کند.

در بخش بعد با حلقه (loop) در اسکریپت و استفاده از ابزار netwatch آشنا می شویم.

موفق باشید
Hakimi، mohsenhvac، salary2005 و 7 نفر دیگر سپاسگزاری کرده‌اند.

Updated 2014-02-21 at 11:39 PM by mojtaba461

دسته ها
میکروتیک

نظر

  1. شناسه تصویری salary2005
    عالى
  2. شناسه تصویری mthm
    سلام
    ممنون از وقتی که میذارید
    یه سوال:مثلا اگر ما بخواهیم پینگ به ip خاص رو هر 20 ثانیه تست کنیم و اگر فلان پینگ جواب نداد میکروتیک رو ریستارت کنه(تا اینجا طبق توضیحاتتون نوشتم و اوکی هست). ولی حالا بعد بخواهیم بعد از ریستارت تا وقتی پینگ نیومده دیگه اجرا نشه (یا حداقل تا مدتی مثلا 2 ساعت دیگه اجرا نشه)بعبارتی دیگه نمیخوایم به این دلیل مدام ریستارت بشه. راهی هست؟
    ممنوم