Gestion des relais Internet à partir de RouterOS Mikrotik via l'API

MikroTik RODOS-8/9/10

Un outil pratique pour gérer les PDU dans les routeurs MikroTik


MikroTik est connu comme un fabricant d'équipements réseau à haute fiabilité à bas prix et riche en fonctionnalités. La base logicielle des produits MikroTik est RouterOS , un système d'exploitation réseau basé sur Linux. Il fonctionne sur RouterBOARD , une large gamme de solutions matérielles qui incluent à la fois des équipements d'opérateur purs et des plates-formes pour un usage domestique. RouterOS fournit à l'administrateur / utilisateur de grandes options pour configurer et gérer le routeur, vous permettant non seulement de fonctionner avec les fonctionnalités intégrées du système, mais également de créer vos propres options pour presque toutes les solutions grâce à la programmation de scripts.

Dans cet article, je vais expliquer comment vous pouvez utiliser les fonctionnalités avancées des routeurs MikroTik pour émettre des commandes de gestion de l'alimentation à l'aide de PDU (relais Internet) directement à partir du routeur via des fonctions de script. En tant que PDU, j'ai utilisé le relais Ethernet RODOS-8/9/10 de la société OLIMP (les appareils sont absolument identiques en termes de contrôle), qui est resté après plusieurs projets et était «à portée de main».

Fonctionnalités RouterOS pour la gestion des PDU


Les fonctionnalités avancées de RouterOS peuvent permettre:

  • Allumez / éteignez à distance l'alimentation des appareils connectés à la PDU
  • Contrôlez à distance la PDU lors de la survenance de divers événements sur le réseau (par exemple, s'il n'y a pas de réponse d'un appareil au ping, lorsqu'un client VPN spécifique, un client de réseau wifi, etc., est connecté au routeur), en fonction de l'heure (prévu)
  • Avertir l'administrateur ou les utilisateurs du changement d'état du relais sur la PDU par e-mail ou numéro de téléphone (via SMS)

Ainsi, il est possible d'organiser, par exemple, le contrôle de l'équipement du serveur, allumer / éteindre / redémarrer l'équipement réseau «suspendu», allumer le refroidissement ou le chauffage, l'éclairage, gérer toutes les charges acceptables pour la puissance nominale dans le cadre de la maison intelligente, et bien plus encore qui peuvent permettre Votre imagination.

La possibilité de contrôler un relais Internet à partir de RouterOS est fournie par la commande fetch router, dont la syntaxe est décrite en détail sur le lien à la fin de l'article.

Gestion des PDU via la commande de routeur «fetch»


Les PDU RODOS-8/9/10 prennent en charge le format URL suivant:

http: // [connexion]: [Mot de passe] @ [adresse IP] [/ protect] / rb [X-1] [action] .cgi
  • Login et mot de passe - données pertinentes pour accéder à l'appareil en «mode protégé» (protéger)
  • Adresse IP - Adresse IP de l'appareil sur le réseau
  • / protect - la clé d'accès en "mode protégé". Si l'accès «ouvert» est installé sur l'appareil, / protect n'est pas spécifié, l'identifiant et le mot de passe ne sont pas non plus spécifiés
  • [action] - l'action prise sur le relais: n-allumer, f-éteindre, s-émettre une impulsion d'une durée de 1 sec
  • X est le numéro du relais auquel on accède; les valeurs possibles dépendent du modèle de l'appareil:
    1. RODOS-8 - non indiqué, car l'appareil a un seul relais
    2. RODOS-9 - X = 1 ou X = 2
    3. RODOS-10 - X = [1-4]

Tous les paramètres spécifiés sont passés sans crochets [].

Ainsi, pour résoudre notre problème dans RouterOS, pour activer le premier relais de notre PDU, l'entrée suivante suffit:

/tool fetch url="http://[:]@192.168.1.20/protect/rb0n" 

Si nous voulons une réponse de l'appareil, nous devons utiliser:

 /tool fetch url="http://[:]@192.168.1.20/protect/rb0n" mode=http dst-path="Rodosanswer.txt"; :local Rodosanswer [/file get Rodosanswer.txt contents]; 

La réponse PDU dans notre cas est renvoyée à l'aide du mécanisme json à la variable Rodosanswer sous la forme suivante:

  • «Succès! »- en cas de réussite
  • «Fault» - si la commande n'est pas exécutée (en règle générale, lors de l'accès sans indiquer le login et le mot de passe de la PDU dans la ligne URL, si la PDU est en mode «protégé»)

Nous créons la fonction de gestion Rodos PDU dans le référentiel du routeur Mikrotik


Commençons donc. Créons une fonction de contrôle de relais en utilisant l'exemple de contrôle RODOS-10 dans le référentiel de scripts du routeur MikroTik sous le nom "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;} } 

La fonction FuncRODOS10rele utilise également dans son travail une autre petite fonction de vérification de l'adresse réseau pour le ping - FuncPing , qui devrait être présente dans l'environnement des variables de référentiel du routeur pendant le fonctionnement de la fonction principale.

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;} 

Application de la fonction de commande de relais


Les éléments suivants doivent être transmis en tant que paramètres à la fonction FuncRODOS10rele:

  • Radr - adresse IP de l'appareil
  • Rport - port http. Si le port standard pour http (80) est configuré, ce paramètre peut être omis
  • Rrele - le numéro du relais sur lequel nous effectuons une action (pour RODOS-10 [1-4]),
    pour RODOS-9 [1-2], pour RODOS-8 n'est pas transmis)
  • Rstatus - action en cours ("off" - désactiver; "on" - activer; "inv" - donner une impulsion)
  • Rlogin - connexion, Rpass - mot de passe d'accès à l'appareil
    (s'ils ne sont pas définis, l'appel de commande est utilisé sans "/ protect")

Exemple 1: appeler une fonction avec accès à la PDU via le port http standard lorsque le "mode protégé" est désactivé dans le module, en activant le relais n ° 2:
 [$FuncRODOS10rele Radr="192.168.1.20" Rrele="2" Rstatus="on"] 

Exemple 2: appel d'une fonction avec accès à la PDU via le port http 8021 configuré avec le «mode protégé» défini, désactivation du relais n ° 2
 [$FuncRODOS10rele Radr="192.168.1.20" Rport="8021" Rrele="2" Rstatus="off" Rlogin="login" Rpass="password"] 

La réponse de la fonction peut être renvoyée à la variable de chaîne Rodosanswer .

Rodosanswer peut contenir le texte suivant:
  • "Succès!" - en cas d'appel réussi et d'exécution d'une équipe

  • "Fault" - en cas de traitement erroné et de non-exécution d'une commande

  • "ERREUR: décalage de plage rele" - si un numéro de relais non valide est spécifié 
	 dans le paramètre de la fonction Rrele pour cette version de l'appareil

  • "ERREUR: décalage du jeu de régimes" - en cas de non spécification ou incorrect 
     le paramètre spécifié de la fonction Rstatus ("on", "off", "inv")

  • "ERREUR: l'appareil n'a pas répondu" - s'il n'y a pas de réponse de l'appareil 
     faire un ping

  • "ERREUR: commande ROS <fetch>" - en cas d'erreur directement
     lors de l'exécution de la commande RouterOS fetch URL (généralement sinon
     le numéro de port spécifié dans Rport, paramètres Rlogine incorrectement spécifiés
     et / ou Rpass)

Vous pouvez appeler la fonction de contrôle de relais sur la PDU à partir de n'importe lequel de vos autres scripts comme suit:

  1. Vous devez d'abord exécuter des scripts qui placent les fonctions nécessaires dans l'environnement des variables du référentiel du routeur. Cela peut être fait une fois, par exemple, lors du démarrage du routeur à partir du planificateur RouterOS ( / planificateur système )

     #          /system script run Func_RODOS10rele; #      «FuncPing» # (  FuncRODOS10rele) /system script run Func_Ping; 
  2. Une fois les fonctions définies, vous pouvez les utiliser (en particulier, appeler FuncRODOS10rele)

    A titre d'exemple, nous appelons notre fonction en appliquant une impulsion au relais n ° 4 de la 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; 

    La réponse sera renvoyée à la variable Rodosanswer et, dans ce cas, affichée dans le journal du routeur.

    Bibliothèque de fonctions prête à l'emploi pour travailler avec les PDU


    Pour faciliter l'utilisation, j'ai créé une bibliothèque de fonctions pour les PDU Rodos des modèles 8, 9, 10 et 10 d'exécution DIN (bibliothèque version 1.0 datée du 25 décembre 2017). Les scripts de bibliothèque sont combinés dans le fichier Func_RODOS.rsc, qui peut être importé dans RouterOS par la commande de terminal d'utilitaire WINBOX suivante:

     /import file= Func_RODOS.rsc 

    Le processus d'importation peut prendre de 20 secondes à 1 minute, selon le modèle du routeur Mikrotik (sa vitesse).
    Dans ce cas, tous les scripts qui étaient auparavant disponibles dans le routeur ne sont pas affectés, les fonctions et les scripts de la bibliothèque Func_RODOS sont ajoutés aux scripts de référentiel existants.

    La bibliothèque Rodos.rsc version 1.0 contient les scripts suivants:
    • start_RODOS - l'exécution de ce script définit toutes les fonctions sur des variables d'environnement
    • Func_Ping - la fonction de vérification de l'adresse pour "ping"
    • Func_Mail - fonction pour envoyer un message arbitraire au courrier de l'administrateur
    • Func_RODOS8rele - Fonction de contrôle du relais PDU RODOS-8
    • Func_RODOS8reset - fonction de réinitialisation ("reset") du relais PDU RODOS-8
    • Func_RODOS9rele - ... de même pour les modèles indiqués ...
    • Func_RODOS9reset
    • Func_RODOS10rele
    • Func_RODOS10reset
    • call_example [...] - exemples d'appels de fonction de bibliothèque
    • Func_RODOS_lib - toutes les fonctions PDU (sauf Ping et Mail) dans un fichier de script

    Après avoir importé la bibliothèque, vous pouvez supprimer les fonctions et scripts inutiles du référentiel, ne laissant que les fonctions de votre modèle PDU et de vos scripts avec les fonctions FuncMail et FuncPing.

    Dans la bibliothèque, pour chacun des modèles de PDU pris en charge, il existe également des fonctions de réinitialisation ("reset") pratiques (marquées dans les noms par "~ reset"). Les paramètres des fonctions de réinitialisation sont similaires aux paramètres des fonctions d'installation du relais, à l'exception du paramètre «Rstatus», qui n'est pas utilisé pendant la «réinitialisation» et du paramètre facultatif facultatif Rtime, qui définit le temps en secondes entre la coupure et la remise en marche du relais (si Rtime n'est pas transmis à la fonction, est utilisé par défaut 5 secondes).

    Les fonctions de redémarrage fonctionnent comme suit:
    1. Le relais spécifié reçoit une commande d'arrêt
    2. Ensuite, il attend Rtime secondes avec la commande d'inclusion suivante. Dans ce cas, les fonctions de réinitialisation se réfèrent aux fonctions d'installation de relais correspondantes, qui doivent être déterminées avant la première

    Ainsi, si, avant l'appel à la fonction de réinitialisation, un certain relais était activé, il sera désactivé et après une heure spécifiée sera réactivé (et la charge qui lui est connectée sera "réinitialisée"). Une opération similaire est effectuée sur un relais désactivé, et après l'activation de la fonction, le relais est activé (c'est-à-dire que dans ce cas, la fonction se remplit en tant que fonction de commutation de relais). Il est pratique d'utiliser les fonctions de réinitialisation pour redémarrer les équipements réseau «bloqués» connectés aux PDU Rodos (points d'accès, routeurs, commutateurs, divers serveurs, etc ...).

    Les codes sources de la bibliothèque Rodos.rsc (fonctions et scripts, exemples d'accès) sont «commentés» avec suffisamment de détails, ce qui peut être utile à ceux qui veulent comprendre la bibliothèque en détail (ou peut-être les modifier vous-même ou écrire votre propre version).

    Dans les exemples d'appels aux fonctions de redémarrage, une fois la fonction élaborée, il est possible d'envoyer des messages à l'adresse e-mail de l'administrateur du routeur (vous pouvez spécifier votre adresse e-mail dans les paramètres de variable de script). Dans ce cas, les scripts utilisent le service de messagerie RouterOS à partir de / tool e-mail , dont les paramètres doivent être correctement configurés à l'avance par vous.

    Plans futurs


    À l'avenir, la bibliothèque de scripts pour les PDU Rodos sera étendue - il est prévu de créer des fonctions pour la station météo Internet RODOS-16, qui a «à bord», en plus des relais, des lignes d'entrée / sortie et des capteurs de température / humidité / pression atmosphérique. Il est également prévu d'implémenter la journalisation des fonctions non seulement dans le journal et le courrier du routeur, mais également dans le numéro de téléphone spécifié par l'utilisateur (en envoyant des SMS via le modem du routeur).

    Peut-être, dans le processus d'utilisation de la bibliothèque par les utilisateurs (y compris les lecteurs de ce matériel), certaines erreurs seront révélées, qui, en règle générale, sont inévitables lors de tout développement. Veuillez m'informer de toute erreur, commentaire et suggestion pour leur correction.

    Lien vers la description de la commande Fetch pour les routeurs MikroTik
    Lien vers la documentation des PDU utilisées
    Lien vers la bibliothèque de fonctions de script pour la PDU Rodos

    Serkov Sergey Vladimirovich, 26 décembre 2017

Source: https://habr.com/ru/post/fr410107/


All Articles