归档文章 (2011-2017)

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

方法一

是的,一开始我也是双表关联查询。优点简单易于理解,也不需要改配置文件,缺点是不方便,也不直观。
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}’。
vim /usr/local/radius/etc/raddb/sql/mysql/dialup.conf
然后,登录mysql,往 radgroupreply 表插入一条记录
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}’ 后面添加子查询语句。
(SELECT groupname FROM ${usergroup_table} WHERE username = '%{SQL-User-Name}')
最后,大功告成!单表即可查出用户、用户组、及流量使用情况!
If you have any questions, please contact me.