From 1bfcd9ce4738e5c9f3c8a309775235e823b2f82c Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 14 Jan 2003 09:26:49 +0000 Subject: move freeside-selfservice-server to proper MakeMaker install location --- FS/bin/freeside-selfservice-server | 235 +++++++++++++++++++++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 FS/bin/freeside-selfservice-server (limited to 'FS/bin/freeside-selfservice-server') diff --git a/FS/bin/freeside-selfservice-server b/FS/bin/freeside-selfservice-server new file mode 100644 index 000000000..264cbc56d --- /dev/null +++ b/FS/bin/freeside-selfservice-server @@ -0,0 +1,235 @@ +#!/usr/bin/perl -w +# +# freeside-selfservice-server + +# alas, much false laziness with freeside-queued and fs_signup_server. at +# least it is slated to replace fs_{signup,passwd,mailadmin}_server +# should probably generalize the version in here, or better yet use +# Proc::Daemon or somesuch + +use strict; +use vars qw( $Debug %kids $kids $max_kids $shutdown $log_file $ssh_pid ); +use Fcntl qw(:flock); +use POSIX qw(:sys_wait_h setsid); +use IO::Handle; +use IO::Select; +use IO::File; +use Storable qw(nstore_fd fd_retrieve); +use Net::SSH qw(sshopen2); +use FS::UID qw(adminsuidsetup forksuidsetup); +use FS::ClientAPI; + +use FS::Conf; +use FS::cust_bill; +use FS::cust_pkg; + +$Debug = 2; # >= 2 will log packet contents, including potentially compromising + # information + +$shutdown = 0; +$max_kids = '10'; #? +$kids = 0; + +my $user = shift or die &usage; +my $machine = shift or die &usage; +my $pid_file = "/var/run/freeside-selfservice-server.$user.pid"; +#my $pid_file = "/var/run/freeside-selfservice-server.$user.pid"; $FS::UID::datasrc not posible, but should include machine name at least, hmm + +&init($user); + +my $conf = new FS::Conf; + +if ($conf->exists('selfservice_server-quiet')) { + $FS::cust_bill::quiet = 1; + $FS::cust_pkg::quiet = 1; +} + +my $clientd = "/usr/local/sbin/freeside-selfservice-clientd"; #better name? + +my $warnkids=0; +while (1) { + my($writer,$reader,$error) = (new IO::Handle, new IO::Handle, new IO::Handle); + warn "connecting to $machine\n" if $Debug; + + $ssh_pid = sshopen2($machine,$reader,$writer,$clientd); + +# nstore_fd(\*writer, {'hi'=>'there'}); + + warn "entering main loop\n" if $Debug; + my $undisp = 0; + my $s = IO::Select->new( $reader ); + while (1) { + + &reap_kids; + + warn "waiting for packet from client\n" if $Debug && !$undisp; + $undisp = 1; + my @handles = $s->can_read(5); + unless ( @handles ) { + &shutdown if $shutdown; + next; + } + + $undisp = 0; + + warn "receiving packet from client\n" if $Debug; + + my $packet = fd_retrieve($reader); + warn "packet received\n". + join('', map { " $_=>$packet->{$_}\n" } keys %$packet ) + if $Debug > 1; + + #prevent runaway forking + my $warnkids = 0; + while ( $kids >= $max_kids ) { + warn "WARNING: maximum $kids children reached\n" unless $warnkids++; + &reap_kids; + sleep 1; + } + + warn "forking child\n" if $Debug; + defined( my $pid = fork ) or die "can't fork: $!"; + if ( $pid ) { + $kids++; + $kids{$pid} = 1; + warn "child $pid spawned\n" if $Debug; + } else { #kid time + + #get new db handle + $FS::UID::dbh->{InactiveDestroy} = 1; + forksuidsetup($user); + + my $type = $packet->{_packet}; + warn "calling $type handler\n" if $Debug; + my $rv = eval { FS::ClientAPI->dispatch($type, $packet); }; + if ( $@ ) { + warn my $error = "WARNING: error dispatching $type: $@"; + $rv = { _error => $error }; + } + $rv->{_token} = $packet->{_token}; #identifier + + warn "sending response\n" if $Debug; + flock($writer, LOCK_EX) or die "FATAL: can't lock write stream: $!"; + nstore_fd($rv, $writer) or die "FATAL: can't send response: $!"; + $writer->flush or die "FATAL: can't flush: $!"; + flock($writer, LOCK_UN) or die "WARNING: can't release write lock: $!"; + + warn "child exiting\n" if $Debug; + exit; #end-of-kid + } + + } + +} + +### +# utility subroutines +### + +sub reap_kids { + #warn "reaping kids\n"; + foreach my $pid ( keys %kids ) { + my $kid = waitpid($pid, WNOHANG); + if ( $kid > 0 ) { + $kids--; + delete $kids{$kid}; + } + } + #warn "done reaping\n"; +} + +sub init { + my $user = shift; + + 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-selfservice-server to $machine started with pid $pid\n"; #logging to $log_file + exit unless $pid_file; + my $pidfh = new IO::File ">$pid_file" or exit; + print $pidfh "$pid\n"; + exit; + } + +# sub REAPER { my $pid = wait; $SIG{CHLD} = \&REAPER; $kids--; } +# #sub REAPER { my $pid = wait; $kids--; $SIG{CHLD} = \&REAPER; } +# $SIG{CHLD} = \&REAPER; + + $shutdown = 0; + $SIG{HUP} = sub { warn "SIGHUP received; shutting down\n"; $shutdown++; }; + $SIG{INT} = sub { warn "SIGINT received; shutting down\n"; $shutdown++; }; + $SIG{TERM} = sub { warn "SIGTERM received; shutting down\n"; $shutdown++; }; + $SIG{QUIT} = sub { warn "SIGQUIT received; shutting down\n"; $shutdown++; }; + $SIG{PIPE} = sub { warn "SIGPIPE received; shutting down\n"; $shutdown++; }; + + #false laziness w/freeside-queued + 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; + #eslaf + + $ENV{HOME} = (getpwuid($>))[7]; #for ssh + adminsuidsetup $user; + + #$log_file = "/usr/local/etc/freeside/selfservice.". $FS::UID::datasrc; #MACHINE NAME + $log_file = "/usr/local/etc/freeside/selfservice.$machine.log"; + + 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: $!"; + + $SIG{__DIE__} = \&_die; + $SIG{__WARN__} = \&_logmsg; + + warn "freeside-selfservice-server starting\n"; + +} + +sub shutdown { + my $wait = 12; #wait up to 1 minute + while ( $kids > 0 && $wait-- ) { + warn "waiting for $kids children to terminate"; + sleep 5; + } + warn "abandoning $kids children" if $kids; + kill 'TERM', $ssh_pid if $ssh_pid; + die "exiting"; +} + +sub _die { + my $msg = shift; + unlink $pid_file if -e $pid_file; + _logmsg($msg); +} + +sub _logmsg { + chomp( my $msg = shift ); + _do_logmsg( "[server] [". scalar(localtime). "] [$$] $msg\n" ); +} + +sub _do_logmsg { + chomp( my $msg = shift ); + my $log = new IO::File ">>$log_file"; + flock($log, LOCK_EX); + seek($log, 0, 2); + print $log "$msg\n"; + flock($log, LOCK_UN); + close $log; +} + +sub usage { + die "Usage:\n\n fs_signup_server user machine\n"; +} + -- cgit v1.2.1 From daeb70ea28f8a3e0db500f8a0e107221f4542d30 Mon Sep 17 00:00:00 2001 From: ivan Date: Thu, 25 Sep 2003 10:27:11 +0000 Subject: freebsd portability fixes --- FS/bin/freeside-selfservice-server | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'FS/bin/freeside-selfservice-server') diff --git a/FS/bin/freeside-selfservice-server b/FS/bin/freeside-selfservice-server index 264cbc56d..6cfafda58 100644 --- a/FS/bin/freeside-selfservice-server +++ b/FS/bin/freeside-selfservice-server @@ -9,6 +9,7 @@ use strict; use vars qw( $Debug %kids $kids $max_kids $shutdown $log_file $ssh_pid ); +use subs qw( lock_write unlock_write ); use Fcntl qw(:flock); use POSIX qw(:sys_wait_h setsid); use IO::Handle; @@ -35,6 +36,9 @@ my $machine = shift or die &usage; my $pid_file = "/var/run/freeside-selfservice-server.$user.pid"; #my $pid_file = "/var/run/freeside-selfservice-server.$user.pid"; $FS::UID::datasrc not posible, but should include machine name at least, hmm +my $lock_file = "/usr/local/etc/freeside/selfservice.$machine.writelock"; +open(LOCKFILE,">$lock_file") or die "can't open $lock_file: $!"; + &init($user); my $conf = new FS::Conf; @@ -109,10 +113,10 @@ while (1) { $rv->{_token} = $packet->{_token}; #identifier warn "sending response\n" if $Debug; - flock($writer, LOCK_EX) or die "FATAL: can't lock write stream: $!"; + lock_write; nstore_fd($rv, $writer) or die "FATAL: can't send response: $!"; $writer->flush or die "FATAL: can't flush: $!"; - flock($writer, LOCK_UN) or die "WARNING: can't release write lock: $!"; + unlock_write; warn "child exiting\n" if $Debug; exit; #end-of-kid @@ -229,7 +233,23 @@ sub _do_logmsg { close $log; } +sub lock_write { + #broken on freebsd? + #flock($writer, LOCK_EX) or die "FATAL: can't lock write stream: $!"; + + flock(LOCKFILE, LOCK_EX) or die "FATAL: can't lock $lock_file: $!"; + +} + +sub unlock_write { + #broken on freebsd? + #flock($writer, LOCK_UN) or die "WARNING: can't release write lock: $!"; + + flock(LOCKFILE, LOCK_UN) or die "FATAL: can't unlock $lock_file: $!"; + +} + sub usage { - die "Usage:\n\n fs_signup_server user machine\n"; + die "Usage:\n\n freeside-selfservice-server user machine\n"; } -- cgit v1.2.1 From 4196bc59e8cceb04c6f76fab46ce249ff0178c43 Mon Sep 17 00:00:00 2001 From: ivan Date: Mon, 29 Sep 2003 02:17:51 +0000 Subject: finish removing quiet config options --- FS/bin/freeside-selfservice-server | 5 ----- 1 file changed, 5 deletions(-) (limited to 'FS/bin/freeside-selfservice-server') diff --git a/FS/bin/freeside-selfservice-server b/FS/bin/freeside-selfservice-server index 6cfafda58..107103973 100644 --- a/FS/bin/freeside-selfservice-server +++ b/FS/bin/freeside-selfservice-server @@ -43,11 +43,6 @@ open(LOCKFILE,">$lock_file") or die "can't open $lock_file: $!"; my $conf = new FS::Conf; -if ($conf->exists('selfservice_server-quiet')) { - $FS::cust_bill::quiet = 1; - $FS::cust_pkg::quiet = 1; -} - my $clientd = "/usr/local/sbin/freeside-selfservice-clientd"; #better name? my $warnkids=0; -- cgit v1.2.1 From bacea004a735c7a9c30a35e9184a63897a200e6e Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 15 Oct 2003 15:03:56 +0000 Subject: add tagging ability so we can run multiple self-service clients on one machine --- FS/bin/freeside-selfservice-server | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'FS/bin/freeside-selfservice-server') diff --git a/FS/bin/freeside-selfservice-server b/FS/bin/freeside-selfservice-server index 107103973..05fa72b43 100644 --- a/FS/bin/freeside-selfservice-server +++ b/FS/bin/freeside-selfservice-server @@ -33,6 +33,7 @@ $kids = 0; my $user = shift or die &usage; my $machine = shift or die &usage; +my $tag = scalar(@ARGV) ? shift : ''; my $pid_file = "/var/run/freeside-selfservice-server.$user.pid"; #my $pid_file = "/var/run/freeside-selfservice-server.$user.pid"; $FS::UID::datasrc not posible, but should include machine name at least, hmm @@ -50,7 +51,7 @@ while (1) { my($writer,$reader,$error) = (new IO::Handle, new IO::Handle, new IO::Handle); warn "connecting to $machine\n" if $Debug; - $ssh_pid = sshopen2($machine,$reader,$writer,$clientd); + $ssh_pid = sshopen2($machine,$reader,$writer,$clientd,$tag); # nstore_fd(\*writer, {'hi'=>'there'}); -- cgit v1.2.1 From 17b3560111539da506f7f6bb575dd3776375466f Mon Sep 17 00:00:00 2001 From: ivan Date: Fri, 14 Nov 2003 08:43:24 +0000 Subject: hopefully recover better from lost ssh connections --- FS/bin/freeside-selfservice-server | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'FS/bin/freeside-selfservice-server') diff --git a/FS/bin/freeside-selfservice-server b/FS/bin/freeside-selfservice-server index 05fa72b43..d2358e33c 100644 --- a/FS/bin/freeside-selfservice-server +++ b/FS/bin/freeside-selfservice-server @@ -74,7 +74,13 @@ while (1) { warn "receiving packet from client\n" if $Debug; - my $packet = fd_retrieve($reader); + my $packet = eval { fd_retrieve($reader); }; + if ( $@ ) { + warn "Storable error receiving packet from client". + " (assuming lost connection): $@\n" + if $Debug; + last; + } warn "packet received\n". join('', map { " $_=>$packet->{$_}\n" } keys %$packet ) if $Debug > 1; @@ -120,6 +126,9 @@ while (1) { } + warn "connection lost, reconnecting\n" if $Debug; + sleep 3; + } ### -- cgit v1.2.1 From ded62e3a3ab9b930593d36be3f2b32bda2433f07 Mon Sep 17 00:00:00 2001 From: ivan Date: Sat, 15 Nov 2003 07:28:26 +0000 Subject: kill off ssh process when re-opening connection --- FS/bin/freeside-selfservice-server | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'FS/bin/freeside-selfservice-server') diff --git a/FS/bin/freeside-selfservice-server b/FS/bin/freeside-selfservice-server index d2358e33c..f9571fa1e 100644 --- a/FS/bin/freeside-selfservice-server +++ b/FS/bin/freeside-selfservice-server @@ -79,6 +79,11 @@ while (1) { warn "Storable error receiving packet from client". " (assuming lost connection): $@\n" if $Debug; + if ( $ssh_pid ) { + warn "sending TERM signal to ssh process $ssh_pid\n" if $Debug; + kill 'TERM', $ssh_pid; + $ssh_pid = 0; + } last; } warn "packet received\n". -- cgit v1.2.1 From 95558fc7bcc98138db7f2d54cd5e6724bac3beea Mon Sep 17 00:00:00 2001 From: ivan Date: Fri, 30 Jan 2004 01:10:28 +0000 Subject: add support for running selfservice server against multiple machines --- FS/bin/freeside-selfservice-server | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'FS/bin/freeside-selfservice-server') diff --git a/FS/bin/freeside-selfservice-server b/FS/bin/freeside-selfservice-server index f9571fa1e..371a646b4 100644 --- a/FS/bin/freeside-selfservice-server +++ b/FS/bin/freeside-selfservice-server @@ -34,8 +34,9 @@ $kids = 0; my $user = shift or die &usage; my $machine = shift or die &usage; my $tag = scalar(@ARGV) ? shift : ''; -my $pid_file = "/var/run/freeside-selfservice-server.$user.pid"; -#my $pid_file = "/var/run/freeside-selfservice-server.$user.pid"; $FS::UID::datasrc not posible, but should include machine name at least, hmm + +# $FS::UID::datasrc not posible +my $pid_file = "/var/run/freeside-selfservice-server.$user.$machine.pid"; my $lock_file = "/usr/local/etc/freeside/selfservice.$machine.writelock"; open(LOCKFILE,">$lock_file") or die "can't open $lock_file: $!"; -- cgit v1.2.1 From e2a2f2f1a1a793581de4222e582731e7a9692a6b Mon Sep 17 00:00:00 2001 From: ivan Date: Thu, 11 Mar 2004 08:54:52 +0000 Subject: turn down logging level --- FS/bin/freeside-selfservice-server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'FS/bin/freeside-selfservice-server') diff --git a/FS/bin/freeside-selfservice-server b/FS/bin/freeside-selfservice-server index 371a646b4..03c7135b2 100644 --- a/FS/bin/freeside-selfservice-server +++ b/FS/bin/freeside-selfservice-server @@ -24,7 +24,7 @@ use FS::Conf; use FS::cust_bill; use FS::cust_pkg; -$Debug = 2; # >= 2 will log packet contents, including potentially compromising +$Debug = 1; # >= 2 will log packet contents, including potentially compromising # information $shutdown = 0; -- cgit v1.2.1 From cccf2f33d38b693c2742b5806e32d892d31b4374 Mon Sep 17 00:00:00 2001 From: ivan Date: Thu, 18 Mar 2004 01:46:40 +0000 Subject: require Storable minimum 2.09 --- FS/bin/freeside-selfservice-server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'FS/bin/freeside-selfservice-server') diff --git a/FS/bin/freeside-selfservice-server b/FS/bin/freeside-selfservice-server index 03c7135b2..864c2d46e 100644 --- a/FS/bin/freeside-selfservice-server +++ b/FS/bin/freeside-selfservice-server @@ -15,7 +15,7 @@ use POSIX qw(:sys_wait_h setsid); use IO::Handle; use IO::Select; use IO::File; -use Storable qw(nstore_fd fd_retrieve); +use Storable 2.09 qw(nstore_fd fd_retrieve); use Net::SSH qw(sshopen2); use FS::UID qw(adminsuidsetup forksuidsetup); use FS::ClientAPI; -- cgit v1.2.1 From 8a56de51d9b1bf26fde1a32ed283edc3b545d5a4 Mon Sep 17 00:00:00 2001 From: ivan Date: Mon, 6 Sep 2004 09:44:42 +0000 Subject: don't open a database connection in the parent process --- FS/bin/freeside-selfservice-server | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'FS/bin/freeside-selfservice-server') diff --git a/FS/bin/freeside-selfservice-server b/FS/bin/freeside-selfservice-server index 864c2d46e..d34e8411c 100644 --- a/FS/bin/freeside-selfservice-server +++ b/FS/bin/freeside-selfservice-server @@ -107,9 +107,12 @@ while (1) { warn "child $pid spawned\n" if $Debug; } else { #kid time - #get new db handle - $FS::UID::dbh->{InactiveDestroy} = 1; - forksuidsetup($user); + ##get new db handle + #$FS::UID::dbh->{InactiveDestroy} = 1; + #forksuidsetup($user); + + #get db handle + adminsuidsetup($user); my $type = $packet->{_packet}; warn "calling $type handler\n" if $Debug; @@ -195,7 +198,7 @@ sub init { #eslaf $ENV{HOME} = (getpwuid($>))[7]; #for ssh - adminsuidsetup $user; + #adminsuidsetup $user; #$log_file = "/usr/local/etc/freeside/selfservice.". $FS::UID::datasrc; #MACHINE NAME $log_file = "/usr/local/etc/freeside/selfservice.$machine.log"; -- cgit v1.2.1 From efccaa2d081bfcaaddcf9d89da3c2a065b4caafb Mon Sep 17 00:00:00 2001 From: ivan Date: Mon, 6 Sep 2004 12:44:17 +0000 Subject: self-service keepalives --- FS/bin/freeside-selfservice-server | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'FS/bin/freeside-selfservice-server') diff --git a/FS/bin/freeside-selfservice-server b/FS/bin/freeside-selfservice-server index d34e8411c..a83664db2 100644 --- a/FS/bin/freeside-selfservice-server +++ b/FS/bin/freeside-selfservice-server @@ -8,7 +8,8 @@ # Proc::Daemon or somesuch use strict; -use vars qw( $Debug %kids $kids $max_kids $shutdown $log_file $ssh_pid ); +use vars qw( $Debug %kids $kids $max_kids $shutdown $log_file $ssh_pid + $keepalives ); use subs qw( lock_write unlock_write ); use Fcntl qw(:flock); use POSIX qw(:sys_wait_h setsid); @@ -29,6 +30,7 @@ $Debug = 1; # >= 2 will log packet contents, including potentially compromising $shutdown = 0; $max_kids = '10'; #? +$keepalives = 0; #let clientd turn it on, so we don't barf on old ones $kids = 0; my $user = shift or die &usage; @@ -58,6 +60,7 @@ while (1) { warn "entering main loop\n" if $Debug; my $undisp = 0; + my $keepalive_count = 0; my $s = IO::Select->new( $reader ); while (1) { @@ -68,6 +71,10 @@ while (1) { my @handles = $s->can_read(5); unless ( @handles ) { &shutdown if $shutdown; + if ( $keepalives && $keepalive_count++ > 10 ) { + $keepalive_count = 0; + nstore_fd( { _token => '_keepalive' }, $writer ); + } next; } @@ -91,6 +98,12 @@ while (1) { join('', map { " $_=>$packet->{$_}\n" } keys %$packet ) if $Debug > 1; + if ( $packet->{_packet} eq '_enable_keepalive' ) { + warn "enabling keep alives\n" if $Debug; + $keepalives=1; + next; + } + #prevent runaway forking my $warnkids = 0; while ( $kids >= $max_kids ) { -- cgit v1.2.1 From 07fd88f7c0cd757eb2f8e635b71acebe6a944602 Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 14 Sep 2004 06:47:46 +0000 Subject: selfservice: - server: don't reconnect again if we've already been signalled to shutdown - server: add kid reaping to shutdown sequence - server: add another optional logging level to response sending - server: acquire write mutex for keepalives --- FS/bin/freeside-selfservice-server | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'FS/bin/freeside-selfservice-server') diff --git a/FS/bin/freeside-selfservice-server b/FS/bin/freeside-selfservice-server index a83664db2..ad100e83a 100644 --- a/FS/bin/freeside-selfservice-server +++ b/FS/bin/freeside-selfservice-server @@ -25,8 +25,8 @@ use FS::Conf; use FS::cust_bill; use FS::cust_pkg; -$Debug = 1; # >= 2 will log packet contents, including potentially compromising - # information +$Debug = 1; # 2 will turn on more logging + # 3 will log packet contents, including passwords $shutdown = 0; $max_kids = '10'; #? @@ -73,7 +73,9 @@ while (1) { &shutdown if $shutdown; if ( $keepalives && $keepalive_count++ > 10 ) { $keepalive_count = 0; + lock_write; nstore_fd( { _token => '_keepalive' }, $writer ); + unlock_write; } next; } @@ -96,7 +98,7 @@ while (1) { } warn "packet received\n". join('', map { " $_=>$packet->{$_}\n" } keys %$packet ) - if $Debug > 1; + if $Debug > 2; if ( $packet->{_packet} eq '_enable_keepalive' ) { warn "enabling keep alives\n" if $Debug; @@ -136,8 +138,8 @@ while (1) { } $rv->{_token} = $packet->{_token}; #identifier - warn "sending response\n" if $Debug; lock_write; + warn "sending response\n" if $Debug; nstore_fd($rv, $writer) or die "FATAL: can't send response: $!"; $writer->flush or die "FATAL: can't flush: $!"; unlock_write; @@ -148,6 +150,7 @@ while (1) { } + &shutdown if $shutdown; warn "connection lost, reconnecting\n" if $Debug; sleep 3; @@ -229,10 +232,12 @@ sub init { } sub shutdown { + &reap_kids; my $wait = 12; #wait up to 1 minute while ( $kids > 0 && $wait-- ) { warn "waiting for $kids children to terminate"; sleep 5; + &reap_kids; } warn "abandoning $kids children" if $kids; kill 'TERM', $ssh_pid if $ssh_pid; @@ -261,6 +266,8 @@ sub _do_logmsg { } sub lock_write { + warn "locking $lock_file mutex for write to write stream\n" if $Debug > 1; + #broken on freebsd? #flock($writer, LOCK_EX) or die "FATAL: can't lock write stream: $!"; @@ -269,6 +276,8 @@ sub lock_write { } sub unlock_write { + warn "unlocking $lock_file mutex\n" if $Debug > 1; + #broken on freebsd? #flock($writer, LOCK_UN) or die "WARNING: can't release write lock: $!"; -- cgit v1.2.1 From 73b848b45d387a3ca03f9ed64fd48646dd52352d Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 15 Sep 2004 08:30:20 +0000 Subject: obtain a new descriptor for the lock in kids, this should fix locking problems --- FS/bin/freeside-selfservice-server | 1 + 1 file changed, 1 insertion(+) (limited to 'FS/bin/freeside-selfservice-server') diff --git a/FS/bin/freeside-selfservice-server b/FS/bin/freeside-selfservice-server index ad100e83a..de7e049ba 100644 --- a/FS/bin/freeside-selfservice-server +++ b/FS/bin/freeside-selfservice-server @@ -138,6 +138,7 @@ while (1) { } $rv->{_token} = $packet->{_token}; #identifier + open(LOCKFILE,">$lock_file") or die "can't open $lock_file: $!"; lock_write; warn "sending response\n" if $Debug; nstore_fd($rv, $writer) or die "FATAL: can't send response: $!"; -- cgit v1.2.1 From 83337c0a780c6e26618a7d0c2f228d8c32d30da3 Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 15 Sep 2004 08:57:11 +0000 Subject: it would help to set the permissions on the lockfile right, so the kids can open it... --- FS/bin/freeside-selfservice-server | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'FS/bin/freeside-selfservice-server') diff --git a/FS/bin/freeside-selfservice-server b/FS/bin/freeside-selfservice-server index de7e049ba..1093e10c2 100644 --- a/FS/bin/freeside-selfservice-server +++ b/FS/bin/freeside-selfservice-server @@ -41,7 +41,6 @@ my $tag = scalar(@ARGV) ? shift : ''; my $pid_file = "/var/run/freeside-selfservice-server.$user.$machine.pid"; my $lock_file = "/usr/local/etc/freeside/selfservice.$machine.writelock"; -open(LOCKFILE,">$lock_file") or die "can't open $lock_file: $!"; &init($user); @@ -201,6 +200,10 @@ sub init { #false laziness w/freeside-queued my $freeside_gid = scalar(getgrnam('freeside')) or die "can't setgid to freeside group\n"; + + open(LOCKFILE,">$lock_file") or die "can't open $lock_file: $!"; + chown $FS::UID::freeside_uid, $freeside_gid, $lock_file; + $) = $freeside_gid; $( = $freeside_gid; #if freebsd can't setuid(), presumably it can't setgid() either. grr fleabsd -- cgit v1.2.1 From 0247c39288b477060509240ef23a5e7b6bfcd8f8 Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 5 Oct 2004 12:17:35 +0000 Subject: DO open a database connection in the parent process, this cached the $dbdef and speeds things up significantly --- FS/bin/freeside-selfservice-server | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'FS/bin/freeside-selfservice-server') diff --git a/FS/bin/freeside-selfservice-server b/FS/bin/freeside-selfservice-server index 1093e10c2..c045893d1 100644 --- a/FS/bin/freeside-selfservice-server +++ b/FS/bin/freeside-selfservice-server @@ -218,7 +218,7 @@ sub init { #eslaf $ENV{HOME} = (getpwuid($>))[7]; #for ssh - #adminsuidsetup $user; + adminsuidsetup $user; #$log_file = "/usr/local/etc/freeside/selfservice.". $FS::UID::datasrc; #MACHINE NAME $log_file = "/usr/local/etc/freeside/selfservice.$machine.log"; -- cgit v1.2.1