>Поставил FreeRADIUS. Очень редко, но появляется такая проблема: юзер подключился. radwho показывает,
>что клиент на линии, Далее клиент отключается, а по команде radwho
>он всё равно отображается как активный.
>В результате чего этот юзверь не может законнектиться вторично.
>Вопрос: Как сказать радиусу, что данный клиент "сдох" и его сеанс надо
>закрыть, не уничтожая файла radwtmp?
У меня тоже freeradius 0.9.3, только инфу о текщих соеденениях он у меня
хранит в radutmp ( в radwtmp хранится инфа о всех сессиях). Подобное
случается, когда не приходит аккаунтинговая стоп запись. Борюсь с этим
очень просто. Если вы ставили из сырцов, то есть там в
src/include/radutmp.h описание такой структуры:
struct radutmp {
char login[32]; /* Loginname */
/* FIXME: extend to 48 or 64 bytes */
unsigned int nas_port; /* Port on the terminal server (32 bits). */
char session_id[8]; /* Radius session ID (first 8 bytes at least)*/
/* FIXME: extend to 16 or 32 bytes */
unsigned int nas_address; /* IP of portmaster. */
unsigned int framed_address; /* SLIP/PPP address or login-host. */
int proto; /* Protocol. */
time_t time; /* Time entry was last updated. */
time_t delay; /* Delay time of request */
int type; /* Type of entry (login/logout) */
char porttype; /* Porttype (I=ISDN A=Async T=Async-ISDN */
char res1,res2,res3; /* Fills up to one int */
char caller_id[16]; /* Calling-Station-ID */
char reserved[12]; /* 3 ints reserved */
};
Так вот, файл radutmp состоит из одной или нескольких таких структур и
если поле type этой структуры равно 0, то сессия дохлая, 1 - активная.
Пишется элементарная прога на C, которая просто заменяет 1 на 0 в
нужном месте и все. Урощенный фрагмент моей проги (имя пользователя для
"убийства" передается через аргументы командной строки:
struct radutmp ru;
int fd;
int pos;
.........
fd=open("/usr/local/var/log/radius/radutmp",O_RDWR);
pos=0;
while (read(fd,&ru,sizeof(ru))==sizeof(ru)) {
if (ru.type==1 && !strncmp(ru.login,argv[1],32)) {
ru.type=0;
lseek(fd,pos,SEEK_SET);
write(fd,&ru,sizeof(ru));
break;
}
pos=lseek(fd,0,SEEK_CUR);
}
close(fd);
По крайней мере у меня это так работает.
Если все таки считаете, что дело в radwtmp (я честно говоря сомневаюсь),
то структура должна быть (но не обязана :))) аналогичной системному wtmp
(man wtmp). Далее как и выше - пишется прога, меняющая где-то что-то на
нечто.