Народ, кто-нибудь сабжевую связку учил делать следующее:
NAS отдает Acct-Update пакет, freeradius выполняет запрос в базе, база возвращает на это дело атрибут, freeradius передает этот атрибут NAS'у? Уже неделю бьюсь, такое ощущение, что все, что делает freeradius - только лишь проверяет, успешно ли выполнился запрос, а все, что было в ответе на этот запрос, просто игнорирует.
>Народ, кто-нибудь сабжевую связку учил делать следующее:
>NAS отдает Acct-Update пакет, freeradius выполняет запрос в базе, база возвращает на
>это дело атрибут, freeradius передает этот атрибут NAS'у? Уже неделю бьюсь,
>такое ощущение, что все, что делает freeradius - только лишь проверяет,
>успешно ли выполнился запрос, а все, что было в ответе на
>этот запрос, просто игнорирует.А что это за NAS, который понимает атрибут в ответ на свой аккаунтинг-пакет?
>Народ, кто-нибудь сабжевую связку учил делать следующее:
>NAS отдает Acct-Update пакет, freeradius выполняет запрос в базе, база возвращает на
>это дело атрибут, freeradius передает этот атрибут NAS'у? Уже неделю бьюсь,
>такое ощущение, что все, что делает freeradius - только лишь проверяет,
>успешно ли выполнился запрос, а все, что было в ответе на
>этот запрос, просто игнорирует.
запусти freeradius в режиме debug (кажется ключ -X) и посмотри что он принимает от NAS и что ему возвращает. Сразу будет видно где что передается.
IMHO смотреть то нужно как раз таки на стороне NAS
freeradius отправлять то может и отправляет, а вот получает ли это дело NAS?
>IMHO смотреть то нужно как раз таки на стороне NAS
>freeradius отправлять то может и отправляет, а вот получает ли это дело
>NAS?Хинт: NAS - mpd с патчем для атрибута Drop-User. И он реально отрабатывает этот атрибут. radclient же показал, что freeradius этот атрибут, получив его из DB, в mpd не пересылает. Таким образом, атрибут дохнет в недрах freeradius.
>>IMHO смотреть то нужно как раз таки на стороне NAS
>>freeradius отправлять то может и отправляет, а вот получает ли это дело
>>NAS?
>
>Хинт: NAS - mpd с патчем для атрибута Drop-User. И он реально
>отрабатывает этот атрибут. radclient же показал, что freeradius этот атрибут, получив
>его из DB, в mpd не пересылает. Таким образом, атрибут дохнет
>в недрах freeradius.
Какой конкретно атрибут дохнет?
>Какой конкретно атрибут дохнет?Вышеуказанный Drop-User. Насколько я понял этот процесс, в freenibs за формирование этого атрибута от имени freeradius отвечал модуль rlm_nibs, здесь же этого модуля нет (и не нужен), и атрибут формируется еще в базе. Дальше радиуса этот атрибут не проходит.
Все. Проблема решена. Пришлось править исходники freeradius. Всем спасибо.
>Все. Проблема решена. Пришлось править исходники freeradius. Всем спасибо.Не пришлешь заплатку? Может пригодится, а то я тоже эту хрень сейчас ковыряю.
>>Все. Проблема решена. Пришлось править исходники freeradius. Всем спасибо.
>
>Не пришлешь заплатку? Может пригодится, а то я тоже эту хрень сейчас
>ковыряю.
а еще лучше - так выложить гденить..думаю тема многим интересна
>а еще лучше - так выложить гденить..
>
>думаю тема многим интереснаЗа правильность использованных методов не отвечаю, но в моих условиях работает:
diff -rc /usr/ports/net/freeradius/work/freeradius-1.0.2/src/modules/rlm_sql/rlm_sql.c /usr/local/src/freeradius/freeradius-1.0.2/src/modules/rlm_sql/rlm_sql.c
*** /usr/ports/net/freeradius/work/freeradius-1.0.2/src/modules/rlm_sql/rlm_sql.c Thu Sep 30 18:54:22 2004
--- /usr/local/src/freeradius/freeradius-1.0.2/src/modules/rlm_sql/rlm_sql.c Mon Feb 28 17:05:45 2005
***************
*** 883,889 ****
--- 883,892 ----
SQLSOCK *sqlsocket = NULL;
VALUE_PAIR *pair;
+ VALUE_PAIR *check_tmp = NULL;
+ VALUE_PAIR *reply_tmp = NULL;
SQL_INST *inst = instance;
+ int found = 0;
int ret = RLM_MODULE_OK;
int numaffected = 0;
int acctstatustype = 0;
***************
*** 958,963 ****
--- 961,973 ----
ret = RLM_MODULE_FAIL;
}
else {
+ found = sql_getvpdata(inst, sqlsocket, &check_tmp, querystr, PW_VP_USERDATA);
+ if (found > 0) {
+ radius_xlat(querystr, sizeof(querystr), inst->config->authorize_group_check_query, request, sql_escape_func);
+ sql_getvpdata(inst, sqlsocket, &check_tmp, querystr, PW_VP_GROUPDATA);
+ radius_xlat(querystr, sizeof(querystr), inst->config->authorize_reply_query, request, sql_escape_func);
+ sql_getvpdata(inst, sqlsocket, &reply_tmp, querystr, PW_VP_USERDATA);
+ }
numaffected = (inst->module->sql_affected_rows)(sqlsocket, inst->config);
if (numaffected < 1) {
***************
*** 1106,1111 ****
--- 1116,1125 ----
}
+ pairxlatmove(request, &request->reply->vps, &reply_tmp);
+ pairxlatmove(request, &request->config_items, &check_tmp);
+ pairfree(&reply_tmp);
+ pairfree(&check_tmp);
sql_release_socket(inst, sqlsocket);
return ret;