Asterisk gravando ligações no MySQL

Para gravar os dados na tabela cdr do banco de dados MySQL , é preciso ajustar alguns parâmetros no Asterisk.

Instalação do Banco MySQL

Para instalar o MySQL, basta usar o comando abaixo.

 apt-get install mysql-server-5.0

Criação do usuário e strutura

Após instalar o Banco MySQL, entrar com o usuário root e executar o script abaixo.

 CREATE DATABASE asteriskcdrdb; 

 GRANT INSERT 
  ON asteriskcdrdb.* 
  TO asteriskcdruser@localhost 
  IDENTIFIED BY 'yourpassword'; 

 USE asteriskcdrdb; 

 CREATE TABLE cdr ( 
 `id` bigint NOT NULL auto_increment PRIMARY KEY,
 `calldate` datetime NOT NULL default '0000-00-00 00:00:00', 
 `clid` varchar(80) NOT NULL default '', 
 `src` varchar(80) NOT NULL default '', 
 `dst` varchar(80) NOT NULL default '', 
 `dcontext` varchar(80) NOT NULL default '',  
 `channel` varchar(80) NOT NULL default '', 
 `dstchannel` varchar(80) NOT NULL default '', 
 `lastapp` varchar(80) NOT NULL default '', 
 `lastdata` varchar(80) NOT NULL default '', 
 `duration` int(11) NOT NULL default '0', 
 `billsec` int(11) NOT NULL default '0', 
 `disposition` varchar(45) NOT NULL default '',  
 `amaflags` int(11) NOT NULL default '0', 
 `accountcode` varchar(20) NOT NULL default '', 
 `userfield` varchar(255) NOT NULL default '',
 `enviado`char(1) NOT NULL default 'N'
 ) ENGINE = innodb; 

 ALTER TABLE `cdr` ADD INDEX ( `calldate` ); 
 ALTER TABLE `cdr` ADD INDEX ( `dst` );

Ajustar o cdr_mysql.conf

Criar um arquivo de configuração informando a senha do Banco MySQL.
Exemplo: /etc/asterisk/cdr_mysql.conf

 ; 
 ; Note - if the database server is hosted on the same machine as the 
 ; asterisk server, you can achieve a local Unix socket connection by 
 ; setting hostname=localhost 
 ; 
 ; port and sock are both optional parameters.  If hostname is specified 
 ; and is not "localhost", then cdr_mysql will attempt to connect to the 
 ; port specified or use the default port.  If hostname is not specified 
 ; or if hostname is "localhost", then cdr_mysql will attempt to connect 
 ; to the socket file specified by sock or otherwise use the default socket 
 ; file. 
 ; 
 [global] 
  hostname=localhost 
  dbname=asteriskcdrdb 
  password=yourpassword 
  user=asteriskcdruser 
  ;port=3306 
  ;sock=/tmp/mysql.sock 
  ;userfield=1

Ajustar o modules.conf

Editar o /etc/asterisk/modules.conf e acrescentar

 load cdr_addon_mysql.so

e reinicializar o asterisk para carregar o módulo.

Verificando a implenetação

Entre no asterisk com asterisk -r e dê um restart now .

Entre novamente, e verifique:

asterisk*CLI> cdr mysql status
Connected to asteriskcdrdb@localhost, port 3306 using table cdr for 8 seconds.
Wrote 0 records since last restart.
asterisk*CLI>

Pronto, seu asterisk já está gravando o CDR em MySQL.

Obs: se voce for compilar o asterisk, lembre-se se acrescentar o “add on” e a biblioteca do MySQL (libmysqlclient15-dev).

BillVOIP – Tarifador Ligações VOIP – Asterisk

O sistema consiste em ler a tabela “cdr”, do banco de dados MySQL, na maquina onde está instalado o Asterisk e trazer as ligações para o servidor central onde serão tarifadas conforme regras pre-estabelecidas.

  • Conceder poderes para o usuario ler a tabela ‘cdr’ remotamente;

grant all on asteriskcdrdb.cdr to ‘cdr’@’%’ identified by ‘senha’;

flush privileges;

  • Alterar a tabela ‘cdr’ para conter mais dois campos;

alter table asteriskcdrdb.cdr add column enviado char(1) not null default ‘N’;
alter table asteriskcdrdb.cdr add column id bigint(20) NOT NULL auto_increment, add primary key (id);

Recuperar senha root MySQL

Há uns dias atrás me deparei com um problema um tanto quanto chato: perda de senha do MySQL.

Para recuperar a senha sera necessario entrar no banco sem validar a tabela de usuarios.

# sudo /etc/init.d/mysql stop

Agora inicie o MySQL em modo seguro (safe mode):

# mysqld_safe –skip-grant-tables &

Agora conecte-se ao servidor MySQL usando o cliente do mysql:

# mysql

Após conectar-se ao servidor MySQL, acesse o banco MySQL, digitando:

> use mysql;

Agora vamos definir a nova senha para o usuário root do MySQL:

> update user set password = password(‘ nova senha’) where user=’root’ and host=’localhost’;
> flush privileges;

Agora você poder sair do cliente do MySQL, digite:

> quit

Agora vamos desligar o modo de segurança do MySQL, execute:

# /etc/init.d/mysqld stop

E enfim, vamos iniciar o MySQL com a nova senha de root:

# /etc/init.d/mysqld start

Pronto !

UTF-8 como PHP e MySQL

Retirado de Surreal Art Web

Percebi que os sites da grande e poderosa Google, e outros também grandes como YAHOO! trabalham com a codificação UTF-8, mas pensei com meus botões… Porque?
Descobri que o UTF-8 tem o maior suporte a caracteres em relação aos outros, até porque trabalha de uma forma binária.
Então mandei logo o famoso:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Resultado? Ainda tive problemas.

Então fui pesquisar novamente e descobri a saída.

Pensei em passar absolutamente tudo para UTF-8. Mas a pergunta era… O que é este tudo?

Aprendi que os sistemas de arquivos dos sistemas operacionais trabalham também com codificação. Ubuntu em ext3 por exemplo também trabalha com o UTF-8.

Ou seja, quando criamos um arquivo, ele é criado com o charset padrão do sistema. O Windows possui um próprio, então achei uma opção interessante no notepad++, converter para utf-8 (SEM BOM) (Formatar > Converter para UTF-8 (SEM BOM), então ele irá salvar o arquivo na codificação UTF-8. 🙂
Simples, o arquivo já está em UTF-8 e o que faço no PHP?
Insiro no inicio da página esse cabeçalho:

header(‘Content-type: text/html; charset=”utf-8″‘,true);

Mas somente isso não basta, as tabelas do banco de dados também devem estar em UTF-8, crie o banco de dados em utf8_bin, e verá que todas as tabelas que não forem definidas um charset e um collation, irão automaticamente ficar com utf8_bin nos campos de texto.
Mas não para por ai, ainda tem que definir a codificação da conexão com o banco de dados.

Se você usa uma conexão simples, um mysql_set_charset(’utf8′) funciona, no caso de quem usa mysqli (como eu), você irá iniciar sua variável $mysqli e observar o seguinte objeto: $mysqli->set_charset(’utf8′)

Meu arquivo de conexão ficou assim:

<?
# Efetuando a conexão com o banco de dados
$mysqli= new mysqli(’localhost’, ‘root’, ’senha’,'nome_banco’);
# Selecionando charset de conexão
$mysqli->set_charset(’utf8′);
?>

Bom, para simplificar verifique sempre os passos seguintes:

1. Charset e collation do banco de dados e das tabelas que nele contém
2. Charset de conexão com o banco de dados
3. Arquivos sempre codificados em UTF-8 (dica é usar o notepad++ ou uma IDE como o Zend)
4. Enviar os cabeçalhos via HTML
5. Enviar os cabeçalhos também via PHP

E claro, não menos importante, verifique como está o seu arquivo .sql que irá importar para o banco de dados, ele também deve estar em utf-8.

Bom, é isso ai, desculpem talvez algum erro de português ou se não foi “entendível” o suficiente, mas estou postando as 1:26am, hehe, vejo muitas pessoas com esse problema de codificação, então decidi escrever sobre minhas experiências com elas.

Recuperar Backup MySQL

Referencia: Guia do Hardware

A forma mais simples de fazer backup do mysql é gravar todos os arquivos no /var/lib/mysql.

sudo /etc/init.d/mysql stop
tar -zcvf mysql.tar.gz /var/lib/mysql/
/etc/init.d/mysql start
fazer o mesmo para o /var/log/mysql

Para recuperar tomar alguns cuidados:

Apos recuperar os arquivos de /var/lib/mysql, usar o chown -R mysql:mysql.

Apos recuperar os arquivos de /var/log/mysql, usar o chown -R mysql:adm

Garantir acesso ao debian-sys-maint com: GRANT ALL PRIVILEGES ON *.* TO ‘debian-sys-maint’@’localhost’ IDENTIFIED BY ‘xxx’, obtida no arquivo /etc/mysql/debian.cnf

Se mudar a versão do Mysql a unica forma e gerar um backup completo em SQL e depois recuperar na nova versão.

# mysqldump –add-drop-table -u root -p -x -e -A > backup.sql

O “-u root -p” especifica o usuário que será usado para acessar o banco de dados. A opção “-x” trava as bases de dados no momento em que cada uma é copiada, evitando qualquer problema de inconsistência, enquanto a “-e” é uma opção de otimização, que permite ao mysqldump combinar argumentos INSERT dentro das tabelas, o que torna tanto o backup quanto a restauração mais rápidos. Finalizando, a opção “-A” especifica um backup completo, de todas as bases de dados.

A opção “–add-drop-table” faz com que ele inclua instruções para que as bases sejam excluídas e recriadas automaticamente durante a restauração, evitando que você precise fazê-lo manualmente.

O backup pode ser então restaurado diretamente usando o comando abaixo:

# mysql -u root -p < backup.sql