Dial 911 and 933 from every extension, with an MLTS email notice

FeatureKlusterServices
Shipped
September 10, 2026 at 8:30 PM UTC
Author
Kamo
Commit
b650d56

Extensions could not reach 911: no outbound route matched 911 or 933, so from-internal fell through to bad-number and played "cannot be completed as dialed" without ever sending an INVITE. startup.sh now carries the dialplan half of the fix: - 911 and 933 are exact extensions in [from-internal-custom], the context the outbound gate lives in. An exact extension outranks every pattern in its context, so the gate cannot capture them, and they skip the [kamo-outbound-allowed] list: every extension can dial them with no prefix. Each goes straight on to from-internal-additional, where FreePBX's own outbound routing takes over. - [kamo-e911-notify] runs before the call is routed and starts kamo_e911_notify.py detached, through TrySystem (System() hangs the channel up when its command cannot run), with every argument reduced to digits by FILTER. - kamo_e911_notify.py mails the platform administrator mailboxes through **************** with the time, the extension and its name, the callback number and the location conveyed to the 911 center. It refuses any recipient outside kamocrm.com, retries a relay outage three times and logs every outcome to **************** The pod's own postfix is not used: it relays via smtp.gmail.com and its queue is stuck. The notifier is rewritten on every boot; the dialplan block is appended once under its own grep guard, like the attendant block. The routing half is FreePBX data, outside this repo, and is applied on k1m1: outbound route Emergency911 (emergency_route=YES, patterns 911 and 933, trunk 1 (the Telnyx trunk), first in sequence, override CID +19492989960) and devices.emergency_cid +19492989960 on all 22 extensions. freepbx/tests/test_e911.py (stdlib unittest) checks that startup.sh parses as bash and as YAML, models Asterisk's extension selection to show 911 and 933 bypass the gate while 10-digit, 11-digit and 011 numbers still reach it, pins the notify hook to NoOp/TrySystem/Return with filtered arguments, and drives the notifier against a fake relay.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing