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
thanks :-)
regards klaus
Daniel-Constantin Mierla wrote:
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
Devel mailing list Devel@openser.org http://openser.org/cgi-bin/mailman/listinfo/devel