Made Cisco and Quintum voice attributes configurable per section.

Fixed comments in sample config file.


git-svn-id: http://yate.null.ro/svn/yate/trunk@6083 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
paulc 2016-01-12 13:44:10 +00:00
parent 6e37ea688f
commit c68db49d5d
2 changed files with 52 additions and 49 deletions

View File

@ -28,13 +28,14 @@
; print_attributes: bool: Print returned attributes on debug level ALL ; print_attributes: bool: Print returned attributes on debug level ALL
;print_attributes=false ;print_attributes=false
; cisco_attributes: bool: Set hardcoded attributes in Cisco format ; cisco_format: bool: Add hardcoded attributes in Cisco format
;cisco_attributes=true ;cisco_format=true
; quintum_format: bool: Add hardcoded attributes in Quintum format
;quintum_format=true
; quintum_attributes: bool: Set hardcoded attributes in Quintum format
; NOTE: The Cisco and Quintum attributes can be enabled both at the same time ; NOTE: The Cisco and Quintum attributes can be enabled both at the same time
; and the hardcoded attributes will be added as Cisco and Quintum attributes ; and the hardcoded attributes will be added as Cisco and Quintum attributes
; quintum_attributes=false
[portabill] [portabill]

View File

@ -35,17 +35,6 @@ namespace { // anonymous
#define RADIUS_MAXLEN 4096 #define RADIUS_MAXLEN 4096
enum
{
RadChanStart,
RadChanStop,
RadCallAnswered,
RadCallAuth,
RadCallExecute,
RadCallRinging,
RadUserLogin
};
enum enum
{ {
NoError = 0, NoError = 0,
@ -363,11 +352,15 @@ class RadiusClient : public GenObject
public: public:
RadiusClient() RadiusClient()
: m_socket(0), m_authPort(0), m_acctPort(0), : m_socket(0), m_authPort(0), m_acctPort(0),
m_timeout(2000), m_retries(2) m_timeout(2000), m_retries(2), m_cisco(s_cisco), m_quintum(s_quintum)
{ } { }
virtual ~RadiusClient(); virtual ~RadiusClient();
inline const String& server() const inline const String& server() const
{ return m_server; } { return m_server; }
inline bool addCisco() const
{ return m_cisco; }
inline bool addQuintum() const
{ return m_quintum; }
bool setRadServer(const char* host, int authport, int acctport, const char* secret, int timeoutms = 4000, int retries = 2); bool setRadServer(const char* host, int authport, int acctport, const char* secret, int timeoutms = 4000, int retries = 2);
bool setRadServer(const NamedList& sect); bool setRadServer(const NamedList& sect);
bool addSocket(); bool addSocket();
@ -395,6 +388,7 @@ private:
String m_server,m_secret,m_section; String m_server,m_secret,m_section;
unsigned int m_authPort,m_acctPort; unsigned int m_authPort,m_acctPort;
int m_timeout, m_retries; int m_timeout, m_retries;
bool m_cisco, m_quintum;
DataBlock m_authdata; DataBlock m_authdata;
}; };
@ -410,6 +404,8 @@ protected:
INIT_PLUGIN(RadiusModule); INIT_PLUGIN(RadiusModule);
static const String s_fmtCisco("cisco_format");
static const String s_fmtQuintum("quintum_format");
class AuthHandler : public MessageHandler class AuthHandler : public MessageHandler
{ {
@ -1269,6 +1265,9 @@ bool RadiusClient::prepareAttributes(NamedList& params, bool forAcct, String* us
NamedString* pair = sect->getParam(i2); NamedString* pair = sect->getParam(i2);
if (!pair || pair->null()) if (!pair || pair->null())
continue; continue;
// ignore format control keys
if ((pair->name() == s_fmtCisco) || (pair->name() == s_fmtQuintum))
continue;
// ignore keys like rad_SOMETHING or SOMETHING:SOMETHING // ignore keys like rad_SOMETHING or SOMETHING:SOMETHING
if (pair->name().startsWith("rad_",false) || if (pair->name().startsWith("rad_",false) ||
(pair->name().find(':') >= 0)) (pair->name().find(':') >= 0))
@ -1318,6 +1317,8 @@ bool RadiusClient::prepareAttributes(NamedList& params, bool forAcct, String* us
Debug(&__plugin,DebugInfo,"Using sections [%s] and [%s] for %s", Debug(&__plugin,DebugInfo,"Using sections [%s] and [%s] for %s",
m_section.c_str(),servName.c_str(),forAcct ? "accounting" : "authentication"); m_section.c_str(),servName.c_str(),forAcct ? "accounting" : "authentication");
m_cisco = nasSect->getBoolValue(s_fmtCisco,servSect->getBoolValue(s_fmtCisco,s_cisco));
m_quintum = nasSect->getBoolValue(s_fmtQuintum,servSect->getBoolValue(s_fmtQuintum,s_quintum));
addAttribute("User-Name",username); addAttribute("User-Name",username);
addAttribute("Calling-Station-Id",caller); addAttribute("Calling-Station-Id",caller);
addAttribute("Called-Station-Id",called); addAttribute("Called-Station-Id",called);
@ -1412,9 +1413,9 @@ bool AuthHandler::received(Message& msg)
int sep = address.find(':'); int sep = address.find(':');
if (sep >= 0) if (sep >= 0)
address = address.substr(0,sep); address = address.substr(0,sep);
if (s_cisco) if (radclient.addCisco())
radclient.addAttribute("h323-remote-address",address); radclient.addAttribute("h323-remote-address",address);
if (s_quintum) if (radclient.addQuintum())
radclient.addAttribute("Quintum-h323-remote-address",address); radclient.addAttribute("Quintum-h323-remote-address",address);
String billid = msg.getValue("billid"); String billid = msg.getValue("billid");
if (billid) { if (billid) {
@ -1512,6 +1513,8 @@ bool AcctHandler::received(Message& msg)
RadiusClient radclient; RadiusClient radclient;
if (!radclient.prepareAttributes(msg)) if (!radclient.prepareAttributes(msg))
return false; return false;
bool cisco = msg.getBoolValue(s_fmtCisco,radclient.addCisco());
bool quintum = msg.getBoolValue(s_fmtQuintum,radclient.addQuintum());
// create a Cisco-compatible conference ID // create a Cisco-compatible conference ID
MD5 cid(billid); MD5 cid(billid);
@ -1528,12 +1531,12 @@ bool AcctHandler::received(Message& msg)
radclient.addAttribute("Acct-Session-Id",sid.hexDigest()); radclient.addAttribute("Acct-Session-Id",sid.hexDigest());
radclient.addAttribute("Acct-Status-Type",acctStat); radclient.addAttribute("Acct-Status-Type",acctStat);
if (s_cisco) { if (cisco) {
radclient.addAttribute("h323-call-origin",dir); radclient.addAttribute("h323-call-origin",dir);
radclient.addAttribute("h323-conf-id",confid); radclient.addAttribute("h323-conf-id",confid);
radclient.addAttribute("h323-remote-address",address); radclient.addAttribute("h323-remote-address",address);
} }
if (s_quintum) { if (quintum) {
radclient.addAttribute("Quintum-h323-call-origin",dir); radclient.addAttribute("Quintum-h323-call-origin",dir);
radclient.addAttribute("Quintum-h323-conf-id",confid); radclient.addAttribute("Quintum-h323-conf-id",confid);
radclient.addAttribute("Quintum-h323-remote-address",address); radclient.addAttribute("Quintum-h323-remote-address",address);
@ -1543,51 +1546,50 @@ bool AcctHandler::received(Message& msg)
if (address.null()) if (address.null())
address = s_localAddr.host(); address = s_localAddr.host();
tmp << billid << "@" << address; tmp << billid << "@" << address;
if (s_cisco) if (cisco)
radclient.addAttribute("Cisco-AVPair",tmp); radclient.addAttribute("Cisco-AVPair",tmp);
if (s_quintum) if (quintum)
radclient.addAttribute("Quintum-AVPair",tmp); radclient.addAttribute("Quintum-AVPair",tmp);
double t = msg.getDoubleValue("time"); double t = msg.getDoubleValue("time");
if (cisco || quintum) {
ciscoTime(t,tmp); ciscoTime(t,tmp);
if (s_cisco) if (cisco)
radclient.addAttribute("h323-setup-time",tmp); radclient.addAttribute("h323-setup-time",tmp);
if (s_quintum) if (quintum)
radclient.addAttribute("Quintum-h323-setup-time",tmp); radclient.addAttribute("Quintum-h323-setup-time",tmp);
if (acctStat != Acct_Start) { }
double d = msg.getDoubleValue("duration",-1); double duration = msg.getDoubleValue("duration",-1);
if (d >= 0.0) { double billtime = msg.getDoubleValue("billtime");
double d1 = msg.getDoubleValue("billtime"); if ((cisco || quintum) && (Acct_Start != acctStat) && (duration >= 0.0)) {
if (d1 > 0.0) { if (billtime > 0.0) {
ciscoTime(t+d-d1,tmp); ciscoTime(t+duration-billtime,tmp);
if (s_cisco) if (cisco)
radclient.addAttribute("h323-connect-time",tmp); radclient.addAttribute("h323-connect-time",tmp);
if (s_quintum) if (quintum)
radclient.addAttribute("Quintum-h323-connect-time",tmp); radclient.addAttribute("Quintum-h323-connect-time",tmp);
} }
} }
}
if (acctStat == Acct_Stop) { if (Acct_Stop == acctStat) {
double d = msg.getDoubleValue("duration",-1); if ((cisco || quintum) && (duration >= 0.0)) {
if (d >= 0.0) { ciscoTime(t+duration,tmp);
ciscoTime(t+d,tmp); if (cisco)
if (s_cisco)
radclient.addAttribute("h323-disconnect-time",tmp); radclient.addAttribute("h323-disconnect-time",tmp);
if (s_quintum) if (quintum)
radclient.addAttribute("Quintum-h323-disconnect-time",tmp); radclient.addAttribute("Quintum-h323-disconnect-time",tmp);
} }
radclient.addAttribute("Acct-Session-Time",(int)msg.getDoubleValue("billtime")); radclient.addAttribute("Acct-Session-Time",(int)billtime);
int cause = lookup(msg.getValue("status"),dict_errors,-1,10); int cause = lookup(msg.getValue("status"),dict_errors,-1,10);
if (cause >= 0) if (cause >= 0)
radclient.addAttribute("Acct-Terminate-Cause",cause); radclient.addAttribute("Acct-Terminate-Cause",cause);
String tmp = msg.getValue("reason"); String tmp = msg.getValue("reason");
if (tmp) { if (tmp) {
tmp = "disconnect-text=" + tmp; tmp = "disconnect-text=" + tmp;
if (s_cisco) if (cisco)
radclient.addAttribute("Cisco-AVPair",tmp); radclient.addAttribute("Cisco-AVPair",tmp);
if (s_quintum) if (quintum)
radclient.addAttribute("Quintum-AVPair",tmp); radclient.addAttribute("Quintum-AVPair",tmp);
} }
} }
@ -1655,8 +1657,8 @@ void RadiusModule::initialize()
s_pb_enabled = s_cfg.getBoolValue("portabill","enabled",false); s_pb_enabled = s_cfg.getBoolValue("portabill","enabled",false);
s_pb_parallel = s_cfg.getBoolValue("portabill","parallel",false); s_pb_parallel = s_cfg.getBoolValue("portabill","parallel",false);
s_pb_simplify = s_cfg.getBoolValue("portabill","simplify",false); s_pb_simplify = s_cfg.getBoolValue("portabill","simplify",false);
s_cisco = s_cfg.getBoolValue("general","cisco_format",true); s_cisco = s_cfg.getBoolValue("general",s_fmtCisco,true);
s_quintum = s_cfg.getBoolValue("general","quintum_format",true); s_quintum = s_cfg.getBoolValue("general",s_fmtQuintum,true);
s_pb_stoperror = s_cfg.getValue("portabill","stoperror","busy"); s_pb_stoperror = s_cfg.getValue("portabill","stoperror","busy");
s_pb_maxcall = s_cfg.getValue("portabill","maxcall"); s_pb_maxcall = s_cfg.getValue("portabill","maxcall");
s_cfgMutex.unlock(); s_cfgMutex.unlock();