Genius
СitizensТип контенту
Профили
Форум
Календарь
Все, що було написано Genius
-
Разработка модуля Vpn (radius) для Stg 2.4
тема ответил в Max пользователя Genius в Модулі для Stargazer
Так, core dump отдебажить так и не удалось, когда уменьшил размер отвечает просто что file format not recognised Поковырялся в коде и обнаружил одну вещь, в авторизации при разборе пакетов используется try catch конструкция, и на этом месте падений нет А вот в коде аккаунтинга такой конструкции нет и судя по логу падения именно в этом коде, переписал и добавил туда аналогичную конструкцию, посмотрим, если поможет - выложу патч. П.С. Патч не помог, сегодня с утра опять упал, думаю дальше. -
Обнаружил еще один неожиданный баг: Иногда (пока не нашел после какого события) поля userdata меняются местами, у меня в поле userdata0 храниься MAC пользователя, так вот сегодня обнаружил его у некоторых пользователей в userdata5 и в userdata9 и еще в каких-то, ручное такое распределение невозможно, в логах таких изменений нет. Постараюсь сам поискать причину, но думаю что где-то в модуле FB ошибка.
-
Разработка модуля Vpn (radius) для Stg 2.4
тема ответил в Max пользователя Genius в Модулі для Stargazer
Покопавшись решил что такой большой core dump gdb просто хавать не может, уменьшил максимальный размер и жду нового падения. -
Разработка модуля Vpn (radius) для Stg 2.4
тема ответил в Max пользователя Genius в Модулі для Stargazer
Упал сегодня без меня опять, лог падения не сохранился, есть корка, но почему-то gdb не хочет ее дебажить "/var/stargazer/core.13385" is not a core dump: Value too large for defined data type Корка весит 3Гб, судя по ошибке получается что корка создалась неправильно, правда почему - мне непонятно, кто значет в чем причина - напишите. -
Разработка модуля Vpn (radius) для Stg 2.4
тема ответил в Max пользователя Genius в Модулі для Stargazer
Появился некоторый баг, иногда когда отрубается NAS и массово отключается много пользователей, а потом быстро начинают подключатся stargazer вываливается с Ошибкой сегментирования: inetaccess.cpp > 19:22:15 > ALIVE_ACK_8 - OK inetaccess.cpp > 19:22:16 > Min8(sizeof(ALIVE_SYN)) = 368 inetaccess.cpp > 19:22:16 > 384 bytes sent to 10.50.7.134 len=384 inetaccess.cpp > 19:22:16 > Send_ALIVE_SYN_8 inetaccess.cpp > 19:22:16 > recv from 10.50.7.134 len=64 inetaccess.cpp > 19:22:16 > User colombo FOUND! inetaccess.cpp > 19:22:16 > ======================> InitEncrypt dont needed inetaccess.cpp > 19:22:16 > ALIVE_ACK_8 - OK traffcounter.cpp > 19:22:17 > FlushAndRemove() packets: 550(rem 21) ip2packets: 1100(rem 42) inetaccess.cpp > 19:22:18 > Min8(sizeof(ALIVE_SYN)) = 368 inetaccess.cpp > 19:22:18 > 384 bytes sent to 10.50.7.202 len=384 inetaccess.cpp > 19:22:18 > Send_ALIVE_SYN_8 inetaccess.cpp > 19:22:18 > recv from 10.50.7.202 len=64 inetaccess.cpp > 19:22:18 > User artur FOUND! inetaccess.cpp > 19:22:18 > ======================> InitEncrypt dont needed inetaccess.cpp > 19:22:18 > ALIVE_ACK_8 - OK radius_ia.cpp > 19:22:18 > AFTER select radius_ia.cpp > 19:22:18 > Auth process radius_ia.cpp > 19:22:18 > Recv packert - OK radius_ia.cpp > 19:22:18 > NASIPAddress: 3232261122 radius_ia.cpp > 19:22:18 > CallingStationId: 00:14:22:BA:97:68 radius_ia.cpp > 19:22:18 > Find CHAP password!!! attr radius_ia.cpp > 19:22:18 > Auth 6 acct 7 radius_ia.cpp > 19:22:18 > AFTER select radius_ia.cpp > 19:22:18 > Acct process radius_ia.cpp > 19:22:18 > Recv packert - OK Ошибка сегментирования Какие то косяки в обработчике пакетов, постараюсь запустить с gdb и отследить core. -
Ip адреса представлены в стандартном int отображении, самый просто способ перевода из строки в него inet_addr (). Новая ошибка в модуле ФБ: Если в базе есть пользователи, которым должен быть сменен тариф в начале следущего учетного периода то stg не запустится с ошибкой: *** IBPP::WrongType *** Context: RowImpl::GetValue Message: Incompatible types. INTEGER and std::string user.cpp > 18:48:25 > Cannot read conf for user test. user.cpp > 18:48:25 > Error connecting database! Суть ошибки в опечатке: { strError = "Error making query: \"" + query + "\""; db.Rollback(); return -1; } if (db.Fetch(trow)) { [color=red]t[/color]row->Get(1, conf->nextTariff); } else { strError = "User \"" + login + "\" has a nonexistent next tariff!"; db.Rollback(); Аналогичная ошибка с будущими корпорациями, но пока она ни на что не влияет, но лучше заметить ее сейчас: { strError = "Error making query: \"" + query + "\""; db.Rollback(); return -1; } if (db.Fetch(trow)) { [color=red]t[/color]row->Get(1, conf->corp); } else { strError = "User \"" + login + "\" has a nonexistent corporation!"; db.Rollback();
-
Новый баг модуля firebird Не удаляются пользователи, при удалении пользователя через несколько минут (при реальной попытке удаления) появляется в логе: При детальном рассмотре причина ошибки найдена и исправлена: файл filebird_store_users.cpp ищем SQL запрос на удаления stat данных пользователя: Если пользователь живет в базе более одного учетного периода, то на него в таблице tb_stats существует несколько записей (одна на каждый месяц + одна текущая), и поэтому подзапрос вернет несколько значений pk_stat и будет SQL ошибка в where. Для исправления необходимо поменять на : тогда будут удаляться все записи stat за все месяцы работы пользователя. Исправление проверено и работает.
-
Ну сборка сугубо тестерская - нефиг пинать разработчиков, мы запустили ее в основной сервер только после доработки напильником, вроде работает гуд после всех правок, зато множество багов обнаружено и запощено здесь.
-
user_property.h там шаблон функции
-
Функция void USER::OnAdd()
-
C++ и user.cpp в руки, там это просто реализовать.
-
Нормальные адреса в int формате.
-
Вообщем со стороны stargazer все ок, косяк в check проверках в firebird, во всех местах где задано value between 'a' and 'z', interbase а не знаю, так что пока можно просто убрать проверку значений, все равно stargazer туда ничего неправильного не запишет.
-
Наличие глюка подтверждаю, при попытке создать - не создает. Причину пока не искал.
-
Я бы посоветовал все таки вот это http://v-lan.ru/projects/stargazer-2.4/Standart/ с модулями netflow и radius
-
Судя по всему это последняя тестовая версия старгейзера, читайте тему о последнем билде, там написано как его лучше запускать.
-
Как я понимаю это стандартное фиктивное отключение пользователей в конце дня для записи параметров сессии, на работу пользователей не отражается. Это норма.
-
Вот эта ошибка тоже возникает. Сколько успел разобратся старгейзер примерно через 1-2 минуты разрывает связь с firebird сервером (судя по netstat) и после этого не может сохранить никакие параметры. У меня такое происходило всегда когда убираешь #define NO_DAEMON чтобы собрать его в режиме демона. В варианте с #define NO_DAEMON такой ошибки не замечено.
-
Там действительно есть какая-то проблема, после долгих шаманств заработало после очередной компиляции и копировании .so На самом деле для тестов можно тупо запускать из директории projects/stargazer и оно нормально запустится.
-
IPQ или netflow метод подсчета решит все ваши проблемы на таком железе, потому что при стандартном методе захвата трафика весь траффик проходит через Stargazer даже если он NULL при подсчете.
-
Нашел ошибку в формате стандартной базы, поле freemb объявлено как int и поэтому сохраняет только целую часть, вполне разумно и логично использовать для него dm_money формат так как поля по сути одинаковые.
-
В процессе ковыряния исходников обнаружил 2 новых параметра доступных для использования в stargazer.conf FullFee = yes/no - позволяет всегда списывать полную АП, независимо от параметра passivetime, то есть например с подключенных в середине месяца. ShowFeeInCash = yes/no - позволяет настроить возможность резервирования АП у клиента на счете для списания в конце месяца, клиент не сможет работать на эти деньги и как я понимаю видеть их в авторизаторе. Работоспособность параметров не проверял, но судя по коду должны работать. Надеюсь что я не нарушил логику авторов по открытию новых фичей старгейзера, большое спасибо за разработку, новые параметры весьма полезны.
-
господа, заделитесь пожалуйста скриптом переноса файловой БД в firebird если таковой уже имеется, на форуме не нашел.
-
Разработка модуля Vpn (radius) для Stg 2.4
тема ответил в Max пользователя Genius в Модулі для Stargazer
Тогда лучше отдайте вот этот, тут еще добавлена проверка NASIPAddress чтобы клиент авторизовался именно на том NAS который указан у него в конфиге, без такой проверки довольно легко нарушить работу системы с несколькими НАСами и скриптами OnConnect/OnDisconnect --- radius_ia.cpp.proto 2007-04-10 22:21:51.000000000 +0400 +++ radius_ia.cpp 2007-08-24 17:20:37.000000000 +0400 @@ -108,7 +108,7 @@ //---------------------------------------------------------------- const string RADIUS_IA::GetVersion() const{ - return "Radius modul version 0.72alpha"; + return "Radius authorizator&accounter version 0.81beta with CallingStationID&NASIP check"; }; //---------------------------------------------------------------- void RADIUS_IA::SetUsers(USERS * u){ @@ -337,6 +336,64 @@ return 0; }; + //NAS IP check + + if(ui->property.nas.Get().size()) + { + if(RequestPacket.FindAttribute(NASIPAddress)) + { + unsigned int nas_ip=RequestPacket.GetIntField(NASIPAddress); + + printfd(__FILE__,"NASIPAddress: %u\n",nas_ip); + + if(htonl(nas_ip)!=inet_addr(ui->property.nas.Get().c_str())) + { + SendReject(RequestPacket,"Request from invalid NAS",cliaddr); + printfd(__FILE__,"Request from invalid NAS\n"); + } + } + else + { + SendReject(RequestPacket,"NOT found NASIPAddress attr",cliaddr); + printfd(__FILE__,"NOT found NASIPAddress attr\n"); + } + } + + //Calling station ID check (MAC or IP) + if(ui->property.userdata0.Get().size()) + { + if(RequestPacket.FindAttribute(CallingStationId)) + { + string station_id=RequestPacket.GetStringField(CallingStationId).c_str(); + printfd(__FILE__,"CallingStationId: %s\n",station_id.c_str()); + + char * str = new char[ui->property.userdata0.Get().size() + 1]; + strcpy(str,ui->property.userdata0.Get().c_str()); + char * pstr = str; + char * c_id; + + while ((c_id = strtok(pstr, ", "))) + { + pstr = NULL; + if(c_id==station_id) + break; + } + + if (!c_id) + { + SendReject(RequestPacket,"Invalid CallingStationID",cliaddr); + printfd(__FILE__,"Invalid CallingStationID: %s\n",station_id.c_str()); + } + + delete[] str; + } + else + { + SendReject(RequestPacket,"NOT found CallingStationID attr",cliaddr); + printfd(__FILE__,"NOT found CallingStationID attr\n"); + } + } + //PAP if (RequestPacket.FindAttribute(UserPassword)) { printfd(__FILE__,"Find PAP password!!! attr\n"); Патчи тестились и написаны под последнюю бету выложенную автором и модуль радиуса 0.81бета. -
Разработка модуля Vpn (radius) для Stg 2.4
тема ответил в Max пользователя Genius в Модулі для Stargazer
Решил написать небольшой патч для привязки аккаунтов к CallingStationID. Используется поле UserData0 (можно поменять на любое другое), добавлять новое поле не стал, так как надо менять конфигуратор тогда. В поле можно вписывать любые значения через запятую или пробел (для pppoe передается MAC для pptp IP) при наличии полного соответствия доступ разрешается, если оставить поле пустым проверка не производится. --- radius_ia.cpp.proto 2007-04-10 22:21:51.000000000 +0400 +++ radius_ia.cpp 2007-08-24 13:39:06.000000000 +0400 @@ -108,7 +108,7 @@ //---------------------------------------------------------------- const string RADIUS_IA::GetVersion() const{ - return "Radius modul version 0.72alpha"; + return "Radius authorizator&accounter version 0.82alpha with CallingStationID check"; }; //---------------------------------------------------------------- void RADIUS_IA::SetUsers(USERS * u){ @@ -337,6 +336,34 @@ return 0; }; + //Calling station ID check (MAC or IP) + if(ui->property.userdata0.Get().size()) + { + if(RequestPacket.FindAttribute(CallingStationId)) + { + string station_id=RequestPacket.GetStringField(CallingStationId).c_str(); + printfd(__FILE__,"CallingStationId: %s\n",station_id.c_str()); + + char * str = new char[ui->property.userdata0.Get().size() + 1]; + strcpy(str,ui->property.userdata0.Get().c_str()); + char * pstr = str; + char * c_id; + + while ((c_id = strtok(pstr, ", "))) + { + pstr = NULL; + if(c_id==station_id) + break; + } + + if (!c_id) + SendReject(RequestPacket,"Invalid CallingStationID",cliaddr); + delete[] str; + } + else + SendReject(RequestPacket,"NOT found CallingStationID attr",cliaddr); + } + //PAP if (RequestPacket.FindAttribute(UserPassword)) { printfd(__FILE__,"Find PAP password!!! attr\n"); П.С. По хорошему надо юзать уже сделанную автором систему USER_IPS но для патча на коленках сойдет, если идея заинтересует разработчиков модуля то ее можно переписать красиво с добавлением новых полей и созданием нормальной функции проверки.
