- 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.