[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