Repository navigation
NethVoice: handle missing device dial strings with upstream FreePBX Core #8217
Description
Parent: #7570
Preserve this NethVoice behavior while using the unmodified upstream FreePBX Core module. The upgrade checkout installs Core 17.0.18.54. The old nethesis_nv8 fork is based on Core 16.0.68.40; comparing it with the matching upstream 16 release isolates the Nethesis changes from unrelated upstream updates. The obsolete Flexisip transport change is excluded from this migration.
Problem and original purpose
A stale device reference must not stop valid phones from ringing. The fork skips devices whose DEVICE/<device>/dial value is empty, preventing empty components in a multi-device dial string, for example PJSIP/device-a&&PJSIP/device-b.
Original change: 66d11c02 in nethesis/freepbx-core, originally authored in 2019 and carried into the NS8 fork in 2023.
Upstream assessment
Core 17.0.18.54 still lacks the empty-value guard in dialparties.agi. It skips PJSIP devices without registered contacts, which is a different condition. The issue depends on stale or incomplete device references; occurrence on the upgraded stack has not been confirmed by live calls.
Enabling the experimental DIALPARTIESDIALPLAN setting is not a sufficient replacement: its generated dialplan also appends empty device components.
Implementation plan
- Reproduce missing-device cases on the upgraded stack and establish their effect on valid devices and dial-string generation.
- Submit the minimal empty-value guard upstream and consume an upstream release containing the fix when available.
- Clean stale references during extension deletion and migration using the supported FreePBX device model.
- If protection is required before an upstream release, add a small module-owned predial sanitizer through the supported ring-all and hunt hooks. Sanitize only the destination components, preserving timers, options and long dial strings, and handle an entirely empty destination list cleanly.
- Include Follow Me and the relevant ring strategies in validation. Avoid copying or patching the entire Core AGI script.
Acceptance criteria
- Missing devices at the beginning, middle and end of a device list do not introduce empty dial destinations.
- Valid devices still ring in mixed valid/missing lists.
- An entirely missing device list follows the intended unavailable/no-answer path.
- Ring-all, hunt and Follow Me behavior, timers and confirmation options remain correct.
- Deletion and migration cleanup preserve valid references.
- Protection remains effective after reload, restart and backup/restore with unmodified upstream Core.
- If reproduction shows no functional defect, record the evidence and remove the legacy workaround requirement.
References
Metadata
Metadata
Assignees
Labels
Type
Projects
- StatusShow more project fieldsTesting
Activity
Stell0 commentedon Oct 9, 2026
Test
Test Case 1
missing_device_dial_test.php: missing device first/middle/last, empty lists and confirmation paths.Test Case 2
Test Case 3
DIALPARTIESDIALPLAN, repeat Test Case 2, then restore the setting.Completed checks passed on
nethvoice58withpr-1035.1092-1.89f806d: valid sibling answered after a missing first device; all-missing group ended with no active channels.Draft PR: nethesis/ns8-nethvoice#1035.
fix(dial): Skip missing device destinations