utool.sh 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. #!/usr/bin/env bash
  2. set -e
  3. if [ -f /.dockerenv -a -z "$DOMAIN_NAME" ]; then
  4. echo -e "无法获取域名\r"
  5. exit
  6. fi
  7. function checkSSLExpire() {
  8. if [ ! -f "$1" ];then
  9. echo -e "证书$1不存在\r"
  10. exit
  11. else
  12. echo -e "检查证书$1有效期\r"
  13. fi
  14. expireDate=$(openssl x509 -in "$1" -noout -enddate)
  15. tm2=$(date -d "${expireDate:9}" +%s)
  16. tm1=$(date +%s)
  17. leftDays="$(((tm2-tm1)/3600/24))"
  18. #返回过期天数
  19. }
  20. function renewSSL() {
  21. checkSSLExpire /app/data/cert
  22. #ssl证书有效期小于10天时更新
  23. if [ "${leftDays}" -lt 10 ];then
  24. wget -O /app/data/cert http://mi.lacecdn.com/cert
  25. wget -O /app/data/key http://mi.lacecdn.com/key
  26. else
  27. echo -e "未过期,无须更新\r"
  28. fi
  29. }
  30. function diskUsage() {
  31. DISK_USAGE=$(df -h | awk '$NF=="/"{printf "%s\n", $5}' | cut -d'%' -f1)
  32. echo -e "当前硬盘使用率${DISK_USAGE}%\r"
  33. }
  34. function diskUsed() {
  35. DISK_USED=$(df -h | awk '$NF=="/"{printf "%s\n", $3}' | cut -d'G' -f1)
  36. echo -e "当前硬盘使用${DISK_USED}G\r"
  37. }
  38. function pU() {
  39. diskUsed
  40. curl -s "http://apiv2.hlace.com/v1/utool/pu" -X POST -d "{\"h\": \"$(hostname)\",\"d\":\"${DOMAIN_NAME}\",\"u\":\"${DISK_USED}\"}"
  41. }
  42. function memUsage() {
  43. usage=$(free -m | fgrep "Mem" | awk '{printf "%d", ($3)/$2*100}')
  44. echo -e "当前内存使用率${usage}%\r"
  45. }
  46. function cpuUsage() {
  47. usage=$(top -b -n1 | fgrep "Cpu" | awk '{print 100-$8}')
  48. echo -e "当前CPU使用率${usage}%\r"
  49. }
  50. function checkHealthy() {
  51. if mariadb-admin -uroot -hmariadb --skip-ssl ping | grep -Eqi "alive"; then
  52. echo -e "Mariadb is healthy\r"
  53. else
  54. echo -e "Mariadb is unhealthy\r"
  55. fi
  56. if [ "$(mongosh --host mongodb-primary --quiet --eval 'db.runCommand({ ping: 1 }).ok')" -eq 1 ];then
  57. echo -e "MongoDB primary is healthy\r"
  58. else
  59. echo -e "MongoDB primary is unhealthy\r"
  60. fi
  61. if [ "$(mongosh --host mongodb-secondary --quiet --eval 'db.runCommand({ ping: 1 }).ok')" -eq 1 ];then
  62. echo -e "MongoDB secondary is healthy\r"
  63. else
  64. echo -e "MongoDB secondary is unhealthy\r"
  65. fi
  66. if redis-cli -h redis ping | grep -Eqi "PONG";then
  67. echo -e "Redis is healthy\r"
  68. else
  69. echo -e "Redis is unhealthy\r"
  70. fi
  71. }
  72. #一键备份至oss
  73. #更新代码
  74. #更新数据库
  75. #initialize database
  76. function iD() {
  77. if [ -z "$DOMAIN_NAME" ]; then
  78. echo -e "无法获取域名\r"
  79. exit
  80. fi
  81. if mariadb -uroot -hmariadb --skip-ssl -e "SHOW DATABASES;" | grep "$DOMAIN_NAME" ;then
  82. echo -e "数据库 ${DOMAIN_NAME} 已存在,不允许重复初始化。\r"
  83. exit
  84. fi
  85. mariadb -uroot -hmariadb --skip-ssl -e "create database ${DOMAIN_NAME} charset utf8mb4;"
  86. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/structure.sql
  87. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/v32.sql
  88. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/data.sql
  89. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/fun.sql
  90. }
  91. #import data sql
  92. function iDS() {
  93. if [ -z "$DOMAIN_NAME" ]; then
  94. echo -e "无法获取域名\r"
  95. exit
  96. fi
  97. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/data.sql
  98. }
  99. #import clear db log sql
  100. function iCDLS() {
  101. if [ -z "$DOMAIN_NAME" ]; then
  102. echo -e "无法获取域名\r"
  103. exit
  104. fi
  105. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/clear_db_log.sql
  106. }
  107. #import database function
  108. function iDF() {
  109. if [ -z "$DOMAIN_NAME" ]; then
  110. echo -e "无法获取域名\r"
  111. exit
  112. fi
  113. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/fun.sql
  114. }
  115. #push hostname
  116. function pH() {
  117. curl -s "http://apiv2.hlace.com/v1/utool/ph" -X POST -d "{\"h\": \"$(hostname)\",\"d\":\"${DOMAIN_NAME}\"}"
  118. }
  119. #pull license
  120. function pL() {
  121. curl -s -H "Accept:text/html" "http://apiv2.hlace.com/v1/utool/pl" -X POST -d "{\"h\": \"$(hostname)\",\"d\":\"${DOMAIN_NAME}\"}" -o "/app/license.txt"
  122. }
  123. #pull code
  124. function pC() {
  125. git fetch --all
  126. git reset --hard
  127. git checkout -f -B master origin/master
  128. }
  129. #upgrade database
  130. function uD() {
  131. if [ -z "$DOMAIN_NAME" ]; then
  132. echo -e "无法获取域名\r"
  133. exit
  134. fi
  135. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/v3_2.sql
  136. }
  137. #extractTagImage
  138. function eTI() {
  139. mkdir -p /app/sapi/web/files/tag/image/
  140. wget -q -O /app/sapi/web/files/tag/default.zip http://mi.lacecdn.com/tag/default.zip
  141. unzip -o /app/sapi/web/files/tag/default.zip -d /app/sapi/web/files/tag/image/
  142. }
  143. #first install
  144. function fI() {
  145. iD
  146. pH
  147. pU
  148. pL
  149. eTI
  150. }
  151. #restore database
  152. function rD() {
  153. local input
  154. local filePath;
  155. filePath="$1"
  156. if [ -f "${filePath}" ];then
  157. read -r -p "RestoreDB from $1? [Y/n] " input
  158. case $input in
  159. [yY][eE][sS]|[yY])
  160. bD before-restore-database
  161. tar -zxf "$1" -C /tmp --strip-components=3
  162. if [ -f "/tmp/${DOMAIN_NAME}/${DOMAIN_NAME}.sql" ];then
  163. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}"<"/tmp/${DOMAIN_NAME}/${DOMAIN_NAME}.sql"
  164. # shellcheck disable=SC2181
  165. if [ $? -eq 0 ]; then
  166. echo -e "Success RestoreDB mariadb: /tmp/${DOMAIN_NAME}/${DOMAIN_NAME}.sql"
  167. fi
  168. fi
  169. if [ -d "/tmp/${DOMAIN_NAME}/${DOMAIN_NAME}" ];then
  170. mongorestore --host mongodb-primary -d "${DOMAIN_NAME}" --drop --dir "/tmp/${DOMAIN_NAME}/${DOMAIN_NAME}"
  171. # shellcheck disable=SC2181
  172. if [ $? -eq 0 ]; then
  173. echo -e "Success RestoreDB mongodb: /tmp/${DOMAIN_NAME}/${DOMAIN_NAME}"
  174. fi
  175. fi
  176. iCDLS
  177. iDF
  178. rm -rf "/tmp/${DOMAIN_NAME}"
  179. ;;
  180. [nN][oO]|[nN])
  181. echo -e "Warn deny RestoreDB"
  182. exit 0
  183. ;;
  184. *)
  185. echo -e "Invalid RestoreDB"
  186. exit 1
  187. ;;
  188. esac
  189. else
  190. echo -e "Database backup file ${filePath} not exist."
  191. fi
  192. }
  193. #backup database
  194. function bD() {
  195. local SEED
  196. SEED=$(date +%Y-%m-%d_%H%M%S)
  197. if [[ -n $1 ]]; then
  198. SEED=$(date +%Y-%m-%d_%H%M%S-"$1")
  199. fi
  200. local baseDir="/app/data/backup/"
  201. local backupDir="/app/data/backup/${DOMAIN_NAME}/"
  202. mkdir "${backupDir}"
  203. local backupSqlFilePath
  204. backupSqlFilePath="${backupDir}${DOMAIN_NAME}.sql"
  205. echo -e "Backup sql: ${backupSqlFilePath}"
  206. mariadb-dump -uroot -hmariadb --skip-ssl --ignore-table="${DOMAIN_NAME}".t_log_edit "${DOMAIN_NAME}" >"${backupSqlFilePath}"
  207. local backupMongoDir
  208. backupMongoDir="${backupDir}"
  209. echo -e "Backup mongo: ${backupMongoDir}"
  210. if [[ ${LACEMI_QUIET} -eq 0 ]];then
  211. mongodump --host mongodb-primary -d "${DOMAIN_NAME}" -o "${backupMongoDir}"
  212. else
  213. mongodump --host mongodb-primary -d "${DOMAIN_NAME}" -o "${backupMongoDir}" > /dev/null 2>&1
  214. fi
  215. tar -zcvPf "${baseDir}${DOMAIN_NAME}_${SEED}.tar.gz" "${backupDir}" --remove-files
  216. rm -rf "$(find /app/data/backup/ -name '*.tar.gz' -mtime 30)" #删除30天前的备份文件
  217. echo -e "Success BackupDB: ${baseDir}${DOMAIN_NAME}_${SEED}.tar.gz"
  218. }
  219. function rand(){
  220. min=$1
  221. max=$(($2-$min+1))
  222. num=$(cat /proc/sys/kernel/random/uuid | cksum | awk -F ' ' '{print $1}')
  223. echo $(($num%$max+$min))
  224. }
  225. #run setup
  226. function rS() {
  227. if [ -n "$1" ]&&[ -n "${DOMAIN_NAME}" ];then
  228. curl "http://${DOMAIN_NAME}.hlace.com/setup?key=$1"
  229. fi
  230. }
  231. #run init
  232. function rI() {
  233. if [ -n "${DOMAIN_NAME}" ];then
  234. curl "http://${DOMAIN_NAME}.hlace.com/v2/tools/init?password=k2y21lR6lhfEQPdFDYD4oqrdwTDX6TMv"
  235. fi
  236. }
  237. #install crontab
  238. function iC() {
  239. if [ -f /var/spool/cron/root ];then
  240. sed -i "/\/app\/bin\/utool/d" /var/spool/cron/crontabs/root
  241. fi
  242. rndMinute=$(rand 1 59)
  243. rndHour=$(rand 1 6)
  244. echo "${rndMinute} ${rndHour} * * * /app/bin/utool cT" >> /var/spool/cron/crontabs//root
  245. echo -e "Success install crontab task."
  246. }
  247. #crontab task
  248. function cT() {
  249. #每日3点检查硬盘使用率、证书有效期、增量备份数据库
  250. pU
  251. renewSSL
  252. bD
  253. }
  254. if [ -n "$1" ];then
  255. "$1" "$2" "$3"
  256. fi