Hello Michael -
We'll investigate this a bit further.
BTW - some people put a unique index on the accounting table using something
like Acct-Session-Id + Timestamp to avoid duplicates.
Otherwise you can use a stored procedure in the database to do whatever you
need (or not).
regards
Hugh
On 16 Sep 2010, at 14:43, Michael wrote:
> Debian 4.0
> Perl, v5.8.8 built for x86_64-linux-gnu-thread-multi
> DBI v1.53
> mysqld Ver 5.0.32-Debian_7etch12-log for pc-linux-gnu on x86_64 (Debian etch
> distribution)
>
>
> since my radiator config is quite lengthy, i'll just post what i think is the
> relevant parts. if you would like to know more, let me know. There are also
> a few very custom things I do to identify what type of service the connection
> is coming from, handling of Acct Gigawords and Acct Octets, etc... so,
> there's going to be a few things in the debug/config that you wont recognize.
>
> <Client> section allows specific NAS's
>
> #All accounting packets for all NAS'S handled here:
> <Handler Request-Type = "Accounting-Request", \
> Acct-Status-Type = Start|Stop>
> Identifier accounting
>
> SessionDatabase sessdb
>
> PreProcessingHook file:"%D/conf/hook.PreProcessingHook"
>
> AuthByPolicy
> AuthBy SQL-1-Accounting
> </Handler>
> <AuthBy SQL>
>
> Identifier SQL-1-Accounting
>
> DBSource dbi:mysql:yyy:yyy
> DBUsername yyy
> DBAuth yyy
>
>
> Timeout 3
> FailureBackoffTime 300
>
>
> # a few attributes added to radius packet via previous Hook file.
> AccountingTable `acct`
> AcctColumnDef `submitted_un`,%u,formatted
> AcctColumnDef `auth_un`,auth-un
> AcctColumnDef `zone`,zone
> AcctColumnDef `uid`,uid
> AcctColumnDef `timestamp`,Timestamp
> AcctColumnDef `type`,Acct-Status-Type
> AcctColumnDef `acct_delay_time`,Acct-Delay-Time
> AcctColumnDef `upload`,total-input-octets
> AcctColumnDef `download`,total-output-octets
> AcctColumnDef `sess_id`,Acct-Session-Id
> AcctColumnDef `sess_time`,Acct-Session-Time
> AcctColumnDef `term_cause`,Acct-Terminate-Cause
> AcctColumnDef `nas_ip_address`,NAS-IP-Address
> AcctColumnDef `ip_address`,Framed-IP-Address
> AcctColumnDef `service`,service
>
> AcctFailedLogFileName
> %L/accounting-missed/logfile.sql-failed.acct.%Y%m%d
> </AuthBy>
>
>
>
>
> Thu Sep 16 15:19:48 2010: DEBUG: Packet dump:
> *** Received from 192.168.100.1 port 1646 ....
> Code: Accounting-Request
> Identifier: 75
> Authentic: <133><139><188><253><225><157><240>[Lo<175><236><127><144><161><31>
> Attributes:
> Acct-Session-Id = "00000620"
> Framed-Protocol = PPP
> Framed-IP-Address = 192.168.100.100
> User-Name = "dsltest"
> Acct-Authentic = RADIUS
> Acct-Status-Type = Start
> NAS-Port-Type = Ethernet
> NAS-Port = 100
> NAS-Port-Id = "0/0/0/431"
> Class = "FED,100,dsltest"
> Service-Type = Framed-User
> NAS-IP-Address = 192.168.100.1
> Ascend-Session-Svr-Key = "AA39FB66"
> NAS-Identifier = "TEST-LNS-1"
> Acct-Delay-Time = 0
>
> Thu Sep 16 15:19:48 2010: DEBUG: hook.service-label: finding service-label
> for NAS-Port=(100)
> Thu Sep 16 15:19:48 2010: DEBUG: hook.service-label: service-label=(testing)
> Thu Sep 16 15:19:48 2010: DEBUG: hook.service-label: add_attr(service=testing)
> Thu Sep 16 15:19:48 2010: DEBUG: Handling request with Handler 'Request-Type
> = "Accounting-Request", Acct-Status-Type = Start|Stop', Identifier
> 'accounting'
> Thu Sep 16 15:19:48 2010: DEBUG: hook.PreProcessingHook: executing.
> Thu Sep 16 15:19:48 2010: DEBUG: hook.PreProcessingHook: changed
> Acct-Status-Type Start to login.
> Thu Sep 16 15:19:48 2010: DEBUG: hook.PreProcessingHook: loading attrs from
> Class.
> Thu Sep 16 15:19:48 2010: DEBUG: Handling with Radius::AuthSQL:
> SQL-1-Accounting
> Thu Sep 16 15:19:48 2010: DEBUG: Handling accounting with Radius::AuthSQL
> Thu Sep 16 15:19:48 2010: DEBUG: do query is: 'insert into `acct`
> (`acct_delay_time`,`auth_un`,`ip_address`,`nas_ip_address`,`service`,`sess_id`,`submitted_un`,`timestamp`,`type`,`uid`,`zone`)
> values
> ('0','dsltest','192.168.100.100','192.168.100.1','testing','00000620','dsltest','1284664788','login','100','FED')':
>
> Thu Sep 16 15:19:51 2010: ERR: do failed for 'insert into `acct`
> (`acct_delay_time`,`auth_un`,`ip_address`,`nas_ip_address`,`service`,`sess_id`,`submitted_un`,`timestamp`,`type`,`uid`,`zone`)
> values
> ('0','dsltest','192.168.100.100','192.168.100.1','testing','00000620','dsltest','1284664788','login','100','FED')':
> SQL Timeout
> Thu Sep 16 15:19:54 2010: ERR: do failed for 'insert into `acct`
> (`acct_delay_time`,`auth_un`,`ip_address`,`nas_ip_address`,`service`,`sess_id`,`submitted_un`,`timestamp`,`type`,`uid`,`zone`)
> values
> ('0','dsltest','192.168.100.100','192.168.100.1','testing','00000620','dsltest','1284664788','login','100','FED')':
> SQL Timeout
> Thu Sep 16 15:19:54 2010: DEBUG: AuthBy SQL result: IGNORE, Database failure
>
> ### timeout value 3 * 2 queries = 6 seconds and 2 possible accounting
> duplicates.
> ### omitted here is the exact same debug lines from another Start packet from
> the NAS since it timed out and retransmitted.
>
>
> ### here's the Stop packet coming through trying an insert again, not obeying
> FailureBackoffTime.
>
> *** Received from 192.168.100.1 port 1646 ....
> Code: Accounting-Request
> Identifier: 76
> Authentic: <130><28><130><231>C<233><2><135><30><142><206><148><156>T~<160>
> Attributes:
> Acct-Session-Id = "00000620"
> Framed-Protocol = PPP
> Framed-IP-Address = 192.168.100.100
> User-Name = "dsltest"
> Acct-Authentic = RADIUS
> Acct-Session-Time = 4
> Acct-Input-Octets = 880
> Acct-Output-Octets = 116
> Acct-Input-Packets = 12
> Acct-Output-Packets = 7
> Acct-Terminate-Cause = User-Request
> Acct-Status-Type = Stop
> NAS-Port-Type = Ethernet
> NAS-Port = 100
> NAS-Port-Id = "0/0/0/431"
> Class = "FED,100,dsltest"
> Service-Type = Framed-User
> NAS-IP-Address = 192.168.100.1
> Ascend-Session-Svr-Key = "AA39FB66"
> NAS-Identifier = "TEST-LNS-1"
> Acct-Delay-Time = 0
>
> Thu Sep 16 15:19:54 2010: DEBUG: hook.service-label: finding service-label
> for NAS-Port=(100)
> Thu Sep 16 15:19:54 2010: DEBUG: hook.service-label: service-label=(testing)
> Thu Sep 16 15:19:54 2010: DEBUG: hook.service-label: add_attr(service=testing)
> Thu Sep 16 15:19:54 2010: DEBUG: Handling request with Handler 'Request-Type
> = "Accounting-Request", Acct-Status-Type = Start|Stop', Identifier
> 'accounting'
> Thu Sep 16 15:19:54 2010: DEBUG: hook.PreProcessingHook: executing.
> Thu Sep 16 15:19:54 2010: DEBUG: hook.PreProcessingHook: changed
> Acct-Status-Type Stop to logout.
> Thu Sep 16 15:19:54 2010: DEBUG: hook.PreProcessingHook: loading attrs from
> Class.
> Thu Sep 16 15:19:54 2010: DEBUG: hook.PreProcessingHook: calculating
> total-output-octets and total-input-octets.
> Thu Sep 16 15:19:54 2010: DEBUG: Handling with Radius::AuthSQL:
> SQL-1-Accounting
> Thu Sep 16 15:19:54 2010: DEBUG: Handling accounting with Radius::AuthSQL
> Thu Sep 16 15:19:54 2010: DEBUG: do query is: 'insert into `acct`
> (`acct_delay_time`,`auth_un`,`download`,`ip_address`,`nas_ip_address`,`service`,`sess_id`,`sess_time`,`submitted_un`,`term_cause`,`timestamp`,`type`,`uid`,`upload`,`zone`)
> values
> ('0','dsltest','116','192.168.100.100','192.168.100.1','testing','00000620','4','dsltest','User-Request','1284664794','logout','100','880','FED')':
>
> Thu Sep 16 15:19:57 2010: ERR: do failed for 'insert into `acct`
> (`acct_delay_time`,`auth_un`,`download`,`ip_address`,`nas_ip_address`,`service`,`sess_id`,`sess_time`,`submitted_un`,`term_cause`,`timestamp`,`type`,`uid`,`upload`,`zone`)
> values
> ('0','dsltest','116','192.168.100.100','192.168.100.1','testing','00000620','4','dsltest','User-Request','1284664794','logout','100','880','FED')':
> SQL Timeout
> Thu Sep 16 15:20:00 2010: ERR: do failed for 'insert into `acct`
> (`acct_delay_time`,`auth_un`,`download`,`ip_address`,`nas_ip_address`,`service`,`sess_id`,`sess_time`,`submitted_un`,`term_cause`,`timestamp`,`type`,`uid`,`upload`,`zone`)
> values
> ('0','dsltest','116','192.168.100.100','192.168.100.1','testing','00000620','4','dsltest','User-Request','1284664794','logout','100','880','FED')':
> SQL Timeout
> Thu Sep 16 15:20:00 2010: DEBUG: AuthBy SQL result: IGNORE, Database failure
>
> ### omitted here is the exact same debug lines from another Stop packet from
> the NAS since it timed out and retransmitted.
>
>
>
>
> On 10-09-16 03:00 PM, Hugh Irvine wrote:
>>
>> Hello Michael -
>>
>> We'll need to see a copy of the configuration file (no secrets), together
>> with a more complete trace 4 debug showing what is happening.
>>
>> We will also need to know what hardware/software platform you are running
>> on, what version of Perl, what version of DBI/DBD, what SQL database, and
>> anything else that might be useful.
>>
>> regards
>>
>> Hugh
>>
>>
>> On 16 Sep 2010, at 13:33, Michael wrote:
>>
>>> Hi,
>>>
>>> I'm having a couple issues with<AuthBy SQL>. Maybe it would be considered a
>>> bug i'm not sure.
>>>
>>>
>>> 1. the Timeout handling.
>>> ------------------------
>>> > From my testing, it appears that radiator times out at this value, but
>>> > seems to retry the sql query a second time, creating in another timeout
>>> > count.
>>>
>>> eg debug:
>>> Tue Sep 14 12:48:21 2010: DEBUG: Handling accounting with Radius::AuthSQL
>>> Tue Sep 14 12:48:21 2010: DEBUG: do query is: 'insert into `acct`<snip>
>>> Tue Sep 14 12:48:25 2010: ERR: do failed for 'insert into `acct`<snip> SQL
>>> Timeout
>>> Tue Sep 14 12:48:29 2010: ERR: do failed for 'insert into `acct`<snip> SQL
>>> Timeout
>>> Tue Sep 14 12:48:29 2010: DEBUG: AuthBy SQL result: IGNORE, Database failure
>>>
>>> Timeout is set for 4 seconds...
>>> so, query executed at 12:48:21, ERR timed out 4 seconds later, appeared to
>>> re-try but didn't say anything, and another ERR timeout 4 seconds after
>>> that. That's 8 seconds of course. It doubles the Timeout value.
>>>
>>> This is no good, for me. If I set my SQL timeout value for 4 seconds, and
>>> my NAS timeout for 5 seconds, I expect my radiator to timeout before my NAS
>>> re-transmits. my NAS will retry after 5 seconds because radiator hasn't
>>> responded. And, radiator hasn't obeyed the timeout so it's still waiting
>>> for 8 seconds. This causes the same accounting packet to enter radiator
>>> again, and causing another 8 seconds delay, and of course duplicate entries
>>> in the accounting logging since I'm also using AcctFailedLogFileName so the
>>> packet will eventually end up in the SQL table.
>>>
>>>
>>> 2. SQL Timeout issue #2.
>>> ------------------------
>>> using the same debug example above, when the SQL query times out, it
>>> doesn't seem to use the FailureBackoffTime value. It only seems to use
>>> FailureBackoffTime when there is a connection failure, not a timeout. So,
>>> every query is still presented to the SQL server. If the timeout is due to
>>> lets say a write lock, when the lock releases, all the queued insert
>>> statements are executed creating in sometimes up to 10 duplicate accounting
>>> entries.
>>>
>>>
>>> 3. AuthBy result after failure
>>> ------------------------------
>>> an IGNORE occurs when the SQL query fails, but if AcctFailedLogFileName is
>>> used, and successfully wrote the accounting packet to the file, should
>>> radiator not then reply with an ACCEPT? Dumping the accounting packet to a
>>> file, but replying with IGNORE will cause the NAS to go to the next radius
>>> server possibly accepting the entry, therefore the packet in the acct
>>> failed logfile, is a double. Even if there's only 1 radiator server in
>>> play, there will be an accounting packet entry in the failed log for each
>>> time the NAS retries.
>>>
>>>
>>> Thanks in advanced for any advice,
>>> Michael
>>>
>>> _______________________________________________
>>> radiator mailing list
>>> [email protected]
>>> http://www.open.com.au/mailman/listinfo/radiator
>>
>>
>>
>> NB:
>>
>> Have you read the reference manual ("doc/ref.html")?
>> Have you searched the mailing list archive
>> (www.open.com.au/archives/radiator)?
>> Have you had a quick look on Google (www.google.com)?
>> Have you included a copy of your configuration file (no secrets),
>> together with a trace 4 debug showing what is happening?
>>
>
NB:
Have you read the reference manual ("doc/ref.html")?
Have you searched the mailing list archive (www.open.com.au/archives/radiator)?
Have you had a quick look on Google (www.google.com)?
Have you included a copy of your configuration file (no secrets),
together with a trace 4 debug showing what is happening?
--
Radiator: the most portable, flexible and configurable RADIUS server
anywhere. Available on *NIX, *BSD, Windows, MacOS X.
Includes support for reliable RADIUS transport (RadSec),
and DIAMETER translation agent.
-
Nets: internetwork inventory and management - graphical, extensible,
flexible with hardware, software, platform and database independence.
-
CATool: Private Certificate Authority for Unix and Unix-like systems.
_______________________________________________
radiator mailing list
[email protected]
http://www.open.com.au/mailman/listinfo/radiator