Hi,

I would like to contribute following snippet I use for FarmChildHook EAP 
environments where I have a backend radius behind HASHBALANCE or similar.

The hook shows how to accomplish following:

1. Add farminstance to Acctport and Authport of the base config and reopen 
ports.

This is nice for setting up a backend with multiple ports where to point 
HASHBALANCE at.

2. Walk over all authby in the config and hash the list of db credentials.

This way you can configure multiple databases in the main config and the hook 
picks a differnt database for each child.

The code could easily be modified to rotate the list of databases by the child 
number for a similar effect whilst keeping failover capability to the other 
databases.

3. Also note the rather high number fo MaxFailedRequests in HASHBALANCE.  I saw 
the backends get marked bad instantly when activating this in a high load 
enviroment with a low number fo MaxFailedRequests.  I never quite found out why 
but assume this was due to interfering with in progress EAP transactions.  A 
value of 10 keeps the hashbalance happy until the backend really dies.  YMMW of 
course.

Feel free to add this to the radiator goodies directory.

Greetings and have fun
Christian Kratzer
CK Software GmbH


How to use in the fronend:
--------------------------

     <Handler>
        <AuthBy HASHBALANCE>
            FailureBackoffTime 60
            Secret mysecret
            MaxFailedRequests 10
            Retries 0

            <Host ::1>
                AuthPort 10001
                AcctPort 20001
            </Host>
            <Host ::1>
                AuthPort 10002
                AcctPort 20002
            </Host>
            <Host ::1>
                AuthPort 10003
                AcctPort 20003
            </Host>
            ...
        </AuthBy>
     </Handler>

How to use in the backend:
--------------------------

     AuthPort      10000
     AcctPort     20000
     FarmSize      4
     FarmChildHook file:"%D/hooks/farmchild.hook"

     <AuthBy SQL>
        Identifier      SQLauth

        DBSource        db1
        DBUsername      user
        DBAuth          pass

        DBSource        db2
        DBUsername      user
        DBAuth          pass

        ...
     </AuthBy>

     <Handler>
        AuthBy          SQLauth
     </Handler>


hooks/farmchild.hook:
---------------------


# ------------------------------------------------------------------------
# FarmChildHook
# close and reopen AuthPort and AcctPort in farmchilds and adds
# farmInstance to the port number
# this also works correctly when farmInstance is >=10 when AuthPort
# 100%O fails.
#
# AuthPort      10000
# AcctPort
# FarmSize      4
# FarmChildHook file:"%D/hooks/farmchild.hook"
#
sub
{
     my $radius_server = $main::config->{radius_server};

     # add farmInstance to AuthPort
     my $authport = Radius::Util::format_special($main::config->{AuthPort});
     if($authport) {
         $authport=$authport + $main::farmInstance;
         &main::log($main::LOG_INFO, "farmchild.hook: AuthPort: $authport");
         $radius_server->{'AuthPort'} = $authport;
     }

     # add farmInstance to AcctPort
     my $acctport = Radius::Util::format_special($main::config->{AcctPort});
     if($acctport) {
         $acctport=$acctport + $main::farmInstance;
         &main::log($main::LOG_INFO, "farmchild.hook: AcctPort: $acctport");
         $radius_server->{'AcctPort'} = $acctport;
     }

     # repoen auth and acct ports if needed
     if($authport || $acctport) {
         &main::log($main::LOG_INFO, "farmchild.hook: repoen ports");
         $radius_server->close_sockets();
         $radius_server->create_ports();
     }

     # walk over all AuthBy and Hash database credentials by farmInstance
     foreach my $auth (@{$main::config->{AuthBy}}) {
        my $id = $auth->{Identifier};
        foreach my $key (qw(DBSource DBUsername DBAuth)) {
            if ($auth->{$key}) {
                my $database_count = @{$auth->{$key}};
                $auth->{$key} = [ $auth->{$key}[ 
($main::farmInstance-1)%$database_count ] ];
                &main::log($main::LOG_INFO, "farmchild.hook: AuthBy: $id, $key: 
".$auth->{$key}[0] );
            }
        }
     }

     return;
}


-- 
Christian Kratzer                   CK Software GmbH
Email:   c...@cksoft.de               Wildberger Weg 24/2
Phone:   +49 7032 893 997 - 0       D-71126 Gaeufelden
Fax:     +49 7032 893 997 - 9       HRB 245288, Amtsgericht Stuttgart
Mobile:  +49 171 1947 843           Geschaeftsfuehrer: Christian Kratzer
Web:     http://www.cksoft.de/
_______________________________________________
radiator mailing list
radiator@open.com.au
http://www.open.com.au/mailman/listinfo/radiator

Reply via email to