PearlPBX2
Features

Everything you need to manage an Asterisk PBX

From SIP transports to phone provisioning — each section below describes a real capability of the current PearlPBX2 release.

Telephony core: SIP, trunks, WebRTC

  • NAT-aware UDP/TCP/TLS/WSS transports.
  • SIP users with plaintext/MD5 authentication and per-user overrides.
  • WebRTC endpoints are generated alongside regular SIP users.
  • Trunks with two-way registration, IP match= lists, and header-based identify for gateways where several lines share one IP.
  • TLS certificates are stored in the database and written to disk on apply.
  • Trunk groups are dialed through a FastAGI dial-trunk-group handler with automatic failover and retry within the group.
  • Prefix-based routing tables are assigned to SIP users and trunks.

AEL dialplan editor and validator

  • Contexts, extensions, macros, and global variables in AEL syntax.
  • A custom validator (core/validators.py, 1000+ lines) parses if/else/while/for/switch block structure, balances braces and quotes with ${} awareness, and checks every application call against a whitelist of ~150 Asterisk applications — before the dialplan ever reaches the system.
  • Extension patterns are checked for correct Asterisk syntax and rendered sorted by specificity: exact matches before wildcards.
  • IVR menus are built right in this editor using Background, WaitExten, and Goto.

Call queues

  • Ring strategy, service level, timeouts, weight, wrap-up time, autopause — all configured in the admin, no manual queues.conf editing.
  • A full announcement block — 11 configurable prompts, queue-position and hold-time announcements.
  • Queue members, time-based priority-escalation rules, global settings (persistent members, shared last-call).

Music on hold, sound files, call recording

  • Directory- or playlist-based Music on Hold classes — file uploads or URLs.
  • A library of uploaded sound prompts.
  • Rule-based call recording: force-enable or force-disable by caller ID or destination, captured via MixMonitor.
  • Every recording is indexed by source, destination, and CDR uniqueid.

Apply Changes and access roles

  • Generates every configuration file, shows a preview before writing, versions it in the database.
  • A soft reload or a full Asterisk restart over AMI, with automatic backups before overwriting.
  • A built-in "Report Viewer" group — reports and list management (blocklist, allowlist, contacts) with no Django admin access.

Real-time dashboard

  • /dashboard/live/ — five tabs: Overview, Queues, PJSIP, Bridged, Channels.
  • KPI tiles, a live list of active calls and queues, actions from the UI: hang up a channel, pause or unpause an agent.
  • Agent state survives an Asterisk restart — the listener replays CoreShowChannels after reconnecting and rebuilds the picture.
  • /dashboard/ulines/ — a live monitor for call-parking slots.
  • The ws/asterisk/ WebSocket feed accepts either a Django session or a DRF API token, which lets you embed the dashboard inside your own CRM interface.

Reporting and analytics

  • 5 operational reports: a CDR filter with a direction classifier, a call-recordings browser, queue activity (5 sub-modes, including a "Lost and Found" report that matches abandoned callers against a later successful contact), a callback report, a routing-table report.
  • 8 Chart.js analytics reports: calls by queue, by destination number, by agent in queue, outbound calls by agent, missed calls by queue and by hour, call duration by agent, queue activity.
  • Every report is CSV-exportable and individually permission-gated.

Phone provisioning

  • TFTP-based auto-provisioning. Supported today: Grandstream GXP (8 models: GXP1200, GXP1610, GXP1620, GXP1625, GXP2130, GXP2135, GXP2160, GXP2170) and Cisco SPA (7 models: SPA112, SPA122, SPA232D, SPA504G, SPA508G, SPA514G, SPA525G2).
  • The configuration-generator architecture is extensible — new vendors are added through the same plugin mechanism.

Backend services

  • The dashboard listener subscribes to Asterisk AMI, handles ~20 event types, publishes to Redis for the WebSocket dashboard, delivers CRM webhooks, and sends Slack alerts for missed queue calls.
  • A FastAGI server (Twisted/StarPy, port 4573) — 8 dialplan handlers: list lookups, trunk-group dialing with failover, call recording, callback-request insertion, queue-status lookup, atomic parking-slot allocation via Redis-Lua.
  • A callback daemon polls PostgreSQL with row-level locking, originates calls over AMI, and supports multi-process concurrency.
  • Classic AGI scripts send Slack alerts for unmatched DIDs and missed calls.