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

eder souza ederwander em yahoo.com.br
Sexta Dezembro 15 16:32:28 BRST 2006


Obrigado Junior vou testar isso o mais breve possível desculpe a demora para responder mas estava enrolado com uma E1 com sinalização R2 aqui abraço, vou testar e postar os resultados vlw
   
  Eder de Souza
  

 
      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 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! 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

----------------------------------------
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

 __________________________________________________
Fale com seus amigos  de graça com o novo Yahoo! Messenger 
http://br.messenger.yahoo.com/ 
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://listas.asteriskbrasil.org/pipermail/asteriskbrasil/attachments/20061215/2c41513c/attachment-0001.html


Mais detalhes sobre a lista de discussão AsteriskBrasil