[OpenSIPS-Users] Runtime avp substitution

Bogdan-Andrei Iancu bogdan at voice-system.ro
Mon Sep 27 17:01:11 CEST 2010


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
>
>   


-- 
Bogdan-Andrei Iancu
OpenSIPS Bootcamp
15 - 19 November 2010, Edison, New Jersey, USA
www.voice-system.ro




More information about the Users mailing list