utool.sh 8.1 KB

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