- moved Call Logging functionality to it's own plugin.

This commit is contained in:
Thomas Ries 2008-02-02 20:08:48 +00:00
parent 9b4162b81b
commit e8b2346781
8 changed files with 151 additions and 63 deletions

View File

@ -1,5 +1,7 @@
0.7.1
=====
02-Feb-2008: - More work on new plugin API.
- moved Call Logging functionality to it's own plugin.
22-Jan-2008: - closing </chapter> tag missing in docu
21-Jan-2008: - new plugin API (dynamically loadable plugins)

View File

@ -2,7 +2,18 @@ Release Notes for siproxd-0.7.1
===============================
Major changes since 0.7.0:
-
- Plugin API
Upgrade Notes 0.7.0 to 0.7.1:
With the new plugin API, some configurations have changed in
configuration file.
- plugin_shortdial: configuration options have been renamed
pi_shortdial_akey -> plugin_shortdial_akey
pi_shortdial_entry -> plugin_shortdial_entry
- Call logging: The log_calls directive does no longer exist.
You load plugin_logcall and get logging. You don't load it
and don't get logging to syslog.
General Overview:
- SIP (RFC3261) Proxy for SIP based softphones hidden behind a

View File

@ -74,11 +74,6 @@ daemonize = 1
# see what siproxd is doing - or NOT doing)
silence_log = 1
######################################################################
# Shall I log call establishment to syslog?
#
log_calls = 1
######################################################################
# Secure Enviroment settings:
# user: uid/gid to switch to after startup
@ -295,6 +290,7 @@ plugindir=/home/hb9xar/src/siproxd/src/.libs/
# List of plugins to load
#load_plugin=plugin_demo.so
load_plugin=plugin_shortdial.so
load_plugin=plugin_logcall.so
######################################################################

View File

@ -39,13 +39,17 @@ siproxd_SOURCES = siproxd.c proxy.c register.c sock.c utils.c \
# Plugin modules, installed in "pkglib" directory ($prefix/lib/siproxd/)
#
pkglib_LTLIBRARIES = plugin_demo.la \
plugin_shortdial.la
plugin_shortdial.la \
plugin_logcall.la
#
plugin_demo_la_SOURCES = plugin_demo.c
plugin_demo_la_LDFLAGS = -module
#
plugin_shortdial_la_SOURCES = plugin_shortdial.c
plugin_shortdial_la_LDFLAGS = -module
#
plugin_logcall_la_SOURCES = plugin_logcall.c
plugin_logcall_la_LDFLAGS = -module
#

131
src/plugin_logcall.c Normal file
View File

@ -0,0 +1,131 @@
/*
Copyright (C) 2008 Thomas Ries <tries@gmx.net>
This file is part of Siproxd.
Siproxd is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Siproxd is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warrantry of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Siproxd; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "config.h"
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <osipparser2/osip_parser.h>
#include "siproxd.h"
#include "plugins.h"
#include "log.h"
static char const ident[]="$Id$";
/* Plug-in identification */
static char name[]="plugin_logcall";
static char desc[]="Logs calls to syslog";
/* global configuration storage - required for config file location */
extern struct siproxd_config configuration;
/*
* Initialization.
* Called once suring siproxd startup.
*/
int plugin_init(plugin_def_t *plugin_def) {
/* API version number of siproxd that this plugin is built against.
* This constant will change whenever changes to the API are made
* that require adaptions in the plugin. */
plugin_def->api_version=SIPROXD_API_VERSION;
/* Name and descriptive text of the plugin */
plugin_def->name=name;
plugin_def->desc=desc;
/* Execution mask - during what stages of SIP processing shall
* the plugin be called. */
plugin_def->exe_mask=PLUGIN_PRE_PROXY;
return STS_SUCCESS;
}
/*
* Processing.
*
*/
int plugin_process(int stage, sip_ticket_t *ticket){
osip_message_t *request;
osip_uri_t *from_url = NULL;
osip_uri_t *to_url = NULL;
char *to_username =NULL;
char *to_host = NULL;
char *from_username =NULL;
char *from_host = NULL;
char *call_type = NULL;
request=ticket->sipmsg;
/* From: 1st preference is From header, then try contact header */
if (request->from->url) {
from_url = request->from->url;
} else {
from_url = (osip_uri_t *)osip_list_get(&(request->contacts), 0);
}
to_url = request->to->url;
if (to_url) {
to_username = to_url->username;
to_host = to_url->host;
}
if (from_url) {
from_username = from_url->username;
from_host = from_url->host;
}
/* INVITE */
if (MSG_IS_INVITE(request)) {
if (ticket->direction==REQTYP_INCOMING) call_type="Incoming";
else call_type="Outgoing";
/* BYE / CANCEL */
} else if (MSG_IS_ACK(request)) {
call_type="ACK";
} else if (MSG_IS_BYE(request) || MSG_IS_CANCEL(request)) {
call_type="Ending";
}
if (call_type) {
INFO("%s Call: %s@%s -> %s@%s",
call_type,
from_username ? from_username: "*NULL*",
from_host ? from_host : "*NULL*",
to_username ? to_username : "*NULL*",
to_host ? to_host : "*NULL*");
}
return STS_SUCCESS;
}
/*
* De-Initialization.
* Called during shutdown of siproxd. Gives the plugin the chance
* to clean up its mess (e.g. dynamic memory allocation, database
* connections, whatever the plugin messes around with)
*/
int plugin_end(plugin_def_t *plugin_def){
return STS_SUCCESS;
}

View File

@ -111,60 +111,6 @@ int proxy_request (sip_ticket_t *ticket) {
/*&&&& PLUGIN_PRE_PROXY */
call_plugins(PLUGIN_PRE_PROXY, ticket);
/*
* logging of passing calls
*/
/*&&&& this should be moved to its own logging plugin */
if (configuration.log_calls) {
osip_uri_t *from_url = NULL;
osip_uri_t *to_url = NULL;
char *to_username =NULL;
char *to_host = NULL;
char *from_username =NULL;
char *from_host = NULL;
char *call_type = NULL;
/* From: 1st preference is From header, then try contact header */
if (request->from->url) {
from_url = request->from->url;
} else {
from_url = (osip_uri_t *)osip_list_get(&(request->contacts), 0);
}
to_url = request->to->url;
if (to_url) {
to_username = to_url->username;
to_host = to_url->host;
}
if (from_url) {
from_username = from_url->username;
from_host = from_url->host;
}
/* INVITE */
if (MSG_IS_INVITE(request)) {
if (type==REQTYP_INCOMING) call_type="Incoming";
else call_type="Outgoing";
/* BYE / CANCEL */
} else if (MSG_IS_ACK(request)) {
call_type="ACK";
} else if (MSG_IS_BYE(request) || MSG_IS_CANCEL(request)) {
call_type="Ending";
}
if (call_type) {
INFO("%s Call: %s@%s -> %s@%s",
call_type,
from_username ? from_username: "*NULL*",
from_host ? from_host : "*NULL*",
to_username ? to_username : "*NULL*",
to_host ? to_host : "*NULL*");
}
} /* log_calls */
/*
* RFC 3261, Section 16.6 step 1

View File

@ -78,7 +78,6 @@ static cfgopts_t main_cfg_opts[] = {
{ "outbound_domain_host",TYP_STRINGA,&configuration.outbound_proxy_domain_host },
{ "outbound_domain_port",TYP_STRINGA,&configuration.outbound_proxy_domain_port },
{ "registration_file", TYP_STRING, &configuration.registrationfile },
{ "log_calls", TYP_INT4, &configuration.log_calls },
{ "pid_file", TYP_STRING, &configuration.pid_file },
{ "default_expires", TYP_INT4, &configuration.default_expires },
{ "autosave_registrations",TYP_INT4, &configuration.autosave_registrations },

View File

@ -91,7 +91,6 @@ struct siproxd_config {
stringa_t outbound_proxy_domain_host;
stringa_t outbound_proxy_domain_port;
char *registrationfile;
int log_calls;
char *pid_file;
int default_expires;
int autosave_registrations;