FreeRADIUS WikiMain Page | About | Help | FAQ | Special pages | Log in

Printable version | Disclaimers | Privacy policy

Rlm sqlcounter

From FreeRADIUS Wiki

Contents

Pre-requisites

Make sure to have configured radiusd with rlm_sqlcounter installed. If you are using FreeRadius version 1.1.0 or newer then Rlm_sqlcounter is installed by default.

Make sure to have radiusd running properly under sql and there must be a "sql" entry under accounting{ } section of radiusd.conf

Configuration

Attributes

check-name
This is the name of the radius attribute that describes the limit of the sqlcounter.
sqlmod-inst
The instance of the rlm_sql that you wish to use to query.
key
The key field in the sql lookup - this is usually the username.
reset
Specifies the frequency that the sqlcounter should be reset. Available options are: hourly, daily, weekly, monthly and never.
query
The sql expresion that is queried - often from the radacct table. The resulting value can then be compared with the value from check-name.

Example Setup

sqlcounter noresetcounter {
counter-name = Max-All-Session-Time
check-name = Max-All-Session
sqlmod-inst = sql
key = User-Name
reset = never
query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE UserName='%{%k}'"
}
sqlcounter dailycounter {
driver = "rlm_sqlcounter"
counter-name = Daily-Session-Time
check-name = Max-Daily-Session
sqlmod-inst = sqlcca3
key = User-Name
reset = daily
query = "SELECT SUM(AcctSessionTime - GREATEST((%b - UNIX_TIMESTAMP(AcctStartTime)), 0)) FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAMP(AcctStartTime) + AcctSessionTime > '%b'"
}
sqlcounter monthlycounter {
counter-name = Monthly-Session-Time
check-name = Max-Monthly-Session
sqlmod-inst = sqlcca3
key = User-Name
reset = monthly
query = "SELECT SUM(AcctSessionTime - GREATEST((%b - UNIX_TIMESTAMP(AcctStartTime)), 0)) FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAMP(AcctStartTime) + AcctSessionTime > '%b'"
}
query = "SELECT SUM(AcctSessionTime) FROM radacct WHERE UserName='%{%k}'"
query = "SELECT SUM(AcctSessionTime - GREATER((%b - AcctStartTime::ABSTIME::INT4), 0)) FROM radacct WHERE UserName='%{%k}' AND AcctStartTime::ABSTIME::INT4 + AcctSessionTime > '%b'"
query = "SELECT SUM(AcctSessionTime - GREATER((%b - AcctStartTime::ABSTIME::INT4), 0)) FROM radacct WHERE UserName='%{%k}' AND AcctStartTime::ABSTIME::INT4 + AcctSessionTime > '%b'"
CREATE OR REPLACE FUNCTION "greater"(integer, integer) RETURNS integer AS '
DECLARE
res INTEGER;
one INTEGER := 0;
two INTEGER := 0;
BEGIN
one = $1;
two = $2;
IF one IS NULL THEN
one = 0;
END IF;
IF two IS NULL THEN
two = 0;
END IF;
IF one > two THEN
res := one;
ELSE
res := two;
END IF;
RETURN res;
END;
' LANGUAGE 'plpgsql';
modules {
$INCLUDE ${confdir}/sqlcounter.conf
...some other entries here...
}
authorize {
...some entries here...
noresetcounter
dailycounter
monthlycounter
}
noresetcounter 
the counter that never resets, can be used for real session-time cumulation
dailycounter 
the counter that resets everyday, can be used for limiting daily access time (eg. 3 hours a day)
monthlycounter 
the counter that resets monthly, can be used for limiting monthly access time (eg. 50 hours per month)

You can make your own names and directives for resetting the counter by reading the sample sqlcounter configuration in raddb/experimental.conf

Implementation

Add sqlcounter names to be used into radcheck or radgroupcheck table appropriately for sql. For users file just follow the example below.

Note: The users in the example below must be able to login normally as the example will only show how to apply sqlcounter counters.

Scenarios

test0001 Max-All-Session := 54000, Cleartext-Password := "blah"
Service-Type = Framed-User,
Framed-Protocol = PPP
or for sql make sure to have Max-All-Session entry under either radcheck or radgroup check table:
> INSERT into radcheck VALUES ('','test0001','Max-All-Session','54000',':=');


test0002 Max-Daily-Session := 10800, Cleartext-Password := "blah"
Service-Type = Framed-User,
Framed-Protocol = PPP
or in sql:
> INSERT into radcheck VALUES ('','test0002','Max-Daily-Session','10800',':=');


test0003 Max-Monthly-Session := 324000, Cleartext-Password := "blah"
Service-Type = Framed-User,
Framed-Protocol = PPP
in sql:
> INSERT into radcheck VALUES ('','test0003','Max-Monthly-Session','10800',':=');


Note that Max-All-Session, Max-Daily-Session and Max-Monthly-Session are defined in sqlcounter.conf

VERY IMPORTANT Accounting must be done via sql or this will not work.

Retrieved from "http://wiki.freeradius.org/Rlm_sqlcounter"

This page has been accessed 7,535 times. This page was last modified 18:19, 1 September 2007.


Find
Browse
Main Page
Community portal
Current events
Recent changes
Random page
Help
Donations
Edit
Edit this page
Editing help
This page
Discuss this page
Post a comment
Printable version
Context
Page history
What links here
Related changes
My pages
Log in / create account
Special pages
New pages
File list
Statistics
Bug reports
More...