WangYan BLog

WangYan''s Blog 发现、实践、分享!

1

Freeradius中radacct表groupname空值解决方案

默认情况下,Freeradius中的radacct表groupname字段是为空值。你若要查询某个用户它属于哪个组,本月使用了多少流量,该怎么做?

方法一

是的,一开始我也是双表关联查询。优点简单易于理解,也不需要改配置文件,缺点是不方便,也不直观。

1
2
3
4
5
SELECT radacct.username, radusergroup.groupname, SUM( radacct.acctinputoctets + radacct.acctoutputoctets ) /1048576 AS transfer
FROM radacct, radusergroup
WHERE radacct.username = radusergroup.username
GROUP BY username
ORDER BY transfer DESC;

方法二

方法一,明显没有解决问题,只是个折中方案。在freeradius邮件列表上,有人对此也感到困惑,他们给出方法是:在 radreply 或 radgroupreply 表使用 Class 属性。具体如下:

首先,找到 accounting_start_query 查询(193行左右),在 username 后面添加 groupname,然后在 '%{SQL-User-Name}' 后面添加 '%{Class}'。

1
vim /usr/local/radius/etc/raddb/sql/mysql/dialup.conf

然后,登录mysql,往 radgroupreply 表插入一条记录

1
INSERT INTO radgroupreply (groupname,attribute,op,VALUE) VALUES ('SVIP','Class',':=','SVIP');

最后重启下radiusd,看!Radacct表中的groupname已经有值了。
可惜,是十六进制的!这就是缺点。。。

方法三

方法二,过于麻烦但思路正确,于是我想到了'%{Sql-Group}',但最后失败了,原因是它不能在accounting_start_query 查询中使用,在即将绝望之际忽然想到,能不能用一个子查询来代替'%{Sql-Group}'呢?最后一试,成功了。。。

找到 accounting_start_query 查询(193行左右),首先在 username 后面添加 groupname,然后在 '%{SQL-User-Name}' 后面添加子查询语句。

1
(SELECT groupname FROM ${usergroup_table} WHERE username = '%{SQL-User-Name}')

最后,大功告成!单表即可查出用户、用户组、及流量使用情况!

原文地址 : http://wangyan.org/blog/groupname-field-blank-in-radacct.html
本站遵循 : 知识共享署名-非商业性使用-相同方式共享 3.0 版权协议
版权声明 : 原创文章转载时,请务必以超链接形式标明 文章原始出处
作者:WangYan | 分类: | 标签: Null
上一篇:Nginx反向代理feedburner | 下一篇:CentOS 创建本地YUM软件库

仅有一条评论 »

发表新评论 »
  1. 小新
    小新 2011/12/03

    方法三的确可行,但是又发现新问题了
    改了之后,测试连接用户,查看radacct表里不显示,只有断开之后才能显示,这样就无法查看当前在线用户了

发表新评论 »