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: 22.264 ]

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

O software livre na administração pública

NagVis - Gestor de mapas pra lá de especial

Jogando pesado na segurança de seu SSH

Configurando um domínio pelo serviço ipturbo empresarial (Brasil Telecom)

Pequena solução para backup em redes mistas

Leitura recomendada

A Vida no Shell

Uma pequena análise do Gentoo Linux

Configurando o Stardict com dicionário do Babylon

Visual Studio no Linux

Auditoria de computadores com OPEN-AUDIT

  
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