summaryrefslogtreecommitdiff
path: root/FS/bin/freeside-queued
diff options
context:
space:
mode:
Diffstat (limited to 'FS/bin/freeside-queued')
-rw-r--r--FS/bin/freeside-queued109
1 files changed, 83 insertions, 26 deletions
diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued
index 3a0a9b4..e14ddad 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);