<QNAP 453D QTS-5.x> 日志记录: 更新 update_crontab.sh 为了新脚本 cron_default_route_changed.sh 去支持多条目 (修改与添加)

目的:

两个脚本配合使用。 永久修改 NAS 默认路由 (cron_default_route_changed.sh ),每 6 小时执行内存清理以提升性能。

主要是为了备份脚本,误删时可以找回文件。

1. 脚本 cron_default_route_changed.sh 

功能:

  • 检测当前 NAS 的默认路由,如果不是 wgc3003,改为 wgc3003
  • 检测外部 IP 是否效
  • 验证修改成功
  • 日志记录过程
  • 清除 1 周前日志
  • 另外,使用变量定义的 默认路由 与 wgc3003 修改时方便

内容:

#!/bin/bash
# Create by Dave on 24Jan2025
# This script changes the default route to a specified device if the current default route is 192.168.1.254
# Version 0.2
# History:
# 24Jan2025 Dave - Initial script
# 24Jan2025 Dave - Added external IP check
# 24Jan2025 Dave - Added log file age check
# 24Jan2025 Dave - Added route verification
# 24Jan2025 Dave - Added route device validation
# 24Jan2025 Dave - Added new external IP check after route change

# Configuration
ROUTE_DEVICE="wgc3003"
DEFAULT_GATEWAY="192.168.1.254"
LOG_FILE="/share/Multimedia/2024-MyProgramFiles/29.QTS_conf_files/log/cron_default_route_changed.log"

# Validate route device name 
if [[ ! $ROUTE_DEVICE =~ ^[a-zA-Z0-9_-]+$ ]]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Error: Invalid route device name" >> "$LOG_FILE"
    exit 1
fi

log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}

# Create log directory if missing
log_dir=$(dirname "$LOG_FILE")
mkdir -p "$log_dir"

# Check log file age and clear if older than 1 week
if [ -f "$LOG_FILE" ]; then
    file_age=$(($(date +%s) - $(date +%s -r "$LOG_FILE")))
    if [ $file_age -gt 604800 ]; then
        echo "" >| "$LOG_FILE"
        log_message "Log file cleared - age exceeded 1 week"
    fi
fi

echo "===============================================" >> "$LOG_FILE"
log_message "Script execution started"
log_message "Using route device: $ROUTE_DEVICE"

default_route=$(ip route | grep default | awk '{print $3}')

if [ "$default_route" = "$DEFAULT_GATEWAY" ]; then
    log_message "Current default route is $DEFAULT_GATEWAY"
    
    if ip route | grep -q "$ROUTE_DEVICE"; then
        log_message "$ROUTE_DEVICE found in route list"
        
        external_ip=$(curl -s --max-time 10 ifconfig.me)
        if [ -z "$external_ip" ]; then
            log_message "Error: Failed to get external IP - empty response"
            exit 1
        fi

        if ! [[ $external_ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
            log_message "Error: Invalid external IP format: $external_ip"
            exit 1
        fi

        log_message "External IP: $external_ip"
        
        if ! sudo ip route del default via "$DEFAULT_GATEWAY"; then
            log_message "Error: Failed to delete default route"
            exit 1
        fi
        
        if ! sudo ip route add default dev $ROUTE_DEVICE; then
            log_message "Error: Failed to add new default route"
            # Try to restore original route
            sudo ip route add default via "$DEFAULT_GATEWAY"
            exit 1
        fi
        
        # Verify route change
        if ! ip route | grep -q "default dev $ROUTE_DEVICE"; then
            log_message "Error: Failed to verify new default route"
            sudo ip route add default via "$DEFAULT_GATEWAY"
            exit 1
        fi
        
        # Check new external IP after route change
        sleep 2  # Wait for route change to take effect
        new_external_ip=$(curl -s --max-time 10 ifconfig.me)
        if [ -z "$new_external_ip" ]; then
            log_message "Warning: Failed to get new external IP after route change"
        else
            log_message "New external IP after route change: $new_external_ip"
        fi
        
        log_message "Default route changed to $ROUTE_DEVICE"
    else
        log_message "Error: $ROUTE_DEVICE not found in route list"
        exit 1
    fi
else
    log_message "Error: Default route is not $DEFAULT_GATEWAY (current: $default_route)"
    exit 1
fi

log_message "Script execution finished"
echo "===============================================" >> "$LOG_FILE"

2. 脚本 update_crontab.sh

功能:

  • 检查并添加两个定时任务 :
    • 每6小时运行 flush_memory.sh
    • 每30分钟运行 cron_default_route_changed.sh
  • 备份当前crontab
  • 检查每个任务:如有缺失则添加
  • 更改后会重新加载 cron 服务
  • 日志记录

内容:

#!/bin/bash
# Updated by Dave on 24Jan2025
# ver. 1.3
# History:
# Updated crontab for flush_memory.sh for to run it in every 6 hours
# on 24Jan.2025 Added every 30 minutes to execute cron_default_route_changed.sh script
# on 24Jan.2025 Improved script: the error handling and processing every entry individually.

# Variables
LOG_FILE="/share/Multimedia/2024-MyProgramFiles/29.QTS_conf_files/log/update_crontab.log"
CRONTAB_FILE="/etc/config/crontab"
BACKUP_DIR="/share/Multimedia/2024-MyProgramFiles/29.QTS_conf_files/backup_files"
FLUSH_MEMORY_ENTRY="0 */6 * * * /etc/init.d/flush_memory.sh >/dev/null 2>&1"
ROUTE_CHECK_ENTRY="*/30 * * * * /share/Multimedia/2024-MyProgramFiles/29.QTS_conf_files/cron/cron_default_route_changed.sh >/dev/null 2>&1"

log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}

handle_error() {
    local error_msg="$1"
    log_message "ERROR: $error_msg"
    [ -f "$TMP_CRONTAB" ] && rm -f "$TMP_CRONTAB"
    [ -f "${CRONTAB_FILE}.old" ] && rm -f "${CRONTAB_FILE}.old"
    exit 1
}

check_prerequisites() {
    [ ! -w "$CRONTAB_FILE" ] && handle_error "No write permission to $CRONTAB_FILE"
    [ ! -d "$BACKUP_DIR" ] && mkdir -p "$BACKUP_DIR"
    [ ! -d "$(dirname "$LOG_FILE")" ] && mkdir -p "$(dirname "$LOG_FILE")"
}

update_single_entry() {
    local entry="$1"
    local entry_name="$2"
    local needs_update=0
    
    if ! grep -Fx "$entry" "$CRONTAB_FILE" > /dev/null; then
        log_message "Adding $entry_name entry"
        echo "$entry" >> "$CRONTAB_FILE"
        needs_update=1
    else
        log_message "$entry_name entry already exists"
    fi
    
    return $needs_update
}

verify_entry() {
    local entry="$1"
    local entry_name="$2"
    
    if ! grep -Fx "$entry" "$CRONTAB_FILE" > /dev/null; then
        log_message "ERROR: Could not verify $entry_name entry"
        return 1
    fi
    return 0
}

# Start script execution
log_message "======================"
log_message "Starting crontab update"

check_prerequisites

# Create backup
BACKUP_FILE="${BACKUP_DIR}/crontab.bak.$(date +%Y%m%d_%H%M%S)"
cp "$CRONTAB_FILE" "$BACKUP_FILE" || handle_error "Failed to create backup"
log_message "Created backup: $BACKUP_FILE"

# Update entries individually
needs_reload=0
update_single_entry "$FLUSH_MEMORY_ENTRY" "flush_memory" && needs_reload=1
update_single_entry "$ROUTE_CHECK_ENTRY" "route_check" && needs_reload=1

# Reload cron if needed
if [ $needs_reload -eq 1 ]; then
    log_message "Reloading cron service..."
    if ! /etc/init.d/crond.sh reload > /dev/null 2>&1; then
        log_message "WARNING: Failed to reload cron service"
        cp "$BACKUP_FILE" "$CRONTAB_FILE"
        handle_error "Changes reverted due to reload failure"
    fi
    log_message "Successfully reloaded cron service"

    # Verify updates
    verify_entry "$FLUSH_MEMORY_ENTRY" "flush_memory" || handle_error "Verification failed"
    verify_entry "$ROUTE_CHECK_ENTRY" "route_check" || handle_error "Verification failed"
    
    if ! ps aux | grep -q "[c]rond"; then
        log_message "WARNING: Cron service appears to be inactive"
    fi
else
    log_message "No changes needed"
fi

log_message "Crontab update completed"
log_message "======================"
exit 0

tail -f /share/Multimedia/2024-MyProgramFiles/29.QTS_conf_files/log/update_crontab.log

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值