Setting up Component::External
Martin Atkins
mart at degeneration.co.uk
Mon Dec 10 19:56:25 UTC 2007
Guillermo Roditi wrote:
> for( @domains ){
> my $aim = DJabberd::Component::External->new(
> listenport => 5270,
> secret => 'some_secret',
> );
> $aim->finalize;
> my $vhost = DJabberd::VHost->new( %vhost_args, server_name => $_,);
> $vhost->register_subdomain("aim", $aim);
> $server->add_vhost($vhost);
> }
>
It looks like you're missing $vhost->add_plugin($plugin) here...
(reformatted a little so that my email client wouldn't butcher it)
for( @domains ){
my $aim = DJabberd::Component::External->new(
listenport => 5270,
secret => 'some_secret',
);
$aim->finalize;
my $vhost = DJabberd::VHost->new( %vhost_args, server_name => $_,);
$vhost->add_plugin($plugin);
$vhost->register_subdomain("aim", $aim);
$server->add_vhost($vhost);
}
Some other points:
* I'd advise against using $_ like you are above, since
DJabberd::Component::External->new might clobber it. It doesn't right
now, and it definitely shouldn't, but you never know when someone will
introduce a $_-clobbering bug.
* You're using the deprecated register_subdomain support, which
might not actually even work anymore. (I vaugely remember Artur
partially breaking it somewhere along the line.)
Here's the new (sadly, more long-winded) way to create a "subdomain".
(Which is really just another vhost with local delivery configured.)
foreach my $base_name ( @domains ) {
my $vhost = DJabberd::VHost->new(%vhost_args,
server_name => $base_name,
);
my $aim = DJabberd::VHost->new(%vhost_args,
server_name => "aim.".$base_name,
);
my $local_delivery = DJabberd::Delivery::Local->new();
my $external_component = DJabberd::Component::External->new(
listenport => 5270,
secret => 'some_secret',
);
my $local_vhosts_1 = DJabberd::Delivery::LocalVHosts->new(
allowvhost => $base_name,
);
my $local_vhosts_2 = DJabberd::Delivery::LocalVHosts->new(
allowvhost => "aim.".$base_name,
);
$local_delivery->finalize();
$external_component->finalize();
$local_vhosts_1->finalize();
$local_vhosts_2->finalize();
# Add the Local delivery plugin to $vhost
$vhost->add_plugin($local_delivery);
# Add the external component to $aim
$aim->add_plugin($external_component);
# Connect the two domains with the LocalVHosts delivery plugin
$vhost->add_plugin($local_vhosts_2);
$aim->add_plugin($local_vhosts_1);
$server->add_vhost($vhost);
$server->add_vhost($aim);
}
(not tested, so you'll probably have to tweak a bit to get it working)
The above is roughly equivalent to:
<VHost example.com>
<Plugin DJabberd::Delivery::Local />
<Subdomain aim>
<Plugin DJabberd::Component::External>
ListenPort 5270
Secret some_secret
</Plugin>
</Subdomain>
</VHost>
It's probably also worth noting that as you've written this, with it
creating a new AIM component each time, only the first will actually
work because they'll all independently try to listen on the same port.
For it to work, you'll need to run each instance on a separate port and
connect one pyAIMt to each.
This isn't ideal, I realise; I've actually been working recently on
trying to get the POE framework to co-operate with Danga::Socket so that
the existing POE components for other IM protocols can potentially be
used to make in-process IM transports, but I've not got it working just
yet. I'm still trying to familiarize myself with how POE works.
More information about the Djabberd
mailing list