روتری که خودش خبر بدهد «لینک اول قطع شد» یا «سرور حسابداری جواب نمیدهد»، یعنی شما قبل از تلفن کارمندها از مشکل باخبرید. RouterOS یک زبان اسکریپت داخلی دارد و دو ابزار برای اجرای خودکار آن: Scheduler (بر اساس زمان) و Netwatch (بر اساس وضعیت یک آدرس).
مبانی زبان اسکریپت
:local name [/system/identity/get name]
:local up [/system/resource/get uptime]
:local cpu [/system/resource/get cpu-load]
:if ($cpu > 80) do={
:log warning ("CPU high on " . $name . ": " . $cpu . "%")
}
:foreach r in=[/ip/route/find where dst-address="0.0.0.0/0"] do={
:put [/ip/route/get $r gateway]
}:localمتغیر میسازد و$nameمقدارش را میخواند.- براکت
[ ]خروجی یک دستور را برمیگرداند؛findوgetپرکاربردتریناند. .رشتهها را به هم میچسباند و:logدر لاگ سیستم مینویسد.
اسکریپت را کجا نگه داریم؟
اسکریپت را در /system/script با یک اسم ذخیره کنید و از Scheduler یا Netwatch فقط صدایش بزنید. اینطوری یک جا تغییرش میدهید و همهجا اعمال میشود. برای هر اسکریپت فقط دسترسیهایی (policy) را بدهید که لازم دارد.
فرستادن پیام به بله یا تلگرام
هر دو پیامرسان API ربات مشابهی دارند: یک ربات بسازید (در بله از BotFather بله و در تلگرام از BotFather تلگرام)، توکن را بگیرید، به ربات پیام بدهید و chat_id خودتان را پیدا کنید. بعد یک اسکریپت عمومی برای فرستادن پیام:
/system/script/add name=notify policy=read,test source={
:global msg
:local token "BOT-TOKEN"
:local chat "CHAT-ID"
:local url ("https://tapi.bale.ai/bot" . $token . "/sendMessage")
/tool/fetch url=$url http-method=post output=none \
http-header-field="Content-Type: application/json" \
http-data=("{\"chat_id\":\"" . $chat . "\",\"text\":\"" . $msg . "\"}")
}برای تلگرام، آدرس را https://api.telegram.org/bot بگذارید. در ایران دسترسی روتر به سرور تلگرام ممکن نیست ولی API بله داخلی است و مستقیم کار میکند؛ برای هشدار شبکه، بله گزینهٔ قابل اعتمادتری است چون باید در همان وقتی کار کند که اینترنت بینالملل مشکل دارد.
Netwatch: هشدار قطع و وصل
/tool/netwatch/add host=1.1.1.1 type=icmp interval=30s timeout=2s \
down-script=":global msg \"[office-gw] internet ISP1 DOWN\"; /system/script/run notify" \
up-script=":global msg \"[office-gw] internet ISP1 back UP\"; /system/script/run notify"
/tool/netwatch/add host=192.168.10.20 type=icmp interval=1m \
down-script=":global msg \"[office-gw] accounting server DOWN\"; /system/script/run notify"اگر آدرس 1.1.1.1 را مثل مقالهٔ failover از مسیر لینک اول روت کردهاید، این هشدار دقیقاً قطعی همان لینک را خبر میدهد. نکته: وقتی اینترنت قطع است، پیام از لینک دوم میرود؛ اگر لینک دوم ندارید، پیام قطعی را بعد از وصل شدن دریافت میکنید، پس پیام «UP» را هم بفرستید تا مدت قطعی معلوم شود.
Scheduler: کارهای زمانبندیشده
گزارش روزانهٔ وضعیت روتر، هر روز ساعت ۹ صبح:
/system/script/add name=daily-report policy=read,test source={
:global msg
:local id [/system/identity/get name]
:local ver [/system/resource/get version]
:local up [/system/resource/get uptime]
:local mem ([/system/resource/get free-memory] / 1048576)
:set msg ("[" . $id . "] RouterOS " . $ver . " | uptime " . $up . " | free RAM " . $mem . " MB")
/system/script/run notify
}
/system/scheduler/add name=daily-report start-time=09:00:00 interval=1d on-event=daily-reportچند ایدهٔ آماده
- هشدار ورود: اسکریپتی که هر ۵ دقیقه لاگ را برای
login failureمیگردد و اگر زیاد بود خبر میدهد. - هشدار آپدیت: هفتهای یک بار
/system/package/update/check-for-updatesو اگر نسخهٔ تازه آمد، پیام بدهد. خود آپدیت را خودکار نکنید؛ آپدیت امن نظارت لازم دارد. - بکاپ شبانه که در مقالهٔ بکاپ ساختیم.
عیبیابی اسکریپت
- اسکریپت را دستی اجرا کنید:
/system/script/run notifyو/log/print where topics~"script"را ببینید. - در
/system/script/printستونrun-countنشان میدهد اصلاً اجرا شده یا نه. - اگر fetch خطای گواهی داد، ساعت روتر را چک کنید؛ ساعت غلط رایجترین دلیل خطای HTTPS است.
منابع
- MikroTik Manual — Scripting help.mikrotik.com/docs/display/ROS/Scripting
- MikroTik Manual — Scheduler manual.mikrotik.com/docs/system-information-and-utilities/scheduler
- MikroTik Manual — Netwatch help.mikrotik.com/docs/display/ROS/Netwatch
- Telegram Bot API core.telegram.org/bots/api