[OpenSIPS-Users] Runtime avp substitution

Paul Smith Paul.Smith at ClarityTele.com
Sat Sep 25 22:21:15 CEST 2010


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
>   



More information about the Users mailing list