#!/bin/sh # # debeagle - Install Debian on a Beagle SBC # # Copyright (C) 2014 Patrick "P. J." McDermott # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . set -u main() { local opt= local mirror= local suite= local target= while getopts 'm:' opt; do case ${opt} in m) mirror="${OPTARG}";; ?) print_usage >&2 exit 1 ;; esac done shift $(($OPTIND - 1)) case ${#} in 1) suite="${1}" target='' ;; 2) suite="${1}" target="${2}" ;; *) print_usage >&2 exit 1 ;; esac if [ "x${target}" = 'x' ]; then target="/dev/$(prompt_block_dev)" elif [ -e "/sys/block/${target#/dev/}" ]; then printf 'Installing to %s\n' \ "$(get_block_dev_name "${target#/dev/}")" else printf 'Device %s not found\n' "${target}" >&2 exit 1 fi } print_usage() { printf 'Usage: %s [-m ] []\n' "${0}" } error() { local status=${1} local fmt="${2}" shift 2 printf "Error: ${fmt}\n" "${@}" >&2 exit ${status} } _select() { # Field width of the prompt numbers. select_width=$(expr ${#} : '.*') select_i= while :; do case "${select_i}" in '') select_i=0 for select_word in "${@}"; do select_i=$(expr ${select_i} + 1) printf "%${select_width}d) %s\\n" \ ${select_i} "${select_word}" \ >&2 done ;; *[!0-9]*) printf 'Please enter a number in range.\n' >&2 ;; *) if [ ${select_i} -gt 0 ] && \ [ ${select_i} -le ${#} ]; then shift $(expr $select_i - 1) select_result="${1}" break fi printf 'Please enter a number in range.\n' >&2 ;; esac # Prompt and read input. printf '%s' "${PS3-#? }" >&2 read -r select_i || exit done } pretty_print_size_dec() { local size="${1}" awk -v size=${size} 'BEGIN { split("B KB MB GB TB", units, " "); i=1; while (size >= 1000) { size /= 1000; ++i; }; printf("%.2f %s\n", size, units[i]); }' } pretty_print_size_bin() { local size="${1}" awk -v size=${size} 'BEGIN { split("B KiB MiB GiB TiB", units, " "); i=1; while (size >= 1024) { size /= 1024; ++i; }; printf("%.2f %s\n", size, units[i]); }' } get_block_dev_name() { local dev="${1}" local vendor= local model= if [ -e "/sys/block/${dev}/device/vendor" ]; then vendor="$(cat "/sys/block/${dev}/device/vendor")" model="$(cat "/sys/block/${dev}/device/model")" name="${vendor} ${model}" else name="$(cat "/sys/block/${dev}/device/name")" fi printf '%s' "${name}" } prompt_block_dev() { local dev= local name= local size= local size_s= local desc= local devs= set -- for dev in /sys/block/*; do dev="${dev#/sys/block/}" case "${dev}" in loop*|sr*) continue;; esac name="$(get_block_dev_name "${dev}")" size="$(cat "/sys/block/${dev}/size")" size="$(expr ${size} \* 512)" size_s="$(pretty_print_size_dec "${size}")" size_s="${size_s} ($(pretty_print_size_bin "${size}"))" desc="$(printf '%s (%s) - %s\n' "${name}" "${dev}" "${size_s}")" set -- "${@}" "${desc}" devs="$(printf '%s\n%s\t%s\n' "${devs}" "${desc}" "${dev}")" done printf 'Select a block device:\n' >&2 _select "${@}" while IFS=' ' read -r desc dev; do if [ "x${desc}" = "x${select_result}" ]; then printf '%s\n' "${dev}" fi done <<-EOF ${devs} EOF } main "${@}"