You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
4.6 KiB

#!/usr/bin/env bash
sectors_to_size() {
SIZE=$(( ${1} * 512 ))
MAG=0
until [ $(awk "BEGIN { print ${SIZE} < 1000 }") -eq 1 ]; do
SIZE=$(awk "BEGIN { print ${SIZE} / 1024 }" )
((MAG++))
done
case ${MAG} in
0) TAG="" ;;
1) TAG="Ki" ;;
2) TAG="Mi" ;;
3) TAG="Gi" ;;
4) TAG="Ti" ;;
esac
printf "%.4g%s\n" "${SIZE}" "${TAG}B"
}
[ $EUID -gt 0 ] && echo "Must run as superuser." && exit 1
for DEVICE in $(fdisk -l | grep '^Disk /' | grep -v '/dev/ram' | cut -d\ -f2 | cut -d: -f1); do
FDISKDATA="$(fdisk -l "${DEVICE}")"
COLS="$(tput cols)"
SECTORS="$(echo "${FDISKDATA}" | grep sectors | grep -v 'sectors of' | rev | cut -d\ -f2 | rev)"
#PARTLIST="$(echo "${FDISKDATA}" | grep '^/' | sed 's/ */ /g' | cut -d\ -f1-3)"
PARTLIST="$(echo "${FDISKDATA}" | grep '^/' | grep -v 'Extended$' | sed -e 's/*/ /' -e 's/ \+/ /g' | cut -d\ -f1-3)"
PARTITIONS=()
SIZE_LOG=0
PARTSECTS=()
PARTSIZES=()
SIZETOTAL=0
PRINTCOLS=0
PCOLS=()
if [ -z "${PARTLIST}" ]; then
PARTITIONS=${DEVICE}
SIZE_LOG=1
PARTSECTS=${SECTORS}
PARTSIZES=1
SIZETOTAL=1
else
LASTEND=0
while read -r PARTITION PARTSTART PARTEND; do
if [ ${PARTSTART} -gt $(( ${LASTEND} + 2049 )) ]; then
PARTITIONS+=( "Gap" )
SIZE_LOG=( $(awk "BEGIN { print log( ${PARTSTART} - ${LASTEND} ) / log( ${SECTORS} ) }") )
PARTSECTS+=( $(awk "BEGIN { print ${PARTSTART} - ${LASTEND} }") )
PARTSIZES+=( ${SIZE_LOG} )
SIZETOTAL=$(awk "BEGIN { print ${SIZETOTAL} + ${SIZE_LOG} }")
fi
PARTITIONS+=( ${PARTITION} )
SIZE_LOG=( $(awk "BEGIN { print log( ${PARTEND} - ${PARTSTART} + 1 ) / log( ${SECTORS} ) }") )
PARTSECTS+=( $(awk "BEGIN { print ${PARTEND} - ${PARTSTART} + 1 }") )
PARTSIZES+=( ${SIZE_LOG} )
SIZETOTAL=$(awk "BEGIN { print ${SIZETOTAL} + ${SIZE_LOG} }")
LASTEND=${PARTEND}
done <<< "${PARTLIST}"
fi
FACTOR=$(awk "BEGIN { print ( ${COLS} - ${#PARTITIONS[@]} - 1 ) / ${SIZETOTAL} }")
for (( LCV = 0; LCV < ${#PARTITIONS[@]}; LCV++ )); do
PRINTCOLS=$(( ${PRINTCOLS} + $(awk "BEGIN { print int ( ${PARTSIZES[${LCV}]} * ${FACTOR} + 0.5 ) }") ))
PCOLS+=( $(awk "BEGIN { print int ( ${PARTSIZES[${LCV}]} * ${FACTOR} + 0.5 ) }") )
done
OVERFLOW=$(( ${PRINTCOLS} + ${LCV} + 1 - ${COLS} ))
####### TOP LINE #######
printf "%s" "┌"
for (( LCV = 0; LCV < ${#PARTITIONS[@]}; LCV++ )); do
[ ${LCV} = $(( ${#PARTITIONS[@]} - 1 )) ] && (( PCOLS[${LCV}]-=${OVERFLOW} ))
printf '─%.0s' $(seq 1 ${PCOLS[${LCV}]})
[ ${LCV} -lt $(( ${#PARTITIONS[@]} - 1 )) ] && echo -n "┬"
done
printf "%s\n" "┐"
##### DEVICE NAME ######
printf "%s" "│"
for (( LCV = 0; LCV < ${#PARTITIONS[@]}; LCV++ )); do
OUTPUT=${PARTITIONS[${LCV}]##*/}
PADL=( $(( ( ${PCOLS[${LCV}]} - ${#OUTPUT} ) / 2 )) )
PADR=( $(( ${PCOLS[${LCV}]} - ${#OUTPUT} - ${PADL} )) )
printf '%*s%s%*s' ${PADL} "" ${OUTPUT} ${PADR} ""
[ ${LCV} -lt $(( ${#PARTITIONS[@]} - 1 )) ] && echo -n "│"
done
printf "%s\n" "│"
#### PARTITION SIZE ####
printf "%s" "│"
for (( LCV = 0; LCV < ${#PARTITIONS[@]}; LCV++ )); do
OUTPUT=$(sectors_to_size "${PARTSECTS[${LCV}]}")
PADL=( $(( ( ${PCOLS[${LCV}]} - ${#OUTPUT} ) / 2 )) )
PADR=( $(( ${PCOLS[${LCV}]} - ${#OUTPUT} - ${PADL} )) )
printf '%*s%s%*s' ${PADL} "" ${OUTPUT} ${PADR} ""
[ ${LCV} -lt $(( ${#PARTITIONS[@]} - 1 )) ] && echo -n "│"
done
printf "%s\n" "│"
#### PARTITION TYPE ####
printf "%s" "│"
for (( LCV = 0; LCV < ${#PARTITIONS[@]}; LCV++ )); do
OUTPUT=$(blkid -o export "${PARTITIONS[${LCV}]}" | grep '^\(TYPE=\)' | cut -d= -f2 | sed 's:linux_raid_member:raid:g;s:zfs_member:zfs:g')
PADL=$(( ( ${PCOLS[${LCV}]} - ${#OUTPUT} ) / 2 ))
PADR=$(( ${PCOLS[${LCV}]} - ${#OUTPUT} - ${PADL} ))
printf '%*s%s%*s' ${PADL} "" "${OUTPUT}" ${PADR} ""
[ ${LCV} -lt $(( ${#PARTITIONS[@]} - 1 )) ] && echo -n "│"
done
printf "%s\n" "│"
### FILESYSTEM LABEL ###
printf "%s" "│"
for (( LCV = 0; LCV < ${#PARTITIONS[@]}; LCV++ )); do
OUTPUT=$(blkid -o export "${PARTITIONS[${LCV}]}" | grep '^\(LABEL=\)' | cut -d= -f2)
PADL=$(( ( ${PCOLS[${LCV}]} - ${#OUTPUT} ) / 2 ))
PADR=$(( ${PCOLS[${LCV}]} - ${#OUTPUT} - ${PADL} ))
printf '%*s%s%*s' ${PADL} "" "${OUTPUT}" ${PADR} ""
[ ${LCV} -lt $(( ${#PARTITIONS[@]} - 1 )) ] && echo -n "│"
done
printf "%s\n" "│"
##### BOTTOM LINE ######
echo -n "└"
for (( LCV = 0; LCV < ${#PARTITIONS[@]}; LCV++ )); do
printf '─%.0s' $(seq 1 ${PCOLS[${LCV}]})
[ ${LCV} -lt $(( ${#PARTITIONS[@]} - 1 )) ] && echo -n "┴"
done
echo "┘"
done