#!/bin/bash # Created by: zack.zhu@aloudata.com # Created at: 2025-12-03 # Version: 1.0.0 # Description: This script is used to backup the files to the rsync server source /etc/profile >/dev/null 2>&1 # ------------------------------------------------------- # Config # ------------------------------------------------------- RSYNC_SERVER="10.5.20.80" # rsync 服务端 IP(请修改) RSYNC_MODULE="backup" # RSYNC_USER="backup" # RSYNC_PASSWORD="password123" # 钉钉机器人 Webhook(必填) DING_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=c2e257f65f008938a1e70812cd371430435655f42361b6623d6b664c645c784e" # ------------------------------------------------------- # 打印日志 # ------------------------------------------------------- function logMsg() { local STATUS="$1" local MSG="$2" if [ "$1" = "0" ]; then local TAG="INFO" elif [ "$1" = "1" ]; then local TAG="ERROR" echo -e "\e[31m[$(date '+%Y-%m-%d %T.%N')][${TAG}] $MSG\e[0m" #>>$LOGFILE return elif [ "$1" = "2" ]; then local TAG="WARN" else local TAG="INFO" local MSG="$1" fi echo "[$(date '+%Y-%m-%d %T.%N')][${TAG}] $MSG" #>>$LOGFILE } # ------------------------------------------------------- # 安装backup命令 # ------------------------------------------------------- function install_backup_command() { local BACKUP_URL="http://10.5.20.30:8081/poc_middleware/scripts/install_backup_command.sh" logMsg "Installing backup command from $BACKUP_URL" curl -f -s -L "$BACKUP_URL" -o /usr/local/sbin/backup if [ $? -ne 0 ]; then logMsg 1 "Cannot install backup command" return 1 fi chmod +x /usr/local/sbin/backup logMsg "Backup command installed successfully" return 0 } # ------------------------------------------------------- # 钉钉通知函数(失败通知) # ------------------------------------------------------- function ding_notify() { local MSG="$1" curl -f -s -H "Content-Type: application/json" \ -d "{\"msgtype\": \"text\", \"text\": {\"content\": \"【备份失败】\n${MSG}\"}}" \ "$DING_WEBHOOK" >/dev/null 2>&1 return $? } # ------------------------------------------------------- # 检查服务器是否有jq命令 # ------------------------------------------------------- function check_jq_rsync() { if command -v jq &> /dev/null; then local JQ_INSTALLED=0 else local JQ_INSTALLED=1 fi if command -v rsync &> /dev/null; then local RSYNC_INSTALLED=0 else local RSYNC_INSTALLED=1 fi if [ "$JQ_INSTALLED" = "0" -a "$RSYNC_INSTALLED" = "0" ]; then return 0 fi # 安装jq命令, 根据系统架构下载不同架构的jq local ARCH=$(uname -m) if [ "$ARCH" = "x86_64" ]; then local JQ_URL="http://10.5.20.30:8081/poc_middleware/x86/jq" local RSYNC_URL="http://10.5.20.30:8081/poc_middleware/x86/rsync" elif [ "$ARCH" = "aarch64" ]; then local JQ_URL="http://10.5.20.30:8081/poc_middleware/arm/jq" local RSYNC_URL="http://10.5.20.30:8081/poc_middleware/arm/rsync" else logMsg 1 "Unsupported architecture: $ARCH" exit 1 fi if [ "$JQ_INSTALLED" = "1" ]; then curl -f -s -L "$JQ_URL" -o /usr/local/sbin/jq if [ $? -ne 0 ]; then logMsg 1 "Cannot install jq command" exit 1 fi chmod +x /usr/local/sbin/jq fi if [ "$RSYNC_INSTALLED" = "1" ]; then curl -f -s -L "$RSYNC_URL" -o /usr/local/sbin/rsync if [ $? -ne 0 ]; then logMsg 1 "Cannot install rsync command" exit 1 fi chmod +x /usr/local/sbin/rsync fi return 0 } # ------------------------------------------------------- # 获取本机IP # ------------------------------------------------------- function get_local_ip() { local RESPONSE=$(curl -s "http://${RSYNC_SERVER}:8000/client_ip") local STATUS=$(echo $RESPONSE |jq -r '.status' 2>/dev/null) if [ "$STATUS" = "true" ]; then local IP=$(echo $RESPONSE |jq -r '.client_ip' 2>/dev/null) if [ ! -z "$IP" ]; then echo "$IP" return 0 fi fi logMsg 1 "Cannot get local IP" ding_notify "ERROR: Cannot get local IP, HOSTNAME: $(hostname)" exit 1 } # ------------------------------------------------------- # 在备份服务器创建备份目录 # ------------------------------------------------------- function get_backup_dir() { local RESPONSE=$(curl -s "http://${RSYNC_SERVER}:8000/make_backup_dir") local STATUS=$(echo $RESPONSE |jq -r '.status' 2>/dev/null) if [ "$STATUS" = "true" ]; then local DIRECTORY=$(echo $RESPONSE |jq -r '.directory' 2>/dev/null) if [ ! -z "$DIRECTORY" ]; then echo "$DIRECTORY" return 0 fi fi logMsg 1 "Create backup directory failed, IP: ${LOCAL_IP}" ding_notify "ERROR: Create backup directory failed, IP: ${LOCAL_IP}" return 1 } # ------------------------------------------------------- # 执行Rsync备份 # ------------------------------------------------------- function rsync_backup() { local TARGET="$1" local REMOTE_PATH="$2" rsync -av --delete \ "$TARGET" \ ${RSYNC_SERVER}::${RSYNC_MODULE}${REMOTE_PATH} if [ $? -ne 0 ]; then ERR_MSG="客户端IP:$LOCAL_IP 时间:$(date '+%F %T') 备份目录:$TARGET 服务端:$RSYNC_SERVER::$RSYNC_MODULE 错误:rsync 返回失败,请检查网络或服务端。" logMsg 1 "Backup failed for $TARGET" ding_notify "$ERR_MSG" return 1 fi return 0 } # ------------------------------------------------------- # 参数校验 # ------------------------------------------------------- COMMAND="$(basename $0)" if [ "$COMMAND" = "bash" -o "$COMMAND" = "sh" -o "$COMMAND" = "install_backup_command.sh" ]; then install_backup_command exit $? fi # ------------------------------------------------------- # 检查环境所需的软件是否安装 # ------------------------------------------------------- check_jq_rsync || exit 1 LOCAL_IP="$(get_local_ip)" if [ $? -ne 0 ]; then exit 1 fi if [ $# -lt 1 ]; then echo "Usage: $0 [dir2] ..." ding_notify "ERROR: 备份命令传入的参数错误, 请检查参数是否正确, IP: ${LOCAL_IP}" exit 1 fi # ------------------------------------------------------- # 执行备份(循环每个目录) # ------------------------------------------------------- CREATE_BACKUP_DIR="$(get_backup_dir)" if [ $? -ne 0 ]; then exit 1 fi RETURN_CODE=0 for TARGET in "$@"; do logMsg "Backing up: $TARGET to [${RSYNC_MODULE}]:${CREATE_BACKUP_DIR}" rsync_backup "$TARGET" "${CREATE_BACKUP_DIR}" if [ $? -ne 0 ]; then RETURN_CODE=1 fi done logMsg "Backup finished" exit $RETURN_CODE