
Alat praktis untuk mengelola PDU di router MikroTik
MikroTik dikenal sebagai produsen peralatan jaringan dengan keandalan tinggi dengan harga murah dan fungsionalitas yang kaya. Dasar perangkat lunak untuk produk MikroTik adalah
RouterOS , sistem operasi jaringan berbasis Linux. Ini berjalan pada
RouterBOARD , garis besar solusi perangkat keras yang mencakup peralatan operator murni dan platform untuk digunakan di rumah. RouterOS memberi administrator / pengguna opsi-opsi hebat untuk mengonfigurasi dan mengelola router, memungkinkan Anda untuk beroperasi tidak hanya dengan fungsionalitas built-in sistem, tetapi juga membuat opsi Anda sendiri untuk hampir semua solusi melalui pemrograman skrip.
Pada artikel ini, saya akan membahas bagaimana Anda dapat menggunakan fungsionalitas lanjutan dari router MikroTik untuk mengeluarkan perintah kontrol daya menggunakan
PDU (Internet relay) langsung dari router melalui fungsi skrip.
Sebagai PDU, saya menggunakan relay Ethernet RODOS-8/9/10 dari perusahaan OLIMP (perangkat ini benar-benar identik dalam hal kontrol), yang tetap ada setelah beberapa proyek dan “siap”.
Fitur RouterOS untuk manajemen PDU
Fungsi lanjutan RouterOS dapat memungkinkan:
- Mengaktifkan / menonaktifkan daya perangkat yang terhubung ke PDU dari jarak jauh
- Secara remote mengontrol PDU pada terjadinya berbagai peristiwa dalam jaringan (katakanlah, jika tidak ada respons dari perangkat apa pun untuk melakukan ping, ketika klien VPN tertentu, klien jaringan wifi, dll., Terhubung ke router), tergantung pada waktu (dijadwalkan)
- Beri tahu administrator atau pengguna tentang perubahan status relai pada PDU melalui email atau nomor telepon (melalui SMS)
Dengan demikian, dimungkinkan untuk mengatur, misalnya, kontrol peralatan server, menghidupkan / mematikan / me-restart peralatan jaringan "hung", menghidupkan pendinginan atau pemanasan, penerangan, mengatur beban yang dapat diterima untuk daya pengenal sebagai bagian dari Smart Home, dan banyak lagi yang dapat memungkinkan Imajinasi Anda
Kemampuan untuk mengontrol relai Internet dari RouterOS disediakan oleh perintah
fetch router, sintaksnya dijelaskan secara rinci di tautan di akhir artikel.
Mengelola PDU melalui "fetch" Router Command
RODOS-8/9/10 PDU mendukung format URL berikut:
http: // [login]: [Kata sandi] @ [alamat IP] [/ lindungi] / rb [X-1] [tindakan] .cgi- Login dan kata sandi - data yang relevan untuk mengakses perangkat dalam "mode terlindungi" (lindungi)
- Alamat IP - alamat IP perangkat di jaringan
- / lindungi - kunci akses dalam "mode terlindungi". Jika akses "terbuka" diinstal pada perangkat, / proteksi tidak ditentukan, login dan kata sandi juga tidak ditentukan
- [aksi] - aksi yang diambil pada relai: n-nyalakan, f-matikan, s-berikan pulsa yang tahan 1 detik
- X adalah jumlah relai yang sedang diakses, nilai yang mungkin tergantung pada model perangkat:
- RODOS-8 - tidak diindikasikan, seperti perangkat ini memiliki satu relay
- RODOS-9 - X = 1 atau X = 2
- RODOS-10 - X = [1-4]
Semua parameter yang ditentukan dilewatkan tanpa tanda kurung [].
Jadi, untuk menyelesaikan masalah kami di RouterOS, untuk mengaktifkan relay pertama PDU kami, entri berikut sudah cukup:
/tool fetch url="http://[:]@192.168.1.20/protect/rb0n"
Jika kita menginginkan respons dari perangkat, kita harus menggunakan:
/tool fetch url="http://[:]@192.168.1.20/protect/rb0n" mode=http dst-path="Rodosanswer.txt"; :local Rodosanswer [/file get Rodosanswer.txt contents];
Respons PDU dalam kasus kami dikembalikan menggunakan mekanisme
json ke variabel
Rodosanswer dalam bentuk berikut:
- "Sukses! "- dalam hal eksekusi yang sukses dari perintah
- "Kesalahan" - jika perintah tidak dieksekusi (sebagai aturan, ketika mengakses tanpa menunjukkan login dan kata sandi PDU di baris URL, jika PDU dalam mode "dilindungi")
Kami membuat fungsi manajemen Rodos PDU dalam repositori router Mikrotik
Jadi mari kita mulai. Mari kita buat fungsi kontrol relai menggunakan contoh kontrol RODOS-10 dalam repositori skrip router MikroTik dengan nama "Func_RODOS10rele":
Kode "Func_RODOS10rele" ################ FuncRODOS10rele ###################### # PDU RODOS-10 # by Sergej Serkov 23.12.2017 ####################################################### # , :global FuncRODOS10rele do={ :local Sport ""; :if ([:len $Rport]=0) do={:set Sport "80";} else={:set Sport $Rport;} :global FuncPing; :local PingAnswer [$FuncPing PingAdr=$Radr]; :if ($PingAnswer="OK") do={ :local Rprotect; :local Wprotect; :local Rmode "0"; :local Nrele 0; :local Act; :if (([:len $Rlogin]=0) and ([:len $Rpass]=0)) do={:set Rprotect ""; set Wprotect "";} else={:set Rprotect ("$Rlogin".":"."$Rpass"."@"); set Wprotect "/protect";} :if ($Rstatus="on") do={:set Rmode "1"; :set Act "n"} :if ($Rstatus="off") do={:set Rmode "1"; :set Act "f"} :if ($Rstatus="inv") do={:set Rmode "1"; :set Act "s"} else={} :if ($Rmode="1") do={ :set Nrele ([:tonum $Rrele] - 1); :if (($Nrele > -1 and ($Nrele < 4)) do={ :local StrFetchRodos; :set StrFetchRodos ("http://"."$Rprotect"."$Radr".":"."$Sport"."$Wprotect"."/rb"."$Nrele"."$Act".".cgi"); do { [/tool fetch url=$StrFetchRodos mode=http dst-path="Rodosanswer.txt";]; } on-error={: log info ""; :log error ("Call ERROR function <RODOS10rele> ERROR fetch command"); :local Rodosanswer "ERROR: command ROS <fetch>"; : log info ""; :return $Rodosanswer} :log info ""; :log warning ("all "."$Wprotect "."function <RODOS10rele> set rele #"."$Rrele "."is ["."$Rstatus"."]"); :log info ""; :delay 2s; :local Rodosanswer [/file get Rodosanswer.txt contents]; /file remove Rodosanswer.txt; :return $Rodosanswer; } else={ :log info ""; :log error ("all ERROR"."$Wprotect "."function <RODOS10rele> set rele#"."$Rrele"." but NUMBER RELE MISMATCH"); :log info ""; :local Rodosanswer "ERROR: rele range mismath"; :return $Rodosanswer;} } else={ :log info ""; :log error ("all ERROR"."$Wprotect "."function <RODOS10rele> set rele#"."$Rrele"." but RELE REGIME SET MISMATCH"); :log info ""; :local Rodosanswer "ERROR: rele regime set mismatch"; :return $Rodosanswer;} } else={ :log info ""; :log error ("all ERROR"."$Wprotect "."function <RODOS10rele> but DEVICE NOT RESPONDED"); :log info ""; :local Rodosanswer "ERROR: device not responded"; :return $Rodosanswer;} }
Fungsi FuncRODOS10rele juga menggunakan dalam fungsinya fungsi kecil lainnya untuk memeriksa alamat jaringan untuk ping -
FuncPing , yang harus ada dalam lingkungan variabel repositori router selama pengoperasian fungsi utama.
Kode "Func_Ping" :global FuncPing do={ :local PingCount 3; # ; :local Result [/ping $PingAdr count=$PingCount]; :delay 2s; :local PingAnswer ""; :local MainIfInetOk false; :set MainIfInetOk ((3*$Result) >= (2 * $PingCount)) :put "MainIfInetOk=$MainIfInetOk" if (!$MainIfInetOk) do={ :set PingAnswer "ERROR" } if ($MainIfInetOk) do={ :set PingAnswer "OK" } :return $PingAnswer;}
Penerapan fungsi kontrol relai
Yang berikut ini harus dilewatkan sebagai parameter ke fungsi FuncRODOS10rele:
- Radr - alamat IP perangkat
- Rport - port http. Jika port standar untuk http (80) dikonfigurasi, parameter ini dapat dihilangkan
- Rrele - jumlah relai tempat kami melakukan aksi (untuk RODOS-10 [1-4]),
untuk RODOS-9 [1-2], karena RODOS-8 tidak ditransmisikan) - Rstatus - tindakan diambil ("tidak aktif" - nonaktifkan; "aktif" - aktifkan; "inv" - beri dorongan)
- Rlogin - login, Rpass - kata sandi akses perangkat
(jika tidak disetel, panggilan perintah digunakan tanpa "/ lindungi")
Contoh 1: memanggil fungsi dengan akses ke PDU melalui port http standar ketika "mode terproteksi" dimatikan dalam modul, menyalakan relai No. 2: [$FuncRODOS10rele Radr="192.168.1.20" Rrele="2" Rstatus="on"]
Contoh 2: memanggil fungsi dengan akses ke PDU melalui port http 8021 yang dikonfigurasi dengan set "protected mode", mematikan relai No. 2 [$FuncRODOS10rele Radr="192.168.1.20" Rport="8021" Rrele="2" Rstatus="off" Rlogin="login" Rpass="password"]
Respons fungsi dapat dikembalikan ke variabel string
Rodosanswer .
Rodosanswer dapat berisi teks berikut: • "Sukses!" - dalam kasus panggilan sukses dan eksekusi tim
• "Fault" - dalam hal penanganan yang salah dan non-eksekusi perintah
• "ERROR: release range mismatch" - jika nomor relai tidak valid ditentukan
dalam parameter fungsi Rrele untuk versi perangkat ini
• "GALAT: melepaskan rezim yang mengatur ketidakcocokan" - dalam kasus tidak ditentukan atau salah
parameter yang ditentukan dari fungsi Rstatus ("on", "off", "inv")
• "GALAT: perangkat tidak merespons" - jika tidak ada respons dari perangkat
untuk ping
• "ERROR: command ROS <fetch>" - jika ada kesalahan secara langsung
ketika menjalankan RouterOS mengambil perintah URL (biasanya jika tidak
nomor port yang ditentukan di Rport, parameter Rlogine yang ditentukan salah
dan / atau Rpass)
Anda dapat memanggil fungsi kontrol relay pada PDU dari skrip Anda yang lain sebagai berikut:
- Pertama, Anda perlu menjalankan skrip yang menempatkan fungsi yang diperlukan di lingkungan variabel repositori router. Ini dapat dilakukan sekali, misalnya, ketika memulai router dari RouterOS Scheduler ( / system scheduler )
# /system script run Func_RODOS10rele; # «FuncPing» # ( FuncRODOS10rele) /system script run Func_Ping;
- Setelah fungsi-fungsi didefinisikan, Anda dapat menggunakannya (khususnya, panggil FuncRODOS10rele)
Sebagai contoh, kita memanggil fungsi kita dengan menerapkan pulsa ke relai No. 4 dari PDU RODOS-10:
:global FuncRODOS10rele; :local Rodosanswer [$FuncRODOS10rele Radr="192.168.1.20" Rport="8021" Rrele="4" Rstatus="inv" Rlogin="login" Rpass="password"]; :log info $Rodosanswer;
Respons akan dikembalikan ke variabel Rodosanswer dan, dalam hal ini, ditampilkan di log router.
Pustaka fungsi siap pakai untuk bekerja dengan PDU
Untuk kemudahan penggunaan, saya membuat perpustakaan fungsi untuk Rodos PDU model 8, 9, 10 dan 10 dari pelaksanaan DIN (perpustakaan versi 1.0 tanggal 25 Desember 2017). Script perpustakaan digabungkan ke dalam file Func_RODOS.rsc, yang dapat diimpor ke RouterOS dengan perintah terminal utilitas WINBOX berikut:
/import file= Func_RODOS.rsc
Proses impor dapat berlangsung dari 20 detik hingga 1 menit, tergantung pada model router Mikrotik (kecepatannya).
Dalam hal ini, semua skrip yang sebelumnya tersedia di router tidak terpengaruh, fungsi dan skrip pustaka Func_RODOS ditambahkan ke skrip repositori yang ada.
Pustaka Rodos.rsc versi 1.0 berisi skrip berikut:- start_RODOS - menjalankan skrip ini menyetel semua fungsi ke variabel lingkungan
- Func_Ping - fungsi memeriksa alamat untuk "ping"
- Func_Mail - berfungsi untuk mengirim pesan sewenang-wenang ke surat administrator
- Func_RODOS8rele - fungsi kontrol relai RODOS-8 PDU
- Func_RODOS8reset - fungsi reset ("reset") dari relay PDU RODOS-8
- Func_RODOS9rele - ... sama untuk model yang ditunjukkan ...
- Pengaturan Func_RODOS9
- Func_RODOS10rele
- Pengaturan Func_RODOS10
- call_example [...] - contoh panggilan fungsi perpustakaan
- Func_RODOS_lib - semua fungsi PDU (kecuali Ping dan Mail) dalam satu file skrip
Setelah mengimpor perpustakaan, Anda dapat menghapus fungsi dan skrip yang tidak perlu dari repositori, hanya menyisakan fungsi model dan skrip PDU Anda dengan fungsi FuncMail dan FuncPing.
Di perpustakaan, untuk masing-masing model PDU yang didukung, ada juga fungsi reset ("reset") yang nyaman (ditandai dengan nama "~ reset"). Parameter fungsi reset mirip dengan parameter fungsi instalasi relai, dengan pengecualian pada parameter "Rstatus", yang tidak digunakan selama "reset" dan opsional opsional parameter Rtime, yang menentukan waktu dalam detik antara mematikan dan menghidupkan relai lagi (jika Rtime tidak dialihkan ke fungsi, digunakan secara default. waktu 5 detik).
Fungsi boot ulang berfungsi sebagai berikut:
- Relai yang ditentukan dikirim perintah mematikan
- Kemudian ia menunggu detik Rtime dengan perintah inklusi berikutnya. Dalam hal ini, fungsi reset merujuk ke fungsi instalasi relai yang sesuai, yang harus ditentukan sebelum yang pertama
Jadi, jika, sebelum panggilan ke fungsi reset, relay tertentu dinyalakan, itu akan dimatikan dan setelah waktu yang ditentukan akan dihidupkan lagi (dan beban yang terhubung dengannya akan "reset"). Operasi serupa dilakukan pada relai mati, dan setelah fungsi diaktifkan, relai menjadi dinyalakan (yaitu, dalam hal ini fungsi memenuhi dirinya sebagai fungsi relai switching). Lebih mudah menggunakan fungsi reset untuk me-reboot peralatan jaringan "hung" yang terhubung ke Rodos PDU (titik akses, router, sakelar, berbagai server, dll ...).
Kode sumber pustaka Rodos.rsc (fungsi dan skrip, contoh mengaksesnya) “dikomentari” dengan cukup rinci, yang mungkin berguna bagi mereka yang ingin memahami perpustakaan secara detail (atau mungkin memodifikasi sendiri, atau menulis versi Anda sendiri).
Dalam contoh panggilan ke fungsi reboot, setelah fungsi tersebut berhasil, Anda dapat mengirim pesan ke alamat email administrator router (Anda dapat menentukan alamat email Anda dalam pengaturan variabel skrip). Dalam hal ini, skrip menggunakan layanan surat RouterOS dari / tool e-mail , yang parameternya harus dikonfigurasi dengan benar sebelumnya oleh Anda.
Rencana masa depan
Di masa depan, perpustakaan skrip untuk Rodos PDU akan diperluas - direncanakan untuk membuat fungsi untuk stasiun cuaca Internet RODOS-16, yang memiliki "on board", selain relay, jalur input / output dan sensor suhu / kelembaban / tekanan atmosfer. Hal ini juga direncanakan untuk menerapkan pencatatan fungsi tidak hanya ke log dan surat router, tetapi juga ke nomor telepon yang ditentukan pilihan pengguna (dengan mengirim pesan SMS melalui modem router).
Mungkin, dalam proses menggunakan perpustakaan oleh pengguna (termasuk pembaca materi ini), beberapa kesalahan akan terungkap, yang, sebagai aturan, tidak bisa dihindari selama pengembangan apa pun. Harap beri tahu saya jika ada kesalahan, komentar, dan saran untuk perbaikannya.
Tautan ke deskripsi perintah Fetch untuk router MikroTik
Tautan ke dokumentasi untuk PDU bekas
Tautan ke pustaka fungsi skrip untuk Rodos PDU
Serkov Sergey Vladimirovich, 26 Desember 2017