From f5266a4d07d116efd732f433d0f4f3a47b143a7d Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 11 Sep 2001 00:08:18 +0000 Subject: faster (cached) fuzzy searches prelim. job queues! fixed part_svc editing --- FS/bin/freeside-queued | 145 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 FS/bin/freeside-queued (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued new file mode 100644 index 000000000..5acffb52c --- /dev/null +++ b/FS/bin/freeside-queued @@ -0,0 +1,145 @@ +#!/usr/bin/perl -w + +use strict; +use Fcntl qw(:flock); +use POSIX qw(setsid); +use FS::UID qw(adminsuidsetup); +use FS::Record qw(qsearchs); +use FS::queue; + +# no autoloading just yet +use FS::cust_main; + +my $pid_file = '/var/run/freeside-queued.pid'; + +$SIG{CHLD} = sub { wait }; #zombie prevention + +my $sigterm = 0; +my $sigint = 0; +$SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $sigint++; }; +$SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $sigterm++; }; + +my $user = shift or die &usage; + +&daemonize; + +my $log_file = "/usr/local/etc/freeside/queuelog."; + +$> = $FS::UID::freeside_uid unless $>; +adminsuidsetup $user; + +$log_file = "/usr/local/etc/freeside/queuelog.". $FS::UID::datasrc; + +$SIG{__DIE__} = \&_die; +$SIG{__WARN__} = \&_logmsg; + + +while (1) { + + my $job = qsearchs( + 'queue', + { 'status' => 'new' }, + '', + 'ORDER BY jobnum FOR UPDATE LIMIT 1' + ) or do { + sleep 5; + next; + }; + + my %hash = $job->hash; + $hash{'status'} = 'locked'; + my $ljob = new FS::queue ( \%hash ); + my $error = $ljob->replace($job); + die $error if $error; + + my @args = $ljob->args; + + #fork a child for each job (up to some maximum perhaps?) + #single-threaded for now. + + my $eval = "&". $ljob->job. '(@args);'; + warn "running $eval"; + eval $eval; + if ( $@ ) { + warn "job $eval failed"; + my $hash = $ljob->hash; + $hash{'status'} = 'failed'; + my $fjob = new FS::queue( \%hash ); + my $error = $fjob->replace($ljob); + die $error if $error; + } else { + $ljob->delete; + } + +} continue { + if ( $sigterm ) { + warn "received TERM signal; exiting\n"; + exit; + } + if ( $sigint ) { + warn "received INT signal; exiting\n"; + exit; + } +} + + +sub datestamp { + time2str("%m%d%Y", time); +} + +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); +} + +sub daemonize { + + 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: $!"; + +} + +=head1 NAME + +freeside-queued - Job queue daemon + +=head1 SYNOPSIS + + freeside-queued user + +=head1 DESCRIPTION + +Job queue daemon. Should be running at all times. + +user: from the mapsecrets file - see config.html from the base documentation + +=head1 VERSION + +=head1 BUGS + +=head1 SEE ALSO + +=cut + -- cgit v1.2.1 From 01ea770bbf69f2e31a2e74254ca931917f2ca1ef Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 11 Sep 2001 01:09:56 +0000 Subject: working queued --- FS/bin/freeside-queued | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 5acffb52c..8ed989683 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -1,8 +1,12 @@ #!/usr/bin/perl -w use strict; +use vars qw( $log_file $sigterm $sigint ); +use subs qw( _die _logmsg ); use Fcntl qw(:flock); use POSIX qw(setsid); +use Date::Format; +use IO::File; use FS::UID qw(adminsuidsetup); use FS::Record qw(qsearchs); use FS::queue; @@ -14,16 +18,14 @@ my $pid_file = '/var/run/freeside-queued.pid'; $SIG{CHLD} = sub { wait }; #zombie prevention -my $sigterm = 0; -my $sigint = 0; -$SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $sigint++; }; -$SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $sigterm++; }; - my $user = shift or die &usage; &daemonize; -my $log_file = "/usr/local/etc/freeside/queuelog."; + $sigterm = 0; + $sigint = 0; +$SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $sigint++; }; +$SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $sigterm++; }; $> = $FS::UID::freeside_uid unless $>; adminsuidsetup $user; @@ -33,6 +35,7 @@ $log_file = "/usr/local/etc/freeside/queuelog.". $FS::UID::datasrc; $SIG{__DIE__} = \&_die; $SIG{__WARN__} = \&_logmsg; +warn "freesied-queued starting\n"; while (1) { @@ -82,11 +85,6 @@ while (1) { } } - -sub datestamp { - time2str("%m%d%Y", time); -} - sub _die { my $msg = shift; unlink $pid_file if -e $pid_file; @@ -100,6 +98,7 @@ sub _logmsg { seek($log, 0, 2); print $log "[". time2str("%a %b %e %T %Y",time). "] [$$] $msg\n"; flock($log, LOCK_UN); + close $log; } sub daemonize { -- cgit v1.2.1 From 842df85f746a2e1b961d6c9e3a8c5cc3678ae6dd Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 11 Sep 2001 03:15:58 +0000 Subject: cyrus support --- FS/bin/freeside-queued | 2 ++ 1 file changed, 2 insertions(+) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 8ed989683..098e33f54 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -13,6 +13,8 @@ use FS::queue; # no autoloading just yet use FS::cust_main; +use FS::svc_acct; +use Net::SSH; my $pid_file = '/var/run/freeside-queued.pid'; -- cgit v1.2.1 From 0ee3925f49c81dbabdd8042eba96fa55f8d3141e Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 11 Sep 2001 11:52:45 +0000 Subject: rar --- FS/bin/freeside-queued | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 098e33f54..d8af19866 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -67,7 +67,7 @@ while (1) { eval $eval; if ( $@ ) { warn "job $eval failed"; - my $hash = $ljob->hash; + my %hash = $ljob->hash; $hash{'status'} = 'failed'; my $fjob = new FS::queue( \%hash ); my $error = $fjob->replace($ljob); -- cgit v1.2.1 From cb69afd435095144bea83565973561045e28c6a6 Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 11 Sep 2001 21:58:43 +0000 Subject: usage sub --- FS/bin/freeside-queued | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index d8af19866..6fb294db8 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -87,6 +87,10 @@ while (1) { } } +sub usage { + die "Usage:\n\n freeside-queued user\n"; +} + sub _die { my $msg = shift; unlink $pid_file if -e $pid_file; -- cgit v1.2.1 From aac06e1cc16840ca746bb222a5c29280453df27e Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 19 Sep 2001 19:00:06 +0000 Subject: set $ENV{HOME} --- FS/bin/freeside-queued | 1 + 1 file changed, 1 insertion(+) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 6fb294db8..04101bbc2 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -30,6 +30,7 @@ $SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $sigint++; }; $SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $sigterm++; }; $> = $FS::UID::freeside_uid unless $>; +$ENV{HOME} = (getpwuid($>))[7]; #for ssh adminsuidsetup $user; $log_file = "/usr/local/etc/freeside/queuelog.". $FS::UID::datasrc; -- cgit v1.2.1 From a2952a41f31a392ce356a299f7edf03b265ddabf Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 19 Sep 2001 21:51:41 +0000 Subject: set real uid too. whew. ssh now working. --- FS/bin/freeside-queued | 1 + 1 file changed, 1 insertion(+) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 04101bbc2..42d638f4c 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -30,6 +30,7 @@ $SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $sigint++; }; $SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $sigterm++; }; $> = $FS::UID::freeside_uid unless $>; +$< = $>; $ENV{HOME} = (getpwuid($>))[7]; #for ssh adminsuidsetup $user; -- cgit v1.2.1 From a08b4d18bc28e44fe236f1060632ffefc773f78b Mon Sep 17 00:00:00 2001 From: ivan Date: Mon, 24 Sep 2001 03:23:34 +0000 Subject: queue daemon forks now --- FS/bin/freeside-queued | 50 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 14 deletions(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 42d638f4c..1eef00c5c 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -7,7 +7,7 @@ use Fcntl qw(:flock); use POSIX qw(setsid); use Date::Format; use IO::File; -use FS::UID qw(adminsuidsetup); +use FS::UID qw(adminsuidsetup forksuidsetup); use FS::Record qw(qsearchs); use FS::queue; @@ -29,6 +29,9 @@ my $user = shift or die &usage; $SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $sigint++; }; $SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $sigterm++; }; +#pickup zombie status +$SIG{CHLD} = sub { wait; }; + $> = $FS::UID::freeside_uid unless $>; $< = $>; $ENV{HOME} = (getpwuid($>))[7]; #for ssh @@ -61,21 +64,40 @@ while (1) { my @args = $ljob->args; - #fork a child for each job (up to some maximum perhaps?) - #single-threaded for now. - - my $eval = "&". $ljob->job. '(@args);'; - warn "running $eval"; - eval $eval; - if ( $@ ) { - warn "job $eval failed"; - my %hash = $ljob->hash; + # number of children limit? + defined( my $pid = fork ) or do { + warn "WARNING: can't fork: $!\n"; + my %hash = $job->hash; $hash{'status'} = 'failed'; - my $fjob = new FS::queue( \%hash ); - my $error = $fjob->replace($ljob); + my $ljob = new FS::queue ( \%hash ); + my $error = $ljob->replace($job); die $error if $error; - } else { - $ljob->delete; + }; + + unless ( $pid ) { #kid time + + #get new db handles + $FS::UID::dbh->{InactiveDestroy} = 1; + $FS::svc_acct::icradius_dbh->{InactiveDestroy} + if $FS::svc_acct::icradius_dbh; + forksuidsetup($user); + + my $eval = "&". $ljob->job. '(@args);'; + warn "running $eval"; + eval $eval; + if ( $@ ) { + warn "job $eval failed"; + my %hash = $ljob->hash; + $hash{'status'} = 'failed'; + my $fjob = new FS::queue( \%hash ); + my $error = $fjob->replace($ljob); + die $error if $error; + } else { + $ljob->delete; + } + + exit; + #end-of-kid } } continue { -- cgit v1.2.1 From 4ea8493d8422bd9b0d471da81e3c0cd164b9f12e Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 25 Sep 2001 00:05:09 +0000 Subject: better REAPER --- FS/bin/freeside-queued | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 1eef00c5c..35728db53 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -18,20 +18,18 @@ use Net::SSH; my $pid_file = '/var/run/freeside-queued.pid'; -$SIG{CHLD} = sub { wait }; #zombie prevention - my $user = shift or die &usage; &daemonize; +sub REAPER { my $pid = wait; $SIG{CHLD} = \&REAPER; } +$SIG{CHLD} = \&REAPER; + $sigterm = 0; $sigint = 0; $SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $sigint++; }; $SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $sigterm++; }; -#pickup zombie status -$SIG{CHLD} = sub { wait; }; - $> = $FS::UID::freeside_uid unless $>; $< = $>; $ENV{HOME} = (getpwuid($>))[7]; #for ssh -- cgit v1.2.1 From 6f325cd8d38905b98c6f11a64701653bdd9f9fcf Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 23 Oct 2001 20:53:06 +0000 Subject: Pg: FOR UPDATE LIMIT 1 mysql: LIMIT 1 FOR UPDATE greeeat. --- FS/bin/freeside-queued | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 35728db53..4e3724e6e 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -7,7 +7,7 @@ use Fcntl qw(:flock); use POSIX qw(setsid); use Date::Format; use IO::File; -use FS::UID qw(adminsuidsetup forksuidsetup); +use FS::UID qw(adminsuidsetup forksuidsetup driver_name); use FS::Record qw(qsearchs); use FS::queue; @@ -48,7 +48,9 @@ while (1) { 'queue', { 'status' => 'new' }, '', - 'ORDER BY jobnum FOR UPDATE LIMIT 1' + driver_name =~ /^mysql$/i + ? 'ORDER BY jobnum LIMIT 1 FOR UPDATE' + : 'ORDER BY jobnum FOR UPDATE LIMIT 1' ) or do { sleep 5; next; @@ -76,7 +78,7 @@ while (1) { #get new db handles $FS::UID::dbh->{InactiveDestroy} = 1; - $FS::svc_acct::icradius_dbh->{InactiveDestroy} + $FS::svc_acct::icradius_dbh->{InactiveDestroy} = 1 if $FS::svc_acct::icradius_dbh; forksuidsetup($user); -- cgit v1.2.1 From 9fa3f18ba6b2e910601891a15fe30448d51d43f9 Mon Sep 17 00:00:00 2001 From: ivan Date: Thu, 8 Nov 2001 15:26:44 +0000 Subject: harmless typo noticed by "Edward Shabotinsky" , thanks --- FS/bin/freeside-queued | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 4e3724e6e..87e3cb422 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -40,7 +40,7 @@ $log_file = "/usr/local/etc/freeside/queuelog.". $FS::UID::datasrc; $SIG{__DIE__} = \&_die; $SIG{__WARN__} = \&_logmsg; -warn "freesied-queued starting\n"; +warn "freeside-queued starting\n"; while (1) { -- cgit v1.2.1 From 8f42b751aebda2e7dce2c363bed6f1e15b411b1d Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 20 Feb 2002 01:03:10 +0000 Subject: use Net::SSH::ssh_cmd for all job queueing rather than local duplicated ssh subs queue daemon updates: retry & remove links work, bubble up error message to webinterface, link to svcnum & have job listings on view/svc_* pages, closes: Bug#280 s/option/optionname/ schema change, dumb mysql, closes: Bug#334 --- FS/bin/freeside-queued | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 87e3cb422..56475d059 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -14,7 +14,7 @@ use FS::queue; # no autoloading just yet use FS::cust_main; use FS::svc_acct; -use Net::SSH; +use Net::SSH 0.05; my $pid_file = '/var/run/freeside-queued.pid'; @@ -69,6 +69,7 @@ while (1) { warn "WARNING: can't fork: $!\n"; my %hash = $job->hash; $hash{'status'} = 'failed'; + $hash{'statustext'} = "[freeside-queued] can't fork: $!"; my $ljob = new FS::queue ( \%hash ); my $error = $ljob->replace($job); die $error if $error; @@ -89,6 +90,7 @@ while (1) { warn "job $eval failed"; my %hash = $ljob->hash; $hash{'status'} = 'failed'; + $hash{'statustext'} = $@; my $fjob = new FS::queue( \%hash ); my $error = $fjob->replace($ljob); die $error if $error; -- cgit v1.2.1 From f1038a648b3d53db925b23519e7cd2a30c6837ed Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 20 Mar 2002 21:31:49 +0000 Subject: new export! infostreet and sqlradius provisioning switched over (Bug #299 - doesn't close it, but all the groundwork is done) also removes non-transactional ICRADIUS export from svc_acct.export (closes: Bug#347) --- FS/bin/freeside-queued | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 56475d059..c3c9240d2 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -15,6 +15,7 @@ use FS::queue; use FS::cust_main; use FS::svc_acct; use Net::SSH 0.05; +use FS::part_export; my $pid_file = '/var/run/freeside-queued.pid'; @@ -85,7 +86,7 @@ while (1) { my $eval = "&". $ljob->job. '(@args);'; warn "running $eval"; - eval $eval; + eval $eval; #throw away return value? suppose so if ( $@ ) { warn "job $eval failed"; my %hash = $ljob->hash; -- cgit v1.2.1 From 4fb679b29788a552a1ce33a0cdf293d648e797bc Mon Sep 17 00:00:00 2001 From: ivan Date: Sat, 23 Mar 2002 07:54:05 +0000 Subject: redirect STDOUT/STDERR a bit later for better error reporting --- FS/bin/freeside-queued | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index c3c9240d2..fff77f01b 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -21,7 +21,7 @@ my $pid_file = '/var/run/freeside-queued.pid'; my $user = shift or die &usage; -&daemonize; +&daemonize1; sub REAPER { my $pid = wait; $SIG{CHLD} = \&REAPER; } $SIG{CHLD} = \&REAPER; @@ -38,6 +38,8 @@ adminsuidsetup $user; $log_file = "/usr/local/etc/freeside/queuelog.". $FS::UID::datasrc; +&daemonize2; + $SIG{__DIE__} = \&_die; $SIG{__WARN__} = \&_logmsg; @@ -134,7 +136,7 @@ sub _logmsg { close $log; } -sub daemonize { +sub daemonize1 { chdir "/" or die "Can't chdir to /: $!"; open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; @@ -146,11 +148,18 @@ sub daemonize { 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: $!"; - } =head1 NAME -- cgit v1.2.1 From c6da895a2fb2c233716381b7e45ebbeb1c2f6aaa Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 26 Mar 2002 00:32:46 +0000 Subject: further export bugfixing add 10 kid limit to freeside-queued sqlradius_reset now works (closes: Bug#372) --- FS/bin/freeside-queued | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index fff77f01b..f6226cca1 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -1,7 +1,7 @@ #!/usr/bin/perl -w use strict; -use vars qw( $log_file $sigterm $sigint ); +use vars qw( $log_file $sigterm $sigint $kids $max_kids ); use subs qw( _die _logmsg ); use Fcntl qw(:flock); use POSIX qw(setsid); @@ -19,15 +19,18 @@ use FS::part_export; my $pid_file = '/var/run/freeside-queued.pid'; +$max_kids = '10'; #guess it should be a config file... +$kids = 0; + my $user = shift or die &usage; &daemonize1; -sub REAPER { my $pid = wait; $SIG{CHLD} = \&REAPER; } +sub REAPER { my $pid = wait; $SIG{CHLD} = \&REAPER; $kids--; } $SIG{CHLD} = \&REAPER; - $sigterm = 0; - $sigint = 0; +$sigterm = 0; +$sigint = 0; $SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $sigint++; }; $SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $sigterm++; }; @@ -45,8 +48,17 @@ $SIG{__WARN__} = \&_logmsg; warn "freeside-queued starting\n"; +my $warnkids=0; while (1) { + #prevent runaway forking + if ( $kids >= $max_kids ) { + warn "WARNING: maximum $kids children reached\n" unless $warnkids++; + sleep 1; #waiting for signals is cheap + next; + } + $warnkids=0; + my $job = qsearchs( 'queue', { 'status' => 'new' }, @@ -55,7 +67,7 @@ while (1) { ? 'ORDER BY jobnum LIMIT 1 FOR UPDATE' : 'ORDER BY jobnum FOR UPDATE LIMIT 1' ) or do { - sleep 5; + sleep 5; #connecting to db is expensive next; }; @@ -67,7 +79,6 @@ while (1) { my @args = $ljob->args; - # number of children limit? defined( my $pid = fork ) or do { warn "WARNING: can't fork: $!\n"; my %hash = $job->hash; @@ -76,9 +87,12 @@ while (1) { my $ljob = new FS::queue ( \%hash ); my $error = $ljob->replace($job); die $error if $error; + next; #don't increment the kid counter }; - unless ( $pid ) { #kid time + if ( $pid ) { + $kids++; + } else { #kid time #get new db handles $FS::UID::dbh->{InactiveDestroy} = 1; -- cgit v1.2.1 From 55dee0c595ea28dde3d2a30e1f238fc322e6e869 Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 16 Apr 2002 21:24:45 +0000 Subject: auto-use export classes --- FS/bin/freeside-queued | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index f6226cca1..49b532ec3 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -100,6 +100,22 @@ while (1) { if $FS::svc_acct::icradius_dbh; forksuidsetup($user); + #auto-use export classes... + if ( $ljob->job =~ /(FS::part_export::\w+)::/ ) { + my $class = $1; + eval "use $class;"; + if ( $@ ) { + warn "job use $class failed"; + my %hash = $ljob->hash; + $hash{'status'} = 'failed'; + $hash{'statustext'} = $@; + my $fjob = new FS::queue( \%hash ); + my $error = $fjob->replace($ljob); + die $error if $error; + exit; #end-of-kid + }; + } + my $eval = "&". $ljob->job. '(@args);'; warn "running $eval"; eval $eval; #throw away return value? suppose so -- cgit v1.2.1 From eb7c552dd8290d6b33a4e026c5dc21ebf01105cf Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 15 May 2002 13:24:26 +0000 Subject: queue dependancies --- FS/bin/freeside-queued | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 49b532ec3..1539a48af 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -59,13 +59,16 @@ while (1) { } $warnkids=0; + my $nodepend = 'AND 0 = ( SELECT COUNT(*) FROM queue_depend'. + ' WHERE queue_depend.jobnum = queue.jobnum ) '; + my $job = qsearchs( 'queue', { 'status' => 'new' }, '', driver_name =~ /^mysql$/i - ? 'ORDER BY jobnum LIMIT 1 FOR UPDATE' - : 'ORDER BY jobnum FOR UPDATE LIMIT 1' + ? "$nodepend ORDER BY jobnum LIMIT 1 FOR UPDATE" + : "$nodepend ORDER BY jobnum FOR UPDATE LIMIT 1" ) or do { sleep 5; #connecting to db is expensive next; @@ -94,10 +97,9 @@ while (1) { $kids++; } else { #kid time - #get new db handles + #get new db handle $FS::UID::dbh->{InactiveDestroy} = 1; - $FS::svc_acct::icradius_dbh->{InactiveDestroy} = 1 - if $FS::svc_acct::icradius_dbh; + forksuidsetup($user); #auto-use export classes... -- cgit v1.2.1 From 72afe3cf4a355a22e942fb59068815270538999f Mon Sep 17 00:00:00 2001 From: ivan Date: Fri, 14 Jun 2002 02:25:34 +0000 Subject: mysql compatibility? --- FS/bin/freeside-queued | 64 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 22 deletions(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 1539a48af..67e5e2bca 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -7,9 +7,10 @@ use Fcntl qw(:flock); use POSIX qw(setsid); use Date::Format; use IO::File; -use FS::UID qw(adminsuidsetup forksuidsetup driver_name); +use FS::UID qw(adminsuidsetup forksuidsetup driver_name dbh); use FS::Record qw(qsearchs); use FS::queue; +use FS::queue_depend; # no autoloading just yet use FS::cust_main; @@ -17,13 +18,14 @@ use FS::svc_acct; use Net::SSH 0.05; use FS::part_export; -my $pid_file = '/var/run/freeside-queued.pid'; - $max_kids = '10'; #guess it should be a config file... $kids = 0; my $user = shift or die &usage; +#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--; } @@ -59,26 +61,44 @@ while (1) { } $warnkids=0; - my $nodepend = 'AND 0 = ( SELECT COUNT(*) FROM queue_depend'. - ' WHERE queue_depend.jobnum = queue.jobnum ) '; - - my $job = qsearchs( - 'queue', - { 'status' => 'new' }, - '', - driver_name =~ /^mysql$/i - ? "$nodepend ORDER BY jobnum LIMIT 1 FOR UPDATE" - : "$nodepend ORDER BY jobnum FOR UPDATE LIMIT 1" - ) or do { - sleep 5; #connecting to db is expensive - next; - }; + my $nodepend = driver name eq 'mysql' + ? '' + : 'AND 0 = ( SELECT COUNT(*) FROM queue_depend'. + ' WHERE queue_depend.jobnum = queue.jobnum ) '; + + my($job, $ljob); + { + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + $job = qsearchs( + 'queue', + { 'status' => 'new' }, + '', + driver_name eq 'mysql' + ? "$nodepend ORDER BY jobnum LIMIT 1 FOR UPDATE" + : "$nodepend ORDER BY jobnum FOR UPDATE LIMIT 1" + ) or do { + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + sleep 5; #connecting to db is expensive + next; + }; + + if ( driver_name eq 'mysql' + && qsearch('queue_depend', { 'jobnum' => $job->jobnum } ) ) { + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + next; + } + + my %hash = $job->hash; + $hash{'status'} = 'locked'; + $ljob = new FS::queue ( \%hash ); + my $error = $ljob->replace($job); + die $error if $error; - my %hash = $job->hash; - $hash{'status'} = 'locked'; - my $ljob = new FS::queue ( \%hash ); - my $error = $ljob->replace($job); - die $error if $error; + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + } my @args = $ljob->args; -- cgit v1.2.1 From a930f5bc47c9c2de989074f1570beaa8f116bd22 Mon Sep 17 00:00:00 2001 From: ivan Date: Fri, 14 Jun 2002 11:22:53 +0000 Subject: working job dependancies FS::queue::joblisting html excapes & truncates long arguments welcome email (sheesh!) closes: Bug#420 (haha at 4:20 am, too. really!) --- FS/bin/freeside-queued | 66 ++++++++++++++++++++++++++------------------------ 1 file changed, 35 insertions(+), 31 deletions(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 67e5e2bca..846055dc3 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -61,44 +61,48 @@ while (1) { } $warnkids=0; - my $nodepend = driver name eq 'mysql' + my $nodepend = driver_name eq 'mysql' ? '' : 'AND 0 = ( SELECT COUNT(*) FROM queue_depend'. ' WHERE queue_depend.jobnum = queue.jobnum ) '; - my($job, $ljob); - { - my $oldAutoCommit = $FS::UID::AutoCommit; - local $FS::UID::AutoCommit = 0; - my $dbh = dbh; + #my($job, $ljob); + #{ + # my $oldAutoCommit = $FS::UID::AutoCommit; + # local $FS::UID::AutoCommit = 0; + $FS::UID::AutoCommit = 0; + my $dbh = dbh; - $job = qsearchs( - 'queue', - { 'status' => 'new' }, - '', - driver_name eq 'mysql' - ? "$nodepend ORDER BY jobnum LIMIT 1 FOR UPDATE" - : "$nodepend ORDER BY jobnum FOR UPDATE LIMIT 1" - ) or do { - $dbh->commit or die $dbh->errstr if $oldAutoCommit; - sleep 5; #connecting to db is expensive - next; - }; - - if ( driver_name eq 'mysql' - && qsearch('queue_depend', { 'jobnum' => $job->jobnum } ) ) { - $dbh->commit or die $dbh->errstr if $oldAutoCommit; - next; - } + my $job = qsearchs( + 'queue', + { 'status' => 'new' }, + '', + driver_name eq 'mysql' + ? "$nodepend ORDER BY jobnum LIMIT 1 FOR UPDATE" + : "$nodepend ORDER BY jobnum FOR UPDATE LIMIT 1" + ) or do { + $dbh->commit or die $dbh->errstr; #if $oldAutoCommit; + sleep 5; #connecting to db is expensive + next; + }; - my %hash = $job->hash; - $hash{'status'} = 'locked'; - $ljob = new FS::queue ( \%hash ); - my $error = $ljob->replace($job); - die $error if $error; + if ( driver_name eq 'mysql' + && qsearch('queue_depend', { 'jobnum' => $job->jobnum } ) ) { + $dbh->commit or die $dbh->errstr; #if $oldAutoCommit; + sleep 5; #would be better if mysql could do everything in query above + next; + } + + my %hash = $job->hash; + $hash{'status'} = 'locked'; + my $ljob = new FS::queue ( \%hash ); + my $error = $ljob->replace($job); + die $error if $error; + + $dbh->commit or die $dbh->errstr; #if $oldAutoCommit; - $dbh->commit or die $dbh->errstr if $oldAutoCommit; - } + $FS::UID::AutoCommit = 1; + #} my @args = $ljob->args; -- cgit v1.2.1 From cf6020a0c273d549d33f3e9999bd8b68d9b6d133 Mon Sep 17 00:00:00 2001 From: ivan Date: Thu, 20 Jun 2002 01:29:21 +0000 Subject: shellcommands w/passwords --- FS/bin/freeside-queued | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 846055dc3..48d283a75 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -15,7 +15,7 @@ use FS::queue_depend; # no autoloading just yet use FS::cust_main; use FS::svc_acct; -use Net::SSH 0.05; +use Net::SSH 0.06; use FS::part_export; $max_kids = '10'; #guess it should be a config file... -- cgit v1.2.1 From fe610572852e2eb7c3458e77dc167c25a098c84a Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 25 Jun 2002 07:18:40 +0000 Subject: might work again under mysql --- FS/bin/freeside-queued | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 48d283a75..42d00cebe 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -8,7 +8,7 @@ use POSIX qw(setsid); use Date::Format; use IO::File; use FS::UID qw(adminsuidsetup forksuidsetup driver_name dbh); -use FS::Record qw(qsearchs); +use FS::Record qw(qsearch qsearchs); use FS::queue; use FS::queue_depend; -- cgit v1.2.1 From 72395edddb5a3887092b51056d719584f7979005 Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 2 Jul 2002 09:39:04 +0000 Subject: freebsd is sofa king broken --- FS/bin/freeside-queued | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 42d00cebe..4ddc70a48 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -36,8 +36,13 @@ $sigint = 0; $SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $sigint++; }; $SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $sigterm++; }; -$> = $FS::UID::freeside_uid unless $>; -$< = $>; +$< = FS::UID::freeside_uid; + +#freebsd is sofa king broken, won't setuid() +$> = $FS::UID::freeside_uid; +($<,$>) = ($>,$<); +$> = $FS::UID::freeside_uid; + $ENV{HOME} = (getpwuid($>))[7]; #for ssh adminsuidsetup $user; -- cgit v1.2.1 From cc9c574e5f772917515e85a5c07ce263a8552a03 Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 2 Jul 2002 09:42:38 +0000 Subject: fleabsd grr --- FS/bin/freeside-queued | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 4ddc70a48..46d39f2b0 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -36,7 +36,7 @@ $sigint = 0; $SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $sigint++; }; $SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $sigterm++; }; -$< = FS::UID::freeside_uid; +$< = $FS::UID::freeside_uid; #freebsd is sofa king broken, won't setuid() $> = $FS::UID::freeside_uid; -- cgit v1.2.1 From 00613fa78edb718fdc96640fe08d806079a81ad2 Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 2 Jul 2002 10:14:45 +0000 Subject: grr old openssh grr freebsd --- FS/bin/freeside-queued | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 46d39f2b0..20a6ff9fb 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -36,10 +36,17 @@ $sigint = 0; $SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $sigint++; }; $SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $sigterm++; }; -$< = $FS::UID::freeside_uid; +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; -#freebsd is sofa king broken, won't setuid() $> = $FS::UID::freeside_uid; +$< = $FS::UID::freeside_uid; +#freebsd is sofa king broken, won't setuid() ($<,$>) = ($>,$<); $> = $FS::UID::freeside_uid; -- cgit v1.2.1 From fc99564551bfb9c5dbb1f6e6f8e751d6124e001a Mon Sep 17 00:00:00 2001 From: ivan Date: Mon, 8 Jul 2002 17:14:23 +0000 Subject: oops, fix for bug only surfacing with different freeside uid/gid --- FS/bin/freeside-queued | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 20a6ff9fb..83074b9e4 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -41,8 +41,8 @@ my $freeside_gid = scalar(getgrnam('freeside')) $) = $freeside_gid; $( = $freeside_gid; #if freebsd can't setuid(), presumably it can't setgid() either. grr fleabsd -($<,$>) = ($>,$<); -$> = $freeside_gid; +($(,$)) = ($),$(); +$) = $freeside_gid; $> = $FS::UID::freeside_uid; $< = $FS::UID::freeside_uid; -- cgit v1.2.1 From 748983cb2a2cd21a82950c5000088508a416d670 Mon Sep 17 00:00:00 2001 From: ivan Date: Sat, 24 Aug 2002 01:53:55 +0000 Subject: depend on Net::SSH 0.07, for -T fix --- FS/bin/freeside-queued | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 83074b9e4..311fe62f9 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -15,7 +15,7 @@ use FS::queue_depend; # no autoloading just yet use FS::cust_main; use FS::svc_acct; -use Net::SSH 0.06; +use Net::SSH 0.07; use FS::part_export; $max_kids = '10'; #guess it should be a config file... -- cgit v1.2.1 From 749cce349c6801e6d75834065197c3aceddda599 Mon Sep 17 00:00:00 2001 From: ivan Date: Mon, 28 Oct 2002 13:22:45 +0000 Subject: signal-less queued child handling (closes: Bug#477) --- FS/bin/freeside-queued | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 311fe62f9..6ea27c05f 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -1,10 +1,10 @@ #!/usr/bin/perl -w use strict; -use vars qw( $log_file $sigterm $sigint $kids $max_kids ); +use vars qw( $log_file $sigterm $sigint $kids $max_kids %kids ); use subs qw( _die _logmsg ); use Fcntl qw(:flock); -use POSIX qw(setsid); +use POSIX qw(:sys_wait_h setsid); use Date::Format; use IO::File; use FS::UID qw(adminsuidsetup forksuidsetup driver_name dbh); @@ -28,8 +28,8 @@ my $pid_file = "/var/run/freeside-queued.pid"; &daemonize1; -sub REAPER { my $pid = wait; $SIG{CHLD} = \&REAPER; $kids--; } -$SIG{CHLD} = \&REAPER; +#sub REAPER { my $pid = wait; $SIG{CHLD} = \&REAPER; $kids--; } +#$SIG{CHLD} = \&REAPER; $sigterm = 0; $sigint = 0; @@ -65,9 +65,11 @@ warn "freeside-queued starting\n"; my $warnkids=0; while (1) { + &reap_kids; #prevent runaway forking if ( $kids >= $max_kids ) { warn "WARNING: maximum $kids children reached\n" unless $warnkids++; + &reap_kids; sleep 1; #waiting for signals is cheap next; } @@ -131,6 +133,7 @@ while (1) { if ( $pid ) { $kids++; + $kids{$pid} = 1; } else { #kid time #get new db handle @@ -230,6 +233,16 @@ sub daemonize2 { open STDERR, '>&STDOUT' or die "Can't dup stdout: $!"; } +sub reap_kids { + foreach my $pid ( keys %kids ) { + my $kid = waitpid($pid, WNOHANG); + if ( $kid > 0 ) { + $kids--; + delete $kids{$kid}; + } + } +} + =head1 NAME freeside-queued - Job queue daemon -- cgit v1.2.1 From e7acc4af0a47299644ff2389be3991b708878693 Mon Sep 17 00:00:00 2001 From: ivan Date: Fri, 25 Jun 2004 10:25:02 +0000 Subject: ping the database and retry rather before doing anything --- FS/bin/freeside-queued | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 6ea27c05f..0be3d9d7a 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -7,7 +7,7 @@ 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); +use FS::UID qw(adminsuidsetup forksuidsetup driver_name dbh myconnect); use FS::Record qw(qsearch qsearchs); use FS::queue; use FS::queue_depend; @@ -75,18 +75,27 @@ while (1) { } $warnkids=0; - my $nodepend = driver_name eq 'mysql' - ? '' - : 'AND 0 = ( SELECT COUNT(*) FROM queue_depend'. - ' WHERE queue_depend.jobnum = queue.jobnum ) '; + my $dbh = dbh; + unless ( $dbh->ping ) { + warn "WARNING: connection to database lost, reconnecting...\n"; + myconnect; + unless ( $dbh->ping ) { + warn "WARNING: still no connection to database, sleeping for retry...\n"; + sleep 10; + next; + } + } #my($job, $ljob); #{ # my $oldAutoCommit = $FS::UID::AutoCommit; # local $FS::UID::AutoCommit = 0; $FS::UID::AutoCommit = 0; - my $dbh = dbh; + my $nodepend = driver_name eq 'mysql' + ? '' + : 'AND 0 = ( SELECT COUNT(*) FROM queue_depend'. + ' WHERE queue_depend.jobnum = queue.jobnum ) '; my $job = qsearchs( 'queue', { 'status' => 'new' }, -- cgit v1.2.1 From e9fe829de47a93ac77cacfda6f61b644a78a2929 Mon Sep 17 00:00:00 2001 From: ivan Date: Mon, 6 Sep 2004 09:28:10 +0000 Subject: don't die off even on database failures --- FS/bin/freeside-queued | 72 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 53 insertions(+), 19 deletions(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 0be3d9d7a..e14ddad8e 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -51,7 +51,16 @@ $< = $FS::UID::freeside_uid; $> = $FS::UID::freeside_uid; $ENV{HOME} = (getpwuid($>))[7]; #for ssh -adminsuidsetup $user; + +$@ = 'not connected'; +while ( $@ ) { + eval { adminsuidsetup $user; }; + if ( $@ ) { + warn $@; + warn "sleeping for reconnect...\n"; + sleep 5; + } +} $log_file = "/usr/local/etc/freeside/queuelog.". $FS::UID::datasrc; @@ -75,14 +84,17 @@ while (1) { } $warnkids=0; - my $dbh = dbh; - unless ( $dbh->ping ) { + unless ( dbh && dbh->ping ) { warn "WARNING: connection to database lost, reconnecting...\n"; - myconnect; - unless ( $dbh->ping ) { + + eval { myconnect; }; + + unless ( !$@ && dbh && dbh->ping ) { warn "WARNING: still no connection to database, sleeping for retry...\n"; sleep 10; next; + } else { + warn "WARNING: reconnected to database\n"; } } @@ -91,11 +103,15 @@ while (1) { # my $oldAutoCommit = $FS::UID::AutoCommit; # local $FS::UID::AutoCommit = 0; $FS::UID::AutoCommit = 0; - - my $nodepend = driver_name eq 'mysql' - ? '' - : 'AND 0 = ( SELECT COUNT(*) FROM queue_depend'. - ' WHERE queue_depend.jobnum = queue.jobnum ) '; + + #assuming mysql 4.1 w/subqueries now + #my $nodepend = driver_name eq 'mysql' + # ? '' + # : 'AND 0 = ( SELECT COUNT(*) FROM queue_depend'. + # ' WHERE queue_depend.jobnum = queue.jobnum ) '; + my $nodepend = 'AND 0 = ( SELECT COUNT(*) FROM queue_depend'. + ' WHERE queue_depend.jobnum = queue.jobnum ) '; + my $job = qsearchs( 'queue', { 'status' => 'new' }, @@ -104,25 +120,43 @@ while (1) { ? "$nodepend ORDER BY jobnum LIMIT 1 FOR UPDATE" : "$nodepend ORDER BY jobnum FOR UPDATE LIMIT 1" ) or do { - $dbh->commit or die $dbh->errstr; #if $oldAutoCommit; + # if $oldAutoCommit { + dbh->commit or do { + warn "WARNING: database error, closing connection: ". dbh->errstr; + undef $FS::UID::dbh; + next; + }; + # } sleep 5; #connecting to db is expensive next; }; - if ( driver_name eq 'mysql' - && qsearch('queue_depend', { 'jobnum' => $job->jobnum } ) ) { - $dbh->commit or die $dbh->errstr; #if $oldAutoCommit; - sleep 5; #would be better if mysql could do everything in query above - next; - } + #assuming mysql 4.1 w/subqueries now + #if ( driver_name eq 'mysql' + # && qsearch('queue_depend', { 'jobnum' => $job->jobnum } ) ) { + # dbh->commit or die dbh->errstr; #if $oldAutoCommit; + # sleep 5; #would be better if mysql could do everything in query above + # next; + #} my %hash = $job->hash; $hash{'status'} = 'locked'; my $ljob = new FS::queue ( \%hash ); my $error = $ljob->replace($job); - die $error if $error; + if ( $error ) { + warn "WARNING: database error locking job, closing connection: ". + dbh->errstr; + undef $FS::UID::dbh; + next; + } - $dbh->commit or die $dbh->errstr; #if $oldAutoCommit; + # if $oldAutoCommit { + dbh->commit or do { + warn "WARNING: database error, closing connection: ". dbh->errstr; + undef $FS::UID::dbh; + next; + }; + # } $FS::UID::AutoCommit = 1; #} -- cgit v1.2.1 From 6cf964d0dc008621fb30fd2da28e2c44f29c6364 Mon Sep 17 00:00:00 2001 From: ivan Date: Thu, 27 Jan 2005 10:21:18 +0000 Subject: DHTML progress bar for glacial rate adding and editing, closes: Bug#1100 --- FS/bin/freeside-queued | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index e14ddad8e..a3fb7e562 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -87,7 +87,7 @@ while (1) { unless ( dbh && dbh->ping ) { warn "WARNING: connection to database lost, reconnecting...\n"; - eval { myconnect; }; + eval { $FS::UID::dbh = myconnect; }; unless ( !$@ && dbh && dbh->ping ) { warn "WARNING: still no connection to database, sleeping for retry...\n"; @@ -162,6 +162,7 @@ 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"; @@ -184,8 +185,12 @@ while (1) { forksuidsetup($user); - #auto-use export classes... - if ( $ljob->job =~ /(FS::part_export::\w+)::/ ) { + #auto-use classes... + #if ( $ljob->job =~ /(FS::part_export::\w+)::/ ) { + if ( $ljob->job =~ /(FS::part_export::\w+)::/ + || $ljob->job =~ /(FS::\w+)::/ + ) + { my $class = $1; eval "use $class;"; if ( $@ ) { -- cgit v1.2.1 From beba6672fb9c9c5769c81f8029bb88cd2bc910e9 Mon Sep 17 00:00:00 2001 From: ivan Date: Mon, 25 Apr 2005 09:33:35 +0000 Subject: pick up freeside-sqlradius-radacctd again after all these years, now it just needs to update the "seconds" field(s), finally closes: Bug#1125 --- FS/bin/freeside-queued | 96 +++++++++----------------------------------------- 1 file changed, 17 insertions(+), 79 deletions(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index a3fb7e562..b9ef09cd1 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -1,13 +1,11 @@ #!/usr/bin/perl -w use strict; -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 vars qw( $DEBUG $kids $max_kids %kids ); +use POSIX qw(:sys_wait_h); 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; @@ -18,40 +16,24 @@ 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; -#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 "starting daemonization (forking)\n" if $DEBUG; +#daemonize1('freeside-queued',$user); #to keep pid files unique w/multi installs +daemonize1('freeside-queued'); -$sigterm = 0; -$sigint = 0; -$SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $sigint++; }; -$SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $sigterm++; }; +warn "dropping privledges\n" if $DEBUG; +drop_root(); -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; }; @@ -62,14 +44,12 @@ while ( $@ ) { } } -$log_file = "/usr/local/etc/freeside/queuelog.". $FS::UID::datasrc; - -&daemonize2; +logfile( "/usr/local/etc/freeside/queuelog.". $FS::UID::datasrc ); -$SIG{__DIE__} = \&_die; -$SIG{__WARN__} = \&_logmsg; +warn "completing daemonization (detaching))\n" if $DEBUG; +daemonize2(); -warn "freeside-queued starting\n"; +#-- my $warnkids=0; while (1) { @@ -225,11 +205,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; } @@ -239,48 +219,6 @@ 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); -- cgit v1.2.1 From 684a478c0f88e5bf6d1d3f32f4618089146b5709 Mon Sep 17 00:00:00 2001 From: ivan Date: Thu, 2 Jun 2005 09:29:56 +0000 Subject: add ability to search on a date range of invoice events and then reprint or reemail (boy was that a bit more work than i expected), closes: Bug#946 --- FS/bin/freeside-queued | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'FS/bin/freeside-queued') diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index b9ef09cd1..3a0a9b4e5 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -186,7 +186,7 @@ while (1) { } my $eval = "&". $ljob->job. '(@args);'; - warn "running $eval"; + warn 'running "&'. $ljob->job. '('. join(', ', @args). ")\n" if $DEBUG; eval $eval; #throw away return value? suppose so if ( $@ ) { warn "job $eval failed"; -- cgit v1.2.1