Networking

MikroTik Scripting Language: Panduan Lengkap

Tutorial komprehensif bahasa scripting MikroTik — variabel, loop, fungsi, scheduler, email alerts, Netwatch automation

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.

Ekosistem Scripting MikroTik
📝
Script Editor
Tulis script via
CLI atau Winbox
→ Execute →
⚙️
RouterOS Engine
Interpreter script
MikroTik
→ Action →
🌐
Router Actions
Konfigurasi,
monitoring, notif

1.1 Kapan Menggunakan Script?

1.2 Menulis dan Menjalankan Script

Terminal MikroTik — Script Basics
# 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

Terminal MikroTik — Variabel
# 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

TipeContohKeterangan
str"hello"String/teks
num42, 3.14Angka integer/decimal
booltrue, falseBoolean
time1d02:30:00Durasi waktu
array({1;2;3})Array/daftar
nilnothingNilai kosong/null

2.3 Operasi String

Terminal MikroTik — String Operations
# 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

Terminal MikroTik — Operators
# 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

Terminal MikroTik — If-Else
# 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

Terminal MikroTik — Loops
# 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

Terminal MikroTik — Array
# 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

Terminal MikroTik — Functions
# 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

Terminal MikroTik — 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

Terminal MikroTik — Advanced Scheduler
# 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
💡 Tips Scheduler

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

Terminal MikroTik — Email Config
# 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

Terminal MikroTik — Auto Email Alert
# 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

Terminal MikroTik — 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

Terminal MikroTik — Auto Failover
# 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

Terminal MikroTik — Bandwidth Monitor
# 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

Terminal MikroTik — Auto Backup
# 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
⚠️ Best Practice Script

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?

a) Tidak ada perbedaan
b) :local hanya berlaku di script, :global bisa diakses dari mana saja
c) :local untuk angka, :global untuk string
d) :global lebih cepat dari :local

2. Tool apa yang digunakan untuk memantau host dan trigger script otomatis?

a) Torch
b) Bandwidth Test
c) Netwatch
d) Profile

3. Bagaimana cara menjalankan script secara otomatis berdasarkan waktu?

a) Menggunakan System Scheduler
b) Menggunakan Firewall Rule
c) Menggunakan DHCP
d) Menggunakan DNS

4. Apa fungsi dari :for i from=1 to=10 do={ } ?

a) Membuat 10 variabel
b) Menghapus 10 item
c) Mengirim 10 email
d) Menjalankan perulangan dari 1 sampai 10

5. Mengapa policy=read,write,test penting pada scheduler?

a) Agar scheduler lebih cepat
b) Agar script bisa mengubah konfigurasi dan menjalankan ping test
c) Agar scheduler tidak bisa dihapus
d) Agar script berjalan lebih sering
← SebelumnyaMikroTik Bridge Selanjutnya →BGP Fundamentals
🔍 Zoom
100%
🎨 Tema