<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://noctkj.net/index.php?action=history&amp;feed=atom&amp;title=Mikrotik_%3A_Scripting_Dasar_RouterOS</id>
	<title>Mikrotik : Scripting Dasar RouterOS - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://noctkj.net/index.php?action=history&amp;feed=atom&amp;title=Mikrotik_%3A_Scripting_Dasar_RouterOS"/>
	<link rel="alternate" type="text/html" href="https://noctkj.net/index.php?title=Mikrotik_:_Scripting_Dasar_RouterOS&amp;action=history"/>
	<updated>2026-10-19T04:00:52Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://noctkj.net/index.php?title=Mikrotik_:_Scripting_Dasar_RouterOS&amp;diff=1440&amp;oldid=prev</id>
		<title>Maintenance script: Protected &quot;Mikrotik : Scripting Dasar RouterOS&quot;: Proteksi editorial: edit/move sysop ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))</title>
		<link rel="alternate" type="text/html" href="https://noctkj.net/index.php?title=Mikrotik_:_Scripting_Dasar_RouterOS&amp;diff=1440&amp;oldid=prev"/>
		<updated>2026-10-19T00:02:12Z</updated>

		<summary type="html">&lt;p&gt;Protected &amp;quot;&lt;a href=&quot;/index.php/Mikrotik_:_Scripting_Dasar_RouterOS&quot; title=&quot;Mikrotik : Scripting Dasar RouterOS&quot;&gt;Mikrotik : Scripting Dasar RouterOS&lt;/a&gt;&amp;quot;: Proteksi editorial: edit/move sysop ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 07:02, 19 October 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://noctkj.net/index.php?title=Mikrotik_:_Scripting_Dasar_RouterOS&amp;diff=1439&amp;oldid=prev</id>
		<title>Maintenance script: Artikel baru: Scripting Dasar RouterOS (Gaya Editorial v2)</title>
		<link rel="alternate" type="text/html" href="https://noctkj.net/index.php?title=Mikrotik_:_Scripting_Dasar_RouterOS&amp;diff=1439&amp;oldid=prev"/>
		<updated>2026-10-19T00:02:08Z</updated>

		<summary type="html">&lt;p&gt;Artikel baru: Scripting Dasar RouterOS (Gaya Editorial v2)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 🎯 Tujuan ==&lt;br /&gt;
&lt;br /&gt;
Setelah membaca dan mempraktikkan artikel ini, kamu bisa:&lt;br /&gt;
&lt;br /&gt;
* menjelaskan apa itu script RouterOS dan kapan sebaiknya dipakai;&lt;br /&gt;
* membedakan variabel lokal dan global beserta batas wilayahnya;&lt;br /&gt;
* memakai percabangan (`:if`) dan perulangan (`:foreach`, `:for`);&lt;br /&gt;
* menyimpan script ke menu `/system/script` lalu menjalankannya;&lt;br /&gt;
* memasang jadwal otomatis lewat `/system/scheduler`;&lt;br /&gt;
* membaca log untuk membuktikan script benar-benar bekerja.&lt;br /&gt;
&lt;br /&gt;
Ini pintu masuk otomasi di RouterOS. Setelah bisa menulis script sendiri, pekerjaan berulang seperti cek kapasitas IP atau laporan interface mati tidak perlu diketik ulang tiap pagi.&lt;br /&gt;
&lt;br /&gt;
== 📍 Konteks nyata ==&lt;br /&gt;
&lt;br /&gt;
Bayangkan kamu admin lab di SMK. Setiap Senin pagi ada tiga tugas yang sama: mengecek sisa alamat IP untuk tiga lab, mencari interface mana yang mati, dan memastikan SSID tamu menyala lagi setelah listrik padam akhir pekan.&lt;br /&gt;
&lt;br /&gt;
Dikerjakan manual, urutannya panjang dan mudah terlewat begitu bel masuk berbunyi. Apalagi kalau kamu sedang memperbaiki komputer lain di ruang sebelah.&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Analogi:&amp;#039;&amp;#039;&amp;#039; perintah CLI itu instruksi lisan, script itu SOP tertulis di dinding. Yang lisan hilang saat orangnya pergi, yang tertulis tetap ada dan bisa diwariskan ke siswa PKL.&lt;br /&gt;
&lt;br /&gt;
🔥 &amp;#039;&amp;#039;&amp;#039;Kasus nyata:&amp;#039;&amp;#039;&amp;#039; Di sebuah SMK, pool DHCP lab 2 diisi 60 alamat untuk tiga kelas bergantian. Saat ujian CBT dimulai, 12 laptop mendapat alamat `169.254.x.x` — tanda tidak dapat IP.&lt;br /&gt;
&lt;br /&gt;
Penyebabnya bukan router rusak: pool penuh karena perangkat lama belum dilepas, dan tidak ada yang sadar sampai siswa mulai login. Setelah dibuat script yang mencatat jumlah lease dan menulis peringatan saat pemakaian lewat 80 persen, kondisi itu ketahuan dua hari sebelum ujian berikutnya.&lt;br /&gt;
&lt;br /&gt;
== 🧠 Konsep singkat ==&lt;br /&gt;
&lt;br /&gt;
Script RouterOS adalah kumpulan baris perintah yang disimpan sebagai teks di dalam router, lalu dijalankan berurutan dari atas ke bawah. Tidak ada compiler dan tidak ada file Python — semuanya hidup di dalam RouterOS.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Dari perintah manual ke perintah tersimpan ===&lt;br /&gt;
&lt;br /&gt;
Setiap baris perintah di RouterOS punya bentuk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
[prefix] [path] command [uparam] [param=value] ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prefix menentukan jenis kata pertama:&lt;br /&gt;
&lt;br /&gt;
| Prefix | Arti | Contoh |&lt;br /&gt;
|---|---|---|&lt;br /&gt;
| `:` | perintah global bawaan scripting | `:put &amp;quot;halo&amp;quot;` |&lt;br /&gt;
| `/` | pindah ke menu konfigurasi | `/ip address print` |&lt;br /&gt;
| tanpa prefix | perintah di menu yang sedang aktif | `print` |&lt;br /&gt;
&lt;br /&gt;
Akhir baris perintah ditandai `;` atau baris baru. Tapi perintah di dalam `()`, `[]`, atau `{}` tidak perlu penutup — kurungnya sudah menandai batas.&lt;br /&gt;
&lt;br /&gt;
💡 &amp;#039;&amp;#039;&amp;#039;Tips:&amp;#039;&amp;#039;&amp;#039; kalau bingung membedakan, ingat saja: `:` untuk bahasa script (variabel, if, loop), `/` untuk menu router (ip, interface, system).&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Tiga bahan yang membuat script hidup ===&lt;br /&gt;
&lt;br /&gt;
* **Variabel** — tempat menyimpan nilai sementara, misalnya nama router atau jumlah lease.&lt;br /&gt;
* **Kendali alur** — `:if` untuk memilih, `:foreach` dan `:for` untuk mengulang.&lt;br /&gt;
* **Pengambilan data** — tanda `[]` menjalankan perintah lain dan mengambil hasilnya, misalnya `[/system identity get name]`.&lt;br /&gt;
&lt;br /&gt;
Tanpa tiga bahan ini, script hanya daftar perintah yang sama kakunya dengan mengetik manual.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Scope: kenapa variabel bisa hilang ===&lt;br /&gt;
&lt;br /&gt;
Variabel hanya terlihat di wilayah tempat ia dideklarasikan. Ada dua jenis:&lt;br /&gt;
&lt;br /&gt;
* `:local` — hanya hidup di dalam blok `{}` tempat ia dibuat.&lt;br /&gt;
* `:global` — bisa dibaca script lain milik user yang sama.&lt;br /&gt;
&lt;br /&gt;
⚠️ &amp;#039;&amp;#039;&amp;#039;Hati-hati:&amp;#039;&amp;#039;&amp;#039; setiap baris yang kamu ketik di terminal dianggap satu scope sendiri. Jadi `:local nama &amp;quot;lab&amp;quot;` di satu baris akan hilang di baris berikutnya dan memunculkan `syntax error`. Di dalam file script, satu blok `{}` adalah satu scope.&lt;br /&gt;
&lt;br /&gt;
== 🧩 Istilah penting ==&lt;br /&gt;
&lt;br /&gt;
| Istilah | Arti sederhana |&lt;br /&gt;
|---|---|&lt;br /&gt;
| Command global | Perintah berawalan `:`, misalnya `:put`, `:local`, `:if`. |&lt;br /&gt;
| Scope | Wilayah berlakunya variabel; ditentukan oleh `{}`. |&lt;br /&gt;
| Variabel lokal | Variabel yang hanya hidup di blok tempat ia dibuat. |&lt;br /&gt;
| Variabel global | Variabel yang bisa dipakai script lain oleh user yang sama. |&lt;br /&gt;
| `/system/script` | Gudang penyimpanan script di router. |&lt;br /&gt;
| `/system/scheduler` | Penjadwal yang menjalankan script pada waktu tertentu. |&lt;br /&gt;
| `on-event` | Isi jadwal: nama script atau perintah langsung. |&lt;br /&gt;
| Policy | Daftar izin yang menentukan apa yang boleh dilakukan script. |&lt;br /&gt;
| `:put` | Menampilkan nilai ke terminal (hanya berguna saat interaktif). |&lt;br /&gt;
| `:log` | Menulis pesan ke log router; ini yang dipakai script terjadwal. |&lt;br /&gt;
&lt;br /&gt;
== 🔧 Praktik: Scripting Dasar RouterOS ==&lt;br /&gt;
&lt;br /&gt;
Lab ini memakai satu router uji. Jangan kerjakan di router produksi yang sedang melayani ujian.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Persiapan lab ===&lt;br /&gt;
&lt;br /&gt;
# Siapkan router uji (boleh CHR di Proxmox atau perangkat lab).&lt;br /&gt;
# Pastikan `/system identity` dan jam router sudah benar.&lt;br /&gt;
# Catat konfigurasi awal dengan `/export file=sebelum-scripting`.&lt;br /&gt;
# Buka terminal Winbox atau SSH.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Langkah 1: coba perintah global ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
:put &amp;quot;Halo TKJ&amp;quot;&lt;br /&gt;
:put (3 + 4)&lt;br /&gt;
:put [:typeof 4]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Baris pertama menampilkan teks, baris kedua hasil hitungan, baris ketiga jenis data (`num`). Kalau salah satu baris menghasilkan `syntax error`, cek apakah prefix `:` sudah ikut ditulis.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Langkah 2: variabel dan teks ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
:local nama &amp;quot;Lab TKJ&amp;quot;&lt;br /&gt;
:local versi [/system resource get version]&lt;br /&gt;
:put &amp;quot;Router $nama pakai RouterOS $versi&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tanda `$` menyisipkan nilai variabel ke dalam teks. Kamu juga bisa menyambung dengan operator titik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
:put (&amp;quot;Router &amp;quot; . $nama)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nama variabel hanya boleh huruf dan angka. Kalau perlu tanda hubung, bungkus dengan tanda kutip: `:global &amp;quot;nama-router&amp;quot;`.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Langkah 3: ambil data dari menu RouterOS ===&lt;br /&gt;
&lt;br /&gt;
Tanda `[]` menjalankan perintah dan mengembalikan hasilnya. Ini kunci script yang sadar situasi.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
:put [/system identity get name]&lt;br /&gt;
:put [/ip dhcp-server lease print count-only]&lt;br /&gt;
:foreach i in=[/interface find where running=no] do={&lt;br /&gt;
    :local nm [/interface get $i name]&lt;br /&gt;
    :put &amp;quot;Interface $nm sedang down&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Baris terakhir memperkenalkan `:foreach`: untuk setiap interface yang tidak `running`, ambil namanya dan tampilkan. Di lab biasanya interface yang tidak dipakai akan muncul di sini.&lt;br /&gt;
&lt;br /&gt;
📊 &amp;#039;&amp;#039;&amp;#039;Angka penting:&amp;#039;&amp;#039;&amp;#039; `print count-only` mengembalikan angka, bukan tabel. Ini jauh lebih ringan daripada mengambil seluruh daftar lalu menghitung sendiri.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Langkah 4: percabangan dengan :if ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
:local total [/ip dhcp-server lease print count-only]&lt;br /&gt;
:local batas 50&lt;br /&gt;
:if ($total &amp;gt;= $batas) do={&lt;br /&gt;
    :put &amp;quot;Pool hampir penuh: $total dari $batas&amp;quot;&lt;br /&gt;
} else={&lt;br /&gt;
    :put &amp;quot;Masih aman: $total dari $batas&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kondisi ditulis di dalam `()`, aksi di dalam `{}`. Operator perbandingan yang tersedia: `=`, `!=`, `&amp;lt;`, `&amp;gt;`, `&amp;lt;=`, `&amp;gt;=`. Untuk logika pakai `&amp;amp;&amp;amp;` (dan), `||` (atau), `!` (bukan). Operator `in` dipakai untuk cek keanggotaan, misalnya `1.1.1.1/32 in 1.0.0.0/8`.&lt;br /&gt;
&lt;br /&gt;
💡 &amp;#039;&amp;#039;&amp;#039;Tips:&amp;#039;&amp;#039;&amp;#039; tanda sama dengan untuk membandingkan hanya satu (`=`), bukan `==` seperti di bahasa lain. Ini kesalahan paling sering pemula.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Langkah 5: perulangan :for dan :while ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
:for i from=1 to=3 do={&lt;br /&gt;
    :put &amp;quot;Putaran ke-$i&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
:local coba 0&lt;br /&gt;
:while ($coba &amp;lt; 3) do={&lt;br /&gt;
    :set coba ($coba + 1)&lt;br /&gt;
    :put &amp;quot;Percobaan $coba&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
`:for` cocok untuk jumlah putaran yang sudah pasti. `:while` cocok untuk ulangi sampai kondisi terpenuhi — misalnya menunggu interface naik.&lt;br /&gt;
&lt;br /&gt;
⚠️ &amp;#039;&amp;#039;&amp;#039;Hati-hati:&amp;#039;&amp;#039;&amp;#039; `:while` tanpa perubahan kondisi akan berputar selamanya dan membuat terminal hang. Selalu ubah variabel penghitung di dalam blok, atau tambahkan batas percobaan.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Langkah 6: simpan sebagai script ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/system script add name=cek-pool-dhcp policy=read,write,test source={&lt;br /&gt;
    :local nama [/system identity get name]&lt;br /&gt;
    :local total [/ip dhcp-server lease print count-only]&lt;br /&gt;
    :local batas 50&lt;br /&gt;
    :log info (&amp;quot;[$nama] lease terpakai: $total&amp;quot;)&lt;br /&gt;
    :if ($total &amp;gt;= $batas) do={&lt;br /&gt;
        :log warning (&amp;quot;[$nama] pool DHCP hampir penuh: $total / $batas&amp;quot;)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setelah disimpan, jalankan manual untuk melihat hasilnya:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/system script run cek-pool-dhcp&lt;br /&gt;
/log print where topics~&amp;quot;script&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Perhatikan perubahan penting: `:put` diganti `:log`. Saat dijalankan scheduler, tidak ada orang yang melihat terminal, jadi satu-satunya bukti kerja script adalah log.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Langkah 7: jadwalkan dengan scheduler ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/system scheduler add name=jadwal-cek-pool start-time=07:00:00 interval=1d \&lt;br /&gt;
    on-event=cek-pool-dhcp policy=read,write,test&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beberapa sifat penting scheduler:&lt;br /&gt;
&lt;br /&gt;
* `start-date` dan `start-time` default ke saat entri dibuat.&lt;br /&gt;
* `interval=0s` (default) berarti script jalan sekali saja.&lt;br /&gt;
* `interval=1d` berarti berulang tiap 24 jam, tetap mengikuti jam start.&lt;br /&gt;
* `start-time=startup` menjalankan script setiap router menyala, tetapi sebelum interface naik.&lt;br /&gt;
&lt;br /&gt;
💡 &amp;#039;&amp;#039;&amp;#039;Tips:&amp;#039;&amp;#039;&amp;#039; untuk script yang butuh jaringan (ping, email, cek update), tambahkan penunggu di awal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
:local n 0&lt;br /&gt;
:while (([:len [/ip route find where dst-address=0.0.0.0/0 active]] = 0) &amp;amp;&amp;amp; ($n &amp;lt; 60)) do={&lt;br /&gt;
    :delay 5s&lt;br /&gt;
    :set n ($n + 1)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Langkah 8: bungkus dengan :onerror ===&lt;br /&gt;
&lt;br /&gt;
Script yang error di tengah akan berhenti dan sisa perintah tidak dijalankan. Supaya aman, bungkus bagian berisiko:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
:onerror err in={&lt;br /&gt;
    :put [:resolve &amp;quot;contoh-domain-tidak-ada.invalid&amp;quot;]&lt;br /&gt;
} do={&lt;br /&gt;
    :log warning &amp;quot;Gagal resolve: $err&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Urutan parameter penting: `in=` harus ditulis sebelum `do=`, kalau tidak variabel error tidak terbaca di blok `do`.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Versi Winbox ===&lt;br /&gt;
&lt;br /&gt;
# Buka **System → Scripts → +**.&lt;br /&gt;
# Isi **Name** `cek-pool-dhcp`, lalu tulis isi script di kotak **Source**.&lt;br /&gt;
# Buka tab **Policy**, centang hanya yang dibutuhkan (`read`, `write`).&lt;br /&gt;
# Klik **Apply**, lalu tombol **Run** untuk uji manual.&lt;br /&gt;
# Buka **System → Scheduler → +**, isi **On Event** dengan nama script, atur **Start Time** dan **Interval**.&lt;br /&gt;
&lt;br /&gt;
=== 🔹 Bersih-bersih lab ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/system scheduler remove [find name=jadwal-cek-pool]&lt;br /&gt;
/system script remove [find name=cek-pool-dhcp]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Selalu hapus script uji dari router produksi. Script yang lupa dihapus bisa terus menulis log dan mengaburkan masalah asli.&lt;br /&gt;
&lt;br /&gt;
== 🏭 Dipakai di dunia kerja ==&lt;br /&gt;
&lt;br /&gt;
* **Sekolah:** script menjadwalkan SSID tamu menyala pukul 07:00 dan mati pukul 16:00, sekaligus mencatat sisa lease DHCP. Admin tidak perlu mengingat dua hal itu setiap hari, dan guru tidak lagi mengeluh WiFi tamu mati saat rapat.&lt;br /&gt;
* **Kantor cabang:** script mengecek default route tiap 10 menit; kalau jalur utama hilang, ia menulis peringatan ke log dan mengirim email ke IT. Tim bisa bertindak sebelum pengguna melapor.&lt;br /&gt;
* **ISP/warnet:** script membaca jumlah user aktif hotspot tiap jam dan menulis statistik ke syslog. Dari data itu pemilik melihat jam ramai dan menyiapkan kapasitas, tanpa harus duduk memantau layar.&lt;br /&gt;
* **Industri:** script mengekspor konfigurasi tiap malam ke file bertanggal, lalu memangkas file lama. Saat perangkat harus diganti, konfigurasi terbaru sudah tersedia dan waktu henti produksi lebih pendek.&lt;br /&gt;
* **Laboratorium virtual:** script memakai `:deserialize` untuk membaca data JSON dari controller dan menyiapkan konfigurasi awal router baru — pola yang sama dipakai untuk provisioning massal.&lt;br /&gt;
&lt;br /&gt;
== ✅ Verifikasi ==&lt;br /&gt;
&lt;br /&gt;
Jalankan pemeriksaan ini setelah lab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/system script print detail where name=cek-pool-dhcp&lt;br /&gt;
/system script run cek-pool-dhcp&lt;br /&gt;
/log print where topics~&amp;quot;script&amp;quot;&lt;br /&gt;
/system scheduler print detail where name=jadwal-cek-pool&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yang harus terlihat:&lt;br /&gt;
&lt;br /&gt;
* script muncul dengan `policy=read,write,test` sesuai yang kamu beri;&lt;br /&gt;
* setelah `run`, ada baris log berisi nama router dan jumlah lease;&lt;br /&gt;
* scheduler menampilkan `run-count` bertambah dan `next-run` terisi;&lt;br /&gt;
* tidak ada pesan `not enough permissions` di log.&lt;br /&gt;
&lt;br /&gt;
🧪 &amp;#039;&amp;#039;&amp;#039;Uji cepat:&amp;#039;&amp;#039;&amp;#039; ubah sementara `batas` menjadi `1`, jalankan script, dan pastikan log `warning` muncul. Kalau peringatan tidak muncul, masalahnya ada di kondisi `:if`, bukan di scheduler.&lt;br /&gt;
&lt;br /&gt;
== ⚠️ Kesalahan umum &amp;amp; troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
| Gejala | Penyebab | Perbaikan |&lt;br /&gt;
|---|---|---|&lt;br /&gt;
| `syntax error` di baris kedua | `:local` dideklarasikan di baris terminal sebelumnya | Tulis dalam satu blok `{}` atau pakai `:global` |&lt;br /&gt;
| `bad command name` | Prefix `:` atau `/` lupa ditulis | Periksa kata pertama baris |&lt;br /&gt;
| Script jalan, log kosong | Memakai `:put` di script terjadwal | Ganti dengan `:log info` atau `:log warning` |&lt;br /&gt;
| `not enough permissions (9)` | Policy script atau scheduler kurang | Tambah policy yang dibutuhkan (`read`, `write`, `test`) |&lt;br /&gt;
| Script jalan dua kali bersamaan | Interval lebih pendek dari durasi script | Perpanjang interval atau pasang penjaga `:jobname` |&lt;br /&gt;
| Perintah setelah satu baris tidak jalan | Satu baris error menghentikan seluruh script | Bungkus bagian rawan dengan `:onerror` |&lt;br /&gt;
| Ping atau email gagal hanya saat startup | Interface belum naik | Tambahkan loop tunggu seperti di Langkah 7 |&lt;br /&gt;
| Variabel error kosong di `:onerror` | Urutan `in=` dan `do=` tertukar | Tulis `in=` lebih dulu |&lt;br /&gt;
| Script tidak bisa disimpan | Isi melebihi batas editor sekitar 30 ribu karakter | Pecah jadi beberapa script |&lt;br /&gt;
| `no such item` | Nama script salah atau belum dibuat | Cek `/system script print` |&lt;br /&gt;
&lt;br /&gt;
🔥 &amp;#039;&amp;#039;&amp;#039;Kasus nyata:&amp;#039;&amp;#039;&amp;#039; Sebuah lab sekolah memasang script notifikasi dengan `:put` lalu bingung karena tidak ada hasil. Script sebenarnya berjalan sempurna — hanya saja output `:put` masuk ke terminal yang tidak ada saat dijalankan scheduler. Setelah diganti `:log warning`, pesan langsung muncul di menu Log dan bisa dibaca dari Winbox.&lt;br /&gt;
&lt;br /&gt;
== 🔐 Catatan keamanan &amp;amp; etika ==&lt;br /&gt;
&lt;br /&gt;
* **Beri policy seperlunya.** Script yang hanya membaca cukup `read`; jangan langsung memberi `sensitive` atau `reboot`.&lt;br /&gt;
* **Jangan simpan password di dalam script.** Isi script ikut terbaca di `/export`, Winbox, dan backup. Kalau perlu rahasia, gunakan mekanisme terpisah dan batasi akses user.&lt;br /&gt;
* **Batasi siapa yang boleh menulis script.** User dengan policy `write` dan `policy` bisa mengubah perilaku router secara permanen.&lt;br /&gt;
* **Review sebelum menempel.** Jangan menyalin script dari internet lalu menjalankannya di router produksi tanpa membaca isinya.&lt;br /&gt;
* **Uji di lab, bukan saat ujian.** Script yang salah bisa mematikan interface atau menghapus aturan firewall di tengah jam layanan.&lt;br /&gt;
* **Jaga log tetap berguna.** Script yang menulis log tiap detik akan menutupi pesan penting. Pilih interval yang wajar.&lt;br /&gt;
&lt;br /&gt;
== 📌 Kesimpulan ==&lt;br /&gt;
&lt;br /&gt;
Script RouterOS adalah cara mengubah perintah manual menjadi prosedur yang bisa dijalankan siapa saja, kapan saja. Kuncinya hanya tiga: variabel untuk menyimpan nilai, kendali alur untuk mengambil keputusan, dan `[]` untuk membaca keadaan router.&lt;br /&gt;
&lt;br /&gt;
Mulai dari script kecil yang menulis satu baris log. Setelah itu tambahkan penjadwalan, penanganan error, dan policy yang tepat. Jangan mulai dari script panjang yang belum kamu pahami.&lt;br /&gt;
&lt;br /&gt;
Langkah berikutnya: pelajari cara mengukur throughput dengan **Bandwidth Test**, supaya script yang kamu buat bisa dipakai memantau kualitas jalur, bukan hanya mencatat kejadian.&lt;br /&gt;
&lt;br /&gt;
== 🔗 Materi terkait ==&lt;br /&gt;
&lt;br /&gt;
* [[Mikrotik : Backup dan Export Konfigurasi]] — memahami isi file `.rsc` yang juga menyimpan script.&lt;br /&gt;
* [[Mikrotik : Praktikum Backup Otomatis dengan System Scheduler]] — penerapan scheduler untuk backup terjadwal.&lt;br /&gt;
* [[Mikrotik : Monitoring Dasar dengan Torch Traffic Log dan Resource]] — membaca log dan resource yang jadi bahan script.&lt;br /&gt;
* [[Mikrotik : Failover Koneksi dengan Netwatch dan Recursive Route]] — contoh script yang dipicu kondisi jaringan.&lt;br /&gt;
* [[Mikrotik : Praktikum Membuat User dan Group di RouterOS]] — mengatur policy user yang membatasi script.&lt;br /&gt;
* [[Mikrotik : Hotspot Dasar]] — objek yang sering diotomasi dengan script (voucher, profil, jadwal).&lt;br /&gt;
&lt;br /&gt;
== 📚 Referensi ==&lt;br /&gt;
&lt;br /&gt;
* MikroTik, [Scripting](https://manual.mikrotik.com/docs/developer-guides/scripting/) — manual resmi bahasa scripting RouterOS.&lt;br /&gt;
* MikroTik, [Scripting Tips and Tricks](https://manual.mikrotik.com/docs/developer-guides/scripting/scripting-tips-and-tricks).&lt;br /&gt;
* MikroTik, [Scheduler](https://manual.mikrotik.com/docs/system-information-and-utilities/scheduler/) — perilaku `start-time`, `interval`, dan policy.&lt;br /&gt;
* MikroTik, [CLI Reference: /system/scheduler](https://manual.mikrotik.com/docs/cli-reference/system/scheduler).&lt;br /&gt;
* MikroTik, [Log](https://manual.mikrotik.com/docs/diagnostics-monitoring-and-troubleshooting/log/).&lt;br /&gt;
&lt;br /&gt;
[[Category:TKJ]]&lt;br /&gt;
[[Category:Jaringan]]&lt;br /&gt;
[[Category:Mikrotik]]&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
</feed>