Skip to contentSkip to conversation

script fixes

PATCH New Paul Eggleton 1 participant 5 messages Jul 2, 2019

lore
Share & tools
lore
#0 lore raw

cover script fixes

A few minor fixes for the ddimage script and one for list-packageconfig-flags.

The following changes since commit 1f8a73261c7a134821c40845da27d8edbb0763b6:

Revert "pigz: Add debug for autobuilder errors" (2019-06-30 23:33:12 +0100)

are available in the Git repository at:

git://git.openembedded.org/openembedded-core-contrib paule/ddimage-fixes2
http://cgit.openembedded.org/openembedded-core-contrib/log/?h=paule/ddimage-fixes2

Paul Eggleton (4):
scripts/contrib/ddimage: fix typo scripts/contrib/ddimage: replace blacklist with mount check scripts/contrib/ddimage: be explicit whether device doesn't exist or
isn't writeable
list-packageconfig-flags: print PN instead of P

 scripts/contrib/ddimage                     | 89 +++++++++++++++++----
 scripts/contrib/list-packageconfig-flags.py |  2 +-
 2 files changed, 75 insertions(+), 16 deletions(-)
Signature · 1 line
2.20.1
#1 lore raw

PATCH 1/4 scripts/contrib/ddimage: fix typo

UNKOWN -> UNKNOWN

---
 scripts/contrib/ddimage | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/contrib/ddimage +1 -1
index b577d1ca2ab..01ff4318514 100755
@@ -49,7 +49,7 @@ device_details() {
 	if [ -f "/sys/class/block/$DEV/device/vendor" ]; then
 		echo "  vendor: $(cat /sys/class/block/$DEV/device/vendor)"
 	else
-		echo "  vendor: UNKOWN"
+		echo "  vendor: UNKNOWN"
 	fi
 	if [ -f "/sys/class/block/$DEV/device/model" ]; then
 		echo "   model: $(cat /sys/class/block/$DEV/device/model)"
Signature · 1 line
2.20.1
#2 lore raw

PATCH 2/4 scripts/contrib/ddimage: replace blacklist with mount check

In reply to Paul Eggleton

The blacklist, whilst previously useful for safety, is now becoming obsolete - on my current system, the main storage is at /dev/nvme* and if I plug in a USB stick it shows up as /dev/sdb which was previously blacklisted. To make this more flexible, remove the blacklist and instead check if the specified device is mounted, has a partition that is mounted, or is otherwise in use according to the kernel, and show an appropriate error and quit if so.

To make this robust, also ensure we handle where the specified device is a symlink to another device.

---
 scripts/contrib/ddimage | 80 ++++++++++++++++++++++++++++++++++-------
 1 file changed, 67 insertions(+), 13 deletions(-)
scripts/contrib/ddimage +67 -13
index 01ff4318514..a7dc5f7487b 100755
@@ -3,10 +3,6 @@
 # SPDX-License-Identifier: GPL-2.0-only
 #
 
-# Default to avoiding the first two disks on typical Linux and Mac OS installs
-# Better safe than sorry :-)
-BLACKLIST_DEVICES="/dev/sda /dev/sdb /dev/disk1 /dev/disk2"
-
 # 1MB blocksize
 BLOCKSIZE=1048576
 
@@ -32,7 +28,6 @@ image_details() {
 }
 
 device_details() {
-	DEV=$1
 	BLOCK_SIZE=512
 
 	echo "Device details"
@@ -45,7 +40,13 @@ device_details() {
 	fi
 
 	# Default / Linux information collection
-	echo "  device: $DEVICE"
+	ACTUAL_DEVICE=`readlink -f $DEVICE`
+	DEV=`basename $ACTUAL_DEVICE`
+	if [ "$ACTUAL_DEVICE" != "$DEVICE" ] ; then
+		echo "  device: $DEVICE -> $ACTUAL_DEVICE"
+	else
+		echo "  device: $DEVICE"
+	fi
 	if [ -f "/sys/class/block/$DEV/device/vendor" ]; then
 		echo "  vendor: $(cat /sys/class/block/$DEV/device/vendor)"
 	else
@@ -64,6 +65,49 @@ device_details() {
 	echo ""
 }
 
+check_mount_device() {
+	if cat /proc/self/mounts | awk '{ print $1 }' | grep /dev/ | grep -q -E "^$1$" ; then
+		return 0
+	fi
+	return 1
+}
+
+is_mounted() {
+	if [ "$(uname)" = "Darwin" ]; then
+		if df | awk '{ print $1 }' | grep /dev/ | grep -q -E "^$1(s[0-9]+)?$" ; then
+			return 0
+		fi
+	else
+		if check_mount_device $1 ; then
+			return 0
+		fi
+		DEV=`basename $1`
+		if [ -d /sys/class/block/$DEV/ ] ; then
+			PARENT_BLKDEV=`basename $(readlink -f "/sys/class/block/$DEV/..")`
+			if [ "$PARENT_BLKDEV" != "block" ] ; then
+				if check_mount_device $PARENT_BLKDEV ; then
+					return 0
+				fi
+			fi
+			for CHILD_BLKDEV in `find /sys/class/block/$DEV/ -mindepth  1 -maxdepth 1 -name "$DEV*" -type d`
+			do
+				if check_mount_device /dev/`basename $CHILD_BLKDEV` ; then
+					return 0
+				fi
+			done
+		fi
+	fi
+	return 1
+}
+
+is_inuse() {
+	HOLDERS_DIR="/sys/class/block/`basename $1`/holders"
+	if [ -d $HOLDERS_DIR ] && [ `ls -A $HOLDERS_DIR` ] ; then
+		return 0
+	fi
+	return 1
+}
+
 if [ $# -ne 2 ]; then
 	usage
 	exit 1
@@ -78,13 +122,23 @@ if [ ! -e "$IMAGE" ]; then
 	exit 1
 fi
 
+if [ "$(uname)" = "Darwin" ]; then
+	# readlink doesn't support -f on MacOS, just assume it isn't a symlink
+	ACTUAL_DEVICE=$DEVICE
+else
+	ACTUAL_DEVICE=`readlink -f $DEVICE`
+fi
+if is_mounted $ACTUAL_DEVICE ; then
+	echo "ERROR: Device $DEVICE is currently mounted - check if this is the right device, and unmount it first if so"
+	device_details
+	exit 1
+fi
+if is_inuse $ACTUAL_DEVICE ; then
+	echo "ERROR: Device $DEVICE is currently in use (possibly part of LVM) - check if this is the right device!"
+	device_details
+	exit 1
+fi
 
-for i in ${BLACKLIST_DEVICES}; do
-	if [ "$i" = "$DEVICE" ]; then
-		echo "ERROR: Device $DEVICE is blacklisted"
-		exit 1
-	fi
-done
 
 if [ ! -w "$DEVICE" ]; then
 	echo "ERROR: Device $DEVICE does not exist or is not writable"
@@ -93,7 +147,7 @@ if [ ! -w "$DEVICE" ]; then
 fi
 
 image_details $IMAGE
-device_details $(basename $DEVICE)
+device_details
 
 printf "Write $IMAGE to $DEVICE [y/N]? "
 read RESPONSE
Signature · 1 line
2.20.1
#3 lore raw

PATCH 3/4 scripts/contrib/ddimage: be explicit whether device doesn't exist or isn't writeable

In reply to Paul Eggleton

Make the error messages a little more friendly.

---
 scripts/contrib/ddimage | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)
scripts/contrib/ddimage +7 -2
index a7dc5f7487b..7f2ad112a62 100755
@@ -122,6 +122,12 @@ if [ ! -e "$IMAGE" ]; then
 	exit 1
 fi
 
+if [ ! -e "$DEVICE" ]; then
+	echo "ERROR: Device $DEVICE does not exist"
+	usage
+	exit 1
+fi
+
 if [ "$(uname)" = "Darwin" ]; then
 	# readlink doesn't support -f on MacOS, just assume it isn't a symlink
 	ACTUAL_DEVICE=$DEVICE
@@ -139,9 +145,8 @@ if is_inuse $ACTUAL_DEVICE ; then
 	exit 1
 fi
 
-
 if [ ! -w "$DEVICE" ]; then
-	echo "ERROR: Device $DEVICE does not exist or is not writable"
+	echo "ERROR: Device $DEVICE is not writable - possibly use sudo?"
 	usage
 	exit 1
 fi
Signature · 1 line
2.20.1
#4 lore raw

PATCH 4/4 list-packageconfig-flags: print PN instead of P

In reply to Paul Eggleton

P (which is ${PN}-${PV}) isn't terribly useful in this context - we don't really care what the version is, but we do want to know what the recipe is so we can find it or set PACKAGECONFIG_pn-<PN> in our configuration, so display ${PN} instead.

---
 scripts/contrib/list-packageconfig-flags.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/contrib/list-packageconfig-flags.py +1 -1
index b1d6c852d86..d6de4dc84d2 100755
@@ -65,7 +65,7 @@ def collect_pkgs(data_dict):
     for fn in data_dict:
         pkgconfigflags = data_dict[fn].getVarFlags("PACKAGECONFIG")
         pkgconfigflags.pop('doc', None)
-        pkgname = data_dict[fn].getVar("P")
+        pkgname = data_dict[fn].getVar("PN")
         pkg_dict[pkgname] = sorted(pkgconfigflags.keys())
 
     return pkg_dict
Signature · 1 line
2.20.1