Gestión de relés de Internet desde RouterOS Mikrotik a través de API

MikroTik RODOS-8/9/10

Una herramienta útil para administrar PDU en enrutadores MikroTik


MikroTik es conocido como un fabricante de equipos de red con alta confiabilidad a un bajo precio y una rica funcionalidad. La base del software para los productos MikroTik es RouterOS , un sistema operativo de red basado en Linux. Se ejecuta en RouterBOARD , una gran línea de soluciones de hardware que incluye equipos de operador puro y plataformas para uso doméstico. RouterOS ofrece al administrador / usuario excelentes opciones para configurar y administrar el enrutador, lo que le permite operar no solo con la funcionalidad incorporada del sistema, sino también crear sus propias opciones para casi cualquier solución a través de la programación de scripts.

En este artículo, analizaré cómo puede utilizar la funcionalidad avanzada de los enrutadores MikroTik para emitir comandos de administración de energía utilizando PDU (relés de Internet) directamente desde el enrutador a través de funciones de script. Como PDU, utilicé el relé Ethernet RODOS-8/9/10 de la compañía OLIMP (los dispositivos son absolutamente idénticos en términos de control), que permanecieron después de varios proyectos y estaban "a la mano".

Funciones de RouterOS para la gestión de PDU


La funcionalidad avanzada de RouterOS puede permitir:

  • Encender / apagar de forma remota la alimentación de los dispositivos conectados a la PDU
  • Controle de forma remota la PDU ante la ocurrencia de varios eventos en la red (por ejemplo, si no hay respuesta de algún dispositivo para hacer ping, cuando un cliente VPN específico, un cliente de red wifi, etc., está conectado al enrutador), dependiendo del tiempo (programado)
  • Notifique al administrador o usuarios sobre el cambio en el estado del relé en la PDU por correo electrónico o número de teléfono (a través de SMS)

Por lo tanto, es posible organizar, por ejemplo, el control del equipo del servidor, encender / apagar / reiniciar el equipo de red "colgado", encender el enfriamiento o la calefacción, la iluminación, administrar cualquier carga aceptable para la potencia nominal como parte del Smart Home y mucho más que pueda permitir Tu imaginación

La capacidad de controlar un relé de Internet desde RouterOS es proporcionada por el comando fetch router, cuya sintaxis se describe en detalle en el enlace al final del artículo.

Gestión de PDU a través del comando de enrutador "fetch"


Las PDU RODOS-8/9/10 admiten el siguiente formato de URL:

http: // [inicio de sesión]: [Contraseña] @ [dirección IP] [/ proteger] / rb [X-1] [acción] .cgi
  • Inicio de sesión y contraseña: datos relevantes para acceder al dispositivo en "modo protegido" (proteger)
  • Dirección IP: dirección IP del dispositivo en la red
  • / protect - la clave de acceso en "modo protegido". Si el acceso "abierto" está instalado en el dispositivo, no se especifica / protect, tampoco se especifican el inicio de sesión y la contraseña
  • [acción] - la acción tomada en el relé: n-encendido, f-apagado, s-dar un pulso que dura 1 segundo
  • X es el número del relé al que se accede; los valores posibles dependen del modelo del dispositivo:
    1. RODOS-8 - no indicado, como el dispositivo tiene un solo relé
    2. RODOS-9 - X = 1 o X = 2
    3. RODOS-10 - X = [1-4]

Todos los parámetros especificados se pasan sin corchetes [].

Por lo tanto, para resolver nuestro problema en RouterOS, para habilitar el primer relé de nuestra PDU, la siguiente entrada es suficiente:

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

Si queremos una respuesta del dispositivo, debemos usar:

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

La respuesta PDU en nuestro caso se devuelve utilizando el mecanismo json a la variable Rodosanswer en la siguiente forma:

  • “¡Éxito! "- en caso de ejecución exitosa del comando
  • "Fallo": si el comando no se ejecuta (como regla, al acceder sin indicar el inicio de sesión y la contraseña de la PDU en la línea URL, si la PDU está en modo "protegido")

Creamos la función de gestión de PDU Rodos en el repositorio del enrutador Mikrotik


Entonces comencemos. Creemos una función de control de relé utilizando el ejemplo de control RODOS-10 en el repositorio de scripts del enrutador MikroTik con el nombre "Func_RODOS10rele":

Código "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 función FuncRODOS10rele también utiliza en su trabajo otra pequeña función de verificar el ping de la dirección de red: FuncPing , que debe estar presente en el entorno de las variables del repositorio del enrutador durante el funcionamiento de la función principal.

Código "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;} 

Aplicación de la función de control de relé


Lo siguiente debe pasarse como parámetros a la función FuncRODOS10rele:

  • Radr - dirección IP del dispositivo
  • Rport - puerto http. Si el puerto estándar para http (80) está configurado, este parámetro puede omitirse
  • Rrele: el número del relé sobre el que realizamos una acción (para RODOS-10 [1-4]),
    para RODOS-9 [1-2], para RODOS-8 no se transmite)
  • Rstatus - acción que se está tomando ("off" - deshabilitar; "on" - habilitar; "inv" - dar un impulso)
  • Rlogin - inicio de sesión, Rpass - contraseña de acceso al dispositivo
    (si no están configurados, la llamada de comando se usa sin "/ protect")

Ejemplo 1: llamar a una función con acceso a la PDU a través del puerto http estándar cuando el "modo protegido" está desactivado en el módulo, activando el relé N. ° 2:
 [$FuncRODOS10rele Radr="192.168.1.20" Rrele="2" Rstatus="on"] 

Ejemplo 2: llamar a una función con acceso a la PDU a través del puerto http 8021 configurado con el "modo protegido" configurado, apagando el relé No. 2
 [$FuncRODOS10rele Radr="192.168.1.20" Rport="8021" Rrele="2" Rstatus="off" Rlogin="login" Rpass="password"] 

La respuesta de la función se puede devolver a la variable de cadena Rodosanswer .

Rodosanswer puede contener el siguiente texto:
  • "¡Éxito!" - en caso de una llamada exitosa y la ejecución de un equipo

  • "Fallo": en caso de manejo erróneo y no ejecución de un comando

  • "ERROR: desajuste de rango de liberación": si se especifica un número de relé no válido 
	 en el parámetro de la función Rrele para esta versión del dispositivo

  • "ERROR: el régimen de relevo no coincide" - en caso de no especificado o incorrecto 
     El parámetro especificado de la función Rstatus ("on", "off", "inv")

  • "ERROR: el dispositivo no respondió" - si no hay respuesta del dispositivo 
     hacer ping

  • "ERROR: comando ROS <fetch>" - en caso de error directamente
     al ejecutar el comando URL de búsqueda de RouterOS (generalmente si no
     el número de puerto especificado en Rport, parámetros de Rlogine especificados incorrectamente
     y / o Rpass)

Puede llamar a la función de control de retransmisión en la PDU desde cualquiera de sus otros scripts de la siguiente manera:

  1. Primero debe ejecutar scripts que coloquen las funciones necesarias en el entorno de las variables del repositorio del enrutador. Esto se puede hacer una vez, por ejemplo, al iniciar el enrutador desde el Planificador de RouterOS ( / planificador del sistema )

     #          /system script run Func_RODOS10rele; #      «FuncPing» # (  FuncRODOS10rele) /system script run Func_Ping; 
  2. Después de definir las funciones, puede usarlas (en particular, llamar a FuncRODOS10rele)

    Como ejemplo, llamamos a nuestra función aplicando un pulso al relé No. 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 respuesta se devolverá a la variable Rodosanswer y, en este caso, se mostrará en el registro del enrutador.

    Biblioteca de funciones lista para usar para trabajar con PDU


    Para facilitar su uso, creé una biblioteca de funciones para las PDU Rodos de los modelos 8, 9, 10 y 10 de ejecución DIN (versión de biblioteca 1.0 del 25 de diciembre de 2017). Los scripts de la biblioteca se combinan en el archivo Func_RODOS.rsc, que puede importarse a RouterOS mediante el siguiente comando del terminal de utilidad WINBOX:

     /import file= Func_RODOS.rsc 

    El proceso de importación puede tomar de 20 segundos a 1 minuto, dependiendo del modelo del enrutador Mikrotik (su velocidad).
    En este caso, todos los scripts que estaban disponibles anteriormente en el enrutador no se ven afectados, las funciones y scripts de la biblioteca Func_RODOS se agregan a los scripts de repositorio existentes.

    La versión 1.0 de la biblioteca Rodos.rsc contiene los siguientes scripts:
    • start_RODOS: ejecutar este script establece todas las funciones en variables de entorno
    • Func_Ping - la función de verificar la dirección para "ping"
    • Func_Mail - función para enviar un mensaje arbitrario al correo del administrador
    • Func_RODOS8rele - Función de control de relé PDU RODOS-8
    • Func_RODOS8reset - función de reinicio ("reinicio") del relé PDU RODOS-8
    • Func_RODOS9rele - ... de manera similar para los modelos indicados ...
    • Func_RODOS9reset
    • Func_RODOS10rele
    • Func_RODOS10reset
    • call_example [...] - ejemplos de llamadas a funciones de biblioteca
    • Func_RODOS_lib: todas las funciones de PDU (excepto Ping y Mail) en un archivo de script

    Después de importar la biblioteca, puede eliminar funciones y scripts innecesarios del repositorio, dejando solo las funciones de su modelo de PDU y scripts con las funciones FuncMail y FuncPing.

    En la biblioteca, para cada uno de los modelos de PDU compatibles, también hay prácticas funciones de reinicio ("reinicio") (marcadas en los nombres como "~ reinicio"). Los parámetros de las funciones de reinicio son similares a los parámetros de las funciones de instalación del relé, con la excepción del parámetro "Rstatus", que no se utiliza durante el "reinicio" y el parámetro opcional opcional Rtime, que define el tiempo en segundos entre el apagado y encendido del relé (si Rtime no se pasa a la función, se usa por defecto tiempo 5 segundos).

    Las funciones de reinicio funcionan de la siguiente manera:
    1. El relé especificado recibe un comando de apagado.
    2. Luego espera segundos Rtime con el siguiente comando de inclusión. En este caso, las funciones de reinicio se refieren a las funciones de instalación del relé correspondientes, que deben determinarse antes del primer

    Por lo tanto, si, antes de la llamada a la función de reinicio, se activó un cierto relé, se apagará y después de un tiempo especificado se volverá a encender (y la carga conectada se "reiniciará"). Se realiza una operación similar en un relé apagado, y después de que se ha activado la función, el relé se enciende (es decir, en este caso, la función se cumple como una función de conmutación de relé). Es conveniente utilizar las funciones de reinicio para reiniciar el equipo de red "colgado" conectado a las PDU de Rodos (puntos de acceso, enrutadores, conmutadores, varios servidores, etc.).

    Los códigos fuente de la biblioteca Rodos.rsc (funciones y scripts, ejemplos de acceso a ellos) están "comentados" con suficiente detalle, lo que puede ser útil para aquellos que desean comprender la biblioteca en detalle (o tal vez modificarlos usted mismo o escribir su propia versión).

    En los ejemplos de llamadas a las funciones de reinicio, después de que la función se haya resuelto, es posible enviar mensajes a la dirección de correo electrónico del administrador del enrutador (en la configuración de la variable de script, puede especificar su dirección de correo). En este caso, los scripts usan el servicio de correo RouterOS desde / tool e-mail , cuyos parámetros debe configurar previamente de manera correcta.

    Planes futuros


    En el futuro, se ampliará la biblioteca de scripts para las PDU de Rodos: está previsto crear funciones para la estación meteorológica de Internet RODOS-16, que tiene "a bordo", además de relés, líneas de entrada / salida y sensores de temperatura / humedad / presión atmosférica. También se planea implementar el registro de las funciones no solo en el registro y el correo del enrutador, sino también en el número de teléfono especificado que elija el usuario (enviando mensajes SMS a través del módem del enrutador).

    Quizás, en el proceso de uso de la biblioteca por parte de los usuarios (incluidos los lectores de este material), se revelarán algunos errores que, como regla, son inevitables durante cualquier desarrollo. Infórmeme de cualquier error, comentario y sugerencia para su corrección.

    Enlace a la descripción del comando Fetch para enrutadores MikroTik
    Enlace a la documentación de las PDU usadas
    Enlace a la biblioteca de funciones de script para la PDU de Rodos

    Serkov Sergey Vladimirovich, 26 de diciembre de 2017

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


All Articles