1#!/bin/sh
2#
3# Print some common lsblk values
4#
5# Any (lowercased) name symlinked to the lsblk script will be passed to lsblk
6# as one of its --output names.  Here's a partial list of --output names
7# from the lsblk binary:
8#
9# Available columns (for --output):
10#        NAME  device name
11#       KNAME  internal kernel device name
12#     MAJ:MIN  major:minor device number
13#      FSTYPE  filesystem type
14#  MOUNTPOINT  where the device is mounted
15#       LABEL  filesystem LABEL
16#        UUID  filesystem UUID
17#          RA  read-ahead of the device
18#          RO  read-only device
19#          RM  removable device
20#       MODEL  device identifier
21#        SIZE  size of the device
22#       STATE  state of the device
23#       OWNER  user name
24#       GROUP  group name
25#        MODE  device node permissions
26#   ALIGNMENT  alignment offset
27#      MIN-IO  minimum I/O size
28#      OPT-IO  optimal I/O size
29#     PHY-SEC  physical sector size
30#     LOG-SEC  logical sector size
31#        ROTA  rotational device
32#       SCHED  I/O scheduler name
33#     RQ-SIZE  request queue size
34#        TYPE  device type
35#    DISC-ALN  discard alignment offset
36#   DISC-GRAN  discard granularity
37#    DISC-MAX  discard max bytes
38#   DISC-ZERO  discard zeroes data
39#
40# If the script is run as just 'lsblk' then print out disk size, vendor,
41# and model number.
42
43
44helpstr="
45label:	Show filesystem label.
46model:	Show disk model number.
47size:	Show the disk capacity.
48vendor:	Show the disk vendor.
49lsblk:	Show the disk size, vendor, and model number."
50
51script="${0##*/}"
52
53if [ "$1" = "-h" ] ; then
54        echo "$helpstr" | grep "$script:" | tr -s '\t' | cut -f 2-
55        exit
56fi
57
58if [ "$script" = "lsblk" ] ; then
59	list="size vendor model"
60else
61	list=$(echo "$script" | tr '[:upper:]' '[:lower:]')
62fi
63
64# Sometimes, UPATH ends up /dev/(null).
65# That should be corrected, but for now...
66# shellcheck disable=SC2154
67if [ ! -b "$VDEV_UPATH" ]; then
68	somepath="${VDEV_PATH}"
69else
70	somepath="${VDEV_UPATH}"
71fi
72
73# Older versions of lsblk don't support all these values (like SERIAL).
74for i in $list ; do
75
76	# Special case: Looking up the size of a file-based vdev can't
77	# be done with lsblk.
78	if [ "$i" = "size" ] && [ -f "$somepath" ] ; then
79		size=$(du -h --apparent-size "$somepath" | cut -f 1)
80		echo "size=$size"
81		continue
82	fi
83
84
85	val=""
86	if val=$(eval "lsblk -dl -n -o $i $somepath 2>/dev/null") ; then
87		# Remove leading/trailing whitespace from value
88		val=$(echo "$val" | sed -e 's/^[[:space:]]*//' \
89		     -e 's/[[:space:]]*$//')
90	fi
91	echo "$i=$val"
92done
93