Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a0760861f0 | ||
|
|
f554f9cda4 | ||
|
|
7d6b840df5 | ||
|
|
6f71ff4131 | ||
|
|
b13e334365 | ||
|
|
a60e93e05b | ||
|
|
b902594f11 | ||
|
|
43243564cc | ||
|
|
6d16f11007 |
@@ -0,0 +1,37 @@
|
||||
# "smb" or "nfs"
|
||||
STORAGE_TYPE="nfs"
|
||||
|
||||
# ip or hostname
|
||||
S_HOST="nfs.lan"
|
||||
|
||||
# /path/to/backup
|
||||
S_PATH="/mnt/media1/backup"
|
||||
|
||||
SMB_USER="guest"
|
||||
SMB_PASS="guest"
|
||||
|
||||
LOCAL_KEEP=10
|
||||
HOST_KEEP=30
|
||||
|
||||
S_MOUNT="/tmp/share"
|
||||
|
||||
C_LIST="
|
||||
/etc/config
|
||||
/etc/xray
|
||||
/etc/unbound
|
||||
/root/.ssh
|
||||
/opt/.xray-config
|
||||
/opt/.backup-manager
|
||||
/etc/nftables.d/10-netmap.nft
|
||||
/etc/nftables.d/15-pbr-mark.nft
|
||||
/etc/hotplug.d/iface/99-xray-restart
|
||||
/etc/zabbix_agentd.conf
|
||||
/etc/dropbear
|
||||
/etc/banner
|
||||
/etc/init.d/xray
|
||||
/etc/crontabs/root
|
||||
"
|
||||
|
||||
C_EXCLUDE="/opt/.backup-manager/local_backups"
|
||||
|
||||
H_REPLACE="wpad dnsmasq"
|
||||
@@ -1 +1,2 @@
|
||||
local_backups/
|
||||
.env
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# OpenWrt Backup Manager
|
||||
# OpenWrt Backup Manager (OPKG Version)
|
||||
|
||||
Автономный набор скриптов для бэкапа и восстановления конфигурации и пакетов на OpenWrt.
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
- системных конфигов
|
||||
- пользовательских файлов
|
||||
- списка установленных пакетов (apk)
|
||||
- списка установленных пакетов (`opkg`)
|
||||
|
||||
#### Восстановление
|
||||
|
||||
@@ -17,8 +17,8 @@
|
||||
|
||||
#### Поддержка удалённого хранилища
|
||||
|
||||
- NFS
|
||||
- SMB (CIFS)
|
||||
- `NFS`
|
||||
- `SBM`
|
||||
|
||||
#### Очистка старых бэкапов (локально и удалённо)
|
||||
|
||||
@@ -26,15 +26,22 @@
|
||||
|
||||
```bash
|
||||
.
|
||||
├── .env # конфиг-файл
|
||||
├── backup-manager.sh # основной скрипт
|
||||
├── backup-configs.sh # сбор конфигураций
|
||||
├── backup-apk.sh # работа с пакетами
|
||||
├── backup-opkg.sh # работа с пакетами
|
||||
├── README.md
|
||||
```
|
||||
|
||||
## Настройка
|
||||
|
||||
Отредактируйте переменные в backup-manager.sh:
|
||||
Скопируйте пример настроек:
|
||||
|
||||
```bash
|
||||
cp ./.env-example ./.env
|
||||
```
|
||||
|
||||
Отредактируйте переменные в `.env`:
|
||||
|
||||
### Хранилище
|
||||
|
||||
@@ -96,8 +103,8 @@ H_REPLACE="wpad dnsmasq"
|
||||
|
||||
#### Что происходит:
|
||||
|
||||
- создаётся архив .tar.gz
|
||||
- сохраняется список пакетов .lst
|
||||
- создаётся архив `.tar.gz`
|
||||
- сохраняется список пакетов `.lst`
|
||||
- копируется на удалённое хранилище (если доступно)
|
||||
|
||||
### Восстановление
|
||||
@@ -120,26 +127,25 @@ H_REPLACE="wpad dnsmasq"
|
||||
- определяет пакеты, установленные пользователем
|
||||
- исключает зависимости
|
||||
|
||||
|
||||
## Зависимости
|
||||
|
||||
#### Для NFS
|
||||
|
||||
```sh
|
||||
opkg install kmod-fs-nfs kmod-fs-nfs-v3 kmod-fs-nfs-v4 nfs-utils
|
||||
```bash
|
||||
opkg install nfs-utils kmod-fs-nfs kmod-fs-nfs-v3 kmod-fs-nfs-v4
|
||||
```
|
||||
|
||||
#### Для SMB
|
||||
```sh
|
||||
opkg install kmod-fs-cifs cifs-utils
|
||||
```bash
|
||||
opkg install cifsmount kmod-fs-cifs
|
||||
```
|
||||
|
||||
## Особенности
|
||||
- Используется временная директория: /tmp
|
||||
- Используется временная директория: `/tmp`
|
||||
- При восстановлении пакетов:
|
||||
- временно правится DNS (Cloudflare)
|
||||
- Для восстановления конфигурации используется:
|
||||
```sh
|
||||
```bash
|
||||
sysupgrade -r backup.tar.gz
|
||||
```
|
||||
|
||||
@@ -147,11 +153,11 @@ sysupgrade -r backup.tar.gz
|
||||
|
||||
#### Автоматически:
|
||||
- старые локальные бэкапы
|
||||
- удалённые файлы старше HOST_KEEP дней
|
||||
- удалённые файлы старше `HOST_KEEP` дней
|
||||
|
||||
|
||||
## Пример cron
|
||||
|
||||
```sh
|
||||
```bash
|
||||
0 3 * * * /opt/.backup-manager/backup-manager.sh backup
|
||||
```
|
||||
+2
-2
@@ -2,7 +2,7 @@
|
||||
|
||||
LOCAL_FILE="$1"
|
||||
LOCAL_LST="$2"
|
||||
SCR_APK="$3"
|
||||
SCR_OPKG="$3"
|
||||
C_LIST="$4"
|
||||
H_REPLACE="$5"
|
||||
C_EXCLUDE="$6"
|
||||
@@ -12,7 +12,7 @@ C_EXCLUDE="$6"
|
||||
TMP_DIR="/tmp/backup_stack"
|
||||
rm -rf "$TMP_DIR" && mkdir -p "$TMP_DIR"
|
||||
|
||||
$SCR_APK write "$LOCAL_LST" "$H_REPLACE"
|
||||
$SCR_OPKG write "$LOCAL_LST" "$H_REPLACE"
|
||||
|
||||
echo "Included:"
|
||||
for p in $C_LIST; do
|
||||
|
||||
+17
-52
@@ -1,53 +1,20 @@
|
||||
#!/bin/sh
|
||||
|
||||
# "smb" or "nfs"
|
||||
STORAGE_TYPE="nfs"
|
||||
DIR=$(cd "$(dirname "$0")" && pwd)
|
||||
ENV_FILE="$DIR/.env"
|
||||
|
||||
# ip or hostname
|
||||
S_HOST="nfs.lan"
|
||||
|
||||
# /path/to/backup
|
||||
S_PATH="/mnt/media1/backup"
|
||||
|
||||
SMB_USER="guest"
|
||||
SMB_PASS="guest"
|
||||
|
||||
LOCAL_KEEP=10
|
||||
HOST_KEEP=30
|
||||
if [ -f "$ENV_FILE" ]; then
|
||||
. "$ENV_FILE"
|
||||
else
|
||||
echo " [!] Error: .env file not found at $ENV_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
HNAME=$(uci get system.@system[0].hostname)
|
||||
DATE=$(date +%Y-%m-%d_%H-%M)
|
||||
|
||||
S_MOUNT="/tmp/share"
|
||||
|
||||
C_LIST="
|
||||
/etc/config
|
||||
/etc/xray
|
||||
/etc/unbound
|
||||
/root/.ssh
|
||||
/opt/.xray-config
|
||||
/opt/.backup-manager
|
||||
/etc/nftables.d/10-netmap.nft
|
||||
/etc/nftables.d/15-pbr-mark.nft
|
||||
/etc/hotplug.d/iface/99-xray-restart
|
||||
/etc/zabbix_agentd.conf
|
||||
/etc/dropbear
|
||||
/etc/banner
|
||||
/etc/init.d/xray
|
||||
/etc/crontabs/root
|
||||
"
|
||||
|
||||
C_EXCLUDE="
|
||||
/opt/.backup-manager/local_backups
|
||||
"
|
||||
|
||||
H_REPLACE="wpad dnsmasq"
|
||||
|
||||
DIR=$(cd "$(dirname "$0")" && pwd)
|
||||
#DIR="/opt/.backup-manager"
|
||||
L_BACKUP_DIR="$DIR/local_backups"
|
||||
SCR_BACKUP="$DIR/backup-configs.sh"
|
||||
SCR_APK="$DIR/backup-apk.sh"
|
||||
SCR_OPKG="$DIR/backup-opkg.sh"
|
||||
|
||||
mkdir -p "$L_BACKUP_DIR"
|
||||
|
||||
@@ -71,18 +38,13 @@ check_network() {
|
||||
check_dependencies() {
|
||||
printf "Checking %s dependencies... " "$STORAGE_TYPE"
|
||||
local pkgs=""
|
||||
[ "$STORAGE_TYPE" = "nfs" ] && pkgs="kmod-fs-nfs kmod-fs-nfs-v3 kmod-fs-nfs-v4 nfs-utils"
|
||||
[ "$STORAGE_TYPE" = "smb" ] && pkgs="kmod-fs-cifs cifs-utils"
|
||||
|
||||
[ "$STORAGE_TYPE" = "nfs" ] && pkgs="nfs-utils kmod-fs-nfs kmod-fs-nfs-v3 kmod-fs-nfs-v4"
|
||||
[ "$STORAGE_TYPE" = "smb" ] && pkgs="cifsmount kmod-fs-cifs"
|
||||
local missing=""
|
||||
for pkg in $pkgs; do
|
||||
if ! apk info -e "$pkg" >/dev/null 2>&1; then
|
||||
missing="$missing $pkg"
|
||||
fi
|
||||
opkg list-installed | grep -q "^$pkg " || missing="$missing $pkg"
|
||||
done
|
||||
|
||||
if [ -n "$missing" ]; then
|
||||
echo "FAILED"
|
||||
echo " [!] Missing: $missing. Install them to use remote backup."
|
||||
return 1
|
||||
fi
|
||||
@@ -149,7 +111,7 @@ case "$1" in
|
||||
LOCAL_FILE="$L_BACKUP_DIR/backup_${HNAME}_${DATE}.tar.gz"
|
||||
LOCAL_LST="$L_BACKUP_DIR/packages_${HNAME}_${DATE}.lst"
|
||||
REMOTE_STATUS="FAILED"
|
||||
$SCR_BACKUP "$LOCAL_FILE" "$LOCAL_LST" "$SCR_APK" "$C_LIST" "$H_REPLACE" "$C_EXCLUDE"
|
||||
$SCR_BACKUP "$LOCAL_FILE" "$LOCAL_LST" "$SCR_OPKG" "$C_LIST" "$H_REPLACE" "$C_EXCLUDE"
|
||||
manage_local_backups
|
||||
if check_network && check_dependencies && mount_share; then
|
||||
printf "Copying to %s storage... " "$STORAGE_TYPE"
|
||||
@@ -198,12 +160,15 @@ case "$1" in
|
||||
if [ -n "$SELECTED_PATH" ]; then
|
||||
[ "$s_choice" -eq 2 ] && { cp "$SELECTED_PATH" /tmp/restore.tar.gz; SELECTED_PATH="/tmp/restore.tar.gz"; umount "$S_MOUNT"; }
|
||||
sysupgrade -r "$SELECTED_PATH"
|
||||
echo "Summary:"
|
||||
echo " [+] Restoring configs completed"
|
||||
echo " [!] Reboot required"
|
||||
fi
|
||||
;;
|
||||
2)
|
||||
select_file "$R_DIR" ".lst"
|
||||
if [ -n "$SELECTED_PATH" ]; then
|
||||
$SCR_APK restore "$SELECTED_PATH" "$H_REPLACE"
|
||||
$SCR_OPKG restore "$SELECTED_PATH" "$H_REPLACE"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
|
||||
Regular → Executable
+34
-18
@@ -6,11 +6,14 @@ H_REPLACE="$3"
|
||||
|
||||
[ -z "$CMD" ] || [ -z "$LOCAL_LST" ] || [ -z "$H_REPLACE" ] && echo "Missing params!" && exit 1
|
||||
|
||||
TMP_DIR="/tmp/opkg_restore"
|
||||
|
||||
fix_dns() {
|
||||
local dns1="1.1.1.1"
|
||||
local dns2="1.0.0.1"
|
||||
if ! grep -q "$dns1" /etc/resolv.conf; then
|
||||
printf "Patching DNS for restore... "
|
||||
sed -i '/^nameserver/d' /etc/resolv.conf
|
||||
sed -i "1i nameserver $dns1" /etc/resolv.conf
|
||||
sed -i "2i nameserver $dns2" /etc/resolv.conf
|
||||
echo "OK"
|
||||
@@ -18,11 +21,28 @@ fix_dns() {
|
||||
}
|
||||
|
||||
list_user_packages() {
|
||||
if [ -f /rom/etc/apk/world ]; then
|
||||
grep -v -F -x -f /rom/etc/apk/world /etc/apk/world | sed 's/=.*//'
|
||||
else
|
||||
cat /etc/apk/world | sed 's/=.*//'
|
||||
fi
|
||||
awk -f - << 'EOF'
|
||||
BEGIN {
|
||||
status_file = "/usr/lib/opkg/status"
|
||||
cmd="opkg info busybox | grep '^Installed-Time: '"
|
||||
if ((cmd | getline line) > 0) {
|
||||
FLASH_TIME = substr(line, 17)
|
||||
}
|
||||
close(cmd)
|
||||
while ((getline < status_file) > 0) {
|
||||
if ($1 == "Package:") { pkg = $2 }
|
||||
if ($1 == "Installed-Time:") {
|
||||
installed_time = $2
|
||||
if (installed_time > FLASH_TIME) {
|
||||
check_cmd = "opkg whatdepends " pkg " | wc -l"
|
||||
check_cmd | getline whatdepends
|
||||
close(check_cmd)
|
||||
if (whatdepends == 3) print pkg
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
case "$CMD" in
|
||||
@@ -42,38 +62,34 @@ case "$CMD" in
|
||||
[ ! -f /etc/resolv.conf-backup ] && cp /etc/resolv.conf /etc/resolv.conf-backup
|
||||
fix_dns
|
||||
printf "Updating package lists... "
|
||||
apk update >/dev/null 2>&1
|
||||
opkg update >/dev/null 2>&1
|
||||
echo "OK"
|
||||
|
||||
echo "Removing conflicts:"
|
||||
if [ -n "$H_REPLACE" ]; then
|
||||
local pattern=$(echo "$H_REPLACE" | sed 's/ /|/g')
|
||||
REMOVABLE=$(apk list --installed | grep -E "$pattern" | awk '{print $1}' | sed 's/-[0-9].*$//')
|
||||
REMOVABLE=$(opkg list-installed | grep -E $(echo "$H_REPLACE" | tr ' ' '|') | awk '{print $1}')
|
||||
for p in $REMOVABLE; do
|
||||
printf " [-] %s... " "$p"
|
||||
apk del "$p" >/dev/null 2>&1
|
||||
opkg remove "$p" --force-depends >/dev/null 2>&1
|
||||
echo "OK"
|
||||
done
|
||||
fi
|
||||
|
||||
echo "Installing packages:"
|
||||
for pkg in $(cat "$LOCAL_LST"); do
|
||||
if apk info -e "$pkg" >/dev/null 2>&1; then
|
||||
echo " [s] $pkg... is already installed"
|
||||
if opkg list-installed | grep -q "^$pkg "; then
|
||||
echo " [=] $pkg... is already installed"
|
||||
else
|
||||
fix_dns
|
||||
printf " [+] $pkg... "
|
||||
if apk add "$pkg" >/dev/null 2>&1; then
|
||||
if opkg install "$pkg" >/dev/null 2>&1; then
|
||||
echo "OK"
|
||||
else
|
||||
echo "FAILED"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
[ -f /etc/resolv.conf-backup ] && mv /etc/resolv.conf-backup /etc/resolv.conf
|
||||
echo "Summary:"
|
||||
echo " Restore complete"
|
||||
echo " Reboot is recommended"
|
||||
echo " [+] Restoring packages completed"
|
||||
echo " [!] Reboot required"
|
||||
;;
|
||||
esac
|
||||
esac
|
||||
Reference in New Issue
Block a user