From 779bf6c15c6cf8a05ac9604e34cbe9ac7009ff70 Mon Sep 17 00:00:00 2001 From: Hook25 Date: Wed, 30 Apr 2025 15:27:05 +0200 Subject: [PATCH 1/5] Initial implementation --- .../parsers/tests/test_udevadm.py | 10 ++ .../udevadm_data/KIOXIA_TransMemory.lsblk | 21 +++ .../tests/udevadm_data/KIOXIA_TransMemory.txt | 123 ++++++++++++++++++ .../checkbox_support/parsers/udevadm.py | 11 +- 4 files changed, 160 insertions(+), 5 deletions(-) create mode 100644 checkbox-support/checkbox_support/parsers/tests/udevadm_data/KIOXIA_TransMemory.lsblk create mode 100644 checkbox-support/checkbox_support/parsers/tests/udevadm_data/KIOXIA_TransMemory.txt diff --git a/checkbox-support/checkbox_support/parsers/tests/test_udevadm.py b/checkbox-support/checkbox_support/parsers/tests/test_udevadm.py index a8d232a040..b2920f7930 100644 --- a/checkbox-support/checkbox_support/parsers/tests/test_udevadm.py +++ b/checkbox-support/checkbox_support/parsers/tests/test_udevadm.py @@ -97,6 +97,16 @@ def test_openfirmware_network(self): devices = parser.run() self.assertEqual(devices[0].category, "NETWORK") + def test_KIOXIA_TransMemory(self): + # this is a non-regression test to check that the KIOXIA TransMemory + # USB stick is detected as a usb stick and not a mediacard + devices = self.parse( + "KIOXIA_TransMemory", with_lsblk=True, with_partitions=True + ) + busses = [d.bus for d in devices] + self.assertEqual(["usb", "usb"], busses) + breakpoint() + def test_DELL_INSPIRON3521_TOUCHSCREEN(self): """ Check devices category having the ID_INPUT_TOUCHSCREEN property diff --git a/checkbox-support/checkbox_support/parsers/tests/udevadm_data/KIOXIA_TransMemory.lsblk b/checkbox-support/checkbox_support/parsers/tests/udevadm_data/KIOXIA_TransMemory.lsblk new file mode 100644 index 0000000000..d25c62db7c --- /dev/null +++ b/checkbox-support/checkbox_support/parsers/tests/udevadm_data/KIOXIA_TransMemory.lsblk @@ -0,0 +1,21 @@ +KNAME="loop0" TYPE="loop" MOUNTPOINT="/snap/core22/1985" +KNAME="loop1" TYPE="loop" MOUNTPOINT="/snap/pi/133" +KNAME="loop2" TYPE="loop" MOUNTPOINT="/snap/pi-kernel/976" +KNAME="loop3" TYPE="loop" MOUNTPOINT="/snap/bluez/396" +KNAME="loop4" TYPE="loop" MOUNTPOINT="/snap/checkbox/13902" +KNAME="loop5" TYPE="loop" MOUNTPOINT="/snap/checkbox22/1629" +KNAME="loop6" TYPE="loop" MOUNTPOINT="/snap/core18/2858" +KNAME="loop7" TYPE="loop" MOUNTPOINT="/snap/core22/1124" +KNAME="loop8" TYPE="loop" MOUNTPOINT="/snap/core22/1910" +KNAME="loop9" TYPE="loop" MOUNTPOINT="/snap/docker/3066" +KNAME="loop10" TYPE="loop" MOUNTPOINT="/snap/pi-bluetooth/18" +KNAME="loop11" TYPE="loop" MOUNTPOINT="/snap/pi-kernel/767" +KNAME="loop12" TYPE="loop" MOUNTPOINT="/snap/snapd/20675" +KNAME="loop13" TYPE="loop" MOUNTPOINT="/snap/snapd/24507" +KNAME="sda" TYPE="disk" MOUNTPOINT="" +KNAME="sda1" TYPE="part" MOUNTPOINT="" +KNAME="mmcblk0" TYPE="disk" MOUNTPOINT="" +KNAME="mmcblk0p1" TYPE="part" MOUNTPOINT="/var/lib/snapd/seed" +KNAME="mmcblk0p2" TYPE="part" MOUNTPOINT="/run/mnt/ubuntu-boot" +KNAME="mmcblk0p3" TYPE="part" MOUNTPOINT="/var/lib/snapd/save" +KNAME="mmcblk0p4" TYPE="part" MOUNTPOINT="/writable" diff --git a/checkbox-support/checkbox_support/parsers/tests/udevadm_data/KIOXIA_TransMemory.txt b/checkbox-support/checkbox_support/parsers/tests/udevadm_data/KIOXIA_TransMemory.txt new file mode 100644 index 0000000000..52f1e93953 --- /dev/null +++ b/checkbox-support/checkbox_support/parsers/tests/udevadm_data/KIOXIA_TransMemory.txt @@ -0,0 +1,123 @@ +P: /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.2 +N: bus/usb/001/006 +L: 0 +E: DEVPATH=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.2 +E: SUBSYSTEM=usb +E: DEVNAME=/dev/bus/usb/001/006 +E: DEVTYPE=usb_device +E: DRIVER=usb +E: PRODUCT=30de/6544/1 +E: TYPE=0/0/0 +E: BUSNUM=001 +E: DEVNUM=006 +E: MAJOR=189 +E: MINOR=5 +E: USEC_INITIALIZED=38846816 +E: ID_VENDOR=KIOXIA +E: ID_VENDOR_ENC=KIOXIA +E: ID_VENDOR_ID=30de +E: ID_MODEL=TransMemory +E: ID_MODEL_ENC=TransMemory +E: ID_MODEL_ID=6544 +E: ID_REVISION=0001 +E: ID_SERIAL=KIOXIA_TransMemory_0022CFF6BD70C670E32160AA +E: ID_SERIAL_SHORT=0022CFF6BD70C670E32160AA +E: ID_BUS=usb +E: ID_USB_INTERFACES=:080650: +E: ID_PATH=platform-3f980000.usb-usb-0:1.1.2 +E: ID_PATH_TAG=platform-3f980000_usb-usb-0_1_1_2 +E: ID_FOR_SEAT=usb-platform-3f980000_usb-usb-0_1_1_2 +E: TAGS=:seat: +E: CURRENT_TAGS=:seat: + +P: /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.2/1-1.1.2:1.0/host0/target0:0:0/0:0:0:0/block/sda +N: sda +L: 0 +S: disk/by-path/platform-3f980000.usb-usb-0:1.1.2:1.0-scsi-0:0:0:0 +S: disk/by-id/usb-KIOXIA_TransMemory_0022CFF6BD70C670E32160AA-0:0 +E: DEVPATH=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.2/1-1.1.2:1.0/host0/target0:0:0/0:0:0:0/block/sda +E: SUBSYSTEM=block +E: DEVNAME=/dev/sda +E: DEVTYPE=disk +E: DISKSEQ=10 +E: MAJOR=8 +E: MINOR=0 +E: USEC_INITIALIZED=39060437 +E: ID_VENDOR=KIOXIA +E: ID_VENDOR_ENC=KIOXIA\x20\x20 +E: ID_VENDOR_ID=30de +E: ID_MODEL=TransMemory +E: ID_MODEL_ENC=TransMemory\x20\x20\x20\x20\x20 +E: ID_MODEL_ID=6544 +E: ID_REVISION=0001 +E: ID_SERIAL=KIOXIA_TransMemory_0022CFF6BD70C670E32160AA-0:0 +E: ID_SERIAL_SHORT=0022CFF6BD70C670E32160AA +E: ID_TYPE=disk +E: ID_INSTANCE=0:0 +E: ID_BUS=usb +E: ID_USB_INTERFACES=:080650: +E: ID_USB_INTERFACE_NUM=00 +E: ID_USB_DRIVER=usb-storage +E: ID_PATH=platform-3f980000.usb-usb-0:1.1.2:1.0-scsi-0:0:0:0 +E: ID_PATH_TAG=platform-3f980000_usb-usb-0_1_1_2_1_0-scsi-0_0_0_0 +E: ID_PART_TABLE_UUID=1fa94f30 +E: ID_PART_TABLE_TYPE=dos +E: DEVLINKS=/dev/disk/by-path/platform-3f980000.usb-usb-0:1.1.2:1.0-scsi-0:0:0:0 /dev/disk/by-id/usb-KIOXIA_TransMemory_0022CFF6BD70C670E32160AA-0:0 +E: TAGS=:systemd: +E: CURRENT_TAGS=:systemd: + +P: /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.2/1-1.1.2:1.0/host0/target0:0:0/0:0:0:0/block/sda/sda1 +N: sda1 +L: 0 +S: disk/by-partuuid/1fa94f30-01 +S: disk/by-id/usb-KIOXIA_TransMemory_0022CFF6BD70C670E32160AA-0:0-part1 +S: disk/by-uuid/46C8-7866 +S: disk/by-label/KIOXIA +S: disk/by-path/platform-3f980000.usb-usb-0:1.1.2:1.0-scsi-0:0:0:0-part1 +E: DEVPATH=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.2/1-1.1.2:1.0/host0/target0:0:0/0:0:0:0/block/sda/sda1 +E: SUBSYSTEM=block +E: DEVNAME=/dev/sda1 +E: DEVTYPE=partition +E: DISKSEQ=10 +E: PARTN=1 +E: MAJOR=8 +E: MINOR=1 +E: USEC_INITIALIZED=39224894 +E: ID_VENDOR=KIOXIA +E: ID_VENDOR_ENC=KIOXIA\x20\x20 +E: ID_VENDOR_ID=30de +E: ID_MODEL=TransMemory +E: ID_MODEL_ENC=TransMemory\x20\x20\x20\x20\x20 +E: ID_MODEL_ID=6544 +E: ID_REVISION=0001 +E: ID_SERIAL=KIOXIA_TransMemory_0022CFF6BD70C670E32160AA-0:0 +E: ID_SERIAL_SHORT=0022CFF6BD70C670E32160AA +E: ID_TYPE=disk +E: ID_INSTANCE=0:0 +E: ID_BUS=usb +E: ID_USB_INTERFACES=:080650: +E: ID_USB_INTERFACE_NUM=00 +E: ID_USB_DRIVER=usb-storage +E: ID_PATH=platform-3f980000.usb-usb-0:1.1.2:1.0-scsi-0:0:0:0 +E: ID_PATH_TAG=platform-3f980000_usb-usb-0_1_1_2_1_0-scsi-0_0_0_0 +E: ID_PART_TABLE_UUID=1fa94f30 +E: ID_PART_TABLE_TYPE=dos +E: ID_FS_LABEL=KIOXIA +E: ID_FS_LABEL_ENC=KIOXIA +E: ID_FS_UUID=46C8-7866 +E: ID_FS_UUID_ENC=46C8-7866 +E: ID_FS_VERSION=FAT32 +E: ID_FS_TYPE=vfat +E: ID_FS_USAGE=filesystem +E: ID_PART_ENTRY_SCHEME=dos +E: ID_PART_ENTRY_UUID=1fa94f30-01 +E: ID_PART_ENTRY_TYPE=0xb +E: ID_PART_ENTRY_FLAGS=0x80 +E: ID_PART_ENTRY_NUMBER=1 +E: ID_PART_ENTRY_OFFSET=63 +E: ID_PART_ENTRY_SIZE=60548481 +E: ID_PART_ENTRY_DISK=8:0 +E: SYSTEMD_WANTS=snapd.autoimport-device@sda1.service +E: DEVLINKS=/dev/disk/by-partuuid/1fa94f30-01 /dev/disk/by-id/usb-KIOXIA_TransMemory_0022CFF6BD70C670E32160AA-0:0-part1 /dev/disk/by-uuid/46C8-7866 /dev/disk/by-label/KIOXIA /dev/disk/by-path/platform-3f980000.usb-usb-0:1.1.2:1.0-scsi-0:0:0:0-part1 +E: TAGS=:systemd: +E: CURRENT_TAGS=:systemd: diff --git a/checkbox-support/checkbox_support/parsers/udevadm.py b/checkbox-support/checkbox_support/parsers/udevadm.py index 55b2b4cee2..5a4593d447 100644 --- a/checkbox-support/checkbox_support/parsers/udevadm.py +++ b/checkbox-support/checkbox_support/parsers/udevadm.py @@ -202,17 +202,17 @@ def bus(self): and self._environment.get("DEVTYPE") == "partition" and self._stack ): - if CARD_READER_RE.search(self._environment.get("ID_MODEL", "")): - return "mediacard" - elif any(d.bus == "mmc" for d in self._stack): - return "mediacard" - elif any(d.bus == "usb" for d in self._stack): + if any(d.bus == "usb" for d in self._stack): for d in self._stack: # Report the current usb hub version if d._environment.get("ID_MODEL_ID") == "0003": return "usb3" else: return "usb" + elif CARD_READER_RE.search(self._environment.get("ID_MODEL", "")): + return "mediacard" + elif any(d.bus == "mmc" for d in self._stack): + return "mediacard" else: if len(self._stack) >= 2: return self._stack[-2]._environment.get("SUBSYSTEM") @@ -447,6 +447,7 @@ def category(self): # As it's not possible to distinguish them from simple MMC # removable storage, only those with a partition mounted as / # will be considered. + if self.driver.startswith("mmc"): if self._mmc_type == "MMC" and find_pkname_is_root_mountpoint( self.name, self._lsblk From 29f12eb3560fe6158449d620dd9380c2c5cb0cc2 Mon Sep 17 00:00:00 2001 From: Hook25 Date: Mon, 5 May 2025 15:00:36 +0200 Subject: [PATCH 2/5] Test that the partition is now correctly recognized --- checkbox-support/checkbox_support/parsers/tests/test_udevadm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/checkbox-support/checkbox_support/parsers/tests/test_udevadm.py b/checkbox-support/checkbox_support/parsers/tests/test_udevadm.py index b2920f7930..06eb397610 100644 --- a/checkbox-support/checkbox_support/parsers/tests/test_udevadm.py +++ b/checkbox-support/checkbox_support/parsers/tests/test_udevadm.py @@ -105,7 +105,7 @@ def test_KIOXIA_TransMemory(self): ) busses = [d.bus for d in devices] self.assertEqual(["usb", "usb"], busses) - breakpoint() + self.assertEqual(self.count(devices, "PARTITION"), 1) def test_DELL_INSPIRON3521_TOUCHSCREEN(self): """ From f7eec9a33f8889bb53acecf6f34c11232c0feeab Mon Sep 17 00:00:00 2001 From: Hook25 Date: Mon, 5 May 2025 15:03:23 +0200 Subject: [PATCH 3/5] Document in the test what it is trying to do --- providers/base/units/usb/usb.pxu | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/providers/base/units/usb/usb.pxu b/providers/base/units/usb/usb.pxu index 82c0d56084..84a929805f 100644 --- a/providers/base/units/usb/usb.pxu +++ b/providers/base/units/usb/usb.pxu @@ -182,7 +182,7 @@ requires: manifest.has_usb_storage == 'True' estimated_duration: 45.0 command: removable_storage_test.py -l usb && timeout 300 removable_storage_test.py -s 268400000 -m 500000000 usb --driver xhci_hcd -_summary: +_summary: Test USB 3.0 or 3.1 ports _purpose: Tests USB 3.0 ports on a system by doing write/read/compare tests on @@ -228,6 +228,7 @@ category_id: com.canonical.plainbox::usb plugin: shell _summary: Detect storage partitions on a device on the USB bus command: + echo "Searching udev for a partitioned device connected via usb" udev_resource.py -f PARTITION | grep "bus: usb" estimated_duration: 1.0 flags: also-after-suspend From 7c5b499a2c07c0d10b8d3aed32ece66a8a95f62e Mon Sep 17 00:00:00 2001 From: Hook25 Date: Mon, 5 May 2025 15:16:53 +0200 Subject: [PATCH 4/5] Drop support for SmartMedia devices --- checkbox-support/checkbox_support/parsers/udevadm.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/checkbox-support/checkbox_support/parsers/udevadm.py b/checkbox-support/checkbox_support/parsers/udevadm.py index 5a4593d447..ab852b2eb8 100644 --- a/checkbox-support/checkbox_support/parsers/udevadm.py +++ b/checkbox-support/checkbox_support/parsers/udevadm.py @@ -85,7 +85,7 @@ OPENFIRMWARE_RE = re.compile( r"^of:" r"N(?P.*?)" r"T(?P.*?)" r"C(?P.*?)" ) -CARD_READER_RE = re.compile(r"SD|MMC|CF|MS(?!ata)|SM|xD|Card", re.I) +CARD_READER_RE = re.compile(r"SD|MMC|CF|MS(?!ata)|xD|Card", re.I) GENERIC_RE = re.compile(r"Generic", re.I) FLASH_RE = re.compile(r"Flash", re.I) FLASH_DISK_RE = re.compile(r"Mass|Storage|Disk", re.I) @@ -202,17 +202,17 @@ def bus(self): and self._environment.get("DEVTYPE") == "partition" and self._stack ): - if any(d.bus == "usb" for d in self._stack): + if CARD_READER_RE.search(self._environment.get("ID_MODEL", "")): + return "mediacard" + elif any(d.bus == "mmc" for d in self._stack): + return "mediacard" + elif any(d.bus == "usb" for d in self._stack): for d in self._stack: # Report the current usb hub version if d._environment.get("ID_MODEL_ID") == "0003": return "usb3" else: return "usb" - elif CARD_READER_RE.search(self._environment.get("ID_MODEL", "")): - return "mediacard" - elif any(d.bus == "mmc" for d in self._stack): - return "mediacard" else: if len(self._stack) >= 2: return self._stack[-2]._environment.get("SUBSYSTEM") From 9df9cad708ac737f5db0da9540b39416718ef60f Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Tue, 6 May 2025 09:44:09 +0200 Subject: [PATCH 5/5] Update providers/base/units/usb/usb.pxu Co-authored-by: Pierre Equoy --- providers/base/units/usb/usb.pxu | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/base/units/usb/usb.pxu b/providers/base/units/usb/usb.pxu index 84a929805f..cf09b2723c 100644 --- a/providers/base/units/usb/usb.pxu +++ b/providers/base/units/usb/usb.pxu @@ -228,7 +228,7 @@ category_id: com.canonical.plainbox::usb plugin: shell _summary: Detect storage partitions on a device on the USB bus command: - echo "Searching udev for a partitioned device connected via usb" + echo "Searching udev for a partitioned device connected via USB..." udev_resource.py -f PARTITION | grep "bus: usb" estimated_duration: 1.0 flags: also-after-suspend