utool.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. #!/usr/bin/env bash
  2. set -e
  3. if [ -f /.dockerenv ] && [ -z "$DOMAIN_NAME" ]; then
  4. echo -e "无法获取域名\r"
  5. exit
  6. fi
  7. API_URL="https://api.hlace.com"
  8. function checkSSLExpire() {
  9. if [ ! -f "$1" ];then
  10. echo -e "证书$1不存在\r"
  11. exit
  12. else
  13. echo -e "检查证书$1有效期\r"
  14. fi
  15. expireDate=$(openssl x509 -in "$1" -noout -enddate)
  16. tm2=$(date -d "${expireDate:9}" +%s)
  17. tm1=$(date +%s)
  18. leftDays="$(((tm2-tm1)/3600/24))"
  19. #返回过期天数
  20. }
  21. function renewSSL() {
  22. checkSSLExpire /app/data/cert
  23. #ssl证书有效期小于10天时更新
  24. if [ "${leftDays}" -lt 10 ];then
  25. wget -O /app/data/cert http://mi.lacecdn.com/cert
  26. wget -O /app/data/key http://mi.lacecdn.com/key
  27. else
  28. echo -e "未过期,无须更新\r"
  29. fi
  30. }
  31. function diskUsage() {
  32. DISK_USAGE=$(df -h | awk '$NF=="/"{printf "%s\n", $5}' | cut -d'%' -f1)
  33. echo -e "当前硬盘使用率${DISK_USAGE}%\r"
  34. }
  35. function diskUsed() {
  36. DISK_USED=$(df -h | awk '$NF=="/"{printf "%s\n", $3}' | cut -d'G' -f1)
  37. echo -e "当前硬盘使用${DISK_USED}G\r"
  38. }
  39. #post disk used
  40. function pDU() {
  41. diskUsed
  42. diskUsage
  43. curl -s "${API_URL}/api/post-usage" -X POST -d "{\"h\": \"$(hostname)\",\"d\":\"${DOMAIN_NAME}\",\"d1\":\"${DISK_USED}\",\"d2\":\"${DISK_USAGE}\"}"
  44. }
  45. function memUsage() {
  46. usage=$(free -m | fgrep "Mem" | awk '{printf "%d", ($3)/$2*100}')
  47. echo -e "当前内存使用率${usage}%\r"
  48. }
  49. function cpuUsage() {
  50. usage=$(top -b -n1 | fgrep "Cpu" | awk '{print 100-$8}')
  51. echo -e "当前CPU使用率${usage}%\r"
  52. }
  53. function checkHealthy() {
  54. if mariadb-admin -uroot -hmariadb --skip-ssl ping | grep -Eqi "alive"; then
  55. echo -e "Mariadb is healthy\r"
  56. else
  57. echo -e "Mariadb is unhealthy\r"
  58. fi
  59. if [ "$(mongosh --host mongodb-primary --quiet --eval 'db.runCommand({ ping: 1 }).ok')" -eq 1 ];then
  60. echo -e "MongoDB primary is healthy\r"
  61. else
  62. echo -e "MongoDB primary is unhealthy\r"
  63. fi
  64. if [ "$(mongosh --host mongodb-secondary --quiet --eval 'db.runCommand({ ping: 1 }).ok')" -eq 1 ];then
  65. echo -e "MongoDB secondary is healthy\r"
  66. else
  67. echo -e "MongoDB secondary is unhealthy\r"
  68. fi
  69. if redis-cli -h redis ping | grep -Eqi "PONG";then
  70. echo -e "Redis is healthy\r"
  71. else
  72. echo -e "Redis is unhealthy\r"
  73. fi
  74. }
  75. #一键备份至oss
  76. #更新代码
  77. #更新数据库
  78. #initialize database
  79. function iD() {
  80. if [ -z "$DOMAIN_NAME" ]; then
  81. echo -e "无法获取域名\r"
  82. exit
  83. fi
  84. if mariadb -uroot -hmariadb --skip-ssl -e "SHOW DATABASES;" | grep "$DOMAIN_NAME" ;then
  85. echo -e "数据库 ${DOMAIN_NAME} 已存在,不允许重复初始化。\r"
  86. exit
  87. fi
  88. mariadb -uroot -hmariadb --skip-ssl -e "create database ${DOMAIN_NAME} charset utf8mb4;"
  89. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/structure.sql
  90. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/v4.sql
  91. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/data.sql
  92. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/fun.sql
  93. }
  94. #import data sql
  95. function iDS() {
  96. if [ -z "$DOMAIN_NAME" ]; then
  97. echo -e "无法获取域名\r"
  98. exit
  99. fi
  100. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/data.sql
  101. }
  102. #import clear db log sql
  103. function iCDLS() {
  104. if [ -z "$DOMAIN_NAME" ]; then
  105. echo -e "无法获取域名\r"
  106. exit
  107. fi
  108. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/clear_db_log.sql
  109. }
  110. #import database function
  111. function iDF() {
  112. if [ -z "$DOMAIN_NAME" ]; then
  113. echo -e "无法获取域名\r"
  114. exit
  115. fi
  116. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/fun.sql
  117. }
  118. #push hostname
  119. function pH() {
  120. curl -s "${API_URL}/v1/utool/ph" -X POST -d "{\"h\": \"$(hostname)\",\"d\":\"${DOMAIN_NAME}\"}"
  121. }
  122. #pull license
  123. function pL() {
  124. licContent=$(curl -s -H "Accept:text/html" "${API_URL}/api/get-license" -X POST -d "{\"h\": \"$(hostname)\",\"d\":\"${DOMAIN_NAME}\"}")
  125. if [ -z "${licContent}" ];then
  126. echo -e "无法获取授权文件"
  127. fi
  128. echo "${licContent}" > "/app/license.txt"
  129. }
  130. #pull code
  131. function pC() {
  132. git fetch --all
  133. git reset --hard
  134. git checkout -f -B master origin/master
  135. }
  136. #upgrade database
  137. function uD() {
  138. if [ -z "$DOMAIN_NAME" ]; then
  139. echo -e "无法获取域名\r"
  140. exit
  141. fi
  142. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/v4.sql
  143. }
  144. #extractTagImage
  145. function eTI() {
  146. mkdir -p /app/sapi/web/files/tag/image/
  147. wget -q -O /app/sapi/web/files/tag/default.zip http://mi.lacecdn.com/tag/default.zip
  148. unzip -q -o /app/sapi/web/files/tag/default.zip -d /app/sapi/web/files/tag/image/
  149. }
  150. #first install
  151. function fI() {
  152. if [ -f "/tmp/${DOMAIN_NAME}.lock" ];then
  153. echo -e "fI lock.\r"
  154. exit
  155. fi
  156. iD #初始化数据
  157. echo -e "\r"
  158. pH #推送主机名
  159. echo -e "\r"
  160. pDU #推送硬盘使用
  161. echo -e "\r"
  162. pL #拉取授权
  163. eTI #解压标签图片
  164. rI #运行初始化
  165. echo -e "\r"
  166. rS #运行安装
  167. echo -e "\r"
  168. iC #安装crontab任务
  169. touch "/tmp/${DOMAIN_NAME}.lock"
  170. }
  171. #restore old database
  172. function rOD() {
  173. local input
  174. local filePath;
  175. filePath="$1"
  176. if [ -f "${filePath}" ];then
  177. read -r -p "Restore OLD DB from $1? [Y/n] " input
  178. case $input in
  179. [yY][eE][sS]|[yY])
  180. bD before-restore-old-database
  181. tar -zxf "$1" -C /tmp --strip-components=5
  182. if [ -f "/tmp/lacew_mi_prod.sql" ];then
  183. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}"<"/tmp/lacew_mi_prod.sql"
  184. # shellcheck disable=SC2181
  185. if [ $? -eq 0 ]; then
  186. echo -e "Success RestoreDB mariadb: /tmp/lacew_mi_prod.sql"
  187. rm -rf "/tmp/lacew_mi_prod.sql"
  188. fi
  189. fi
  190. if [ -d "/tmp/lacew" ];then
  191. mongorestore --host mongodb-primary -d "${DOMAIN_NAME}" --drop --dir "/tmp/lacew"
  192. # shellcheck disable=SC2181
  193. if [ $? -eq 0 ]; then
  194. echo -e "Success RestoreDB mongodb: /tmp/lacew"
  195. rm -rf /tmp/lacew
  196. fi
  197. fi
  198. #清除t_edit_log
  199. iCDLS
  200. #创建函数
  201. iDF
  202. ;;
  203. [nN][oO]|[nN])
  204. echo -e "Warn deny RestoreDB"
  205. exit 0
  206. ;;
  207. *)
  208. echo -e "Invalid RestoreDB"
  209. exit 1
  210. ;;
  211. esac
  212. else
  213. echo -e "Database backup file ${filePath} not exist."
  214. fi
  215. }
  216. #restore database
  217. function rD() {
  218. local input
  219. local filePath;
  220. filePath="$1"
  221. if [ -f "${filePath}" ];then
  222. read -r -p "RestoreDB from $1? [Y/n] " input
  223. case $input in
  224. [yY][eE][sS]|[yY])
  225. bD before-restore-database
  226. tar -zxf "$1" -C /tmp --strip-components=3
  227. if [ -f "/tmp/${DOMAIN_NAME}/${DOMAIN_NAME}.sql" ];then
  228. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}"<"/tmp/${DOMAIN_NAME}/${DOMAIN_NAME}.sql"
  229. # shellcheck disable=SC2181
  230. if [ $? -eq 0 ]; then
  231. echo -e "Success RestoreDB mariadb: /tmp/${DOMAIN_NAME}/${DOMAIN_NAME}.sql"
  232. fi
  233. fi
  234. if [ -d "/tmp/${DOMAIN_NAME}/${DOMAIN_NAME}" ];then
  235. mongorestore --host mongodb-primary -d "${DOMAIN_NAME}" --drop --dir "/tmp/${DOMAIN_NAME}/${DOMAIN_NAME}"
  236. # shellcheck disable=SC2181
  237. if [ $? -eq 0 ]; then
  238. echo -e "Success RestoreDB mongodb: /tmp/${DOMAIN_NAME}/${DOMAIN_NAME}"
  239. fi
  240. fi
  241. iCDLS
  242. iDF
  243. rm -rf "/tmp/${DOMAIN_NAME}"
  244. ;;
  245. [nN][oO]|[nN])
  246. echo -e "Warn deny RestoreDB"
  247. exit 0
  248. ;;
  249. *)
  250. echo -e "Invalid RestoreDB"
  251. exit 1
  252. ;;
  253. esac
  254. else
  255. echo -e "Database backup file ${filePath} not exist."
  256. fi
  257. }
  258. #backup database
  259. function bD() {
  260. local SEED
  261. SEED=$(date +%Y-%m-%d_%H%M%S)
  262. if [[ -n $1 ]]; then
  263. SEED=$(date +%Y-%m-%d_%H%M%S-"$1")
  264. fi
  265. local baseDir="/app/data/backup/"
  266. local backupDir="/app/data/backup/${DOMAIN_NAME}/"
  267. mkdir "${backupDir}"
  268. local backupSqlFilePath
  269. backupSqlFilePath="${backupDir}${DOMAIN_NAME}.sql"
  270. echo -e "Backup sql: ${backupSqlFilePath}"
  271. mariadb-dump -uroot -hmariadb --skip-ssl --ignore-table="${DOMAIN_NAME}".t_log_edit "${DOMAIN_NAME}" >"${backupSqlFilePath}"
  272. local backupMongoDir
  273. backupMongoDir="${backupDir}"
  274. echo -e "Backup mongo: ${backupMongoDir}"
  275. if [[ ${LACEMI_QUIET} -eq 0 ]];then
  276. mongodump --host mongodb-primary -d "${DOMAIN_NAME}" -o "${backupMongoDir}"
  277. else
  278. mongodump --host mongodb-primary -d "${DOMAIN_NAME}" -o "${backupMongoDir}" > /dev/null 2>&1
  279. fi
  280. tar -zcvPf "${baseDir}${DOMAIN_NAME}_${SEED}.tar.gz" "${backupDir}" --remove-files
  281. rm -rf "$(find /app/data/backup/ -name '*.tar.gz' -mtime 30)" #删除30天前的备份文件
  282. echo -e "Success BackupDB: ${baseDir}${DOMAIN_NAME}_${SEED}.tar.gz"
  283. }
  284. function rand(){
  285. min=$1
  286. max=$(($2-$min+1))
  287. num=$(cat /proc/sys/kernel/random/uuid | cksum | awk -F ' ' '{print $1}')
  288. echo $(($num%$max+$min))
  289. }
  290. #run init
  291. function rI() {
  292. if [ -n "${DOMAIN_NAME}" ];then
  293. curl -s "http://${DOMAIN_NAME}.hlace.com/v2/tools/init?password=k2y21lR6lhfEQPdFDYD4oqrdwTDX6TMv"
  294. fi
  295. }
  296. #run setup
  297. function rS() {
  298. if [ -n "${DOMAIN_NAME}" ];then
  299. curl -s "http://${DOMAIN_NAME}.hlace.com/setup"
  300. fi
  301. }
  302. #install crontab
  303. function iC() {
  304. if [ -f /var/spool/cron/crontabs/root ];then
  305. sed -i "/\/app\/bin\/utool.sh/d" /var/spool/cron/crontabs/root
  306. fi
  307. rndMinute=$(rand 1 59)
  308. rndHour=$(rand 1 6)
  309. echo "${rndMinute} ${rndHour} * * * /app/bin/utool.sh cT" >> /var/spool/cron/crontabs/root
  310. echo -e "Success install crontab task."
  311. }
  312. #remove lock
  313. function rL() {
  314. rm -rf /tmp/*.lock
  315. }
  316. #修改php序列化方法,默认的将导致无法多终端登录
  317. #
  318. function fixBugs() {
  319. sed -i "s/session.serialize_handler = php/session.serialize_handler = php_serialize/" /opt/bitnami/php/lib/php.ini
  320. }
  321. #reset admin passwd to 123456
  322. function rAP(){
  323. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" -e "update t_user set user_password='e10adc3949ba59abbe56e057f20f883e' where user_id=1 and role_id=1;"
  324. }
  325. #crontab task
  326. function cT() {
  327. #每日3点检查硬盘使用率、证书有效期、增量备份数据库
  328. pU
  329. renewSSL
  330. bD
  331. }
  332. #export only data
  333. #仅导出数据,不导出结构,用于迁移时先导入structure.sql更新结构,再导入数据
  334. function eOD(){
  335. mariadb-dump -uroot -hmariadb --skip-ssl --no-create-info --ignore-table="$1".t_log_edit "$1" > $1.data.sql
  336. }
  337. if [ -n "$1" ];then
  338. "$1" "$2" "$3"
  339. else
  340. echo -e "Usage: "
  341. fi