diff options
author | Gordon GECOS <u@adam> | 2020-11-01 17:24:33 -0500 |
---|---|---|
committer | Gordon GECOS <u@adam> | 2020-11-01 17:24:33 -0500 |
commit | 128fa6834d422bcf195436468927e57f332fd97d (patch) | |
tree | de3bb4853f6ae98b846e006f4533559efdebc67e /src/usb | |
parent | 3c23eac02d98fa8ccd27d2e8b19fc81060a0c52c (diff) |
rename usb.sh -> usb
Diffstat (limited to 'src/usb')
-rwxr-xr-x | src/usb | 90 |
1 files changed, 90 insertions, 0 deletions
@@ -0,0 +1,90 @@ | |||
1 | #!/bin/bash | ||
2 | |||
3 | die() { printf "%s: Error: %s\n" "$0" "$*" >&2; exit 1; } | ||
4 | |||
5 | ECHO() { printf "%s\n" "$*" >&2; } | ||
6 | |||
7 | PRINTF() { printf "$@" >&2; } | ||
8 | |||
9 | whole_device() | ||
10 | { | ||
11 | case "$1" in | ||
12 | *-part?) false ;; | ||
13 | *-part??) false ;; | ||
14 | *-part???) false ;; | ||
15 | */usb\*) false ;; | ||
16 | *) true ;; | ||
17 | esac | ||
18 | } | ||
19 | |||
20 | confirm_usb_strict() | ||
21 | { | ||
22 | CONFIRM_MSG="This will completely overwrite device:\n\n\t%s\n\nType 'yes' to confirm.\nContinue? " | ||
23 | CONFIRM_WITH_ONE_LETTER= | ||
24 | confirm_helper "$@" | ||
25 | } | ||
26 | |||
27 | confirm_usb_lax() | ||
28 | { | ||
29 | CONFIRM_MSG="The device used will be:\n\n\t%s\n\nType 'y' to confirm.\nContinue? " | ||
30 | CONFIRM_WITH_ONE_LETTER=y | ||
31 | confirm_helper "$@" | ||
32 | } | ||
33 | |||
34 | confirm_helper() | ||
35 | { | ||
36 | PRINTF "$CONFIRM_MSG" "$1" | ||
37 | read line | ||
38 | case "$line" in | ||
39 | [yY][eE][sS]) return ;; | ||
40 | [yY]) [ "$CONFIRM_WITH_ONE_LETTER" ] && return || : ;; | ||
41 | esac | ||
42 | die "Aborted by user." | ||
43 | } | ||
44 | |||
45 | choose_usb() | ||
46 | { | ||
47 | local devs maj USB | ||
48 | set -- /dev/disk/by-id/usb* | ||
49 | for dev; do | ||
50 | shift | ||
51 | whole_device "$dev" || continue | ||
52 | set -- "$@" "$dev" | ||
53 | done | ||
54 | if [ $# = 0 ]; then | ||
55 | die "no usb device found" | ||
56 | elif [ $# = 1 ]; then | ||
57 | [ "$NO_ACT" ] && confirm=confirm_usb_lax || confirm=confirm_usb_strict | ||
58 | $confirm "$1" || exit | ||
59 | USB=$1 | ||
60 | else | ||
61 | ECHO | ||
62 | PRINTF "%s\n" "The following candidate target devices have been found:" | ||
63 | i=0 | ||
64 | for dev; do | ||
65 | i=$((i+1)) | ||
66 | PRINTF "\n\n\t%2i. %s\n" $i "$dev" | ||
67 | done | ||
68 | PRINTF "%s\n\n" '' "Choose a device by its number, from 1 to $#, then press enter." "To abort, press CTRL-C." | ||
69 | PRINTF "\n%s" 'Your choice: ' | ||
70 | read line | ||
71 | case "$line" in | ||
72 | [1-9]|[1-9][0-9]) | ||
73 | [ $line -le $# -a $line -ge 1 ] || die "Invalid argument (out of range): $line" | ||
74 | USB=${!line} | ||
75 | ;; | ||
76 | *) die "Invalid argument: $line" ;; | ||
77 | esac | ||
78 | confirm_usb_lax | ||
79 | fi | ||
80 | [ "$USB" ] && readlink -f "$USB" | ||
81 | } | ||
82 | |||
83 | NO_ACT= | ||
84 | case "$1" in | ||
85 | -n) NO_ACT=y;; | ||
86 | -*) exit 1;; | ||
87 | esac | ||
88 | |||
89 | choose_usb | ||
90 | |||