
Ein praktisches Tool zum Verwalten von PDUs in MikroTik-Routern
MikroTik ist bekannt als Hersteller von Netzwerkgeräten mit hoher Zuverlässigkeit zu einem niedrigen Preis und einer umfassenden Funktionalität. Die Software-Grundlage für MikroTik-Produkte ist
RouterOS , ein Linux-basiertes Netzwerkbetriebssystem. Es läuft auf
RouterBOARD , einer großen Reihe von Hardwarelösungen, die sowohl reine Bedienerausrüstung als auch Plattformen für den Heimgebrauch umfassen. RouterOS bietet dem Administrator / Benutzer hervorragende Optionen zum Konfigurieren und Verwalten des Routers. So können Sie nicht nur mit der integrierten Funktionalität des Systems arbeiten, sondern auch Ihre eigenen Optionen für nahezu jede Lösung mithilfe von Skripten erstellen.
In diesem Artikel werde ich erläutern, wie Sie die erweiterten Funktionen von MikroTik-Routern verwenden können, um Leistungssteuerungsbefehle mithilfe von
PDUs (Internet-Relays) direkt vom Router über Skriptfunktionen auszugeben.
Als PDU habe ich das Ethernet-Relais RODOS-8/9/10 der Firma OLIMP verwendet (die Geräte sind hinsichtlich der Steuerung absolut identisch), das nach mehreren Projekten erhalten blieb und „zur Hand“ war.
RouterOS-Funktionen für die PDU-Verwaltung
Die erweiterte Funktionalität von RouterOS kann Folgendes ermöglichen:
- Schalten Sie die an die PDU angeschlossenen Geräte aus der Ferne ein / aus
- Steuern Sie die PDU je nach Zeit fern, wenn verschiedene Ereignisse im Netzwerk auftreten (z. B. wenn kein Gerät auf Ping reagiert, wenn ein bestimmter VPN-Client, ein WLAN-Netzwerkclient usw. mit dem Router verbunden ist) (geplant)
- Benachrichtigen Sie den Administrator oder Benutzer über die Änderung des Status des Relays auf der PDU per E-Mail oder Telefonnummer (per SMS).
So ist es beispielsweise möglich, die Steuerung von Servergeräten zu organisieren, "hängende" Netzwerkgeräte ein- / auszuschalten / neu zu starten, Kühlung oder Heizung einzuschalten, zu beleuchten, Lasten zu verwalten, die für die Nennleistung im Smart Home akzeptabel sind, und vieles mehr, was dies zulässt Ihre Fantasie.
Die Möglichkeit, ein Internet-Relay über RouterOS zu steuern, wird durch den Befehl
fetch router bereitgestellt, dessen Syntax unter dem Link am Ende des Artikels ausführlich beschrieben wird.
Verwalten von PDUs über den Router-Befehl "Fetch"
RODOS-8/9/10-PDUs unterstützen das folgende URL-Format:
http: // [Login]: [Passwort] @ [IP-Adresse] [/ protected] / rb [X-1] [Aktion] .cgi- Login und Passwort - relevante Daten für den Zugriff auf das Gerät im „geschützten Modus“ (schützen)
- IP-Adresse - IP-Adresse des Geräts im Netzwerk
- / protected - der Zugriffsschlüssel im "geschützten Modus". Wenn auf dem Gerät ein "offener" Zugriff installiert ist und / protected nicht angegeben ist, werden auch Anmeldung und Kennwort nicht angegeben
- [Aktion] - die am Relais ausgeführte Aktion: n-Einschalten, f-Ausschalten, s-Ausgeben eines Impulses von 1 Sek
- X ist die Nummer des Relais, auf das zugegriffen wird. Mögliche Werte hängen vom Modell des Geräts ab:
- RODOS-8 - nicht angegeben, als Das Gerät verfügt über ein einzelnes Relais
- RODOS-9 - X = 1 oder X = 2
- RODOS-10 - X = [1-4]
Alle angegebenen Parameter werden ohne Klammern [] übergeben.
Um unser Problem in RouterOS zu lösen und das erste Relais unserer PDU zu aktivieren, reicht der folgende Eintrag aus:
/tool fetch url="http://[:]@192.168.1.20/protect/rb0n"
Wenn wir eine Antwort vom Gerät wünschen, sollten wir Folgendes verwenden:
/tool fetch url="http://[:]@192.168.1.20/protect/rb0n" mode=http dst-path="Rodosanswer.txt"; :local Rodosanswer [/file get Rodosanswer.txt contents];
Die PDU-Antwort wird in unserem Fall mithilfe des
json- Mechanismus in der folgenden Form an die
Rodosanswer- Variable zurückgegeben:
- „Erfolg! "- bei erfolgreicher Ausführung des Befehls
- "Fehler" - wenn der Befehl nicht ausgeführt wird (in der Regel beim Zugriff ohne Angabe der PDU-Anmeldung und des Kennworts in der URL-Zeile, wenn sich die PDU im "geschützten" Modus befindet)
Wir erstellen die Rodos PDU-Verwaltungsfunktion im Repository des Mikrotik-Routers
Also fangen wir an. Erstellen wir eine Relaissteuerungsfunktion anhand des RODOS-10-Steuerungsbeispiels im Repository von Skripten des MikroTik-Routers unter dem Namen "Func_RODOS10rele":
Code "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;} }
Die Funktion FuncRODOS10rele verwendet in ihrer Arbeit auch eine andere kleine Funktion zum Überprüfen der Netzwerkadresse auf Ping -
FuncPing , die während des Betriebs der Hauptfunktion in der Umgebung der Router-Repository-Variablen vorhanden sein sollte.
Code "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;}
Anwendung der Relaissteuerfunktion
Folgendes muss als Parameter an die Funktion FuncRODOS10rele übergeben werden:
- Radr - IP-Adresse des Geräts
- Rport - http-Port. Wenn der Standardport für http (80) konfiguriert ist, kann dieser Parameter weggelassen werden
- Rrele - die Nummer des Relais, über das wir eine Aktion ausführen (für RODOS-10 [1-4]),
für RODOS-9 [1-2], für RODOS-8 wird nicht übertragen) - Rstatus - Aktion wird ausgeführt ("Aus" - Deaktivieren; "Ein" - Aktivieren; "Inv" - Geben Sie einen Impuls)
- Rlogin - Login, Rpass - Gerätezugriffskennwort
(Wenn sie nicht gesetzt sind, wird der Befehlsaufruf ohne "/ protected" verwendet.)
Beispiel 1: Aufrufen einer Funktion mit Zugriff auf die PDU über den Standard-http-Port, wenn der „geschützte Modus“ im Modul deaktiviert ist, Relais Nr. 2 einschalten: [$FuncRODOS10rele Radr="192.168.1.20" Rrele="2" Rstatus="on"]
Beispiel 2: Aufrufen einer Funktion mit Zugriff auf die PDU über den konfigurierten http 8021-Port mit eingestelltem „geschützten Modus“, Ausschalten von Relais Nr. 2 [$FuncRODOS10rele Radr="192.168.1.20" Rport="8021" Rrele="2" Rstatus="off" Rlogin="login" Rpass="password"]
Die Antwort der Funktion kann an die
Stringvariable Rodosanswer zurückgegeben werden.
Rodosanswer kann folgenden Text enthalten: • "Erfolg!" - bei erfolgreichem Anruf und Ausführung eines Teams
• "Fehler" - bei fehlerhafter Behandlung und Nichtausführung eines Befehls
• "ERROR: Rele Range Mismatch" - wenn eine ungültige Relay-Nummer angegeben ist
im Parameter der Rrele-Funktion für diese Version des Geräts
• "ERROR: Rele Regime Set Mismatch" - im Falle von nicht spezifizierten oder falschen
der angegebene Parameter der Rstatus-Funktion ("on", "off", "inv")
• "FEHLER: Gerät hat nicht geantwortet" - wenn keine Antwort vom Gerät erfolgt
zu pingen
• "ERROR: Befehl ROS <fetch>" - im Fehlerfall direkt
Wenn Sie den Befehl RouterOS Fetch URL ausführen (normalerweise, wenn nicht)
die in Rport angegebene Portnummer, falsch angegebene Rlogine-Parameter
und / oder Rpass)
Sie können die Relaissteuerungsfunktion auf der PDU von jedem Ihrer anderen Skripte aus wie folgt aufrufen:
- Zuerst müssen Sie Skripte ausführen, die die erforderlichen Funktionen in der Umgebung der Router-Repository-Variablen platzieren. Dies kann beispielsweise einmalig erfolgen, wenn der Router über den RouterOS Scheduler ( / system scheduler ) gestartet wird.
# /system script run Func_RODOS10rele; # «FuncPing» # ( FuncRODOS10rele) /system script run Func_Ping;
- Nachdem die Funktionen definiert wurden, können Sie sie verwenden (insbesondere FuncRODOS10rele aufrufen).
Als Beispiel rufen wir unsere Funktion auf, indem wir einen Impuls an das Relais Nr. 4 der PDU RODOS-10 anlegen:
:global FuncRODOS10rele; :local Rodosanswer [$FuncRODOS10rele Radr="192.168.1.20" Rport="8021" Rrele="4" Rstatus="inv" Rlogin="login" Rpass="password"]; :log info $Rodosanswer;
Die Antwort wird an die Rodosanswer- Variable zurückgegeben und in diesem Fall im Router-Protokoll angezeigt.
Vorgefertigte Funktionsbibliothek für die Arbeit mit PDUs
Zur Vereinfachung der Verwendung habe ich eine Funktionsbibliothek für Rodos-PDUs der Modelle 8, 9, 10 und 10 der DIN-Ausführung erstellt (Bibliotheksversion 1.0 vom 25. Dezember 2017). Die Bibliotheksskripte werden in der Datei Func_RODOS.rsc zusammengefasst, die mit dem folgenden Befehl des WINBOX-Dienstprogrammterminals in RouterOS importiert werden kann:
/import file= Func_RODOS.rsc
Der Importvorgang kann je nach Modell des Mikrotik-Routers (Geschwindigkeit) zwischen 20 Sekunden und 1 Minute dauern.
In diesem Fall sind alle zuvor im Router verfügbaren Skripte nicht betroffen. Die Funktionen und Skripte der Func_RODOS-Bibliothek werden zu den vorhandenen Repository-Skripten hinzugefügt.
Die Rodos.rsc-Bibliothek Version 1.0 enthält die folgenden Skripte:- start_RODOS - Durch Ausführen dieses Skripts werden alle Funktionen auf Umgebungsvariablen gesetzt
- Func_Ping - die Funktion zum Überprüfen der Adresse auf "Ping"
- Func_Mail - Funktion zum Senden einer beliebigen Nachricht an die E-Mail des Administrators
- Func_RODOS8rele - RODOS-8 PDU-Relaissteuerfunktion
- Func_RODOS8reset - Reset-Funktion ("Reset") des PDU RODOS-8-Relais
- Func_RODOS9rele - ... ähnlich für die angegebenen Modelle ...
- Func_RODOS9reset
- Func_RODOS10rele
- Func_RODOS10reset
- call_example [...] - Beispiele für Bibliotheksfunktionsaufrufe
- Func_RODOS_lib - alle PDU-Funktionen (außer Ping und Mail) in einer Skriptdatei
Nach dem Importieren der Bibliothek können Sie unnötige Funktionen und Skripte aus dem Repository entfernen und nur die Funktionen Ihres PDU-Modells und der Skripte mit FuncMail- und FuncPing-Funktionen belassen.
In der Bibliothek gibt es für jedes der unterstützten PDU-Modelle auch praktische Funktionen zum Zurücksetzen ("Zurücksetzen") (in den Namen als "~ Zurücksetzen" gekennzeichnet). Die Parameter der Rücksetzfunktionen ähneln den Parametern der Relaisinstallationsfunktionen, mit Ausnahme des Parameters „Rstatus“, der beim „Zurücksetzen“ nicht verwendet wird, und des optionalen optionalen Parameters Rtime, der die Zeit in Sekunden zwischen dem Aus- und Wiedereinschalten des Relais definiert (wenn Rtime nicht an die Funktion übergeben wird), wird standardmäßig verwendet Zeit 5 Sekunden).
Neustartfunktionen funktionieren wie folgt:
- Das angegebene Relais erhält einen Befehl zum Herunterfahren
- Dann wartet es mit dem nachfolgenden Einschlussbefehl auf Rtime-Sekunden. In diesem Fall beziehen sich die Rücksetzfunktionen auf die entsprechenden Relaisinstallationsfunktionen, die vor der ersten festgelegt werden müssen
Wenn also vor dem Aufruf der Rücksetzfunktion ein bestimmtes Relais eingeschaltet wurde, wird es ausgeschaltet und nach einer bestimmten Zeit wieder eingeschaltet (und die daran angeschlossene Last wird "zurückgesetzt"). Ein ähnlicher Vorgang wird an einem ausgeschalteten Relais ausgeführt, und nachdem die Funktion aktiviert wurde, wird das Relais eingeschaltet (dh in diesem Fall erfüllt sich die Funktion als Relaisschaltfunktion). Es ist praktisch, die Rücksetzfunktionen zum Neustarten von "hängengebliebenen" Netzwerkgeräten zu verwenden, die an Rodos-PDUs angeschlossen sind (Zugangspunkte, Router, Switches, verschiedene Server usw. ...).
Die Quellcodes der Rodos.rsc-Bibliothek (Funktionen und Skripte, Beispiele für den Zugriff darauf) werden ausreichend detailliert „kommentiert“. Dies kann für diejenigen hilfreich sein, die die Bibliothek im Detail verstehen möchten (oder sie möglicherweise selbst ändern oder eine eigene Version schreiben möchten).
In den Beispielen für Aufrufe der Neustartfunktionen ist es nach Ausarbeitung der Funktion möglich, Nachrichten an die E-Mail-Adresse des Router-Administrators zu senden (in den Einstellungen für Skriptvariablen können Sie Ihre E-Mail-Adresse angeben). In diesem Fall verwenden die Skripte den RouterOS-Mail-Dienst von / tool e-mail , dessen Parameter von Ihnen im Voraus korrekt konfiguriert werden müssen.
Zukunftspläne
In Zukunft wird die Skriptbibliothek für Rodos-PDUs erweitert. Es ist geplant, Funktionen für die Internet-Wetterstation RODOS-16 zu erstellen, die neben Relais, Eingangs- / Ausgangsleitungen und Temperatur- / Feuchtigkeits- / Atmosphärendrucksensoren auch „an Bord“ hat. Es ist auch geplant, die Protokollierung der Funktionen nicht nur im Protokoll und in der E-Mail des Routers, sondern auch in der angegebenen Telefonnummer des Benutzers (durch Senden von SMS-Nachrichten über das Modem des Routers) zu implementieren.
Möglicherweise werden bei der Verwendung der Bibliothek durch Benutzer (einschließlich Leser dieses Materials) einige Fehler aufgedeckt, die in der Regel bei jeder Entwicklung unvermeidlich sind. Bitte informieren Sie mich über Fehler, Kommentare und Vorschläge zur Korrektur.
Link zur Beschreibung des Befehls Fetch für MikroTik-Router
Link zur Dokumentation für gebrauchte PDUs
Link zur Skriptfunktionsbibliothek für die Rodos PDU
Serkov Sergey Vladimirovich, 26. Dezember 2017