1. Pengenalan Scripting di RouterOS
MikroTik Scripting Language adalah bahasa scripting bawaan RouterOS yang memungkinkan Anda mengotomatiskan konfigurasi, monitoring, dan manajemen router. Script dapat dijalankan manual, via scheduler, atau triggered oleh event tertentu.
Dengan scripting, Anda bisa membuat router MikroTik bekerja otomatis — mulai dari backup konfigurasi harian, monitoring link internet, notifikasi email, hingga failover otomatis.
CLI atau Winbox
MikroTik
monitoring, notif
1.1 Kapan Menggunakan Script?
- Otomasi backup — backup konfigurasi secara berkala
- Monitoring — cek status link, bandwidth, atau layanan
- Notifikasi — kirim email/SMS jika terjadi masalah
- Failover — pindah jalur otomatis jika link utama down
- Batch configuration — konfigurasi banyak item sekaligus
- Bandwidth report — generate laporan penggunaan bandwidth
1.2 Menulis dan Menjalankan Script
# Menjalankan script langsung di terminal
:put "Hello World"
# Script multi-line di terminal
:local myVar "Hello"
:put ($myVar . " World")
# Menyimpan script di system
/system script add name=test-script source={
:put "Script berjalan!"
:put [/system clock get date]
}
# Menjalankan script yang tersimpan
/system script run test-script
# Melihat daftar script
/system script print
2. Variabel dan Tipe Data
RouterOS mendukung dua jenis variabel: local (hanya berlaku dalam script yang berjalan) dan global (bisa diakses dari mana saja).
2.1 Variabel Local dan Global
# Variabel local — hanya berlaku di script ini
:local myName "BeebaneLabs"
:local myNumber 42
:local isActive true
:local myList ("item1";"item2";"item3")
# Variabel global — bisa diakses dari mana saja
:global gwIP "192.168.1.1"
:global ispName "ISP-01"
:global failoverActive false
# Mengakses variabel
:put $myName
:put $gwIP
# Variabel local di function tidak bisa diakses di luar
:local testFunc do={
:local insideVar "secret"
:put $insideVar
}
# $insideVar tidak bisa diakses di sini
# Global variabel bertahan setelah script selesai
:put $gwIP
2.2 Tipe Data
| Tipe | Contoh | Keterangan |
|---|---|---|
str | "hello" | String/teks |
num | 42, 3.14 | Angka integer/decimal |
bool | true, false | Boolean |
time | 1d02:30:00 | Durasi waktu |
array | ({1;2;3}) | Array/daftar |
nil | nothing | Nilai kosong/null |
2.3 Operasi String
# Konkatenasi string
:local name "MikroTik"
:local greeting ("Hello " . $name . "!")
:put $greeting
# Panjang string
:put [:len $name]
# Substring
:put [:pick $name 0 4]
# Mengubah case
:put [:tostr [:find "HELLO" "ELL"]]
# Konversi tipe
:put [:tostr 42]
:put [:tonum "42"]
:put [:totime "01:30:00"]
# Format string
:local ip "192.168.1.1"
:local port 80
:put ($ip . ":" . [:tostr $port])
3. Operator dan Ekspresi
3.1 Operator Aritmatika dan Perbandingan
# Operator aritmatika
:put (10 + 5) # 15
:put (10 - 5) # 5
:put (10 * 5) # 50
:put (10 / 3) # 3
:put (10 % 3) # 1 (modulus)
# Operator perbandingan
:put (10 > 5) # true
:put (10 < 5) # false
:put (10 = 10) # true
:put (10 != 5) # true
:put (10 >= 10) # true
:put (10 <= 9) # false
# Operator logika
:put (true and true) # true
:put (true and false) # false
:put (true or false) # true
:put (!true) # false
# Operator string
:put ("abc" ~ "a") # true (match)
:put ("abc" !~ "d") # true (not match)
:put ("hello" . " " . "world") # concat
4. Loop dan Percabangan
4.1 If-Else Statement
# If-else dasar
:local status "up"
:if ($status = "up") do={
:put "Link is UP"
} else={
:put "Link is DOWN"
}
# If-elseif-else
:local score 85
:if ($score >= 90) do={
:put "Grade: A"
} else={
:if ($score >= 80) do={
:put "Grade: B"
} else={
:if ($score >= 70) do={
:put "Grade: C"
} else={
:put "Grade: D"
}
}
}
# Inline if (single line)
:local x 10
:if ($x > 5) do={ :put "big" } else={ :put "small" }
4.2 For Loop
# For loop
:for i from=1 to=10 do={
:put ("Iteration: " . [:tostr $i])
}
# While loop (simulasi dengan :while)
:local counter 0
:while ($counter < 5) do={
:put ("Counter: " . [:tostr $counter])
:set counter ($counter + 1)
}
# Foreach loop
:local fruits ("apple";"banana";"cherry")
:foreach fruit in=$fruits do={
:put ("Fruit: " . $fruit)
}
# Loop dengan break
:for i from=1 to=100 do={
:if ($i > 5) do={ :put "Breaking!"; :break }
:put $i
}
# Loop dengan continue
:for i from=1 to=10 do={
:if ($i = 5) do={ :continue }
:put $i
}
4.3 Array Operations
# Membuat array
:local myArray ("item1";"item2";"item3")
# Menambah item
:set myArray ($myArray, "item4")
# Mengakses item (0-based)
:put ($myArray->0)
# Panjang array
:put [:len $myArray]
# Loop array
:foreach item in=$myArray do={
:put $item
}
# Array dengan key-value (seperti map)
:local config {
"name"="Router01";
"ip"="192.168.1.1";
"port"=8291
}
:put ($config->"name")
:put ($config->"ip")
5. Fungsi dan Prosedur
5.1 Membuat Fungsi
# Fungsi sederhana
:local greet do={
:local name $1
:put ("Hello " . $name . "!")
}
$greet "Beebane"
# Fungsi dengan return value
:local add do={
:local a $1
:local b $2
:return ($a + $b)
}
:local result [$add 5 3]
:put $result
# Fungsi untuk cek IP valid
:local isValidIP do={
:local ip $1
:if ([:len [:find $ip "."]] > 0) do={
:return true
} else={
:return false
}
}
:put [$isValidIP "192.168.1.1"]
# Simpan sebagai global function
:global checkGateway do={
:local gwIP $1
:local result [/ping $gwIP count=3]
:if ($result > 0) do={
:return "UP"
} else={
:return "DOWN"
}
}
:put [$checkGateway "8.8.8.8"]
6. Scheduler: Tugas Terjadwal
Scheduler memungkinkan Anda menjalankan script secara otomatis berdasarkan interval waktu atau pada waktu tertentu.
6.1 Membuat Scheduler
# Scheduler: cek gateway setiap 1 menit
/system scheduler add \
name=check-gw \
interval=1m \
on-event={
:local gwIP "192.168.1.1"
:local result [/ping $gwIP count=3]
:if ($result = 0) do={
:log warning ("Gateway " . $gwIP . " is DOWN!")
} else={
:log info ("Gateway " . $gwIP . " is UP (" . $result . "/3)")
}
} \
policy=read,write,test
# Scheduler: backup konfigurasi setiap hari jam 2 pagi
/system scheduler add \
name=daily-backup \
start-date=jan/01/2026 \
start-time=02:00:00 \
interval=1d \
on-event={
:local filename ("backup-" . [/system clock get date])
/system backup save name=$filename
:log info ("Backup saved: " . $filename)
} \
policy=read,write,test
# Scheduler: restart interface WiFi jam 3 pagi
/system scheduler add \
name=wifi-restart \
start-time=03:00:00 \
interval=1d \
on-event={
/interface wireless disable wlan1
:delay 5s
/interface wireless enable wlan1
:log info "WiFi restarted"
} \
policy=read,write,test
6.2 Scheduler dengan Startup dan One-Shot
# Startup script — berjalan saat router boot
/system scheduler add \
name=startup-notify \
startup=yes \
on-event={
:global gwIP "192.168.1.1"
:log info "Router has been rebooted!"
# Kirim notifikasi di sini
} \
policy=read,write,test
# One-shot scheduler — berjalan sekali lalu hapus
/system scheduler add \
name=maintenance-window \
start-time=03:00:00 \
interval=0s \
on-event={
:log info "Running maintenance..."
# Script maintenance
/system scheduler remove [find name=maintenance-window]
} \
policy=read,write,test
# Lihat scheduler yang aktif
/system scheduler print
/system scheduler print detail
# Lihat scheduler log
/system scheduler print stats
Selalu set policy=read,write,test pada scheduler yang perlu mengubah konfigurasi atau menjalankan ping test. Tanpa policy yang benar, script tidak akan berjalan meskipun ter-trigger.
7. Email Alerts & Notifikasi
MikroTik bisa mengirim email langsung dari script. Ini berguna untuk notifikasi otomatis ketika terjadi masalah pada jaringan.
7.1 Konfigurasi Email Server
# Konfigurasi SMTP server /tool e-mail set \ address=smtp.gmail.com \ port=587 \ start-tls=yes \ from="router@yourdomain.com" \ user="your-email@gmail.com" \ password="your-app-password" # Test kirim email /tool e-mail send \ to="admin@yourdomain.com" \ subject="Test Email from MikroTik" \ body="This is a test email from RouterOS scripting." \ start-tls=yes
7.2 Email Notifikasi Otomatis
# Script: Kirim email jika gateway down
/system script add \
name=gateway-alert \
source={
:global lastAlertTime
:local gwIP "8.8.8.8"
:local result [/ping $gwIP count=5]
:if ($result = 0) do={
:local now [/system clock get time]
:if ([:len $lastAlertTime] = 0 || \
([:tonum [:pick $now 0 2]] - [:tonum [:pick $lastAlertTime 0 2]] > 0)) do={
/tool e-mail send \
to="admin@yourdomain.com" \
subject=("ALERT: Gateway " . $gwIP . " is DOWN!") \
body=("Gateway " . $gwIP . " tidak merespons.\nWaktu: " . \
[/system clock get date] . " " . $now)
:set lastAlertTime $now
:log warning "Alert email sent: Gateway DOWN"
}
}
} \
policy=read,write,test,policy
8. Netwatch & Monitoring Script
Netwatch adalah tool built-in MikroTik yang bisa memantau host dan menjalankan script ketika status berubah (up/down).
8.1 Konfigurasi Netwatch
# Netwatch: monitor gateway utama
/tool netwatch add \
host=8.8.8.8 \
interval=10s \
timeout=1s \
type=icmp \
comment="Monitor Google DNS"
# Netwatch dengan script on-up dan on-down
/tool netwatch add \
host=192.168.1.1 \
interval=5s \
timeout=2s \
type=icmp \
comment="Monitor ISP Gateway"
# Script on-up (saat host hidup kembali)
:log info "ISP Gateway is UP"
/ip route enable [find comment="route-primary"]
# Script on-down (saat host mati)
:log warning "ISP Gateway is DOWN"
/ip route disable [find comment="route-primary"]
# Monitor multiple hosts
:local hosts ("8.8.8.8";"1.1.1.1";"208.67.222.222")
:foreach h in=$hosts do={
/tool netwatch add \
host=$h \
interval=10s \
timeout=2s \
type=icmp \
comment=("Monitor " . $h)
}
# Lihat status netwatch
/tool netwatch print
/tool netwatch print detail
9. Contoh Automation Script
9.1 Auto Failover Script
# Script auto failover ISP
/system script add \
name=auto-failover \
source={
:global primaryGW "192.168.1.1"
:global backupGW "192.168.2.1"
:global failoverActive
:local primaryOK [/ping 8.8.8.8 count=5 src-address=$primaryGW]
:if ($primaryOK = 0 && !$failoverActive) do={
:log warning "Primary ISP DOWN - switching to backup"
/ip route set [find gateway=$primaryGW] distance=200
/ip route set [find gateway=$backupGW] distance=1
:set failoverActive true
/tool e-mail send \
to="admin@yourdomain.com" \
subject="FAILOVER: Switched to backup ISP" \
body="Primary ISP down at [/system clock get date] [/system clock get time]"
}
:if ($primaryOK > 0 && $failoverActive) do={
:log info "Primary ISP UP - switching back"
/ip route set [find gateway=$primaryGW] distance=1
/ip route set [find gateway=$backupGW] distance=200
:set failoverActive false
/tool e-mail send \
to="admin@yourdomain.com" \
subject="RECOVERY: Back to primary ISP" \
body="Primary ISP restored at [/system clock get date] [/system clock get time]"
}
} \
policy=read,write,test,policy
# Jalankan setiap 30 detik
/system scheduler add \
name=failover-check \
interval=30s \
on-event=auto-failover \
policy=read,write,test,policy
9.2 Bandwidth Monitor Script
# Script monitoring bandwidth
/system script add \
name=bw-monitor \
source={
:local iface "ether1"
:local rxNow [/interface get $iface rx-byte]
:local txNow [/interface get $iface tx-byte]
:global rxPrev
:global txPrev
:if ([:len $rxPrev] = 0) do={
:set rxPrev $rxNow
:set txPrev $txNow
:log info "BW Monitor initialized"
} else={
:local rxRate (($rxNow - $rxPrev) * 8 / 60)
:local txRate (($txNow - $txPrev) * 8 / 60)
:local rxMbps ([:tonum $rxRate] / 1000000)
:local txMbps ([:tonum $txRate] / 1000000)
:log info ("BW " . $iface . ": RX=" . $rxMbps . " Mbps TX=" . $txMbps . " Mbps")
# Alert jika bandwidth > threshold
:if ($rxMbps > 80) do={
/tool e-mail send \
to="admin@yourdomain.com" \
subject="WARNING: High bandwidth usage" \
body=("RX: " . $rxMbps . " Mbps on " . $iface)
}
:set rxPrev $rxNow
:set txPrev $txNow
}
} \
policy=read,write,test,policy
# Jalankan setiap 1 menit
/system scheduler add \
name=bw-check \
interval=1m \
on-event=bw-monitor \
policy=read,write,test,policy
9.3 Auto Backup & Export
# Script backup otomatis
/system script add \
name=auto-backup \
source={
:local date [/system clock get date]
:local time [/system clock get time]
:local filename ("backup-" . $date)
# Backup binary
/system backup save name=$filename
# Export konfigurasi (text)
/export file=("export-" . $date)
# Hapus backup lama (lebih dari 7 hari)
:foreach f in=[/file find where name~"backup-"] do={
:local fname [/file get $f name]
:local age ([:tonum [/system clock get date]] - [:tonum [:pick $fname 7 12]])
:if ($age > 7) do={
/file remove $f
:log info ("Deleted old backup: " . $fname)
}
}
:log info ("Backup completed: " . $filename)
} \
policy=read,write,test
Selalu test script di environment development sebelum deploy ke production. Gunakan :log untuk debugging. Hindari script yang terlalu kompleks — pecah menjadi beberapa script kecil yang modular.
Quiz Pemahaman
🧠 Tes Pemahaman: MikroTik Scripting
1. Apa perbedaan antara :local dan :global pada MikroTik scripting?
2. Tool apa yang digunakan untuk memantau host dan trigger script otomatis?
3. Bagaimana cara menjalankan script secara otomatis berdasarkan waktu?
4. Apa fungsi dari :for i from=1 to=10 do={ } ?
5. Mengapa policy=read,write,test penting pada scheduler?