Skip to content

Instantly share code, notes, and snippets.

Created March 21, 2010 21:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/339587 to your computer and use it in GitHub Desktop.
Save anonymous/339587 to your computer and use it in GitHub Desktop.
#!/bin/bash
################################################################################
# facts: (refine me)
#
NODES=('freyr' 'odin' 'thor');
export DOMAIN=$(dnsdomainname)
export BASEDN="dc=$(echo ${DOMAIN} | sed -e 's/\./,dc=/g')"
export ADMIN0="user, \"whitejs\", \"${DOMAIN}\""
export ADMIN1="user, \"stahnma\", \"${DOMAIN}\""
export XMPP_DOMAINS="\"${DOMAIN}\",\"example.org\""
export LDAP_SERVERS="\"localhost\",\"freyr.${DOMAIN}\",\"thor.${DOMAIN}\",\"odin.${DOMAIN}\""
export ROOTDN="cn=$(hostname -s),ou=Hosts,${BASEDN}"
export SECRET=$(secret)
spinner(){
PROC=$1
while [ -d /proc/$PROC ];do
echo -ne '/\x08' ; sleep 0.05
echo -ne '-\x08' ; sleep 0.05
echo -ne '\\\x08' ; sleep 0.05
echo -ne '|\x08' ; sleep 0.05
done
return 0
}
sleep 300 &
spinner $!
################################################################################
#for idx in `seq 0 $(expr ${#NODES[@]} - 1)`;do
# echo "$idx ${NODES[${idx}]}"
#done
################################################################################
# completely remove and re-install
#
echo -n "Removing (Purging) ejabberd and erlang: "
#
apt-get remove -y --purge erlang-base erlang-nox ejabberd libsctp1 lksctp-tools > /dev/null 2>&1 &
spinner $!
rm -fr /etc/ejabberd
echo ' OK'
echo -n "(Re)Installing ejabberd and erlang: "
apt-get install -y ejabberd >/dev/null 2>&1 &
spinner $!
echo ' OK'
echo -n "Checking the Install: "
(
EXIT=1; COUNT=0;
while [ ${EXIT} -ne 0 -a ${COUNT} -lt 10 ]; do
STATUS=$(su - ejabberd ejabberdctl status)
echo ${STATUS} | grep "ejabberd is running"
EXIT=$?
COUNT=$(expr ${COUNT} + 1)
sleep 1;
done
if [ ${EXIT} -ne 0 ]; then
exit ${EXIT}
else
exit 0
fi
) >/dev/null 2>&1
EXIT=$?
if [ ${EXIT} -ne 0 ]; then
echo " Failed."
exit 1;
else
echo ' OK'
fi
echo -n "Stopping ejabberd and erlang:"
/etc/init.d/ejabberd stop >/dev/null 2>&1
echo " OK"
echo -n "Killing stray erlang processes that shouldn't be there: "
for proc in $(ps -ef |grep b[e]am| grep er[l]ang|awk '{print $2}');do kill -9 ${proc}; done
echo " OK"
################################################################################
# Get our .erlang.cookie
#
if [ "$(hostname -s)" != "${NODES[0]}" ];then
echo -n "Get our .erlang.cookie from the ${NODES[0]}.${DOMAIN}: "
scp -rp root@${NODES[0]}.${DOMAIN}:/var/lib/ejabberd/.erlang.cookie /var/lib/ejabberd/.erlang.cookie >/dev/null 2>&1
EXIT=$?
chown ejabberd:ejabberd /var/lib/ejabberd/.erlang.cookie
spinner $!
if [ ${EXIT} -eq 0 ];then
echo "OK"
else
echo "FAILED"
exit 1;
fi
fi
################################################################################
# wipe out the database that was created on install and re-initialize with
# ejabberd@f.q.d.n, and LDAP authenticated
#
echo -n "Wipe out the database that was created on install"
rm /var/lib/ejabberd/*
#cd /var/lib/ejabberd/
echo " OK"
echo -n "Re-initialize with ejabberd@$(hostname -f) (rewriting config files):"
if [ ! -f /etc/ejabberd/ejabberd.cfg.dist ]; then cp /etc/ejabberd/ejabberd.cfg /etc/ejabberd/ejabberd.cfg.dist; fi
cat<<EOF >/etc/ejabberd/ejabberd.cfg
{acl, admin, {${ADMIN0}}}.
{acl, admin, {${ADMIN1}}}.
{hosts, [${XMPP_DOMAINS}]}.
{loglevel, 4}.
{listen,
[
{5222, ejabberd_c2s, [
{access, c2s},
{shaper, c2s_shaper},
{max_stanza_size, 65536},
starttls, {certfile, "/etc/ejabberd/ejabberd.pem"}
]},
{5269, ejabberd_s2s_in, [
{shaper, s2s_shaper},
{max_stanza_size, 131072}
]},
{5280, ejabberd_http, [
http_poll,
web_admin
]}
]}.
{s2s_use_starttls, true}.
{s2s_certfile, "/etc/ejabberd/ejabberd.pem"}.
%% Authentication using LDAP
{auth_method, ldap}.
{ldap_servers, [${LDAP_SERVERS}]}.
{ldap_encrypt, tls}.
{ldap_port, 636}.
{ldap_rootdn, "cn=$(hostname -s),ou=Hosts,${BASEDN}"}.
{ldap_password, "${SECRET}"}.
{ldap_base, "${BASEDN}"}.
{ldap_uids, [{"uid"}]}.
{ldap_filter, "(objectClass=shadowAccount)"}.
{shaper, normal, {maxrate, 1000}}.
{shaper, fast, {maxrate, 50000}}.
{acl, local, {user_regexp, ""}}.
{access, max_user_sessions, [{10, all}]}.
{access, local, [{allow, local}]}.
{access, c2s, [{deny, blocked},
{allow, all}]}.
{access, c2s_shaper, [{none, admin},
{normal, all}]}.
{access, s2s_shaper, [{fast, all}]}.
{access, announce, [{allow, admin}]}.
{access, configure, [{allow, admin}]}.
{access, muc_admin, [{allow, admin}]}.
{access, muc, [{allow, all}]}.
{access, register, [{deny, all}]}.
{access, pubsub_createnode, [{allow, all}]}.
{language, "en"}.
{modules,
[
{mod_adhoc, []},
{mod_announce, [{access, announce}]},
{mod_caps, []},
{mod_configure,[]},
{mod_ctlextra, []},
{mod_disco, []},
EOF
# only one node should have mod-irc enabled. might as well be the master db.
if [ "$(hostname -s)" == "${NODES[0]}" ];then
cat<<EOF >>/etc/ejabberd/ejabberd.cfg
{mod_irc, []},
EOF
fi
cat<<EOF >>/etc/ejabberd/ejabberd.cfg
{mod_last, []},
{mod_muc, [
{access, muc},
{access_create, muc},
{access_persistent, muc},
{access_admin, muc_admin},
{max_users, 500}
]},
{mod_offline, []},
{mod_privacy, []},
{mod_private, []},
{mod_proxy65, [
{access, local},
{shaper, c2s_shaper}
]},
{mod_pubsub, [
{access_createnode, pubsub_createnode},
{plugins, ["default", "pep"]}
]},
{mod_register, [
{welcome_message, {"Welcome!",
"Welcome to a Jabber service powered by Debian. "
"For information about Jabber visit "
"http://www.jabber.org"}},
{access, register}
]},
{mod_roster, []},
{mod_stats, []},
{mod_time, []},
{mod_vcard, []},
{mod_version, []}
]}.
EOF
if [ ! -f /etc/default/ejabberd.dist ]; then cp /etc/default/ejabberd /etc/default/ejabberd.dist; fi
cat<<EOF > /etc/default/ejabberd
SMP=auto
ERLANG_NODE=ejabberd@$(hostname -f)
EOF
echo ' OK'
################################################################################
# see if it starts with the new ERLANG_NODE name:
echo -n "See if it starts with the new ERLANG_NODE name: "
#
########################################
# wait for it to start or fail
(
/etc/init.d/ejabberd start;
EXIT=1; COUNT=0;
while [ ${EXIT} -ne 0 -a ${COUNT} -lt 10 ]; do
STATUS=$(su - ejabberd ejabberdctl status)
echo ${STATUS} | grep "ejabberd@$(hostname -f).*ejabberd is running"
EXIT=$?
COUNT=$(expr ${COUNT} + 1)
sleep 1;
done
if [ ${EXIT} -ne 0 ]; then
exit 1
else
exit 0
fi
) >/dev/null 2>&1
spinner $!
EXIT=$?
if [ ${EXIT} -ne 0 ]; then
echo "renaming the node failed."
else
echo "it runs fine..."
fi
if [ "$(hostname -s)" == "${NODES[0]}" ];then
exit 0;
fi
/etc/init.d/ejabberd stop
rm /var/lib/ejabberd/*
################################################################################
# see if we have our cookie
echo -n "See if we can see our cookie through erlang:get_cookie: "
#
COOKIE_FILE=$(cat /var/lib/ejabberd/.erlang.cookie)
COOKIE=$(
cat<<EOF | su - ejabberd -- \
erl -name ejabberd@$(hostname -s).${DOMAIN} -mnesia dir \"/var/lib/ejabberd/\" \
-mnesia extra_db_nodes "['ejabberd@${NODES[0]}.${DOMAIN}']" \
-s mnesia | grep "1>" | sed -e 's/.*1> //g'
erlang:get_cookie().
q().
EOF
)
echo $COOKIE | grep -q ${COOKIE_FILE}
EXIT=$?
if [ ${EXIT} -ne 0 ]; then
echo "we cannot see our cookie"
exit
else
echo "cookie matches what we copied from the remote node."
fi
################################################################################
# try to redirect our database
echo "Try to redirect our database to the first node: "
#
COMMAND_LINE="su - ejabberd -- erl -name ejabberd@$(hostname -s).${DOMAIN} -mnesia dir '/var/lib/ejabberd/' -mnesia extra_db_nodes ['ejabberd@${NODES[0]}.${DOMAIN}'] -s mnesia"
echo "[ ${COMMAND_LINE} ]"
TEMP=$(mktemp /dev/shm/ejabberd.mnesia.XXXX)
cat<<EOF | ${COMMAND_LINE} > ${TEMP}
timer:sleep(5000).
mnesia:change_table_copy_type(schema, node(), disc_copies).
q().
EOF
# Get the result of the mnesia:change)table_copy_type comand (command 2)
REDIRECT_RESULT=$(cat ${TEMP} | grep "2>" | sed -e 's/.*2> //g')
echo ${REDIRECT_RESULT} | grep -q "\{atomic,ok\}"
EXIT=$?
if [ ${EXIT} -ne 0 ]; then
echo "Failed with: ${REDIRECT_RESULT}"
############################################################################
# get some info as to what's going on with the failure
echo "********************************************************************************"
cat ${TEMP}
echo "********************************************************************************"
echo "Additional information from mnesia:info():"
echo "********************************************************************************"
echo -e "mnesia:info().\nq().\n" | ${COMMAND_LINE}
echo "********************************************************************************"
exit 1
else
echo "looks ok..."
fi
rm ${TEMP}
cat<<EOF > /etc/default/ejabberd
SMP=auto
ERL_OPTIONS=" -mnesia extra_db_nodes ['ejabberd@${NODES[0]}.${DOMAIN}'] -s mnesia "
ERLANG_NODE=ejabberd@$(hostname -s).${DOMAIN}
EOF
/etc/init.d/ejabberd start
EXIT=1; COUNT=0;
while [ ${EXIT} -ne 0 -a ${COUNT} -lt 10 ]; do
STATUS=$(su - ejabberd ejabberdctl status)
echo ${STATUS} | grep "ejabberd@$(hostname -f).*ejabberd is running"
EXIT=$?
COUNT=$(expr ${COUNT} + 1)
sleep 1;
done
EXIT=$?
if [ ${EXIT} -ne 0 ]; then
echo "starting ejabberd failed"
exit 1;
else
echo "success"
exit 0;
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment