[Users] new features: script variables and pseudo-variables in script

Daniel-Constantin Mierla daniel at voice-system.ro
Mon Jan 29 17:58:29 CET 2007


Hello everybody,

the development version allows now ability to use pseudo-variables 
directly in configuration file. In addition to old pseudo-variables you 
know, a new type was introduced: script variables - the format is 
$var(name) where name can be any string of digits and characters.

Basically this are variables that can have integer or string values and 
they can be set directly in the configuration file via 'assign 
operation. The big advantage is that they are directly referenced at 
runtime, avoiding searching each access time. They are specific per 
processes and survive over multiple sip message processing (be sure you 
set the value before testing it -- e.g., $var(counter) = $var(counter) + 
1 at the beginning of main route is a counter of messages processed). 
The script variables are initialized at startup to '0'. You can shift 
between value types: e.g., '$var(a)=1; $var(a)="openser";'  is valid.

The switch statement can be used now with any valid pseudo-variable 
('retcode' must be now replaced with '$retcode' to get old behavior).  
switch($rU) will compare the r-uri username with 'case' values. The case 
'values' can be string or integer.

switch($rU) {
case "101": xlog("dialed number is 101\n"); break;
case "102": xlog("dialed number is 102\n"); break;
default: xlog("dialed number is $rU\n");
}

Assignments of script variables, AVPs, R-URI parts (username, domain, 
and URI) and dst URI can be done as well in script.
$avp(i:11) = 1; - sets the value of $avp(i:11) to integer '1'
$avp(i:11) = "1"; - sets the value of $avp(i:11) to string '1'
$ru = "sip:"+$var(user)+"@"+$fd; - sets the R-URI to string composed 
from value of variable $var(user) and From URI domain

'+' can be used to concatenate strings or do arithmetic addition. Other 
arithmetic operators:
- '-' - minus
- '/' - divide
- '*' - multiply
- '%' - modulo
- '|' - bitwise OR
- '&' - bitwise AND
- '^' - bitwise XOR
- '~' - bitwise NOT

To make sure that the priority of the operators is right, do use 
parenthesis, it is the best to get expected result:
$var(a) = 2 + (7&(~4));

If you want to evaluate arithmetic operations and test the value in 
conditions, use the test operator ' [ ... ] ' . This is required to 
convert the result to internal convention for drop, true and false.

if ( [ $var(a)&4 ] ) {
   xlog("bit 3 is set in var a");
}

Old '*' used to match any port or proto was changed to 'any' to avoid 
the conflict with multiply operator. Some operations overlap with 
several avpops functions. Until sure that all cases are covered in 
script variant, both will go further, avpops version being scheduled for 
deprecation.

It was a big lump of changes, help in testing and feedback is very much 
appreciated.

Cheers,
Daniel







More information about the sr-users mailing list