Created
March 21, 2010 21:33
-
-
Save anonymous/339587 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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