4 use vars qw( $log_file $sigterm $sigint );
5 use subs qw( _die _logmsg );
10 use FS::UID qw(adminsuidsetup);
11 #use FS::Record qw(qsearch qsearchs);
16 #lots of false laziness w/freeside-queued
18 my $user = shift or die &usage;
20 #my $pid_file = "/var/run/freeside-sqlradius-radacctd.$user.pid";
21 my $pid_file = "/var/run/freeside-sqlradius-radacctd.pid";
25 #sub REAPER { my $pid = wait; $SIG{CHLD} = \&REAPER; $kids--; }
26 #$SIG{CHLD} = \&REAPER;
30 $SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $sigint++; };
31 $SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $sigterm++; };
33 my $freeside_gid = scalar(getgrnam('freeside'))
34 or die "can't setgid to freeside group\n";
37 #if freebsd can't setuid(), presumably it can't setgid() either. grr fleabsd
41 $> = $FS::UID::freeside_uid;
42 $< = $FS::UID::freeside_uid;
43 #freebsd is sofa king broken, won't setuid()
45 $> = $FS::UID::freeside_uid;
47 #$ENV{HOME} = (getpwuid($>))[7]; #for ssh
50 $log_file= "/usr/local/etc/freeside/sqlradius-radacctd-log.". $FS::UID::datasrc;
54 $SIG{__DIE__} = \&_die;
55 $SIG{__WARN__} = \&_logmsg;
57 warn "freeside-sqlradius-radacctd starting\n";
61 #my $machine = shift or die &usage; #would need to be up higher for real
62 my @exports = qsearch('part_export', { 'exporttype' => 'sqlradius' } );
67 foreach my $export ( @exports ) {
68 next if $seen{$export->option('datasrc')}++;
69 my $dbh = DBI->connect(
70 map { $export->option($_) } qw( datasrc username password )
72 warn "can't connect to ". $export->option('datasrc'). ": ". $DBI::errstr;
76 # find old radacct position
79 # get new radacct records
80 my $sth = $dbh->prepare('SELECT * FROM radacct WHERE radacctid > ?') or do {
81 warn "can't select in radacct table from ". $export->option('datasrc').
86 while ( my $radacct = $sth->fetchrow_arrayref({}) ) {
88 my $session = new FS::session {
97 # look for updated radacct records & replace them
105 #more false laziness w/freeside-queued
108 die "Usage:\n\n freeside-sqlradius-radacctd user\n";
113 unlink $pid_file if -e $pid_file;
118 chomp( my $msg = shift );
119 my $log = new IO::File ">>$log_file";
120 flock($log, LOCK_EX);
122 print $log "[". time2str("%a %b %e %T %Y",time). "] [$$] $msg\n";
123 flock($log, LOCK_UN);
129 chdir "/" or die "Can't chdir to /: $!";
130 open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
131 defined(my $pid = fork) or die "Can't fork: $!";
133 print "freeside-sqlradius-radacctd started with pid $pid\n";
134 #logging to $log_file\n";
135 exit unless $pid_file;
136 my $pidfh = new IO::File ">$pid_file" or exit;
137 print $pidfh "$pid\n";
140 #open STDOUT, '>/dev/null'
141 # or die "Can't write to /dev/null: $!";
142 #setsid or die "Can't start a new session: $!";
143 #open STDERR, '>&STDOUT' or die "Can't dup stdout: $!";
148 open STDOUT, '>/dev/null'
149 or die "Can't write to /dev/null: $!";
150 setsid or die "Can't start a new session: $!";
151 open STDERR, '>&STDOUT' or die "Can't dup stdout: $!";
159 freeside-sqlradius-radacctd - Real-time radacct import daemon
163 freeside-sqlradius-radacctd username
167 Imports records from an SQL radacct table in real-time into the session
170 This enables per-minute or per-hour charges as well as the
171 "View active NAS ports" function.
173 B<username> is a username added by freeside-adduser.
177 session.html from the base documentation.