目的:
两个脚本配合使用。 永久修改 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