summaryrefslogtreecommitdiff
path: root/src/usb
diff options
context:
space:
mode:
authorGordon GECOS <u@adam>2020-11-01 17:24:33 -0500
committerGordon GECOS <u@adam>2020-11-01 17:24:33 -0500
commit128fa6834d422bcf195436468927e57f332fd97d (patch)
treede3bb4853f6ae98b846e006f4533559efdebc67e /src/usb
parent3c23eac02d98fa8ccd27d2e8b19fc81060a0c52c (diff)
rename usb.sh -> usb
Diffstat (limited to 'src/usb')
-rwxr-xr-xsrc/usb90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/usb b/src/usb
new file mode 100755
index 0000000..a8fd5fb
--- /dev/null
+++ b/src/usb
@@ -0,0 +1,90 @@
1#!/bin/bash
2
3die() { printf "%s: Error: %s\n" "$0" "$*" >&2; exit 1; }
4
5ECHO() { printf "%s\n" "$*" >&2; }
6
7PRINTF() { printf "$@" >&2; }
8
9whole_device()
10{
11 case "$1" in
12 *-part?) false ;;
13 *-part??) false ;;
14 *-part???) false ;;
15 */usb\*) false ;;
16 *) true ;;
17 esac
18}
19
20confirm_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
27confirm_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
34confirm_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
45choose_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
83NO_ACT=
84case "$1" in
85 -n) NO_ACT=y;;
86 -*) exit 1;;
87esac
88
89choose_usb
90