This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | |||
сервис_asterisk [2024/07/30 15:29] val [Распознавание речи в Asterisk с использованием Yandex SpeechKit HTTP API] |
сервис_asterisk [2024/12/06 13:36] (current) val [Аутентификация и учет звонков в RADIUS] |
||
---|---|---|---|
Line 1503: | Line 1503: | ||
... | ... | ||
</code> | </code> | ||
- | ===== Аутентификация и учет звонков в RADIUS ===== | ||
- | * [[Сервис FreeRADIUS]] | ||
- | |||
- | <code> | ||
- | # cat /usr/share/auth.sh | ||
- | </code><code> | ||
- | #!/bin/sh | ||
- | |||
- | CALL_FROM=$1 | ||
- | |||
- | # chown asterisk /tmp/auth.log | ||
- | |||
- | if echo "User-Name=${CALL_FROM},User-Password=${CALL_FROM},NAS-IP-Address=127.0.0.1" | radclient localhost auth testing123 >>/tmp/auth.log | ||
- | then | ||
- | echo -n YES | ||
- | else | ||
- | echo -n NO | ||
- | fi | ||
- | |||
- | exit 0 | ||
- | </code><code> | ||
- | # cat /usr/share/acct-start.sh | ||
- | </code><code> | ||
- | #!/bin/sh | ||
- | |||
- | CALL_ID=$1 | ||
- | CALL_FROM=$2 | ||
- | CALL_TO=$3 | ||
- | |||
- | echo "User-Name=${CALL_FROM},Acct-Session-Id=${CALL_ID},Called-Station-Id=${CALL_TO},Calling-Station-Id=${CALL_FROM},Acct-Status-Type=Start,NAS-IP-Address=127.0.0.1,NAS-Port=${CALL_FROM}${CALL_TO}"| radclient localhost acct testing123 | ||
- | |||
- | exit 0 | ||
- | </code><code> | ||
- | # cat /usr/share/acct-stop.sh | ||
- | </code><code> | ||
- | #!/bin/sh | ||
- | |||
- | CALL_ID=$1 | ||
- | CALL_FROM=$2 | ||
- | CALL_TO=$3 | ||
- | |||
- | echo "User-Name=${CALL_FROM},Acct-Session-Id=${CALL_ID},Acct-Status-Type=Stop,NAS-IP-Address=127.0.0.1,NAS-Port=${CALL_FROM}${CALL_TO}"| radclient localhost acct testing123 | ||
- | |||
- | exit 0 | ||
- | </code> | ||
- | |||
- | Примечания: | ||
- | |||
- | * Помещаем абонента, звонки которого надо тарифицировать, в контекст billing | ||
- | * Переводим все тарифицируемые вызовы в контекст aaa-call (что-бы отследить событие окончания разговора через контекст "h") | ||
- | * В случае MYAUTH!=NO разрешаем абоненту совершить звонок. С помощью макроса "U" программируем вызов кода в момент снятия трубки для начала тарификации. По какой то причине переменные ${CALLERID(num)} ${CALLERID(dnid)} не передаются, а ${UNIQUEID} меняет значение в этом коде, поэтому занчения передаются через аргументы. | ||
- | * В контексте "h" проверяем факт наличия разговора и только в этом случае тарифицируем его окончание | ||
- | |||
- | <code> | ||
- | # cat /etc/asterisk/extensions.conf | ||
- | </code><code> | ||
- | ... | ||
- | [billing] | ||
- | ... | ||
- | exten => _4XX,1,Goto(aaa-call,s,1) | ||
- | ... | ||
- | [aaa-call] | ||
- | exten => s,1,Verbose(AUTH CALL_ID=${UNIQUEID} CALL_FROM=${CALLERID(num)} CALL_TO=${CALLERID(dnid)}) | ||
- | exten => s,n,Set(MYAUTH=${SHELL(/usr/share/auth.sh ${CALLERID(num)})}); | ||
- | exten => s,n,GotoIf($["${MYAUTH}" = "NO"]?end_call) | ||
- | exten => s,n,Dial(SIP/${CALLERID(dnid)},,U(aaa-call-beg-acct,${UNIQUEID},${CALLERID(num)},${CALLERID(dnid)})); | ||
- | exten => s,n(end_call),Hangup() | ||
- | |||
- | exten => h,1,GotoIf($["${DIALSTATUS}" != "ANSWER"]?no-answer) | ||
- | exten => h,n,Verbose(END ACCT DIALSTATUS=${DIALSTATUS} CALL_ID=${UNIQUEID} CALL_FROM=${CALLERID(num)} CALL_TO=${CALLERID(dnid)}) | ||
- | exten => h,n,System(/usr/share/acct-stop.sh ${UNIQUEID} ${CALLERID(num)} ${CALLERID(dnid)}) | ||
- | exten => h,n(no-answer),NoOp() | ||
- | |||
- | [aaa-call-beg-acct] | ||
- | exten => s,1,Verbose(BEGIN ACCT CALL_ID=${ARG1} CALL_FROM=${ARG2} CALL_TO=${ARG3}) | ||
- | exten => s,n,System(/usr/share/acct-start.sh ${ARG1} ${ARG2} ${ARG3}) | ||
- | exten => s,n,return | ||
- | ... | ||
- | </code> | ||
===== Настройка дополнительных видов обслуживания ===== | ===== Настройка дополнительных видов обслуживания ===== | ||