Could someone take a look at this? I read through the code, and it seems
like my config files are messed up, in particular the opensrf_core.xml.
I am attaching these files so that someone more knowledgeable than I can
take a look at them.
Thanks,
-dale
Dale Arntson wrote:
Hi all,
I am trying to install opensrf 1.0.3 on Redhat 5. I followed the
procedures in the opensrf:1.0.3 install doc, with allowances for the
change of platform.
However, when I try to start opensrf, I get the following message:
/opt/openils/bin$ ./osrf_ctl.sh -l -a start_perl
Starting OpenSRF Perl
* ! EXCEPTION ! *
TYPE: OpenSRF::EX::Config
Mess: Config Exception
Mess: JPeer could not load all necesarry values from config
Loc.: 71 OpenSRF::Transport::SlimJabber::PeerConnection
Loc.: /opt/openils/lib/perl5/OpenSRF/Transport/SlimJabber/PeerConnection.pm
Time: Wed Feb 4 13:59:39 2009
Checking the code in PeerConnection.pm (line 71), I find $host is not
set in:
OpenSRF::EX::Config->throw( "JPeer could not load all necesarry values
from config" )
unless ( $username and $password and $resource and $host and $port );
Did I miss a config setting somewhere?
Thanks,
-dale
%%%
%%% ejabberd configuration file
%%%
%%% The parameters used in this configuration file are explained in more detail
%%% in the ejabberd Installation and Operation Guide.
%%% Please consult the Guide in case of doubts, it is included in
%%% your copy of ejabberd, and is also available online at
%%% http://www.process-one.net/en/ejabberd/docs/
%%% This configuration file contains Erlang terms.
%%% In case you want to understand the syntax, here are the concepts:
%%%
%%% - The character to comment a line is %
%%%
%%% - Each term ends in a dot, for example:
%%% override_global.
%%%
%%% - A tuple has a fixed definition, its elements are
%%% enclosed in {}, and separated with commas:
%%% {loglevel, 4}.
%%%
%%% - A list can have as many elements as you want,
%%% and is enclosed in [], for example:
%%% [http_poll, web_admin, tls]
%%%
%%% - A keyword of ejabberd is a word in lowercase.
%%% The strings are enclosed in "" and can have spaces, dots...
%%% {language, "en"}.
%%% {ldap_rootdn, "dc=example,dc=com"}.
%%%
%%% - This term includes a tuple, a keyword, a list and two strings:
%%% {hosts, ["jabber.example.net", "im.example.com"]}.
%%%
%%% =======================
%%% OVERRIDE STORED OPTIONS
%%
%% Override the old values stored in the database.
%%
%%
%% Override global options (shared by all ejabberd nodes in a cluster).
%%
%%override_global.
%%
%% Override local options (specific for this particular ejabberd node).
%%
%%override_local.
%%
%% Remove the Access Control Lists before new ones are added.
%%
%%override_acls.
%%% =========
%%% DEBUGGING
%%
%% loglevel: Verbosity of log files generated by ejabberd.
%% 0: No ejabberd log at all (not recommended)
%% 1: Critical
%% 2: Error
%% 3: Warning
%% 4: Info
%% 5: Debug
%%
{loglevel, 4}.
%%
%% watchdog_admins: If an ejabberd process consumes too much memory,
%% send live notifications to those Jabber accounts.
%%
%%{watchdog_admins, ["ad...@libopen"]}.
%%% ================
%%% SERVED HOSTNAMES
%%
%% hosts: Domains served by ejabberd.
%% You can define one or several, for example:
%% {hosts, ["example.net", "example.com", "example.org"]}.
%%
{hosts, ["localhost", "private.localhost", "public.localhost"]}.
%%
%% route_subdomains: Delegate subdomains to other Jabber server.
%% For example, if this ejabberd serves example.org and you want
%% to allow communication with a Jabber server called im.example.org.
%%
%%{route_subdomains, s2s}.
%%% ===============
%%% LISTENING PORTS
%%
%% listen: Which ports will ejabberd listen, which service handles it
%% and what options to start it with.
%%
{listen,
[
{5222, ejabberd_c2s, [
{certfile, "/opt/ejabberd-2.0.1/conf/server.pem"},
starttls,
{access, c2s},
{shaper, c2s_shaper},
{max_stanza_size, 2000000}
]},
%%
%% To enable the old SSL connection method in port 5223:
%%
%%{5223, ejabberd_c2s, [
%% {certfile, "/opt/ejabberd-2.0.1/conf/server.pem"}, tls,
%% {access, c2s},
%% {shaper, c2s_shaper},
%% {max_stanza_size, 2000000}
%% ]},
{5269, ejabberd_s2s_in, [
{shaper, s2s_shaper},
{max_stanza_size, 2000000}
]},
%%
%% ejabberd_service: Interact with external components (transports...)
%%
%%{8888, ejabberd_service, [
%% {access, all},
%% {shaper_rule, fast},
%% {ip, {127, 0, 0, 1}},
%% {hosts, ["icq.example.org", "sms.example.org"],
%% [{password, "secret"}]
%% }
%% ]},
{5280, ejabberd_http, [
http_bind,
http_poll,
web_admin
]}
]}.
%%
%% s2s_use_starttls: Enable STARTTLS + Dialback for S2S connections.
%% Allowed values are: true or false.
%% You must specify a certificate file.
%%
%%{s2s_use_starttls, true}.
%%
%% s2s_certfile: Specify a certificate file.
%%
%%{s2s_certfile, "/opt/ejabberd-2.0.1/conf/server.pem"}.
%%
%% domain_certfile: Specify a different certificate for each served hostname.
%%
%%{domain_certfile, "example.org", "/opt/ejabberd-2.0.1/conf/example_org.pem"}.
%%{domain_certfile, "example.com", "/opt/ejabberd-2.0.1/conf/example_com.pem"}.
%%
%% S2S whitelist or blacklist
%%
%% Default s2s policy for undefined hosts.
%%
%%{s2s_default_policy, allow}.
%%
%% Allow or deny communication with specific servers.
%%
%%{{s2s_host, "goodhost.org"}, allow}.
%%{{s2s_host, "badhost.org"}, deny}.
%%% ==============
%%% AUTHENTICATION
%%
%% auth_method: Method used to authenticate the users.
%% The default method is the internal.
%% If you want to use a different method,
%% comment this line and enable the correct ones.
%%
{auth_method, internal}.
%%
%% Authentication using external script
%% Make sure the script is executable by ejabberd.
%%
%%{auth_method, external}.
%%{extauth_program, "/path/to/authentication/script"}.
%%
%% Authentication using ODBC
%% Remember to setup a database in the next section.
%%
%%{auth_method, odbc}.
%%
%% Authentication using PAM
%%
%%{auth_method, pam}.
%%{pam_service, "pamservicename"}.
%%
%% Authentication using LDAP
%%
%%{auth_method, ldap}.
%%
%% List of LDAP servers:
%%{ldap_servers, ["libopen"]}.
%%
%% LDAP attribute that holds user ID:
%%{ldap_uids, [{"mail", "%[email protected]"}]}.
%%
%% Search base of LDAP directory:
%%{ldap_base, "dc=example,dc=com"}.
%%
%% LDAP manager:
%%{ldap_rootdn, "dc=example,dc=com"}.
%%
%% Password to LDAP manager:
%%{ldap_password, "******"}.
%%
%% Anonymous login support:
%% auth_method: anonymous
%% anonymous_protocol: sasl_anon | login_anon | both
%% allow_multiple_connections: true | false
%%
%%{host_config, "public.example.org", [{auth_method, anonymous},
%% {allow_multiple_connections, false},
%% {anonymous_protocol, sasl_anon}]}.
%%
%% To use both anonymous and internal authentication:
%%
%%{host_config, "public.example.org", [{auth_method, [internal, anonymous]}]}.
%%% ==============
%%% DATABASE SETUP
%% ejabberd uses by default the internal Mnesia database,
%% so you can avoid this section.
%% This section provides configuration examples in case
%% you want to use other database backends.
%% Please consult the ejabberd Guide for details about database creation.
%%
%% MySQL server:
%%
%%{odbc_server, {mysql, "server", "database", "username", "password"}}.
%%
%% If you want to specify the port:
%%{odbc_server, {mysql, "server", 1234, "database", "username", "password"}}.
%%
%% PostgreSQL server:
%%
%%{odbc_server, {pgsql, "server", "database", "username", "password"}}.
%%
%% If you want to specify the port:
%%{odbc_server, {pgsql, "server", 1234, "database", "username", "password"}}.
%%
%% If you use PostgreSQL, have a large database, and need a
%% faster but inexact replacement for "select count(*) from users"
%%
%%{pgsql_users_number_estimate, true}.
%%
%% ODBC compatible or MSSQL server:
%%
%%{odbc_server, "DSN=ejabberd;UID=ejabberd;PWD=ejabberd"}.
%%% ===============
%%% TRAFFIC SHAPERS
%%
%% The "normal" shaper limits traffic speed to 1.000 B/s
%%
{shaper, normal, {maxrate, 500000}}.
%%
%% The "fast" shaper limits traffic speed to 50.000 B/s
%%
{shaper, fast, {maxrate, 500000}}.
%%% ====================
%%% ACCESS CONTROL LISTS
%%
%% The 'admin' ACL grants administrative privileges to Jabber accounts.
%% You can put as many accounts as you want.
%%
{acl, admin, {user, "opensrf"}}.
{acl, admin, {user, "router"}}.
%%
%% Blocked users
%%
%%{acl, blocked, {user, "baduser", "example.org"}}.
%%{acl, blocked, {user, "test"}}.
%%
%% Local users: don't modify this line.
%%
{acl, local, {user_regexp, ""}}.
%%
%% More examples of ACLs
%%
%%{acl, jabberorg, {server, "jabber.org"}}.
%%{acl, aleksey, {user, "aleksey", "jabber.ru"}}.
%%{acl, test, {user_regexp, "^test"}}.
%%{acl, test, {user_glob, "test*"}}.
%%% ============
%%% ACCESS RULES
%% Define the maximum number of time a single user is allowed to connect:
{access, max_user_sessions, [{1000, all}]}.
%% This rule allows access only for local users:
{access, local, [{allow, local}]}.
%% Only non-blocked users can use c2s connections:
{access, c2s, [{deny, blocked},
{allow, all}]}.
%% For all users except admins used "normal" shaper
{access, c2s_shaper, [{none, admin},
{normal, all}]}.
%% For all S2S connections used "fast" shaper
{access, s2s_shaper, [{fast, all}]}.
%% Only admins can send announcement messages:
{access, announce, [{allow, admin}]}.
%% Only admins can use configuration interface:
{access, configure, [{allow, admin}]}.
%% Admins of this server are also admins of MUC service:
{access, muc_admin, [{allow, admin}]}.
%% All users are allowed to use MUC service:
{access, muc, [{allow, all}]}.
%% Every username can be registered via in-band registration:
%% To disable in-band registration, replace 'allow' with 'deny'.
{access, register, [{allow, all}]}.
%% Everybody can create pubsub nodes
{access, pubsub_createnode, [{allow, all}]}.
%%% ================
%%% DEFAULT LANGUAGE
%%
%% language: Default language used for server messages.
%%
{language, "en"}.
%%% =======
%%% MODULES
%%
%% Modules enabled in all ejabberd virtual hosts.
%%
{modules,
[
{mod_adhoc, []},
{mod_announce, [{access, announce}]}, % requires mod_adhoc
{mod_caps, []},
{mod_configure,[]}, % requires mod_adhoc
{mod_disco, []},
%%{mod_echo, [{host, "echo.libopen"}]},
{mod_http_bind,[]},
%%{mod_http_fileserver, [{docroot, "/opt/ejabberd-2.0.1/www"}]},
{mod_irc, []},
{mod_last, []},
{mod_muc, [
%%{host, "conferen...@host@"},
{access, muc},
{access_create, muc},
{access_persistent, muc},
{access_admin, muc_admin}
]},
%%{mod_muc_log,[]},
{mod_offline, []},
{mod_privacy, []},
{mod_private, []},
%%{mod_proxy65,[]},
{mod_pubsub, [ % requires mod_caps
{access_createnode, pubsub_createnode},
{plugins, ["default", "pep"]}
]},
{mod_register, [
%%
%% After successful registration, the user receives
%% a message with this subject and body.
%%
{welcome_message, {"Welcome!",
"Welcome to this Jabber server."}},
%%
%% When a user registers, send a notification to
%% these Jabber accounts.
%%
%%{registration_watchers, ["[email protected]"]},
{access, register}
]},
{mod_roster, []},
%%{mod_service_log,[]},
{mod_shared_roster,[]},
%%{mod_stats, []},
{mod_time, []},
{mod_vcard, []},
{mod_version, []}
]}.
%%% $Id: ejabberd.cfg.example 1073 2007-12-17 11:03:22Z badlop $
%%% Local Variables:
%%% mode: erlang
%%% End:
%%% vim: set filetype=erlang tabstop=8:
#
# In this file you can configure options that are passed by ejabberdctl
# to the erlang runtime system when starting ejabberd
#
# POLL: Kernel polling ([true|false])
#
# The kernel polling option requires support in the kernel.
# Additionaly, you need to enable this feature while compiling Erlang.
#
# Default: true
#
POLL=true
# SMP: SMP support ([enable|auto|disable])
#
# Explanation in Erlang/OTP documentation:
# enable: starts the Erlang runtime system with SMP support enabled.
# This may fail if no runtime system with SMP support is available.
# auto: starts the Erlang runtime system with SMP support enabled if it
# is available and more than one logical processor are detected.
# disable: starts a runtime system without SMP support.
#
# Default: auto
#
SMP=auto
# ERL_MAX_PORTS: Maximum number of simultaneously open Erlang ports
#
# ejabberd consumes two or three ports for every connection, either
# from a client or from another Jabber server. So take this into
# account when setting this limit.
#
# Default: 32000
# Maximum: 268435456
#
ERL_MAX_PORTS=32000
# FIREWALL_WINDOW: Range of allowed ports to pass through a firewall
#
# If Ejabberd is configured to run in cluster, and a firewall is blocking ports,
# it's possible to make Erlang use a defined range of port (instead of dynamic
ports)
# for node communication.
#
# Default: not defined
# Example: 4200-4210
#
#FIREWALL_WINDOW=
# PROCESSES: Maximum number of Erlang processes
#
# Erlang consumes a lot of lightweight processes. If there is a lot of activity
# on ejabberd so that the maximum number of proccesses is reached, people will
# experiment greater latency times. As these processes are implemented in
# Erlang, and therefore not related to the operating system processes, you do
# not have to worry about allowing a huge number of them.
#
# Default: 250000
# Maximum: 268435456
#
ERL_PROCESSES=250000
# ERL_MAX_ETS_TABLES: Maximum number of ETS and Mnesia tables
#
# The number of concurrent ETS and Mnesia tables is limited. When the limit is
# reached, errors will appear in the logs:
# ** Too many db tables **
# You can safely increase this limit when starting ejabberd. It impacts memory
# consumption but the difference will be quite small.
#
# Default: 1400
#
ERL_MAX_ETS_TABLES=1400
# The next variable allows to explicitly specify erlang node for ejabberd
# It can be given in different formats:
# ERLANG_NODE=ejabberd
# Lets erlang add hostname to the node (ejabberd uses short name in this case)
# erlang_node=ejabb...@hostname
# Erlang uses node name as is (so make sure that hostname is a real
# machine hostname or you'll not be able to control ejabberd)
# [email protected]
# The same as previous, but erlang will use long hostname
# (see erl (1) manual for details)
#
erlang_node=ejabb...@localhost
<?xml version="1.0"?>
<!--
vim:et:ts=2:sw=2:
-->
<opensrf version="0.0.3">
<!--
There is one <host> entry for each server on the network. Settings for the
'default' host are used for every setting that isn't overridden within a given
host's config.
To specify which applications a host is serving, list those applications
within that host's config section. If the defaults are acceptible, then
that's all that needs to be added/changed.
Any valid XML may be added to the <default> block and server components will have
acces to it.
-->
<default>
<dirs>
<!-- opensrf log files go in this directory -->
<log>/opt/openils/var/log</log>
<!-- opensrf unix domaind socket files go here -->
<sock>/opt/openils/var/lock</sock>
<!-- opensrf pids go here -->
<pid>/opt/openils/var/run</pid>
<!-- global config directory -->
<conf>/opt/openils/conf</conf>
</dirs>
<!-- prefork, simple. prefork is suggested -->
<server_type>prefork</server_type>
<!-- Default doesn't host any apps -->
<activeapps/>
<cache>
<global>
<servers>
<!-- memcached server ip:port -->
<server>127.0.0.1:11211</server>
</servers>
<!-- maximum time that anything may stay in the cache -->
<max_cache_time>86400</max_cache_time>
</global>
</cache>
<!--
These are the defaults for every served app. Each server should
duplicate the node layout for any nodes that need changing.
Any settings that are overridden in the server specific section
will be used as the config values for that server. Any settings that are
not overridden will fall back on the defaults
Note that overriding 'stateless' will break things
-->
<apps>
<opensrf.persist>
<!--
How many seconds to wait between server
requests before timing out a stateful server session.
-->
<keepalive>1</keepalive>
<!--
if 1, then we support stateless sessions (no connect required),
if 0 then we don't
-->
<stateless>1</stateless>
<!--
Tells the servers which language this implementation is coded in
In this case non "perl" servers will not be able to load the module
-->
<language>perl</language>
<!-- Module the implements this application -->
<implementation>OpenSRF::Application::Persist</implementation>
<!-- max stateful requests before a session automatically disconnects a client -->
<max_requests>97</max_requests>
<!-- settings for the backend application drones. These are probably sane defaults -->
<unix_config>
<!-- unix socket file -->
<unix_sock>opensrf.persist_unix.sock</unix_sock>
<!-- pid file -->
<unix_pid>opensrf.persist_unix.pid</unix_pid>
<!-- max requests per process backend before a child is recycled -->
<max_requests>1000</max_requests>
<!-- log file for this application -->
<unix_log>opensrf.persist_unix.log</unix_log>
<!-- Number of children to pre-fork -->
<min_children>5</min_children>
<!-- maximun number of children to fork -->
<max_children>25</max_children>
<!-- minimun number of spare forked children -->
<min_spare_children>2</min_spare_children>
<!-- max number of spare forked children -->
<max_spare_children>5</max_spare_children>
</unix_config>
<!-- Any additional setting for a particular application go in the app_settings node -->
<app_settings>
<!-- sqlite database file -->
<dbfile>/opt/openils/conf/persist.db</dbfile>
</app_settings>
</opensrf.persist>
<opensrf.math>
<keepalive>3</keepalive>
<stateless>1</stateless>
<language>c</language>
<implementation>osrf_math.so</implementation>
<max_requests>97</max_requests>
<unix_config>
<unix_sock>opensrf.math_unix.sock</unix_sock>
<unix_pid>opensrf.math_unix.pid</unix_pid>
<max_requests>1000</max_requests>
<unix_log>opensrf.math_unix.log</unix_log>
<min_children>5</min_children>
<max_children>15</max_children>
<min_spare_children>2</min_spare_children>
<max_spare_children>5</max_spare_children>
</unix_config>
</opensrf.math>
<opensrf.dbmath>
<keepalive>3</keepalive>
<stateless>1</stateless>
<language>c</language>
<implementation>osrf_dbmath.so</implementation>
<max_requests>99</max_requests>
<unix_config>
<max_requests>1000</max_requests>
<unix_log>opensrf.dbmath_unix.log</unix_log>
<unix_sock>opensrf.dbmath_unix.sock</unix_sock>
<unix_pid>opensrf.dbmath_unix.pid</unix_pid>
<min_children>5</min_children>
<max_children>15</max_children>
<min_spare_children>2</min_spare_children>
<max_spare_children>5</max_spare_children>
</unix_config>
</opensrf.dbmath>
<opensrf.settings>
<keepalive>1</keepalive>
<stateless>1</stateless>
<language>perl</language>
<implementation>OpenSRF::Application::Settings</implementation>
<max_requests>17</max_requests>
<unix_config>
<unix_sock>opensrf.settings_unix.sock</unix_sock>
<unix_pid>opensrf.settings_unix.pid</unix_pid>
<max_requests>1000</max_requests>
<unix_log>opensrf.settings_unix.log</unix_log>
<min_children>5</min_children>
<max_children>15</max_children>
<min_spare_children>3</min_spare_children>
<max_spare_children>5</max_spare_children>
</unix_config>
</opensrf.settings>
</apps>
</default>
<hosts>
<localhost>
<!-- ^-=-
Should match the fully qualified domain name of the host.
On Linux, the output of the following command is authoritative:
$ perl -MNet::Domain -e 'print Net::Domain::hostfqdn();'
To use 'localhost' instead, run osrf_ctl.sh with the -l flag
-->
<!-- List all of the apps this server will be running -->
<activeapps>
<appname>opensrf.persist</appname>
<appname>opensrf.settings</appname>
<appname>opensrf.math</appname>
<appname>opensrf.dbmath</appname>
</activeapps>
<apps>
<!-- Example of an app-specific setting override -->
<opensrf.persist>
<app_settings>
<dbfile>/different/path/to/dbfile/persist.db</dbfile>
</app_settings>
</opensrf.persist>
</apps>
</localhost>
</hosts>
</opensrf>
<?xml version="1.0"?>
<!--
vim:et:ts=2:sw=2:
-->
<config>
<!-- bootstrap config for OpenSRF apps -->
<opensrf>
<routers>
<!-- define the list of routers our services will register with -->
<router>
<!-- This is the public router. On this router, we only register applications
which should be accessible to everyone on the opensrf network -->
<name>router</name>
<domain>public.localhost</domain>
<services>
<service>opensrf.math</service>
</services>
</router>
<router>
<!-- This is the private router. All applications must register with
this router, so no explicit <services> section is required -->
<name>router</name>
<domain>private.localhost</domain>
</router>
</routers>
<!-- Jabber login settings
Our domain should match that of the private router -->
<domain>private.localhost</domain>
<username>opensrf</username>
<passwd>dummy</passwd>
<port>5222</port>
<!-- name of the router used on our private domain.
this should match one of the <name> of the private router above -->
<router_name>router</router_name>
<!-- log file settings ====================================== -->
<!-- log to a local file -->
<logfile>/opt/openils/var/log/osrfsys.log</logfile>
<!-- Log to syslog. You can use this same layout for
defining the logging of all services in this file -->
<!--
<logfile>syslog</logfile>
<syslog>local2</syslog>
<actlog>local1</actlog>
-->
<!-- 0 None, 1 Error, 2 Warning, 3 Info, 4 debug, 5 Internal (Nasty) -->
<loglevel>5</loglevel>
<!-- config file for the services -->
<settings_config>/opt/openils/conf/opensrf.xml</settings_config>
</opensrf>
<!-- Update this if you use ChopChop -->
<chopchop>
<!-- Our jabber server -->
<domain>private.localhost</domain>
<port>5222</port>
<!-- used when multiple servers need to communicate -->
<s2sport>5269</s2sport>
<secret>secret</secret>
<listen_address>10.0.0.3</listen_address>
<loglevel>5</loglevel>
<logfile>/opt/openils/var/log/osrfsys.log</logfile>
</chopchop>
<!-- The section between <gateway>...</gateway> is a standard OpenSRF C stack config file -->
<gateway>
<!--
we consider ourselves to be the "originating" client for requests,
which means we define the log XID string for log traces
-->
<client>true</client>
<!-- the routers's name on the network -->
<router_name>router</router_name>
<!--
These are the services that the gateway will serve.
Any other requests will receive an HTTP_NOT_FOUND (404)
DO NOT put any services here that you don't want the internet to have access to
This section will be soon deprecated for multi-domain mode...
-->
<services>
<service>opensrf.math</service>
</services>
<!-- jabber login info -->
<!-- The gateway connects to the public domain -->
<domain>public.localhost</domain>
<username>opensrf</username>
<passwd>dummy</passwd>
<port>5222</port>
<logfile>/opt/openils/var/log/gateway.log</logfile>
<loglevel>5</loglevel>
</gateway>
<!-- ======================================================================================== -->
<routers>
<router> <!-- public router -->
<trusted_domains>
<!-- allow private services to register with this router
and public clients to send requests to this router. -->
<server>private.localhost</server>
<!-- also allow private clients to send to the router so it can receive error messages -->
<client>private.localhost</client>
<client>public.localhost</client>
</trusted_domains>
<transport>
<server>public.localhost</server>
<port>5222</port>
<unixpath>/opt/openils/var/sock/unix_sock</unixpath>
<username>router</username>
<password>dummy</password>
<resource>router</resource>
<connect_timeout>10</connect_timeout>
<max_reconnect_attempts>5</max_reconnect_attempts>
</transport>
<logfile>/opt/openils/var/log/router.log</logfile>
<!--
<logfile>syslog</logfile>
<syslog>local2</syslog>
-->
<loglevel>5</loglevel>
</router>
<router> <!-- private router -->
<trusted_domains>
<server>private.localhost</server>
<!-- only clients on the private domain can send requests to this router -->
<client>private.localhost</client>
</trusted_domains>
<transport>
<server>private.localhost</server>
<port>5222</port>
<username>router</username>
<password>dummy</password>
<resource>router</resource>
<connect_timeout>10</connect_timeout>
<max_reconnect_attempts>5</max_reconnect_attempts>
</transport>
<logfile>/opt/openils/var/log/router.log</logfile>
<!--
<logfile>syslog</logfile>
<syslog>local2</syslog>
-->
<loglevel>5</loglevel>
</router>
</routers>
<!-- ======================================================================================== -->
</config>