mirror of
https://github.com/processone/ejabberd.git
synced 2024-11-28 16:34:13 +01:00
145 lines
4.8 KiB
Bash
145 lines
4.8 KiB
Bash
|
#!/bin/bash
|
||
|
set -e
|
||
|
|
||
|
# Installs modules as defined in environment variables
|
||
|
|
||
|
source "${EJABBERD_HOME}/docker/lib/base_config.sh"
|
||
|
source "${EJABBERD_HOME}/docker/lib/config.sh"
|
||
|
source "${EJABBERD_HOME}/docker/lib/base_functions.sh"
|
||
|
source "${EJABBERD_HOME}/docker/lib/functions.sh"
|
||
|
|
||
|
|
||
|
install_module_from_source() {
|
||
|
local module_name=$1
|
||
|
local module_source_path=${EJABBERD_HOME}/module_source/${module_name}
|
||
|
local module_install_folder=${EJABBERD_HOME}/.ejabberd-modules/sources/${module_name}
|
||
|
|
||
|
log "Analyzing module ${module_name} for installation"
|
||
|
# Make sure that the module exists in the source folder before attempting a copy
|
||
|
|
||
|
if [ ! -d ${module_source_path} ]; then
|
||
|
log "Error: Module ${module_name} not found in ${EJABBERD_HOME}/module_source"
|
||
|
log "Please use a shared volume to populate your module in ${EJABBERD_HOME}/module_source"
|
||
|
return 1;
|
||
|
fi
|
||
|
|
||
|
# Check to see if the module is already installed
|
||
|
local install_count=$(${EJABBERDCTL} modules_installed | grep -ce "^${module_name}[[:space:]]")
|
||
|
if [ $install_count -gt 0 ]; then
|
||
|
log "Error: Module already installed: ${module_name}"
|
||
|
return 1;
|
||
|
fi
|
||
|
|
||
|
# Copy the module into the shared folder
|
||
|
log "Copying module to ejabberd folder ${module_install_folder}"
|
||
|
mkdir -p ${module_install_folder}
|
||
|
cp -R ${module_source_path} ${module_install_folder}
|
||
|
|
||
|
# Run the ejabberdctl module_check on the module
|
||
|
log "Running module_check on ${module_name}"
|
||
|
${EJABBERDCTL} module_check ${module_name}
|
||
|
if [ $? -ne 0 ]; then
|
||
|
log "Module check failed for ${module_name}"
|
||
|
return 1;
|
||
|
fi
|
||
|
log "Module check succeeded for ${module_name}"
|
||
|
|
||
|
# Install the module
|
||
|
log "Running module_install on ${module_name}"
|
||
|
${EJABBERDCTL} module_install ${module_name}
|
||
|
if [ $? -ne 0 ]; then
|
||
|
log "Module installation failed for ${module_name}"
|
||
|
return 1;
|
||
|
fi
|
||
|
log "Module installation succeeded for ${module_name}"
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
install_module_from_ejabberd_contrib() {
|
||
|
local module_name=$1
|
||
|
|
||
|
# Check to see if the module is already installed
|
||
|
local install_count=$(${EJABBERDCTL} modules_installed | grep -ce "^${module_name}[[:space:]]")
|
||
|
if [ $install_count -gt 0 ]; then
|
||
|
log "Error: Module already installed: ejabberd_contrib ${module_name}"
|
||
|
return 1;
|
||
|
fi
|
||
|
|
||
|
# Install the module
|
||
|
log "Running module_install on ejabberd_contrib ${module_name}"
|
||
|
${EJABBERDCTL} module_install ${module_name}
|
||
|
if [ $? -ne 0 ]; then
|
||
|
log "Module installation failed for ejabberd_contrib ${module_name}"
|
||
|
return 1;
|
||
|
fi
|
||
|
log "Module installation succeeded for ejabberd_contrib ${module_name}"
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
enable_custom_auth_module_override() {
|
||
|
module_name=$1;
|
||
|
# When using custom authentication modules, the module name must be
|
||
|
# in the following pattern: ejabberd_auth_foo, where foo is the
|
||
|
# value you will use for your auth_method yml configuration.
|
||
|
required_prefix="ejabberd_auth_"
|
||
|
|
||
|
if [[ "${module_name}" != "${required_prefix}"* ]]; then
|
||
|
log "Error: module_name must begin with ${required_prefix}"
|
||
|
exit 1;
|
||
|
fi
|
||
|
|
||
|
log "Checking custom auth module: ${module_name}"
|
||
|
# Make sure the auth module is installed
|
||
|
local install_count=$(${EJABBERDCTL} modules_installed | grep -ce "^${module_name}[[:space:]]")
|
||
|
if [ $install_count -eq 0 ]; then
|
||
|
log "Error: custom auth_module not installed: ${module_name}"
|
||
|
return 1;
|
||
|
fi
|
||
|
|
||
|
custom_auth_method=${module_name#$required_prefix}
|
||
|
echo -e "\nauth_method: [${custom_auth_method}]" >> ${CONFIGFILE}
|
||
|
log "Custom auth module ${module_name} configuration complete."
|
||
|
}
|
||
|
|
||
|
file_exist ${FIRST_START_DONE_FILE} \
|
||
|
&& exit 0
|
||
|
|
||
|
is_restart_needed=0;
|
||
|
|
||
|
if [ -n "${EJABBERD_SOURCE_MODULES}" ]; then
|
||
|
for module_name in ${EJABBERD_SOURCE_MODULES} ; do
|
||
|
install_module_from_source ${module_name}
|
||
|
done
|
||
|
is_restart_needed=1;
|
||
|
fi
|
||
|
|
||
|
# Check the EJABBERD_CONTRIB_MODULES variable for any ejabberd_contrib modules
|
||
|
if [ -n "${EJABBERD_CONTRIB_MODULES}" ]; then
|
||
|
for module_name in ${EJABBERD_CONTRIB_MODULES} ; do
|
||
|
install_module_from_ejabberd_contrib ${module_name}
|
||
|
done
|
||
|
is_restart_needed=1;
|
||
|
fi
|
||
|
|
||
|
# If a custom module was defined for handling auth, we need to override
|
||
|
# the pre-defined auth methods in the config.
|
||
|
if [ -n "${EJABBERD_CUSTOM_AUTH_MODULE_OVERRIDE}" ]; then
|
||
|
enable_custom_auth_module_override "${EJABBERD_CUSTOM_AUTH_MODULE_OVERRIDE}"
|
||
|
is_restart_needed=1;
|
||
|
fi
|
||
|
|
||
|
# If any modules were installed, restart the server, if the option is enabled
|
||
|
if [ ${is_restart_needed} -eq 1 ]; then
|
||
|
if is_true ${EJABBERD_RESTART_AFTER_MODULE_INSTALL} ; then
|
||
|
log "Restarting ejabberd after successful module installation(s)"
|
||
|
${EJABBERDCTL} restart
|
||
|
child=$!
|
||
|
${EJABBERDCTL} "started"
|
||
|
wait $child
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
exit 0
|