forum.bitel.ru http://forum.bitel.ru/ |
|
BGRadius + BGBilling http://forum.bitel.ru/viewtopic.php?f=6&t=4444 |
Страница 1 из 1 |
Автор: | Ky6uk [ 18 авг 2010, 12:12 ] |
Заголовок сообщения: | BGRadius + BGBilling |
Настроил тестовый биллинг 5.1, затем радиус. На радиус-сервер попадает CDR с астериска. Как теперь узнать обрабатывает ли биллинг данные с радиус-сервера? У меня есть подозрения, что дальше логов на радиусе информация о звонках не уходит. |
Автор: | Администратор [ 19 авг 2010, 18:38 ] |
Заголовок сообщения: | Re: BGRadius + BGBilling |
Ну если "обработает", звонки должны появится. Выложите, что в логах радиуса приходит. |
Автор: | Ky6uk [ 19 авг 2010, 19:44 ] |
Заголовок сообщения: | Re: BGRadius + BGBilling |
Администратор писал(а): Ну если "обработает", звонки должны появится. Выложите, что в логах радиуса приходит. Код: 08-19/18:27:12 INFO [radiusListener-p-4-t-8] status - REQUEST: Packet type: Accounting-Request Identifier: 238 Authenticator: {5A CB 48 17 74 64 CC FC 84 BD EF 1A 49 25 7C E8} Attributes: User-Name=SIP/100-00000432 NAS-IP-Address=127.0.0.1 NAS-Port=0 Acct-Status-Type=2 Acct-Delay-Time=0 Acct-Session-Id=1282220694.1074 Asterisk-Src=100 Asterisk-Dst=73812XXXXXX Asterisk-Acc-Code=100 Asterisk-Start-Time=2010-08-19 18:24:54 +0600 Asterisk-Answer-Time=2010-08-19 18:24:56 +0600 Asterisk-Last-App=Dial Asterisk-Last-Data=SIP/73812XXXXXX@ix-cisco Asterisk-Chan=SIP/100-00000432 Asterisk-Dst-Chan=SIP/ix-cisco-00000433 Asterisk-Dst-Ctx=tele-in Asterisk-Clid="Operator" <100> Asterisk-User-Field="originate" Asterisk-Unique-ID=1282220694.1074 Asterisk-AMA-Flags=DOCUMENTATION Asterisk-Disposition=ANSWERED Asterisk-Bill-Sec=136 Asterisk-Duration=138 Asterisk-End-Time=2010-08-19 18:27:12 +0600 08-19/18:27:12 INFO [radiusListener-p-4-t-8] status - RESPONSE: Packet type: Accounting-Response Identifier: 238 Authenticator: {5A CB 48 17 74 64 CC FC 84 BD EF 1A 49 25 7C E8} Attributes: Process time stop: 1 еще приходит вот такой error Код: script 08-19/17:26:09 ERROR [radiusListener-p-4-t-5] NasScript - Sourced file: inline evaluation of: ``import bitel.billing.server.radius.*; if (request.getIntAttribute(RadiusStandar . . . '' : Error in method invocation: Method setVendorStringAttribute( int, java.lang.String ) not found in class'ru.bitel.bgbilling.kernel.network.radius.RadiusPacket' Sourced file: inline evaluation of: ``import bitel.billing.server.radius.*; if (request.getIntAttribute(RadiusStandar . . . '' : Error in method invocation: Method setVendorStringAttribute( int, java.lang.String ) not found in class'ru.bitel.bgbilling.kernel.network.radius.RadiusPacket' : at Line: 27 : in file: inline evaluation of: ``import bitel.billing.server.radius.*; if (request.getIntAttribute(RadiusStandar . . . '' : request .setVendorStringAttribute ( 26 , "originate" ) at bsh.BSHMethodInvocation.eval(Unknown Source) at bsh.BSHPrimaryExpression.eval(Unknown Source) at bsh.BSHPrimaryExpression.eval(Unknown Source) at bsh.BSHBlock.evalBlock(Unknown Source) at bsh.BSHBlock.eval(Unknown Source) at bsh.BSHBlock.eval(Unknown Source) at bsh.BSHIfStatement.eval(Unknown Source) at bsh.BSHBlock.evalBlock(Unknown Source) at bsh.BSHBlock.eval(Unknown Source) at bsh.BSHBlock.eval(Unknown Source) at bsh.BSHIfStatement.eval(Unknown Source) at bsh.Interpreter.eval(Unknown Source) at bsh.Interpreter.eval(Unknown Source) at bsh.Interpreter.eval(Unknown Source) at ru.bitel.bgbilling.kernel.network.radius.nas.NasScript.processRequestImpl(NasScript.java:42) at ru.bitel.bgbilling.kernel.network.radius.nas.NasScript.processRequest(NasScript.java:58) at ru.bitel.bgbilling.kernel.network.radius.RadiusProcessor.preprocessAccountingRequest(RadiusProcessor.java:264) at ru.bitel.bgbilling.modules.voiceip.radius.VoiceIpRadiusProcessor.preprocessAccountingRequest(VoiceIpRadiusProcessor.java:220) at ru.bitel.bgbilling.modules.voiceip.radius.VoiceIpRadiusProcessor.preprocessAccountingRequest(VoiceIpRadiusProcessor.java:1) at ru.bitel.bgbilling.kernel.network.radius.RadiusProcessor.accountingRequest(RadiusProcessor.java:396) at ru.bitel.bgbilling.kernel.network.radius.RadiusListenerWorker.run(RadiusListenerWorker.java:218) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:636) at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:40) Использую Asterisk и скрипт переработки запросов. |
Автор: | Ky6uk [ 20 авг 2010, 13:59 ] |
Заголовок сообщения: | Re: BGRadius + BGBilling |
Да, скрипт взял из wiki. Сижу, разбираюсь. |
Автор: | Администратор [ 22 авг 2010, 21:59 ] |
Заголовок сообщения: | Re: BGRadius + BGBilling |
Скрипт предобработки какой сейчас, выложите. И что он делать должен, вы в курсе? |
Автор: | Ky6uk [ 22 авг 2010, 22:06 ] |
Заголовок сообщения: | Re: BGRadius + BGBilling |
Администратор писал(а): Скрипт предобработки какой сейчас, выложите. И что он делать должен, вы в курсе? Как я уже и говорил, скрипт из wiki: Код: import bitel.billing.server.radius.*; if (request.getIntAttribute(RadiusStandartAttributes.Acct_Status_Type) == 2) { // Устанавливаем Calling-Station-Id = Asterisk-Src CallingStationId = request.getVendorAttributes(22736, 102).get(0).getStringValue(); request.setStringAttribute(RadiusStandartAttributes.Calling_Station_Id, CallingStationId); // Проверяем наличие Asterisk-Acc-Code, и если он существует, // то устанавливаем User-Name = Asterisk-Acc-Code, если не существует, // то устанавливаем User-Name = Calling-Station-Id UserName = request.getVendorAttributes(22736, 101); if (UserName != null) request.setStringAttribute(RadiusStandartAttributes.User_Name, UserName.get(0).getStringValue()); else request.setStringAttribute(RadiusStandartAttributes.User_Name, CallingStationId); // Устанавливаем Called-Station-Id = Asterisk-Dst request.setStringAttribute(RadiusStandartAttributes.Called_Station_Id, request.getVendorAttributes( 22736, 103 ).get(0).getStringValue()); // Проверяем наличие Asterisk-User-Field, и если такой существует, // то на основании его значения устанавливаем h323-call-origin CallType = request.getVendorAttributes(22736, 118); if (CallType != null && CallType.get(0).getStringValue() .equals("answer")) { request.setVendorStringAttribute(26, "answer"); request.setFlag(2); } else { request.setVendorStringAttribute(26, "originate"); request.setFlag(1); } // Устанавливаем h323-call-type = VOIP request.setVendorStringAttribute(27, "VOIP"); // Устанавливаем Acct-Session-Time = Asterisk-Bill-Sec request.setIntAttribute(RadiusStandartAttributes.Acct_Session_Time, request.getVendorAttributes( 22736, 114 ).get(0).getIntValue()); // Устанавливаем h323-setup-time = Asterisk-Start-Time request.setVendorStringAttribute(25, request.getVendorAttributes( 22736, 110 ).get(0).getStringValue()); // Устанавливаем h323-connect-time = Asterisk-Answer-Time request.setVendorStringAttribute(28, request.getVendorAttributes( 22736, 111 ).get(0).getStringValue()); // Устанавливаем h323-disconnect-time = Asterisk-End-Time request.setVendorStringAttribute(29, request.getVendorAttributes( 22736, 112 ).get(0).getStringValue()); // Устанавливаем h323-disconnect-cause на основании Asterisk-Disposition AsteriskDisposition = request.getVendorAttributes( 22736, 115 ).get(0).getStringValue(); if (AsteriskDisposition .equals("ANSWERED")) request.setVendorStringAttribute(30, "0"); else if (AsteriskDisposition .equals("NO ANSWER")) request.setVendorStringAttribute(30, "5"); else if (AsteriskDisposition .equals("BUSY")) request.setVendorStringAttribute(30, "17"); else request.setVendorStringAttribute(30, "22"); // Устанавливаем h323-conf-id = Acct-Session-Id request.setVendorStringAttribute(24, request.getStringAttribute(RadiusStandartAttributes.Acct_Session_Id)); } // Конец if (Acct_Status_Type == 2) Принцип действия я понимаю так: на радиус приходит CDR с астериска; далее из радиуса приходит информация о звонке в биллинг и перед обработкой звонка он проходит некоторую модификацию скриптом предобработки. В данном скрипте есть комментарии какой параметр на какой меняется. |
Автор: | Администратор [ 23 авг 2010, 12:22 ] |
Заголовок сообщения: | Re: BGRadius + BGBilling |
Скрипт нужно поправить под новое RADIUS API. См. здесь: http://www.bgbilling.ru/v5.1/javadoc/index.html, класс RadiusAttributeSet. Вызовы вида: Код: request.setStringAttribute(RadiusStandartAttributes.Calling_Station_Id, CallingStationId); заменить на: Код: request.setStringAttribute(-1, RadiusStandartAttributes.Calling_Station_Id, CallingStationId); Вызовы вида: Код: request.setVendorStringAttribute(27, "VOIP"); заменить на (9 - вендор циско, указывать явно): Код: request.setStringAttribute(9, 27, "VOIP"); В новом API всё стало более единообразно. |
Автор: | Ky6uk [ 23 авг 2010, 13:09 ] |
Заголовок сообщения: | Re: BGRadius + BGBilling |
Администратор писал(а): Скрипт нужно поправить под новое RADIUS API. См. здесь: http://www.bgbilling.ru/v5.1/javadoc/index.html, класс RadiusAttributeSet. В новом API всё стало более единообразно. Код: Sourced file: inline evaluation of: ``import bitel.billing.server.radius.*; if (request.getIntAttribute(22736, Radius . . . '' : Error in method invocation: Method getIntAttribute( int, int ) not found in class'ru.bitel.bgbilling.kernel.network.radius.RadiusPacket' : at Line: 3 : in file: inline evaluation of: ``import bitel.billing.server.radius.*; if (request.getIntAttribute(22736, Radius . . . '' : request .getIntAttribute ( 22736 , RadiusStandartAttributes .Acct_Status_Type ) ![]() Как я понял, ругается на Код: request.getIntAttribute(22736, RadiusStandartAttributes.Acct_Status_Type) Но, судя по документации, этот метод есть, правда в ru.bitel.bgbilling.kernel.network.radius.RadiusAttributeSet Модифицированный скрипт выглядит так: Код: import bitel.billing.server.radius.*; if (request.getIntAttribute(22736, RadiusStandartAttributes.Acct_Status_Type) == 2) { // Устанавливаем Calling-Station-Id = Asterisk-Src CallingStationId = request.getStringAttribute(22736, 102); 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); if (UserName != null) request.setStringAttribute(-1, RadiusStandartAttributes.User_Name, UserName.get(0).getStringValue()); else request.setStringAttribute(-1, RadiusStandartAttributes.User_Name, CallingStationId); // Устанавливаем Called-Station-Id = Asterisk-Dst request.setStringAttribute(-1, RadiusStandartAttributes.Called_Station_Id, request.getStringAttribute(22736, 103)); // Проверяем наличие Asterisk-User-Field, и если такой существует, // то на основании его значения устанавливаем h323-call-origin CallType = request.getStringAttribute(22736, 118); if (CallType != null && CallType.get(0).getStringValue() .equals("answer")) { request.setStringAttribute(22736, 26, "answer"); request.setFlag(2); } else { request.setStringAttribute(22736, 26, "originate"); request.setFlag(1); } // Устанавливаем h323-call-type = VOIP request.setStringAttribute(22736, 27, "VOIP"); // Устанавливаем Acct-Session-Time = Asterisk-Bill-Sec request.setIntAttribute(22736, RadiusStandartAttributes.Acct_Session_Time, request.getStringAttribute(22736, 114)); // Устанавливаем h323-setup-time = Asterisk-Start-Time request.setStringAttribute(22736, 25, request.getStringAttribute(22736, 110)); // Устанавливаем h323-connect-time = Asterisk-Answer-Time request.setStringAttribute(22736, 28, request.getStringAttributes(22736, 111 )); // Устанавливаем h323-disconnect-time = Asterisk-End-Time request.setStringAttribute(22736, 29, request.getStringAttribute(22736, 112)); // Устанавливаем h323-disconnect-cause на основании Asterisk-Disposition AsteriskDisposition = request.getStringAttribute(22736, 115); if (AsteriskDisposition .equals("ANSWERED")) request.setStringAttribute(22736, 30, "0"); else if (AsteriskDisposition .equals("NO ANSWER")) request.setStringAttribute(22736, 30, "5"); else if (AsteriskDisposition .equals("BUSY")) request.setStringAttribute(22736, 30, "17"); else request.setStringAttribute(22736, 30, "22"); // Устанавливаем h323-conf-id = Acct-Session-Id request.setStringAttribute(22736, 24, request.getStringAttribute(RadiusStandartAttributes.Acct_Session_Id)); } // Конец if (Acct_Status_Type == 2) Что я делаю не так? |
Автор: | Ky6uk [ 23 авг 2010, 13:48 ] |
Заголовок сообщения: | Re: BGRadius + BGBilling |
Так, увидел что должны передаваться три параметра int. Причем третий, как я понял, будет "по-умолчанию"? Подскажите как должен выглядеть правильный метод get. |
Автор: | Администратор [ 23 авг 2010, 14:57 ] |
Заголовок сообщения: | Re: BGRadius + BGBilling |
Код: request.getIntAttribute(22736, RadiusStandartAttributes.Acct_Status_Type) == 2) А вот 22736 тут что символизирует? Правильно, третий параметр - значение, возвращаемое, если атрибута нет. Код: request.getIntAttribute(-1, RadiusStandartAttributes.Acct_Status_Type, -1)
|
Автор: | Ky6uk [ 23 авг 2010, 14:58 ] |
Заголовок сообщения: | Re: BGRadius + BGBilling |
Администратор писал(а): Код: request.getIntAttribute(22736, RadiusStandartAttributes.Acct_Status_Type) == 2) А вот 22736 тут что символизирует? Ну как, VendorID. В моём случае это Digium (Asterisk). |
Автор: | Администратор [ 23 авг 2010, 14:59 ] |
Заголовок сообщения: | Re: BGRadius + BGBilling |
А.. Ну тогда третий параметр добавьте. |
Автор: | Ky6uk [ 23 авг 2010, 15:08 ] |
Заголовок сообщения: | Re: BGRadius + BGBilling |
Администратор писал(а): А.. Ну тогда третий параметр добавьте. Благодарю. Еще вопрос, как можно в скрипте вывести в консоль или в лог интересующие меня параметры, например RadiusStandartAttributes.Acct_Status_Type? У меня появилось подозрение, что условие не срабатывает даже если в CDR Acct-Status-Type=2. |
Автор: | Ky6uk [ 23 авг 2010, 17:32 ] |
Заголовок сообщения: | Re: BGRadius + BGBilling |
Ky6uk писал(а): У меня появилось подозрение, что условие не срабатывает даже если в CDR Acct-Status-Type=2. Вроде разобрался. Для методов, описанных в классе RadiusStandartAttributes необходимо ставить Vendor в -1, верно? Или я не так понял. Насчет логирования актуально. |
Автор: | Администратор [ 23 авг 2010, 18:17 ] |
Заголовок сообщения: | Re: BGRadius + BGBilling |
Да, -1 - для стандартных атрибутов. А что по логированию? Как скрипт отладите - статейку поправьте, версию для 5.1 добавьте, плз. |
Автор: | Ky6uk [ 23 авг 2010, 19:41 ] |
Заголовок сообщения: | Re: BGRadius + BGBilling |
Администратор писал(а): А что по логированию? Ну, допустим, у меня в скрипте есть параметр, значение которого я хочу проверить. Как мне это сделать? Я вижу только решение записать в лог, но не знаю как это сделать. Администратор писал(а): Как скрипт отладите - статейку поправьте, версию для 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. Передать значения из существующих атрибутов астериска непосредственно в биллинг с помощью скрипта. (только я не знаю куда передавать) Поправьте меня если что не так. |
Автор: | Ky6uk [ 25 авг 2010, 12:12 ] |
Заголовок сообщения: | Re: BGRadius + BGBilling |
Я не совсем уверен в правильности метода, но получилось сделать следующим образом. Добавлять в dictionary атрибуты h323_* для астериска я не стал. Вместо этого я выставил в настройках NAS вендора Cisco и в соответствующих методах скрипта сменил VendoID на 9 (cisco). После этого обсчет в биллинге пошел. Остался вопрос по поводу части скрипта: Код: // Проверяем наличие 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, request.getStringAttribute(22736, 102, null)); Если в Asterisk я оставляю атрибут Asterisk-Acc-Code пустым, то User-Name так же остается пустым. Т.е. условие не отрабатывает. В чем тут может быть дело? Конечный вид CDR выглядит так: Код: Packet type: Accounting-Request
Identifier: 189 Authenticator: {69 1D E9 A1 18 38 E5 D8 70 DA 16 FF 64 DE BE 2E} Attributes: User-Name= NAS-IP-Address=127.0.0.1 NAS-Port=0 Acct-Status-Type=2 Acct-Delay-Time=0 Acct-Session-Time=4 Calling-Station-Id=100 Acct-Session-Id=1282716117.169 Called-Station-Id=73812660000 h323-setup-time=2010-08-25 12:01:57 +0600 h323-conf-id=1282716117.169 h323-call-type=VOIP h323-call-origin=originate h323-disconnect-time=2010-08-25 12:02:02 +0600 h323-connect-time=2010-08-25 12:01:58 +0600 h323-disconnect-cause=0 Asterisk-Src=100 Asterisk-Dst=73812660000 Asterisk-Acc-Code= Asterisk-Start-Time=2010-08-25 12:01:57 +0600 Asterisk-Answer-Time=2010-08-25 12:01:58 +0600 Asterisk-Last-App=Dial Asterisk-Last-Data=SIP/73812660000@artel-out Asterisk-Chan=SIP/100-000000a9 Asterisk-Dst-Chan=SIP/artel-out-000000aa Asterisk-Dst-Ctx=tele-in Asterisk-Clid="Ky6uk" <100> Asterisk-User-Field="originate" Asterisk-Unique-ID=1282716117.169 Asterisk-AMA-Flags=DOCUMENTATION Asterisk-Disposition=ANSWERED Asterisk-Bill-Sec=4 Asterisk-Duration=5 Asterisk-End-Time=2010-08-25 12:02:02 +0600 |
Автор: | Администратор [ 26 окт 2010, 10:05 ] |
Заголовок сообщения: | Re: BGRadius + BGBilling |
Пустая строка не есть null Код: UserName = request.getStringAttribute(22736, 101, null);
if (UserName != null && UserName.length() > 0 ) request.setStringAttribute(-1, RadiusStandartAttributes.User_Name, UserName); else request.setStringAttribute(-1, RadiusStandartAttributes.User_Name, request.getStringAttribute(22736, 102, null)); |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |