I want to explain a problem that apparently exists in current implementations of Asterisk and FreePBX (and by extension, all distributions based on those pieces of software).

Let’s say you have several extensions on your system and many, if not all of them, have a specific “trunk” associated with that extension. It may be a provider account or a Google Voice account that’s used exclusively by that extension. Routing INCOMING calls is usually not difficult at all, you simply use the trunk’s DID in an Inbound Route and then route the calls from that DID directly to the desired extension. However, OUTBOUND is another matter. You have to create an Outbound Route, and in that route you have to put your dial patterns and use the /extension suffix. It can still be difficult to set up the dial patterns the way you need them. In 2.8 and later it is much harder because of the individual boxes for each segment of each pattern.

Let’s say you want certain extensions to only be able to call numbers in U.S. area codes, but each of those extensions has its own trunk. And let’s say your extensions are numbered 1000 through 1099. Oh, and you want to support both 10 and 11 digit dialing. So in your outbound route for extension 1000, you might have a list of patterns like this (please scroll down to the end of this long list — it’s only about 600 lines!):

1201NXXXXXX/1000

1202NXXXXXX/1000

1203NXXXXXX/1000

1205NXXXXXX/1000

1206NXXXXXX/1000

1207NXXXXXX/1000

1208NXXXXXX/1000

1209NXXXXXX/1000

1210NXXXXXX/1000

1212NXXXXXX/1000

1213NXXXXXX/1000

1214NXXXXXX/1000

1215NXXXXXX/1000

1216NXXXXXX/1000

1217NXXXXXX/1000

1218NXXXXXX/1000

1219NXXXXXX/1000

1224NXXXXXX/1000

1225NXXXXXX/1000

1228NXXXXXX/1000

1229NXXXXXX/1000

1231NXXXXXX/1000

1234NXXXXXX/1000

1239NXXXXXX/1000

1240NXXXXXX/1000

1248NXXXXXX/1000

1251NXXXXXX/1000

1252NXXXXXX/1000

1253NXXXXXX/1000

1254NXXXXXX/1000

1256NXXXXXX/1000

1260NXXXXXX/1000

1262NXXXXXX/1000

1267NXXXXXX/1000

1269NXXXXXX/1000

1270NXXXXXX/1000

1274NXXXXXX/1000

1276NXXXXXX/1000

1281NXXXXXX/1000

1301NXXXXXX/1000

1302NXXXXXX/1000

1303NXXXXXX/1000

1304NXXXXXX/1000

1305NXXXXXX/1000

1307NXXXXXX/1000

1308NXXXXXX/1000

1309NXXXXXX/1000

1310NXXXXXX/1000

1312NXXXXXX/1000

1313NXXXXXX/1000

1314NXXXXXX/1000

1315NXXXXXX/1000

1316NXXXXXX/1000

1317NXXXXXX/1000

1318NXXXXXX/1000

1319NXXXXXX/1000

1320NXXXXXX/1000

1321NXXXXXX/1000

1323NXXXXXX/1000

1325NXXXXXX/1000

1327NXXXXXX/1000

1330NXXXXXX/1000

1331NXXXXXX/1000

1334NXXXXXX/1000

1336NXXXXXX/1000

1337NXXXXXX/1000

1339NXXXXXX/1000

1347NXXXXXX/1000

1351NXXXXXX/1000

1352NXXXXXX/1000

1360NXXXXXX/1000

1361NXXXXXX/1000

1364NXXXXXX/1000

1385NXXXXXX/1000

1386NXXXXXX/1000

1401NXXXXXX/1000

1402NXXXXXX/1000

1404NXXXXXX/1000

1405NXXXXXX/1000

1406NXXXXXX/1000

1407NXXXXXX/1000

1408NXXXXXX/1000

1409NXXXXXX/1000

1410NXXXXXX/1000

1412NXXXXXX/1000

1413NXXXXXX/1000

1414NXXXXXX/1000

1415NXXXXXX/1000

1417NXXXXXX/1000

1419NXXXXXX/1000

1423NXXXXXX/1000

1424NXXXXXX/1000

1425NXXXXXX/1000

1430NXXXXXX/1000

1432NXXXXXX/1000

1434NXXXXXX/1000

1435NXXXXXX/1000

1440NXXXXXX/1000

1442NXXXXXX/1000

1443NXXXXXX/1000

1458NXXXXXX/1000

1469NXXXXXX/1000

1470NXXXXXX/1000

1475NXXXXXX/1000

1478NXXXXXX/1000

1479NXXXXXX/1000

1480NXXXXXX/1000

1484NXXXXXX/1000

1501NXXXXXX/1000

1502NXXXXXX/1000

1503NXXXXXX/1000

1504NXXXXXX/1000

1505NXXXXXX/1000

1507NXXXXXX/1000

1508NXXXXXX/1000

1509NXXXXXX/1000

1510NXXXXXX/1000

1512NXXXXXX/1000

1513NXXXXXX/1000

1515NXXXXXX/1000

1516NXXXXXX/1000

1517NXXXXXX/1000

1518NXXXXXX/1000

1520NXXXXXX/1000

1530NXXXXXX/1000

1534NXXXXXX/1000

1539NXXXXXX/1000

1540NXXXXXX/1000

1541NXXXXXX/1000

1551NXXXXXX/1000

1559NXXXXXX/1000

1561NXXXXXX/1000

1562NXXXXXX/1000

1563NXXXXXX/1000

1567NXXXXXX/1000

1570NXXXXXX/1000

1571NXXXXXX/1000

1573NXXXXXX/1000

1574NXXXXXX/1000

1575NXXXXXX/1000

1580NXXXXXX/1000

1585NXXXXXX/1000

1586NXXXXXX/1000

1601NXXXXXX/1000

1602NXXXXXX/1000

1603NXXXXXX/1000

1605NXXXXXX/1000

1606NXXXXXX/1000

1607NXXXXXX/1000

1608NXXXXXX/1000

1609NXXXXXX/1000

1610NXXXXXX/1000

1612NXXXXXX/1000

1614NXXXXXX/1000

1615NXXXXXX/1000

1616NXXXXXX/1000

1617NXXXXXX/1000

1618NXXXXXX/1000

1619NXXXXXX/1000

1620NXXXXXX/1000

1623NXXXXXX/1000

1626NXXXXXX/1000

1630NXXXXXX/1000

1631NXXXXXX/1000

1636NXXXXXX/1000

1641NXXXXXX/1000

1646NXXXXXX/1000

1650NXXXXXX/1000

1651NXXXXXX/1000

1657NXXXXXX/1000

1660NXXXXXX/1000

1661NXXXXXX/1000

1662NXXXXXX/1000

1667NXXXXXX/1000

1669NXXXXXX/1000

1678NXXXXXX/1000

1681NXXXXXX/1000

1682NXXXXXX/1000

1701NXXXXXX/1000

1702NXXXXXX/1000

1703NXXXXXX/1000

1704NXXXXXX/1000

1706NXXXXXX/1000

1707NXXXXXX/1000

1708NXXXXXX/1000

1712NXXXXXX/1000

1713NXXXXXX/1000

1714NXXXXXX/1000

1715NXXXXXX/1000

1716NXXXXXX/1000

1717NXXXXXX/1000

1718NXXXXXX/1000

1719NXXXXXX/1000

1720NXXXXXX/1000

1724NXXXXXX/1000

1727NXXXXXX/1000

1731NXXXXXX/1000

1732NXXXXXX/1000

1734NXXXXXX/1000

1737NXXXXXX/1000

1740NXXXXXX/1000

1747NXXXXXX/1000

1754NXXXXXX/1000

1757NXXXXXX/1000

1760NXXXXXX/1000

1762NXXXXXX/1000

1763NXXXXXX/1000

1765NXXXXXX/1000

1769NXXXXXX/1000

1770NXXXXXX/1000

1772NXXXXXX/1000

1773NXXXXXX/1000

1774NXXXXXX/1000

1775NXXXXXX/1000

1779NXXXXXX/1000

1781NXXXXXX/1000

1785NXXXXXX/1000

1786NXXXXXX/1000

1801NXXXXXX/1000

1802NXXXXXX/1000

1803NXXXXXX/1000

1804NXXXXXX/1000

1805NXXXXXX/1000

1806NXXXXXX/1000

1808NXXXXXX/1000

1810NXXXXXX/1000

1812NXXXXXX/1000

1813NXXXXXX/1000

1814NXXXXXX/1000

1815NXXXXXX/1000

1816NXXXXXX/1000

1817NXXXXXX/1000

1818NXXXXXX/1000

1828NXXXXXX/1000

1830NXXXXXX/1000

1831NXXXXXX/1000

1832NXXXXXX/1000

1843NXXXXXX/1000

1845NXXXXXX/1000

1847NXXXXXX/1000

1848NXXXXXX/1000

1850NXXXXXX/1000

1856NXXXXXX/1000

1857NXXXXXX/1000

1858NXXXXXX/1000

1859NXXXXXX/1000

1860NXXXXXX/1000

1862NXXXXXX/1000

1863NXXXXXX/1000

1864NXXXXXX/1000

1865NXXXXXX/1000

1870NXXXXXX/1000

1872NXXXXXX/1000

1878NXXXXXX/1000

1901NXXXXXX/1000

1903NXXXXXX/1000

1904NXXXXXX/1000

1906NXXXXXX/1000

1907NXXXXXX/1000

1908NXXXXXX/1000

1909NXXXXXX/1000

1910NXXXXXX/1000

1912NXXXXXX/1000

1913NXXXXXX/1000

1914NXXXXXX/1000

1915NXXXXXX/1000

1916NXXXXXX/1000

1917NXXXXXX/1000

1918NXXXXXX/1000

1919NXXXXXX/1000

1920NXXXXXX/1000

1925NXXXXXX/1000

1928NXXXXXX/1000

1929NXXXXXX/1000

1931NXXXXXX/1000

1936NXXXXXX/1000

1937NXXXXXX/1000

1938NXXXXXX/1000

1940NXXXXXX/1000

1941NXXXXXX/1000

1947NXXXXXX/1000

1949NXXXXXX/1000

1951NXXXXXX/1000

1952NXXXXXX/1000

1954NXXXXXX/1000

1956NXXXXXX/1000

1970NXXXXXX/1000

1971NXXXXXX/1000

1972NXXXXXX/1000

1973NXXXXXX/1000

1978NXXXXXX/1000

1979NXXXXXX/1000

1980NXXXXXX/1000

1984NXXXXXX/1000

1985NXXXXXX/1000

1989NXXXXXX/1000

201NXXXXXX/1000

202NXXXXXX/1000

203NXXXXXX/1000

205NXXXXXX/1000

206NXXXXXX/1000

207NXXXXXX/1000

208NXXXXXX/1000

209NXXXXXX/1000

210NXXXXXX/1000

212NXXXXXX/1000

213NXXXXXX/1000

214NXXXXXX/1000

215NXXXXXX/1000

216NXXXXXX/1000

217NXXXXXX/1000

218NXXXXXX/1000

219NXXXXXX/1000

224NXXXXXX/1000

225NXXXXXX/1000

228NXXXXXX/1000

229NXXXXXX/1000

231NXXXXXX/1000

234NXXXXXX/1000

239NXXXXXX/1000

240NXXXXXX/1000

248NXXXXXX/1000

251NXXXXXX/1000

252NXXXXXX/1000

253NXXXXXX/1000

254NXXXXXX/1000

256NXXXXXX/1000

260NXXXXXX/1000

262NXXXXXX/1000

267NXXXXXX/1000

269NXXXXXX/1000

270NXXXXXX/1000

274NXXXXXX/1000

276NXXXXXX/1000

281NXXXXXX/1000

301NXXXXXX/1000

302NXXXXXX/1000

303NXXXXXX/1000

304NXXXXXX/1000

305NXXXXXX/1000

307NXXXXXX/1000

308NXXXXXX/1000

309NXXXXXX/1000

310NXXXXXX/1000

312NXXXXXX/1000

313NXXXXXX/1000

314NXXXXXX/1000

315NXXXXXX/1000

316NXXXXXX/1000

317NXXXXXX/1000

318NXXXXXX/1000

319NXXXXXX/1000

320NXXXXXX/1000

321NXXXXXX/1000

323NXXXXXX/1000

325NXXXXXX/1000

327NXXXXXX/1000

330NXXXXXX/1000

331NXXXXXX/1000

334NXXXXXX/1000

336NXXXXXX/1000

337NXXXXXX/1000

339NXXXXXX/1000

347NXXXXXX/1000

351NXXXXXX/1000

352NXXXXXX/1000

360NXXXXXX/1000

361NXXXXXX/1000

364NXXXXXX/1000

385NXXXXXX/1000

386NXXXXXX/1000

401NXXXXXX/1000

402NXXXXXX/1000

404NXXXXXX/1000

405NXXXXXX/1000

406NXXXXXX/1000

407NXXXXXX/1000

408NXXXXXX/1000

409NXXXXXX/1000

410NXXXXXX/1000

412NXXXXXX/1000

413NXXXXXX/1000

414NXXXXXX/1000

415NXXXXXX/1000

417NXXXXXX/1000

419NXXXXXX/1000

423NXXXXXX/1000

424NXXXXXX/1000

425NXXXXXX/1000

430NXXXXXX/1000

432NXXXXXX/1000

434NXXXXXX/1000

435NXXXXXX/1000

440NXXXXXX/1000

442NXXXXXX/1000

443NXXXXXX/1000

458NXXXXXX/1000

469NXXXXXX/1000

470NXXXXXX/1000

475NXXXXXX/1000

478NXXXXXX/1000

479NXXXXXX/1000

480NXXXXXX/1000

484NXXXXXX/1000

501NXXXXXX/1000

502NXXXXXX/1000

503NXXXXXX/1000

504NXXXXXX/1000

505NXXXXXX/1000

507NXXXXXX/1000

508NXXXXXX/1000

509NXXXXXX/1000

510NXXXXXX/1000

512NXXXXXX/1000

513NXXXXXX/1000

515NXXXXXX/1000

516NXXXXXX/1000

517NXXXXXX/1000

518NXXXXXX/1000

520NXXXXXX/1000

530NXXXXXX/1000

534NXXXXXX/1000

539NXXXXXX/1000

540NXXXXXX/1000

541NXXXXXX/1000

551NXXXXXX/1000

559NXXXXXX/1000

561NXXXXXX/1000

562NXXXXXX/1000

563NXXXXXX/1000

567NXXXXXX/1000

570NXXXXXX/1000

571NXXXXXX/1000

573NXXXXXX/1000

574NXXXXXX/1000

575NXXXXXX/1000

580NXXXXXX/1000

585NXXXXXX/1000

586NXXXXXX/1000

601NXXXXXX/1000

602NXXXXXX/1000

603NXXXXXX/1000

605NXXXXXX/1000

606NXXXXXX/1000

607NXXXXXX/1000

608NXXXXXX/1000

609NXXXXXX/1000

610NXXXXXX/1000

612NXXXXXX/1000

614NXXXXXX/1000

615NXXXXXX/1000

616NXXXXXX/1000

617NXXXXXX/1000

618NXXXXXX/1000

619NXXXXXX/1000

620NXXXXXX/1000

623NXXXXXX/1000

626NXXXXXX/1000

630NXXXXXX/1000

631NXXXXXX/1000

636NXXXXXX/1000

641NXXXXXX/1000

646NXXXXXX/1000

650NXXXXXX/1000

651NXXXXXX/1000

657NXXXXXX/1000

660NXXXXXX/1000

661NXXXXXX/1000

662NXXXXXX/1000

667NXXXXXX/1000

669NXXXXXX/1000

678NXXXXXX/1000

681NXXXXXX/1000

682NXXXXXX/1000

701NXXXXXX/1000

702NXXXXXX/1000

703NXXXXXX/1000

704NXXXXXX/1000

706NXXXXXX/1000

707NXXXXXX/1000

708NXXXXXX/1000

712NXXXXXX/1000

713NXXXXXX/1000

714NXXXXXX/1000

715NXXXXXX/1000

716NXXXXXX/1000

717NXXXXXX/1000

718NXXXXXX/1000

719NXXXXXX/1000

720NXXXXXX/1000

724NXXXXXX/1000

727NXXXXXX/1000

731NXXXXXX/1000

732NXXXXXX/1000

734NXXXXXX/1000

737NXXXXXX/1000

740NXXXXXX/1000

747NXXXXXX/1000

754NXXXXXX/1000

757NXXXXXX/1000

760NXXXXXX/1000

762NXXXXXX/1000

763NXXXXXX/1000

765NXXXXXX/1000

769NXXXXXX/1000

770NXXXXXX/1000

772NXXXXXX/1000

773NXXXXXX/1000

774NXXXXXX/1000

775NXXXXXX/1000

779NXXXXXX/1000

781NXXXXXX/1000

785NXXXXXX/1000

786NXXXXXX/1000

801NXXXXXX/1000

802NXXXXXX/1000

803NXXXXXX/1000

804NXXXXXX/1000

805NXXXXXX/1000

806NXXXXXX/1000

808NXXXXXX/1000

810NXXXXXX/1000

812NXXXXXX/1000

813NXXXXXX/1000

814NXXXXXX/1000

815NXXXXXX/1000

816NXXXXXX/1000

817NXXXXXX/1000

818NXXXXXX/1000

828NXXXXXX/1000

830NXXXXXX/1000

831NXXXXXX/1000

832NXXXXXX/1000

843NXXXXXX/1000

845NXXXXXX/1000

847NXXXXXX/1000

848NXXXXXX/1000

850NXXXXXX/1000

856NXXXXXX/1000

857NXXXXXX/1000

858NXXXXXX/1000

859NXXXXXX/1000

860NXXXXXX/1000

862NXXXXXX/1000

863NXXXXXX/1000

864NXXXXXX/1000

865NXXXXXX/1000

870NXXXXXX/1000

872NXXXXXX/1000

878NXXXXXX/1000

901NXXXXXX/1000

903NXXXXXX/1000

904NXXXXXX/1000

906NXXXXXX/1000

907NXXXXXX/1000

908NXXXXXX/1000

909NXXXXXX/1000

910NXXXXXX/1000

912NXXXXXX/1000

913NXXXXXX/1000

914NXXXXXX/1000

915NXXXXXX/1000

916NXXXXXX/1000

917NXXXXXX/1000

918NXXXXXX/1000

919NXXXXXX/1000

920NXXXXXX/1000

925NXXXXXX/1000

928NXXXXXX/1000

929NXXXXXX/1000

931NXXXXXX/1000

936NXXXXXX/1000

937NXXXXXX/1000

938NXXXXXX/1000

940NXXXXXX/1000

941NXXXXXX/1000

947NXXXXXX/1000

949NXXXXXX/1000

951NXXXXXX/1000

952NXXXXXX/1000

954NXXXXXX/1000

956NXXXXXX/1000

970NXXXXXX/1000

971NXXXXXX/1000

972NXXXXXX/1000

973NXXXXXX/1000

978NXXXXXX/1000

979NXXXXXX/1000

980NXXXXXX/1000

984NXXXXXX/1000

985NXXXXXX/1000

989NXXXXXX/1000

(Note the above does not include the “toll free” area codes nor Canadian area codes; I have separate routes for those).

Now THAT is bad enough, but then imagine having to duplicate this list for each of your extensions (changing only the extension number after the / character), because each will need its own outbound route in order to select its own trunk. In pre-2.8 versions of Asterisk, you could simply copy this list into a text editor, do a search and replace on the /1000 (replacing it with the next extension number), and paste the changed list into a new outbound route. However, with the new way of entering dial plans, you have to enter each line in each field manually, OR (in 2.9 and later) mess with .CSV files, which although easier than manual entry are still a lot harder to deal with than simple cut-and-paste.

But that is actually not the subject of this article; it just sets the stage for what I’m thinking SHOULD be part of Asterisk (or any other soft PBX that requires entering patterns in a similar manner, that is, one line for each pattern). There are actually TWO ways this could be handled, but neither will work at present, as far as I know.

**1) Stacking Routes**

Let’s suppose you had an outbound route that had all the USA patterns, but did NOT include the extension field. You could have it near the top of your Outbound Route list. And let’s say that you could make the destination of that trunk another “group” of outbound routes rather than a trunk. In that second group, you could have routes with just two patterns per extension:

1XXXXXXXXXX/1000

XXXXXXXXXX/1000

So the call would be effectively pre-screened in the first (primary) group of outbound routes, then sent to the second group (NOT part of the primary group) which would route by extension. That way, you’d only need ONE route with a list of USA patterns, one route with a list of Canada patterns, one route with a list of “toll free” patterns, etc. Each could go directly to a trunk, or to a secondary group of outbound routes.

I think Asterisk might actually be capable of doing something like this (though I’m uncertain of that), but FreePBX definitely is not. So some FreePBX users literally have THOUSANDS of lines of dial patterns in their configuration. Does this slow things down? You betcha, at least when making a configuration change! It takes *forever* for that darn frog to stop eating flies (if a real frog ate that many flies in that short a time, its gut would probably explode!).

**2) Macros**

Now here we have a solution that would likely need to be implemented in Asterisk itself. The basic idea is to allow macros in dial patterns. For example, you create a list such as the one above (but without the /extension field – just the number patterns only) and call it [pattern-USA]. Then in your outbound routes, you do something like this:

[pattern-USA]/1000Changing the extension as needed for each Outbound Route. As noted, this would require implementing this type of macro feature in Asterisk, but it would also necessitate a way to turn off the syntax checking in FreePBX, which is currently impossible.

EDIT: For another way to handle this that probably will work, see How to use the FreePBX [macro-dialout-trunk-predial-hook] macro and regular expressions to blacklist or whitelist outgoing calls on all trunks.

## Recent Comments