package.sh 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611
  1. #!/bin/bash
  2. AGENT_INSTALLER_VERSION=1.0.0
  3. #== 当前脚本必须放在 smartagent/scripts 目录下
  4. readonly SCRIPT_PATH=$(dirname $0)
  5. readonly SCRIPT_DIR=$(cd $SCRIPT_PATH && pwd)
  6. readonly CURR_FILE_NAME="$(basename "$0")"
  7. readonly SMARTAGENT_DIR=$(cd $SCRIPT_DIR/../ && pwd)
  8. readonly SMARTAGENT_PARENT_DIR=$(cd $SCRIPT_DIR/../../ && pwd)
  9. readonly BRAND_FORMAL_NAME="Cloudwise"
  10. BRAND_PRODUCT_NAME="euspace"
  11. BRAND_AGENT_PRODUCT_NAME="${BRAND_FORMAL_NAME}-${BRAND_PRODUCT_NAME}"
  12. readonly BRAND_FORMAL_NAME_LOWER="cloudwise"
  13. readonly BRAND_PRODUCT_NAME_LOWER="cwserveragent"
  14. readonly BRAND_AGENT_DEFAULT_USER_AND_GROUP_NAME="ucloudwise"
  15. readonly BAK_EXT_NAME=".bak"
  16. #== cw-serveragent
  17. readonly SERVICE_SCRIPT_FILE="cw-oneagent"
  18. readonly XZDEC_NAME="xzdec"
  19. readonly INSTALL_TEMP_FILE_NAME="install_temp.sh"
  20. readonly INSTALL_VERSION_FILE_NAME="installer.version"
  21. #== {productName}-installer-{version}.sh 即 cwserveragent-installer-1.1.0.sh
  22. ARCH=$(uname -m)
  23. TARGET_INSTALL_FILE_NAME="${BRAND_AGENT_PRODUCT_NAME}-installer-Linux-${ARCH}-${AGENT_INSTALLER_VERSION}.sh"
  24. #TARGET_INSTALL_FILE_NAME="${BRAND_PRODUCT_NAME_LOWER}-installer-${AGENT_INSTALLER_VERSION}.sh"
  25. TARGET_INSTALL_TMP_FILE="${SMARTAGENT_PARENT_DIR}/${TARGET_INSTALL_FILE_NAME}.tmp"
  26. readonly LOG_DIR="${SMARTAGENT_PARENT_DIR}/logs"
  27. readonly LOG_FILE_NAME="release.log"
  28. readonly LOG_FILE="${LOG_DIR}/${LOG_FILE_NAME}"
  29. #== 【0】=【退出码】执行成功
  30. readonly EXIT_CODE_OK=0
  31. readonly EXIT_CODE_GENERIC_ERROR=1
  32. readonly EXIT_CODE_NOT_ENOUGH_SPACE=6
  33. readonly EXIT_CODE_NOT_ENOUGH_MEMORY=7
  34. #== 【0】=无效参数
  35. readonly EXIT_CODE_INVALID_PARAM=8
  36. readonly EXIT_CODE_INSUFFICIENT_PERMISSIONS=9
  37. readonly EXIT_CODE_SEMANAGE_NOT_FOUND=10
  38. readonly EXIT_CODE_WATCHDOG_ALREADY_RUNNING=11
  39. #== 【退出码】接收信号
  40. readonly EXIT_CODE_SIGNAL_RECEIVED=12
  41. readonly EXIT_CODE_ANOTHER_INSTALLER_RUNNING=13
  42. readonly EXIT_CODE_AGENT_CONTAINER_RUNNING=14
  43. readonly EXIT_CODE_GLIBC_VERSION_TOO_LOW=15
  44. readonly EXIT_CODE_CORRUPTED_PACKAGE=16
  45. #== 【退出码】管理系统环境变量配置
  46. readonly EXIT_CODE_MISCONFIGURED_ENVIRONMENT=17
  47. readonly EXIT_CODE_UNSUPPORTED_DOWNGRADE=18
  48. readonly EXIT_CODE_OS_NOT_SUPPORTED=19
  49. readonly EXIT_CODE_DEL_DEFAULT_PARAMS=20
  50. readonly LINES_TO_SEARCH_FOR_SIGNATURE_AND_PARAMS=50
  51. #**********************************************************
  52. # Logs
  53. #**********************************************************
  54. toLogFile() {
  55. if [ -e "${LOG_FILE}" ]; then
  56. printf '%s UTC %s\n' "$(date -u +"%Y-%m-%d %H:%M:%S")" "$*" >>"${LOG_FILE}" 2>/dev/null
  57. fi
  58. }
  59. toConsoleOnly() {
  60. printf '%s %s\n' "$(date +"%H:%M:%S")" "$*" 2>/dev/null
  61. }
  62. toLogInfo() {
  63. toLogFile "[INFO]" "$@"
  64. }
  65. toLogWarn() {
  66. toLogFile "[WARN]" "$@"
  67. }
  68. toLogError() {
  69. toLogFile "[ERROR]" "$@"
  70. }
  71. toLogAdaptive() {
  72. local success="${1}"
  73. shift
  74. if [ "${success}" -eq 0 ]; then
  75. toLogInfo "$@"
  76. else
  77. toLogError "$@"
  78. fi
  79. }
  80. toConsoleInfo() {
  81. toConsoleOnly "$@"
  82. toLogInfo "$@"
  83. }
  84. toConsoleWarn() {
  85. toConsoleOnly "Warn:" "$@"
  86. toLogWarn "$@"
  87. } >&2
  88. toConsoleError() {
  89. toConsoleOnly "Error:" "$@"
  90. toLogError "$@"
  91. } >&2
  92. #**********************************************************
  93. # compress
  94. #**********************************************************
  95. tarSmartAgent() {
  96. toConsoleInfo "There are 5 steps to packing, begin package ${BRAND_AGENT_PRODUCT_NAME}...."
  97. #== 将打包脚本(package.sh、xzdec、install_temp.sh、smartagent、uninstall.sh)移动到临时目录
  98. for fileNm in "${CURR_FILE_NAME}" "${INSTALL_TEMP_FILE_NAME}" "uninstall.sh"; do
  99. mv -f "${SCRIPT_DIR}/${fileNm}" "${SMARTAGENT_PARENT_DIR}/${fileNm}${BAK_EXT_NAME}" 2>>"${LOG_FILE}"
  100. done
  101. mv -f "${SCRIPT_DIR}/${XZDEC_NAME}" "${SMARTAGENT_PARENT_DIR}/" 2>>"${LOG_FILE}"
  102. cp -f "${SMARTAGENT_PARENT_DIR}/${INSTALL_TEMP_FILE_NAME}${BAK_EXT_NAME}" "${TARGET_INSTALL_TMP_FILE}" 2>>"${LOG_FILE}"
  103. for fileNm in "uninstall.sh"; do
  104. cp -f "${SMARTAGENT_PARENT_DIR}/${fileNm}${BAK_EXT_NAME}" "${SCRIPT_DIR}/${fileNm}" 2>>"${LOG_FILE}"
  105. done
  106. #== 删除安装脚本中注释
  107. if [ "${PARAM_DEBUG}"x != "true"x ]; then
  108. toConsoleInfo "Delete the type [#==] comment ..."
  109. sed -i '/#==/d' "${TARGET_INSTALL_TMP_FILE}"
  110. # sed -i '/#==/d' "${SCRIPT_DIR}/${SERVICE_SCRIPT_FILE}"
  111. sed -i '/#==/d' "${SCRIPT_DIR}/uninstall.sh"
  112. toConsoleInfo "Delete the type [#DEBUG==] comment ..."
  113. sed -i '/#DEBUG==/d' "${TARGET_INSTALL_TMP_FILE}"
  114. # sed -i '/#DEBUG==/d' "${SCRIPT_DIR}/${SERVICE_SCRIPT_FILE}"
  115. sed -i '/#DEBUG==/d' "${SCRIPT_DIR}/uninstall.sh"
  116. fi
  117. if [ "${PARAM_RELEASE}"x = "true"x ]; then
  118. deleteDefaultParams "${TARGET_INSTALL_TMP_FILE}"
  119. fi
  120. #== 进入 smartagent 目录下
  121. cd "${SMARTAGENT_DIR}"
  122. cp -f "${SCRIPT_DIR}/uninstall.sh" ./package_dir
  123. #== 执行第一阶段压缩(源码压缩)Cloudwise-SmartAgent.tar
  124. toConsoleInfo "step【1】start【tar -cpf "${SMARTAGENT_PARENT_DIR}/${BRAND_AGENT_PRODUCT_NAME}.tar" ./package_dir/*】to ${BRAND_AGENT_PRODUCT_NAME}.tar"
  125. tar -cpf "${SMARTAGENT_PARENT_DIR}/${BRAND_AGENT_PRODUCT_NAME}.tar" ./package_dir/* >>"${LOG_FILE}" 2>&1
  126. rm -f "./package_dir/uninstall.sh"
  127. if [ $? -ne 0 ]; then
  128. finishPackage "${EXIT_CODE_GENERIC_ERROR}"
  129. fi
  130. local agentTarSize="$(getStorageSize "${SMARTAGENT_PARENT_DIR}/${BRAND_AGENT_PRODUCT_NAME}.tar")"
  131. cd "${SMARTAGENT_PARENT_DIR}"
  132. #== 执行第二阶段压缩(源码压缩 Cloudwise-SmartAgent.tar.xz
  133. toConsoleInfo "step【2】start【xz -T0 -z ${BRAND_AGENT_PRODUCT_NAME}.tar】to ${BRAND_AGENT_PRODUCT_NAME}.tar.zx"
  134. xz -T0 -1 -z "${BRAND_AGENT_PRODUCT_NAME}.tar" -vv
  135. if [ $? -ne 0 ]; then
  136. finishPackage "${EXIT_CODE_GENERIC_ERROR}"
  137. fi
  138. #== 执行第三阶段压缩 Cloudwise-SmartAgent.tar.xz xzdec to Cloudwise-SmartAgent.tar
  139. toConsoleInfo "step【3】start【tar -cpf ${BRAND_AGENT_PRODUCT_NAME}.tar ${BRAND_AGENT_PRODUCT_NAME}.tar.xz xzdec】 to ${BRAND_AGENT_PRODUCT_NAME}.tar"
  140. tar -cpf "${BRAND_AGENT_PRODUCT_NAME}.tar" "${BRAND_AGENT_PRODUCT_NAME}.tar.xz" xzdec >>"${LOG_FILE}" 2>&1
  141. if [ $? -ne 0 ]; then
  142. finishPackage "${EXIT_CODE_GENERIC_ERROR}"
  143. fi
  144. #== 执行第四阶段压缩 Cloudwise-SmartAgent.tar to Cloudwise-SmartAgent.tar.base64
  145. toConsoleInfo "step【4】start【base64 ${BRAND_AGENT_PRODUCT_NAME}.tar > ${BRAND_AGENT_PRODUCT_NAME}.tar.base64】 to ${BRAND_AGENT_PRODUCT_NAME}.tar.base64"
  146. base64 "${BRAND_AGENT_PRODUCT_NAME}.tar" >"${BRAND_AGENT_PRODUCT_NAME}.tar.base64" 2>>"${LOG_FILE}"
  147. if [ $? -ne 0 ]; then
  148. finishPackage "${EXIT_CODE_GENERIC_ERROR}"
  149. fi
  150. #== 执行第五阶段将 base64 文件写入安装脚本
  151. toConsoleInfo "step【5】start write 【${BRAND_AGENT_PRODUCT_NAME}.tar.base64】 to ${SMARTAGENT_DIR}/${TARGET_INSTALL_FILE_NAME}"
  152. #== 设置脚本中版本、创建时间、占用空间信息
  153. editInstallScriptParam "${TARGET_INSTALL_TMP_FILE}" ${agentTarSize}
  154. sed -i "/#################ENDOFSCRIPTMARK################/r ${BRAND_AGENT_PRODUCT_NAME}.tar.base64" "${TARGET_INSTALL_TMP_FILE}"
  155. if [ $? -ne 0 ]; then
  156. finishPackage "${EXIT_CODE_GENERIC_ERROR}"
  157. fi
  158. toConsoleInfo "${BRAND_AGENT_PRODUCT_NAME} packaging success."
  159. finishPackage "${EXIT_CODE_OK}"
  160. }
  161. buildVersion() {
  162. local oldVersion
  163. if oldVersion="$(getOldVersion)"; then
  164. setInstallVersion "${oldVersion}"
  165. removeIfExist "${SMARTAGENT_DIR}/${TARGET_INSTALL_FILE_NAME}"
  166. toConsoleInfo "Delete file ${SMARTAGENT_DIR}/${TARGET_INSTALL_FILE_NAME}."
  167. fi
  168. if [ "${PARAM_VERSION}" ]; then
  169. setInstallVersion "${PARAM_VERSION}"
  170. return
  171. fi
  172. }
  173. setInstallVersion() {
  174. local version="${1}"
  175. if [ ! "${version}" ]; then
  176. toConsoleWarn "Set install version failed,not found version version."
  177. return
  178. fi
  179. AGENT_INSTALLER_VERSION="${version}"
  180. BRAND_PRODUCT_NAME="${PARAM_NAME}"
  181. BRAND_AGENT_PRODUCT_NAME="${BRAND_FORMAL_NAME}-${BRAND_PRODUCT_NAME}"
  182. TARGET_INSTALL_FILE_NAME="${BRAND_AGENT_PRODUCT_NAME}-installer-Linux-${ARCH}-${AGENT_INSTALLER_VERSION}.sh"
  183. #== {productName}-installer-{version}.sh 即 cwserveragent-installer-1.1.0.sh
  184. # TARGET_INSTALL_FILE_NAME="${BRAND_PRODUCT_NAME_LOWER}-installer-${AGENT_INSTALLER_VERSION}.sh"
  185. TARGET_INSTALL_TMP_FILE="${SMARTAGENT_PARENT_DIR}/${TARGET_INSTALL_FILE_NAME}.tmp"
  186. }
  187. getOldVersion() {
  188. local installVersionFile="${SMARTAGENT_DIR}/installer.version"
  189. if [ ! -f "${installVersionFile}" ]; then
  190. toLogWarn "Could not find ${installVersionFile} file."
  191. return 1
  192. fi
  193. local oldVersion="$(cat "${installVersionFile}")"
  194. if [ ! "${oldVersion}" ]; then
  195. toLogWarn "Could not read install version from ${installVersionFile} file."
  196. return 1
  197. fi
  198. printf '%s' "${oldVersion}"
  199. return 0
  200. }
  201. #== 通过占位分割读取位置
  202. locateDelimiter() {
  203. #== 占位符
  204. local delimiter="${1}"
  205. #== 从文件结尾读取行数
  206. local linesToReadFromEnd="${2}"
  207. local filePath="${3}"
  208. if [ "${linesToReadFromEnd}" ]; then
  209. #== 文件总行数n(实际行数=n+1)
  210. local linesCount="$(wc -l "${filePath}" | awk '{print $1}')"
  211. #== 从后往前读取【linesToReadFromEnd】行
  212. local offset="$(tail -n"${linesToReadFromEnd}" "${filePath}" 2>/dev/null | awk '/^'"${delimiter}"'/ { print NR; exit }')"
  213. if [ -n "${offset}" ]; then
  214. printf "%d" "$((linesCount - linesToReadFromEnd + offset))"
  215. fi
  216. else
  217. #== 读取占位符所在行(实际行数=n+1)
  218. awk '/^'"${delimiter}"'/ { print NR; exit }' "${filePath}"
  219. fi
  220. }
  221. #== 删除安装脚本中默认参数
  222. deleteDefaultParams() {
  223. local filePath="${1}"
  224. local sectionName="----PARAMETERS"
  225. local begin=$(locateDelimiter "${sectionName}" ${LINES_TO_SEARCH_FOR_SIGNATURE_AND_PARAMS} ${filePath})
  226. local end=$(locateDelimiter "${sectionName}--" ${LINES_TO_SEARCH_FOR_SIGNATURE_AND_PARAMS} ${filePath})
  227. if [ -z "${begin}" ] || [ -z "${end}" ]; then
  228. return
  229. fi
  230. toConsoleInfo "Begin delete default params from line ${begin} to ${end}..."
  231. local output="$(sed -i "${begin},${end}d" "${filePath}") 2>&1"
  232. if [ ! "${output}" ]; then
  233. toConsoleError "Delete install script file ${SMARTAGENT_DIR}/${TARGET_INSTALL_FILE_NAME} default params error:${output}"
  234. finishPackage "${EXIT_CODE_DEL_DEFAULT_PARAMS}"
  235. fi
  236. toConsoleInfo "Delete install script file ${SMARTAGENT_DIR}/${TARGET_INSTALL_FILE_NAME} default params success."
  237. }
  238. #== 设置脚本中版本、创建时间、占用空间信息
  239. editInstallScriptParam() {
  240. local targetFile="${1}"
  241. local agentTarSize="${2}"
  242. #== 设置版本信息
  243. local buildDate="$(date +"%Y-%m-%d")"
  244. local buildTag="$(git rev-parse --short HEAD)"
  245. local buildDateInfo="$(date +"%Y-%m-%d %H:%M:%S")"
  246. local buildUploader="$(hostname)/${USER}"
  247. #== 构建日期
  248. editScriptFileParam "readonly AGENT_BUILD_DATE" "${buildDate}" "${targetFile}"
  249. #== 构建版本
  250. editScriptFileParam "readonly AGENT_INSTALLER_VERSION" "${AGENT_INSTALLER_VERSION}" "${targetFile}"
  251. #== commitid
  252. editScriptFileParam "readonly AGENT_BUILD_TAG" "'${buildTag}'" "${targetFile}"
  253. #== 构建日期
  254. editScriptFileParam "readonly AGENT_BUILD_DATE_INFO" "'${buildDateInfo}'" "${targetFile}"
  255. #== 构建环境信息
  256. editScriptFileParam "readonly AGENT_BUILD_UPLOADER" "'${buildUploader}'" "${targetFile}"
  257. #== 设置占用空间信息
  258. local agentDirSize="$(getStorageSize "${SMARTAGENT_DIR}")"
  259. local agentBase64FileSize="$(getStorageSize "${SMARTAGENT_PARENT_DIR}/${BRAND_AGENT_PRODUCT_NAME}.tar.base64")"
  260. local agentInstallFileSize="$(getStorageSize "${TARGET_INSTALL_TMP_FILE}")"
  261. local artifactsSize="$((agentBase64FileSize + agentInstallFileSize + agentDirSize))";
  262. editScriptFileParam "readonly EXTERNAL_TAR_SIZE" "${agentTarSize}" "${targetFile}"
  263. editScriptFileParam "readonly ARTIFACTS_SIZE" "${artifactsSize}" "${targetFile}"
  264. }
  265. getStorageSize() {
  266. local dirName="${1}"
  267. if [ ! -e "${dirName}" ]; then
  268. printf '%s' "0"
  269. return 0
  270. fi
  271. printf '%s' "$(du -sb "${dirName}" | awk '{print $1}')"
  272. }
  273. finishFinally() {
  274. #== 将打包脚本文件移动到当前目录下
  275. for fileNm in "${CURR_FILE_NAME}" "${INSTALL_TEMP_FILE_NAME}" "uninstall.sh"; do
  276. if [ -f "${SMARTAGENT_PARENT_DIR}/${fileNm}${BAK_EXT_NAME}" ]; then
  277. mv -f "${SMARTAGENT_PARENT_DIR}/${fileNm}${BAK_EXT_NAME}" "${SCRIPT_DIR}/${fileNm}" 2>>"${LOG_FILE}"
  278. fi
  279. done
  280. removeIfExist "${SMARTAGENT_DIR}/uninstall.sh"
  281. if [ -f "${SMARTAGENT_PARENT_DIR}/${XZDEC_NAME}" ]; then
  282. mv -f "${SMARTAGENT_PARENT_DIR}/${XZDEC_NAME}" "${SCRIPT_DIR}/" 2>>"${LOG_FILE}"
  283. fi
  284. if [ -f "${TARGET_INSTALL_TMP_FILE}" ]; then
  285. mv -f "${TARGET_INSTALL_TMP_FILE}" "${SMARTAGENT_DIR}/${TARGET_INSTALL_FILE_NAME}" 2>>"${LOG_FILE}"
  286. fi
  287. if [ "${PARAM_DEBUG}"x != "true"x ]; then
  288. for fileNmExt in "tar" "tar.xz" "tar.base64"; do
  289. removeIfExist "${SMARTAGENT_PARENT_DIR}/${BRAND_AGENT_PRODUCT_NAME}.${fileNmExt}"
  290. done
  291. fi
  292. }
  293. removeIfExist() {
  294. local filePath="${1}"
  295. if [ ! -e "${filePath}" ]; then
  296. return
  297. fi
  298. rm -rf "${filePath}" 2>>"${LOG_FILE}"
  299. }
  300. deleteParentTmpFile() {
  301. for fileNm in "${CURR_FILE_NAME}" "${INSTALL_TEMP_FILE_NAME}" "uninstall.sh"; do
  302. removeIfExist "${SMARTAGENT_PARENT_DIR}/${fileNm}${BAK_EXT_NAME}"
  303. done
  304. removeIfExist "${SMARTAGENT_PARENT_DIR}/${XZDEC_NAME}"
  305. removeIfExist "${TARGET_INSTALL_TMP_FILE}"
  306. for fileNmExt in "tar" "tar.xz" "tar.base64"; do
  307. removeIfExist "${SMARTAGENT_PARENT_DIR}/${BRAND_AGENT_PRODUCT_NAME}.${fileNmExt}"
  308. done
  309. }
  310. #**********************************************************
  311. # Param
  312. #**********************************************************
  313. PARAM_DEBUG=false
  314. PARAM_RELEASE=false
  315. #PARAM_VERSION=1.1.0
  316. PARAM_NAME=chaosd
  317. PARAM_AGENT_PROC=$PARAM_NAME
  318. PARAM_CONFIG_PATH=
  319. #== 大小写转化,并返回判断结果
  320. istrcmp() {
  321. local s1="$(printf '%s' "${1}" | tr '[:upper:]' '[:lower:]')"
  322. local s2="$(printf '%s' "${2}" | tr '[:upper:]' '[:lower:]')"
  323. [ "${s1}"x = "${s2}"x ]
  324. }
  325. isParamTrue() {
  326. [ "${1}"x = "1"x ] || [ "${1}"x = "true"x ] || [ "${1}"x = "enable"x ] || [ "${1}"x = "yes"x ]
  327. }
  328. isParamFalse() {
  329. [ "${1}"x = "0"x ] || [ "${1}"x = "false"x ] || [ "${1}"x = "disable"x ] || [ "${1}"x = "no"x ]
  330. }
  331. #== 获取参数值
  332. getParamValue() {
  333. local paramName="${1}"
  334. local input="${2}"
  335. local paramNameLength="${#paramName}"
  336. paramNameLength=$((paramNameLength + 1))
  337. local partParam="$(expr substr "${input}" 1 ${paramNameLength})"
  338. if ! istrcmp "${partParam}" "${paramName}="; then
  339. return 1
  340. fi
  341. local valueSeparator=$((paramNameLength + 1))
  342. local value="$(expr substr "${input}" ${valueSeparator} 1000)"
  343. if [ -z "${value}" ]; then
  344. return 1
  345. fi
  346. printf '%s' "${value}"
  347. return 0
  348. }
  349. #== 获取bool参数
  350. readBoolParam() {
  351. local value=
  352. if value="$(getParamValue "${1}" "${2}")"; then
  353. if isParamFalse "${value}"; then
  354. printf "false"
  355. return 0
  356. fi
  357. if isParamTrue "${value}"; then
  358. printf "true"
  359. return 0
  360. fi
  361. fi
  362. return 1
  363. }
  364. #== 解析命令行中参数
  365. parseCommandLineParameters() {
  366. while [ $# -gt 0 ]; do
  367. local param="${1}"
  368. local value=
  369. if value=$(getParamValue RELEASE "${param}"); then
  370. PARAM_RELEASE="${value}"
  371. printParamMessage "RELEASE" "${value}"
  372. shift
  373. continue
  374. fi
  375. if value=$(getParamValue VERSION "${param}"); then
  376. PARAM_VERSION="${value}"
  377. printParamMessage "VERSION" "${value}"
  378. shift
  379. continue
  380. fi
  381. if value=$(getParamValue NAME "${param}"); then
  382. PARAM_NAME="${value}"
  383. printParamMessage "NAME" "${value}"
  384. shift
  385. continue
  386. fi
  387. if value=$(getParamValue CONFIG "${param}"); then
  388. PARAM_CONFIG_PATH="${value}"
  389. printParamMessage "CONFIG" "${value}"
  390. shift
  391. continue
  392. fi
  393. if value=$(getParamValue PROC "${param}"); then
  394. PARAM_AGENT_PROC="${value}"
  395. printParamMessage "PROC" "${value}"
  396. shift
  397. continue
  398. fi
  399. if value=$(readBoolParam DEBUG "${param}"); then
  400. PARAM_DEBUG="${value}"
  401. printParamMessage "DEBUG" "${value}"
  402. shift
  403. continue
  404. fi
  405. if [ "${param}"x = "-h"x ] || [ "${param}"x = "--help"x ]; then
  406. displayHelp
  407. finishPackage "${EXIT_CODE_OK}"
  408. fi
  409. if [ "${param}"x = "-v"x ] || [ "${param}"x = "--version"x ]; then
  410. printf "%s\n" "${AGENT_INSTALLER_VERSION}"
  411. finishPackage "${EXIT_CODE_OK}"
  412. fi
  413. toConsoleError "Unrecognized parameter: ${param}"
  414. displayHelp
  415. finishPackage "${EXIT_CODE_INVALID_PARAM}"
  416. done
  417. }
  418. displayHelp() {
  419. printf '\n'
  420. printf '%s\n' "Usage: "${CURR_FILE_NAME}" [-h] [-v] [NAME=pluginName] [PROC=mainProcess] [RELEASE=true|false] [DEBUG=true|false] [VERSION=1.0]"
  421. printf '\n\n'
  422. local pad=15
  423. printf "%-${pad}s%s\n" "-h, --help" "Display this help and exit."
  424. printf "%-${pad}s%s\n" "-v, --version" "Print version and exit."
  425. printf '\n'
  426. printf "%-${pad}s%s\n" "RELEASE" "Default true; Whether to delete the publish parameter in the script."
  427. printf "%-${pad}s%s\n" "VERSION" "Configure the ${BRAND_FORMAL_NAME} ${BRAND_PRODUCT_NAME} version."
  428. printf "%-${pad}s%s\n" "NAME" "Setting agent name like 'bash ./scripts/package.sh NAME=pluginName PROC=mainProcess'"
  429. printf "%-${pad}s%s\n" "PROC" "Setting agent main process name."
  430. printf "%-${pad}s%s\n" "DEBUG" "Default false; 1、Debug mode executed script ${CURR_FILE_NAME};"
  431. printf "%-${pad}s%s\n" "" "2、Remove the debug log from the scripts (${TARGET_INSTALL_FILE_NAME}、${SERVICE_SCRIPT_FILE}、uninstall.sh)."
  432. }
  433. #== 完成安装后清理临时目录
  434. finishPackage() {
  435. finishFinally
  436. toLogInfo "Installation finished, PID $$, exit code: ${1}."
  437. exit "${1}"
  438. }
  439. printParamMessage() {
  440. local paramNm="${1}"
  441. local paramValue="${2}"
  442. toConsoleInfo "---> Parameter ${paramNm}=${paramValue}."
  443. }
  444. #**********************************************************
  445. # SELinux related functions
  446. #**********************************************************
  447. #== 修改scripts/smartagent脚本配置信息
  448. editScriptFileParam() {
  449. local key="${1}"
  450. local newValue="${2}"
  451. local file="${3}"
  452. local value="$(sed -n "s|^${key}=||p" "${file}" 2>/dev/null)"
  453. toConsoleInfo "---> edit ${key}=${value} to ${key}=${newValue}, configFile: ${file}"
  454. if [ "${value}" ]; then
  455. sed -i "s|^${key}=.*|${key}=${newValue}|" "${file}" 2>/dev/null
  456. fi
  457. }
  458. #== 信号捕获,并执行回调函数
  459. signalHandler() {
  460. local signal="${1}"
  461. local callback="${2}"
  462. toLogWarn "process received signal: ${signal}"
  463. ${callback} "${signal}"
  464. exit ${EXIT_CODE_SIGNAL_RECEIVED}
  465. }
  466. #== 配置信号捕获和回调
  467. configureSignalHandling() {
  468. local callback="${1}"
  469. for signal in HUP INT QUIT ABRT ALRM TERM; do
  470. #== shellcheck disable=SC2064
  471. trap "signalHandler ${signal} ${callback}" ${signal}
  472. done
  473. trap "" PIPE
  474. }
  475. #**********************************************************
  476. # main
  477. #**********************************************************
  478. main() {
  479. mkdir -p "${LOG_DIR}"
  480. echo "" >"${LOG_FILE}"
  481. toConsoleInfo "package script run path: ${SCRIPT_DIR}"
  482. toConsoleInfo "package logs path: ${LOG_DIR}"
  483. chmod +x ${SCRIPT_DIR}/*
  484. #== 解析命令行参数
  485. parseCommandLineParameters "$@"
  486. toConsoleInfo "-----params PARAM_RELEASE: ${PARAM_RELEASE}, PARAM_DEBUG: ${PARAM_DEBUG}, PARAM_VERSION: ${PARAM_VERSION}"
  487. configureSignalHandling "finishFinally"
  488. #== 设置 package 插件名
  489. editScriptFileParam "BRAND_PRODUCT_NAME" "\"${PARAM_NAME}\"" "${SCRIPT_DIR}/package.sh"
  490. #== 设置 install 插件名
  491. editScriptFileParam "readonly BRAND_PRODUCT_NAME" "\"${PARAM_NAME}\"" "${SCRIPT_DIR}/install_temp.sh"
  492. editScriptFileParam "readonly BRAND_PRODUCT_NAME_LOWER" "\"${PARAM_NAME}\"" "${SCRIPT_DIR}/install_temp.sh"
  493. #== 设置 agentctl 插件名(存在时)
  494. if [ -f "${SMARTAGENT_DIR}/package_dir/bin/agentctl" ];then
  495. editScriptFileParam "readonly BRAND_PRODUCT_NAME" "\"${PARAM_NAME}\"" "${SMARTAGENT_DIR}/package_dir/bin/agentctl"
  496. editScriptFileParam "readonly BRAND_PRODUCT_NAME_LOWER" "\"${PARAM_NAME}\"" "${SMARTAGENT_DIR}/package_dir/bin/agentctl"
  497. #== 设置 agentctl 配置文件路径(存在时)
  498. editScriptFileParam "readonly AGENT_CONFIG_PATH" "\"${PARAM_CONFIG_PATH}\"" "${SMARTAGENT_DIR}/package_dir/bin/agentctl"
  499. fi
  500. #== 设置 uninstall 插件名
  501. editScriptFileParam "readonly BRAND_PRODUCT_NAME" "\"${PARAM_NAME}\"" "${SCRIPT_DIR}/uninstall.sh"
  502. editScriptFileParam "readonly BRAND_PRODUCT_NAME_LOWER" "\"${PARAM_NAME}\"" "${SCRIPT_DIR}/uninstall.sh"
  503. #== 设置主进程名
  504. if [ -n "${PARAM_AGENT_PROC}" ]; then
  505. editScriptFileParam "readonly AGENT_PROC" "\"${PARAM_AGENT_PROC}\"" "${SCRIPT_DIR}/install_temp.sh"
  506. editScriptFileParam "readonly AGENT_PROC" "\"${PARAM_AGENT_PROC}\"" "${SCRIPT_DIR}/uninstall.sh"
  507. editScriptFileParam "readonly AGENT_PROC" "\"${PARAM_AGENT_PROC}\"" "${SMARTAGENT_DIR}/package_dir/bin/agentctl"
  508. fi
  509. buildVersion
  510. toConsoleInfo "-----Write release version ${AGENT_INSTALLER_VERSION} to ${SMARTAGENT_DIR}/${INSTALL_VERSION_FILE_NAME} file."
  511. echo "${AGENT_INSTALLER_VERSION}">"${SMARTAGENT_DIR}/${INSTALL_VERSION_FILE_NAME}"
  512. #== 修改uninstall.sh 版本
  513. editScriptFileParam "readonly AGENT_INSTALLER_VERSION" "${AGENT_INSTALLER_VERSION}" "${SCRIPT_DIR}/uninstall.sh"
  514. deleteParentTmpFile
  515. #== 压缩 并生成安装脚本
  516. tarSmartAgent
  517. }
  518. main "$@"