Files
OpenWRT/uci_bkp.sh
T
2026-04-26 09:46:11 +03:00

156 lines
3.7 KiB
Bash

#!/bin/bash
set -e
FILES="/etc/mosquitto /etc/bird.conf /etc/bird4.conf /etc/init.d/y_startup /etc/rc.local"
ROUTER_USER="${ROUTER_USER}"
ROUTER_PASS="${ROUTER_PASS}"
ROUTER_USER='root'
ROUTER_PASS='556667777#'
if [ -n "$ROUTER_HOSTS" ]; then
HOSTS=($ROUTER_HOSTS)
elif [ -f "hosts.txt" ]; then
mapfile -t HOSTS < hosts.txt
else
echo "No hosts specified!"
exit 1
fi
if ! command -v sshpass &> /dev/null; then
sudo apt update && sudo apt install -y sshpass
fi
if [ ! -d "bkps" ]; then
mkdir -p "./bkps"
fi
# Бэкап для каждого хоста
for HOST in "${HOSTS[@]}"; do
echo "Backing up $HOST..."
#BACKUP_NAME="wrt-bkp-$HOST-$(date +%F).sh"
BACKUP_NAME="./bkps/wrt-bkp-$HOST.sh"
echo "# [*] Creating backup on router $HOST..."
echo '' > "$BACKUP_NAME"
#sshpass -p "$ROUTER_PASS" ssh -o StrictHostKeyChecking=no $ROUTER_USER@$ROUTER_HOST << 'EOH'
sshpass -p "$ROUTER_PASS" ssh -o StrictHostKeyChecking=no -o HostKeyAlgorithms=+ssh-rsa \
"$ROUTER_USER@$HOST" \
"lFILES='$FILES'" 'sh -s' << 'EOH' >> "$BACKUP_NAME" || true
# Create OpenWRT uci-defaults file for image builder
target=$(sed -n 1p /etc/opkg/distfeeds.conf | cut -d'/' -f8)
soc=$(sed -n 1p /etc/opkg/distfeeds.conf | cut -d'/' -f9)
arch=$(sed -n 2p /etc/opkg/distfeeds.conf | cut -d'/' -f8)
model=$(cat /tmp/sysinfo/model)
profile=$(cat /tmp/sysinfo/board_name | sed 's/,/_/')
hst=$(uci get system.@system[0].hostname)
ver=$(grep DISTRIB_DESCRIPTION /etc/openwrt_release)
echo "#hostname= $hst"
echo "#$ver"
echo "#profile = $profile"
echo "#target = $target"
echo "#soc = $soc"
echo "#arch = $arch"
echo "#$model custom default settings"
gen_pack() {
echo '#----------------------------------------------------'
echo '#Generating cmd for install pkg'
echo '#----------------------------------------------------'
grep -A3 "Package:" /usr/lib/opkg/status | awk '
/Package:/ { pkg=$2 }
/Status:/ {
if ($0 ~ /user installed/) {
print "opkg install " pkg
}
}'
}
gen_conf() {
echo '#----------------------------------------------------'
echo "#Generating configuration $model"
echo '#----------------------------------------------------'
echo "uci -q batch << EOI"
for section in $(uci show 2>/dev/null | awk -F. '{print $1}' | sort -u); do
uci show "$section" | awk -F. '{print "set "$0}'
echo "commit $section"
done
echo "EOI"
# >> "$script"
#chmod 755 "$script"
#echo "Created $script".
#echo Now transfer the file to the 'files/etc/uci-defaults/' folder in your image builder directory.
}
gen_confile() {
echo '#----------------------------------------------------'
echo "#Generating conf file"
echo '#----------------------------------------------------'
_process_file() {
local file="$1"
local dir
dir=$(dirname "$file")
echo "#Gen file $file"
echo ''
echo "mkdir -p \"$dir\""
echo "cat << 'CFGEOF' > \"$file\""
cat "$file" 2>/dev/null
echo "CFGEOF"
echo ""
}
for path in $@; do
if [ -d "$path" ]; then
echo "mkdir -p \"$path\""
echo ""
# КЛЮЧЕВОЕ ИСПРАВЛЕНИЕ: -print0 + read -d ''
find "$path" -print0 | while IFS= read -r -d '' item; do
if [ -d "$item" ]; then
echo "mkdir -p \"$item\""
echo ""
elif [ -f "$item" ]; then
_process_file "$item"
fi
done
elif [ -f "$path" ]; then
_process_file "$path"
else
echo "# WARNING: $path не существует"
fi
done
}
gen_cron() {
echo '#----------------------------------------------------'
echo "#Generating cron"
echo '#----------------------------------------------------'
echo ''
crontab -l
}
gen_pack
gen_conf
gen_confile $lFILES
gen_cron
EOH
echo "# [*] Finish"
done