74355: freeside-upgrade error N/A (tokenized) [better error handling for encryption...
[freeside.git] / fs_selfservice / FS-SelfService / freeside-selfservice-xmlrpc-server
1 #!/usr/bin/perl -w
2 #
3 # freeside-selfservice-xmlrpc-server
4 #
5
6 use strict;
7 use Fcntl qw(:flock);
8 use POSIX;
9 use Getopt::Std;
10 use XMLRPC::Transport::HTTP;
11 use XMLRPC::Lite; # for XMLRPC::Serializer;
12 use FS::SelfService::XMLRPC;
13
14 use vars qw( $opt_p $opt_d );
15 use vars qw( $DEBUG );
16
17 getopts("p:d");
18 $DEBUG = $opt_d;
19 my $tag = $opt_p ? ':'.$opt_p : '';
20
21 my %typelookup = (
22   base64 => [10, sub {$_[0] =~ /[^\x09\x0a\x0d\x20-\x7f]/}, 'as_base64'],
23   dateTime => [35, sub {$_[0] =~ /^\d{8}T\d\d:\d\d:\d\d$/}, 'as_dateTime'],
24   string => [40, sub {1}, 'as_string'],
25 );
26 my $serializer = new XMLRPC::Serializer(typelookup => \%typelookup);
27
28 my $log_file = "/usr/local/freeside/selfservice.xmlrpc$tag.log";
29
30 my $pid = fork;
31 defined($pid) or die "Can't fork to start: $!";
32 print "Started daemon with pid $pid\n" if $pid;
33 exit if $pid;
34
35 POSIX::setsid();
36 open STDIN, "/dev/null" or die "Can't get rid of STDIN";
37 open STDOUT, ">/dev/null" or die "Can't get rid of STDOUT";
38 open STDERR, ">&STDOUT" or die "Can't get rid of STDERR";
39
40 $SIG{__WARN__} = \&_logmsg;
41 $SIG{__DIE__} = sub { &_logmsg(@_); exit };
42
43 my $daemon = XMLRPC::Transport::HTTP::Daemon
44   ->new(LocalPort => $opt_p ? $opt_p : 8080)
45   ->dispatch_to('FS::SelfService::XMLRPC')
46   ->serializer($serializer);
47
48 warn "Handling request at ", $daemon->url, "\n";
49 $daemon->handle;
50
51 sub _logmsg {
52   chomp( my $msg = shift );
53   my $log = new IO::File ">>$log_file";
54   flock($log, LOCK_EX);
55   seek($log, 0, 2);
56   print $log "[". scalar(localtime). "] [$$] $msg\n";
57   flock($log, LOCK_UN);
58   close $log;
59 }