You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

274 lines
6.8 KiB

#!/bin/bash
export BASE_LOG_DIR=""
export BASE_CONF_DIR=""
export BASE_DATA_DIR=""
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
SHELL_LOG="${DIR}/console.out"
export SQL_SOURCE_PATH="${DIR}/db/datax_web.sql"
MODULES_DIR="${DIR}/../modules"
PACKAGE_DIR="${DIR}/../packages"
MODULE_LIST=()
CONF_FILE_PATH="bin/configure.sh"
FORCE_INSTALL=false
SKIP_PACKAGE=false
SAFE_MODE=true
UNSAFE_COMMAND=""
USER=`whoami`
SUDO_USER=false
usage(){
printf "\033[1m Install usage:\n\033[0m"
printf "\t%-15s %-15s %-2s \n" "-m|--modules" "modules to install" "Define the modules to install"
printf "\t%-15s %-15s %-2s \n" "-f|--force" "force install" "Force program to install modules"
printf "\t%-15s %-15s %-2s \n" "--skip-pack" "do not decompress" "Skip the phrase of decompressing packages"
printf "\t%-15s %-15s %-2s \n" "--unsafe" "unsafe mode" "Will clean the module directory existed"
printf "\t%-15s %-15s %-2s \n" "--safe" "safe mode" "Will not modify the module directory existed (Default)"
printf "\t%-15s %-15s %-2s \n" "-h|--help" "usage" "View command list"
}
function LOG(){
currentTime=`date "+%Y-%m-%d %H:%M:%S.%3N"`
echo -e "$currentTime [${1}] ($$) $2" | tee -a ${SHELL_LOG}
}
is_sudo_user(){
sudo -v >/dev/null 2>&1
}
clean_modules(){
if [ ${#MODULE_LIST[@]} -gt 0 ]; then
for server in ${MODULE_LIST[@]}
do
rm -rf ${MODULES_DIR}/${server}
done
else
rm -rf ${MODULES_DIR}/*
fi
}
uncompress_packages(){
local list=`ls ${PACKAGE_DIR}`
for pack in ${list}
do
local uncompress=true
if [ ${#PACKAGE_NAMES[@]} -gt 0 ]; then
uncompress=false
for server in ${PACKAGE_NAMES[@]}
do
if [ ${server} == ${pack%%.tar.gz*} ] || [ ${server} == ${pack%%.zip*} ]; then
uncompress=true
break
fi
done
fi
if [ ${uncompress} == true ]; then
if [[ ${pack} =~ tar\.gz$ ]]; then
local do_uncompress=0
if [ ${FORCE_INSTALL} == false ]; then
interact_echo "Do you want to decompress this package: [${pack}]?"
do_uncompress=$?
fi
if [ ${do_uncompress} == 0 ]; then
LOG INFO "\033[1m Uncompress package: [${pack}] to modules directory\033[0m"
tar --skip-old-files -zxf ${PACKAGE_DIR}/${pack} -C ${MODULES_DIR}
fi
elif [[ ${pack} =~ zip$ ]]; then
local do_uncompress=0
if [ ${FORCE_INSTALL} == false ]; then
interact_echo "Do you want to decompress this package: [${pack}]?"
do_uncompress=$?
fi
if [ ${do_uncompress} == 0 ]; then
LOG INFO "\033[1m Uncompress package: [${pack}] to modules directory\033[0m"
unzip -nq ${PACKAGE_DIR}/${pack} -d ${MODULES_DIR}
fi
fi
# skip other packages
fi
done
}
interact_echo(){
while [ 1 ]; do
read -p "$1 (Y/N)" yn
if [ "${yn}x" == "Yx" ] || [ "${yn}x" == "yx" ]; then
return 0
elif [ "${yn}x" == "Nx" ] || [ "${yn}x" == "nx" ]; then
return 1
else
echo "Unknown choise: [$yn], please choose again."
fi
done
}
install_modules(){
LOG INFO "\033[1m ####### Start To Install Modules ######\033[0m"
LOG INFO "Module servers could be installed:"
for server in ${MODULE_LIST[@]}
do
printf "\\033[1m [${server}] \033[0m"
done
echo ""
for server in ${MODULE_LIST[@]}
do
if [ ${FORCE_INSTALL} == false ]; then
interact_echo "Do you want to confiugre and install [${server}]?"
if [ $? == 0 ]; then
LOG INFO "\033[1m Install module server: [${server}]\033[0m"
# Call configure.sh
${MODULES_DIR}/${server}/${CONF_FILE_PATH} ${UNSAFE_COMMAND}
fi
else
LOG INFO "\033[1m Install module server: [${server}]\033[0m"
# Call configure.sh
${MODULES_DIR}/${server}/${CONF_FILE_PATH} ${UNSAFE_COMMAND}
fi
done
LOG INFO "\033[1m ####### Finish To Install Modules ######\033[0m"
}
scan_to_install_modules(){
echo "Scan modules directory: [$1] to find server under dataxweb"
let c=0
ls_out=`ls $1`
for dir in ${ls_out}
do
if test -e "$1/${dir}/${CONF_FILE_PATH}"; then
MODULE_LIST[$c]=${dir}
((c++))
fi
done
install_modules
}
while [ 1 ]; do
case ${!OPTIND} in
-h|--help)
usage
exit 0
;;
-m|--modules)
i=1
if [ -z $2 ]; then
echo "Empty modules"
exit 1
fi
while [ 1 ]; do
split=`echo $2|cut -d "," -f${i}`
if [ "$split" != "" ];
then
c=$(($i - 1))
MODULE_LIST[$c]=${split}
i=$(($i + 1))
else
break
fi
if [ "`echo $2 |grep ","`" == "" ]; then
break
fi
done
shift 2
;;
-f|--force)
FORCE_INSTALL=true
shift 1
;;
--skip-pack)
SKIP_PACKAGE=true
shift 1
;;
--safe)
SAFE_MODE=true
UNSAFE_COMMAND=""
shift 1
;;
--unsafe)
SAFE_MODE=false
UNSAFE_COMMAND="--unsafe"
shift 1
;;
"")
break
;;
*)
echo "Argument error! " 1>&2
exit 1
;;
esac
done
is_sudo_user
if [ $? == 0 ]; then
SUDO_USER=true
fi
MODULE_LIST_RESOLVED=()
if [ ${#MODULE_LIST[@]} -gt 0 ]; then
c=0
RESOLVED_DIR=${PACKAGE_DIR}
if [ ${SKIP_PACKAGE} == true ]; then
RESOLVED_DIR=${MODULES_DIR}
fi
for server in ${MODULE_LIST[@]}
do
server_list=`ls ${RESOLVED_DIR} | grep -E "^(${server}|${server}_[0-9]+\\.[0-9]+\\.[0-9]+\\.RELEASE_[0-9]+)(\\.tar\\.gz|\\.zip|)$"`
for _server in ${server_list}
do
# More better method to cut string?
_server=${_server%%.tar.gz*}
_server=${_server%%zip*}
MODULE_LIST_RESOLVED[$c]=${_server}
c=$(($c + 1))
done
done
if [ ${SKIP_PACKAGE} == true ]; then
MODULE_LIST=${MODULE_LIST_RESOLVED}
else
PACKAGE_NAMES=${MODULE_LIST_RESOLVED}
fi
fi
if [ ! -d ${MODULES_DIR} ]; then
LOG INFO "Creating directory: ["${MODULES_DIR}"]."
mkdir -p ${MODULES_DIR}
fi
if [ ${SAFE_MODE} == false ]; then
LOG INFO "\033[1m ####### Start To Clean Modules Directory ######\033[0m"
LOG INFO "Cleanning...."
if [ ${MODULES_DIR} == "" ] || [ ${MODULES_DIR} == "/" ]; then
LOG INFO "Illegal modules directory: ${MODULES_DIR}" 1>&2
exit 1
fi
clean_modules
LOG INFO "\033[1m ####### Finish To Clean Modules Directory ######\033[0m"
fi
if [ ${SKIP_PACKAGE} == false ]; then
LOG INFO "\033[1m ####### Start To Uncompress Packages ######\033[0m"
LOG INFO "Uncompressing...."
uncompress_packages
LOG INFO "\033[1m ####### Finish To Umcompress Packages ######\033[0m"
fi
if [ ${#MODULE_LIST[@]} -gt 0 ]; then
for server in ${MODULE_LIST}
do
if [ ! -f ${MODULES_DIR}/${server}/${CONF_FILE_PATH} ]; then
LOG INFO "Module [${server}] defined doesn't have configure.sh shell" 1>&2
exit 1
fi
done
install_modules
else
# Scan modules directory
scan_to_install_modules ${MODULES_DIR}
fi
exit 0