base-files: export x86 platform upgrade functions to common.sh
Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
This commit is contained in:
		 Yousong Zhou
					Yousong Zhou
				
			
				
					committed by
					
						 Felix Fietkau
						Felix Fietkau
					
				
			
			
				
	
			
			
			 Felix Fietkau
						Felix Fietkau
					
				
			
						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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user