summaryrefslogblamecommitdiffstats
path: root/builder/modules.d/dnbd3-rootfs/scripts/tools.sh
blob: bace775e9c32872bdf486c348f837ad3875ab360 (plain) (tree)
1
2
3
4
5
6
7
                   
                       
                
                                    

                                
           























                                               


                          
 



                                      
                                                
             
                                                         
             
                                                       
             
                                            
                       









                                                                            

                                
                                             


                                 


                                                    
                                                                      



















                                                                              










                                                                                    

                                                       
 



                                                     
#!/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