utool.sh 10 KB

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