mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 22:44:27 -05:00 
			
		
		
		
	base-files: export x86 platform upgrade functions to common.sh
Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
This commit is contained in:
		
							parent
							
								
									d53fcdefbf
								
							
						
					
					
						commit
						6f61d8511e
					
				@ -206,6 +206,96 @@ get_magic_long() {
 | 
			
		||||
	(get_image "$@" | dd bs=4 count=1 | hexdump -v -n 4 -e '1/1 "%02x"') 2>/dev/null
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export_bootdevice() {
 | 
			
		||||
	local cmdline uuid disk uevent
 | 
			
		||||
	local MAJOR MINOR DEVNAME DEVTYPE
 | 
			
		||||
 | 
			
		||||
	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="${disk#PARTUUID=}"
 | 
			
		||||
				uuid="${uuid%-02}"
 | 
			
		||||
				for disk in $(find /dev -type b); 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
 | 
			
		||||
						uevent="/sys/class/block/${disk##*/}/uevent"
 | 
			
		||||
						break
 | 
			
		||||
					fi
 | 
			
		||||
				done
 | 
			
		||||
			;;
 | 
			
		||||
			/dev/*)
 | 
			
		||||
				uevent="/sys/class/block/${disk##*/}/uevent"
 | 
			
		||||
			;;
 | 
			
		||||
		esac
 | 
			
		||||
 | 
			
		||||
		if [ -e "$uevent" ]; then
 | 
			
		||||
			. "$uevent"
 | 
			
		||||
 | 
			
		||||
			export BOOTDEV_MAJOR=$MAJOR
 | 
			
		||||
			export BOOTDEV_MINOR=$MINOR
 | 
			
		||||
			return 0
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	return 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export_partdevice() {
 | 
			
		||||
	local var="$1" offset="$2"
 | 
			
		||||
	local uevent MAJOR MINOR DEVNAME DEVTYPE
 | 
			
		||||
 | 
			
		||||
	for uevent in /sys/class/block/*/uevent; do
 | 
			
		||||
		. "$uevent"
 | 
			
		||||
		if [ $BOOTDEV_MAJOR = $MAJOR -a $(($BOOTDEV_MINOR + $offset)) = $MINOR -a -b "/dev/$DEVNAME" ]; then
 | 
			
		||||
			export "$var=$DEVNAME"
 | 
			
		||||
			return 0
 | 
			
		||||
		fi
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
	return 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
get_partitions() { # <device> <filename>
 | 
			
		||||
	local disk="$1"
 | 
			
		||||
	local filename="$2"
 | 
			
		||||
 | 
			
		||||
	if [ -b "$disk" -o -f "$disk" ]; then
 | 
			
		||||
		v "Reading partition table from $filename..."
 | 
			
		||||
 | 
			
		||||
		local magic="$(hexdump -v -n 2 -s 0x1FE -e '1/2 "0x%04X"' "$disk")"
 | 
			
		||||
		if [ "$magic" != 0xAA55 ]; then
 | 
			
		||||
			v "Invalid partition table on $disk"
 | 
			
		||||
			exit
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		rm -f "/tmp/partmap.$filename"
 | 
			
		||||
 | 
			
		||||
		local part
 | 
			
		||||
		for part in 1 2 3 4; do
 | 
			
		||||
			set -- $(hexdump -v -n 12 -s "$((0x1B2 + $part * 16))" -e '3/4 "0x%08X "' "$disk")
 | 
			
		||||
 | 
			
		||||
			local type="$(($1 % 256))"
 | 
			
		||||
			local lba="$(($2))"
 | 
			
		||||
			local num="$(($3))"
 | 
			
		||||
 | 
			
		||||
			[ $type -gt 0 ] || continue
 | 
			
		||||
 | 
			
		||||
			printf "%2d %5d %7d\n" $part $lba $num >> "/tmp/partmap.$filename"
 | 
			
		||||
		done
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jffs2_copy_config() {
 | 
			
		||||
	if grep rootfs_data /proc/mtd >/dev/null; then
 | 
			
		||||
		# squashfs+jffs2
 | 
			
		||||
 | 
			
		||||
@ -4,9 +4,9 @@
 | 
			
		||||
move_config() {
 | 
			
		||||
	local partdev
 | 
			
		||||
 | 
			
		||||
	. /lib/upgrade/platform.sh
 | 
			
		||||
	. /lib/upgrade/common.sh
 | 
			
		||||
 | 
			
		||||
	if platform_export_bootdevice && platform_export_partdevice partdev 1; then
 | 
			
		||||
	if export_bootdevice && export_partdevice partdev 1; then
 | 
			
		||||
		if mount -t ext4 -o rw,noatime "/dev/$partdev" /mnt; then
 | 
			
		||||
			if [ -f /mnt/sysupgrade.tgz ]; then
 | 
			
		||||
				mv -f /mnt/sysupgrade.tgz /
 | 
			
		||||
 | 
			
		||||
@ -1,64 +1,3 @@
 | 
			
		||||
platform_export_partdevice() {
 | 
			
		||||
	local var="$1" offset="$2"
 | 
			
		||||
	local uevent MAJOR MINOR DEVNAME DEVTYPE
 | 
			
		||||
 | 
			
		||||
	for uevent in /sys/class/block/*/uevent; do
 | 
			
		||||
		. "$uevent"
 | 
			
		||||
		if [ $BOOTDEV_MAJOR = $MAJOR -a $(($BOOTDEV_MINOR + $offset)) = $MINOR -a -b "/dev/$DEVNAME" ]; then
 | 
			
		||||
			export "$var=$DEVNAME"
 | 
			
		||||
			return 0
 | 
			
		||||
		fi
 | 
			
		||||
	done
 | 
			
		||||
 | 
			
		||||
	return 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
platform_export_bootdevice() {
 | 
			
		||||
	local cmdline uuid disk uevent
 | 
			
		||||
	local MAJOR MINOR DEVNAME DEVTYPE
 | 
			
		||||
 | 
			
		||||
	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="${disk#PARTUUID=}"
 | 
			
		||||
				uuid="${uuid%-02}"
 | 
			
		||||
				for disk in $(find /dev -type b); 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
 | 
			
		||||
						uevent="/sys/class/block/${disk##*/}/uevent"
 | 
			
		||||
						break
 | 
			
		||||
					fi
 | 
			
		||||
				done
 | 
			
		||||
			;;
 | 
			
		||||
			/dev/*)
 | 
			
		||||
				uevent="/sys/class/block/${disk##*/}/uevent"
 | 
			
		||||
			;;
 | 
			
		||||
		esac
 | 
			
		||||
 | 
			
		||||
		if [ -e "$uevent" ]; then
 | 
			
		||||
			. "$uevent"
 | 
			
		||||
 | 
			
		||||
			export BOOTDEV_MAJOR=$MAJOR
 | 
			
		||||
			export BOOTDEV_MINOR=$MINOR
 | 
			
		||||
 | 
			
		||||
			return 0
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	return 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
platform_check_image() {
 | 
			
		||||
	[ "$#" -gt 1 ] && return 1
 | 
			
		||||
 | 
			
		||||
@ -74,47 +13,17 @@ platform_check_image() {
 | 
			
		||||
platform_copy_config() {
 | 
			
		||||
	local partdev
 | 
			
		||||
 | 
			
		||||
	if platform_export_partdevice partdev 1; then
 | 
			
		||||
	if export_partdevice partdev 1; then
 | 
			
		||||
		mount -t ext4 -o rw,noatime "/dev/$partdev" /mnt
 | 
			
		||||
		cp -af "$CONF_TAR" /mnt/
 | 
			
		||||
		umount /mnt
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
get_partitions() { # <device> <filename>
 | 
			
		||||
	local disk="$1"
 | 
			
		||||
	local filename="$2"
 | 
			
		||||
 | 
			
		||||
	if [ -b "$disk" -o -f "$disk" ]; then
 | 
			
		||||
		echo "Reading partition table from $filename..."
 | 
			
		||||
 | 
			
		||||
		local magic="$(hexdump -v -n 2 -s 0x1FE -e '1/2 "0x%04X"' "$disk")"
 | 
			
		||||
		if [ "$magic" != 0xAA55 ]; then
 | 
			
		||||
			echo "Invalid partition table on $disk"
 | 
			
		||||
			exit
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		rm -f "/tmp/partmap.$filename"
 | 
			
		||||
 | 
			
		||||
		local part
 | 
			
		||||
		for part in 1 2 3 4; do
 | 
			
		||||
			set -- $(hexdump -v -n 12 -s "$((0x1B2 + $part * 16))" -e '3/4 "0x%08X "' "$disk")
 | 
			
		||||
 | 
			
		||||
			local type="$(($1 % 256))"
 | 
			
		||||
			local lba="$(($2))"
 | 
			
		||||
			local num="$(($3))"
 | 
			
		||||
 | 
			
		||||
			[ $type -gt 0 ] || continue
 | 
			
		||||
 | 
			
		||||
			printf "%2d %5d %7d\n" $part $lba $num >> "/tmp/partmap.$filename"
 | 
			
		||||
		done
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
platform_do_upgrade() {
 | 
			
		||||
	local diskdev partdev ibs diff
 | 
			
		||||
 | 
			
		||||
	if platform_export_bootdevice && platform_export_partdevice diskdev 0; then
 | 
			
		||||
	if export_bootdevice && export_partdevice diskdev 0; then
 | 
			
		||||
		sync
 | 
			
		||||
		if [ "$SAVE_PARTITIONS" = "1" ]; then
 | 
			
		||||
			get_partitions "/dev/$diskdev" bootdisk
 | 
			
		||||
@ -143,7 +52,7 @@ platform_do_upgrade() {
 | 
			
		||||
 | 
			
		||||
			#iterate over each partition from the image and write it to the boot disk
 | 
			
		||||
			while read part start size; do
 | 
			
		||||
				if platform_export_partdevice partdev $part; then
 | 
			
		||||
				if export_partdevice partdev $part; then
 | 
			
		||||
					echo "Writing image to /dev/$partdev..."
 | 
			
		||||
					get_image "$@" | dd of="/dev/$partdev" ibs="$ibs" obs=1M skip="$start" count="$size" conv=fsync
 | 
			
		||||
				else
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user