utool.sh 10 KB

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