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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
#!/bin/bash
# Collection of small bash functions utilized in various scripts.
################################################################################
export PATH=$PATH:/opt/openslx/bin:/opt/openslx/sbin
dmstate="/run/openslx/dmsetup.state"
readonly dmstate
df_dev_only() {
df -P "$1" 2>&1 | awk '$1 ~ /^\/dev\// {print $0}'
}
get_backing_dev() {
local _dev="$(df_dev_only "$1" | awk '{print $1}' )"
[ -b "$_dev" ] || return 1
echo "$_dev"
}
get_backing_dev_mp() {
local _mp="$(df_dev_only "$1" | awk '{print $6}')"
[ -d "$_mp" ] || return 1
echo "$_mp"
}
# Helper to check whether given directory resides in RAM, either
# by being mounted as tmpfs or not mounted at all in which case
# we assume the same. Returns 0 if so, 1 if otherwise backed,
# 2 when errors occur.
is_volatile() {
[ -z "$1" ] && return 2
local _dev="$(get_backing_dev "$1")"
[ -z "$_dev" ] && return 0 # No result, assume tmpfs
[ "$_dev" = "${_dev#/dev/zram}" ] && return 0 # zram is in RAM, like tmpfs
[ "$_dev" = "${_dev#/dev/mapper/}" ] && return 1 # Doesn't start with /dev/mapper, assume some kind of storage
local _mp="$(get_backing_dev_mp "$1")"
[ -z "$_mp" ] && return 2
# it is a device mapper device, check if it was setup in dracut's initramfs.
if [ -s "$dmstate" ]; then
grep -qE "^${_dev}\s+${_mp}\s+type=0" "$dmstate"
return $?
fi
return 2
}
get_dm_backing_size() {
[ -z "$1" ] && return 1
local _dev="$(get_backing_dev $1)"
[ "$_dev" = "${_dev#/dev/mapper/}" ] && return 1
local _dm_line="$(grep -m1 -E "^${_dev}\s+/\s+type=[^0]" "$dmstate")"
[ -z "$_dm_line" ] && return 1
local _dm_dev_size="$(echo "$_dm_line" | grep -Po '(?<=physical_size=|virtual_size=)\w*' )"
echo ${_dm_dev_size:--1}
}
regex_match() {
echo "$1" | grep -qP "$2"
}
get_partitions_by_id () {
local ID dev exp target
exp=
# target for the scan, defaults to /dev to check everything
target=/dev
if [ -b "$1" ]; then
target="$1"'*'
shift
fi
# support commas and pipes to separate identifiers
local args=$@
set -- ${args//[,|]/ }
while [ $# -gt 0 ]; do
ID=$1
shift
[ -z "$ID" ] && continue
# if single digit, e.g. 7, look for 0x7 and 0x07
#[[ $ID =~ ^[0-9]$ ]] && ID="0?$ID"
if regex_match "$ID" "^[0-9]$" ; then
ID="0?$ID"
fi
if regex_match "$ID" "^[0-9]{2}$"; then
# 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_match "$ID" "^(0x[0-9]{2}|[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})$"; then
# if full MBR type (e.g. 0x44) or UUID look for TYPE
exp="$exp|ID_PART_ENTRY_TYPE=$ID"
else
# something else, look for names of partitions / filesystems
exp="$exp|ID_(PART_ENTRY_NAME|FS_LABEL)=$ID"
fi
done
exp=${exp:1}
#echo "Partition find is '$exp'" >&2
for dev in $(find $target -type b); do
udevadm info --name="$dev" | grep -iqE "($exp)\$" \
&& echo "$(blockdev --getsize64 "$dev") $dev"
done | sort -n -k1 -r | cut -d' ' -f2
}
|