Администратор писал(а):
А что по логированию?
Ну, допустим, у меня в скрипте есть параметр, значение которого я хочу проверить. Как мне это сделать? Я вижу только решение записать в лог, но не знаю как это сделать.
Администратор писал(а):
Как скрипт отладите - статейку поправьте, версию для 5.1 добавьте, плз.
Добавлю, угу.
Еще не совсем понятный нюанс: как быть со строками по умолчанию. Нормально будет если я везде буду ставить null?
Модифицированный скрипт выглядит примерно так:
Код:
import bitel.billing.server.radius.*;
if (request.getIntAttribute(-1, RadiusStandartAttributes.Acct_Status_Type, -1) == 2) {
// Устанавливаем Calling-Station-Id = Asterisk-Src
CallingStationId = request.getStringAttribute(22736, 102, null);
request.setStringAttribute(-1, RadiusStandartAttributes.Calling_Station_Id, CallingStationId);
// Проверяем наличие Asterisk-Acc-Code, и если он существует,
// то устанавливаем User-Name = Asterisk-Acc-Code, если не существует,
// то устанавливаем User-Name = Calling-Station-Id
UserName = request.getStringAttribute(22736, 101, null);
if (UserName != null)
request.setStringAttribute(-1, RadiusStandartAttributes.User_Name, UserName);
else
request.setStringAttribute(-1, RadiusStandartAttributes.User_Name, CallingStationId);
// Устанавливаем Called-Station-Id = Asterisk-Dst
request.setStringAttribute(-1, RadiusStandartAttributes.Called_Station_Id, request.getStringAttribute(22736, 103, null));
// Проверяем наличие Asterisk-User-Field, и если такой существует,
// то на основании его значения устанавливаем h323-call-origin
CallType = request.getStringAttribute(22736, 118, null);
if (CallType != null && CallType.equals("answer")) {
request.setStringAttribute(-1, 26, "answer");
request.setFlag(2);
}
else {
request.setStringAttribute(-1, 26, "originate");
request.setFlag(1);
}
// Устанавливаем h323-call-type = VOIP
request.setStringAttribute(-1, 27, "VOIP");
// Устанавливаем Acct-Session-Time = Asterisk-Bill-Sec
request.setIntAttribute(-1, RadiusStandartAttributes.Acct_Session_Time, request.getIntAttribute(22736, 114, null));
// Устанавливаем h323-setup-time = Asterisk-Start-Time
request.setStringAttribute(-1, 25, request.getStringAttribute(22736, 110, null));
// Устанавливаем h323-connect-time = Asterisk-Answer-Time
request.setStringAttribute(-1, 28, request.getStringAttribute(22736, 111, null));
// Устанавливаем h323-disconnect-time = Asterisk-End-Time
request.setStringAttribute(-1, 29, request.getStringAttribute(22736, 112, null));
// Устанавливаем h323-disconnect-cause на основании Asterisk-Disposition
AsteriskDisposition = request.getStringAttribute(22736, 115, null);
if (AsteriskDisposition.equals("ANSWERED"))
request.setStringAttribute(-1, 30, "0");
else if (AsteriskDisposition.equals("NO ANSWER"))
request.setStringAttribute(-1, 30, "5");
else if (AsteriskDisposition.equals("BUSY"))
request.setStringAttribute(-1, 30, "17");
else
request.setStringAttribute(-1, 30, "22");
// Устанавливаем h323-conf-id = Acct-Session-Id
request.setStringAttribute(-1, 24, request.getStringAttribute(-1, RadiusStandartAttributes.Acct_Session_Id, null));
} // Конец if (Acct_Status_Type == 2)
Но теперь выскакивает уже ошибка базы данных:
Код:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'h323_id' cannot be null
Кажется, я запутался в атрибутах. Где-то стандартные, а где-то из Asterisk. Причем атрибуты, которые в скрипте меньше 100 не описаны в dictionary радиуса для астериска, по-этому я заменил первый параметр на -1, но это не правильно. Например, в старом скрипте, видимо, были такие атрибуты как h323-disconnect-cause с номером 30, но если брать стандартные атрибуты, то 30 соответствует Called_Station_Id и получается, что Called_Station_Id ставится в 0 и возникает ошибка базы. Если же оставлять VendorID как Digium, то получаем ошибку NPE при помещении значения в несуществующий атрибут. Нужно или знать куда помещать значения в биллинг, или добавить эти атрибуты
h323_* в dictionary для астериска. Надеюсь понятно объяснил.

Если коротко, то я вижу проблему так:
1. Asterisk не передает атрибуты h323_*.
2. Эти атрибуты используются биллингом для учета статистики.
Решения вижу следующие:
1. Добавить недостающие атрибуты в словарь радиуса.
2. Передать значения из существующих атрибутов астериска непосредственно в биллинг с помощью скрипта. (
только я не знаю куда передавать)
Поправьте меня если что не так.