summaryrefslogtreecommitdiff
path: root/target/linux/x86_64/base-files/lib/preinit/79_move_config
blob: 0b9b49fee3235e53143e29cd5c212c9988f9cb76 (plain)
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
#!/bin/sh
# Copyright (C) 2012-2014 OpenWrt.org

move_config() {
	local cmdline uuid disk dev

	if read cmdline < /proc/cmdline; then
		case "$cmdline" in
			*block2mtd=*)
				disk="${cmdline##*block2mtd=}"
				disk="${disk%%,*}"
			;;
			*root=*)
				disk="${cmdline##*root=}"
				disk="${disk%% *}"
			;;
		esac

		case "$disk" in
			PARTUUID=[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]-02)
				uuid="${cmdline#PARTUUID=}"
				uuid="${uuid%-02}"
				for disk in /dev/[hsv]d[a-z]; do
					set -- $(dd if=$disk bs=1 skip=440 count=4 2>/dev/null | hexdump -v -e '4/1 "%02x "')
					if [ "$4$3$2$1" = "$uuid" ]; then
						dev="${disk}1"
						break
					fi
				done
			;;
			/dev/*)
				dev="${disk%[0-9]}1"
			;;
		esac
	fi

	if [ -n "$dev" ]; then
		mount -t ext4 -o rw,noatime "$dev" /mnt
		mv -f /mnt/sysupgrade.tgz /
		umount /mnt
	fi
}

boot_hook_add preinit_mount_root move_config