[OpenSIPS-Users] Runtime avp substitution

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


Hi Paul,

fnmatch is a C function, not a shell one :)...no need to install anything

http://www.manpagez.com/man/3/fnmatch/

Regards,
Bogdan

Paul Smith wrote:
> 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
>>>
>>>   
>>>     
>>
>>
>>   
> ------------------------------------------------------------------------
>
> _______________________________________________
> 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