Il problema
Configurando un centralino 3CX per l'uso con VoIP fornito da TIM mi sono imbattuto in un problema: le chiamate esterne arrivavano per qualche ora, poi cadevano nel vuoto.
Dopo estenuanti ricerche e un numero imprecisato ma molto alto di imprecazioni, ho scoperto che forzando la ri-registrazione (refresh) del trunk SIP, le chiamate tornavano ad arrivare.
Purtroppo però 3CX di default non ha un meccanismo di auto-refresh del trunk se questo appare già registrato, e numerose richieste da parte dell'utenza che chiedevano questa funzionalità sono cadute nel vuoto.
Ho quindi preparato un semplice script Bash da installare sul centralino che fa proprio questo.
La soluzione
#!/bin/bash
# Configuration begin
PBXUSER="UTENTE_DEL_CENTRALINO"
PBXPASS="PASSWORD"
IP="IP_DEL_PBX"
TRUNK="10000"
# Configuration end
LOGIN=$(curl --silent -c /tmp/token.txt -d '{"Username":"'$PBXUSER'","Password":"'$PBXPASS'"}' -H "Content-Type: application/json" -X POST http://$IP/api/login)
if [ "$LOGIN" == "AuthSuccess" ]; then
echo "Login successful, attempting registration"
REFRESH=$(curl --silent -d '["'$TRUNK'"]' -H "Content-Type: application/json" -X POST http://$IP/api/TrunkList/refreshRegistration --cookie /tmp/token.txt)
echo "Done refreshing";
else
echo "Login failed, check credentials and IP"
fi
rm /tmp/token.txt
Istruzioni per l'installazione
Per prima cosa, creiamo un utente che utilizzeremo solo per fare il refresh della pagina.
Andiamo quindi in Utenti → Nuovo → Diritti e spuntiamo queste opzioni:
- Consenti l'accesso alla 3CX Console di Gestione
- Gestire solamente il proprio interno
- Amministrazione Trunk SIP
Poi facciamo il login tramite SSH a 3CX: ssh root@IP_DI_3CX
.
Creiamo un file chiamato refresh.sh
(ad esempio: nano refresh.sh
) e incolliamo il contenuto dello script visto più sopra.
Modifichiamo debitamente le variabili a seconda delle nostre necessità. Ecco una breve spiegazione:
PBXUSER
: L'utente che abbiamo creato (è il numero dell'interno)PBXPASS
: La password dell'utente che abbiamo creatoIP
: L'IP di 3CXTRUNK
: L'ID del Trunk da riregistrare. Se ne avete solo uno sarà 10000, altrimenti saranno numeri progressivamente successivi a 10000 (10001 il secondo, etc.)
Installiamo curl
con apt install curl -y
Creiamo una riga in crontab con crontab -e
che esegua ripetutamente il file. La riga dovrà contenere:
0 0 * * * /root/refresh.sh
Questo aggiornerà la registrazione del trunk ogni giorno (naturalmente, si possono anche usare altri valori).
ATTENZIONE: al refresh le chiamate verranno disconnesse!
Salviamo e usciamo.
Aspettiamo 5 minuti e notiamo se il trunk si riregistra.
Fatto!