~dricottone/my-utils

my-utils/archives/mktar -rwxr-xr-x 3.5 KiB
ef6d4cd1Dominic Ricottone Incomplete work on hardware/media utils 4 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/bin/bash

name="mktar"
version="1.4"
read -r -d '' help_message <<-EOF
	Archive utility
	Usage: mktar -n OUTFILE [OPTIONS] INFILES
	Options:
	 --checksum=ALGO               create checksum with [none|sha1|sha256]
	 -d DIR, --from-directory DIR  archive from a directory
	 -h, --help                    print this message
	 -n FILE, --name FILE          name of archive
	 -p PASS, --passphrase PASS    passphrase for encryption
	 -q, --quiet                   suppress error messages and prompts
	 -v, --verbose                 show additional messages
	 -V, --version                 print version number and exit
EOF

source /usr/local/lib/mylib.bash
source /usr/local/lib/archive.bash

archive_fn=""
checksum=-1
from_directory=""
positional=()
quiet=0
verbose=0
while [[ $# -gt 0 ]]; do
  case $1 in

  --checksum=no|--checksum=none|--checksum=0)
    debug_msg "Setting checksum option to 0 (=none) (was ${checksum})"
    checksum=0
    shift
    ;;

  --checksum=sha1|--checksum=1)
    debug_msg "Setting checksum option to 1 (=sha1) (was ${checksum})"
    checksum=1
    shift
    ;;

  --checksum=sha256|--checksum=2)
    debug_msg "Setting checksum option to 2 (=sha256) (was ${checksum})"
    checksum=2
    shift
    ;;

  --checksum=*)
    attempted_checksum="$(/usr/bin/printf "%s\n" "$1" | sed -e 's/^.*=//' )"
    error_msg "Unknown checksum '${attempted_checksum}'"
    ;;

  -d|--from-directory)
    debug_msg "Setting from_directory option to '${2}' (was ${from_directory})"
    from_directory="--directory $2"
    shift; shift
    ;;

  -h|--help)
    help_msg
    shift
    ;;

  -n|--name)
    debug_msg "Setting output filename to ${2} (was ${archive_fn})"
    archive_fn="$2"
    shift; shift
    ;;

  -p|--passphrase)
    debug_msg "Setting passphrase to ${2} (was ${passphrase})"
    passphrase="--passphrase $2"
    shift; shift
    ;;

  -q|--quiet)
    debug_msg "Setting quiet option to 1 (was ${quiet})"
    quiet=1
    shift
    ;;

  -v|--verbose)
    debug_msg "Setting verbose option to 1 (was ${verbose})"
    verbose=1
    shift
    ;;

  -V|--version)
    version_msg
    ;;

  *)
    debug_msg "Argument '${1}' added to positional array"
    positional+=("$1")
    shift
    ;;
  esac
done

# error if no archive file given
if [[ -z "$archive_fn" ]]; then
  error_msg "no archive file given"
  usage_msg
fi

# determine archive action
archive_action="$(archive_extension "$archive_fn" | tee >(>&2 /usr/bin/head -n -1) | /usr/bin/tail -n 1)"

# determine checksum action and filename
if [[ "$checksum" -eq 1 ]]; then
  checksum_action="sha1"
elif [[ "$checksum" -eq 2 ]]; then
  checksum_action="sha256"
fi
checksum_fn="$(fn_basename "$archive_fn").${checksum_action}"

# check checksum files
if [[ "$checksum" -ge 1 ]]; then
  if contains "$checksum_fn" "${positional[@]}"; then
    error_msg "checksum '${checksum_fn}' cannot be an input file"
  elif ! prompt_overwrite "checksum_fn"; then
    error_msg "checksum '${checksum_fn}' cannot be overwritten"
  fi
fi

# check passphrase
if [[ "$encrypt" -ge 1 && -z "$passphrase" ]]; then
  passphrase=
fi

if ! archive --archive=$archive_action --name "$archive_fn" $passphrase $from_directory "${positional[@]}"; then
  exit 1
fi

code=0
if [[ "$checksum" -ge 1 ]]; then
  case "$checksum_action" in
  sha1)
    if ! /usr/bin/sha1sum "$archive_fn" | /usr/bin/awk '{print $1}' > "$checksum_fn"; then
      code=1
    fi
    ;;

  sha256)
    if ! /usr/bin/sha256sum "$archive_fn" | /usr/bin/awk '{print $1}' > "$checksum_fn"; then
      code=1
    fi
    ;;
  esac
fi

exit "$code"