aboutsummaryrefslogtreecommitdiffstats
path: root/doc/tex/channelvariables.tex
diff options
context:
space:
mode:
Diffstat (limited to 'doc/tex/channelvariables.tex')
-rw-r--r--doc/tex/channelvariables.tex1066
1 files changed, 0 insertions, 1066 deletions
diff --git a/doc/tex/channelvariables.tex b/doc/tex/channelvariables.tex
deleted file mode 100644
index d0aeae6ea..000000000
--- a/doc/tex/channelvariables.tex
+++ /dev/null
@@ -1,1066 +0,0 @@
-\section{Introduction}
-
-There are two levels of parameter evaluation done in the Asterisk
-dial plan in extensions.conf.
-\begin{enumerate}
-\item The first, and most frequently used, is the substitution of variable
- references with their values.
-\item Then there are the evaluations of expressions done in \$[ .. ].
- This will be discussed below.
-\end{enumerate}
-Asterisk has user-defined variables and standard variables set
-by various modules in Asterisk. These standard variables are
-listed at the end of this document.
-
-\section{Parameter Quoting}
-\begin{astlisting}
-\begin{verbatim}
-exten => s,5,BackGround,blabla
-\end{verbatim}
-\end{astlisting}
-The parameter (blabla) can be quoted ("blabla"). In this case, a
-comma does not terminate the field. However, the double quotes
-will be passed down to the Background command, in this example.
-
-Also, characters special to variable substitution, expression evaluation, etc
-(see below), can be quoted. For example, to literally use a \$ on the
-string "\$1231", quote it with a preceding \textbackslash. Special characters that must
-be quoted to be used, are [ ] \$ " \textbackslash. (to write \textbackslash itself, use \textbackslash).
-
-These Double quotes and escapes are evaluated at the level of the
-asterisk config file parser.
-
-Double quotes can also be used inside expressions, as discussed below.
-
-\section{Variables}
-
-Parameter strings can include variables. Variable names are arbitrary strings.
-They are stored in the respective channel structure.
-
-To set a variable to a particular value, do:
-\begin{astlisting}
-\begin{verbatim}
- exten => 1,2,Set(varname=value)
-\end{verbatim}
-\end{astlisting}
-You can substitute the value of a variable everywhere using \$\{variablename\}.
-For example, to stringwise append \$lala to \$blabla and store result in \$koko,
-do:
-\begin{astlisting}
-\begin{verbatim}
- exten => 1,2,Set(koko=${blabla}${lala})
-\end{verbatim}
-\end{astlisting}
-
-There are two reference modes - reference by value and reference by name.
-To refer to a variable with its name (as an argument to a function that
-requires a variable), just write the name. To refer to the variable's value,
-enclose it inside \$\{\}. For example, Set takes as the first argument
-(before the =) a variable name, so:
-\begin{astlisting}
-\begin{verbatim}
- exten => 1,2,Set(koko=lala)
- exten => 1,3,Set(${koko}=blabla)
-\end{verbatim}
-\end{astlisting}
-stores to the variable "koko" the value "lala" and to variable "lala" the
-value "blabla".
-
-In fact, everything contained \$\{here\} is just replaced with the value of
-the variable "here".
-
-\section{Variable Inheritance}
-
-Variable names which are prefixed by "\_" will be inherited to channels
-that are created in the process of servicing the original channel in
-which the variable was set. When the inheritance takes place, the
-prefix will be removed in the channel inheriting the variable. If the
-name is prefixed by "\_\_" in the channel, then the variable is
-inherited and the "\_\_" will remain intact in the new channel.
-
-In the dialplan, all references to these variables refer to the same
-variable, regardless of having a prefix or not. Note that setting any
-version of the variable removes any other version of the variable,
-regardless of prefix.
-
-\subsection{Example}
-\begin{astlisting}
-\begin{verbatim}
-Set(__FOO=bar) ; Sets an inherited version of "FOO" variable
-Set(FOO=bar) ; Removes the inherited version and sets a local
- ; variable.
-\end{verbatim}
-\end{astlisting}
-
-However, NoOp(\$\{\_\_FOO\}) is identical to NoOp(\$\{FOO\})
-
-\section{Selecting Characters from Variables}
-
-The format for selecting characters from a variable can be expressed as:
-\begin{astlisting}
-\begin{verbatim}
- ${variable_name[:offset[:length]]}
-\end{verbatim}
-\end{astlisting}
-If you want to select the first N characters from the string assigned
-to a variable, simply append a colon and the number of characters to
-skip from the beginning of the string to the variable name.
-\begin{astlisting}
-\begin{verbatim}
- ; Remove the first character of extension, save in "number" variable
- exten => _9X.,1,Set(number=${EXTEN:1})
-\end{verbatim}
-\end{astlisting}
-Assuming we've dialed 918005551234, the value saved to the 'number' variable
-would be 18005551234. This is useful in situations when we require users to
-dial a number to access an outside line, but do not wish to pass the first
-digit.
-
-If you use a negative offset number, Asterisk starts counting from the end
-of the string and then selects everything after the new position. The following
-example will save the numbers 1234 to the 'number' variable, still assuming
-we've dialed 918005551234.
-\begin{astlisting}
-\begin{verbatim}
- ; Remove everything before the last four digits of the dialed string
- exten => _9X.,1,Set(number=${EXTEN:-4})
-\end{verbatim}
-\end{astlisting}
-We can also limit the number of characters from our offset position that we
-wish to use. This is done by appending a second colon and length value to the
-variable name. The following example will save the numbers 555 to the 'number'
-variable.
-\begin{astlisting}
-\begin{verbatim}
- ; Only save the middle numbers 555 from the string 918005551234
- exten => _9X.,1,Set(number=${EXTEN:5:3})
-\end{verbatim}
-\end{astlisting}
-The length value can also be used in conjunction with a negative offset. This
-may be useful if the length of the string is unknown, but the trailing digits
-are. The following example will save the numbers 555 to the 'number' variable,
-even if the string starts with more characters than expected (unlike the
-previous example).
-\begin{astlisting}
-\begin{verbatim}
- ; Save the numbers 555 to the 'number' variable
- exten => _9X.,1,Set(number=${EXTEN:-7:3})
-\end{verbatim}
-\end{astlisting}
-If a negative length value is entered, Asterisk will remove that many characters
-from the end of the string.
-\begin{astlisting}
-\begin{verbatim}
- ; Set pin to everything but the trailing #.
- exten => _XXXX#,1,Set(pin=${EXTEN:0:-1})
-\end{verbatim}
-\end{astlisting}
-
-\section{Expressions}
-
-Everything contained inside a bracket pair prefixed by a \$ (like \$[this]) is
-considered as an expression and it is evaluated. Evaluation works similar to
-(but is done on a later stage than) variable substitution: the expression
-(including the square brackets) is replaced by the result of the expression
-evaluation.
-
-For example, after the sequence:
-\begin{astlisting}
-\begin{verbatim}
-exten => 1,1,Set(lala=$[1 + 2])
-exten => 1,2,Set(koko=$[2 * ${lala}])
-\end{verbatim}
-\end{astlisting}
-the value of variable koko is "6".
-
-and, further:
-\begin{astlisting}
-\begin{verbatim}
-exten => 1,1,Set,(lala=$[ 1 + 2 ]);
-\end{verbatim}
-\end{astlisting}
-will parse as intended. Extra spaces are ignored.
-
-
-\subsection{Spaces Inside Variables Values}
-
-If the variable being evaluated contains spaces, there can be problems.
-
-For these cases, double quotes around text that may contain spaces
-will force the surrounded text to be evaluated as a single token.
-The double quotes will be counted as part of that lexical token.
-
-As an example:
-
-\begin{astlisting}
-\begin{verbatim}
-exten => s,6,GotoIf($[ "${CALLERID(name)}" : "Privacy Manager" ]?callerid-liar,s,1:s,7)
-\end{verbatim}
-\end{astlisting}
-
-The variable CALLERID(name) could evaluate to "DELOREAN MOTORS" (with a space)
-but the above will evaluate to:
-
-\begin{verbatim}
-"DELOREAN MOTORS" : "Privacy Manager"
-\end{verbatim}
-
-and will evaluate to 0.
-
-The above without double quotes would have evaluated to:
-
-\begin{verbatim}
-DELOREAN MOTORS : Privacy Manager
-\end{verbatim}
-
-and will result in syntax errors, because token DELOREAN is immediately
-followed by token MOTORS and the expression parser will not know how to
-evaluate this expression, because it does not match its grammar.
-
-\subsection{Operators}
-
-Operators are listed below in order of increasing precedence. Operators
-with equal precedence are grouped within \{ \} symbols.
-
-\begin{itemize}
- \item \verb!expr1 | expr2!
-
- Return the evaluation of expr1 if it is neither an empty string
- nor zero; otherwise, returns the evaluation of expr2.
-
- \item \verb!expr1 & expr2!
-
- Return the evaluation of expr1 if neither expression evaluates to
- an empty string or zero; otherwise, returns zero.
-
- \item \verb+expr1 {=, >, >=, <, <=, !=} expr2+
-
- Return the results of floating point comparison if both arguments are
- numbers; otherwise, returns the results of string comparison
- using the locale-specific collation sequence. The result of each
- comparison is 1 if the specified relation is true, or 0 if the
- relation is false.
-
- \item \verb!expr1 {+, -} expr2!
-
- Return the results of addition or subtraction of floating point-valued
- arguments.
-
- \item \verb!expr1 {*, /, %} expr2!
-
- Return the results of multiplication, floating point division, or
- remainder of arguments.
-
- \item \verb!- expr1!
-
- Return the result of subtracting expr1 from 0.
- This, the unary minus operator, is right associative, and
- has the same precedence as the ! operator.
-
- \item \verb+! expr1+
-
- Return the result of a logical complement of expr1.
- In other words, if expr1 is null, 0, an empty string,
- or the string "0", return a 1. Otherwise, return a 0.
- It has the same precedence as the unary minus operator, and
- is also right associative.
-
- \item \verb!expr1 : expr2!
-
- The `:' operator matches expr1 against expr2, which must be a
- regular expression. The regular expression is anchored to the
- beginning of the string with an implicit `\^'.
-
- If the match succeeds and the pattern contains at least one regular
- expression subexpression `\(...\)', the string corresponing
- to `\textbackslash1' is returned; otherwise the matching operator
- returns the number of characters matched. If the match fails and
- the pattern contains a regular expression subexpression the null
- string is returned; otherwise 0.
-
- Normally, the double quotes wrapping a string are left as part
- of the string. This is disastrous to the : operator. Therefore,
- before the regex match is made, beginning and ending double quote
- characters are stripped from both the pattern and the string.
-
- \item \verb!expr1 =~ expr2!
-
- Exactly the same as the ':' operator, except that the match is
- not anchored to the beginning of the string. Pardon any similarity
- to seemingly similar operators in other programming languages!
- The ":" and "=\verb!~!" operators share the same precedence.
-
- \item \verb!expr1 ? expr2 :: expr3!
-
- Traditional Conditional operator. If expr1 is a number
- that evaluates to 0 (false), expr3 is result of the this
- expression evaluation. Otherwise, expr2 is the result.
- If expr1 is a string, and evaluates to an empty string,
- or the two characters (""), then expr3 is the
- result. Otherwise, expr2 is the result. In Asterisk, all
- 3 exprs will be "evaluated"; if expr1 is "true", expr2
- will be the result of the "evaluation" of this
- expression. expr3 will be the result otherwise. This
- operator has the lowest precedence.
-
- \item \verb!expr1 ~~ expr2!
-
- Concatenation operator. The two exprs are evaluated and
- turned into strings, stripped of surrounding double quotes,
- and are turned into a single string with no invtervening spaces.
- This operator is new to trunk after 1.6.0; it is not needed
- in existing extensions.conf code. Because of the way asterisk
- evaluates ${ } and $[ ] constructs (recursively, bottom-
- up), no $[] or ${} is ever present when the contents
- of a ${} or $[] is evaluated. Thus, tokens are usually
- already merged at evaluation time. But, in AEL, various
- exprs are evaluated raw, and ${} and $[] are gathered
- and treated as tokens. And in AEL, no two tokens can
- sit side by side without an intervening operator.
- So, in AEL, concatenation must be explicitly specified
- in expressions. This new operator will play well into
- future plans, where expressions ($[] constructs, and
- variable references (${} constructs) are merged into a
- single grammar.
-
-\end{itemize}
-
-Parentheses are used for grouping in the usual manner.
-
-Operator precedence is applied as one would expect in any of the C
-or C derived languages.
-
-\subsection{Floating Point Numbers}
-
-In 1.6 and above, we shifted the \$[...] expressions to be calculated
-via floating point numbers instead of integers. We use 'long double' numbers
-when possible, which provide around 16 digits of precision with 12 byte numbers.
-
-To specify a floating point constant, the number has to have this format: D.D, where D is
-a string of base 10 digits. So, you can say 0.10, but you can't say .10 or 20.-- we hope
-this is not an excessive restriction!
-
-Floating point numbers are turned into strings via the '\%g'/'\%Lg' format of the printf
-function set. This allows numbers to still 'look' like integers to those counting
-on integer behavior. If you were counting on 1/4 evaluating to 0, you need to now say
-TRUNC(1/4). For a list of all the truncation/rounding capabilities, see the next section.
-
-
-\subsection{Functions}
-
-In 1.6 and above, we upgraded the \$[] expressions to handle floating point numbers.
-Because of this, folks counting on integer behavior would be disrupted. To make
-the same results possible, some rounding and integer truncation functions have been
-added to the core of the Expr2 parser. Indeed, dialplan functions can be called from
-\$[..] expressions without the \$\{...\} operators. The only trouble might be in the fact that
-the arguments to these functions must be specified with a comma. If you try to call
-the MATH function, for example, and try to say 3 + MATH(7*8), the expression parser will
-evaluate 7*8 for you into 56, and the MATH function will most likely complain that its
-input doesn't make any sense.
-
-We also provide access to most of the floating point functions in the C library. (but not all of them).
-
-While we don't expect someone to want to do Fourier analysis in the dialplan, we
-don't want to preclude it, either.
-
-Here is a list of the 'builtin' functions in Expr2. All other dialplan functions
-are available by simply calling them (read-only). In other words, you don't need to
-surround function calls in \$[...] expressions with \$\{...\}. Don't jump to conclusions,
-though! -- you still need to wrap variable names in curly braces!
-
-\begin{enumerate}
-\item COS(x) x is in radians. Results vary from -1 to 1.
-\item SIN(x) x is in radians. Results vary from -1 to 1.
-\item TAN(x) x is in radians.
-\item ACOS(x) x should be a value between -1 and 1.
-\item ASIN(x) x should be a value between -1 and 1.
-\item ATAN(x) returns the arc tangent in radians; between -PI/2 and PI/2.
-\item ATAN2(x,y) returns a result resembling y/x, except that the signs of both args are used to determine the quadrant of the result. Its result is in radians, between -PI and PI.
-\item POW(x,y) returns the value of x raised to the power of y.
-\item SQRT(x) returns the square root of x.
-\item FLOOR(x) rounds x down to the nearest integer.
-\item CEIL(x) rounds x up to the nearest integer.
-\item ROUND(x) rounds x to the nearest integer, but round halfway cases away from zero.
-\item RINT(x) rounds x to the nearest integer, rounding halfway cases to the nearest even integer.
-\item TRUNC(x) rounds x to the nearest integer not larger in absolute value.
-\item REMAINDER(x,y) computes the remainder of dividing x by y. The return value is x - n*y, where n is the value x/y, rounded to the nearest integer. If this quotient is 1/2, it is rounded to the nearest even number.
-\item EXP(x) returns e to the x power.
-\item EXP2(x) returns 2 to the x power.
-\item LOG(x) returns the natural logarithm of x.
-\item LOG2(x) returns the base 2 log of x.
-\item LOG10(x) returns the base 10 log of x.
-\end{enumerate}
-
-\subsection{Examples}
-
-\begin{astlisting}
-\begin{verbatim}
- "One Thousand Five Hundred" =~ "(T[^ ]+)"
- returns: Thousand
-
- "One Thousand Five Hundred" =~ "T[^ ]+"
- returns: 8
-
- "One Thousand Five Hundred" : "T[^ ]+"
- returns: 0
-
- "8015551212" : "(...)"
- returns: 801
-
- "3075551212":"...(...)"
- returns: 555
-
- ! "One Thousand Five Hundred" =~ "T[^ ]+"
- returns: 0 (because it applies to the string, which is non-null,
- which it turns to "0", and then looks for the pattern
- in the "0", and doesn't find it)
-
- !( "One Thousand Five Hundred" : "T[^ ]+" )
- returns: 1 (because the string doesn't start with a word starting
- with T, so the match evals to 0, and the ! operator
- inverts it to 1 ).
-
- 2 + 8 / 2
- returns 6. (because of operator precedence; the division is done first, then the addition).
-
- 2+8/2
- returns 6. Spaces aren't necessary.
-
-(2+8)/2
- returns 5, of course.
-
-(3+8)/2
- returns 5.5 now.
-
-TRUNC((3+8)/2)
- returns 5.
-
-FLOOR(2.5)
- returns 2
-
-FLOOR(-2.5)
- returns -3
-
-CEIL(2.5)
- returns 3.
-
-CEIL(-2.5)
- returns -2.
-
-ROUND(2.5)
- returns 3.
-
-ROUND(3.5)
- returns 4.
-
-ROUND(-2.5)
- returns -3
-
-RINT(2.5)
- returns 2.
-
-RINT(3.5)
- returns 4.
-
-RINT(-2.5)
- returns -2.
-
-RINT(-3.5)
- returns -4.
-
-TRUNC(2.5)
- returns 2.
-
-TRUNC(3.5)
- returns 3.
-
-TRUNC(-3.5)
- returns -3.
-\end{verbatim}
-\end{astlisting}
-
-Of course, all of the above examples use constants, but would work the
-same if any of the numeric or string constants were replaced with a
-variable reference \$\{CALLERID(num)\}, for instance.
-
-
-\subsection{Numbers Vs. Strings}
-
-Tokens consisting only of numbers are converted to 'long double' if possible, which
-are from 80 bits to 128 bits depending on the OS, compiler, and hardware.
-This means that overflows can occur when the
-numbers get above 18 digits (depending on the number of bits involved). Warnings will appear in the logs in this
-case.
-
-\subsection{Conditionals}
-
-There is one conditional application - the conditional goto :
-\begin{astlisting}
-\begin{verbatim}
- exten => 1,2,GotoIf(condition?label1:label2)
-\end{verbatim}
-\end{astlisting}
-
-If condition is true go to label1, else go to label2. Labels are interpreted
-exactly as in the normal goto command.
-
-"condition" is just a string. If the string is empty or "0", the condition
-is considered to be false, if it's anything else, the condition is true.
-This is designed to be used together with the expression syntax described
-above, eg :
-
-\begin{astlisting}
-\begin{verbatim}
- exten => 1,2,GotoIf($[${CALLERID(all)} = 123456]?2,1:3,1)
-\end{verbatim}
-\end{astlisting}
-
-Example of use :
-\begin{astlisting}
-\begin{verbatim}
-exten => s,2,Set(vara=1)
-exten => s,3,Set(varb=$[${vara} + 2])
-exten => s,4,Set(varc=$[${varb} * 2])
-exten => s,5,GotoIf($[${varc} = 6]?99,1:s,6)
-\end{verbatim}
-\end{astlisting}
-
-\subsection{Parse Errors}
-
-Syntax errors are now output with 3 lines.
-
-If the extensions.conf file contains a line like:
-
-\begin{astlisting}
-\begin{verbatim}
-exten => s,6,GotoIf($[ "${CALLERID(num)}" = "3071234567" & & "${CALLERID(name)}" : "Privacy Manager" ]?callerid-liar,s,1:s,7)
-\end{verbatim}
-\end{astlisting}
-
-You may see an error in \path{/var/log/asterisk/messages} like this:
-\begin{astlisting}
-\begin{verbatim}
-Jul 15 21:27:49 WARNING[1251240752]: ast_yyerror(): syntax error: parse error, unexpected TOK_AND, expecting TOK_MINUS or TOK_LP or TOKEN; Input:
-"3072312154" = "3071234567" & & "Steves Extension" : "Privacy Manager"
- ^
-\end{verbatim}
-\end{astlisting}
-
-The log line tells you that a syntax error was encountered. It now
-also tells you (in grand standard bison format) that it hit an "AND"
-(\&) token unexpectedly, and that was hoping for for a MINUS (-), LP
-(left parenthesis), or a plain token (a string or number).
-
-The next line shows the evaluated expression, and the line after
-that, the position of the parser in the expression when it became confused,
-marked with the "\^" character.
-
-\subsection{NULL Strings}
-Testing to see if a string is null can be done in one of two different ways:
-\begin{astlisting}
-\begin{verbatim}
- exten => _XX.,1,GotoIf($["${calledid}" != ""]?3)
- or
- exten => _XX.,1,GotoIf($[foo${calledid} != foo]?3)
-\end{verbatim}
-\end{astlisting}
-
-The second example above is the way suggested by the WIKI. It will
-work as long as there are no spaces in the evaluated value.
-
-The first way should work in all cases, and indeed, might now
-be the safest way to handle this situation.
-
-\subsection{Warning}
-
-If you need to do complicated things with strings, asterisk expressions
-is most likely NOT the best way to go about it. AGI scripts are an
-excellent option to this need, and make available the full power of
-whatever language you desire, be it Perl, C, C++, Cobol, RPG, Java,
-Snobol, PL/I, Scheme, Common Lisp, Shell scripts, Tcl, Forth, Modula,
-Pascal, APL, assembler, etc.
-
-\subsection{Incompatabilities}
-
-The asterisk expression parser has undergone some evolution. It is hoped
-that the changes will be viewed as positive.
-
-The "original" expression parser had a simple, hand-written scanner,
-and a simple bison grammar. This was upgraded to a more involved bison
-grammar, and a hand-written scanner upgraded to allow extra spaces,
-and to generate better error diagnostics. This upgrade required bison
-1.85, and part of the user community felt the pain of having to
-upgrade their bison version.
-
-The next upgrade included new bison and flex input files, and the makefile
-was upgraded to detect current version of both flex and bison, conditionally
-compiling and linking the new files if the versions of flex and bison would
-allow it.
-
-If you have not touched your extensions.conf files in a year or so, the
-above upgrades may cause you some heartburn in certain circumstances, as
-several changes have been made, and these will affect asterisk's behavior on
-legacy extension.conf constructs. The changes have been engineered
-to minimize these conflicts, but there are bound to be problems.
-
-The following list gives some (and most likely, not all) of areas
-of possible concern with "legacy" extension.conf files:
-
-\begin{enumerate}
-\item Tokens separated by space(s).
- Previously, tokens were separated by spaces. Thus, ' 1 + 1 ' would evaluate
- to the value '2', but '1+1' would evaluate to the string '1+1'. If this
- behavior was depended on, then the expression evaluation will break. '1+1'
- will now evaluate to '2', and something is not going to work right.
- To keep such strings from being evaluated, simply wrap them in double
- quotes: ' "1+1" '
-
-\item The colon operator. In versions previous to double quoting, the
- colon operator takes the right hand string, and using it as a
- regex pattern, looks for it in the left hand string. It is given
- an implicit \^ operator at the beginning, meaning the pattern
- will match only at the beginning of the left hand string.
- If the pattern or the matching string had double quotes around
- them, these could get in the way of the pattern match. Now,
- the wrapping double quotes are stripped from both the pattern
- and the left hand string before applying the pattern. This
- was done because it recognized that the new way of
- scanning the expression doesn't use spaces to separate tokens,
- and the average regex expression is full of operators that
- the scanner will recognize as expression operators. Thus, unless
- the pattern is wrapped in double quotes, there will be trouble.
- For instance, \$\{VAR1\} : (Who$|$What*)+
- may have have worked before, but unless you wrap the pattern
- in double quotes now, look out for trouble! This is better:
- "\$\{VAR1\}" : "(Who$|$What*)+"
- and should work as previous.
-
-\item Variables and Double Quotes
- Before these changes, if a variable's value contained one or more double
- quotes, it was no reason for concern. It is now!
-
-\item LE, GE, NE operators removed. The code supported these operators,
- but they were not documented. The symbolic operators, $<$=, $>$=, and !=
- should be used instead.
-
-\item Added the unary '-' operator. So you can 3+ -4 and get -1.
-
-\item Added the unary '!' operator, which is a logical complement.
- Basically, if the string or number is null, empty, or '0',
- a '1' is returned. Otherwise a '0' is returned.
-
-\item Added the '=\verb!~!' operator, just in case someone is just looking for
- match anywhere in the string. The only diff with the ':' is that
- match doesn't have to be anchored to the beginning of the string.
-
-\item Added the conditional operator 'expr1 ? true\_expr :: false\_expr'
- First, all 3 exprs are evaluated, and if expr1 is false, the 'false\_expr'
- is returned as the result. See above for details.
-
-\item Unary operators '-' and '!' were made right associative.
-\end{enumerate}
-
-\subsection{Debugging Hints}
-
-There are two utilities you can build to help debug the \$[ ] in
-your extensions.conf file.
-
-The first, and most simplistic, is to issue the command:
-\begin{astlisting}
-\begin{verbatim}
-make testexpr2
-\end{verbatim}
-\end{astlisting}
-in the top level asterisk source directory. This will build a small
-executable, that is able to take the first command line argument, and
-run it thru the expression parser. No variable substitutions will be
-performed. It might be safest to wrap the expression in single
-quotes...
-\begin{astlisting}
-\begin{verbatim}
-testexpr2 '2*2+2/2'
-\end{verbatim}
-\end{astlisting}
-is an example.
-
-And, in the utils directory, you can say:
-\begin{astlisting}
-\begin{verbatim}
-make check_expr
-\end{verbatim}
-\end{astlisting}
-and a small program will be built, that will check the file mentioned
-in the first command line argument, for any expressions that might be
-have problems when you move to flex-2.5.31. It was originally
-designed to help spot possible incompatibilities when moving from the
-pre-2.5.31 world to the upgraded version of the lexer.
-
-But one more capability has been added to check\_expr, that might make
-it more generally useful. It now does a simple minded evaluation of
-all variables, and then passes the \$[] exprs to the parser. If there
-are any parse errors, they will be reported in the log file. You can
-use check\_expr to do a quick sanity check of the expressions in your
-extensions.conf file, to see if they pass a crude syntax check.
-
-The "simple-minded" variable substitution replaces \$\{varname\} variable
-references with '555'. You can override the 555 for variable values,
-by entering in var=val arguments after the filename on the command
-line. So...
-\begin{astlisting}
-\begin{verbatim}
- check_expr /etc/asterisk/extensions.conf CALLERID(num)=3075551212 DIALSTATUS=TORTURE EXTEN=121
-\end{verbatim}
-\end{astlisting}
-will substitute any \$\{CALLERID(num)\} variable references with
-3075551212, any \$\{DIALSTATUS\} variable references with 'TORTURE', and
-any \$\{EXTEN\} references with '121'. If there is any fancy stuff
-going on in the reference, like \$\{EXTEN:2\}, then the override will
-not work. Everything in the \$\{...\} has to match. So, to substitute
-\$\{EXTEN:2\} references, you'd best say:
-\begin{astlisting}
-\begin{verbatim}
- check_expr /etc/asterisk/extensions.conf CALLERID(num)=3075551212 DIALSTATUS=TORTURE EXTEN:2=121
-\end{verbatim}
-\end{astlisting}
-on stdout, you will see something like:
-
-\begin{astlisting}
-\begin{verbatim}
- OK -- $[ "${DIALSTATUS}" = "TORTURE" | "${DIALSTATUS}" = "DONTCALL" ] at line 416
-\end{verbatim}
-\end{astlisting}
-
-In the expr2\_log file that is generated, you will see:
-
-\begin{astlisting}
-\begin{verbatim}
- line 416, evaluation of $[ "TORTURE" = "TORTURE" | "TORTURE" = "DONTCALL" ] result: 1
-\end{verbatim}
-\end{astlisting}
-
-check\_expr is a very simplistic algorithm, and it is far from being
-guaranteed to work in all cases, but it is hoped that it will be
-useful.
-
-\section{Asterisk standard channel variables}
-
-There are a number of variables that are defined or read
-by Asterisk. Here is a list of them. More information is
-available in each application's help text. All these variables
-are in UPPER CASE only.
-
-Variables marked with a * are builtin functions and can't be set,
-only read in the dialplan. Writes to such variables are silently
-ignored.
-
-\begin{verbatim}
-${CDR(accountcode)} * Account code (if specified)
-${BLINDTRANSFER} The name of the channel on the other side of a blind transfer
-${BRIDGEPEER} Bridged peer
-${BRIDGEPVTCALLID} Bridged peer PVT call ID (SIP Call ID if a SIP call)
-${CALLERID(ani)} * Caller ANI (PRI channels)
-${CALLERID(ani2)} * ANI2 (Info digits) also called Originating line information or OLI
-${CALLERID(all)} * Caller ID
-${CALLERID(dnid)} * Dialed Number Identifier
-${CALLERID(name)} * Caller ID Name only
-${CALLERID(num)} * Caller ID Number only
-${CALLERID(rdnis)} * Redirected Dial Number ID Service
-${CALLINGANI2} * Caller ANI2 (PRI channels)
-${CALLINGPRES} * Caller ID presentation for incoming calls (PRI channels)
-${CALLINGTNS} * Transit Network Selector (PRI channels)
-${CALLINGTON} * Caller Type of Number (PRI channels)
-${CHANNEL} * Current channel name
-${CONTEXT} * Current context
-${DATETIME} * Current date time in the format: DDMMYYYY-HH:MM:SS
- (Deprecated; use ${STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)})
-${DB_RESULT} Result value of DB_EXISTS() dial plan function
-${EPOCH} * Current unix style epoch
-${EXTEN} * Current extension
-${ENV(VAR)} Environmental variable VAR
-${GOTO_ON_BLINDXFR} Transfer to the specified context/extension/priority
- after a blind transfer (use ^ characters in place of
- | to separate context/extension/priority when setting
- this variable from the dialplan)
-${HANGUPCAUSE} * Asterisk cause of hangup (inbound/outbound)
-${HINT} * Channel hints for this extension
-${HINTNAME} * Suggested Caller*ID name for this extension
-${INVALID_EXTEN} The invalid called extension (used in the "i" extension)
-${LANGUAGE} * Current language (Deprecated; use ${LANGUAGE()})
-${LEN(VAR)} * String length of VAR (integer)
-${PRIORITY} * Current priority in the dialplan
-${PRIREDIRECTREASON} Reason for redirect on PRI, if a call was directed
-${TIMESTAMP} * Current date time in the format: YYYYMMDD-HHMMSS
- (Deprecated; use ${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)})
-${TRANSFER_CONTEXT} Context for transferred calls
-${FORWARD_CONTEXT} Context for forwarded calls
-${DYNAMIC_PEERNAME} The name of the channel on the other side when a dynamic
- feature is used.
-${DYNAMIC_FEATURENAME} The name of the last triggered dynamic feature.
-${UNIQUEID} * Current call unique identifier
-${SYSTEMNAME} * value of the systemname option of asterisk.conf
-${ENTITYID} * Global Entity ID set automatically, or from asterisk.conf
-\end{verbatim}
-
-\subsection{Application return values}
-
-Many applications return the result in a variable that you read to
-get the result of the application. These status fields are unique
-for each application.
-For the various status values, see each application's help text.
-\begin{verbatim}
-${AGISTATUS} * agi()
-${AQMSTATUS} * addqueuemember()
-${AVAILSTATUS} * chanisavail()
-${CHECKGROUPSTATUS} * checkgroup()
-${CHECKMD5STATUS} * checkmd5()
-${CPLAYBACKSTATUS} * controlplayback()
-${DIALSTATUS} * dial()
-${DBGETSTATUS} * dbget()
-${ENUMSTATUS} * enumlookup()
-${HASVMSTATUS} * hasnewvoicemail()
-${LOOKUPBLSTATUS} * lookupblacklist()
-${OSPAUTHSTATUS} * ospauth()
-${OSPLOOKUPSTATUS} * osplookup()
-${OSPNEXTSTATUS} * ospnext()
-${OSPFINISHSTATUS} * ospfinish()
-${PARKEDAT} * parkandannounce()
-${PLAYBACKSTATUS} * playback()
-${PQMSTATUS} * pausequeuemember()
-${PRIVACYMGRSTATUS} * privacymanager()
-${QUEUESTATUS} * queue()
-${RQMSTATUS} * removequeuemember()
-${SENDIMAGESTATUS} * sendimage()
-${SENDTEXTSTATUS} * sendtext()
-${SENDURLSTATUS} * sendurl()
-${SYSTEMSTATUS} * system()
-${TRANSFERSTATUS} * transfer()
-${TXTCIDNAMESTATUS} * txtcidname()
-${UPQMSTATUS} * unpausequeuemember()
-${VMSTATUS} * voicmail()
-${VMBOXEXISTSSTATUS} * vmboxexists()
-${WAITSTATUS} * waitforsilence()
-\end{verbatim}
-
-\subsection{Various application variables}
-\begin{verbatim}
-${CURL} * Resulting page content for curl()
-${ENUM} * Result of application EnumLookup
-${EXITCONTEXT} Context to exit to in IVR menu (app background())
- or in the RetryDial() application
-${MONITOR} * Set to "TRUE" if the channel is/has been monitored (app monitor())
-${MONITOR_EXEC} Application to execute after monitoring a call
-${MONITOR_EXEC_ARGS} Arguments to application
-${MONITOR_FILENAME} File for monitoring (recording) calls in queue
-${QUEUE_PRIO} Queue priority
-${QUEUE_MAX_PENALTY} Maximum member penalty allowed to answer caller
-${QUEUE_MIN_PENALTY} Minimum member penalty allowed to answer caller
-${QUEUESTATUS} Status of the call, one of:
- (TIMEOUT | FULL | JOINEMPTY | LEAVEEMPTY | JOINUNAVAIL | LEAVEUNAVAIL)
-${QUEUEPOSITION} * When a caller is removed from a queue, his current position is logged
- in this variable. If the value is 0, then this means that the caller was
- serviced by a queue member. If non-zero, then this was the position in the
- queue the caller was in when he left.
-${RECORDED_FILE} * Recorded file in record()
-${TALK_DETECTED} * Result from talkdetect()
-${TOUCH_MONITOR} The filename base to use with Touch Monitor (auto record)
-${TOUCH_MONITOR_PREF} * The prefix for automonitor recording filenames.
-${TOUCH_MONITOR_FORMAT} The audio format to use with Touch Monitor (auto record)
-${TOUCH_MONITOR_OUTPUT} * Recorded file from Touch Monitor (auto record)
-${TOUCH_MONITOR_MESSAGE_START} Recorded file to play for both channels at start of monitoring session
-${TOUCH_MONITOR_MESSAGE_STOP} Recorded file to play for both channels at end of monitoring session
-${TXTCIDNAME} * Result of application TXTCIDName
-${VPB_GETDTMF} chan_vpb
-\end{verbatim}
-
-\subsection{The MeetMe Conference Bridge}
-\begin{verbatim}
-${MEETME_RECORDINGFILE} Name of file for recording a conference with
- the "r" option
-${MEETME_RECORDINGFORMAT} Format of file to be recorded
-${MEETME_EXIT_CONTEXT} Context for exit out of meetme meeting
-${MEETME_AGI_BACKGROUND} AGI script for Meetme (DAHDI only)
-${MEETMESECS} * Number of seconds a user participated in a MeetMe conference
-${CONF_LIMIT_TIMEOUT_FILE} File to play when time is up. Used with the L() option.
-${CONF_LIMIT_WARNING_FILE} File to play as warning if 'y' is defined.
- The default is to say the time remaining. Used with the L() option.
-${MEETMEBOOKID} * This variable exposes the bookid column for a realtime configured conference bridge.
-\end{verbatim}
-
-\subsection{The VoiceMail() application}
-\begin{verbatim}
-${VM_CATEGORY} Sets voicemail category
-${VM_NAME} * Full name in voicemail
-${VM_DUR} * Voicemail duration
-${VM_MSGNUM} * Number of voicemail message in mailbox
-${VM_CALLERID} * Voicemail Caller ID (Person leaving vm)
-${VM_CIDNAME} * Voicemail Caller ID Name
-${VM_CIDNUM} * Voicemail Caller ID Number
-${VM_DATE} * Voicemail Date
-${VM_MESSAGEFILE} * Path to message left by caller
-\end{verbatim}
-
-\subsection{The VMAuthenticate() application}
-\begin{verbatim}
-${AUTH_MAILBOX} * Authenticated mailbox
-${AUTH_CONTEXT} * Authenticated mailbox context
-\end{verbatim}
-
-\subsection{DUNDiLookup()}
-\begin{verbatim}
-${DUNDTECH} * The Technology of the result from a call to DUNDiLookup()
-${DUNDDEST} * The Destination of the result from a call to DUNDiLookup()
-\end{verbatim}
-
-\subsection{chan\_dahdi}
-\begin{verbatim}
-${ANI2} * The ANI2 Code provided by the network on the incoming call.
- (ie, Code 29 identifies call as a Prison/Inmate Call)
-${CALLTYPE} * Type of call (Speech, Digital, etc)
-${CALLEDTON} * Type of number for incoming PRI extension
- i.e. 0=unknown, 1=international, 2=domestic, 3=net_specific,
- 4=subscriber, 6=abbreviated, 7=reserved
-${CALLINGSUBADDR} * Caller's PRI Subaddress
-${FAXEXTEN} * The extension called before being redirected to "fax"
-${PRIREDIRECTREASON} * Reason for redirect, if a call was directed
-${SMDI_VM_TYPE} * When an call is received with an SMDI message, the 'type'
- of message 'b' or 'u'
-\end{verbatim}
-
-\subsection{chan\_sip}
-\begin{verbatim}
-${SIPCALLID} * SIP Call-ID: header verbatim (for logging or CDR matching)
-${SIPDOMAIN} * SIP destination domain of an inbound call (if appropriate)
-${SIPFROMDOMAIN} Set SIP domain on outbound calls
-${SIPUSERAGENT} * SIP user agent (deprecated)
-${SIPURI} * SIP uri
-${SIP_MAX_FORWARDS} Set the value of the Max-Forwards header for outbound call
-${SIP_CODEC} Set the SIP codec for an inbound call
-${SIP_CODEC_INBOUND} Set the SIP codec for an inbound call
-${SIP_CODEC_OUTBOUND} Set the SIP codec for an outbound call
-${SIP_URI_OPTIONS} * additional options to add to the URI for an outgoing call
-${RTPAUDIOQOS} RTCP QoS report for the audio of this call
-${RTPVIDEOQOS} RTCP QoS report for the video of this call
-\end{verbatim}
-
-\subsection{chan\_agent}
-\begin{verbatim}
-${AGENTMAXLOGINTRIES} Set the maximum number of failed logins
-${AGENTUPDATECDR} Whether to update the CDR record with Agent channel data
-${AGENTGOODBYE} Sound file to use for "Good Bye" when agent logs out
-${AGENTACKCALL} Whether the agent should acknowledge the incoming call
-${AGENTAUTOLOGOFF} Auto logging off for an agent
-${AGENTWRAPUPTIME} Setting the time for wrapup between incoming calls
-${AGENTNUMBER} * Agent number (username) set at login
-${AGENTSTATUS} * Status of login ( fail | on | off )
-${AGENTEXTEN} * Extension for logged in agent
-\end{verbatim}
-
-
-\subsection{The Dial() application}
-\begin{verbatim}
-${DIALEDPEERNAME} * Dialed peer name
-${DIALEDPEERNUMBER} * Dialed peer number
-${DIALEDTIME} * Time for the call (seconds). Is only set if call was answered.
-${ANSWEREDTIME} * Time from answer to hangup (seconds)
-${DIALSTATUS} * Status of the call, one of:
- (CHANUNAVAIL | CONGESTION | BUSY | NOANSWER
- | ANSWER | CANCEL | DONTCALL | TORTURE)
-${DYNAMIC_FEATURES} * The list of features (from the [applicationmap] section of
- features.conf) to activate during the call, with feature
- names separated by '#' characters
-${LIMIT_PLAYAUDIO_CALLER} Soundfile for call limits
-${LIMIT_PLAYAUDIO_CALLEE} Soundfile for call limits
-${LIMIT_WARNING_FILE} Soundfile for call limits
-${LIMIT_TIMEOUT_FILE} Soundfile for call limits
-${LIMIT_CONNECT_FILE} Soundfile for call limits
-${OUTBOUND_GROUP} Default groups for peer channels (as in SetGroup)
- * See "show application dial" for more information
-\end{verbatim}
-
-\subsection{The chanisavail() application}
-\begin{verbatim}
-${AVAILCHAN} * the name of the available channel if one was found
-${AVAILORIGCHAN} * the canonical channel name that was used to create the channel
-${AVAILSTATUS} * Status of requested channel
-\end{verbatim}
-
-\subsection{Dialplan Macros}
-\begin{verbatim}
-${MACRO_EXTEN} * The calling extensions
-${MACRO_CONTEXT} * The calling context
-${MACRO_PRIORITY} * The calling priority
-${MACRO_OFFSET} Offset to add to priority at return from macro
-\end{verbatim}
-
-\subsection{The ChanSpy() application}
-\begin{verbatim}
-${SPYGROUP} * A ':' (colon) separated list of group names.
- (To be set on spied on channel and matched against the g(grp) option)
-\end{verbatim}
-
-\subsection{OSP}
-\begin{verbatim}
-${OSPINHANDLE} The inbound call OSP transaction handle.
-${OSPINTOKEN} The inbound OSP token.
-${OSPINTIMELIMIT} The inbound call duration limit in seconds.
-${OSPINPEERIP} The last hop IP address.
-${OSPINNETWORKID} The inbound source network ID.
-${OSPINNPRN} The inbound routing number.
-${OSPINNPCIC} The inbound carrier identification code.
-${OSPINNPDI} The inbound number portability database dip indicator.
-${OSPINSPID} The inbound service provider identity.
-${OSPINOCN} The inbound operator company number.
-${OSPINSPN} The inbound service provider name.
-${OSPINALTSPN} The inbound alternate service provider name.
-${OSPINMCC} The inbound mobile country code.
-${OSPINMNC} The inbound mobile network code.
-${OSPINDIVUSER} The inbound Diversion header user part.
-${OSPINDIVHOST} The inbound Diversion header host part.
-${OSPINTOHOST} The inbound To header host part.
-${OSPINCUSTOMINFOn} The inbound custom information.
- Where n is the index beginning with 1 upto 8.
-${OSPOUTHANDLE} The outbound call OSP transaction handle.
-${OSPOUTTOKEN} The outbound OSP token.
-${OSPOUTTIMELIMIT} The outbound call duration limit in seconds.
-${OSPOUTTECH} The outbound channel technology.
-${OSPOUTCALLIDTYPES} The outbound Call-ID types.
-${OSPOUTCALLID} The outbound Call-ID. Only for H.323.
-${OSPDESTINATION} The destination IP address.
-${OSPDESTREMAILS} The number of remained destinations.
-${OSPOUTCALLING} The outbound calling number.
-${OSPOUTCALLED} The outbound called number.
-${OSPOUTNETWORKID} The outbound destination network ID.
-${OSPOUTNPRN} The outbound routing number.
-${OSPOUTNPCIC} The outbound carrier identification code.
-${OSPOUTNPDI} The outbound number portability database dip indicator.
-${OSPOUTSPID} The outbound service provider identity.
-${OSPOUTOCN} The outbound operator company number.
-${OSPOUTSPN} The outbound service provider name.
-${OSPOUTALTSPN} The outbound alternate service provider name.
-${OSPOUTMCC} The outbound mobile country code.
-${OSPOUTMNC} The outbound mobile network code.
-${OSPDIALSTR} The outbound Dial command string.
-${OSPINAUDIOQOS} The inbound call leg audio QoS string.
-${OSPOUTAUDIOQOS} The outbound call leg audio QoS string.
-\end{verbatim}
-
-\subsection{Digit manipulation}
-\begin{verbatim}
-${REDIRECTING_CALLEE_SEND_MACRO}
- Macro to call before sending a redirecting update to the callee
-${REDIRECTING_CALLEE_SEND_MACRO_ARGS}
- Arguments to pass to ${REDIRECTING_CALLEE_SEND_MACRO}
-${REDIRECTING_CALLER_SEND_MACRO}
- Macro to call before sending a redirecting update to the caller
-${REDIRECTING_CALLER_SEND_MACRO_ARGS}
- Arguments to pass to ${REDIRECTING_CALLER_SEND_MACRO}
-
-${CONNECTED_LINE_CALLEE_SEND_MACRO}
- Macro to call before sending a connected line update to the callee
-${CONNECTED_LINE_CALLEE_SEND_MACRO_ARGS}
- Arguments to pass to ${CONNECTED_LINE_CALLEE_SEND_MACRO}
-${CONNECTED_LINE_CALLER_SEND_MACRO}
- Macro to call before sending a connected line update to the caller
-${CONNECTED_LINE_CALLER_SEND_MACRO_ARGS}
- Arguments to pass to ${CONNECTED_LINE_CALLER_SEND_MACRO}
-\end{verbatim}