2015-04-21 13:32:14 +02:00
|
|
|
#!/bin/sh
|
2015-03-06 15:40:09 +01:00
|
|
|
|
|
|
|
# Add the current ejabberd node in a cluster
|
|
|
|
|
|
|
|
# copyright (c) 2010-2015 ProcessOne
|
|
|
|
|
|
|
|
# Return Code:
|
|
|
|
# 0 : groovy baby
|
2015-04-21 13:32:14 +02:00
|
|
|
# 10 : ejabberdctl not found
|
2015-03-06 15:40:09 +01:00
|
|
|
# 11 : erl not found
|
|
|
|
# 12 : erlc not found
|
2015-04-21 13:32:14 +02:00
|
|
|
# 20 : database dir can not be created
|
2015-03-06 15:40:09 +01:00
|
|
|
# 21 : database dir not writable
|
2015-04-21 13:32:14 +02:00
|
|
|
# 22 : temporary dir can not be created
|
2015-03-06 15:40:09 +01:00
|
|
|
# 30 : network issue
|
|
|
|
# 31 : node names incompatibility
|
|
|
|
|
|
|
|
function error
|
|
|
|
{
|
|
|
|
echo "Error: $1" >&2
|
|
|
|
exit $2
|
|
|
|
}
|
|
|
|
|
2015-04-23 10:14:08 +02:00
|
|
|
[ -z $NO_WARNINGS ] && {
|
|
|
|
echo "--------------------------------------------------------------------"
|
|
|
|
echo ""
|
|
|
|
echo "ejabberd cluster configuration"
|
|
|
|
echo ""
|
|
|
|
echo "This ejabberd node will be configured for use in an ejabberd cluster."
|
|
|
|
echo "IMPORTANT: all local data from the database will be lost, and"
|
|
|
|
echo "cluster database will be initialized. All data from the master"
|
|
|
|
echo "node will be replicated to this one."
|
|
|
|
echo ""
|
|
|
|
echo "--------------------------------------------------------------------"
|
|
|
|
echo "Press any key to continue, or Ctrl+C to stop now"
|
|
|
|
read foo
|
|
|
|
echo ""
|
|
|
|
}
|
2015-03-06 15:40:09 +01:00
|
|
|
|
|
|
|
[ $# -eq 0 ] && {
|
|
|
|
echo "Make sure you have a running remote master ejabberd node"
|
|
|
|
echo "Before continuing, you must copy the ~/.erlang.cookie file from"
|
|
|
|
echo "remote master node and check ejabberd.cfg compatibility."
|
|
|
|
echo "e.g. hosts definition must match on all nodes"
|
|
|
|
echo ""
|
|
|
|
echo "The remote master node name is defined as ERLANG_NODE into"
|
|
|
|
echo "ejabberdctl.cfg on that remote node."
|
|
|
|
echo ""
|
|
|
|
echo -n "Remote master node name: "
|
|
|
|
read REMOTE
|
|
|
|
echo ""
|
|
|
|
} || {
|
|
|
|
echo "Using passed parameter for remote master node name: $1"
|
|
|
|
REMOTE=$1
|
|
|
|
}
|
|
|
|
|
2015-04-21 13:32:14 +02:00
|
|
|
PA=/tmp/clustersetup_$$
|
|
|
|
CTL=$(which ejabberdctl)
|
|
|
|
[ "$CTL" == "" ] && {
|
|
|
|
HERE=`which "$0"`
|
|
|
|
BASE=`dirname $HERE`/..
|
|
|
|
ROOTDIR=`cd $BASE; pwd`
|
|
|
|
PATH=$ROOTDIR/bin:$PATH
|
|
|
|
PA=$ROOTDIR/clustersetup_$$
|
|
|
|
CTL=$(which ejabberdctl)
|
2015-03-06 15:40:09 +01:00
|
|
|
}
|
2015-04-21 13:32:14 +02:00
|
|
|
echo "Using commands:"
|
|
|
|
[ -x $CTL ] && echo $CTL || error "can't find ejabberdctl" 10
|
|
|
|
|
|
|
|
. $CTL stop 2>/dev/null >/dev/null
|
|
|
|
ERLC=${ERL}c
|
|
|
|
|
|
|
|
[ -x $ERL ] && echo $ERL || error "can't find erl" 11
|
|
|
|
[ -x $ERLC ] && echo $ERLC || error "can't find erlc" 12
|
|
|
|
echo ""
|
2015-03-06 15:40:09 +01:00
|
|
|
|
|
|
|
NAME=-name
|
|
|
|
[ "$ERLANG_NODE" = "${ERLANG_NODE%.*}" ] && NAME=-sname
|
|
|
|
CLUSTERSETUP=clustersetup
|
|
|
|
CLUSTERSETUP_ERL=$PA/$CLUSTERSETUP.erl
|
|
|
|
|
|
|
|
REMOTENAME=-name
|
|
|
|
[ "$REMOTE" = "${REMOTE%.*}" ] && REMOTENAME=-sname
|
|
|
|
[ "$REMOTENAME" = "$NAME" ] || {
|
|
|
|
echo "IMPORTANT!: node names are incompatible"
|
|
|
|
echo "Remote node name is $REMOTE"
|
|
|
|
echo "Local node name is $ERLANG_NODE"
|
|
|
|
echo ""
|
|
|
|
echo "Both node names must be short or fqdn names."
|
|
|
|
echo "Using short and fqdn names is impossible."
|
|
|
|
echo ""
|
|
|
|
error "incompatible node names" 31
|
|
|
|
}
|
|
|
|
|
|
|
|
set -o errexit
|
|
|
|
set -o nounset
|
|
|
|
|
2015-05-13 15:54:28 +02:00
|
|
|
[ -d $SPOOL_DIR ] && rm -Rf $SPOOL_DIR/* || mkdir -p $SPOOL_DIR || error "$SPOOL_DIR cannot be created" 20
|
2015-03-06 15:40:09 +01:00
|
|
|
[ -w $SPOOL_DIR ] || error "$SPOOL_DIR directory is not writable" 21
|
2015-04-21 13:32:14 +02:00
|
|
|
mkdir -p $PA || error "$PA cannot be created" 22
|
|
|
|
cd $PA
|
2015-03-06 15:40:09 +01:00
|
|
|
cat <<EOF > $CLUSTERSETUP_ERL
|
|
|
|
-module($CLUSTERSETUP).
|
|
|
|
|
|
|
|
-export([start/0]).
|
|
|
|
|
|
|
|
set_table_copy(Table, _Node, {badrpc, Reason}) ->
|
|
|
|
io:format("Error: cannot get storage type for table ~p on node $REMOTE:~n ~p~n",[Table, Reason]);
|
|
|
|
set_table_copy(Table, Node, Type) ->
|
|
|
|
io:format("setting table ~p to mode ~p~n",[Table, Type]),
|
|
|
|
case mnesia:add_table_copy(Table, Node, Type) of
|
|
|
|
{aborted, _} ->
|
|
|
|
mnesia:change_table_copy_type(Table, Node, Type);
|
|
|
|
_ ->
|
|
|
|
ok
|
|
|
|
end.
|
|
|
|
|
|
|
|
set_tables({badrpc, Reason}) ->
|
|
|
|
io:format("ERROR: cannot get tables list on $REMOTE : ~p~n",[Reason]);
|
|
|
|
set_tables([]) ->
|
|
|
|
ok;
|
|
|
|
set_tables([schema | Tables]) ->
|
|
|
|
set_tables(Tables);
|
|
|
|
set_tables([s2s | Tables]) ->
|
|
|
|
set_tables(Tables);
|
|
|
|
set_tables([session | Tables]) ->
|
|
|
|
set_tables(Tables);
|
|
|
|
set_tables([Table | Tables]) ->
|
|
|
|
set_table_copy(Table, node(),
|
|
|
|
rpc:call('$REMOTE', mnesia, table_info, [Table, storage_type])),
|
|
|
|
set_tables(Tables).
|
|
|
|
|
|
|
|
start() ->
|
|
|
|
io:format("~n",[]),
|
|
|
|
R = case net_adm:ping('$REMOTE') of
|
|
|
|
pong ->
|
|
|
|
set_table_copy(schema, node(), disc_copies),
|
|
|
|
set_tables(rpc:call('$REMOTE', mnesia, system_info, [tables])),
|
|
|
|
0;
|
|
|
|
pang ->
|
|
|
|
io:format("node ~p is not reachable, please check epmd port, and FIREWALL_WINDOW ports~n", ['$REMOTE']),
|
|
|
|
1
|
|
|
|
end,
|
|
|
|
halt(R).
|
|
|
|
EOF
|
2015-04-21 13:32:14 +02:00
|
|
|
|
|
|
|
$ERLC -o $PA $CLUSTERSETUP_ERL
|
|
|
|
sh -c "$ERL $NAME $ERLANG_NODE -pa $PA $KERNEL_OPTS -mnesia extra_db_nodes \"['$REMOTE']\" dir \"\\\"$SPOOL_DIR\\\"\" -s mnesia -s $CLUSTERSETUP start"
|
|
|
|
cd -
|
2015-03-06 15:40:09 +01:00
|
|
|
rm -Rf $PA
|
|
|
|
|
|
|
|
echo "End."
|
|
|
|
echo "Check that there is no error in the above messages."
|