GetClientQuery SQL query, and the results of that
               query are used to add details of RADIUS Clients that Radiator will respond
               to. If you wish, you can have some client details in your Radiator
               configuration file, and some in ClientListSQL
               (although this might be confusing to future administrators).ClientListSQL.DBSource. The database can store all the same
                  parameters that are used to configure a
                  <Client> clause. For more information, see
                  Section 3.14. <Client xxxxxx>. The recommend
                  configuration with Radiator 4.24 and later is to use
                  ClientColumnDef with
                  GetClientQuery. For more information about
                  ClientColumDef, see Section 3.16.2. ClientColumnDef.GetClientQuery works with the sample database schemas
                  provided in the goodies/ of your Radiator
                  distribution. GetClientQuery defaults
                  to:select NASIDENTIFIER,SECRET,IGNOREACCTSIGNATURE,DUPINTERVAL,
            DEFAULTREALM,NASTYPE,SNMPCOMMUNITY,LIVINGSTONOFFS,
            LIVINGSTONHOLE,FRAMEDGROUPBASEADDRESS,
            FRAMEDGROUPMAXPORTSPERCLASSC,REWRITEUSERNAME,
            NOIGNOREDUPLICATES,PREHANDLERHOOK from RADCLIENTLIST
               ClientColumnDef is not configured, the other
                  fields must occur in the given order. When they occur, they are used to
                  initialise the Client parameter of the same name as
                  shown above. The FRAMEDGROUPBASEADDRESS column may
                  contain multiple comma-separated base addresses. The
                  PREHANDLERHOOK column can contain either the text of
                  a hook or a hook filename in the form
                  ‘file:/path/to/hook’. You can customise the
                  GetClientQuery select clause to have additional
                  fields. If they are present in the result of
                  GetClientQuery, they are used as described below.
                  Field number 0 as the first field, so for example
                  Identifier, field 14 has an index of 14, but is the
                  15th entry in the returned array.Identifier field as field 14DefaultReply as field 15FramedGroup as field 16StripFromReply as field 17AllowInReply as field 18AddToReply as field 19AddToReplyIfNotExist as field 20DynamicReply as field 21AddToRequest as field 22StripFromRequest as field 23AddToRequestIfNotExist as field 24ClientHook as field 25UseContentsForDuplicateDetection as field
                     26IgnoreAcctSignature,UseOldAscendPasswords,StatusServerShowClientDetails",
                     it sets the IgnoreAcctSignature,
                     UseOldAscendPasswords, and
                     StatusServerShowClientDetails flag parameters in
                     the resulting Client.TACACSPLUSKey as field 28# Our custom client table only has NAS identifier, # shared secret and default realm in it: GetClientQuery select NAME,SECRET,NULL,NULL,DREALM from CLIENTSHere is the same example with
ClientColumnDef: 
                  # We do not need to pad with NULL columns GetClientQuery select NAME,SECRET,DREALM from CLIENTS ClientColumnDef 0, Name ClientColumnDef 1, Secret ClientColumnDef 2, DefaultRealm
GetClientQuery
                  and the parameters used to define a Client. If
                  ClientColumnDef is not specified, the mapping is the
                  default as described in Section 3.16.1. GetClientQueryClientColumnDef is:ClientColumnDef n,clientparamname
n is the column number of the fields as returned by
                  GetClientQuery (starting at 0), and
                  clientparamname is the name of the Client clause
                  parameter or special value GENERIC.ClientColumnDef parameters. The only ones that must
                  be provided are for Name and Secret. If
                  the specified column has NULL value, then the matching
                  clientparamname will not be set and will assume its
                  default value according to the normal behaviour of the Client
                  clause.clientparamname
                  GENERIC indicates that the column is a list of comma
                  separated clientparamname=value pairs. For examples
                  of this format, see AuthColumnDef in AuthBy
                     SQLgoodies/ of your Radiator
                  distribution.GetClientQuery select NASIDENTIFIER, SECRET from RADCLIENTLIST ClientColumnDef 0, Name ClientColumnDef 1, Secret
Identifier parameter, see Section 3.14.14. Identifier. Column
                  3 must contain name=value pairs, for
                  example:
                  StatusServer=minimal,RequireMessageAuthenticator=1.GetClientQuery select NASIDENTIFIER, SECRET, CLIENT_IDENTIFIER, GENERIC \
                      from RADCLIENTLIST
ClientColumnDef 0, Name
ClientColumnDef 1, Secret
ClientColumnDef 2, Identifier
ClientColumnDef 3, GENERIC
            # Reread the client list every hour RefreshPeriod 3600
func() to configure the database
                  connection in customised ways. The hook is called with 2 arguments. The
                  first is a reference to the clause object that is making the connection.
                  The second argument is the DBH handle to the newly connected
                  database.ConnectionHook sub {$_[1]->func(-access_mode => 'read_write',\
      -isolation_level => 'read_committed',\
      -lock_resolution => 'wait',\
      'ib_set_tx_param')}
            $object,
                  $dbsource, $dbusername,
                  $dbauth. $object is the SqlDb
                  object trying to connect. The other parameters are the currently used
                  values for DBSource, DBUsername,
                  and DBAuth.ConnectionAttemptFailedHook sub { \
 my $self = $_[0]; my $dbsource = $_[1]; \
 my $dbusername = $_[2]; my $dbauth = $_[3]; \
 $self->log($main::LOG_ERR, "Could not connect to SQL database with DBI->connect \
            $dbsource, $dbusername, $dbauth: $@ $DBI::errstr"); }
            $object. $object is
                  the SqlDb object that was trying to connect.NoConnectionsHook sub { \
  my $self = $_[0]; \
  $self->log($main::LOG_ERR, "Could not connect to any SQL database"); }
            RefreshPeriod and global FarmSize
                  parameters are configured.# Reread the client list every hour, use 30 second offset between each worker RefreshPeriod 3600 FarmWorkerSpacing 30