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
}
|