-
Notifications
You must be signed in to change notification settings - Fork 0
/
Full_OpenWRT_MTD_Backup.sh
60 lines (46 loc) · 1.87 KB
/
Full_OpenWRT_MTD_Backup.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/opt/local/bin/bash
set -e
function die() {
echo "$@"
exit 2
}
DATE_TODAY=`date +%F`
OUTPUT_FILE="mtd_backup-$DATE_TODAY.tgz"
OPENWRT="root@waldo"
TMPDIR=$(mktemp -d)
BACKUP_DIR="$TMPDIR/mtd_backup"
mkdir -p "$BACKUP_DIR"
SSH_CONTROL="$TMPDIR/ssh_control"
function cleanup() {
set +e
echo "Closing master SSH connection"
"${SSH_CMD[@]}" -O stop
echo "Removing temporary backup files"
rm -r "$TMPDIR"
}
trap cleanup EXIT
# Open master ssh connection, to avoid the need to authenticate multiple times
echo "Opening master SSH connection"
ssh -oControlMaster=yes -oControlPath="$SSH_CONTROL" -o ControlPersist=10 -n -N "$OPENWRT"
# This is the command we'll use to reuse the master connection
SSH_CMD=(ssh -oControlMaster=no -oControlPath="$SSH_CONTROL" -n "$OPENWRT")
# List remote mtd devices from /proc/mtd. The first line is just a table
# header, so skip it (using tail)
"${SSH_CMD[@]}" 'cat /proc/mtd' | tail -n+2 | while read; do
MTD_DEV=$(echo $REPLY | cut -f1 -d:)
MTD_NAME=$(echo $REPLY | cut -f2 -d\")
echo "Backing up $MTD_DEV ($MTD_NAME)"
# It's important that the remote command only prints the actual file
# contents to stdout, otherwise our backup files will be corrupted. Other
# info must be printed to stderr instead. Luckily, this is how the dd
# command already behaves by default, so no additional flags are needed.
"${SSH_CMD[@]}" "dd if='/dev/${MTD_DEV}ro'" > "${BACKUP_DIR}/${MTD_DEV}_${MTD_NAME}.backup" || die "dd failed, aborting..."
done
# Use gzip and tar to compress the backup files
echo "Compressing backup files to \"$OUTPUT_FILE\""
(cd "$TMPDIR" && tar czf - "$(basename "$BACKUP_DIR")") > "$OUTPUT_FILE" || die 'tar failed, aborting...'
# Clean up a little earlier, so the completion message is the last thing the user sees
cleanup
# Reset signal handler
trap EXIT
echo -e "\nMTD backup complete. Extract the files using:\ntar xzf \"$OUTPUT_FILE\""