我正在使用 openvpn 和 free-radius 来控制用户帐户。对于用户的最大会话时间,free-radius 有 sqlcounter.conf 来控制它,但是在连接断开后,它很有用并且不能破坏连接。为了动态控制帐户时间,我需要另一个执行此操作的脚本。但只要连接建立,触发器就应该运行。有没有办法在建立连接后触发自定义触发器或脚本?或者有什么方法可以动态控制会话时间?
答案1
经过几次搜索,我找不到这样做的方法,但知道何时建立连接的方法是使用 radius 日志文件和 radius 数据库。mysql 没有更改通知方法,但对于日志文件可以使用文件系统通知补丁,例如 dnotify“过去”和 inotify 库。我开始使用它并发布该结果。
答案2
我这样做了,使用寻找程序更改的 ac 程序,您可以检查用户与 openvpn 的连接。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <linux/inotify.h>
#include <sys/select.h>
#define EVENT_SIZE ( sizeof (struct inotify_event) )
#define EVENT_BUF_LEN ( 1024 * ( EVENT_SIZE + 16 ) )
int event_check (int fd)
{
fd_set rfds;
FD_ZERO (&rfds);
FD_SET (fd, &rfds);
/* Wait until an event happens or we get interrupted
by a signal that we catch */
return select (FD_SETSIZE, &rfds, NULL, NULL, NULL);
}
int main( )
{
int length, i = 0;
int fd;
int wd;
while(1){
i=0;
fd = inotify_init();
if ( fd < 0 ) {
perror( "inotify_init" );
}
wd = inotify_add_watch( fd, "/tmp/test", IN_CLOSE_WRITE);
if (event_check (fd) > 0)
{
char buffer[EVENT_BUF_LEN];
int count = 0;
length = read( fd, buffer, EVENT_BUF_LEN );
if ( length < 0 ) {
perror( "read" );
}
while ( i < length ) { struct inotify_event *event = ( struct inotify_event * ) &buffer[ i ];
printf( "New file %s Editted.\n", event->name );
i += EVENT_SIZE + event->len;
}
}
}
inotify_rm_watch( fd, wd );
close( fd );
}
但这不是很好的代码,但它可以工作,有人可以写出更好的代码吗?