Guillermo Roditi wrote:
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>
Yeah. the config stuff is nice, but unfortunately I went the other
route since my config would have to be updated a whole lot otherwise.
I just pull all my vhost info from the database now since it's
easier.
If nothing else, your question has reminded me that there should
probably be a nicer way to do the above with the API. I guess the most
obvious parallel to the configuration file would be
$vhost->create_subdomain($aim) which does the necessary configuration
and returns a DJabberd::VHost. Should probably get rid of the remants of
the old and broken "subdomain" support as well, since it's confusing.
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.
Right, I get it. Hmmm that sucks. Too bad I can't have all the vhosts
share a single component like I do with RosterStorage, Delivery, and
Authen, or can I? I have no objection to some gritty devel work if
necessary. I don't really want to run 200 connections to PyAIMt (i
have about 220 or so VHosts with a few users each, all very low
traffic)
Even in the RosterStorage and Delivery cases you usually have one
instance per vhost, though I guess with some of them you can probably
get away with sharing because their ->register() methods just register
hooks (with closures) and don't store anything in $self. That's not
really by design, though.
Component::External could potentially be a bit more clever about how it
manages its sockets, and not have such a strong connection between one
listen socket and a particular VHost. It'd just have to maintain some
global (rather than per-instance) state and then dispatch to the right
instance based on the hostname given in the stream element once the
component connects. I wasn't actually aware that pyAIMt was able to
serve multiple domains with a single running instance, though. Can this
be done, or would you have to run 200 instances of PyAIMt anyway?
(I must admit I don't know much about PyAIMt; I run it on my personal,
low-traffic DJabberd instance, but I've not really looked at it in any
great detail.)
If you use IRC I can often be found in #POE (irc.perl.org) as groditi,
so feel free to hit me up if you'd like to discuss the POE thing. I
would love to see DJabberD play nicely alongside POE. I never was able
to figure out how to integrate my own events and event handlers etc.
into Danga::Socket so I never got to use a lot of the Danga code I
wanted to try out.
I haven't been looking at it for a few days since I've been a little
unwell, but hopefully I should be able to get back into it soon. I'll
bear this in mind if I get stuck. Thanks!