ASTNAGIOS 2.0 + FAN - Solução completa para monitoramento

gnu

Apresento minhas experiências com o FAN, assim como a segunda versão do script de integração Asterisk + Nagios, o qual já apresentei em artigo anterior.

[ Hits: 21.496 ]

Por: Sidney Alexandre Pagel em 06/04/2015


Os fontes...



Segue código fonte da aplicação, excetuando-se apenas dados confidenciais, como IP de servidores e senhas:

<?php
        //variaveis de conexao
        $servername = "192.168.X.X";
        $username = "nagios";
        $password = "XXXXX";
        $dbname = "astnagios";
        //cria conexao
        $conn = new mysqli($servername, $username, $password, $dbname);
        //valida conexao
        if ($conn->connect_error) {
                die("Connection failed: " . $conn->connect_error);
        }

        $diretorio="/astnagios/";

    //variaveis insert
        $host_name = shell_exec("cat ".$diretorio."hostiden");
    //este é o segredo do processo. No arquivo "hostiden", o Nagios "escreve" o nome do host    //que caiu, e a aplicação PHP "lê" o conteúdo deste arquivo, que será inserido no arquivo     //call, e entregue ao Asterisk para que o áudio correto seja executado no momento do    //atendimento da ligação.
        $host_state = shell_exec("cat ".$diretorio."hoststate");
        $horario = shell_exec("date +%H:%M:%S");
        //cria sql de insert tabela eventos
        $sql = "INSERT INTO eventos (host_name, evento, horario) VALUES ('$host_name', '$host_state', '$horario')";
        //valida insert
        if ($conn->query($sql) === TRUE) {
                echo "New record created successfully\n";
        } else {
                echo "Error: " . $sql . "<br>" . $conn->error;
        }
    //serão feitas 100 tentativas, até que alguém atenda
        for ($i = 0; $i < 100; $i ++){
    //sorteio aleatório de 1 dos quatro telefones existentes na tabela de contatos
                $seq = rand(1, 4);
    //busca no banco pelo telefone "sorteado"
                $sql2 = "SELECT telefone from contatos where id_contato='$seq'";
                //retorna telefone contato
                $result2 = $conn->query($sql2);
                        while($row = $result2->fetch_assoc()) {
                                $telefone =  $row["telefone"];
                        }
    //seleciona o id do "sortudo"
                $sql3 = "SELECT id_contato from contatos where telefone='$telefone'";
                $result3 = $conn->query($sql3);
                        while($row = $result3->fetch_assoc()) {
                                $id_user =  $row["id_contato"];
                        }
    //verifica se o evento já não se encontra na tabela de checados
                $sql4 = "select id_evento from eventos where id_evento not in (select id_evento from checados);";
                $result4 = $conn->query($sql4);
                $y = null;

                while ($row = $result4->fetch_assoc()) {
                        $y = $row["id_evento"];
                }
                if($y === null){
                        break;
                }else {
    //caso não se encontre, trata-se de evento novo e não tratado
    //então a função é chamada
    //a função só deixará de ser chamada quando a variável retorno receber o valor "1"
                        $retorno_function = ligacao($telefone, $host_name, $id_user, $y, $diretorio, $seq);
                        if ($retorno_function === '1'){
                                echo "OK\n";
                        }else {
                                echo "FALHOU\n";
                        }
                }
        }
        $conn -> close();
//função que realiza a ligação por meio de parâmetros recebidos anteriormente
        function ligacao($arg1, $arg2, $arg3, $arg4, $arg5, $arg6){
                $z = 0;
    //essa variável controla a continuidade. Enquanto "z" for igual a zero, o arquivo     //continuará a ser criado, e ligações continuarão a ser realizadas
                while ($z === 0){
        //criação do arquivo .call que será enviado ao asterisk
                        file_put_contents($arg5."$arg6.call", "Channel: OOH323/0808$arg1@Avaya\n");
                        file_put_contents($arg5."$arg6.call", "WaitTime: 60\n",FILE_APPEND);
                        file_put_contents($arg5."$arg6.call", "set: host=$arg2",FILE_APPEND);
                        file_put_contents($arg5."$arg6.call", "Extension: 10\n",FILE_APPEND);
                        file_put_contents($arg5."$arg6.call", "set: id=$arg3\n",FILE_APPEND);
                        file_put_contents($arg5."$arg6.call", "set: id_evento=$arg4\n",FILE_APPEND);
                        file_put_contents($arg5."$arg6.call", "Context: astnagios\n",FILE_APPEND);
                       //setando as permissões do arquivo call
         shell_exec("chmod 777 ".$arg5."*.call");
        //copiando o arquivo para  pasta Asterisk
                        shell_exec("cp ".$arg5."*.call /astnagios/asterisk/");
        //apagando o arquivo call
                        shell_exec("rm -rf ".$arg5."*.call");
                        shell_exec("rm -rf ".$arg5."hostiden");
                        //variaveis de conexao
                        $servername = "192.168.0X.X";
                        $username = "nagios";
                        $password = "XXXXX";
                        $dbname = "astnagios";
                        //cria conexao
                        $conn = new mysqli($servername, $username, $password, $dbname);
                        //valida conexao
                        if ($conn->connect_error) {
                                die("Connection failed: " . $conn->connect_error);
                        }
                        sleep (60);
    //verificando se alguém atendeu e foi registrado na tabela checados. Se ninguém     //atendeu, ou não  teclou 3, o campo hangup tem valor nulo, e z continuará valendo  //zero, dando continuidade ao laço
                        $sql5 = "select hangup from checados where id_evento=$arg4";
                        $result5 = $conn->query($sql5);
                        while ($row = $result5->fetch_assoc()) {
                                $z = $row["hangup"];
                        }
                }
    //a função retorna o resultado. Caso alguém tenha atendido e teclado 3, z valerá 1, caso    //contrário, continuará valendo zero.
                return $z;
        }

Como se pode facilmente verificar, um arquivo é gerado na pasta /astnagios/asterisk. Esta pasta, na realidade, é um ponto de montagem NFS do servidor Asterisk, que aponta para a pasta /var/spool/asterisk/outgoing.

Página anterior     Próxima página

Páginas do artigo
   1. A descoberta
   2. Mãos à obra
   3. Cadastrando... cadastrando...
   4. Os serviços
   5. Passando tudo para o Nagios
   6. Os hosts críticos - Algo a mais
   7. A definição
   8. Fazendo acontecer
   9. A configuração dos hosts críticos
   10. O banco de dados e a aplicação
   11. Os fontes...
   12. O Asterisk
   13. Mais fontes...
Outros artigos deste autor

Mais sobre terminais leves....

Integrando Nagios com Asterisk

Pequena solução para backup em redes mistas

NagVis - Gestor de mapas pra lá de especial

O software livre na administração pública

Leitura recomendada

LPIC-1 - Guia de Estudos

Implantação de software livre

Semantic Forms no MediaWiki

Apresentando agora o Scientific Linux

GNU Emacs (Intro)

  
Comentários
[1] Comentário enviado por removido em 06/04/2015 - 12:55h

Artigo com bastante informação, muito legal mesmo.
------------------------------------------------------
Keep it Simple, Stupid - UNIX Principle.

[2] Comentário enviado por danniel-lara em 07/04/2015 - 08:34h


Parabéns ótimo artigo

[3] Comentário enviado por Donizetti em 12/04/2015 - 13:01h

Isso sim é o tipo de informação que faz diferença.

[4] Comentário enviado por gnu em 13/04/2015 - 11:53h


Muito obrigado a todos.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts