summaryrefslogtreecommitdiffstats
path: root/modules/dev.inc
blob: c2046d37c5922e7129357297acec15a28f7ca812 (plain) (blame)
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
46
47
48
49
#!/bin/ash

# Get all partitions with given id (list of /dev/sdXX)
# Works for MBR/DOS by looking at the type (1 byte)
# and for GPT by looking for the label 'OpenSLX-ID$1'
# in case an id was given, or with the given UUID,
# or with the given name.
# The output will be a list of matching devices,
# sorted from largest to smallest.
dev_find_partitions() {
	local ID dev exp target
	exp=
	# target for the scan, defaults to /dev to check everything
	if [ -b "$1" ]; then
		target="$1"
		shift
	elif [ -d "$1" ]; then
		target="$1/"
	else
		target="/dev/"
	fi
	while [ "$#" -gt 0 ]; do
		ID="$1"
		shift
		[ -z "$ID" ] && continue
		# if single digit, e.g. 7, look for 0x7 and 0x07
		if regex_imatch "$ID" "^[0-9a-f]$"; then
			ID="0?$ID"
		fi

		if regex_imatch "$ID" "^[0-9a-f?]{2,3}$"; then # Match two digit and the expanded three digit version from above
			# if double digit look for MBR types and OpenSLX-ID$ID GPT labels
			exp="$exp|ID_PART_ENTRY_(NAME=OpenSLX-ID|TYPE=0x)$ID"
		elif regex_imatch "$ID" "^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$"; then
			# if UUID, look for TYPE
			exp="$exp|ID_PART_ENTRY_TYPE=$ID"
		else
			# something else, look for names of partitions / filesystems
			ID="$( regex_escape "$ID" )"
			exp="$exp|ID_(PART_ENTRY_NAME|FS_LABEL)=$ID"
		fi
	done
	exp="${exp:1}"
	for dev in $(find $target* -type b); do
		udevadm info --name="$dev" | grep -iqE "($exp)\$" \
			&& printf "%s\n" "$(blockdev --getsize64 "$dev") $dev"
	done | sort -n -k1 -r | cut -d' ' -f2
}