aboutsummaryrefslogtreecommitdiff
path: root/tools/leavecluster
diff options
context:
space:
mode:
Diffstat (limited to 'tools/leavecluster')
-rwxr-xr-xtools/leavecluster97
1 files changed, 97 insertions, 0 deletions
diff --git a/tools/leavecluster b/tools/leavecluster
new file mode 100755
index 000000000..ec21621bc
--- /dev/null
+++ b/tools/leavecluster
@@ -0,0 +1,97 @@
+#!/bin/bash
+
+# Remove the current ejabberd node in a cluster
+
+# copyright (c) 2010-2015 ProcessOne
+#
+# This script is proprietary software and cannot be published or redistribute.
+
+# Return Code:
+# 0 : groovy baby
+# 11 : erl not found
+# 12 : erlc not found
+# 20 : database dir doesn't exist
+# 21 : database dir not writable
+# 21 : database dir variable not set
+
+function error
+{
+ echo "Error: $1" >&2
+ exit $2
+}
+
+echo "--------------------------------------------------------------------"
+echo ""
+echo "ejabberd cluster configuration"
+echo ""
+echo "This ejabberd node will be removed from the cluster."
+echo "IMPORTANT: this node will be stopped. At least one other clustered"
+echo "node must be running."
+echo ""
+echo "--------------------------------------------------------------------"
+echo "Press any key to continue, or Ctrl+C to stop now"
+read foo
+echo ""
+
+HERE=`which "$0"`
+BASE=`dirname $HERE`/..
+ROOTDIR=`cd $BASE; pwd`
+. $ROOTDIR/bin/ejabberdctl stop 2>/dev/null >/dev/null
+$ROOTDIR/bin/ejabberdctl stopped
+PA=/tmp/clustersetup_$$
+CLUSTERSETUP=clustersetup
+CLUSTERSETUP_ERL=$PA/$CLUSTERSETUP.erl
+
+set -o errexit
+set -o nounset
+
+echo "Using commands:"
+which erl || error "can't find erl" 11
+which erlc || error "can't find erlc" 12
+echo ""
+
+cd $ROOTDIR
+mkdir -p $PA
+cat <<EOF > $CLUSTERSETUP_ERL
+-module($CLUSTERSETUP).
+
+-export([start/0]).
+
+del_table_copy(Table, Node) ->
+ case mnesia:del_table_copy(Table, Node) of
+ {aborted, Reason} -> io:format("Error: can not remove ~p table: ~p~n", [Table, Reason]);
+ _ -> io:format("table ~p removed from cluster~n", [Table])
+ end.
+
+del_tables([],_) ->
+ ok;
+del_tables([schema | Tables], Node) ->
+ del_tables(Tables, Node);
+del_tables([Table | Tables], Node) ->
+ del_table_copy(Table, Node),
+ del_tables(Tables, Node).
+
+start() ->
+ io:format("~n",[]),
+ Removed = node(),
+ case mnesia:system_info(running_db_nodes)--[Removed] of
+ [] -> io:format("Error: no other node running in the cluster~n");
+ Nodes ->
+ del_tables(mnesia:system_info(local_tables), Removed),
+ mnesia:stop(),
+ case rpc:call(hd(Nodes), mnesia, del_table_copy, [schema, Removed]) of
+ {badrpc,Reason} -> io:format("Error: can not unregister node ~p from cluster: ~p~n", [Removed, Reason]);
+ {aborted,Reason} -> io:format("Error: can not unregister node ~p from cluster: ~p~n", [Removed, Reason]);
+ {atomic, ok} ->
+ mnesia:delete_schema([Removed]),
+ io:format("node ~p removed from cluster~n", [Removed])
+ end
+ end,
+ halt(0).
+EOF
+erlc -o $PA $CLUSTERSETUP_ERL
+sh -c "erl $NAME $ERLANG_NODE -pa $PA $KERNEL_OPTS -mnesia dir "\"$SPOOL_DIR\"" -s mnesia -s $CLUSTERSETUP start"
+rm -Rf $PA
+
+echo "End."
+echo "Check that there is no error in the above messages."