Remove MySQL support from default Asterisk in accordance with new MySQL library licensing

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1550 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Mark Spencer
2003-09-26 22:03:10 +00:00
parent c514e681e7
commit 9eb75e0e3e
8 changed files with 38 additions and 549 deletions

15
README.mysql Executable file
View File

@@ -0,0 +1,15 @@
MYSQL LICENSING UPDATE
======================
We were recently contacted by MySQL and informed that the MySQL client
libraries are now under GPL license and not LGPL license as before.
Since Asterisk does allow exceptions to GPL, we are removing MySQL support
from standard Asterisk. We will, where appropriate, make it available via
a separate package which will only be usable when Asterisk is used completely
within GPL (i.e. not in conjunction with G.729, OpenH.323, etc). We
apologize for the confusion.
You may find this in the new "asterisk-addons" package.
Mark Spencer
Digium

View File

@@ -13,18 +13,6 @@
USE_MYSQL_VM_INTERFACE=0 USE_MYSQL_VM_INTERFACE=0
MLFLAGS=
ifeq ($(USE_MYSQL_VM_INTERFACE),1)
CFLAGS+=-DUSEMYSQLVM
CFLAGS+=$(shell if [ -d /usr/local/mysql/include ]; then echo "-I/usr/local/mysql/include"; fi)
CFLAGS+=$(shell if [ -d /usr/include/mysql ]; then echo "-I/usr/include/mysql"; fi)
CFLAGS+=$(shell if [ -d /usr/local/include/mysql ]; then echo "-I/usr/local/include/mysql"; fi)
CFLAGS+=$(shell if [ -d /opt/mysql/include/mysql ]; then echo "-I/opt/mysql/include/mysql"; fi)
MLFLAGS+=$(shell if [ -d /usr/lib/mysql ]; then echo "-L/usr/lib/mysql"; fi)
MLFLAGS+=$(shell if [ -d /usr/local/mysql/lib ]; then echo "-L/usr/local/mysql/lib"; fi)
MLFLAGS+=$(shell if [ -d /usr/local/lib/mysql ]; then echo "-L/usr/local/lib/mysql"; fi)
MLFLAGS+=$(shell if [ -d /opt/mysql/lib/mysql ]; then echo "-L/opt/mysql/lib/mysql"; fi)
endif
#APPS=app_dial.so app_playback.so app_directory.so app_intercom.so app_mp3.so #APPS=app_dial.so app_playback.so app_directory.so app_intercom.so app_mp3.so
APPS=app_dial.so app_playback.so app_voicemail.so app_directory.so app_intercom.so app_mp3.so \ APPS=app_dial.so app_playback.so app_voicemail.so app_directory.so app_intercom.so app_mp3.so \

View File

@@ -36,6 +36,10 @@
#include <time.h> #include <time.h>
#ifdef USEMYSQLVM #ifdef USEMYSQLVM
#include <mysql.h> #include <mysql.h>
#include "mysql-vm-routines.h"
#else
static inline int sql_init(void) { return 0; }
static inline void sql_close(void) { }
#endif #endif
#include <pthread.h> #include <pthread.h>
@@ -181,135 +185,7 @@ static void apply_options(struct ast_vm_user *vmu, char *options)
} }
#ifdef USEMYSQLVM #ifndef USEMYSQLVM
MYSQL *dbhandler=NULL;
ast_mutex_t mysqllock;
char dbuser[80];
char dbpass[80];
char dbhost[80];
char dbname[80];
static int mysql_login(void)
{
ast_verbose( VERBOSE_PREFIX_3 "Logging into database with user %s, password %s, and database %s\n", dbuser, dbpass, dbname);
dbhandler=mysql_init(NULL);
if (!mysql_real_connect(dbhandler, dbhost[0] ? dbhost : NULL, dbuser, dbpass, dbname, 0, NULL, 0)) {
ast_log(LOG_WARNING, "Error Logging into database\n");
return(-1);
}
ast_mutex_init(&mysqllock);
return(0);
}
static void mysql_logout(void)
{
mysql_close(dbhandler);
}
static struct ast_vm_user *find_user(struct ast_vm_user *ivm, char *context, char *mailbox)
{
MYSQL_RES *result;
MYSQL_ROW rowval;
MYSQL_FIELD *fields;
int numFields, i;
char query[240];
char options[160] = "";
struct ast_vm_user *retval;
retval=malloc(sizeof(struct ast_vm_user));
if (retval) {
*retval->mailbox='\0';
*retval->context='\0';
*retval->password='\0';
*retval->fullname='\0';
*retval->email='\0';
*retval->pager='\0';
*retval->serveremail='\0';
retval->attach=-1;
retval->alloced=1;
retval->next=NULL;
if (mailbox) {
strcpy(retval->mailbox, mailbox);
}
if (context) {
strcpy(retval->context, context);
}
if (*retval->context) {
sprintf(query, "SELECT password,fullname,email,pager,options FROM users WHERE context='%s' AND mailbox='%s'", context, mailbox);
} else {
sprintf(query, "SELECT password,fullname,email,pager,options FROM users WHERE mailbox='%s'", mailbox);
}
ast_mutex_lock(&mysqllock);
mysql_query(dbhandler, query);
if ((result=mysql_store_result(dbhandler))!=NULL) {
if ((rowval=mysql_fetch_row(result))!=NULL) {
numFields=mysql_num_fields(result);
fields=mysql_fetch_fields(result);
for (i=0; i<numFields; i++) {
if (rowval[i]) {
if (!strcmp(fields[i].name, "password")) {
strcpy(retval->password, rowval[i]);
} else if (!strcmp(fields[i].name, "fullname")) {
strcpy(retval->fullname, rowval[i]);
} else if (!strcmp(fields[i].name, "email")) {
strcpy(retval->email, rowval[i]);
} else if (!strcmp(fields[i].name, "pager")) {
strcpy(retval->pager, rowval[i]);
} else if (!strcmp(fields[i].name, "options")) {
strncpy(options, rowval[i], sizeof(options) - 1);
apply_options(retval, options);
}
}
}
mysql_free_result(result);
ast_mutex_unlock(&mysqllock);
return(retval);
} else {
mysql_free_result(result);
ast_mutex_unlock(&mysqllock);
free(retval);
return(NULL);
}
}
ast_mutex_unlock(&mysqllock);
free(retval);
}
return(NULL);
}
static void vm_change_password(struct ast_vm_user *vmu, char *password)
{
char query[400];
if (*vmu->context) {
sprintf(query, "UPDATE users SET password='%s' WHERE context='%s' AND mailbox='%s' AND password='%s'", password, vmu->context, vmu->mailbox, vmu->password);
} else {
sprintf(query, "UPDATE users SET password='%s' WHERE mailbox='%s' AND password='%s'", password, vmu->mailbox, vmu->password);
}
ast_mutex_lock(&mysqllock);
mysql_query(dbhandler, query);
strcpy(vmu->password, password);
ast_mutex_unlock(&mysqllock);
}
static void reset_user_pw(char *context, char *mailbox, char *password)
{
char query[320];
if (context) {
sprintf(query, "UPDATE users SET password='%s' WHERE context='%s' AND mailbox='%s'", password, context, mailbox);
} else {
sprintf(query, "UPDATE users SET password='%s' WHERE mailbox='%s'", password, mailbox);
}
ast_mutex_lock(&mysqllock);
mysql_query(dbhandler, query);
ast_mutex_unlock(&mysqllock);
}
#else
static struct ast_vm_user *find_user(struct ast_vm_user *ivm, char *context, char *mailbox) static struct ast_vm_user *find_user(struct ast_vm_user *ivm, char *context, char *mailbox)
{ {
/* This function could be made to generate one from a database, too */ /* This function could be made to generate one from a database, too */
@@ -2818,9 +2694,7 @@ int unload_module(void)
STANDARD_HANGUP_LOCALUSERS; STANDARD_HANGUP_LOCALUSERS;
res = ast_unregister_application(app); res = ast_unregister_application(app);
res |= ast_unregister_application(app2); res |= ast_unregister_application(app2);
#ifdef USEMYSQLVM sql_close();
mysql_logout();
#endif
return res; return res;
} }
@@ -2835,11 +2709,8 @@ int load_module(void)
if ((res=load_config())) { if ((res=load_config())) {
return(res); return(res);
} }
#ifdef USEMYSQLVM if ((res = sql_init()))
if ((res=mysql_login())) { return res;
return(res);
}
#endif
return res; return res;
} }

View File

@@ -15,19 +15,6 @@ MODS=cdr_csv.so
CFLAGS+=-fPIC CFLAGS+=-fPIC
#
# MySQL stuff... Autoconf anyone??
#
MODS+=$(shell if [ -d /usr/local/mysql/include ] || [ -d /usr/include/mysql ] || [ -d /usr/local/include/mysql ] || [ -d /opt/mysql/include ]; then echo "cdr_mysql.so"; fi)
CFLAGS+=$(shell if [ -d /usr/local/mysql/include ]; then echo "-I/usr/local/mysql/include"; fi)
CFLAGS+=$(shell if [ -d /usr/include/mysql ]; then echo "-I/usr/include/mysql"; fi)
CFLAGS+=$(shell if [ -d /usr/local/include/mysql ]; then echo "-I/usr/local/include/mysql"; fi)
CFLAGS+=$(shell if [ -d /opt/mysql/include/mysql ]; then echo "-I/opt/mysql/include/mysql"; fi)
MLFLAGS=
MLFLAGS+=$(shell if [ -d /usr/lib/mysql ]; then echo "-L/usr/lib/mysql"; fi)
MLFLAGS+=$(shell if [ -d /usr/local/mysql/lib ]; then echo "-L/usr/local/mysql/lib"; fi)
MLFLAGS+=$(shell if [ -d /usr/local/lib/mysql ]; then echo "-L/usr/local/lib/mysql"; fi)
MLFLAGS+=$(shell if [ -d /opt/mysql/lib/mysql ]; then echo "-L/opt/mysql/lib/mysql"; fi)
all: depend $(MODS) all: depend $(MODS)
@@ -44,9 +31,6 @@ ifneq ($(wildcard .depend),)
include .depend include .depend
endif endif
cdr_mysql.so: cdr_mysql.o
$(CC) -shared -Xlinker -x -o $@ $< -lmysqlclient -lz $(MLFLAGS)
depend: .depend depend: .depend
.depend: .depend:

View File

@@ -1,336 +0,0 @@
/*
* Asterisk -- A telephony toolkit for Linux.
*
* MySQL CDR logger
*
* James Sharp <jsharp@psychoses.org>
*
* Modified August 2003
* Tilghman Lesher <asterisk__cdr__cdr_mysql__200308@the-tilghman.com>
*
* This program is free software, distributed under the terms of
* the GNU General Public License.
*
*/
#include <sys/types.h>
#include <asterisk/config.h>
#include <asterisk/options.h>
#include <asterisk/channel.h>
#include <asterisk/cdr.h>
#include <asterisk/module.h>
#include <asterisk/logger.h>
#include "../asterisk.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <mysql.h>
#include <errmsg.h>
#define DATE_FORMAT "%Y-%m-%d %T"
static char *desc = "MySQL CDR Backend";
static char *name = "mysql";
static char *config = "cdr_mysql.conf";
static char *hostname = NULL, *dbname = NULL, *dbuser = NULL, *password = NULL, *dbsock = NULL;
static int hostname_alloc = 0, dbname_alloc = 0, dbuser_alloc = 0, password_alloc = 0, dbsock_alloc = 0;
static int dbport = 0;
static int connected = 0;
static ast_mutex_t mysql_lock = AST_MUTEX_INITIALIZER;
static MYSQL mysql;
static int mysql_log(struct ast_cdr *cdr)
{
struct tm tm;
struct timeval tv;
char sqlcmd[2048], timestr[128];
time_t t;
ast_mutex_lock(&mysql_lock);
memset(sqlcmd,0,2048);
gettimeofday(&tv,NULL);
t = tv.tv_sec;
localtime_r(&t,&tm);
strftime(timestr,128,DATE_FORMAT,&tm);
if ((!connected) && (hostname || dbsock) && dbuser && password && dbname) {
/* Attempt to connect */
mysql_init(&mysql);
if (mysql_real_connect(&mysql, hostname, dbuser, password, dbname, dbport, dbsock, 0)) {
connected = 1;
} else {
ast_log(LOG_ERROR, "cdr_mysql: cannot connect to database server %s. Call will not be logged\n", hostname);
}
} else {
/* Long connection - ping the server */
int error;
if ((error = mysql_ping(&mysql))) {
connected = 0;
switch (error) {
case CR_SERVER_GONE_ERROR:
ast_log(LOG_ERROR, "cdr_mysql: Server has gone away\n");
break;
default:
ast_log(LOG_ERROR, "cdr_mysql: Unknown connection error\n");
}
}
}
if (connected) {
char *clid=NULL, *dcontext=NULL, *channel=NULL, *dstchannel=NULL, *lastapp=NULL, *lastdata=NULL;
#ifdef MYSQL_LOGUNIQUEID
char *uniqueid=NULL;
#endif
/* Maximum space needed would be if all characters needed to be escaped, plus a trailing NULL */
if ((clid = alloca(strlen(cdr->clid) * 2 + 1)) != NULL)
mysql_real_escape_string(&mysql, clid, cdr->clid, strlen(cdr->clid));
if ((dcontext = alloca(strlen(cdr->dcontext) * 2 + 1)) != NULL)
mysql_real_escape_string(&mysql, dcontext, cdr->dcontext, strlen(cdr->dcontext));
if ((channel = alloca(strlen(cdr->channel) * 2 + 1)) != NULL)
mysql_real_escape_string(&mysql, channel, cdr->channel, strlen(cdr->channel));
if ((dstchannel = alloca(strlen(cdr->dstchannel) * 2 + 1)) != NULL)
mysql_real_escape_string(&mysql, dstchannel, cdr->dstchannel, strlen(cdr->dstchannel));
if ((lastapp = alloca(strlen(cdr->lastapp) * 2 + 1)) != NULL)
mysql_real_escape_string(&mysql, lastapp, cdr->lastapp, strlen(cdr->lastapp));
if ((lastdata = alloca(strlen(cdr->lastdata) * 2 + 1)) != NULL)
mysql_real_escape_string(&mysql, lastdata, cdr->lastdata, strlen(cdr->lastdata));
#ifdef MYSQL_LOGUNIQUEID
if ((uniqueid = alloca(strlen(cdr->uniqueid) * 2 + 1)) != NULL)
mysql_real_escape_string(&mysql, uniqueid, cdr->uniqueid, strlen(cdr->uniqueid));
#endif
/* Check for all alloca failures above at once */
#ifdef MYSQL_LOGUNIQUEID
if ((!clid) || (!dcontext) || (!channel) || (!dstchannel) || (!lastapp) || (!lastdata) || (!uniqueid)) {
#else
if ((!clid) || (!dcontext) || (!channel) || (!dstchannel) || (!lastapp) || (!lastdata)) {
#endif
ast_log(LOG_ERROR, "cdr_mysql: Out of memory error (insert fails)\n");
ast_mutex_unlock(&mysql_lock);
return -1;
}
ast_log(LOG_DEBUG,"cdr_mysql: inserting a CDR record.\n");
#ifdef MYSQL_LOGUNIQUEID
sprintf(sqlcmd,"INSERT INTO cdr (calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,duration,billsec,disposition,amaflags,accountcode,uniqueid) VALUES ('%s','%s','%s','%s','%s', '%s','%s','%s','%s',%i,%i,'%s',%i,'%s','%s')",timestr,clid,cdr->src, cdr->dst, dcontext,channel, dstchannel, lastapp, lastdata,cdr->duration,cdr->billsec,ast_cdr_disp2str(cdr->disposition),cdr->amaflags, cdr->accountcode, uniqueid);
#else
sprintf(sqlcmd,"INSERT INTO cdr (calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,duration,billsec,disposition,amaflags,accountcode) VALUES ('%s','%s','%s','%s','%s', '%s','%s','%s','%s',%i,%i,'%s',%i,'%s')",timestr,clid,cdr->src, cdr->dst, dcontext,channel, dstchannel, lastapp, lastdata,cdr->duration,cdr->billsec,ast_cdr_disp2str(cdr->disposition),cdr->amaflags, cdr->accountcode);
#endif
ast_log(LOG_DEBUG,"cdr_mysql: SQL command as follows: %s\n",sqlcmd);
if (mysql_real_query(&mysql,sqlcmd,strlen(sqlcmd))) {
ast_log(LOG_ERROR,"Failed to insert into database.");
ast_mutex_unlock(&mysql_lock);
return -1;
}
}
ast_mutex_unlock(&mysql_lock);
return 0;
}
char *description(void)
{
return desc;
}
static int my_unload_module(void)
{
if (connected) {
mysql_close(&mysql);
connected = 0;
}
if (hostname && hostname_alloc) {
free(hostname);
hostname = NULL;
hostname_alloc = 0;
}
if (dbname && dbname_alloc) {
free(dbname);
dbname = NULL;
dbname_alloc = 0;
}
if (dbuser && dbuser_alloc) {
free(dbuser);
dbuser = NULL;
dbuser_alloc = 0;
}
if (dbsock && dbsock_alloc) {
free(dbsock);
dbsock = NULL;
dbsock_alloc = 0;
}
if (password && password_alloc) {
free(password);
password = NULL;
password_alloc = 0;
}
dbport = 0;
ast_cdr_unregister(name);
return 0;
}
static int my_load_module(void)
{
int res;
struct ast_config *cfg;
struct ast_variable *var;
char *tmp;
cfg = ast_load(config);
if (!cfg) {
ast_log(LOG_WARNING, "Unable to load config for mysql CDR's: %s\n", config);
return 0;
}
var = ast_variable_browse(cfg, "global");
if (!var) {
/* nothing configured */
return 0;
}
tmp = ast_variable_retrieve(cfg,"global","hostname");
if (tmp) {
hostname = malloc(strlen(tmp) + 1);
if (hostname != NULL) {
hostname_alloc = 1;
strcpy(hostname,tmp);
} else {
ast_log(LOG_ERROR,"Out of memory error.\n");
return -1;
}
} else {
ast_log(LOG_WARNING,"MySQL server hostname not specified. Assuming localhost\n");
hostname = "localhost";
}
tmp = ast_variable_retrieve(cfg,"global","dbname");
if (tmp) {
dbname = malloc(strlen(tmp) + 1);
if (dbname != NULL) {
dbname_alloc = 1;
strcpy(dbname,tmp);
} else {
ast_log(LOG_ERROR,"Out of memory error.\n");
return -1;
}
} else {
ast_log(LOG_WARNING,"MySQL database not specified. Assuming asteriskcdrdb\n");
dbname = "asteriskcdrdb";
}
tmp = ast_variable_retrieve(cfg,"global","user");
if (tmp) {
dbuser = malloc(strlen(tmp) + 1);
if (dbuser != NULL) {
dbuser_alloc = 1;
strcpy(dbuser,tmp);
} else {
ast_log(LOG_ERROR,"Out of memory error.\n");
return -1;
}
} else {
ast_log(LOG_WARNING,"MySQL database user not specified. Assuming root\n");
dbuser = "root";
}
tmp = ast_variable_retrieve(cfg,"global","sock");
if (tmp) {
dbsock = malloc(strlen(tmp) + 1);
if (dbsock != NULL) {
dbsock_alloc = 1;
strcpy(dbsock,tmp);
} else {
ast_log(LOG_ERROR,"Out of memory error.\n");
return -1;
}
} else {
ast_log(LOG_WARNING,"MySQL database sock file not specified. Using default\n");
dbsock = NULL;
}
tmp = ast_variable_retrieve(cfg,"global","password");
if (tmp) {
password = malloc(strlen(tmp) + 1);
if (password != NULL) {
password_alloc = 1;
strcpy(password,tmp);
} else {
ast_log(LOG_ERROR,"Out of memory error.\n");
return -1;
}
} else {
ast_log(LOG_WARNING,"MySQL database password not specified. Assuming blank\n");
password = "";
}
tmp = ast_variable_retrieve(cfg,"global","port");
if (tmp) {
if (sscanf(tmp,"%d",&dbport) < 1) {
ast_log(LOG_WARNING,"Invalid MySQL port number. Using default\n");
dbport = 0;
}
}
ast_destroy(cfg);
ast_log(LOG_DEBUG,"cdr_mysql: got hostname of %s\n",hostname);
ast_log(LOG_DEBUG,"cdr_mysql: got port of %d\n",dbport);
if (dbsock)
ast_log(LOG_DEBUG,"cdr_mysql: got sock file of %s\n",dbsock);
ast_log(LOG_DEBUG,"cdr_mysql: got user of %s\n",dbuser);
ast_log(LOG_DEBUG,"cdr_mysql: got dbname of %s\n",dbname);
ast_log(LOG_DEBUG,"cdr_mysql: got password of %s\n",password);
mysql_init(&mysql);
if (!mysql_real_connect(&mysql, hostname, dbuser, password, dbname, dbport, dbsock, 0)) {
ast_log(LOG_ERROR, "Failed to connect to mysql database %s on %s.\n", dbname, hostname);
connected = 0;
} else {
ast_log(LOG_DEBUG,"Successfully connected to MySQL database.\n");
connected = 1;
}
res = ast_cdr_register(name, desc, mysql_log);
if (res) {
ast_log(LOG_ERROR, "Unable to register MySQL CDR handling\n");
}
return res;
}
int load_module(void)
{
return my_load_module();
}
int unload_module(void)
{
return my_unload_module();
}
int reload(void)
{
my_unload_module();
return my_load_module();
}
int usecount(void)
{
return connected;
}
char *key()
{
return ASTERISK_GPL_KEY;
}

View File

@@ -1,19 +0,0 @@
;
; 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=database.host.name
;dbname=asteriskcdrdb
;password=password
;user=asteriskcdruser
;port=3306
;sock=/tmp/mysql.sock

15
doc/README.mysql Executable file
View File

@@ -0,0 +1,15 @@
MYSQL LICENSING UPDATE
======================
We were recently contacted by MySQL and informed that the MySQL client
libraries are now under GPL license and not LGPL license as before.
Since Asterisk does allow exceptions to GPL, we are removing MySQL support
from standard Asterisk. We will, where appropriate, make it available via
a separate package which will only be usable when Asterisk is used completely
within GPL (i.e. not in conjunction with G.729, OpenH.323, etc). We
apologize for the confusion.
You may find this in the new "asterisk-addons" package.
Mark Spencer
Digium

View File

@@ -1,29 +0,0 @@
Call Detail Recording for MySQL
===============================
Usage:
======
Include the module in your modules.conf. Change the database hostname, database name, username, and password in cdr_mysql.conf.
Create a table called cdr under the database name you will be using the following schema.
CREATE TABLE cdr (
calldate datetime NOT NULL default '0000-00-00 00:00:00',
clid varchar(45) NOT NULL default '',
src varchar(45) NOT NULL default '',
dst varchar(45) NOT NULL default '',
dcontext varchar(45) NOT NULL default '',
channel varchar(45) NOT NULL default '',
dstchannel varchar(45) NOT NULL default '',
lastapp varchar(45) NOT NULL default '',
lastdata varchar(45) 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(45) NOT NULL default '',
uniqueid varchar(45) NOT NULL default ''
);
The calls will automatically be logged as long as the module is loaded.