freeradius and ADSL-Agent-Circuit-Id

Mike mike-freeradius at
Thu Jul 29 00:36:47 CEST 2010

Johan Meiring wrote:
> On 2010/07/21 11:00 AM, Alan DeKok wrote:
>> authorize {
>>     ...
>>     if (ADSL-Agent-Circuit-Id&&  \
>>         ("%{sql: select ...}")) {
>>         update control {
>>             Auth-Type := Accept
>>         }
>>     }
>>     else {
>>         reject
>>     }
>> }
> I disagree with the logic slightly.
> In my opinion it will also be rejected if ADSL-Agent-Circuit-Id does 
> not exist.
> As fas as I understand, the desireable result is:
> If the ADSL-Agent-Circuit-Id does *not* exist, normal authentication 
> must happen.
> If it *does* exist, accept or reject, depending on its value.
> Would this not work better?
> authorize {
>     ...
>     if (ADSL-Agent-Circuit-Id) {
>         if ("%{sql: select ...}") {
>             update control {
>                 Auth-Type := Accept
>             }
>         }
>         else {
>             reject
>         }
>     }
> }
I have been attempting to implement this advice. I can use a 'select 
count(*)' sql query and based on wether the value is 1, I can then set 
Auth-Type := Accept just like it's written above. But, there's 
additional processing that is desireable that I just can't figure out 
how to do here. Instead of just blindly setting Accept, I might want to 
proceed with having the sql module do group processing and so forth to 
finally accumulate all of the reply attributes that apply to this 
request. Maybe that reply is 'Auth-Type := Reject" but then others 
contain 'Accept' along with framed-ip-address and so forth. This would 
involve using a modified sql query in the event that 
ADSL-Agent-Circuit-Id is present, and there doesn't appear to be any way 
at run time to make that selection.

I am getting the impression that perhaps I need to run maybe a second 
server that has it's sql configured with queries tailored for the 
presence of this attribute, and then proxy requests from the primary 
server to this one in this case. I could probably run it on lookback on 
another port so that the radius clients don't have to know anything 
about it. Still it's a bit of work but that seems to be the only way 
possible to make sql query one database if the attribute is present, and 
query another if it's not (or, use different queries).

Would love more insight if anyone cares to share.

Thank you.

More information about the Freeradius-Users mailing list