[OpenSIPS-Users] Runtime avp substitution
Paul Smith
Paul.Smith at ClarityTele.com
Mon Sep 27 17:18:27 CEST 2010
Hi Bogdan,
Thanks for the help ... I am running on a debian lenny system and do not
have fnmatch()
# man fnmatch
No manual entry for fnmatch
# apt-get install fnmatch
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Couldn't find package fnmatch
# man 3 fnmatch
No manual entry for fnmatch in section 3
# apt-cache search fnmatch
#
do you know what package I need to install?
Thanks,
Paul.
Bogdan-Andrei Iancu wrote:
> Hi Paul,
>
> yes, one approach will be to get rid of the regexp matching and to try
> something different (like substring matching). Runtime regexps are not
> implemented in script as they are very time consuming - actually you
> need first to compile the regexp and than to check it - and this for
> each SIP message going through your script.
>
> Some pattern based matching, much lighter, is FM based in avpops (see
> http://www.opensips.org/html/docs/modules/1.6.x/avpops.html#id271322 and
> "man fnmatch").
>
> Of course, if there is a need and if performance penalties are not a big
> issue, it is simple to implement runtime regexps....
>
> Regards,
> Bogdan
>
> PS: I strongly advice you not to use REGEXP in mysql as it is
> performance killer for DB.
>
>
>
>
> Paul Smith wrote:
>
>> OK I have a working solution now... code still needs tidying up and
>> optimizing but I'll post it here in case anyone comes looking for this
>> in the future.
>>
>> The significant bit is that avp_db_query() can run any MYSQL SELECT
>> query, and there is a REGEXP() funtion in mysql allowing you to test
>> regular expressions.
>> So now I have a user specific regular expression stored in the
>> subscriber table column 'expcallerid', and test the P-Preferred-Identity
>> ($pU) against that regular expression at run time.. if the test fails
>> then $avp(s:callerid) remains set to $avp(s:defcallerid).
>>
>> if($(rU{s.substr,0,3})=="141") {
>> # 141 prefix in UK or Ireland signifies that the user
>> wants to block callerid presentation for this call
>> #check for 141 prefix on number, if set then strip it
>> and set s:CLIR before checking aliases or dial plan
>> xlog("stripping 141");
>> #strip 141
>> $rU=$(rU{s.substr,3,0});
>> xlog("dialling $rU");
>> $avp(s:clir)=1;
>> }
>> if($pU=="Anonymous") {
>> $avp(s:clir)=1;
>> }
>>
>>
>> xlog("dialled number = $rU");
>> xlog("callerid barring requested by device = $avp(s:clir)");
>> xlog("callerid set by device = $pU");
>> xlog("callerid expression for this user = $avp(s:expcallerid)");
>> xlog("default callerid for this user = $avp(s:defcallerid)");
>>
>> $avp(s:callerid)=$avp(s:defcallerid);
>> $avp(s:preferredcallerid)=$pU;
>> if($avp(s:clir)){
>> # user has restricted callerid
>> $avp(s:callerid)="Anonymous";
>> } else if($pU)) {
>> # UAC device has set preferred callerid
>> # test P-Preferred-Identity against user regualr
>> expression held in expcallerid column of subscriber table
>> avp_db_query("select '$avp(s:preferredcallerid)' from
>> subscriber where username='$fU' and domain='$fd' and '\$pU' REGEXP
>> expcallerid","$avp(s:callerid)");
>> xlog("preferred callerid $pU tested, using callerid:
>> $avp(s:callerid)");
>>
>> }
>>
>> xlog("callerid now set to $avp(s:callerid)");
>>
>>
>> Thanks for the hint that there was a way Bogdan... is there a better way?
>> Paul.
>>
>>
>>
>>
>>
>> Paul Smith wrote:
>>
>>
>>> Hi Bodgan,
>>> Mainly matching, to allow me to verify that a customer owns the CLI he
>>> is presenting.
>>>
>>> Ideally I was thinking substitution as I can then add as well in one
>>> operation.. but I can do that as 2 separate operations.
>>>
>>> So... how can I do a dynamic match using an account specific pattern?
>>>
>>> pseudo code would be:
>>> if $(preferred cli) matches $(customer regexp from database) {
>>> $callerid=$(customer cli prefix) + $(preferred cli)
>>> }
>>> else {
>>> $callerid=$(customer default cli)
>>> }
>>>
>>> The bit I am struggling with is the operation to match a dynamic variable.
>>>
>>> Thanks
>>> Paul
>>>
>>> Bogdan-Andrei Iancu wrote:
>>>
>>>
>>>> Hi Paul,
>>>>
>>>> you need a substitution, replacement or simply matching ?
>>>>
>>>> Regards,
>>>> Bogdan
>>>>
>>>> Paul Smith wrote:
>>>>
>>>>
>>>>
>>>>> Hi Bogdan,
>>>>> Thanks for the reply. I am using dialplan module for mangling the
>>>>> dialled number to local valid service codes and e164 destinations.
>>>>>
>>>>> I was hoping to use a simple field in the usr_preferences or
>>>>> substitution table to hold a substitution pattern for each user's
>>>>> verified callerid (P-Preferred-Identity) ranges.
>>>>>
>>>>> I'll have to have a think about how to use dialplan to do this, and
>>>>> still keep my simple user provisioning gui...
>>>>>
>>>>>
>>>>>
>>>>> *Paul Smith | Technical Director | Clarity Telecom*
>>>>> Number One, Lanyon Quay, Belfast, BT1 3LG
>>>>> Phone: 0800 91 21 000 | 1800 855 111
>>>>> FAX: 0800 91 21 999 | 1800 855 112
>>>>> Email: Paul.Smith at ClarityTele.com
>>>>> Web: http://www.ClarityTele.com
>>>>>
>>>>>
>>>>>
>>>>> Bogdan-Andrei Iancu wrote:
>>>>>
>>>>>
>>>>>
>>>>>> Hi Paul,
>>>>>>
>>>>>> have you looked at dialplan module ?
>>>>>> http://www.opensips.org/html/docs/modules/1.6.x/dialplan.html
>>>>>>
>>>>>> The subst-like funcs in script do not support dynamic patterns..
>>>>>>
>>>>>> Regards,
>>>>>> Bogdan
>>>>>>
>>>>>> Paul Smith wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>> How can I do a regular expression substitution on an avp where the
>>>>>>> pattern is loaded from the user subsrciption or usr_preference table?
>>>>>>>
>>>>>>> For example I need to limit callerid presented to a pre-determined range
>>>>>>> owned by my customer, and perform substitution eg add a prefix. If a
>>>>>>> UAC sets P-Preferred-identify to 1234 and I have a usr_preference to
>>>>>>> match any 4 digit caller starting with 1, and prefix with 789 then
>>>>>>> callerid should be set to 7891234
>>>>>>>
>>>>>>> I have in mind something like:
>>>>>>>
>>>>>>> In my database I set the expression for $avp(s:expcallerid) for this
>>>>>>> user to "/1.{3}/789\1/i"
>>>>>>> then in my dialplan I want to match and substitute the
>>>>>>> Preferred-Identity to form the $avp(s:callerid) and then set
>>>>>>> P-Asserted-Identity
>>>>>>>
>>>>>>> xlog("dialled number = $rU");
>>>>>>> xlog("callerid barring requested by device = $avp(s:clir)");
>>>>>>> xlog("callerid preferred set by device = $pU");
>>>>>>> xlog("callerid expression for this user = $avp(s:expcallerid)");
>>>>>>> xlog("default callerid for this user = $avp(s:defcallerid)");
>>>>>>>
>>>>>>> $avp(s:callerid)=$avp(s:defcallerid);
>>>>>>> if($avp(s:clir)){
>>>>>>> # user has restricted callerid
>>>>>>> $avp(s:callerid)="Anonymous";
>>>>>>> } else if($pU) {
>>>>>>> # UAC device has set preferred callerid
>>>>>>> $avp(s:callerid)=pU;
>>>>>>> if(avp_subst("$avp(s:callerid)",$avp(s:expcallerid)) ){
>>>>>>> xlog("preferred callerid matched callerid expression");
>>>>>>> } else {
>>>>>>> xlog("preferred callerid rejected, using default");
>>>>>>> $avp(s:callerid)=$avp(s:defcallerid);
>>>>>>> }
>>>>>>> } else {
>>>>>>> #use default callerid
>>>>>>> $avp(s:callerid)=$avp(s:defcallerid);
>>>>>>> }
>>>>>>>
>>>>>>> I get the error
>>>>>>> Sep 22 12:30:21 [6253] CRITICAL:core:yyerror: parse error in config
>>>>>>> file, line 518, column 44-45: bad arguments for command <avp_subst>
>>>>>>>
>>>>>>> which I think means that avp_subst is expecting a static regular
>>>>>>> expression in the script, whereas I want a user variable as the regular
>>>>>>> expression.
>>>>>>>
>>>>>>> Is there another way to look at the problem? Have I missed something
>>>>>>> obvious (again)?
>>>>>>>
>>>>>>> Thanks
>>>>>>> Paul
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> Users mailing list
>>>>>>> Users at lists.opensips.org
>>>>>>> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>> ------------------------------------------------------------------------
>>>>>
>>>>> _______________________________________________
>>>>> Users mailing list
>>>>> Users at lists.opensips.org
>>>>> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>> ------------------------------------------------------------------------
>>>
>>> _______________________________________________
>>> Users mailing list
>>> Users at lists.opensips.org
>>> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>>>
>>>
>>>
>> _______________________________________________
>> Users mailing list
>> Users at lists.opensips.org
>> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>>
>>
>>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.opensips.org/pipermail/users/attachments/20100927/242f6a83/attachment.htm
More information about the Users
mailing list