Scripting
Kata Pengantar
Terkadang kita membutuhkan sebuah atau beberapa rule yang bisa kita jalankan pada kondisi tertentu, jiak berdasarkan waktu, kita mungkin bisa buat scheduler. Akan tetapi, kita misalnya ingin mendisable beberapa rule dengan kriteria tertentu, jika kita lakukan manual tentu akan sangat merepotkan. Nah disini scripting mikrotik dibutuhkan. Pada dasarnya scripting mikrotik tidak jauh beda dengan scripting bahasa lainnya, misal php atau lainya. Konsepnya masih sama bahkan jika dilihat sekilas dia seperti menggunakan bahasa Perl, hanya mungkin beda kata atau karakter. Jika sebelumnya Anda pernah belajar pemrograman, tentu scripting di mikrotik bukan hal yang sulit. Dan pada tulisan ini, saya akan menyampaikan beberapa dasar scripting di mikrotik.
Struktur Script
Scripting di RouterOS bisa dilakukan dalam beberapa baris, dan nantinya script akan diekseskusi satu demi satu. Struktur scripting pada command line RouterOS seperti berikut :
[prefix] [path] command [uparam] [param=[value]] .. [param=[value]]
Keterangan :
[prefix] = “:” atau “/” karakter yang mengindikasikan bahwa command merupakan ICE (karakter yg mengindikasikan global command) atau path. Karakter ini, .bisa dibutuhkan, bisa juga tidak
[path] = Path yang bersifat relatif untuk menentukan menu level. Bisa dibutuhkan, bisa juga tidak
command = Prrintah yang tersedia pada level menu tertentu.
[uparam] = parameter tanpa nama, harus dispesifikasikan terlebih dahulu jika command membutuhkannya.
[params] = Urutan parameter yang sudah dikenal yang memiliki nilai tertentu.
*Umm..saya juga sedikit bingung maksud keterangan diatas, kalau Anda ahli bahasa inggris, disarankan baca wiki.
Setiap akhir dari command pasti diakhiri dengan tanda “;” atau dengan baris baru, dan terkadang akhir command tidak butuh keduanya. Well, agak rumit memang, seperti ketika Anda mendengar jawaban “terserah”.
Single command yang berada di dalam (), [] or {} tidak membutuhkan karakter tanda akhir command. Akhir dari command ditentukan dari seluruh script, contoh :
:if ( true ) do={ :put "tralala" }
Jika ada command kedua di dalam sebuah command, maka harus diampit tanda “[]“. Contoh :
:put [/ip route get [find gateway=1.1.1.1]];
Anda bisa lihat rule diatas memiliki 3 perintah :
- :put = menampilkan nilai di terminal
- /ip route get = mencari rule route
- find gateway=1.1.1.1 = menentukan rule route yang memiliki parameter gateway=1.1.1.1
Membuat Komentar
Komentar diawali dengan tanda hashtag atau “#” kemudian dikuti karekter komentar. Perlu diketahui, tanda “#” yang berada didalam variable string tidak akan dianggap sebagai komentar, namun dianggap bagian dari string. Contoh penguunaan command :
# Ini adalah komentar
# Komentar yang tidak baik, ada spasinya.
:global a; # Ini juga bukan cara menulis komentar yang baik
:global myStr "Di-reject Jenita Janet # ini bukan komentar, tapi string"
Membuat Script Beda Baris
Jika dirasa terlalu panjang atau memang ingin dibuat beberapa baris perintah, perintah bisa digabungkan dengan menambahkan karakter backslash “/” di ujung. Perlu diketahui, tanda backflash, tidak dapat digunakan pada komentar. Contoh penerapan :
:if ($a = true \
and $b=false) do={ :put “$a $b”; }
:if ($a = true \ # bad comment
and $b=false) do={ :put “$a $b”; }
# comment \
continued – invalid (syntax error)
Spasi (Daerah Kosong)
Seperti pada bahasa pemrograman pada umumnya, spasi ini kadang dibutuhkan, kadang tidak boleh digunakan, dan kadang harus digunakan, tergantung syntax apa spasi ini si impementasikan. Spasi tidak boleh digunakan pada systax ’<parameter>=’, ’from=’ ,’to=’ , ‘step=’, ’in=’, ’do=’ , ‘else=’. Contoh penerapan
#contoh yang salah :
:for i from = 1 to = 2 do = { :put $i }
#contoh yang benar :
:for i from=1 to=2 do={ :put $i }
:for i from= 1 to= 2 do={ :put $i }
#contoh yang salah
/ip route add gateway = 3.3.3.3
#contoh yang benar
/ip route add gateway=3.3.3.3
Variable dan Cakupannya
Berdasarkan cakupanya, ada 2 jenis variable, :local dan :global. Globar mencakup seluruh script dan bisa dikenali dalam beberapa baris perintah, sedangkan local, dia hanya akan dikenali dalam satu struktur perintah. Variable global tidak bisa didefinisaikan didalam local scope. Contoh sederhana penerapan variable:
[admin@MikroTik] > :local myVar a;
[admin@MikroTik] > :put $myVar
syntax error (line 1 column 7)
Debugging
Sebenarnya ini hanya sekedar Tips & Trik saja, namun bagi saya debungging atau mencari kesalahan script adalah dengan menampilkan value. Biasanya kalau saya belajar java, saya tinggal tulis “print”, dengan VB “msgbox”. Nah, di mikrotik, caranya dengan perintah “:put”.
[admin@MikroTik] > :put "Haloo"
Haloo
[admin@MikroTik] >
Bagi saya pribadi :put ini sangat bermanfaat dimana saya bisa menelusuri kesalahan dengan menampilkan masing – masing value pada beberapa perintah. Bisa juga untuk menampilkan Variable.
[admin@MikroTik] > :local MyVar "Halo Dunia"; :put $MyVar
Halo Dunia
[admin@MikroTik] >
Operasi Matematika
Mikrotik juga support untuk melakukan perhitungan matematika.
Operator | Keterangan | Contoh |
---|
“+” | Menjalankan perintah penjumlahan | :put (3+4); |
“-” | Menjalankan perintah pengurangan | :put (1-6); |
“*” | Menjalankan perintah pengalian | :put (4*5); |
“/” | Menjalankan perintah Pembagian | :put (10 / 2); :put ((10)/2) |
“-” | Menjadikan bilangan negatif | { :local a 1; :put (-a); } |
Operasi Logika
Opearator | Keterangan | Contoh |
---|
“!” , “not” | logical NOT | :put (!true); |
“&&” , “and” | logical AND | :put (true&&true) |
“||” , “or” | logical OR | :put (true||false); |
“in” | | :put (1.1.1.1/32 in 1.0.0.0/8); |
Perintah Perulangan
Command | Syntax | Keterangan |
---|
do..while | :do { <commands> } while=( <conditions> ); :while ( <conditions> ) do={ <commands> }; | Menjalankan perintah sampai menemukan kondisi tertentu |
for | :for <var> from=<int> to=<int> step=<int> do={ <commands> } | Menjalankan perintah sesuai jumlah perulangan yang ditentukan. |
foreach | :foreach <var> in=<array> do={ <commands> }; | Menjalankan perintah pada setiap element yang ada didalam daftar perintah. |
Contoh Penggunaan Perintah Diatas :
Do While :
{:global i 10; :do {:put $i; :set i ($i - 1);} while (($i < 11) && ($i > 0))};
For :
:for i from=1 to=100 step=37 do={:put ($i)}
Foreach :
:foreach i in=[/interface find type=ether ] do={:put ("+--" . [/interface get $i name])};
Perintah Kondisi
Perintah yang dijalankan pada kondisi tertentu bisa dibuat dengan peintah “If”, dengan struktur perintah :
:if(<condition>) do={<commands>} else={<commands>} <expression>
Contoh Penggunaan :
{
:local myBool true;
:if ($myBool = false) do={ :put "value is false" } else={ :put "value is true" }
}
Command Lainnya
Command | Syntax | Keterangan | Contoh |
---|
/ | | Kembali ke root menu. | |
.. | | Kembali ke satu menu level. | |
? | | Menampilkan perintah yang tersedia. | |
global | :global <var> [<value>] | Mendefinisikan variable global. | :global myVar “something”; :put $myVar; |
local | :local <var> [<value>] | Mendefinisikan variable local. | { :local myLocalVar “I am local”; :put $myVar; } |
beep | :beep <freq> <length> | Membuat bunyi beep. | |
delay | :delay <time> | Berhenti selama waktu yang ditentukan. | |
put | :put <expression> | Menampilkan argumen pada console. | |
len | :len <expression> | Menampilkan panjang string atau jumlah elemen array. | :put [:len "length=8"]; |
typeof | :typeof <var> | Menampilkan tipe data variable. | :put [:typeof 4]; |
pick | :pick <var> <start>[<end>] | Mengambil nilai substring atau elemen array, jika tidak ada informasi berapa panjang range yang akan diambil, maka hanya akan diambil 1 saja. | :put [:pick "abcde" 1 3] |
log | :log <topic> <message> | Menulis pesan ke dalam log, dengan topics yang tersedia adalah “debug, error, info and warning”. | :log info “Hello from script”; |
time | :time <expression> | Menentukan interval waktu dalam menjalankan perintah. | :put [:time {:for i from=1 to=10 do={ :delay 100ms }}]; |
set | :set <var> [<value>] | Memberikan nilai pada suatu variable. | :global a; :set a true; |
find | :find <arg> <arg> <start> | Menemukan nilai berdasarkan kriteria string atau array. | :put [:find "abc" "a" -1]; |
environment | :environment print <start> | Mencetak informasi variable yang diketahui. | :global myVar true; :environment print; |
terminal | | Perintah terminal. | |
error | :error <output> | Menampilkan error pada console dan berhenti menjalankan script. | |
parse | :parse <expression> | Menyimpan perintah pada sebuah variable, bisa dijadikan sebagai fungsi. | :global myFunc [:parse ":put hello!"];$myFunc; |
resolve | :resolve <arg> | Menampilkan ip address dari sebuah DNS | :put [:resolve "www.mikrotik.com"]; |
toarray | :toarray <var> | Mengubah variable ke array | |
tobool | :tobool <var> | Mengubah variable ke boolean | |
toid | :toid <var> | Mengubah variable ke internal ID | |
toip | :toip <var> | Mengubah variable ke IP address | |
toip6 | :toip6 <var> | Mengubah variable ke IPv6 address | |
tonum | :tonum <var> | Mengubah variable ke integer | |
tostr | :tostr <var> | Mengubah variable ke string | |
totime | :totime <var> | Mengubah variable ke time | |
Sebenarnya masih banyak yang bisa dipelajari dari scripting mikrotik ini, akan tetapi artikel pada kali ini cukup sampai disini saja. Selain capek nulisnya, kebetulan penulis merasa cukup mengantuk. Jika Tuhan menghendaki, artikel mengenai scripting ini akan dilanjutkan pada judul yang baru. Terima kasih.