Skip to content

Instantly share code, notes, and snippets.

@jedimstr
Created July 31, 2017 04:28
Show Gist options
  • Select an option

  • Save jedimstr/af6052975fd5f57fd6dc6e1732477aeb to your computer and use it in GitHub Desktop.

Select an option

Save jedimstr/af6052975fd5f57fd6dc6e1732477aeb to your computer and use it in GitHub Desktop.

Revisions

  1. jedimstr created this gist Jul 31, 2017.
    119 changes: 119 additions & 0 deletions identify_drive.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,119 @@
    #!/bin/bash

    export OMIT=0

    [ ${DEBUG:=0} -gt 0 ] && set -x -v

    declare -a DRIVES MODELS CHOICE
    typeset -x DRIVES MODELS CHOICE CMDS

    TMPFILE="/tmp/identify_drive.$$"

    trap "rm -f ${TMPFILE}" EXIT HUP INT QUIT TERM

    CMDS="quit"

    # --------------------------------------------------------------------- #
    # Function : LOAD_DRIVES #
    # Description : Reads directory with ls parses and stores into array. #
    # used later to retreive drive for printing details #
    # Parameters : Nothing #
    # Returns : Nothing #
    # Environment : DRIVES array, MODELS array #
    # --------------------------------------------------------------------- #
    load_drives()
    {
    ls -l /dev/disk/by-id/ | egrep 'ata\-' > ${TMPFILE}

    # rwxrwxrwx 1 root root 9 Apr 20 08:04 ata-Hitachi_HTS722020K9SA00_071007DP0400DTG101HA -> ../../sdf
    # lrwxrwxrwx 1 root root 10 Apr 20 08:04 ata-Hitachi_HTS722020K9SA00_071007DP0400DTG101HA-part1 -> ../../sdf1
    # I know it's inefficient.
    # but piping mount into loop creates a subprocess
    # whereby the export inside the loop never gets
    # back to the parent.

    i=0
    while read PERMS LINKS OWNER GROUP XX MONTH DD HHMM MODEL LINKER DEV
    do
    # ${parameter:offset:length}
    NAME=${DEV:6:4} # Save Whole Drive
    DEV=${DEV:6:3} # Remove Partition #
    if [ ${DEV} != ${NAME} ]; then continue; fi
    for OMODEL in ${OMIT_MODELS[*]}
    do length=${#OMODEL}
    if [ ${MODEL:0:$length} = ${OMODEL} ];then OMIT=1;fi
    done
    if [ ${OMIT:=0} -gt 0 ]
    then OMIT=0
    continue
    fi
    DRIVES[$i]="/dev/${DEV}"
    MODELS[$i]="${MODEL}"
    CHOICE[$i]="/dev/${DEV} ${MODEL}"
    ((i++))
    done < ${TMPFILE}

    rm -f ${TMPFILE}

    }


    present_drives()
    {
    PS3="identify> "
    select DRIVE in "${CHOICE[@]}" ${CMDS}
    do
    echo "DRIVE: $DRIVE, REPLY: ${REPLY}"
    if [ -z "${DRIVE}" -a ! -z "${REPLY}" ]
    then DRIVE="${REPLY}"
    fi
    if [ -z "${DRIVE}" ]
    then return
    fi
    case "${DRIVE}" in
    q*|Q* ) exit;;
    e*|e* ) exit;;
    * ) set ${DRIVE}; identify $@; return;;
    esac
    done
    }



    identify()
    {

    ID=$1
    [ ! -z "${2}" ] && ID="$ID ($2)"

    echo -e "Reading ${ID}"
    while ! read -n1 -t1
    do
    echo -e "\r\007press ANY key to stop: [+]: \c"
    dd if=$1 of=/dev/null bs=1025K count=10 skip=${SKIP} 2>/dev/null
    read -n1 -t1 && break
    ((SKIP=SKIP+1000))

    echo -e "\r\007press ANY key to stop: [x]: \c"
    dd if=$1 of=/dev/null bs=1025K count=10 skip=${SKIP} 2>/dev/null
    read -n1 -t1 && break
    ((SKIP=SKIP+1000))

    echo -e "\r\007press ANY key to stop: [-]: \c"
    dd if=$1 of=/dev/null bs=1025K count=100 skip=${SKIP} 2>/dev/null
    # sleep 1
    ((SKIP=SKIP+10000))
    done
    echo -e "\nDone."
    }


    if [ ! -z "${1}" ]
    then identify $1
    exit
    fi

    while true
    do load_drives
    present_drives
    done