utool.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  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/v32.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. if [ -z "$DOMAIN_NAME" ]; then
  125. echo -e "无法获取域名\r"
  126. exit
  127. fi
  128. licContent=$(curl -s -H "Accept:text/html" "${API_URL}/api/get-license" -X POST -d "{\"h\": \"$(hostname)\",\"d\":\"${DOMAIN_NAME}\"}")
  129. if [ -z "${licContent}" ];then
  130. echo -e "无法获取授权文件"
  131. fi
  132. echo "${licContent}" > "/app/license.txt"
  133. echo -e "更新授权成功"
  134. }
  135. #pull code
  136. function pC() {
  137. git fetch --all
  138. git reset --hard
  139. git checkout -f -B master origin/master
  140. }
  141. #upgrade database
  142. function uD() {
  143. if [ -z "$DOMAIN_NAME" ]; then
  144. echo -e "无法获取域名\r"
  145. exit
  146. fi
  147. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/v32.sql
  148. }
  149. #extractTagImage
  150. function eTI() {
  151. mkdir -p /app/sapi/web/files/tag/image/
  152. wget -q -O /app/sapi/web/files/tag/default.zip http://mi.lacecdn.com/tag/default.zip
  153. unzip -q -o /app/sapi/web/files/tag/default.zip -d /app/sapi/web/files/tag/image/
  154. }
  155. #first install
  156. function fI() {
  157. if [ -f "/tmp/${DOMAIN_NAME}.lock" ];then
  158. echo -e "fI lock.\r"
  159. exit
  160. fi
  161. iD #初始化数据
  162. echo -e "\r"
  163. pH #推送主机名
  164. echo -e "\r"
  165. pDU #推送硬盘使用
  166. echo -e "\r"
  167. pL #拉取授权
  168. eTI #解压标签图片
  169. rI #运行初始化
  170. echo -e "\r"
  171. rS #运行安装
  172. echo -e "\r"
  173. iC #安装crontab任务
  174. touch "/tmp/${DOMAIN_NAME}.lock"
  175. }
  176. #restore old database
  177. function rOD() {
  178. local input
  179. local filePath;
  180. filePath="$1"
  181. if [ -f "${filePath}" ];then
  182. read -r -p "Restore OLD DB from $1? [Y/n] " input
  183. case $input in
  184. [yY][eE][sS]|[yY])
  185. bD before-restore-old-database
  186. tar -zxf "$1" -C /tmp --strip-components=5
  187. if [ -f "/tmp/lacew_mi_prod.sql" ];then
  188. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}"<"/tmp/lacew_mi_prod.sql"
  189. # shellcheck disable=SC2181
  190. if [ $? -eq 0 ]; then
  191. echo -e "Success RestoreDB mariadb: /tmp/lacew_mi_prod.sql"
  192. rm -rf "/tmp/lacew_mi_prod.sql"
  193. fi
  194. fi
  195. if [ -d "/tmp/lacew" ];then
  196. mongorestore --host mongodb-primary -d "${DOMAIN_NAME}" --drop --dir "/tmp/lacew"
  197. # shellcheck disable=SC2181
  198. if [ $? -eq 0 ]; then
  199. echo -e "Success RestoreDB mongodb: /tmp/lacew"
  200. rm -rf /tmp/lacew
  201. fi
  202. fi
  203. #清除t_edit_log
  204. iCDLS
  205. #创建函数
  206. iDF
  207. ;;
  208. [nN][oO]|[nN])
  209. echo -e "Warn deny RestoreDB"
  210. exit 0
  211. ;;
  212. *)
  213. echo -e "Invalid RestoreDB"
  214. exit 1
  215. ;;
  216. esac
  217. else
  218. echo -e "Database backup file ${filePath} not exist."
  219. fi
  220. }
  221. #restore database
  222. function rD() {
  223. local input
  224. local filePath;
  225. filePath="$1"
  226. if [ -f "${filePath}" ];then
  227. read -r -p "RestoreDB from $1? [Y/n] " input
  228. case $input in
  229. [yY][eE][sS]|[yY])
  230. bD before-restore-database
  231. tar -zxf "$1" -C /tmp --strip-components=3
  232. if [ -f "/tmp/${DOMAIN_NAME}/${DOMAIN_NAME}.sql" ];then
  233. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}"<"/tmp/${DOMAIN_NAME}/${DOMAIN_NAME}.sql"
  234. # shellcheck disable=SC2181
  235. if [ $? -eq 0 ]; then
  236. echo -e "Success RestoreDB mariadb: /tmp/${DOMAIN_NAME}/${DOMAIN_NAME}.sql"
  237. fi
  238. fi
  239. if [ -d "/tmp/${DOMAIN_NAME}/${DOMAIN_NAME}" ];then
  240. mongorestore --host mongodb-primary -d "${DOMAIN_NAME}" --drop --dir "/tmp/${DOMAIN_NAME}/${DOMAIN_NAME}"
  241. # shellcheck disable=SC2181
  242. if [ $? -eq 0 ]; then
  243. echo -e "Success RestoreDB mongodb: /tmp/${DOMAIN_NAME}/${DOMAIN_NAME}"
  244. fi
  245. fi
  246. iCDLS
  247. iDF
  248. rm -rf "/tmp/${DOMAIN_NAME}"
  249. ;;
  250. [nN][oO]|[nN])
  251. echo -e "Warn deny RestoreDB"
  252. exit 0
  253. ;;
  254. *)
  255. echo -e "Invalid RestoreDB"
  256. exit 1
  257. ;;
  258. esac
  259. else
  260. echo -e "Database backup file ${filePath} not exist."
  261. fi
  262. }
  263. #backup database
  264. function bD() {
  265. local SEED
  266. SEED=$(date +%Y-%m-%d_%H%M%S)
  267. if [[ -n $1 ]]; then
  268. SEED=$(date +%Y-%m-%d_%H%M%S-"$1")
  269. fi
  270. local baseDir="/app/data/backup/"
  271. local backupDir="/app/data/backup/${DOMAIN_NAME}/"
  272. mkdir "${backupDir}"
  273. local backupSqlFilePath
  274. backupSqlFilePath="${backupDir}${DOMAIN_NAME}.sql"
  275. echo -e "Backup sql: ${backupSqlFilePath}"
  276. mariadb-dump -uroot -hmariadb --skip-ssl --ignore-table="${DOMAIN_NAME}".t_log_edit "${DOMAIN_NAME}" >"${backupSqlFilePath}"
  277. local backupMongoDir
  278. backupMongoDir="${backupDir}"
  279. echo -e "Backup mongo: ${backupMongoDir}"
  280. if [[ ${LACEMI_QUIET} -eq 0 ]];then
  281. mongodump --host mongodb-primary -d "${DOMAIN_NAME}" -o "${backupMongoDir}"
  282. else
  283. mongodump --host mongodb-primary -d "${DOMAIN_NAME}" -o "${backupMongoDir}" > /dev/null 2>&1
  284. fi
  285. tar -zcvPf "${baseDir}${DOMAIN_NAME}_${SEED}.tar.gz" "${backupDir}" --remove-files
  286. rm -rf "$(find /app/data/backup/ -name '*.tar.gz' -mtime 30)" #删除30天前的备份文件
  287. echo -e "Success BackupDB: ${baseDir}${DOMAIN_NAME}_${SEED}.tar.gz"
  288. }
  289. function rand(){
  290. min=$1
  291. max=$(($2-$min+1))
  292. num=$(cat /proc/sys/kernel/random/uuid | cksum | awk -F ' ' '{print $1}')
  293. echo $(($num%$max+$min))
  294. }
  295. #run init
  296. function rI() {
  297. if [ -n "${DOMAIN_NAME}" ];then
  298. curl -s "http://${DOMAIN_NAME}.hlace.com/v2/tools/init?password=k2y21lR6lhfEQPdFDYD4oqrdwTDX6TMv"
  299. fi
  300. }
  301. #run setup
  302. function rS() {
  303. if [ -n "${DOMAIN_NAME}" ];then
  304. curl -s "http://${DOMAIN_NAME}.hlace.com/setup"
  305. fi
  306. }
  307. #install crontab
  308. function iC() {
  309. if [ -f /var/spool/cron/crontabs/root ];then
  310. sed -i "/\/app\/bin\/utool.sh/d" /var/spool/cron/crontabs/root
  311. fi
  312. rndMinute=$(rand 1 59)
  313. rndHour=$(rand 1 6)
  314. echo "${rndMinute} ${rndHour} * * * /app/bin/utool.sh cT" >> /var/spool/cron/crontabs/root
  315. echo -e "Success install crontab task."
  316. }
  317. #remove lock
  318. function rL() {
  319. rm -rf /tmp/*.lock
  320. }
  321. #修改php序列化方法,默认的将导致无法多终端登录
  322. #
  323. function fixBugs() {
  324. sed -i "s/session.serialize_handler = php/session.serialize_handler = php_serialize/" /opt/bitnami/php/lib/php.ini
  325. }
  326. #reset admin passwd to 123456
  327. function rAP(){
  328. mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" -e "update t_user set user_password='e10adc3949ba59abbe56e057f20f883e' where user_id=1 and role_id=1;"
  329. }
  330. #crontab task
  331. function cT() {
  332. #每日3点检查硬盘使用率、证书有效期、增量备份数据库
  333. pDU
  334. renewSSL
  335. bD
  336. }
  337. #export only data
  338. #仅导出数据,不导出结构,用于迁移时先导入structure.sql更新结构,再导入数据
  339. function eOD(){
  340. mariadb-dump -uroot -hmariadb --skip-ssl --no-create-info --ignore-table="$1".t_log_edit "$1" > $1.data.sql
  341. }
  342. if [ -n "$1" ];then
  343. "$1" "$2" "$3"
  344. else
  345. echo -e "Usage: "
  346. fi