#!/usr/bin/env bash # -*- coding: utf-8 -*- # region imports # shellcheck source=./rebash/core.sh source "/usr/lib/rebash/core.sh" core.import logging # endregion tools__doc_test_setup__=' lsblk() { if [[ "${@: -1}" == "" ]];then echo "lsblk: : not a block device" return 1 fi if [[ "${@: -1}" != "/dev/sdb" ]];then echo "/dev/sda disk" echo "/dev/sda1 part SYSTEM_LABEL 0x7" echo "/dev/sda2 part" fi if [[ "${@: -1}" != "/dev/sda" ]];then echo "/dev/sdb disk" echo "/dev/sdb1 part boot_partition " echo "/dev/sdb2 part system_partition" fi } blkid() { [[ "${@: -1}" != "/dev/sda2" ]] && return 0 echo "gpt" echo "only discoverable by blkid" echo "boot_partition" echo "192d8b9e" } sleep() { ((_test_sleep_time++)) } ' tools_find_block_device() { # shellcheck disable=SC2034,SC2016 local __doc__=' >>> tools.find_block_device "boot_partition" /dev/sdb1 >>> tools.find_block_device "boot_partition" /dev/sda /dev/sda2 >>> tools.find_block_device "discoverable by blkid" /dev/sda2 >>> tools.find_block_device "_partition" /dev/sdb1 /dev/sdb2 >>> tools.find_block_device "not matching anything"; echo $? 1 >>> tools.find_block_device ""; echo $? 1 >>> local _test_sleep_time=0 >>> tools.find_block_device "not matching anything" /dev/sda 10; echo $? >>> echo $_test_sleep_time 1 10 ' local partition_pattern="$1" [ "$partition_pattern" = '' ] && return 1 local device="$2" local timeout=0 [ ! -z "$3" ] && timeout="$3" tools_find_block_device_simple() { local device_info lsblk --noheadings --list --paths --output \ NAME,TYPE,LABEL,PARTLABEL,UUID,PARTUUID ${device:+"$device"} \ | sort --unique | while read -r device_info; do local current_device current_device=$(echo "$device_info" | cut -d' ' -f1) if [[ "$device_info" = *"${partition_pattern}"* ]]; then echo "$current_device" fi done } tools_find_block_device_deep() { local device_info lsblk --noheadings --list --paths --output NAME ${device:+"$device"} \ | sort --unique | cut -d' ' -f1 | while read -r current_device; do blkid -p -o value "$current_device" \ | while read -r device_info; do if [[ "$device_info" = *"${partition_pattern}"* ]]; then echo "$current_device" fi done done } while ((timeout >= 0)); do local candidates candidates=($(tools_find_block_device_simple)) (( ${#candidates[@]} == 0 )) && candidates=($(tools_find_block_device_deep)) (( ${#candidates[@]} > 1 )) && echo "${candidates[@]}" && return 1 (( ${#candidates[@]} == 1 )) && echo "${candidates[0]}" && return 0 ((timeout == 0)) || sleep 1 ((timeout--)) done # no candidates return 1 } alias tools.find_block_device="tools_find_block_device" # region vim modline # vim: set tabstop=4 shiftwidth=4 expandtab: # vim: foldmethod=marker foldmarker=region,endregion: # endregion