Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 27 Jun 2011 21:48:00 GMT
From:      Maxim Ignatenko <gelraen.ua@gmail.com>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   ports/158357: Strange behaviour of epmd launched with ejabberd
Message-ID:  <201106272148.p5RLm0tQ042306@red.freebsd.org>
Resent-Message-ID: <201106272150.p5RLo9hS065211@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         158357
>Category:       ports
>Synopsis:       Strange behaviour of epmd launched with ejabberd
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Mon Jun 27 21:50:09 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator:     Maxim Ignatenko
>Release:        FreeBSD 7.3-STABLE
>Organization:
>Environment:
>Description:
After upgrading ejabberd from 2.1.3 to 2.1.8 `ejabberdctl` suddenly refused to work, saying "nodedown", while ejabberd itself started and works as usual. With Holger at ejabberd@conference.jabber.ru we've tracked down roots of the problem:
  1) FreeBSD's /bin/sh initializes exported variable with empty value if it was not previously set:
     $ printenv | grep FOO
     $ export FOO
     $ printenv | grep FOO
     _=FOO
     FOO=
  2) `ejabberdctl` script exports unset variable ERL_EPMD_ADDRESS
  3) `epmd` treats ERL_EPMD_ADDRESS='' as ERL_EPMD_ADDRESS='127.0.0.1' and listens only on localhost
  4) `erl` called by `ejabberdctl` firts gets local hostname, tries to resolve it via gethostbyname and connects to `epmd` on that IP. But if you don't have local hostname as alias in /etc/hosts or /usr/local/etc/ejabberd/inetrc it will fail, since DNS record usually does not point to 127.0.0.1.


>How-To-Repeat:
Install ejabberd, set "ejabberd_nodename" to "ejabberd@$(hostname -s)", start ejabberd and execute "ejabberdctl --node ejabberd@(hostname -s) status"
>Fix:
Possible patch (not tested) for rc-script attached. Running epmd `only` on 127.0.0.1 is good for security, but clustering requires `epmd` to listen on address accessible from other nodes. Also, pkg-message should mention that `ejabberdctl` will not work with nodename other than "ejabberd@localhost", if Erlang does not resolve local machine's short hostname to address on which `epmd` is able to accept connections. In case of single node most preferred way to achieve this is to leave `epmd` listening on 127.0.0.1 and add $(hostname -s) as alias for 127.0.0.1 in /usr/local/etc/ejabberd/inetrc

Patch attached with submission follows:

--- ejabberd.in.orig	2011-06-28 00:37:21.636314615 +0300
+++ ejabberd.in	2011-06-28 00:39:23.156814051 +0300
@@ -15,6 +15,7 @@
 #
 ejabberd_enable=${ejabberd_enable-"NO"}
 ejabberd_node=${ejabberd_node-"ejabberd@localhost"}
+ejabberd_epmd_address=${ejabberd_epmd_address-"127.0.0.1"}
 
 . /etc/rc.subr
 
@@ -50,7 +51,7 @@
 ejabberd_start()
 {
     echo "Starting $name."
-    su $EJABBERDUSER -c "$EJABBERDCTL --node $ejabberd_node start"
+    su $EJABBERDUSER -c "env ERL_EPMD_ADDRESS=\"${ejabberd_epmd_address}\" $EJABBERDCTL --node $ejabberd_node start"
 }
 
 ejabberd_stop()


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201106272148.p5RLm0tQ042306>