]> git.evergreen-ils.org Git - OpenSRF.git/blob - src/perlmods/OpenSRF/Transport/SlimJabber/Inbound.pm
Changed some config settings to load all jabber stuff from the bootstrap config
[OpenSRF.git] / src / perlmods / OpenSRF / Transport / SlimJabber / Inbound.pm
1 package OpenSRF::Transport::SlimJabber::Inbound;
2 use strict;use warnings;
3 use base qw/OpenSRF::Transport::SlimJabber::Client/;
4 use OpenSRF::EX qw(:try);
5 use OpenSRF::Utils::Logger qw(:level);
6 use OpenSRF::Utils::SettingsClient;
7 use OpenSRF::Utils::Config;
8
9 my $logger = "OpenSRF::Utils::Logger";
10
11 =head1 Description
12
13 This is the jabber connection where all incoming client requests will be accepted.
14 This connection takes the data, passes it off to the system then returns to take
15 more data.  Connection params are all taken from the config file and the values
16 retreived are based on the $app name passed into new().
17
18 This service should be loaded at system startup.
19
20 =cut
21
22 # XXX This will be overhauled to connect as a component instead of as
23 # a user.  all in good time, though.
24
25 {
26         my $unix_sock;
27         sub unix_sock { return $unix_sock; }
28         my $instance;
29
30         sub new {
31                 my( $class, $app ) = @_;
32                 $class = ref( $class ) || $class;
33                 if( ! $instance ) {
34
35                         my $conf = OpenSRF::Utils::Config->current;
36                         my $domains = $conf->bootstrap->domains;
37
38                         my $username    = $conf->bootstrap->username;
39                         my $password    = $conf->bootstrap->passwd;
40                         my $port                        = $conf->bootstrap->port;
41                         my $host                        = $domains->[0]; # XXX for now...
42                         my $resource    = $app . '_listener_at_' . $conf->env->hostname;
43
44                         OpenSRF::Utils::Logger->transport("Inbound as $username, $password, $resource, $host, $port\n", INTERNAL );
45
46                         my $self = __PACKAGE__->SUPER::new( 
47                                         username                => $username,
48                                         resource                => $resource,
49                                         password                => $password,
50                                         host                    => $host,
51                                         port                    => $port,
52                                         );
53
54                         $self->{app} = $app;
55                                         
56                         my $client = OpenSRF::Utils::SettingsClient->new();
57                         my $f = $client->config_value("dirs", "sock");
58                         $unix_sock = join( "/", $f, 
59                                         $client->config_value("apps", $app, "unix_config", "unix_sock" ));
60                         bless( $self, $class );
61                         $instance = $self;
62                 }
63                 return $instance;
64         }
65
66 }
67         
68 sub listen {
69         my $self = shift;
70         
71         my $routers;
72
73         try {
74
75                 my $conf = OpenSRF::Utils::Config->current;
76                 my $router_name = $conf->bootstrap->router_name;
77                 my $routers = $conf->bootstrap->domains;
78         
79                 unless($router_name and $routers) {
80                         throw OpenSRF::EX::Config 
81                                 ("Missing router config information 'router_name' and 'routers'");
82                 }
83         
84                 my @targets;
85                 for my $router (@$routers) {
86                         push @targets, "$router_name\@$router/router";
87                 }
88
89                 for my $router (@targets) {
90                         $logger->transport( $self->{app} . " connecting to router $router", INFO ); 
91                         $self->send( to => $router, 
92                                         body => "registering", router_command => "register" , router_class => $self->{app} );
93                 }
94                 $logger->transport( $self->{app} . " :routers connected", INFO ); 
95
96                 
97         } catch OpenSRF::EX::Config with {
98                 $logger->transport( $self->{app} . ": No routers defined" , WARN ); 
99                 # no routers defined
100         };
101
102
103         
104                         
105         $logger->transport( $self->{app} . " going into listen loop", INFO );
106         while(1) {
107         
108                 my $sock = $self->unix_sock();
109                 my $o = $self->process( -1 );
110
111                 if( ! defined( $o ) ) {
112                         throw OpenSRF::EX::Jabber( "Listen Loop failed at 'process()'" );
113                 }
114
115                 my $socket = IO::Socket::UNIX->new( Peer => $sock  );
116                 throw OpenSRF::EX::Socket( "Unable to connect to UnixServer: socket-file: $sock \n :=> $! " )
117                         unless ($socket->connected);
118                 print $socket $o;
119                 $socket->close;
120
121         }
122
123         throw OpenSRF::EX::Socket( "How did we get here?!?!" );
124 }
125
126 1;
127