Gestion des messages vocaux d’information dans Asterisk et installation de cette Mise à jour
Oussama Hammami, 2010-07-19
Switzernet
Gestion des messages vocaux d’information dans Asterisk
Le channel-variable ${HANGUPCAUSE}
Le channel-variable ${DIALSTATUS}
Personnaliser les messages vocaux d’Asterisk
Enregistrement des clients sur Asterisk
Mise en œuvre du Patch d’Astrad
Configurer Log Rotate pour le log du script Liste-Asterisk.pl
Vérification de fonctionnement du Patch :
Le serveur RADIUS doit utiliser le H323-return-code pour fournir la raison pour laquelle l'autorisation à été rejeté. Cette VSA (Very Small Application) doit être présent dans tous les serveurs d'authentification RADIUS y compris PortaBilling. Le tableau ci-dessous donne la liste des valeurs valides H323-return-code, leur description, le prompt à jouer et l'action à exécuter par l’Asterisk.
Return Code |
Description |
Prompt Played |
Action |
Asterisk Prompt |
0 |
Authorization succeeded |
Service dependent prompt |
Continue the call |
free-calls or beep |
1 |
Invalid account |
Invalid |
Retry one more time |
invalid_account |
2 |
Invalid PIN |
Invalid |
Retry one more time |
wrong_passwd |
3 |
Account in use |
Account In Use |
Hang up |
in_use |
4 |
Zero balance |
Zero Balance |
Hang up |
zero_balance |
5 |
Card Expired |
Account Expired |
Hang up |
account_expired |
6 |
Credit limit in post-paid accounts |
Credit Limit |
Hang up |
credit_limit |
7 |
User deny |
Account blocked |
Hang up |
user_denied |
8 |
Service not available |
Technical Problem |
Hang up |
not_avail |
9 |
Destination number blocked |
Destination block |
Hang up |
no-route-exists-to-dest |
10 |
Number of retries exceeded |
Goodbye |
Hang up |
retries |
11 |
Invalid RADIUS argument |
Technical Problem |
Hang up |
cannot-complete-temp-error |
12 |
Insufficient balance |
Insufficient Fund |
Hang up |
insufficient_balance |
13 |
Toll-free call |
No prompts |
Continue the Call |
cannot-complete-temp-error |
14 |
Invalid card number |
Invalid |
Hang up |
cannot-complete-temp-error |
21 |
Invalid destination number |
Invalid |
Hang up |
cannot-complete-temp-error |
95,98,99 |
Database related errors |
Technical Problem |
Hang up |
cannot-complete-temp-error |
101~105 |
ANI related errors |
Technical Problem |
Hang up |
cannot-complete-temp-error |
111~115 |
Account related errors |
Technical Problem |
Hang up |
cannot-complete-temp-error |
< 0 |
Invalid return code |
Technical Problem |
Hang up |
cannot-complete-temp-error |
Absent |
Missing return code |
Technical Problem |
Hang up |
cannot-complete-temp-error |
Les causes de raccrochage d’Asterisk sont livrés par le dialplan dans le channel-variable ${HANGUPCAUSE} après l'exécution du la commande "dial" dans extensions.conf.
En SIP, nous avons une table de conversion qui converti les codes de retour SIP et Q.931 dans les deux sens. Il s'agit d'amélioration de la compatibilité de SIP/ISDN.
Ci dessous les codes actuels disponible dans l’Asterisk basés sur la spécification Q.850/Q.931:
ISUP Cause value |
SIP response |
||
1 |
unallocated number |
404 |
Not Found |
2 |
no route to network |
404 |
Not found |
3 |
no route to destination |
404 |
Not found |
16 |
normal call clearing |
---- |
BYE or CANCEL |
17 |
user busy |
486 |
Busy here |
18 |
no user responding |
408 |
Request Timeout |
19 |
no answer from the user |
480 |
Temporarily unavailable |
20 |
subscriber absent |
480 |
Temporarily unavailable |
21 |
call rejected |
403 |
Forbidden |
22 |
number changed (w/o diagnostic) |
410 |
Gone |
22 |
number changed (w/ diagnostic) |
301 |
Moved Permanently |
23 |
redirection to new destination |
410 |
Gone |
26 |
non-selected user clearing |
404 |
Not Found |
27 |
destination out of order |
502 |
Bad Gateway |
28 |
address incomplete |
484 |
Address incomplete |
29 |
facility rejected |
501 |
Not implemented |
31 |
normal unspecified |
480 |
Temporarily unavailable |
34 |
no circuit available |
503 |
Service unavailable |
38 |
network out of order |
503 |
Service unavailable |
41 |
temporary failure |
503 |
Service unavailable |
42 |
switching equipment congestion |
503 |
Service unavailable |
47 |
resource unavailable |
503 |
Service unavailable |
55 |
incoming calls barred within CUG |
403 |
Forbidden |
57 |
bearer capability not authorized |
403 |
Forbidden |
58 |
bearer capability not presently available |
503 |
Service unavailable |
65 |
bearer capability not implemented |
488 |
Not Acceptable Here |
70 |
only restricted digital avail |
488 |
Not Acceptable Here |
79 |
service or option not implemented |
501 |
Not implemented |
87 |
user not member of CUG |
403 |
Forbidden |
88 |
incompatible destination |
503 |
Service unavailable |
10 |
2 recovery of timer expiry |
504 |
Gateway timeout |
11 |
1 protocol error |
500 |
Server internal error |
12 |
7 interworking unspecified |
500 |
Server internal error |
Idem à H323, il ya des cas où un protocole d'initiation de session (SIP) d'appel peut échouer en raison d'un événement de défaillance interne.
La réponse d’Asterisk doit être analogue à la Leg IP (H.323)
Q.931 Cause Code |
Description |
SIP Event |
Description |
Asterisk Prompt |
0 |
Uninitialized. |
500 |
Internal server error. |
---- |
1 |
Unassigned number. |
410 |
Gone. |
Not-Found |
2 |
No route to the transit network. |
500 |
Internal server error. |
---- |
3 |
No route to the destination. |
404 |
Not found. |
Not-Found |
4 |
Send information tone. |
500 |
Internal server error. |
---- |
5 |
Misdialed trunk prefix. |
500 |
Internal server error. |
---- |
6 |
Unacceptable channel. |
500 |
Internal server error. |
---- |
7 |
Call awarded. |
500 |
Internal server error. |
---- |
8 |
Preemption. |
500 |
Internal server error. |
---- |
9 |
Preemption reserved. |
500 |
Internal server error. |
---- |
16 |
Normal. |
BYE |
Bye. |
---- |
17 |
Busy. |
486 |
Busy here. |
---- |
18 |
No response from the user. |
480 |
Temporarily unavailable. |
---- |
19 |
No answer from the user. |
480 |
Temporarily unavailable. |
---- |
20 |
Subscriber is absent. |
500 |
Internal server error. |
---- |
21 |
Call rejected. |
603 |
Decline. |
---- |
22 |
Number has changed. |
480 |
Temporarily unavailable. |
---- |
26 |
Selected user is clearing. |
500 |
Internal server error. |
---- |
27 |
Destination is out of order. |
404 |
Not found. |
Not-Found |
28 |
Invalid number. |
484 |
Address incomplete. |
ISUP28 |
29 |
Facility rejected. |
501 |
Not implemented. |
---- |
30 |
Response to status inquiry. |
500 |
Internal server error. |
---- |
31 |
Normal unspecified. |
404 |
Not found. |
Not-Found |
34 |
No circuit available. |
503 |
Service unavailable. |
all-outgoing-lines-unavailable |
35 |
Requested VPCI VCI is not available. |
500 |
Internal server error. |
---- |
36 |
VPCI VCI assignment failure. |
500 |
Internal server error. |
---- |
37 |
Cell rate is not available. |
500 |
Internal server error. |
---- |
38 |
Network is out of order. |
503 |
Service unavailable. |
all-outgoing-lines-unavailable |
39 |
Permanent frame mode is out of service. |
500 |
Internal server error. |
---- |
40 |
Permanent frame mode is operational. |
500 |
Internal server error. |
---- |
41 |
Temporary failure. |
503 |
Service unavailable. |
all-outgoing-lines-unavailable |
42 |
Switch is congested. |
503 |
Service unavailable. |
all-outgoing-lines-unavailable |
43 |
Access information has been discarded. |
500 |
Internal server error. |
---- |
44 |
No required circuit. |
503 |
Service unavailable. |
---- |
45 |
No VPCI VCI is available. |
500 |
Internal server error. |
---- |
46 |
Precedence call blocked. |
500 |
Internal server error. |
---- |
47 |
No resource available. |
503 |
Service unavailable. |
all-outgoing-lines-unavailable |
48 |
DSP error. |
500 |
Internal server error. |
---- |
49 |
QoS is not available. |
500 |
Internal server error. |
---- |
50 |
Facility is not subscribed. |
500 |
Internal server error. |
---- |
53 |
Outgoing calls barred. |
500 |
Internal server error. |
---- |
55 |
Incoming calls barred. |
603 |
Decline. |
---- |
57 |
Bearer capability is not authorized. |
501 |
Not implemented. |
---- |
58 |
Bearer capability is not available. |
501 |
Not implemented. |
---- |
62 |
Inconsistency in the information and class. |
500 |
Internal server error. |
---- |
63 |
Service or option not available. |
503 |
Service unavailable. |
---- |
65 |
Bearer capability is not implemented. |
501 |
Not implemented. |
---- |
66 |
Change type is not implemented. |
500 |
Internal server error. |
---- |
69 |
Facility is not implemented. |
500 |
Internal server error. |
---- |
70 |
Restricted digital information only. |
500 |
Internal server error. |
---- |
79 |
Service is not implemented. |
501 |
Not implemented. |
---- |
81 |
Invalid call reference value. |
500 |
Internal server error. |
---- |
82 |
Channel does not exist. |
500 |
Internal server error. |
---- |
83 |
Call exists and call ID in use. |
500 |
Internal server error. |
---- |
84 |
Call ID in use. |
500 |
Internal server error. |
---- |
85 |
No call suspended. |
500 |
Internal server error. |
---- |
86 |
Call cleared. |
500 |
Internal server error. |
---- |
87 |
User is not in CUG. |
603 |
Decline. |
---- |
88 |
Incompatible destination. |
404 |
Bad request. |
Not-Found |
90 |
CUG does not exist. |
500 |
Internal server error. |
cannot-complete-temp-error |
91 |
Invalid transit network. |
500 |
Internal server error. |
cannot-complete-temp-error |
93 |
AAL parameters not supported. |
500 |
Internal server error. |
cannot-complete-temp-error |
95 |
Invalid message. |
404 |
Bad request. |
Not-Found |
96 |
Mandatory Information Element (IE) is missing. |
500 |
Internal server error. |
cannot-complete-temp-error |
97 |
Message type is not implemented. |
500 |
Internal server error. |
cannot-complete-temp-error |
98 |
Message type is not compatible. |
500 |
Internal server error. |
cannot-complete-temp-error |
99 |
IE is not implemented. |
500 |
Internal server error. |
cannot-complete-temp-error |
100 |
Invalid IE contents. |
500 |
Internal server error. |
cannot-complete-temp-error |
101 |
Message in incomplete call state. |
500 |
Internal server error. |
cannot-complete-temp-error |
102 |
Recovery on timer expiration. |
408 |
Request timeout. |
cannot-complete-temp-error |
103 |
Non-implemented parameter was passed on. |
500 |
Internal server error. |
cannot-complete-temp-error |
110 |
Unrecognized parameter message discarded. |
500 |
Internal server error. |
cannot-complete-temp-error |
111 |
Protocol error. |
404 |
Bad request. |
Not-Found |
127 |
Internetworking error. |
500 |
Internal server error. |
cannot-complete-temp-error |
Contient une chaîne de texte signifiant le résultat de la dernière tentative de connexion :
DIALSTATUS |
Description |
Asterisk Prompt |
ANSWER |
en cas du succès. L'appelant a atteint l'appelé. |
---- |
BUSY |
numéro est occupé. |
---- |
NOANSWER |
Pas de réponse. L’appel a atteint son time-out de sonnerie. |
---- |
CANCEL |
appel est annulé. |
cancelled |
CONGESTION |
congestion. Ce statut est généralement un signe que le numéro composé n'est pas reconnu |
cannot-complete-otherend-error |
CHANUNAVAIL |
Channel indisponible. |
an-error-has-occured |
DONTCALL |
le mode de confidentialité, l'appelé a rejeté l'appel |
---- |
TORTURE |
le mode de confidentialité, l'appelé a choisi d'envoyer l'appelant à sa liste noire |
---- |
INVALIDARGS |
Erreur d'analyse des arguments de commande Dial |
---- |
La configuration des messages vocaux d’informations dans l’Asterisk se fait a travers le fichier ‘/etc/asterisk/extensions.conf’:
[globals]
RADIUS_Server=IP_Radius_Server(PortaBilling)
RADIUS_Secret=Password
RADIUS_Auth_Port=1812
RAIUS_Acct_Port=1813
Acct_Update_Timeout=60
NAS_IP_Address=IP_Asterisk_Server
II=0
max_duration=7200
[general]
static=yes
autofallthrough=yes
[forbidden]
exten => _X.,1,NoOp(-- No context for host ${SIPCHANINFO(recvip)} --)
exten => _X.,n,Hangup(21)
[h323-id]
exten => _X.,1,NoOp(-- H323 ID --)
exten => _X.,n,Set(ID=${SIP_HEADER(h323-conf-id)})
exten => _X.,n,ExecIf($[ "${ID}" = "" ],Set,ID=${RAND(300000000,2000000000)}-${RAND(300000000,2000000000)}-${RAND(300000000,2000000000)}-${RAND(300000000,2000000000)})
exten => _X.,n,Set(H323_ID=${ID})
exten => _X.,n,Set(H323_ID_HEX=${MATH(${CUT(ID,,1)}+0,hex)} ${MATH(${CUT(ID,,2)}+0,hex)} ${MATH(${CUT(ID,,3)}+0,hex)} ${MATH(${CUT(ID,,4)}+0,hex)})
exten => _X.,n,SIPAddHeader(h323-conf-id: ${H323_ID})
exten => _X.,n,Set(CDR(h323id)=${H323_ID_HEX})
exten => _X.,n,Return()
[auth-ip]
exten => _X.,1,NoOp(-- Inbound Authentication for cusromer IP --)
exten => _X.,n,Gosub(h323-id,${EXTEN},1)
exten => _X.,n,Set(CDR(accountcode)=${SIPCHANINFO(recvip)})
exten => _X.,n,Set(MYCALLID=${SIPCALLID})
exten => _X.,n,Set(CDR(CustomerType)=IpAuth)
exten => _X.,n,agi,agi-rad-auth-2.pl|Routing=SIP&AuthorizeBy=Account&Password=cisco&H323_ID=${H323_ID}&CustomerType=IpAuth
exten => _X.,n,Set(CDR(disconnect-reason)=${h323-return-code})
exten => _X.,n,Goto(rad-auth,${EXTEN},1)
;exten => _X.,n,Goto(routing,${EXTEN},1)
[auth-inbound]
exten => _X.,1,NoOp(-- Inbound Authentication --)
exten => _X.,n,Gosub(h323-id,${EXTEN},1)
exten => _X.,n,Set(CDR(accountcode)=${SIPCHANINFO(recvip)})
exten => _X.,n,Set(MYCALLID=${SIPCALLID})
exten => _X.,n,Set(CDR(CustomerType)=PeerAuth)
exten => _X.,n,agi,agi-rad-auth-2.pl|Routing=SIP&AuthorizeBy=Account&Password=cisco&H323_ID=${H323_ID}&CustomerType=PeerAuth
exten => _X.,n,Set(CDR(disconnect-reason)=${h323-return-code})
exten => _X.,n,Goto(rad-auth,${EXTEN},1)
;exten => _X.,n,Goto(routing,${EXTEN},1)
[sip-auth]
exten => _X.,1,NoOp(-- SIP Authentication --)
exten => _X.,n,Gosub(h323-id,${EXTEN},1)
exten => _X.,n,Set(SIP_Authorization=${SIP_HEADER(Proxy-Authorization)})
exten => _X.,n,Set(CDR(CustomerType)=SipAuth)
exten => _X.,n,agi,agi-rad-auth-2.pl|Routing=SIP&AuthorizeBy=SIP&IfFailed=DoNotHangup&H323_ID=${H323_ID}&CustomerType=SipAuth
exten => _X.,n,Set(CDR(accountcode)=${SIP_Username})
exten => _X.,n,Set(CDR(disconnect-reason)=${h323-return-code})
exten => _X.,n,Goto(rad-auth,${EXTEN},1)
le contexte [rad-auth] analyse la réponse du serveur Radius (RADIUS_Server).
Cette réponse est communiqué entre l’Asterisk et le script agi-rad-auth-2.pl a travers le variable ${h323-return-code}
[rad-auth]
exten => _X.,1,NoOp()
exten => _X.,n,GotoIf($[ ${h323-return-code} = 1 ]?invalid_account,${EXTEN},1)
exten => _X.,n,GotoIf($[ ${h323-return-code} = 2 ]?wrong_passwd,${EXTEN},1)
exten => _X.,n,GotoIf($[ ${h323-return-code} = 3 ]?in_use,${EXTEN},1)
exten => _X.,n,GotoIf($[ ${h323-return-code} = 4 ]?zero_balance,${EXTEN},1)
exten => _X.,n,GotoIf($[ ${h323-return-code} = 5 ]?account_expired,${EXTEN},1)
exten => _X.,n,GotoIf($[ ${h323-return-code} = 6 ]?credit_limit,${EXTEN},1)
exten => _X.,n,GotoIf($[ ${h323-return-code} = 7 ]?user_denied,${EXTEN},1)
exten => _X.,n,GotoIf($[ ${h323-return-code} = 8 ]?not_avail,${EXTEN},1)
exten => _X.,n,GotoIf($[ ${h323-return-code} = 9 ]?no-route-exists-to-dest,${EXTEN},1)
exten => _X.,n,GotoIf($[ ${h323-return-code} = 10 ]?retries,${EXTEN},1)
exten => _X.,n,GotoIf($[ ${h323-return-code} = 12 ]?insufficient_balance,${EXTEN},1)
exten => _X.,n,GotoIf($[ ${h323-return-code} = 0 | ${h323-return-code} = 13 ]?welcome-msg,${EXTEN},1)
exten => _X.,n,Goto(cannot-complete-temp-error,${EXTEN},1)
Dans le contexte [welcome-msg] on joue le message free-call si l’appel est gratuit (${h323-return-code} = 0) sinon une simple beep (${h323-return-code} = 13).
Pour éviter les problèmes causés par la succession du paquet SIP ‘ringing’ par le paquet ‘session progress’, on a limité ce message aux appels dont le ‘user_Agent’ est Linksys puisqu’il gère cette situation.
[welcome-msg]
exten => _X.,1,NoOp()
exten => _X.,n,GotoIf($[ ${XTOT} < 1 ]?telephone-number-temp-disconnected,${EXTEN},1)
exten => _X.,n,Set(User_Agent=${SIP_HEADER(User-Agent)})
exten => _X.,n,Set(CDR(User-Agent)=User-Agent:${User_Agent})
exten => _X.,n,GotoIf($[ "${User_Agent:0:7}" = "Linksys" ]?:nomsg)
exten => _X.,n,GotoIf($[ ${h323-return-code} = 13 ]?free-call,${EXTEN},1)
exten => _X.,n,GotoIf($[ ${h323-return-code} = 0 ]?normal-call,${EXTEN},1)
exten => _X.,n(nomsg),Goto(routing,${EXTEN},1)
[free-call]
exten => _X.,1,NoOp()
exten => _X.,n,Playback(free-calls-en,noanswer)
exten => _X.,n,Playback(free-calls-fr,noanswer)
exten => _X.,n,Goto(routing,${EXTEN},1)
[normal-call]
exten => _X.,1,NoOp()
exten => _X.,n,Playback(beep,noanswer)
exten => _X.,n,Goto(routing,${EXTEN},1)
Dans ce contexte [routing], on applique la liste de routage envoyée par le Billing via radius et analysé par le script agi-rad-auth-2.pl qui la transforme en une simulation d’une table à deux dimensions présentées par un ensemble des variables Asterisk ${XROUTE_${II}_${KK}}. http://switzernet.com/public/100427-follow-me-asterisk/
Le variable ${XTOT} est strictement supérieur à 1 seulement s’il s’agit d’un appel déviée (Follow Me est activé), dans cette cas en joue le message ‘next’ au moment de changement de la destination.
Le routage se fait à l’aide de deux boucles ‘loop’ imbriquées, en cas d’erreur on quitte le deuxième boucle ce qui implique la sortie du boucle supérieur si c’est un appel simple ou le passage à la destination suivante si c’est un appel déviée.
[routing]
exten => _X.,1,NoOp()
exten => _X.,n,Set(II=1)
exten => _X.,n(loop),NoOp()
exten => _X.,n,GotoIf($[ ${II} = 1 ]?SingleRoute)
exten => _X.,n,Playback(the-next,noanswer)
exten => _X.,n(SingleRoute),Set(KK=0)
exten => _X.,n,Set(SUM_ROUTE=${XSUM_${II}})
exten => _X.,n(loop1),NoOp()
exten => _X.,n,Set(TARGET_ROUTE=${XROUTE_${II}_${KK}})
exten => _X.,n,Set(TARGET_EXPIRE=${XEXP_${II}_${KK}})
exten => _X.,n,Set(TARGET_CLI=${XCLI_${II}_${KK}})
exten => _X.,n,Set(CALLERID(all)=${TARGET_CLI} <${TARGET_CLI}>)
exten => _X.,n,Set(MYDNID=${CUT(TARGET_ROUTE,@,1)})
exten => _X.,n,Set(VDNID=${CUT(MYDNID,/,2)})
exten => _X.,n,Dial(${IF($[ ${CUT(TARGET_ROUTE,@,2)} = ${NAS_IP_Address}]?${MYDNID}:${TARGET_ROUTE})},${TARGET_EXPIRE})
exten => _X.,n,Set(CDR(Hangupcause)=Hangupcause:${HANGUPCAUSE})
exten => _X.,n,Set(KK=$[${KK}+1])
exten => _X.,n,GotoIf($[ ${HANGUPCAUSE} = 1 | ${HANGUPCAUSE} = 3 | ${HANGUPCAUSE} = 27 | ${HANGUPCAUSE} = 28 | ${HANGUPCAUSE} = 31 | ${HANGUPCAUSE} = 88 | ${HANGUPCAUSE} >= 90 | "${DIALSTATUS}" = "BUSY" | "${DIALSTATUS}" = "NOANSWER" | "${DIALSTATUS}" = "CANCEL" ]?end1)
exten => _X.,n,GotoIf($[${KK} < ${SUM_ROUTE} ]?loop1:end1)
exten => _X.,n(end1),NoOp()
exten => _X.,n,Set(II=$[${II}+1])
exten => _X.,n,GotoIf($[${II} <= ${XTOT} ]?loop:end)
exten => _X.,n(end),NoOp()
exten => _X.,n,Goto(Error-Info,${EXTEN},1)
Dans ce contexte [Error-onfo], on joue les messages vocaux qui correspond à la valeur du retour du résultat de la dernière tentative de connexion (${HANGUPCAUSE} et ${DIALSTATUS}).
Ce contexte sera ignoré dans le cas d’un appel dévié.
[Error-Info]
exten => _X.,1,NoOp()
exten => _X.,n,GotoIf($[ ${XTOT} > 1 ]?Ter)
exten => _X.,n,GotoIf($[ ${HANGUPCAUSE} = 28 ]?ISUP28,${EXTEN},1)
exten => _X.,n,GotoIf($[ ${HANGUPCAUSE} = 1 | ${HANGUPCAUSE} = 3 | ${HANGUPCAUSE} = 27 | ${HANGUPCAUSE} = 31 | ${HANGUPCAUSE} = 88 | ${HANGUPCAUSE} = 95 | ${HANGUPCAUSE} = 111 ]?Not-Found,${EXTEN},1)
exten => _X.,n,GotoIf($[ ${HANGUPCAUSE} >= 90 ]?cannot-complete-temp-error,${EXTEN},1)
exten => _X.,n,GotoIf($[ "${DIALSTATUS}" = "CANCEL" ]?cancelled,${EXTEN},1)
exten => _X.,n,GotoIf($[ ${HANGUPCAUSE} = 34 | ${HANGUPCAUSE} = 38 | ${HANGUPCAUSE} = 41 | ${HANGUPCAUSE} = 42 | ${HANGUPCAUSE} = 47 ]?all-outgoing-lines-unavailable,${EXTEN},1)
exten => _X.,n,GotoIf($[ "${DIALSTATUS}" = "CHANUNAVAIL" ]?an-error-has-occured,${EXTEN},1)
exten => _X.,n,GotoIf($[ "${DIALSTATUS}" = "CONGESTION" ]?cannot-complete-otherend-error,${EXTEN},1)
;exten => _X.,n(Ter),SayNumber(${HANGUPCAUSE},c)
;exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n(Ter),Hangup(${HANGUPCAUSE})
[ISUP28]
exten => _X.,1,NoOp()
exten => _X.,1,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(incomplete-num-en,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(incomplete-num-fr,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(incomplete-num-en,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(incomplete-num-fr,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(incomplete-num-en,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(incomplete-num-fr,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[user_denied]
exten => _X.,1,NoOp()
exten => _X.,n,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(user_denied,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[cannot-complete-otherend-error]
exten => _X.,1,NoOp()
exten => _X.,n,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(cannot-complete-otherend-error,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(cannot-complete-otherend-error,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(cannot-complete-otherend-error,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[cancelled]
exten => _X.,1,NoOp()
exten => _X.,n,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(cancelled,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(cancelled,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(cancelled,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[not_avail]
exten => _X.,1,NoOp()
exten => _X.,n,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(not_avail,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[invalid_account]
exten => _X.,1,NoOp()
exten => _X.,n,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(invalid_account,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[wrong_passwd]
exten => _X.,1,NoOp()
exten => _X.,n,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(wrong_passwd,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[account_expired]
exten => _X.,1,NoOp()
exten => _X.,n,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(account_expired,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[credit_limit]
exten => _X.,1,NoOp()
exten => _X.,n,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(credit_limit,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[zero_balance]
exten => _X.,1,NoOp()
exten => _X.,n,wait(3)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(zero_balance,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[in_use]
exten => _X.,1,NoOp()
exten => _X.,n,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(simul-call-limit-reached,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(simul-call-limit-reached,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(in_use,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(simul-call-limit-reached,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[insufficient_balance]
exten => _X.,1,NoOp()
exten => _X.,n,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(insufficient_balance,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(insufficient_balance,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(insufficient_balance,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[retries]
exten => _X.,1,NoOp()
exten => _X.,n,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(retries,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(retries,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(retries,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[cannot-complete-temp-error]
exten => _X.,1,NoOp()
exten => _X.,n,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(cannot-complete-temp-error,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(cannot-complete-temp-error,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(cannot-complete-temp-error,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[no-route-exists-to-dest]
exten => _X.,1,NoOp()
exten => _X.,n,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(no-route-exists-to-dest,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(no-route-exists-to-dest,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(no-route-exists-to-dest,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(cld_blocked,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[Not-Found]
exten => _X.,1,NoOp()
exten => _X.,n,Set(NotFoundContext=Not-Found-${IF($[ ${CUT(TARGET_ROUTE,@,2)} = ${NAS_IP_Address}]?1:2)})
exten => _X.,n,Goto(${NotFoundContext},${EXTEN},1)
[Not-Found-1]
exten => _X.,1,NoOp()
exten => _X.,n,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(not-found-en,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(not-found-fr,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(not-found-en,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(not-found-fr,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(not-found-en,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(not-found-fr,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[Not-Found-2]
exten => _X.,1,NoOp()
exten => _X.,n,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(you-dialed-wrong-number,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(you-dialed-wrong-number,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(you-dialed-wrong-number,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[telephone-number-temp-disconnected]
exten => _X.,1,NoOp()
exten => _X.,n,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(the-number-u-dialed,noanswer)
exten => _X.,n,Playback(temp-disconnected,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(the-number-u-dialed,noanswer)
exten => _X.,n,Playback(temp-disconnected,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(the-number-u-dialed,noanswer)
exten => _X.,n,Playback(temp-disconnected,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[all-outgoing-lines-unavailable]
exten => _X.,1,NoOp()
exten => _X.,n,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(all-outgoing-lines-unavailable,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(all-outgoing-lines-unavailable,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(all-outgoing-lines-unavailable,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
[an-error-has-occured]
exten => _X.,1,NoOp()
exten => _X.,n,wait(1)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(an-error-has-occured,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(an-error-has-occured,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Playback(an-error-has-occured,noanswer)
exten => _X.,n,Playback(beeperr,noanswer)
exten => _X.,n,Hangup(${HANGUPCAUSE})
Vous pouvez créer vos propres messages vocaux d’Asterisk:
1- Enregistrer le message dans un fichier WAV (PCM sans compression),
2- Uploader ce dernier dans votre serveur Asterisk
3- Exécuter les commandes suivantes :
astrad# sox my_sound.wav -r 8000 -c 1 -s -w /root/prompt2astrad/my_sound.wav resample –ql
astrad# asterisk –r
> file convert /root/prompt2astrad/my_sound.wav wav /root/prompt2astrad/my_sound.sln
> file convert /root/prompt2astrad/my_sound.wav wav /root/prompt2astrad/my_sound.alaw
> file convert /root/prompt2astrad/my_sound.wav wav /root/prompt2astrad/my_sound.ulaw
> file convert /root/prompt2astrad/my_sound.wav wav /root/prompt2astrad/my_sound.gsm
> quit
astrad# cp my_sound.* /usr/share/asterisk/sounds/
astrad# chmod a+r /usr/share/asterisk/sounds/*
Pour écouter ou télécharger les messages vocaux cliquer ICI
L’échange d’information concernant l’enregistrement des clients entre le PortaBilling et PortaSip se fait via Radius, En effet pour que ce dernier puisse jouer les messages d’erreur indiquant au client que son mot de passe est incorrecte ou que le compte utilisé est inexistant, il accepte tous les demande d’enregistrement sauf qu’il ne met pas à jour la table ‘porta-sip.location’ dans le Master (PortaBilling), sa réponse SIP peut être ‘200 Auth Failed.’ ou ‘200 Ok’ mais c’est toujours 200 ce qui veut dire autorisée.
U 85.1.188.121:52128 -> 91.999.999.999:5060
REGISTER sip:fr2.youroute.net SIP/2.0.
Via: SIP/2.0/UDP 192.168.1.121:5060;branch=z9hG4bKc6e6ccef565035cd1e0c90f1f09a0a17;rport.
From: "41215500329" <sip:41215500329@fr2.youroute.net>;tag=155248053.
To: "41215500329" <sip:41215500329@fr2.youroute.net>.
Call-ID: 4257033876@192_168_1_121.
CSeq: 1033 REGISTER.
Contact: "41215500329" <sip:41215500329@192.168.1.121:5060>.
Max-Forwards: 70.
User-Agent: C450 IP010720000000.
Expires: 180.
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, INFO.
Content-Length: 0.
.
U 91.999.999.999:5060 -> 85.1.188.121:52128
SIP/2.0 401 Unauthorized.
Via: SIP/2.0/UDP 192.168.1.121:5060;branch=z9hG4bKc6e6ccef565035cd1e0c90f1f09a0a17;rport=52128;received=85.1.188.121.
From: "41215500329" <sip:41215500329@fr2.youroute.net>;tag=155248053.
To: "41215500329" <sip:41215500329@fr2.youroute.net>;tag=1759cd33c30ac90f1252a7b3a6bd2b65-c940.
Call-ID: 4257033876@192_168_1_121.
CSeq: 1033 REGISTER.
WWW-Authenticate: Digest realm="fr2.youroute.net", nonce="4c46b70455103276dfcfa96403b662009c8dce2f".
Server: Sip EXpress router (0.9.6 (i386/freebsd)).
Content-Length: 0.
.
U 85.1.188.121:52128 -> 91.999.999.999:5060
REGISTER sip:fr2.youroute.net SIP/2.0.
Via: SIP/2.0/UDP 192.168.1.121:5060;branch=z9hG4bK9ff87d568e0582fb249768b4b741769a;rport.
From: "41215500329" <sip:41215500329@fr2.youroute.net>;tag=155248053.
To: "41215500329" <sip:41215500329@fr2.youroute.net>.
Call-ID: 4257033876@192_168_1_121.
CSeq: 1034 REGISTER.
Contact: "41215500329" <sip:41215500329@192.168.1.121:5060>.
Authorization: Digest username="41215500329", realm="fr2.youroute.net", uri="sip:fr2.youroute.net", nonce="4c46b70455103276dfcfa96403b662009c8dce2f", response="15a0902a71c14c0e200c74ab47eddaf3".
Max-Forwards: 70.
User-Agent: C450 IP010720000000.
Expires: 180.
Allow: INVITE, ACK, CANCEL, BYE, OPTIONS, INFO.
Content-Length: 0.
.
---> RADIUS port 1812 <---
U 91.999.999.999:56008 -> 66.999.999.999:1812
.x...D......#...-.....41215500329..41215500329..
.41215500329....fr2.youroute.net.,.*4c46b70455103276dfcfa96403b662009c8dce2f....sip:fr2.youroute.net...
REGISTER....MD5."15a0902a71c14c0e200c74ab47eddaf3.......(....."call-id=4257033876@192_168_1_121..[y........
U 91.999.999.999:5060 -> 85.1.188.121:52128
SIP/2.0 200 OK.
Via: SIP/2.0/UDP 192.168.1.121:5060;branch=z9hG4bK9ff87d568e0582fb249768b4b741769a;rport=52128;received=85.1.188.121.
From: "41215500329" <sip:41215500329@fr2.youroute.net>;tag=155248053.
To: "41215500329" <sip:41215500329@fr2.youroute.net>;tag=1759cd33c30ac90f1252a7b3a6bd2b65-e6be.
Call-ID: 4257033876@192_168_1_121.
CSeq: 1034 REGISTER.
PortaBilling: available-funds:173.06 currency:CHF.
Contact: <sip:41215500329@85.1.188.121:52128>;expires=295.
Server: Sip EXpress router (0.9.6 (i386/freebsd)).
Content-Length: 0.
.
---> MySQL port 3306 <---
T 91.999.999.999:61902 -> 66.999.999.999:3306 [AP]
.....insert into location (username,contact,expires,q,callid,cseq,flags,user_agent,received,i_env,domain ) values ('41215500329','sip:41215500329@85.1.188.121:52128','2010-07-21 10:59:49',-1.00 ,'4257033876@192_168_1_121',1034,1,'C450 IP010720000000',NULL,1,'91.999.999.999')
Pour le moment on n’utilise pas Radius pour l’enregistrement mais c’est prévu pour la prochaine version.
Dans l’Asterisk chaque client doit être déclaré dans le fichier de configuration ‘db-friends,conf’ qui été crée par le script Liste-Asterisk.pl
Ce script télécharge la liste des clients crypté depuis le serveur Web spécifié dans le variable $http_file, le décryptage se fait en se basant sur la clé indiquée dans le fichier KeyAstr qui a la même valeur que le variable $KEY dans le fichier KeyAstr.php
Afin de garder la liste à jour, ce script doit être lancé par le cron chaque 10 minute.
Pour installer cette solution vous devez télécharge 100716-php-asterisk.zip
Editer les paramètres de connexion dans le fichier connection.php
Modifier la clé de cryptage dans les deux fichiers KeyAstr et KeyAstr.php.
Uploader le répertoire ‘Web Server’ dans votre serveur Web.
Le variable $http_file_1 dans le script Liste-Asterisk.pl doit contenir le lien de script PHP uploadé, si vous avez un deuxième serveur vous pouvez l’indique dans $http_file_2
Pour installer cette mise à jour d’Asterisk en commence par la création d’un répertoire de travaille qui on le nomme par exemple ‘100719-astrad-update’.
Téléchargez depuis ce dernier le ZIP qui contient les fichiers nécessaires pour ce patch :
astrad# mkdir /root/100719-astrad-update
astrad# cd /root/100719-astrad-update/
astrad:/100719-astrad-update# wget -q http://switzernet.com/2/public/100719-asterisk-update/data/100719-astrad-update.tar.gz
astrad:/100719-astrad-update# ls
100719-astrad-update.tar.gz
astrad:/100719-astrad-update# tar xzf 100719-astrad-update.tar.gz
astrad:/100719-astrad-update# ls
100719-astrad-update.tar.gz agi-rad-auth-2.pl astrad-prompt cdr_custom.conf extensions.conf KeyAstr Liste-Asterisk.pl
Editer les fichiers suivants en ajoutant les informations de connexion nécessaires :
extensions.conf
astrad:/100719-astrad-update# vi extensions.conf
[globals]
RADIUS_Server=IP_Radius_Server(PortaBilling)
RADIUS_Secret=Password
RADIUS_Auth_Port=1812
RAIUS_Acct_Port=1813
Acct_Update_Timeout=60
NAS_IP_Address=IP_Asterisk_Server
. . .
Liste-Asterisk.pl
astrad:/100719-astrad-update# vi Liste-Asterisk.pl
#! /usr/bin/perl -w
use strict;
use warnings;
use POSIX;
use Digest::MD5;
use Crypt::Rijndael;
my $http_user="Username";
my $http_passwd="Password";
my $http_file_1="http://switzernet.com/folders/100716-php-asterisk";
my $http_file_2="http://unappel.ch/folders/100716-php-asterisk";
Exécutez les commandes suivantes :
astrad:/100719-astrad-update# cp ./astrad-prompt/* /usr/share/asterisk/sounds/
astrad:/100719-astrad-update# mv /etc/asterisk/extensions.conf /etc/asterisk/old-extensions.conf
astrad:/100719-astrad-update# mv /etc/asterisk/cdr_custom.conf /etc/asterisk/old-cdr_custom.conf
astrad:/100719-astrad-update# cp cdr_custom.conf /etc/asterisk/cdr_custom.conf
astrad:/100719-astrad-update# cp extensions.conf /etc/asterisk/extensions.conf
astrad:/100719-astrad-update# mv /usr/share/asterisk/agi-bin/agi-rad-auth-2.pl /usr/share/asterisk/agi-bin/old-agi-rad-auth-2.pl
astrad:/100719-astrad-update# cp agi-rad-auth-2.pl /usr/share/asterisk/agi-bin/
astrad:/100719-astrad-update# mv /root/100105-asterisk-list/Liste-Asterisk.pl /root/100105-asterisk-list/old-Liste-Asterisk.pl
astrad:/100719-astrad-update# cp Liste-Asterisk.pl /root/100105-asterisk-list/
astrad:/100719-astrad-update# chmod +r /usr/share/asterisk/sounds/*
astrad:/100719-astrad-update# chown -R asterisk:asterisk /etc/asterisk/*.conf
astrad:/100719-astrad-update# /etc/init.d/asterisk stop ; /root/myasterisk/croncheck.sh
Editez le fichier ‘/etc/logrotate.d/asterisk’ et ajouter les lignes suivantes à la fin :
/etc/logrotate.d/asterisk
"/root/100105-asterisk-list/AsteriskPerl.log" {
daily
rotate 15
dateext
}
On commence par la confirmation qu’Asterisk tourne en exécutant la commande suivante, vous devez avoir la même sorti dans votre console :
astrad# ps aux | grep ast
root 3551 0.0 0.0 5608 712 pts/0 S+ 09:34 0:00 grep --color=auto ast
asterisk 4223 3.0 3.3 671016 133844 ? Ssl Jul19 27:26 /usr/sbin/asterisk -p -U asterisk
asterisk 4230 0.0 0.3 65356 12444 ? S Jul19 0:45 /usr/bin/perl /root/myasterisk/ast-rad-acc.pl
asterisk 4233 0.1 0.2 61340 10328 ? S Jul19 1:29 /usr/bin/perl /root/myasterisk/ast-reg-switz.pl
asterisk 4236 0.0 5.2 472100 210388 ? S Jul19 0:22 /usr/bin/perl /root/myasterisk/ast-resend-lost.pl
root 4732 0.0 0.0 31248 3028 ? S Jul19 0:28 /usr/bin/perl /root/myasterisk/ast-ngrep.pl
Vous devez vérifier que les fichiers extensions.conf et cdr_custom.conf appartient à l’utilisateur Asterisk et que la taille du fichier ‘db-friends.conf’ est strictement supérieur à 0 :
astrad# ls -l /etc/asterisk/
total 608
-rw-r----- 1 asterisk asterisk 336 2010-05-08 17:45 asterisk.conf
-rw-r----- 1 asterisk asterisk 107 2010-07-08 14:10 billing.conf
-rw-r--r-- 1 asterisk asterisk 90 2010-01-27 17:12 cdr.conf
-rw-r--r-- 1 asterisk asterisk 777 2010-07-15 11:47 cdr_custom.conf
-rw-r--r-- 1 asterisk asterisk 502 2010-04-19 11:25 db-customer-ip.conf
-rw-r--r-- 1 asterisk asterisk 527 2010-07-16 10:49 db-deny-node.conf
-rw-r--r-- 1 asterisk asterisk 500825 2010-07-19 18:10 db-friends.conf
-rw-r--r-- 1 asterisk asterisk 1867 2010-07-16 10:49 db-peers.conf
-rw-r--r-- 1 asterisk asterisk 15029 2010-07-15 19:40 extensions.conf
-rw-r--r-- 1 asterisk asterisk 4158 2010-03-01 15:59 extensions_old.conf
-rw-r----- 1 asterisk asterisk 402 2010-05-10 19:47 manager.conf
-rw-r----- 1 asterisk asterisk 2100 2010-05-08 15:41 modules.conf
-rw-r----- 1 asterisk asterisk 750 2010-07-15 15:01 sip.conf
Pour vérifier la configuration du CDR d’Asterisk, il suffit de chercher les détailles d’un appel de test effectué après la mise à jours dans le contenu du fichier Master.csv, on doit trouver deux nouveaux champs (Hangupcause, User-Agent)
astrad# tail -f /var/log/asterisk/cdr-custom/Master.csv
"5c5a2876 611cbf59 441a80ce 1aba594b","0900000085","02155009999","","2010-07-19 19:21:44","0","2010-07-19 19:21:35","FAILED","13","SipAuth","Hangupcause:1","User-Agent:C450 IP010720000000"
Le champ ‘Hangupcause’ apparaitra seulement en cas d’erreur (appel non effectuée)
Vérifiez le contenu du log du script ‘/root/100105-asterisk-list/Liste-Asterisk.pl’, on doit voir une date supérieur à la date de mise à jour
astrad:/etc/asterisk# tail -16 /root/100105-asterisk-list/AsteriskPerl.log
2010-07-19 19:20:01
0: Reply 486 Busy Here
0: Sleep 57 s
1: Reply 200 Ok
Total Customer skipped = 0
Total Customer decrypted = 7705
Total Error in Decryption account file = 0
md5 decrypted Accounts file is equal to md5 of existing file
md5 decrypted Node file is equal to md5 of existing file
md5 decrypted IP customers file is equal to md5 of existing file
Reloading Asterisk is not necessary
-----------------------------------------------------------------------------------------------------------------
Changer le mot de passe de votre compte depuis le Billing, essayez d’appeler un numéro avant même de changer le mot de passe dans la configuration du téléphone, vous devez écouter un message qui vous informe que le mot de passe est incorrect.
Changer le mot de passe dans la configuration du votre téléphone, l’Asterisk doit autoriser cet enregistrement après 10 minutes au maximum et la date de modification du fichier ‘/etc/asterisk/db-friends.conf’ sera changer.
http://switzernet.com/public/100427-follow-me-asterisk/
http://www.cisco.com/en/US/docs/voice_ip_comm/bts/3.5/command/reference/992M.html
http://www.voip-info.org/wiki/view/Asterisk+variable+DIALSTATUS
http://www.voip-info.org/wiki/index.php?page=Asterisk+variable+hangupcause
http://www.asterisk.org/doxygen/trunk/AstCauses.html
http://www.voip-info.org/wiki/view/sox
http://www.voip-info.org/tiki-index.php?page=Convert+WAV+audio+files+for+use+in+Asterisk
http://www.linux-tutorial.info/modules.php?name=ManPage&sec=1&manpage=sox
http://www.thegeekstuff.com/2009/05/sound-exchange-sox-15-examples-to-manipulate-audio-files/
http://www.voip-info.org/tiki-index.php?page=Convert+WAV+audio+files+for+use+in+Asterisk