use constant SERVER_PORT => 8080; # Server port.
use constant TESTING_CHURN => 0; # Randomly test process respawning.
-use POE; # Base features.
+use POE 1.2; # Base features.
use POE::Filter::HTTPD; # For serving HTTP content.
use POE::Wheel::ReadWrite; # For socket I/O.
use POE::Wheel::SocketFactory; # For serving socket connections.
-#use SOAP::Transport::HTTP;
-use XMLRPC::Transport::HTTP;
+use XMLRPC::Transport::HTTP; #SOAP::Transport::HTTP;
use XMLRPC::Lite; # for XMLRPC::Serializer
-use FS::UID qw(adminsuidsetup);
-#use FS::SelfService::XMLRPC;
+use FS::Daemon qw( daemonize1 drop_root logfile daemonize2 );
+use FS::UID qw( adminsuidsetup forksuidsetup dbh );
+use FS::Conf;
use FS::ClientAPI qw( load_clientapi_modules );
-use FS::ClientAPI_XMLRPC;
+use FS::ClientAPI_XMLRPC; #FS::SelfService::XMLRPC;
+use FS::TicketSystem;
-#xmlrpc.cgi
+#freeside
+my $FREESIDE_LOG = "%%%FREESIDE_LOG%%%";
+my $FREESIDE_LOCK = "%%%FREESIDE_LOCK%%%";
+my $lock_file = "$FREESIDE_LOCK/selfservice-xmlrpcd.writelock";
+
+#freeside xmlrpc.cgi
my %typelookup = (
- base64 => [10, sub {$_[0] =~ /[^\x09\x0a\x0d\x20-\x7f]/}, 'as_base64'],
+#not utf-8 safe# base64 => [10, sub {$_[0] =~ /[^\x09\x0a\x0d\x20-\x7f]/}, 'as_base64'],
dateTime => [35, sub {$_[0] =~ /^\d{8}T\d\d:\d\d:\d\d$/}, 'as_dateTime'],
string => [40, sub {1}, 'as_string'],
);
-# These are HTTP::Request headers that have methods.
-my @method_headers =
- qw( authorization authorization_basic
- content content_encoding content_language content_length content_type
- date expires from if_modified_since if_unmodified_since last_modified
- method protocol proxy_authorization proxy_authorization_basic referer
- server title url user_agent www_authenticate
-);
-
-# These are HTTP::Request headers that do not have methods.
-my @header_headers =
- qw( username opaque stale algorithm realm uri qop auth nonce cnonce
- nc response
-);
-
###
-# init
+# freeside init
###
my $user = shift or die &usage;
-#FS::ClientAPI
+$FS::Daemon::NOSIG = 1;
+$FS::Daemon::PID_NEWSTYLE = 1;
+daemonize1('selfservice-xmlrpcd');
+
+POE::Kernel->has_forked(); #daemonize forks...
+
+drop_root();
+
+adminsuidsetup($user);
+
load_clientapi_modules;
+logfile("$FREESIDE_LOG/selfservice-xmlrpcd.log");
+
+daemonize2();
+
+FS::ClientAPI::Signup::clear_cache();
+
+my $conf = new FS::Conf;
+
+die "not running; selfservice-xmlrpc conf option is off\n"
+ unless $conf->exists('selfservice-xmlrpc');
+
+#parent doesn't need to hold a DB connection open
+dbh->disconnect;
+undef $FS::UID::dbh;
+
###
# the main loop
###
-# Spawn up to MAX_PROCESSES server processes, and then run them. Exit
-# when they are done.
-
server_spawn(MAX_PROCESSES);
POE::Kernel->run();
-
-#XXX we probably want to sleep a bit and then try all over again...
-exit 0;
+exit;
###
# the subroutines
Reuse => "yes",
);
- #XXX?#$kernel->sig( CHLD => "got_sig_child" );
$kernel->sig( INT => "got_sig_int" );
+ $kernel->sig( TERM => "got_sig_int" ); #huh
$heap->{children} = {};
$heap->{is_a_child} = 0;
my $heap = $_[HEAP];
DEBUG and warn "Server $$ stopped.\n";
- #XXX?
- #if ( my @children = keys %{ $heap->{children} } ) {
- # DEBUG and warn "Server $$ is signaling children to stop.\n";
- # kill INT => @children;
- #}
+ if ( my @children = keys %{ $heap->{children} } ) {
+ DEBUG and warn "Server $$ is signaling children to stop.\n";
+ kill INT => @children;
+ }
}
### The server session has encountered an error. Shut it down.
$heap->{is_a_child} = 1;
$heap->{children} = {};
+ #freeside db connection, etc.
+ forksuidsetup($user);
+
+ #why isn't this needed ala freeside-selfservice-server??
+ #FS::TicketSystem->init();
+
return;
}
}
### which in turn will trigger the process to exit gracefully.
sub server_got_sig_int {
- DEBUG and warn "Server $$ received SIGINT.\n";
- delete $_[HEAP]->{server};
- $_[KERNEL]->sig_handled();
+ my ( $kernel, $heap ) = @_[ KERNEL, HEAP ];
+ DEBUG and warn "Server $$ received SIGINT/TERM.\n";
+
+ if ( my @children = keys %{ $heap->{children} } ) {
+ DEBUG and warn "Server $$ is signaling children to stop.\n";
+ kill INT => @children;
+ }
+
+ delete $heap->{server};
+ $kernel->sig_handled();
}
### The server session received a SIGCHLD, indicating that some child
sub client_got_request {
my ( $heap, $request ) = @_[ HEAP, ARG0 ];
- freeside_kid_time();
+ forksuidsetup($user) unless dbh && dbh->ping;
my $serializer = new XMLRPC::Serializer(typelookup => \%typelookup);
$soap->request($request);
$soap->handle;
- my $response = $soap->response;
-
- $heap->{client}->put($response);
-}
-
-#setup the database connection and other things FS::SelfService::XMLRPC
-#expects to be in place. aka "kid time" in freeside-selfservice-server
-sub freeside_kid_time {
- #if we need a db connection in the parent
- ##get new db handle
- #$FS::UID::dbh->{InactiveDestroy} = 1;
- #forksuidsetup($user);
+ $FS::UID::dbh->commit() if $FS::UID::dbh; #XXX handle commit error
- adminsuidsetup($user);
+ my $response = $soap->response;
- #i guess that was it
+ $heap->{client}->put($response);
}
### The client handler received an error. Stop the ReadWrite wheel,