-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathheart-drive.sh
93 lines (71 loc) · 2.29 KB
/
heart-drive.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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/bin/bash
set -e
die() {
echo -e $1
exit 1
}
usage() {
echo Usages:
echo "$0 --write-image <so image> <device target> <bkp_file>"
echo "$0 --restore-partitions <device target> <bkp_file>"
}
restore() {
TARGET_DEVICE=$1
BKP_FILE=$2
test -e $BKP_FILE || die "Backup file not found [$BKP_FILE]."
read -p "Restoring [$BKP_FILE] to [$TARGET_DEVICE]. Is that right? Confirm typing yes uppercase: " conf
if [[ "$conf" == "YES" ]]; then
dd if=$BKP_FILE of=$TARGET_DEVICE
sync
else
echo "Aborting."
exit 0
fi
echo "Done."
exit 0
}
write_image() {
[[ $# -ne 3 ]] && { usage; die "Missing arguments"; };
IMAGE=$1
TARGET_DEVICE=$2
IMAGES_MNT_DIR=`findmnt ${TARGET_DEVICE}2 | tail -n 1 | awk '{print $1}'`
RAMDISK_MNT_DIR=/mnt/ramdisk_magicbooter
BKP_FILE=$3
test -e $IMAGES_MNT_DIR/$IMAGE || die "$IMAGE not found."
test -e $IMAGES_MNT_DIR/i_am_the_magical_booter.dummyfile || die "Target $TARGET_DEVICE is invalid."
test -e $BKP_FILE && die "Backup [$BKP_FILE] file exists. Please remove it first or provide another one."
IMAGE_SIZE=`stat --print=%s $IMAGES_MNT_DIR/$IMAGE`
[[ $IMAGE_SIZE -ge 5242880000 ]] && die "Image file is too large. Cannot proceed [$IMAGE: $IMAGE_SIZE >= 5242880000]."
#[[ "fuser $IMAGES_MNT_DIR 2>&1" != "" ]] || { fuser -vc $IMAGES_MNT_DIR; die "$IMAGES_MNT_DIR is busy. Note: you cannot run this script directly from magic thumb drive."; }
#echo yay
#exit 0
echo "Backing up $TARGET_DEVICE first 2048 sectors to $BKP_FILE"
dd if=$TARGET_DEVICE of=$BKP_FILE bs=2048 count=512
echo "Creating ramdisk at [$RAMDISK_MNT_DIR]"
mkdir $RAMDISK_MNT_DIR
mount -t tmpfs -o size=5100m tmpfs $RAMDISK_MNT_DIR
echo "Copying [$IMAGE] to [$RAMDISK_MNT_DIR]"
cp "$IMAGES_MNT_DIR/$IMAGE" "$RAMDISK_MNT_DIR/$IMAGE"
sync
echo "Unmounting umount ${TARGET_DEVICE}2"
umount ${TARGET_DEVICE}2
sync
echo "dding $RAMDISK_MNT_DIR/$IMAGE to $TARGET_DEVICE"
read -p "Is that right? Confirm typing yes uppercase: " conf
if [[ "$conf" == "YES" ]]; then
dd if=$RAMDISK_MNT_DIR/$IMAGE of=$TARGET_DEVICE
sync
else
echo "Aborting"
fi
umount $RAMDISK_MNT_DIR
rmdir $RAMDISK_MNT_DIR
echo "Done"
exit 0
}
[[ $EUID -ne 0 ]] && die "Run as root or using sudo."
case "$1" in
--restore-partitions) shift; restore $@;;
--write-image) shift; write_image $@;;
*) usage; exit 0;;
esac