[AsteriskBrasil] RES: RES: tabela CDR postgres billing !!!

j u n i o u junior em dssnet.com.br
Quarta Dezembro 13 14:55:25 BRST 2006


Eder... e agora José.!!!?.. hehehe

 

É o seguinte, preferi alterar o logger.c para colocar um TIMESTAMP no
arquivo queue_log no inicio das linhas para facilitar.

Está ai. Exatamente como esta funcionando aqui. O “Motorzinho” que coleta o
queue_log e joga em uma tabela no POSTGRE.

Salve nosso amigo Cláudio Polegato Jr que me ajudou com essa rotina em C.

 

To mandando também o logger.c com a alteração para colocar o timestamp no
inicio de cada linha do queue_log.

 

Att:

Rosilto Junior.

 

Vc precisa criar a tabela no postrgres.. dessa forma..

 

CREATE TABLE "public"."queue_log" (

  "data" TIMESTAMP WITH TIME ZONE NOT NULL, 

  "uid1" VARCHAR(50) NOT NULL, 

  "uid2" VARCHAR(50), 

  "fila" VARCHAR(50), 

  "agente" VARCHAR(50), 

  "evento" VARCHAR(80), 

  "param1" VARCHAR(50), 

  "param2" VARCHAR(50), 

  "param3" VARCHAR(50)

) WITH OIDS;

 

 

Código fonte do “daemon”..

 

---------------------- inicio motor.c -----------------------------------

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <libpq-fe.h>

#include <time.h>

 

/*###########################################################*/

/* Conversor do queue_log para PostgreSQL                    */

/* Data: 20-10-2006                                          */

/* DSS Telecomunicacoes e Informatica                        */

/* Por: junior em dssnet.com.br                                 */

/* Porto Velho - RO                                          */

/*###########################################################*/

 

 

#define MAX_CAMPOS 11

#define DELIMITADOR '|'

char* campos[MAX_CAMPOS];

 

int Preencher_Campos(char *linha)

{

    char *inicio, *delimitador;

    int campo_atual = 0;

    inicio = linha;

    delimitador = strchr(inicio, DELIMITADOR);

       while (delimitador && campo_atual < MAX_CAMPOS-1)

        {

          *delimitador = '\0';

          campos[campo_atual++] = inicio;

          inicio = delimitador + 1;

          delimitador = strchr(inicio, DELIMITADOR);

        }

    campos[campo_atual++] = inicio;

    return campo_atual;

 }

 

/*Objeto de conexão*/

PGconn *conn = NULL;

/*Ponteiro de resultado*/

PGresult *result;

 

int main()

{

/*realiza a conexão*/

conn = PQconnectdb("host=localhost user=asterisk password=asterisk
dbname=asterisk");

 

if(PQstatus(conn) == CONNECTION_OK)

{

printf("Conexão com o banco efetuada com sucesso. ");

}

else

{

printf("Falha na conexão. Erro: %s", PQerrorMessage(conn));

PQfinish(conn);

return -1;

}

 

 

//Delete lixo da tabela...

           result = PQexec(conn, "DELETE FROM queue_log WHERE evento =
'CONFIGRELOAD'");

 

           if(!result)

            { printf("Erro executando query."); }

            else

             { switch(PQresultStatus(result)) 

               {

                 case PGRES_EMPTY_QUERY:

                  printf("Nenhuma alteracao.");

                  break;

                 case PGRES_FATAL_ERROR:

                  printf("Erro na query: %s ",
PQresultErrorMessage(result));

                  break;

                 case PGRES_COMMAND_OK:

                  printf("%s linhas afetadas. ", PQcmdTuples(result));

                  break;

                 default:

                  printf("Query executada sem retorno.");

                  break;

               }

             }

 

 

FILE *arquivo;

char consulta[1024];

char string[1024]; //string onde ficara a linha

int x = 0;

int campos_lidos;

char *delimitador, *inicio;

int aux1;

 

//#define DATE_FORMAT "%Y-%m-%d %T"

//time_t t;

//struct tm tm;

//char date[256];

//time(&t);

//localtime_r(&t, &tm);

//strftime(date, sizeof(date), DATE_FORMAT, &tm);

 

arquivo = fopen("/var/log/asterisk/queue_log", "rt");

while (! feof(arquivo))  

{

while(fgets(string, sizeof(string), arquivo)) //le arquivo

   {  

     delimitador = strchr(string, '\n');

      while (delimitador)

        {

            *delimitador = '\0';

             printf("\n\n\nLinha: %s\n\n", string);

             campos_lidos = Preencher_Campos(string);

             printf("Campos LIDOS: %d\n", campos_lidos);

             int i;

             for (i=0; i<campos_lidos-1; i++)

             printf("Campo %2i: %s\n", i, campos[i]);

           //getchar();

 

           // Sendo a variável "campos_lidos" especificando quantos campos

           // foram encontrados

           // E o vetor "campos" apontando para o início de cada campo

           // desta linha na memória terminados por '\0'

 

           // Aqui é contigo! ;-)

           

           strcpy(consulta,"");

           strcat(consulta,"INSERT INTO queue_log  values ('");

           for (i=0; i< campos_lidos-1; i++)

            {

               strcat(consulta,campos[i]);

               strcat(consulta, "','");

               aux1 = i+1;      

            }

 

            strcat(consulta,campos[aux1]);

            strcat(consulta, "')");

           

           result = PQexec(conn, consulta);

 

           if(!result)

            { printf("Erro executando query."); }

            else

             { switch(PQresultStatus(result)) 

               {

                 case PGRES_EMPTY_QUERY:

                  printf("Nenhuma alteracao.");

                  break;

                 case PGRES_FATAL_ERROR:

                  printf("Erro na query: %s ",
PQresultErrorMessage(result));

                  break;

                 case PGRES_COMMAND_OK:

                  printf("%s linhas afetadas. ", PQcmdTuples(result));

                  break;

                 default:

                  printf("Query executada sem retorno.");

                  break;

               }

           inicio = delimitador + 1;

           delimitador = strchr(inicio, '\n');

        }

 

     x = x+1;

    

   }

}

 

fclose(arquivo); //fecha arquivo

 

/*Libera objeto da query*/

PQclear(result);

}

 

 

/*Verifica se a conexão está aberta e a encerra*/

if(conn != NULL)

PQfinish(conn);

}

 

 

------------------- fim motor.c --------------------------

 

 

 

  _____  

De: asteriskbrasil-bounces em listas.asteriskbrasil.org
[mailto:asteriskbrasil-bounces em listas.asteriskbrasil.org] Em nome de eder
souza
Enviada em: quarta-feira, 13 de dezembro de 2006 09:20
Para: asteriskbrasil em listas.asteriskbrasil.org
Assunto: Re: [AsteriskBrasil] RES: tabela CDR postgres billing !!!

 

Olá Junior 

 

Obrigado pela Dica estou começando a fazer um daemon em C que leia o arquivo
queue_log e coloque os dados que acho interessante dentro de uma tabela do
meu postgres, reparei que neste arquivo nao é mostrado a data e nem a hora
que a fila foi atendida,  mas não vejo isto como um problema posso comparar
o ID da chamada e assim descobrir a data e a hora atraves da tabela CDR que
esta no meu banco vou ter q fazer um join entre as tableas para comparar. 

Dei uma fuçada no histórico e vi uma mensagem sua "PostgreSQL rotina em
C...sugestao" gostaria de saber se aquele fonte que vc postou em C vc já
conseguiu fazer ?  claro se conseguiu poste aqui o fonte para ajudar a
galera e a mim me poupará tempo.

 

 

Obrigado pelas Dicas

 

Eder de Souza



 

Eder!!!

Respondendo a 1 pergunta, vc consegue essa informação no arquivo
/var/log/asterisk/queue_log  nos flags “CONNECT” e “COMPLETECALLER” ou
“COMPLETEAGENT”

No oráculo (voip-info.org) tem maiores detalhes. Sobre os parâmetros\eventos
que o queue_log grava... com ele vc tem “tudo” o que acontece com as
chamadas passadas pela fila,

não precisa(depende do caso)  nem olhar o cdr..

 

No trixbox tem um “daemon” que fica rodando de tempo em tempo e “joga” o
arquivo /var/log/asterisk/queue_log para uma tabela no banco de dados.

Vc pode fazer o seu e consultar direto na tabela..

 

A informação de “por quantos ramais” a ligação passou até ser atendida, no
flag “CONNECT” tem a informação da última posição (na fila) que o chamador
foi atendido.. não sei se ajuda..

 

Att:.

Jr..

 


  _____  


De: asteriskbrasil-bounces em listas.asteriskbrasil.org
[mailto:asteriskbrasil-bounces em listas.asteriskbrasil.org] Em nome de eder
souza
Enviada em: segunda-feira, 11 de dezembro de 2006 22:33
Para: asteriskbrasil em listas.asteriskbrasil.org
Assunto: [AsteriskBrasil] tabela CDR postgres billing !!!

 

Olá lista possuo uma tabela CDR em postgres que faz bilhetagem de todas as
ligações e dentrada e saidas feitas pelo asterisk, tenho uma dúvida possuo
uma fila configurada como eu consigo inserir no meu banco o tempo que uma
ligação de entrada demorou para ser atendida??

 

Existe como saber isso ? se é possivel tbm bilhetar por quais ramais essa
ligação passou antes de ser atendida por algum ramal tem como pessoal ? e
como fazer isso caso for possivel !!!

 

vlw pessoal

 

Eder de Souza

  


  _____  


Yahoo! Search
Música para ver e ouvir: You're
<http://us.rd.yahoo.com/mail/br/tagline/search/video/*http:/br.search.yahoo.
com/search/video?p=james+blunt&ei=UTF-8&cv=g&x=wrt&vm=r&fr=intl-mail-br-b>
Beautiful, do James Blunt

--
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.5.432 / Virus Database: 268.15.16/582 - Release Date: 11/12/2006
16:32

 

--
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.5.432 / Virus Database: 268.15.16/582 - Release Date: 11/12/2006
16:32

----------------------------------------
Estação VoIP 2006
5 e 6 Dezembro
Curitiba PR
http://www.estacaovoip.com.br

_______________________________________________
LIsta de discussões AsteriskBrasil.org
AsteriskBrasil em listas.asteriskbrasil.org
http://listas.asteriskbrasil.org/mailman/listinfo/asteriskbrasil

_______________________________________________
Acesse o wiki AsteriskBrasil.org:
http://www.asteriskbrasil.org

 

  

  _____  

Você quer respostas para suas perguntas? Ou você sabe muito e quer
compartilhar seu conhecimento? Experimente o Yahoo!
<http://us.rd.yahoo.com/mail/br/tagline/answers/*http:/br.answers.yahoo.com/
>  Respostas!

--
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.5.432 / Virus Database: 268.15.16/582 - Release Date: 11/12/2006
16:32

-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://listas.asteriskbrasil.org/pipermail/asteriskbrasil/attachments/20061213/0312feb8/attachment-0001.html
-------------- Próxima Parte ----------
Um anexo não texto foi limpo...
Nome  : logger.c
Tipo  : application/octet-stream
Tam   : 25560 bytes
Descr.: não disponível
Url   : http://listas.asteriskbrasil.org/pipermail/asteriskbrasil/attachments/20061213/0312feb8/logger-0001.obj


Mais detalhes sobre a lista de discussão AsteriskBrasil