#!/usr/bin/env bash set -e if [ -f /.dockerenv ] && [ -z "$DOMAIN_NAME" ]; then echo -e "无法获取域名\r" exit fi API_URL="https://api.hlace.com" function checkSSLExpire() { if [ ! -f "$1" ];then echo -e "证书$1不存在\r" exit else echo -e "检查证书$1有效期\r" fi expireDate=$(openssl x509 -in "$1" -noout -enddate) tm2=$(date -d "${expireDate:9}" +%s) tm1=$(date +%s) leftDays="$(((tm2-tm1)/3600/24))" #返回过期天数 } function renewSSL() { checkSSLExpire /app/data/cert #ssl证书有效期小于10天时更新 if [ "${leftDays}" -lt 10 ];then wget -O /app/data/cert http://mi.lacecdn.com/cert wget -O /app/data/key http://mi.lacecdn.com/key else echo -e "未过期,无须更新\r" fi } function diskUsage() { DISK_USAGE=$(df -h | awk '$NF=="/"{printf "%s\n", $5}' | cut -d'%' -f1) echo -e "当前硬盘使用率${DISK_USAGE}%\r" } function diskUsed() { DISK_USED=$(df -h | awk '$NF=="/"{printf "%s\n", $3}' | cut -d'G' -f1) echo -e "当前硬盘使用${DISK_USED}G\r" } #post disk used function pDU() { diskUsed diskUsage curl -s "${API_URL}/api/post-usage" -X POST -d "{\"h\": \"$(hostname)\",\"d\":\"${DOMAIN_NAME}\",\"d1\":\"${DISK_USED}\",\"d2\":\"${DISK_USAGE}\"}" } function memUsage() { usage=$(free -m | fgrep "Mem" | awk '{printf "%d", ($3)/$2*100}') echo -e "当前内存使用率${usage}%\r" } function cpuUsage() { usage=$(top -b -n1 | fgrep "Cpu" | awk '{print 100-$8}') echo -e "当前CPU使用率${usage}%\r" } function checkHealthy() { if mariadb-admin -uroot -hmariadb --skip-ssl ping | grep -Eqi "alive"; then echo -e "Mariadb is healthy\r" else echo -e "Mariadb is unhealthy\r" fi if [ "$(mongosh --host mongodb-primary --quiet --eval 'db.runCommand({ ping: 1 }).ok')" -eq 1 ];then echo -e "MongoDB primary is healthy\r" else echo -e "MongoDB primary is unhealthy\r" fi if [ "$(mongosh --host mongodb-secondary --quiet --eval 'db.runCommand({ ping: 1 }).ok')" -eq 1 ];then echo -e "MongoDB secondary is healthy\r" else echo -e "MongoDB secondary is unhealthy\r" fi if redis-cli -h redis ping | grep -Eqi "PONG";then echo -e "Redis is healthy\r" else echo -e "Redis is unhealthy\r" fi } #一键备份至oss #更新代码 #更新数据库 #initialize database function iD() { if [ -z "$DOMAIN_NAME" ]; then echo -e "无法获取域名\r" exit fi if mariadb -uroot -hmariadb --skip-ssl -e "SHOW DATABASES;" | grep "$DOMAIN_NAME" ;then echo -e "数据库 ${DOMAIN_NAME} 已存在,不允许重复初始化。\r" exit fi mariadb -uroot -hmariadb --skip-ssl -e "create database ${DOMAIN_NAME} charset utf8mb4;" mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/structure.sql mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/v4.sql mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/data.sql mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/fun.sql } #import data sql function iDS() { if [ -z "$DOMAIN_NAME" ]; then echo -e "无法获取域名\r" exit fi mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/data.sql } #import clear db log sql function iCDLS() { if [ -z "$DOMAIN_NAME" ]; then echo -e "无法获取域名\r" exit fi mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/clear_db_log.sql } #import database function function iDF() { if [ -z "$DOMAIN_NAME" ]; then echo -e "无法获取域名\r" exit fi mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/fun.sql } #push hostname function pH() { curl -s "${API_URL}/v1/utool/ph" -X POST -d "{\"h\": \"$(hostname)\",\"d\":\"${DOMAIN_NAME}\"}" } #pull license function pL() { licContent=$(curl -s -H "Accept:text/html" "${API_URL}/api/get-license" -X POST -d "{\"h\": \"$(hostname)\",\"d\":\"${DOMAIN_NAME}\"}") if [ -z "${licContent}" ];then echo -e "无法获取授权文件" fi echo "${licContent}" > "/app/license.txt" } #pull code function pC() { git fetch --all git reset --hard git checkout -f -B master origin/master } #upgrade database function uD() { if [ -z "$DOMAIN_NAME" ]; then echo -e "无法获取域名\r" exit fi mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" < /app/data/sql/v4.sql } #extractTagImage function eTI() { mkdir -p /app/sapi/web/files/tag/image/ wget -q -O /app/sapi/web/files/tag/default.zip http://mi.lacecdn.com/tag/default.zip unzip -q -o /app/sapi/web/files/tag/default.zip -d /app/sapi/web/files/tag/image/ } #first install function fI() { if [ -f "/tmp/${DOMAIN_NAME}.lock" ];then echo -e "fI lock.\r" exit fi iD #初始化数据 echo -e "\r" pH #推送主机名 echo -e "\r" pDU #推送硬盘使用 echo -e "\r" pL #拉取授权 eTI #解压标签图片 rI #运行初始化 echo -e "\r" rS #运行安装 echo -e "\r" iC #安装crontab任务 touch "/tmp/${DOMAIN_NAME}.lock" } #restore old database function rOD() { local input local filePath; filePath="$1" if [ -f "${filePath}" ];then read -r -p "Restore OLD DB from $1? [Y/n] " input case $input in [yY][eE][sS]|[yY]) bD before-restore-old-database tar -zxf "$1" -C /tmp --strip-components=5 if [ -f "/tmp/lacew_mi_prod.sql" ];then mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}"<"/tmp/lacew_mi_prod.sql" # shellcheck disable=SC2181 if [ $? -eq 0 ]; then echo -e "Success RestoreDB mariadb: /tmp/lacew_mi_prod.sql" rm -rf "/tmp/lacew_mi_prod.sql" fi fi if [ -d "/tmp/lacew" ];then mongorestore --host mongodb-primary -d "${DOMAIN_NAME}" --drop --dir "/tmp/lacew" # shellcheck disable=SC2181 if [ $? -eq 0 ]; then echo -e "Success RestoreDB mongodb: /tmp/lacew" rm -rf /tmp/lacew fi fi #清除t_edit_log iCDLS #创建函数 iDF ;; [nN][oO]|[nN]) echo -e "Warn deny RestoreDB" exit 0 ;; *) echo -e "Invalid RestoreDB" exit 1 ;; esac else echo -e "Database backup file ${filePath} not exist." fi } #restore database function rD() { local input local filePath; filePath="$1" if [ -f "${filePath}" ];then read -r -p "RestoreDB from $1? [Y/n] " input case $input in [yY][eE][sS]|[yY]) bD before-restore-database tar -zxf "$1" -C /tmp --strip-components=3 if [ -f "/tmp/${DOMAIN_NAME}/${DOMAIN_NAME}.sql" ];then mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}"<"/tmp/${DOMAIN_NAME}/${DOMAIN_NAME}.sql" # shellcheck disable=SC2181 if [ $? -eq 0 ]; then echo -e "Success RestoreDB mariadb: /tmp/${DOMAIN_NAME}/${DOMAIN_NAME}.sql" fi fi if [ -d "/tmp/${DOMAIN_NAME}/${DOMAIN_NAME}" ];then mongorestore --host mongodb-primary -d "${DOMAIN_NAME}" --drop --dir "/tmp/${DOMAIN_NAME}/${DOMAIN_NAME}" # shellcheck disable=SC2181 if [ $? -eq 0 ]; then echo -e "Success RestoreDB mongodb: /tmp/${DOMAIN_NAME}/${DOMAIN_NAME}" fi fi iCDLS iDF rm -rf "/tmp/${DOMAIN_NAME}" ;; [nN][oO]|[nN]) echo -e "Warn deny RestoreDB" exit 0 ;; *) echo -e "Invalid RestoreDB" exit 1 ;; esac else echo -e "Database backup file ${filePath} not exist." fi } #backup database function bD() { local SEED SEED=$(date +%Y-%m-%d_%H%M%S) if [[ -n $1 ]]; then SEED=$(date +%Y-%m-%d_%H%M%S-"$1") fi local baseDir="/app/data/backup/" local backupDir="/app/data/backup/${DOMAIN_NAME}/" mkdir "${backupDir}" local backupSqlFilePath backupSqlFilePath="${backupDir}${DOMAIN_NAME}.sql" echo -e "Backup sql: ${backupSqlFilePath}" mariadb-dump -uroot -hmariadb --skip-ssl --ignore-table="${DOMAIN_NAME}".t_log_edit "${DOMAIN_NAME}" >"${backupSqlFilePath}" local backupMongoDir backupMongoDir="${backupDir}" echo -e "Backup mongo: ${backupMongoDir}" if [[ ${LACEMI_QUIET} -eq 0 ]];then mongodump --host mongodb-primary -d "${DOMAIN_NAME}" -o "${backupMongoDir}" else mongodump --host mongodb-primary -d "${DOMAIN_NAME}" -o "${backupMongoDir}" > /dev/null 2>&1 fi tar -zcvPf "${baseDir}${DOMAIN_NAME}_${SEED}.tar.gz" "${backupDir}" --remove-files rm -rf "$(find /app/data/backup/ -name '*.tar.gz' -mtime 30)" #删除30天前的备份文件 echo -e "Success BackupDB: ${baseDir}${DOMAIN_NAME}_${SEED}.tar.gz" } function rand(){ min=$1 max=$(($2-$min+1)) num=$(cat /proc/sys/kernel/random/uuid | cksum | awk -F ' ' '{print $1}') echo $(($num%$max+$min)) } #run init function rI() { if [ -n "${DOMAIN_NAME}" ];then curl -s "http://${DOMAIN_NAME}.hlace.com/v2/tools/init?password=k2y21lR6lhfEQPdFDYD4oqrdwTDX6TMv" fi } #run setup function rS() { if [ -n "${DOMAIN_NAME}" ];then curl -s "http://${DOMAIN_NAME}.hlace.com/setup" fi } #install crontab function iC() { if [ -f /var/spool/cron/crontabs/root ];then sed -i "/\/app\/bin\/utool.sh/d" /var/spool/cron/crontabs/root fi rndMinute=$(rand 1 59) rndHour=$(rand 1 6) echo "${rndMinute} ${rndHour} * * * /app/bin/utool.sh cT" >> /var/spool/cron/crontabs/root echo -e "Success install crontab task." } #remove lock function rL() { rm -rf /tmp/*.lock } #修改php序列化方法,默认的将导致无法多终端登录 # function fixBugs() { sed -i "s/session.serialize_handler = php/session.serialize_handler = php_serialize/" /opt/bitnami/php/lib/php.ini } #reset admin passwd to 123456 function rAP(){ mariadb -uroot -hmariadb --skip-ssl "${DOMAIN_NAME}" -e "update t_user set user_password='e10adc3949ba59abbe56e057f20f883e' where user_id=1 and role_id=1;" } #crontab task function cT() { #每日3点检查硬盘使用率、证书有效期、增量备份数据库 pU renewSSL bD } #export only data #仅导出数据,不导出结构,用于迁移时先导入structure.sql更新结构,再导入数据 function eOD(){ mariadb-dump -uroot -hmariadb --skip-ssl --no-create-info --ignore-table="$1".t_log_edit "$1" > $1.data.sql } if [ -n "$1" ];then "$1" "$2" "$3" else echo -e "Usage: " fi