issue with dialup.conf

Tyller D tyllerd at gmail.com
Mon Feb 7 08:18:48 CET 2011


I think I found the mistake

                radcheck.value = radcheck.value - '%{Acct-Output-Octets}' -
'%{Acct-Input-Octets}' \

should be

                radcheck.value = 'radcheck.value' - '%{Acct-Output-Octets}'
- '%{Acct-Input-Octets}' \

that query wouldn't run before but does after i quote 'radcheck.value'.

Hopefully that fixes the issue.

Thanks

On Mon, Feb 7, 2011 at 8:48 AM, Tyller D <tyllerd at gmail.com> wrote:

> Hi
>
> The main reason I am doing it this way to send the correct attributes per
> location.
> Hopefully this explains whats happening.
>
>
> perl.pl
>
> .....
> if ( $device =~ /^nomadix/i ) {
> if ($DATABANK != '') {
>
>                 if ( $DATABANK le 0 ) {
>                                            $RAD_REPLY{'Reply-Message'} =
> "You have no more Data Left";
>                                         return RLM_MODULE_REJECT;
>
>                 }else {
>
>                                         return RLM_MODULE_REJECT;
>
>                                         $RAD_REPLY{'Nomadix-MaxBytesDown'}
> = "$DATABANK";
>                 }
> .....
> if ( $device =~ /^mikrotik/i ) {
> if ($DATABANK != '') {
>                 if ( $DATABANK <= 0 ) {
>
>                                            $RAD_REPLY{'Reply-Message'} =
> "You have no more Data Left";
>                                         return RLM_MODULE_REJECT;
>
>                 }else {
>
>                                         $RAD_REPLY{'Mikrotik-Xmit-Limit'} =
> "$DATABANK";
>
>                 }
>
>
> exctract from radcheck:
>
> +------+----------+--------------------+----+----------+
> | id   | username | attribute          | op | value    |
> +------+----------+--------------------+----+----------+
> | 3069 | Joe  | databank           | := | 52428800 |
> | 3068 | Joe  | Cleartext-Password | := | Joe123   |
> | 3070 | Joe  | Auth-Type          | := | Perl     |
> +------+----------+--------------------+----+----------+
>
> stop query
>
>     accounting_stop_query = " \
>           UPDATE radacct,radcheck SET \
>              radacct.acctstoptime       = '%S', \
>              radacct.acctsessiontime    = '%{Acct-Session-Time}', \
>              radacct.acctinputoctets    = '%{%{Acct-Input-Gigawords}:-0}'
> << 32 | \
>                                   '%{%{Acct-Input-Octets}:-0}', \
>              radacct.acctoutputoctets   = '%{%{Acct-Output-Gigawords}:-0}'
> << 32 | \
>                                   '%{%{Acct-Output-Octets}:-0}', \
>              radacct.acctterminatecause = '%{Acct-Terminate-Cause}', \
>                 radcheck.value = radcheck.value - '%{Acct-Output-Octets}' -
> '%{Acct-Input-Octets}', \
>              radacct.acctstopdelay      = '%{%{Acct-Delay-Time}:-0}', \
>              radacct.connectinfo_stop   = '%{Connect-Info}' \
>           WHERE radacct.acctsessionid   = '%{Acct-Session-Id}' \
>         AND radcheck.username = '%{SQL-User-Name}' \
>         AND radcheck.attribute = 'databank' \
>           AND radacct.username          = '%{SQL-User-Name}' \
>           AND radacct.nasipaddress    = '%{NAS-IP-Address}'"
>
>
>         accounting_stop_query_alt = " \
>
>           UPDATE radacct,radcheck SET \
>              radacct.acctstoptime    = '%S', \
>              radacct.acctsessiontime    = '%{Acct-Session-Time}', \
>              radacct.acctinputoctets    = '%{%{Acct-Input-Gigawords}:-0}'
> << 32 | \
>                                   '%{%{Acct-Input-Octets}:-0}', \
>              radacct.acctoutputoctets   = '%{%{Acct-Output-Gigawords}:-0}'
> << 32 | \
>                                   '%{%{Acct-Output-Octets}:-0}', \
>              radacct.acctterminatecause = '%{Acct-Terminate-Cause}', \
>              radacct.acctstopdelay    = '%{%{Acct-Delay-Time}:-0}', \
>              radacct.connectinfo_stop   = '%{Connect-Info}', \
>                 radcheck.value = radcheck.value - '%{Acct-Output-Octets}' -
> '%{Acct-Input-Octets}' \
>
>           WHERE radacct.acctsessionid   = '%{Acct-Session-Id}' \
>           AND radacct.username          = '%{SQL-User-Name}' \
>           AND radacct.nasipaddress    = '%{NAS-IP-Address}' \
>
>           AND radcheck.username                = '%{SQL-User-Name}' \
>           AND radcheck.attribute = 'databank'"
>
>
> So the thoery is this, user tries to login, we check the NAS device , check
> the databank and get the values and send the reply-attribute that suits the
> gateway (else fail). when the user sends the stop query we re-update the the
> databank value in the radcheck table.
>
> so the value for databank in the radcheck table should always be equal to
> databank - sum(acctoutputoctest + acctinputoctets)
>
> but it not always exectuting stop request correctly because
>
> mysql> select sum(acctinputoctets + acctoutputoctets) from radacct where
> username='scotty';
> +-----------------------------------------+
> | sum(acctinputoctets + acctoutputoctets) |
> +-----------------------------------------+
> |                              1840263628 |
> +-----------------------------------------+
>
>
> mysql> select value from radcheck where username='scotty' and
> attribute='databank';
> +------------+
> | value      |
> +------------+
> | -302340151 |
> +------------+
>
>
> Do you guys see where I have made an error?
>
>
>
> On Mon, Feb 7, 2011 at 12:56 AM, Fajar A. Nugraha <list at fajar.net> wrote:
>
>> On Mon, Feb 7, 2011 at 1:08 AM, Tyller D <tyllerd at gmail.com> wrote:
>> > Hi
>> >
>> > I will try run the queries manually and see what happens.
>> >
>> > rlm_sqlcounter is cool, but this should work right?
>>
>> The idea looks good.
>>
>> However, since you're trying to reimplement what's already available,
>> you might have a hard time trying to get everything right. For
>> example, what happens when a user exceeds their quota? Your setup
>> would accept the user while sending a negative quota (which might or
>> might not work).
>>
>> On my implmentation, I use rlm_sqlcounter, but I changed the way it
>> gets the numbers. I didn't like the way it does a sum() on radacct
>> every time a user logs in (one of the reasons were I want to delete
>> old entries from my radacct table), so I created an additional table
>> to record total usage, and update it using sql trigger. So instead of
>> having to examine thousands of rows when a user logs in, now the db
>> simply has to examine one row, plus update that row when a user logs
>> out. This way I can still make use of rlm_sqlcounter without having to
>> reinvent the whole logic behind it.
>>
>> --
>> Fajar
>> -
>> List info/subscribe/unsubscribe? See
>> http://www.freeradius.org/list/users.html
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freeradius.org/pipermail/freeradius-users/attachments/20110207/d76a28dc/attachment.html>


More information about the Freeradius-Users mailing list