diff options
Diffstat (limited to 'FS/bin/freeside-queued')
-rw-r--r-- | FS/bin/freeside-queued | 109 |
1 files changed, 83 insertions, 26 deletions
diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 3a0a9b4e5..e14ddad8e 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -1,11 +1,13 @@ #!/usr/bin/perl -w use strict; -use vars qw( $DEBUG $kids $max_kids %kids ); -use POSIX qw(:sys_wait_h); +use vars qw( $log_file $sigterm $sigint $kids $max_kids %kids ); +use subs qw( _die _logmsg ); +use Fcntl qw(:flock); +use POSIX qw(:sys_wait_h setsid); +use Date::Format; use IO::File; use FS::UID qw(adminsuidsetup forksuidsetup driver_name dbh myconnect); -use FS::Daemon qw(daemonize1 drop_root logfile daemonize2 sigint sigterm); use FS::Record qw(qsearch qsearchs); use FS::queue; use FS::queue_depend; @@ -16,24 +18,40 @@ use FS::svc_acct; use Net::SSH 0.07; use FS::part_export; -$DEBUG = 0; - $max_kids = '10'; #guess it should be a config file... $kids = 0; my $user = shift or die &usage; -warn "starting daemonization (forking)\n" if $DEBUG; -#daemonize1('freeside-queued',$user); #to keep pid files unique w/multi installs -daemonize1('freeside-queued'); +#my $pid_file = "/var/run/freeside-queued.$user.pid"; +my $pid_file = "/var/run/freeside-queued.pid"; + +&daemonize1; + +#sub REAPER { my $pid = wait; $SIG{CHLD} = \&REAPER; $kids--; } +#$SIG{CHLD} = \&REAPER; -warn "dropping privledges\n" if $DEBUG; -drop_root(); +$sigterm = 0; +$sigint = 0; +$SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $sigint++; }; +$SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $sigterm++; }; +my $freeside_gid = scalar(getgrnam('freeside')) + or die "can't setgid to freeside group\n"; +$) = $freeside_gid; +$( = $freeside_gid; +#if freebsd can't setuid(), presumably it can't setgid() either. grr fleabsd +($(,$)) = ($),$(); +$) = $freeside_gid; + +$> = $FS::UID::freeside_uid; +$< = $FS::UID::freeside_uid; +#freebsd is sofa king broken, won't setuid() +($<,$>) = ($>,$<); +$> = $FS::UID::freeside_uid; $ENV{HOME} = (getpwuid($>))[7]; #for ssh -warn "connecting to database\n" if $DEBUG; $@ = 'not connected'; while ( $@ ) { eval { adminsuidsetup $user; }; @@ -44,12 +62,14 @@ while ( $@ ) { } } -logfile( "/usr/local/etc/freeside/queuelog.". $FS::UID::datasrc ); +$log_file = "/usr/local/etc/freeside/queuelog.". $FS::UID::datasrc; + +&daemonize2; -warn "completing daemonization (detaching))\n" if $DEBUG; -daemonize2(); +$SIG{__DIE__} = \&_die; +$SIG{__WARN__} = \&_logmsg; -#-- +warn "freeside-queued starting\n"; my $warnkids=0; while (1) { @@ -67,7 +87,7 @@ while (1) { unless ( dbh && dbh->ping ) { warn "WARNING: connection to database lost, reconnecting...\n"; - eval { $FS::UID::dbh = myconnect; }; + eval { myconnect; }; unless ( !$@ && dbh && dbh->ping ) { warn "WARNING: still no connection to database, sleeping for retry...\n"; @@ -142,7 +162,6 @@ while (1) { #} my @args = $ljob->args; - splice @args, 0, 1, $ljob if $args[0] eq '_JOB'; defined( my $pid = fork ) or do { warn "WARNING: can't fork: $!\n"; @@ -165,12 +184,8 @@ while (1) { forksuidsetup($user); - #auto-use classes... - #if ( $ljob->job =~ /(FS::part_export::\w+)::/ ) { - if ( $ljob->job =~ /(FS::part_export::\w+)::/ - || $ljob->job =~ /(FS::\w+)::/ - ) - { + #auto-use export classes... + if ( $ljob->job =~ /(FS::part_export::\w+)::/ ) { my $class = $1; eval "use $class;"; if ( $@ ) { @@ -186,7 +201,7 @@ while (1) { } my $eval = "&". $ljob->job. '(@args);'; - warn 'running "&'. $ljob->job. '('. join(', ', @args). ")\n" if $DEBUG; + warn "running $eval"; eval $eval; #throw away return value? suppose so if ( $@ ) { warn "job $eval failed"; @@ -205,11 +220,11 @@ while (1) { } } continue { - if ( sigterm() ) { + if ( $sigterm ) { warn "received TERM signal; exiting\n"; exit; } - if ( sigint() ) { + if ( $sigint ) { warn "received INT signal; exiting\n"; exit; } @@ -219,6 +234,48 @@ sub usage { die "Usage:\n\n freeside-queued user\n"; } +sub _die { + my $msg = shift; + unlink $pid_file if -e $pid_file; + _logmsg($msg); +} + +sub _logmsg { + chomp( my $msg = shift ); + my $log = new IO::File ">>$log_file"; + flock($log, LOCK_EX); + seek($log, 0, 2); + print $log "[". time2str("%a %b %e %T %Y",time). "] [$$] $msg\n"; + flock($log, LOCK_UN); + close $log; +} + +sub daemonize1 { + + chdir "/" or die "Can't chdir to /: $!"; + open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; + defined(my $pid = fork) or die "Can't fork: $!"; + if ( $pid ) { + print "freeside-queued started with pid $pid\n"; #logging to $log_file\n"; + exit unless $pid_file; + my $pidfh = new IO::File ">$pid_file" or exit; + print $pidfh "$pid\n"; + exit; + } + #open STDOUT, '>/dev/null' + # or die "Can't write to /dev/null: $!"; + #setsid or die "Can't start a new session: $!"; + #open STDERR, '>&STDOUT' or die "Can't dup stdout: $!"; + +} + +sub daemonize2 { + open STDOUT, '>/dev/null' + or die "Can't write to /dev/null: $!"; + setsid or die "Can't start a new session: $!"; + open STDERR, '>&STDOUT' or die "Can't dup stdout: $!"; +} + sub reap_kids { foreach my $pid ( keys %kids ) { my $kid = waitpid($pid, WNOHANG); |