install.sh 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. #!/bin/bash
  2. export BASE_LOG_DIR=""
  3. export BASE_CONF_DIR=""
  4. export BASE_DATA_DIR=""
  5. DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
  6. SHELL_LOG="${DIR}/console.out"
  7. export SQL_SOURCE_PATH="${DIR}/db/datax_web.sql"
  8. MODULES_DIR="${DIR}/../modules"
  9. PACKAGE_DIR="${DIR}/../packages"
  10. MODULE_LIST=()
  11. CONF_FILE_PATH="bin/configure.sh"
  12. FORCE_INSTALL=false
  13. SKIP_PACKAGE=false
  14. SAFE_MODE=true
  15. UNSAFE_COMMAND=""
  16. USER=`whoami`
  17. SUDO_USER=false
  18. usage(){
  19. printf "\033[1m Install usage:\n\033[0m"
  20. printf "\t%-15s %-15s %-2s \n" "-m|--modules" "modules to install" "Define the modules to install"
  21. printf "\t%-15s %-15s %-2s \n" "-f|--force" "force install" "Force program to install modules"
  22. printf "\t%-15s %-15s %-2s \n" "--skip-pack" "do not decompress" "Skip the phrase of decompressing packages"
  23. printf "\t%-15s %-15s %-2s \n" "--unsafe" "unsafe mode" "Will clean the module directory existed"
  24. printf "\t%-15s %-15s %-2s \n" "--safe" "safe mode" "Will not modify the module directory existed (Default)"
  25. printf "\t%-15s %-15s %-2s \n" "-h|--help" "usage" "View command list"
  26. }
  27. function LOG(){
  28. currentTime=`date "+%Y-%m-%d %H:%M:%S.%3N"`
  29. echo -e "$currentTime [${1}] ($$) $2" | tee -a ${SHELL_LOG}
  30. }
  31. is_sudo_user(){
  32. sudo -v >/dev/null 2>&1
  33. }
  34. clean_modules(){
  35. if [ ${#MODULE_LIST[@]} -gt 0 ]; then
  36. for server in ${MODULE_LIST[@]}
  37. do
  38. rm -rf ${MODULES_DIR}/${server}
  39. done
  40. else
  41. rm -rf ${MODULES_DIR}/*
  42. fi
  43. }
  44. uncompress_packages(){
  45. local list=`ls ${PACKAGE_DIR}`
  46. for pack in ${list}
  47. do
  48. local uncompress=true
  49. if [ ${#PACKAGE_NAMES[@]} -gt 0 ]; then
  50. uncompress=false
  51. for server in ${PACKAGE_NAMES[@]}
  52. do
  53. if [ ${server} == ${pack%%.tar.gz*} ] || [ ${server} == ${pack%%.zip*} ]; then
  54. uncompress=true
  55. break
  56. fi
  57. done
  58. fi
  59. if [ ${uncompress} == true ]; then
  60. if [[ ${pack} =~ tar\.gz$ ]]; then
  61. local do_uncompress=0
  62. if [ ${FORCE_INSTALL} == false ]; then
  63. interact_echo "Do you want to decompress this package: [${pack}]?"
  64. do_uncompress=$?
  65. fi
  66. if [ ${do_uncompress} == 0 ]; then
  67. LOG INFO "\033[1m Uncompress package: [${pack}] to modules directory\033[0m"
  68. tar --skip-old-files -zxf ${PACKAGE_DIR}/${pack} -C ${MODULES_DIR}
  69. fi
  70. elif [[ ${pack} =~ zip$ ]]; then
  71. local do_uncompress=0
  72. if [ ${FORCE_INSTALL} == false ]; then
  73. interact_echo "Do you want to decompress this package: [${pack}]?"
  74. do_uncompress=$?
  75. fi
  76. if [ ${do_uncompress} == 0 ]; then
  77. LOG INFO "\033[1m Uncompress package: [${pack}] to modules directory\033[0m"
  78. unzip -nq ${PACKAGE_DIR}/${pack} -d ${MODULES_DIR}
  79. fi
  80. fi
  81. # skip other packages
  82. fi
  83. done
  84. }
  85. interact_echo(){
  86. while [ 1 ]; do
  87. read -p "$1 (Y/N)" yn
  88. if [ "${yn}x" == "Yx" ] || [ "${yn}x" == "yx" ]; then
  89. return 0
  90. elif [ "${yn}x" == "Nx" ] || [ "${yn}x" == "nx" ]; then
  91. return 1
  92. else
  93. echo "Unknown choise: [$yn], please choose again."
  94. fi
  95. done
  96. }
  97. install_modules(){
  98. LOG INFO "\033[1m ####### Start To Install Modules ######\033[0m"
  99. LOG INFO "Module servers could be installed:"
  100. for server in ${MODULE_LIST[@]}
  101. do
  102. printf "\\033[1m [${server}] \033[0m"
  103. done
  104. echo ""
  105. for server in ${MODULE_LIST[@]}
  106. do
  107. if [ ${FORCE_INSTALL} == false ]; then
  108. interact_echo "Do you want to confiugre and install [${server}]?"
  109. if [ $? == 0 ]; then
  110. LOG INFO "\033[1m Install module server: [${server}]\033[0m"
  111. # Call configure.sh
  112. ${MODULES_DIR}/${server}/${CONF_FILE_PATH} ${UNSAFE_COMMAND}
  113. fi
  114. else
  115. LOG INFO "\033[1m Install module server: [${server}]\033[0m"
  116. # Call configure.sh
  117. ${MODULES_DIR}/${server}/${CONF_FILE_PATH} ${UNSAFE_COMMAND}
  118. fi
  119. done
  120. LOG INFO "\033[1m ####### Finish To Install Modules ######\033[0m"
  121. }
  122. scan_to_install_modules(){
  123. echo "Scan modules directory: [$1] to find server under dataxweb"
  124. let c=0
  125. ls_out=`ls $1`
  126. for dir in ${ls_out}
  127. do
  128. if test -e "$1/${dir}/${CONF_FILE_PATH}"; then
  129. MODULE_LIST[$c]=${dir}
  130. ((c++))
  131. fi
  132. done
  133. install_modules
  134. }
  135. while [ 1 ]; do
  136. case ${!OPTIND} in
  137. -h|--help)
  138. usage
  139. exit 0
  140. ;;
  141. -m|--modules)
  142. i=1
  143. if [ -z $2 ]; then
  144. echo "Empty modules"
  145. exit 1
  146. fi
  147. while [ 1 ]; do
  148. split=`echo $2|cut -d "," -f${i}`
  149. if [ "$split" != "" ];
  150. then
  151. c=$(($i - 1))
  152. MODULE_LIST[$c]=${split}
  153. i=$(($i + 1))
  154. else
  155. break
  156. fi
  157. if [ "`echo $2 |grep ","`" == "" ]; then
  158. break
  159. fi
  160. done
  161. shift 2
  162. ;;
  163. -f|--force)
  164. FORCE_INSTALL=true
  165. shift 1
  166. ;;
  167. --skip-pack)
  168. SKIP_PACKAGE=true
  169. shift 1
  170. ;;
  171. --safe)
  172. SAFE_MODE=true
  173. UNSAFE_COMMAND=""
  174. shift 1
  175. ;;
  176. --unsafe)
  177. SAFE_MODE=false
  178. UNSAFE_COMMAND="--unsafe"
  179. shift 1
  180. ;;
  181. "")
  182. break
  183. ;;
  184. *)
  185. echo "Argument error! " 1>&2
  186. exit 1
  187. ;;
  188. esac
  189. done
  190. is_sudo_user
  191. if [ $? == 0 ]; then
  192. SUDO_USER=true
  193. fi
  194. MODULE_LIST_RESOLVED=()
  195. if [ ${#MODULE_LIST[@]} -gt 0 ]; then
  196. c=0
  197. RESOLVED_DIR=${PACKAGE_DIR}
  198. if [ ${SKIP_PACKAGE} == true ]; then
  199. RESOLVED_DIR=${MODULES_DIR}
  200. fi
  201. for server in ${MODULE_LIST[@]}
  202. do
  203. server_list=`ls ${RESOLVED_DIR} | grep -E "^(${server}|${server}_[0-9]+\\.[0-9]+\\.[0-9]+\\.RELEASE_[0-9]+)(\\.tar\\.gz|\\.zip|)$"`
  204. for _server in ${server_list}
  205. do
  206. # More better method to cut string?
  207. _server=${_server%%.tar.gz*}
  208. _server=${_server%%zip*}
  209. MODULE_LIST_RESOLVED[$c]=${_server}
  210. c=$(($c + 1))
  211. done
  212. done
  213. if [ ${SKIP_PACKAGE} == true ]; then
  214. MODULE_LIST=${MODULE_LIST_RESOLVED}
  215. else
  216. PACKAGE_NAMES=${MODULE_LIST_RESOLVED}
  217. fi
  218. fi
  219. if [ ! -d ${MODULES_DIR} ]; then
  220. LOG INFO "Creating directory: ["${MODULES_DIR}"]."
  221. mkdir -p ${MODULES_DIR}
  222. fi
  223. if [ ${SAFE_MODE} == false ]; then
  224. LOG INFO "\033[1m ####### Start To Clean Modules Directory ######\033[0m"
  225. LOG INFO "Cleanning...."
  226. if [ ${MODULES_DIR} == "" ] || [ ${MODULES_DIR} == "/" ]; then
  227. LOG INFO "Illegal modules directory: ${MODULES_DIR}" 1>&2
  228. exit 1
  229. fi
  230. clean_modules
  231. LOG INFO "\033[1m ####### Finish To Clean Modules Directory ######\033[0m"
  232. fi
  233. if [ ${SKIP_PACKAGE} == false ]; then
  234. LOG INFO "\033[1m ####### Start To Uncompress Packages ######\033[0m"
  235. LOG INFO "Uncompressing...."
  236. uncompress_packages
  237. LOG INFO "\033[1m ####### Finish To Umcompress Packages ######\033[0m"
  238. fi
  239. if [ ${#MODULE_LIST[@]} -gt 0 ]; then
  240. for server in ${MODULE_LIST}
  241. do
  242. if [ ! -f ${MODULES_DIR}/${server}/${CONF_FILE_PATH} ]; then
  243. LOG INFO "Module [${server}] defined doesn't have configure.sh shell" 1>&2
  244. exit 1
  245. fi
  246. done
  247. install_modules
  248. else
  249. # Scan modules directory
  250. scan_to_install_modules ${MODULES_DIR}
  251. fi
  252. exit 0