FreePBX module development: struttura corretta per sopravvivere agli update

Come creare un modulo FreePBX branded che non viene sovrascritto dagli aggiornamenti del sistema. Struttura corretta, hook e deploy.

Il problema

Chiunque abbia lavorato su FreePBX conosce la frustrazione di personalizzare l'interfaccia o aggiungere funzionalità, per poi vederle scomparire al primo fwconsole ma upgradeall. La soluzione è creare un modulo vero e proprio, non modificare i file core.

Struttura di un modulo FreePBX

Un modulo FreePBX ha questa struttura minima:

custompbx/
├── module.xml
├── install.php
├── uninstall.php
├── page.custompbx.php
└── views/
    └── main.php

module.xml

Il file più importante — definisce il modulo agli occhi del framework:

<?xml version="1.0" encoding="UTF-8"?>
<module>
    <rawname>custompbx</rawname>
    <name>Custom PBX</name>
    <version>1.0.0</version>
    <publisher>Your Company</publisher>
    <license>MIT</license>
    <category>Admin</category>
    <description>Modulo branded per FreePBX</description>
</module>

install.php

Eseguito all'installazione/aggiornamento del modulo:

<?php
function custompbx_install() {
    // Crea tabelle DB se necessario
    // Registra menu item
    return true;
}

function custompbx_uninstall() {
    return true;
}

page.custompbx.php

La pagina principale del modulo, inclusa automaticamente da FreePBX quando si accede al menu:

<?php
// Verifica permessi
if (!isset($amp_conf)) {
    die('No direct access');
}

$view = new \FreePBX\Html();
// Logica della pagina

Registrare una voce di menu

Per aggiungere il modulo al menu di navigazione, aggiungi in module.xml:

<menuitems>
    <custompbx>
        <name>Custom PBX</name>
        <category>Admin</category>
        <menuindex>0</menuindex>
    </custompbx>
</menuitems>

Deploy e attivazione

# Copia il modulo nella directory corretta
cp -r custompbx/ /var/www/html/admin/modules/

Installa tramite fwconsole

fwconsole ma install custompbx

Ricarica FreePBX

fwconsole reload

Configurazione trunk Messagenet

Un esempio pratico: la configurazione del trunk SIP Messagenet all'interno del modulo per auto-configurare i parametri corretti.

I parametri critici per Messagenet:

  • Host: sip.messagenet.it
  • Porta: 5060
  • Username: il numero SIP assegnato
  • Match: indirizzo IP del gateway Messagenet (non usare username matching)
[messagenet-trunk]
type=peer
host=sip.messagenet.it
port=5060
username=XXXXXXXX
secret=PASSWORD
insecure=port,invite
nat=yes
context=from-trunk
qualify=yes

Conclusioni

La chiave è sempre lavorare dentro il framework, mai modificare i file core. Un modulo correttamente strutturato sopravvive a qualsiasi aggiornamento e può essere distribuito su più installazioni FreePBX identiche.

← Articolo precedente
Dialer SaaS multi-tenant con PJSUA2 e FastAPI: architettura e pitfalls
Articolo successivo →
Come ho costruito un ISP siciliano da zero
← Torna al blog