Reboot no asterisk através de um ramal

Essa dica é para alguém que pode de repente se deparar com um cenário onde exista um servidor com asterisk e que, por algum acaso, não tenha acesso a console deste para executar o comando “reboot” para reiniciar o servidor/serviço na tentativa de restabelecer o serviço.

Um cenário que poderíamos ilustrar isso seria um servidor em uma sede remota, onde nem mesmo exista pessoal de TI ou algum preposto que tenha conhecimento para acessar o servidor e inserir o comando para reiniciar este servidor. Como temos um ramal exclusivo previamente cadastrado para executar este comando, claro que acrescido da segurança de uma senha, basta que qualquer um dentro da unidade (ou mesmo de outra unidade, desde que tenha acesso a discar para o ramal especial), disque para o ramal e ao ser indagada, informe a senha.

O trecho de código pode ser melhorado adicionando, por exemplo, um contador com um temporizador para garantir que caso a senha seja digitada por mais de “n” vezes, a rotina não possa ser executada até que se passe um certo período ou outro critério que desejar.

O trecho de código que deve ser inserido no seu extensions.conf é:

exten => 73738,1,Answer
exten => 73738,2,Background(informesenha)
exten => 73738,3,Read(VALOR,beep,8)
exten => 73738,4,GotoIf($[${VALOR} = 12121212]?73738,5:73738,7)
exten => 73738,5,System(/sbin/reboot)
exten => 73738,6,Hangup
exten => 73738,7,Background(informesenhaerrada)
exten => 73738,8,Hangup

Comentando as linhas do código:

LINHA 1 – atendimento do ramal

LINHA 2 – executa arquivo de som solicitando que seja inserida a senha para continuar a rotina

LINHA 3 – usa o comando Read() do asterisk para “receber” a partir do teclado os digitos que devem corresponder com a senha. A sintaxe do  comando Read(VALOR,beep,8) neste nosso exemplo, recebe os dígitos e guarda o valor na variável VALOR. O beep serve para sinalizar ao usuário que já pode iniciar a digitação do código secreto que neste caso é de no máximo 8 digitos.  Caso sua senha seja menor que o número de digitos especificado nessa linha, o usuário deve sinalizar ao asterisk que concluiu a digitação teclando #.

LINHA 4 – usa o comando GotoIf para testar se os digitos que o usuário teclou e foi armazenado na variável VALOR, corresponde a um determinado número que devemos especificar nesta linha, após o sinal de igualdade. Caso os valores sejam iguais, executa a primeira opção após o sinal de interrogação (?) mas caso não haja correspondência dos valores, executa a opção após os dois pontos (:). A estrutura do comando GotoIf é do tipo ternária, ou seja, composta por três campos, a saber:  expressão?ação_se_correto:ação_se_errado.

LINHA 5 – caso a senha tenha correspondido, essa linha é executada, e utilizando o comando System() do asterisk, chama o comando do sistema operacional que reinicia o servidor.

LINHA 6 – nesse contexto seria desnecessária, pois se o comando para reiniciar o servidor foi aceito, de nada adianta tentar executar mais nada, mas é uma prática saudável na criação de trechos de códigos para evitar que, uma vez tendo executado o que você pretende que o asterisk execute, encerre a execução a partir deste ponto.

LINHA 7 –  executa um arquivo de áudio que informa ao usuário que a senha não corresponde ao esperado.

LINHA 8 – encerra a ligação.

 

OBS.: O código acima foi criado e testado em um asterisk versão 1.6, rodando em um servidor DEBIAN. Caso sua versão do asterisk ou do sistema operacional seja diferente, pode haver necessidade de adequar os comandos.

Siga-me

Claudio Eden

Profissional da área de Tecnologia da Informação desde 1986, graduado em Gestão de TI, graduando em Análise e Desenvolvimento de Sistemas e cursando especialização em Engenharia e Arquitetura de Software.

Sólidos conhecimentos em infra-estrutura de TIC e Service Desk. Larga experiência em gerenciamento de equipes e contratos, Aderência aos princípios de governança de TIC. Conhecimento dos padrões e melhores práticas de mercado para TIC baseado em ITIL.

Atuando oficialmente com Asterisk desde 2010, gerenciou a plataforma em Contact Center com grande volume de ligações e desenvolveu um projeto cuja base é o Asterisk.
Siga-me