Package: asterisklint
Asterisk PBX configuration syntax checkerAsteriskLint is a suite of tools to check syntax of your Asterisk PBX
configuration files.Alright, enough talking. Some examples please!For an online example seehttps://asterisklint.osso.pub/. For CLI
examples, keep reading:Invocation$asterisklintusage: asterisklint [-h] COMMAND
asterisklint: error: the following arguments are required: COMMAND$asterisklintlsbuiltin:
  ls                    List available commands.

/usr/lib/python/dist-packages:
  dialplan-check        Do sanity checks on dialplan. Takes 'extensions.conf'
                        as argument. Suppress error classes using ALINT_IGNORE.
  dialplan-show         Show dialplan like Asterisk does with CLI command
                        "dialplan show". Takes 'extensions.conf' as argument.
  func_odbc-check       Do sanity checks on func_odbc.conf. Takes
                        'func_odbc.conf' as argument. Suppress error classes
                        using ALINT_IGNORE.
  ident-scan            Report similarly named contexts, labels and variables.
                        Takes 'extensions.conf' as argument. All parse errors
                        are suppressed.
  modules-show          Show which modules, apps and functions are used by the
                        dialplan. Takes 'extensions.conf' as argument.

Place custom commands in ~/.asterisklint/asterisklint/commands.Take this little dialplan snippet, that we’ll callextensions.conf:[default]
exten => _8[2-9]x,1,NoOp
 same => n,GoSub(somewhere,s,1(argument1,argument2)
 same => n,Payback(audiofile)Now run thedialplan-checkcommand on it:$ALINT_IGNORE=H_DP_asterisklintdialplan-checkextensions.confextensions.conf:2 H_PAT_NON_CANONICAL: pattern '_8[2-9]x' is not in the canonical form '_8NX'
extensions.conf:3 W_APP_BAD_CASE: app 'GoSub' does not have the proper Case 'Gosub'
extensions.conf:3 W_APP_BALANCE: app data '1(argument1,argument2' looks like unbalanced parentheses/quotes/curlies
extensions.conf:4 E_APP_MISSING: app 'Payback' does not exist, dialplan will halt here!
extensions.conf:3 E_DP_GOTO_NOCONTEXT: context not found for goto to somewhere, s, 1It had a lot to complain about that little snippet. But it was right. We
even suppressed two hints about a missing[general]and[global]context usingALINT_IGNORE.Not everything it checks is documented, and it does not check everything
that we like yet. But it’s a start. Bug reports are welcome. Feature requests
prefer to be accompanied by a patch :-)Try outmodules-showif you useautoload=noin yourmodules.conf.All commands show help if asked:$asterisklintmodules-show--helpusage: asterisklint modules-show [-h] [--func-odbc FUNC_ODBC_CONF]
                                 [EXTENSIONS_CONF]

Show which modules, apps and functions are used by the dialplan. Useful when
you use autoload=no in your modules.conf. Beware that you do need more modules
than just these listed.

positional arguments:
  EXTENSIONS_CONF       path to extensions.conf

optional arguments:
  -h, --help            show this help message and exit
  --func-odbc FUNC_ODBC_CONF
                        path to func_odbc.conf, will be read automatically if
                        found in same the same dir as extensions.conf; set
                        empty to disableInstallationInstallation is a matter ofpython3 setup.py install. Or, for more
convenience, install a PyPI uploaded version throughpip3(1):$sudopip3installasterisklint...
Successfully installed asterisklintThedialplan-checkcomes in handy as a git commit hook, for example.git/hooks/pre-commit:#!/bin/shexportALINT_IGNORE=# adjust as neededasterisklintdialplan-checkPATH/TO/extensions.confret=$?iftest$ret-ne0;thenecho>&2echo'One or more dialplan syntax errors. Please fix before committing.'>&2exit$retfiexit0TODOExpression parsing.Web: state is kept between requests:on 500-error, the next user may get older errors (because of the
messagedef singleton)the BackGround/Background hack is stored between requestsLog/store Set’d variables and compare against Read variables. Also log
variables Set through the ARRAY() function. (And HASH?)Fix various includes issues:Recursive #includes probably make asterisklint run out of stack.Add checks for recursive dialplan-includes.Scan for missing dialplan-includes.Trim CALLERID match (as used in FreePBX dialplan).Func_odbc parsing improvements:check for missing synopsis/syntax (compare syntax to ARGn count)check for correct usage of VAL (write only) and ARG and missing SQL_ESCyield the odbc functions instead of contexts like it does now(See more in func_odbc.py.)Addapp-checkcommand to do dialplan checks of individual lines.Addexpr-checkcommand to do expression ($[...]) checks.
E.g. add:exten => X!,1,Set(boolean=$["" <555> = 1234])
; Set(boolean=$[${CALLERID(all)} = 1234])
; incorrectly using 'all', should use 'num'
==> syntax error, unexpected '=', expecting '-' or '!' or '(' or '<token>'Allow multiline variables using += (key=val; key+=more-val).Investigate whether exten=>s,n(label)… exten=>s,label+10… is valid.For the Goto/Gosub-visiting:Attempt to match contexts by regex if there are $VARs involved?Allow a “noqa” style exceptions to be placed in a comment?Improve documentation as needed.Before 1.0, start adding versioning – including semver – so users can
depend on a stable API from their custom scripts. Also version the scripts
(commands) so they won’t talk to older/newer libs if that poses a problem.BUGSThe library is very much in flux. Don’t expect it to stabilize any time
soon. Pay attention to versions!Multiline comments (;--...--;) are unsupported. Does anyone use those?Limits aren’t checked (dialplan lines are limited at 255 or 8191 bytes
for LOW_MEMORY and normal mode respectively).The library/suite is Python3 only. Right now the effort to make it Python2
compatible is larger than the demand. In the future Python2 compatibility
will become even less relevant.AuthorWalter Doekes, OSSO B.V. 2015-20200.4.3 (2022-10-24)Bug fixes:Don’t choke on slices with variable start/length.Improvements:Added BridgeAdd, BridgeWait, DBdeltree, Bridge, ODBCFinish,
PJSIP_DIAL_CONTACTS, PJSIP_DTMF_MODE, PJSIP_MEDIA_OFFER,
PJSIP_MOH_PASSTHROUGH, PJSIP_PARSE_URI, PJSIP_SEND_SESSION_REFRESH,
BASE64_ENCODE, BASE64_DECODE, DEVICE_STATE, HINT, DIALGROUP,
DIALPLAN_EXISTS, VALID_EXTEN, ODBC_FETCH, SQL_ESC, TALK_DETECT.0.4.2 (2020-02-19)Bug fixes:Don’t choke on too many Gosub arguments.Fixes for various python 3 versions.Improvements:Added PJSIP_HEADER, PJSIP_AOR, PJSIP_CONTACT, PJSIP_ENDPOINT.0.4.1 (2018-10-10)Bug fixes:Cope with ${vars} in FUNC() arguments.Fix typo’s in func_odbc-check.Speedup in dialplan goto-parsing.Unbreak custom command support.Improvements:Add missing app_milliwatt, app_mysql, app_originate,
func_audiohookinherit, func_volume_register.Add preliminary func_odbc-annotate command; not feature complete.Add the (now obsolete) vg.py contrib command which alters certain file
reading functions so a slightly different syntax is accepted.Check applications called in ExecIf().0.4.0 (2017-04-05)Bug fixes:When doing dialplan-file mutations, operate on the symlink target
instead of replacing the symlink.Don’t install README files into /usr, but in
/usr/share/doc/asterisklint (or with a different prefix).Also search in included contexts for priority labels.Improvements:Add various apps:
- Authenticate, ControlPlayback, PickupChan
- PickupOld1v4 (a workaround, see ASTERISK-26464)
- VoiceMailPlayMsg, VMSayName,
- ContinueWhile, EndWhile, ExitWhile, While,
- AGI, DeadAGI, EAGI,
- StopMusicOnHoldAdd various functions:
- DB, DB_EXISTS, DB_KEYS, DB_DELETE,
- MD5, TIMEOUT
- LOCAL, LOCAL_PEEK, STACK_PEEKAdd initial checks of function parameters: nothing more than the
parentheses check we already used on undefined apps.Add application Set() support. Add function SET() support. This also
enables checking calls to writable functions.Allow both the “BackGround” and “Background” spelling, as long as
you choose one consistently.A bunch of refactoring to make BetterCodeHub happy. If you’ve made
custom subcommands, look at the MainBase class.Add test with Asterisk 13 sample dialplan as input.Add web frontend into repository.0.3.0 (2016-06-08)Add preliminary Goto/Gosub scanning: the dialplan-check now tries to
find non-existent goto destinations. New error classes:
E_DP_GOTO_CONTEXT_NOLABEL, E_DP_GOTO_NOCONTEXT, E_DP_GOTO_NOLABEL,
W_DP_GOTO_CONTEXT_NOEXTEN.Add preliminary app argument checking. New error classes:
E_APP_ARG_IFCONST, E_APP_ARG_IFEMPTY, E_APP_ARG_SYNTAX.Add new command: ident-scan. It lists used contexts, labels and
variables and does a poor attempt at finding typo’s by comparing
them against each other.Add Asterisk apps: NoCDR, Record.The commands taking a path to extensions.conf now default to scanning
for it in the current directory.Python3.5 testcase compatibility fix.0.2.1 (2016-01-29)Don’t look in __init__ for custom commands.0.2.0 (2016-01-29)Add partial func_odbc checking.Add new command: func_odbc-checkDo func_odbc checks for modules-show and dialplan-show, so you don’t
get flooded with E_FUNC_MISSING errors if you use func_odbc.Fix a few variable/dialplan parsing bugs, improve some.0.1.0 (2016-01-15)Initial release.The following commands are available:
dialplan-check, dialplan-show, modules-show