
Uma ferramenta útil para gerenciar PDUs em roteadores MikroTik
O MikroTik é conhecido como um fabricante de equipamentos de rede com alta confiabilidade a um preço baixo e funcionalidade rica. A base do software para os produtos MikroTik é o
RouterOS , um sistema operacional de rede baseado em Linux. É executado no
RouterBOARD , uma grande linha de soluções de hardware que inclui equipamentos puros do operador e plataformas para uso doméstico. O RouterOS fornece ao administrador / usuário ótimas opções para configurar e gerenciar o roteador, permitindo que você opere não apenas com a funcionalidade interna do sistema, mas também crie suas próprias opções para praticamente qualquer solução através da programação de scripts.
Neste artigo, discutirei como você pode usar a funcionalidade avançada dos roteadores MikroTik para emitir comandos de gerenciamento de energia usando
PDUs (relés da Internet) diretamente do roteador por meio de funções de script.
Como PDU, usei o relé Ethernet RODOS-8/9/10 da empresa OLIMP (os dispositivos são absolutamente idênticos em termos de controle), que permaneceram após vários projetos e estavam "à mão".
Recursos do RouterOS para gerenciamento de PDU
A funcionalidade avançada do RouterOS pode permitir:
- Ligar / desligar remotamente a energia dos dispositivos conectados à PDU
- Controlar remotamente a PDU após a ocorrência de vários eventos na rede (por exemplo, se não houver resposta de nenhum dispositivo para efetuar ping, quando um cliente VPN específico, um cliente de rede wifi etc. estiver conectado ao roteador), dependendo da hora (agendado)
- Notifique o administrador ou os usuários sobre a alteração no estado da retransmissão na PDU por e-mail ou número de telefone (via SMS)
Assim, é possível organizar, por exemplo, o controle do equipamento do servidor, ligar / desligar / reiniciar o equipamento de rede “travado”, ligar o resfriamento ou o aquecimento, a iluminação, gerenciar quaisquer cargas aceitáveis para a potência nominal como parte do Smart Home e muito mais que possam permitir Sua imaginação.
A capacidade de controlar uma retransmissão da Internet a partir do RouterOS é fornecida pelo comando
fetch router, cuja sintaxe é descrita em detalhes no link no final do artigo.
Gerenciando PDUs através do comando "buscar" do roteador
As PDUs RODOS-8/9/10 suportam o seguinte formato de URL:
http: // [login]: [Senha] @ [endereço IP] [/ protect] / rb [X-1] [action] .cgi- Login e senha - dados relevantes para acessar o dispositivo em "modo protegido" (proteger)
- Endereço IP - endereço IP do dispositivo na rede
- / protect - a tecla de acesso no "modo protegido". Se o acesso “aberto” estiver instalado no dispositivo, / protect não for especificado, o login e a senha também não serão especificados
- [ação] - a ação tomada no relé: n-ligar, f-desligar, s-emitir um pulso com duração de 1 segundo
- X é o número do relé que está sendo acessado; os valores possíveis dependem do modelo do dispositivo:
- RODOS-8 - não indicado, como o dispositivo possui um único relé
- RODOS-9 - X = 1 ou X = 2
- RODOS-10 - X = [1-4]
Todos os parâmetros especificados são passados sem colchetes [].
Assim, para resolver nosso problema no RouterOS, para habilitar o primeiro relé da nossa PDU, basta a seguinte entrada:
/tool fetch url="http://[:]@192.168.1.20/protect/rb0n"
Se queremos uma resposta do dispositivo, devemos usar:
/tool fetch url="http://[:]@192.168.1.20/protect/rb0n" mode=http dst-path="Rodosanswer.txt"; :local Rodosanswer [/file get Rodosanswer.txt contents];
A resposta da PDU no nosso caso é retornada usando o mecanismo
json para a variável
Rodosanswer da seguinte forma:
- “Sucesso! »- em caso de conclusão bem sucedida
- “Falha” - se o comando não for executado (como regra, ao acessar sem indicar o login e a senha da PDU na linha da URL, se a PDU estiver no modo “protegido”)
Criamos a função de gerenciamento Rodos PDU no repositório do roteador Mikrotik
Então, vamos começar. Vamos criar uma função de controle de retransmissão usando o exemplo de controle RODOS-10 no repositório de scripts do roteador MikroTik sob o nome "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;} }
A função FuncRODOS10rele também utiliza em seu trabalho outra pequena função de verificar o endereço de rede para ping -
FuncPing , que deve estar presente no ambiente das variáveis do repositório do roteador durante a operação da função 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;}
Aplicação da função de controle de relé
O seguinte deve ser passado como parâmetros para a função FuncRODOS10rele:
- Radr - endereço IP do dispositivo
- Rport - porta http. Se a porta padrão para http (80) estiver configurada, este parâmetro poderá ser omitido
- Rrele - o número do relé sobre o qual executamos uma ação (para RODOS-10 [1-4]),
para o RODOS-9 [1-2], para o RODOS-8 não é transmitido) - Rstatus - ação sendo executada ("off" - desativar; "on" - ativar; "inv" - dar um impulso)
- Rlogin - login, Rpass - senha de acesso ao dispositivo
(se não estiverem definidas, a chamada de comando será usada sem "/ protect")
Exemplo 1: chamando uma função com acesso à PDU através da porta http padrão quando o "modo protegido" está desativado no módulo, ativando o relé nº 2: [$FuncRODOS10rele Radr="192.168.1.20" Rrele="2" Rstatus="on"]
Exemplo 2: chamando uma função com acesso à PDU através da porta http 8021 configurada com o "modo protegido" configurado, desativando o relé nº 2 [$FuncRODOS10rele Radr="192.168.1.20" Rport="8021" Rrele="2" Rstatus="off" Rlogin="login" Rpass="password"]
A resposta da função pode ser retornada à variável de sequência
Rodosanswer .
Rodosanswer pode conter o seguinte texto: • "Sucesso!" - no caso de uma chamada e execução bem-sucedida de uma equipe
• "Falha" - no caso de manipulação incorreta e não execução de um comando
• "ERRO: incompatibilidade de faixa de referência" - se um número de relé inválido for especificado
no parâmetro da função Rrele para esta versão do dispositivo
• "ERRO: incompatibilidade de conjunto de regime rele" - no caso de não especificado ou incorreto
o parâmetro especificado da função Rstatus ("on", "off", "inv")
• "ERRO: dispositivo não respondeu" - se não houver resposta do dispositivo
pingar
• "ERRO: comando ROS <busca>" - no caso de um erro diretamente
ao executar o comando RouterOS buscar URL (geralmente se não
o número da porta especificado em Rport, parâmetros Rlogine especificados incorretamente
e / ou Rpass)
Você pode chamar a função de controle de retransmissão na PDU a partir de qualquer outro script, da seguinte maneira:
- Primeiro, você precisa executar scripts que colocam as funções necessárias no ambiente das variáveis do repositório do roteador. Isso pode ser feito uma vez, por exemplo, ao iniciar o roteador a partir do RouterOS Scheduler ( / system scheduler )
# /system script run Func_RODOS10rele; # «FuncPing» # ( FuncRODOS10rele) /system script run Func_Ping;
- Depois que as funções são definidas, você pode usá-las (em particular, chamar FuncRODOS10rele)
Como exemplo, chamamos nossa função aplicando um pulso ao relé n ° 4 da 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;
A resposta será retornada à variável Rodosanswer e, nesse caso, exibida no log do roteador.
Biblioteca de funções pronta para trabalhar com PDUs
Para facilitar o uso, criei uma biblioteca de funções para PDUs Rodos dos modelos 8, 9, 10 e 10 de execução DIN (biblioteca versão 1.0 de 25 de dezembro de 2017). Os scripts da biblioteca são combinados no arquivo Func_RODOS.rsc, que pode ser importado para o RouterOS pelo seguinte comando do terminal do utilitário WINBOX:
/import file= Func_RODOS.rsc
O processo de importação pode levar de 20 segundos a 1 minuto, dependendo do modelo do roteador Mikrotik (sua velocidade).
Nesse caso, todos os scripts que estavam anteriormente disponíveis no roteador não são afetados, as funções e os scripts da biblioteca Func_RODOS são adicionados aos scripts de repositório existentes.
A versão 1.0 da biblioteca Rodos.rsc contém os seguintes scripts:- start_RODOS - a execução desse script define todas as funções para variáveis de ambiente
- Func_Ping - a função de verificar o endereço para "ping"
- Func_Mail - função para enviar uma mensagem arbitrária para o email do administrador
- Func_RODOS8rele - função de controle de relé RODOS-8 PDU
- Func_RODOS8reset - função de reset ("reset") do relé PDU RODOS-8
- Func_RODOS9rele - ... da mesma forma para os modelos indicados ...
- Func_RODOS9reset
- Func_RODOS10rele
- Func_RODOS10reset
- call_example [...] - exemplos de chamadas de função de biblioteca
- Func_RODOS_lib - todas as funções da PDU (exceto Ping e Mail) em um arquivo de script
Após importar a biblioteca, você pode remover funções e scripts desnecessários do repositório, deixando apenas as funções do modelo e scripts da PDU com as funções FuncMail e FuncPing.
Na biblioteca, para cada um dos modelos de PDU suportados, também existem funções convenientes de redefinição ("redefinição") (marcadas nos nomes como "~ redefinição"). Os parâmetros das funções de redefinição são semelhantes aos parâmetros das funções de instalação do relé, com exceção do parâmetro “Rstatus”, que não é usado durante a “redefinição” e o parâmetro opcional opcional Rtime, que define o tempo em segundos entre desligar e ligar novamente o relé (se o Rtime não for passado para a função, é usado por padrão 5 segundos).
As funções de reinicialização funcionam da seguinte maneira:
- O relé especificado recebe um comando de desligamento
- Em seguida, aguarda Rtime segundos com o comando de inclusão subsequente. Nesse caso, as funções de redefinição se referem às funções correspondentes de instalação do relé, que devem ser determinadas antes da
Portanto, se antes de chamar a função de redefinição, um determinado relé foi ativado, ele será desligado e após um tempo especificado será novamente ativado (e a carga conectada a ele será "redefinida"). Uma operação semelhante é realizada em um relé desligado e, após a função ser ativada, o relé é ligado (ou seja, neste caso, a função se cumpre como uma função de comutação de relé). É conveniente usar as funções de redefinição para reiniciar o equipamento de rede “travado” conectado às PDUs Rodos (pontos de acesso, roteadores, comutadores, vários servidores, etc. ...).
Os códigos-fonte da biblioteca Rodos.rsc (funções e scripts, exemplos de acesso a eles) são “comentados” em detalhes suficientes, o que pode ser útil para quem deseja entender a biblioteca em detalhes (ou talvez modificá-los ou escrever sua própria versão).
Nos exemplos de chamadas para as funções de reinicialização, após a conclusão da função, é possível enviar mensagens para o endereço de email do administrador do roteador (nas configurações de variável de script, você pode especificar seu endereço de email). Nesse caso, os scripts usam o serviço de email do RouterOS em / tool email , cujos parâmetros devem ser corretamente configurados com antecedência por você.
Planos futuros
No futuro, a biblioteca de scripts para PDUs Rodos será expandida - está planejado criar funções para a estação meteorológica da Internet RODOS-16, que possui "on board", além de relés, linhas de entrada / saída e sensores de temperatura / umidade / pressão atmosférica. Também está planejado implementar o registro das funções não apenas no log e no correio do roteador, mas também no número de telefone especificado da escolha do usuário (enviando mensagens SMS através do modem do roteador).
Talvez, no processo de uso da biblioteca pelos usuários (incluindo os leitores deste material), alguns erros sejam revelados, os quais, em regra, são inevitáveis durante qualquer desenvolvimento. Por favor, informe-me de quaisquer erros, comentários e sugestões para sua correção.
Link para a descrição do comando Buscar para roteadores MikroTik
Link para documentação para PDUs usadas
Link para a biblioteca de funções de script da PDU Rodos
Serkov Sergey Vladimirovich, 26 de dezembro de 2017