导航
导航
文章目录
  1. 方法一
  2. 方法二
  3. 方法三

Freeradius中radacct表groupname空值解决方案

默认情况下,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}')

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

支持一下
扫一扫,支持一下