Merge Steve Murphy's (murf) complete re-implementation of AEL, which is now no longer...
[asterisk/asterisk.git] / configs / extensions.ael.sample
1 //
2 // Example AEL config file
3 //
4 //
5 // Static extension configuration file, used by
6 // the pbx_config module. This is where you configure all your 
7 // inbound and outbound calls in Asterisk. 
8 // 
9 // This configuration file is reloaded 
10 // - With the "extensions reload" command in the CLI
11 // - With the "reload" command (that reloads everything) in the CLI
12
13 // The "Globals" category contains global variables that can be referenced
14 // in the dialplan with ${VARIABLE} or ${ENV(VARIABLE)} for Environmental
15 // variables,
16 // ${${VARIABLE}} or ${text${VARIABLE}} or any hybrid
17 //
18
19 globals {
20         CONSOLE="Console/dsp";          // Console interface for demo
21         //CONSOLE=Zap/1
22         //CONSOLE=Phone/phone0
23         IAXINFO=guest;                          // IAXtel username/password
24         //IAXINFO="myuser:mypass";
25         TRUNK="Zap/g2";                                 // Trunk interface
26         //
27         // Note the 'g2' in the TRUNK variable above. It specifies which group (defined
28         // in zapata.conf) to dial, i.e. group 2, and how to choose a channel to use in
29         // the specified group. The four possible options are:
30         //
31         // g: select the lowest-numbered non-busy Zap channel
32         //    (aka. ascending sequential hunt group).
33         // G: select the highest-numbered non-busy Zap channel
34         //    (aka. descending sequential hunt group).
35         // r: use a round-robin search, starting at the next highest channel than last
36         //    time (aka. ascending rotary hunt group).
37         // R: use a round-robin search, starting at the next lowest channel than last
38         //    time (aka. descending rotary hunt group).
39         //
40         TRUNKMSD=1;                                     // MSD digits to strip (usually 1 or 0)
41         //TRUNK=IAX2/user:pass@provider
42 };
43
44 //
45 // Any category other than "General" and "Globals" represent 
46 // extension contexts, which are collections of extensions.  
47 //
48 // Extension names may be numbers, letters, or combinations
49 // thereof. If an extension name is prefixed by a '_'
50 // character, it is interpreted as a pattern rather than a
51 // literal.  In patterns, some characters have special meanings:
52 //
53 //   X - any digit from 0-9
54 //   Z - any digit from 1-9
55 //   N - any digit from 2-9
56 //   [1235-9] - any digit in the brackets (in this example, 1,2,3,5,6,7,8,9)
57 //   . - wildcard, matches anything remaining (e.g. _9011. matches 
58 //      anything starting with 9011 excluding 9011 itself)
59 //   ! - wildcard, causes the matching process to complete as soon as
60 //       it can unambiguously determine that no other matches are possible
61 //
62 // For example the extension _NXXXXXX would match normal 7 digit dialings, 
63 // while _1NXXNXXXXXX would represent an area code plus phone number
64 // preceeded by a one.
65 //
66 // Each step of an extension is ordered by priority, which must
67 // always start with 1 to be considered a valid extension.  The priority
68 // "next" or "n" means the previous priority plus one, regardless of whether
69 // the previous priority was associated with the current extension or not.
70 // The priority "same" or "s" means the same as the previously specified
71 // priority, again regardless of whether the previous entry was for the
72 // same extension.  Priorities may be immediately followed by a plus sign
73 // and another integer to add that amount (most useful with 's' or 'n').  
74 // Priorities may then also have an alias, or label, in 
75 // parenthesis after their name which can be used in goto situations
76 //
77 // Contexts contain several lines, one for each step of each
78 // extension, which can take one of two forms as listed below,
79 // with the first form being preferred.  One may include another
80 // context in the current one as well, optionally with a
81 // date and time.  Included contexts are included in the order
82 // they are listed.
83 //
84 //context name {
85 //      exten-name => {
86 //              application(arg1,arg2,...);
87 //
88 //      Timing list for includes is 
89 //
90 //   <time range>|<days of week>|<days of month>|<months>
91 //
92 //      includes { 
93 //              daytime|9:00-17:00|mon-fri|*|*;
94 //  };
95 //
96 //      ignorepat can be used to instruct drivers to not cancel dialtone upon
97 //      receipt of a particular pattern.  The most commonly used example is
98 //      of course '9' like this:
99 //
100 //      ignorepat => 9;
101 //
102 //      so that dialtone remains even after dialing a 9.
103 //};
104
105
106 //
107 // Sample entries for extensions.conf
108 //
109 //
110 context dundi-e164-canonical {
111         //
112         // List canonical entries here
113         //
114         // 12564286000 => &std-exten(6000,IAX2/foo);
115         // _125642860XX => Dial(IAX2/otherbox/${EXTEN:7});
116 };
117
118 context dundi-e164-customers {
119         //
120         // If you are an ITSP or Reseller, list your customers here.
121         //
122         //_12564286000 => Dial(SIP/customer1);
123         //_12564286001 => Dial(IAX2/customer2);
124 };
125
126 context dundi-e164-via-pstn {
127         //
128         // If you are freely delivering calls to the PSTN, list them here
129         //
130         //_1256428XXXX => Dial(Zap/g2/${EXTEN:7}); // Expose all of 256-428 
131         //_1256325XXXX => Dial(Zap/g2/${EXTEN:7}); // Ditto for 256-325
132 };
133
134 context dundi-e164-local {
135         //
136         // Context to put your dundi IAX2 or SIP user in for
137         // full access
138         //
139         includes {
140          dundi-e164-canonical;
141          dundi-e164-customers;
142          dundi-e164-via-pstn;
143         };
144 };
145
146 context dundi-e164-switch {
147         //
148         // Just a wrapper for the switch
149         //
150         
151         switches { 
152                 DUNDi/e164;
153         };
154 };
155
156 context dundi-e164-lookup {
157         //
158         // Locally to lookup, try looking for a local E.164 solution
159         // then try DUNDi if we don't have one.
160         //
161         includes {
162                 dundi-e164-local;
163                 dundi-e164-switch;
164         };
165         //
166 };
167
168 //
169 // DUNDi can also be implemented as a Macro instead of using 
170 // the Local channel driver. 
171 //
172 macro dundi-e164(exten) {
173 //
174 // ARG1 is the extension to Dial
175 //
176         goto ${exten}|1;
177 };
178
179 //
180 // Here are the entries you need to participate in the IAXTEL
181 // call routing system.  Most IAXTEL numbers begin with 1-700, but
182 // there are exceptions.  For more information, and to sign
183 // up, please go to www.gnophone.com or www.iaxtel.com
184 //
185 context iaxtel700 {
186         _91700XXXXXXX => Dial(IAX2/${IAXINFO}@iaxtel.com/${EXTEN:1}@iaxtel);
187 };
188
189 //
190 // The SWITCH statement permits a server to share the dialplain with
191 // another server. Use with care: Reciprocal switch statements are not
192 // allowed (e.g. both A -> B and B -> A), and the switched server needs
193 // to be on-line or else dialing can be severly delayed.
194 //
195 context iaxprovider {
196         switches {
197         // IAX2/user:[key]@myserver/mycontext;
198         };
199 };
200
201 context trunkint {
202         //
203         // International long distance through trunk
204         //
205         includes {
206                 dundi-e164-lookup;
207         };
208         _9011. => {
209                 &dundi-e164(${EXTEN:4});
210                 Dial(${TRUNK}/${EXTEN:${TRUNKMSD}});
211         };
212 };
213
214 context trunkld {
215         //
216         // Long distance context accessed through trunk
217         //
218         includes {
219                 dundi-e164-lookup;
220         };
221         _91NXXNXXXXXX => {
222                 &dundi-e164(${EXTEN:1});
223                 Dial(${TRUNK}/${EXTEN:${TRUNKMSD}});
224         };
225 };
226
227 context trunklocal {
228         //
229         // Local seven-digit dialing accessed through trunk interface
230         //
231         _9NXXXXXX => {
232                 Dial(${TRUNK}/${EXTEN:${TRUNKMSD}});
233         };
234 };
235
236 context trunktollfree {
237         //
238         // Long distance context accessed through trunk interface
239         //
240         
241         _91800NXXXXXX => Dial(${TRUNK}/${EXTEN:${TRUNKMSD}});
242         _91888NXXXXXX => Dial(${TRUNK}/${EXTEN:${TRUNKMSD}});
243         _91877NXXXXXX => Dial(${TRUNK}/${EXTEN:${TRUNKMSD}});
244         _91866NXXXXXX => Dial(${TRUNK}/${EXTEN:${TRUNKMSD}});
245 };
246
247 context international {
248         //
249         // Master context for international long distance
250         //
251         ignorepat => 9;
252         includes {
253                 longdistance;
254                 trunkint;
255         };
256 };
257
258 context longdistance {
259         //
260         // Master context for long distance
261         //
262         ignorepat => 9;
263         includes {
264                 local;
265                 trunkld;
266         };
267 };
268
269 context local {
270         //
271         // Master context for local, toll-free, and iaxtel calls only
272         //
273         ignorepat => 9;
274         includes {
275                 default;
276                 parkedcalls;
277                 trunklocal;
278                 iaxtel700;
279                 trunktollfree;
280                 iaxprovider;
281         };
282 };
283
284 //
285 // You can use an alternative switch type as well, to resolve
286 // extensions that are not known here, for example with remote 
287 // IAX switching you transparently get access to the remote
288 // Asterisk PBX
289 // 
290 // switch => IAX2/user:password@bigserver/local
291 //
292 // An "lswitch" is like a switch but is literal, in that
293 // variable substitution is not performed at load time
294 // but is passed to the switch directly (presumably to
295 // be substituted in the switch routine itself)
296 //
297 // lswitch => Loopback/12${EXTEN}@othercontext
298 //
299 // An "eswitch" is like a switch but the evaluation of
300 // variable substitution is performed at runtime before
301 // being passed to the switch routine.
302 //
303 // eswitch => IAX2/context@${CURSERVER}
304
305
306 macro std-exten-ael( ext , dev ) {
307         Dial(${dev}/${ext},20);
308         switch(${DIALSTATUS}) {
309         case BUSY:
310                 Voicemail(b${ext});
311                 break;
312         default:
313                 Voicemail(u${ext});
314         };
315         catch a {
316                 VoiceMailMain(${ext});
317                 return;
318         };
319 };
320
321 context ael-demo {
322         s => {
323                 Wait(1);
324                 Answer();
325                 Set(TIMEOUT(digit)=5);
326                 Set(TIMEOUT(response)=10);
327 restart:
328                 Background(demo-congrats);
329 instructions:
330                 for (x=0; ${x} < 3; x=${x} + 1) {
331                         Background(demo-instruct);
332                         WaitExten();
333                 };
334         };
335         2 => {
336                 Background(demo-moreinfo);
337                 goto s|instructions;
338         };
339         3 => {
340                 Set(LANGUAGE()=fr);
341                 goto s|restart;
342         };
343         1000 => {
344                 goto default|s|1;
345         };
346         500 => {
347                 Playback(demo-abouttotry);
348                 Dial(IAX2/guest@misery.digium.com/s@default);
349                 Playback(demo-nogo);
350                 goto s|instructions;
351         };
352         600 => {
353                 Playback(demo-echotest);
354                 Echo();
355                 Playback(demo-echodone);
356                 goto s|instructions;
357         };
358         _1234 => &std-exten-ael(${EXTEN}, "IAX2");
359         8500 => {
360                 VoicemailMain();
361                 goto s|instructions;
362         };
363         # => {
364                 Playback(demo-thanks);
365                 Hangup();
366         };
367         t => goto #|1;
368         i => Playback(invalid);
369 };
370
371 context default {
372
373 // By default we include the demo.  In a production system, you 
374 // probably don't want to have the demo there.
375
376         includes {
377                 ael-demo;
378         };
379 //
380 // Extensions like the two below can be used for FWD, Nikotel, sipgate etc.
381 // Note that you must have a [sipprovider] section in sip.conf whereas
382 // the otherprovider.net example does not require such a peer definition
383 //
384 //_41X. => Dial(SIP/${EXTEN:2}@sipprovider,,r);
385 //_42X. => Dial(SIP/user:passwd@${EXTEN:2}@otherprovider.net,30,rT);
386
387 // Real extensions would go here. Generally you want real extensions to be
388 // 4 or 5 digits long (although there is no such requirement) and start with a
389 // single digit that is fairly large (like 6 or 7) so that you have plenty of
390 // room to overlap extensions and menu options without conflict.  You can alias
391 // them with names, too, and use global variables
392
393 // 6245  => {
394 //              hint(SIP/Grandstream1&SIP/Xlite1,Joe Schmoe); // Channel hints for presence
395 //              Dial(SIP/Grandstream1,20,rt);                 // permit transfer
396 //        Dial(${HINT}/5245},20,rtT);                    // Use hint as listed
397 //        switch(${DIALSTATUS}) {
398 //        case BUSY:
399 //                Voicemail(b6245);
400 //                              return;
401 //        default:
402 //                Voicemail(u6245);
403 //                              return;
404 //        };
405 //       };
406
407 // 6361 => Dial(IAX2/JaneDoe,,rm);                // ring without time limit
408 // 6389 => Dial(MGCP/aaln/1@192.168.0.14);
409 // 6394 => Dial(Local/6275/n);                    // this will dial ${MARK}
410
411 // 6275 => &ael-stdexten(6275,${MARK});           // assuming ${MARK} is something like Zap/2
412 // mark => goto 6275|1;                          // alias mark to 6275
413 // 6536 => &ael-stdexten(6236,${WIL});            // Ditto for wil
414 // wil  => goto 6236|1;
415 //
416 // Some other handy things are an extension for checking voicemail via
417 // voicemailmain
418 //
419 // 8500 => {
420 //                      VoicemailMain();
421 //                      Hangup();
422 //             };
423 //
424 // Or a conference room (you'll need to edit meetme.conf to enable this room)
425 //
426 // 8600 => Meetme(1234);
427 //
428 // Or playing an announcement to the called party, as soon it answers
429 //
430 // 8700 => Dial(${MARK},30,A(/path/to/my/announcemsg))
431 //
432 // For more information on applications, just type "show applications" at your
433 // friendly Asterisk CLI prompt.
434 //
435 // 'show application <command>' will show details of how you
436 // use that particular application in this file, the dial plan. 
437 //
438 };