4 use vars qw( @part_export );
5 use subs qw(myshutdown);
6 use POSIX qw(:sys_wait_h);
8 use FS::Daemon qw(daemonize1 drop_root logfile daemonize2 sigint sigterm);
9 use FS::UID qw(adminsuidsetup); #forksuidsetup driver_name dbh myconnect);
10 use FS::Record qw(qsearch); # qsearchs);
12 use FS::part_export::sqlradius;
16 my $user = shift or die &usage;
18 #daemonize1('freeside-sqlradius-radacctd', $user); #keep unique pid files w/multi installs
19 daemonize1('freeside-sqlradius-radacctd');
23 #$ENV{HOME} = (getpwuid($>))[7]; #for ssh
27 logfile( "%%%FREESIDE_LOG%%%/sqlradius-radacctd-log.". $FS::UID::datasrc );
33 my @part_export = FS::part_export::sqlradius->all_sqlradius_withaccounting();
35 die "no sqlradius, sqlradius_withdomain or radiator exports without".
41 #fork off one kid per export (machine)
42 # _>{'_radacct_kid'} is an evil kludge
43 foreach my $part_export ( grep ! $_->{'_radacct_kid'}, @part_export ) {
45 defined( my $pid = fork ) or do {
46 warn "WARNING: can't fork to spawn child for ". $part_export->machine;
51 $part_export->{'_radacct_kid'} = $pid;
52 warn "child $pid spawned for ". $part_export->machine;
55 adminsuidsetup($user); #get our own db handle
57 until ( sigint || sigterm ) {
58 $part_export->update_svc_acct();
62 warn "child for ". $part_export->machine. " done";
69 #reap up any kids that died...
72 myshutdown() if sigterm() || sigint();
83 kill 'TERM', $_ foreach grep $_, map $_->{'_radacct_kid'}, @part_export;
85 my $wait = 12; #wait up to 1 minute
86 while ( ( grep $_->{'_radacct_kid'}, @part_export ) && $wait-- ) {
87 warn "waiting for children to terminate";
91 warn "abandoning children" if grep $_->{'_radacct_kid'}, @part_export;
96 #warn "reaping kids\n";
97 foreach my $part_export ( grep $_->{'_radacct_kid'}, @part_export ) {
98 my $pid = $part_export->{'_radacct_kid'};
99 my $kid = waitpid($pid, WNOHANG);
101 $part_export->{'_radacct_kid'} = '';
104 #warn "done reaping\n";
108 die "Usage:\n\n freeside-sqlradius-radacctd user\n";
113 freeside-sqlradius-radacctd - Real-time radacct import daemon
117 freeside-sqlradius-radacctd username
121 Imports records from an the SQL radacct tables of all sqlradius,
122 sqlradius_withdomain and radiator exports (except those with the
123 ignore_accounting flag) and updates the following fields in svc_acct (see
124 L<FS::svc_acct>) for each account: last_login, last_logout, seconds,
125 upbytes, downbytes, totalbytes. Runs as a daemon and updates the database
128 B<username> is a username added by freeside-adduser.
130 =head1 RADIUS DATABASE CHANGES
132 In 1.7.4+, freeside-upgrade should have taken care of these changes already.
134 ALTER TABLE radacct ADD COLUMN FreesideStatus varchar(32) NULL;
136 If you want to ignore the existing accountg records, also do:
138 UPDATE radacct SET FreesideStatus = 'done' WHERE FreesideStatus IS NULL;