style(bkgpslog):checkMakeTar():Add/remove debug code
[EVA-2020-02.git] / exec / bkgpslog
CommitLineData
032f4b05
SBS
1#!/bin/bash
2
8fbca23d
SBS
3# Desc: Records gps data until midnight
4# Author: Steven Baltakatei Sandoval; License: GPLv3+
aa2a49f1 5# Usage: bkgpslog -o [output dir]
032f4b05 6
8fbca23d 7#==BEGIN Define script parameters==
6c30388f
SBS
8## Logging Behavior parameters
9BUFFER_TTL="60"; # time between file writes
10SCRIPT_TTL="day"; # (day|hour)
aa2a49f1
SBS
11#### TZ="UTC"; export TZ; # Default time zone; overridden by '--time-zone=[str]' option
12DIR_TMP_DEFAULT="/dev/shm"; # Default parent of working directory
6c30388f 13
aa2a49f1
SBS
14SCRIPT_TIME_START=$(date +%Y%m%dT%H%M%S.%N);
15PATH="$HOME/.local/bin:$PATH"; # Add "$(systemd-path user-binaries)" path in case apps saved there
16SCRIPT_HOSTNAME=$(hostname); # Save hostname of system running this script.
a96495d3 17SCRIPT_VERSION="0.3.0"; # Define version of script.
ff22a93f
SBS
18SCRIPT_NAME="bkgpslog"; # Define basename of script file.
19SCRIPT_URL="https://gitlab.com/baltakatei/ninfacyzga-01"; # Define wesite hosting this script.
20AGE_VERSION="1.0.0-beta2"; # Define version of age (encryption program)
21AGE_URL="https://github.com/FiloSottile/age/releases/tag/v1.0.0-beta2"; # Define website hosting age.
8fbca23d
SBS
22
23declare -Ag appRollCall # Associative array for storing app status
24declare -Ag fileRollCall # Associative array for storing file status
25declare -Ag dirRollCall # Associative array for storing dir status
17d49005 26declare -a recPubKeys # for processArguments function
77361307 27declare recipients # for main function
8fbca23d 28
cfc25c90
SBS
29## Initialize variables
30OPTION_VERBOSE=""; OPTION_ENCRYPT=""; OPTION_COMPRESS=""; OPTION_TMPDIR="";
31
8fbca23d
SBS
32#===BEGIN Declare local script functions===
33checkapp() {
34 # Desc: If arg is a command, save result in assoc array 'appRollCall'
35 # Usage: checkapp arg1 arg2 arg3 ...
36 # Input: global assoc. array 'appRollCall'
37 # Output: adds/updates key(value) to global assoc array 'appRollCall'
38 local returnState
39 #echo "DEBUG:$(date +%S.%N)..Starting checkapp function."
40 #echo "DEBUG:args: $@"
41 #echo "DEBUG:returnState:$returnState"
42
43 #===Process Args===
44 for arg in "$@"; do
45 #echo "DEBUG:processing arg:$arg"
0b3dde05 46 if command -v "$arg" 1>/dev/null 2>&1; then # Check if arg is a valid command
8fbca23d
SBS
47 appRollCall[$arg]="true";
48 #echo "DEBUG:appRollCall[$arg]:"${appRollCall[$arg]}
49 if ! [ "$returnState" = "false" ]; then returnState="true"; fi
50 else
51 appRollCall[$arg]="false"; returnState="false";
52 fi
53 done
54
55 #for key in "${!appRollCall[@]}"; do echo "DEBUG:$key => ${appRollCall[$key]}"; done
56 #echo "DEBUG:evaluating returnstate. returnState:"$returnState
57
58 #===Determine function return code===
59 if [ "$returnState" = "true" ]; then
60 #echo "DEBUG:checkapp returns true for $arg";
61 return 0;
62 else
63 #echo "DEBUG:checkapp returns false for $arg";
64 return 1;
65 fi
66} # Check that app exists
67checkfile() {
68 # Desc: If arg is a file path, save result in assoc array 'fileRollCall'
69 # Usage: checkfile arg1 arg2 arg3 ...
70 # Input: global assoc. array 'fileRollCall'
71 # Output: adds/updates key(value) to global assoc array 'fileRollCall';
72 # Output: returns 0 if app found, 1 otherwise
73 local returnState
74
75 #===Process Args===
76 for arg in "$@"; do
77 #echo "DEBUG:processing arg:$arg"
78 if [ -f "$arg" ]; then
79 fileRollCall["$arg"]="true";
80 #echo "DEBUG:fileRollCall[\"$arg\"]:"${fileRollCall["$arg"]}
81 if ! [ "$returnState" = "false" ]; then returnState="true"; fi
82 else
83 fileRollCall["$arg"]="false"; returnState="false";
84 fi
85 done
86
87 #for key in "${!fileRollCall[@]}"; do echo "DEBUG:fileRollCall key [$key] is:${fileRollCall[$key]}"; done
88 #echo "DEBUG:evaluating returnstate. returnState:"$returnState
89
90 #===Determine function return code===
91 if [ "$returnState" = "true" ]; then
92 #echo "DEBUG:checkapp returns true for $arg";
93 return 0;
94 else
95 #echo "DEBUG:checkapp returns false for $arg";
96 return 1;
97 fi
98} # Check that file exists
99checkdir() {
100 # Desc: If arg is a dir path, save result in assoc array 'dirRollCall'
101 # Usage: checkdir arg1 arg2 arg3 ...
102 # Input: global assoc. array 'dirRollCall'
103 # Output: adds/updates key(value) to global assoc array 'dirRollCall';
104 # Output: returns 0 if app found, 1 otherwise
105 local returnState
106
107 #===Process Args===
108 for arg in "$@"; do
109 #echo "DEBUG:processing arg:$arg"
110 if [ -d "$arg" ]; then
111 dirRollCall["$arg"]="true";
112 #echo "DEBUG:dirRollCall[\"$arg\"]:"${dirRollCall["$arg"]}
113 if ! [ "$returnState" = "false" ]; then returnState="true"; fi
bcf09dcc 114 elif [ "$arg" = "" ]; then
8fbca23d 115 dirRollCall["$arg"]="false"; returnState="false";
bcf09dcc
SBS
116 else
117 returnState="false";
8fbca23d
SBS
118 fi
119 done
120
121 #for key in "${!dirRollCall[@]}"; do echo "DEBUG:dirRollCall key [$key] is:${dirRollCall[$key]}"; done
122 #echo "DEBUG:evaluating returnstate. returnState:"$returnState
123
124 #===Determine function return code===
125 if [ "$returnState" = "true" ]; then
126 #echo "DEBUG:checkapp returns true for $arg";
127 return 0;
128 else
129 #echo "DEBUG:checkapp returns false for $arg";
130 return 1;
131 fi
132} # Check that dir exists
032f4b05 133
c609b9c8
SBS
134# Yell, Die, Try Three-Fingered Claw technique
135# Ref/Attrib: https://stackoverflow.com/a/25515370
136yell() { echo "$0: $*" >&2; }
137die() { yell "$*"; exit 111; }
138try() { "$@" || die "cannot $*"; }
139
032f4b05
SBS
140echoerr() {
141 echo "$@" 1>&2; # Define stderr echo function.
142} # Define stderr message function.
143showUsage() {
144 echoerr "USAGE:"
94e094d1 145 echoerr " bkgpslog [ options ]"
032f4b05
SBS
146 echoerr
147 echoerr "OPTIONS:"
148 echoerr " -h, --help"
149 echoerr " Display help information."
150 echoerr
151 echoerr " --version"
152 echoerr " Display script version."
153 echoerr
154 echoerr " -v, --verbose"
155 echoerr " Display debugging info."
156 echoerr
17d49005
SBS
157 echoerr " -e, --encrypt"
158 echoerr " Encrypt output."
159 echoerr
160 echoerr " -r, --recipient [ pubkey string ]"
f7f33d33
SBS
161 echoerr " Specify recipient. May be age or ssh pubkey."
162 echoerr " See https://github.com/FiloSottile/age"
17d49005 163 echoerr
032f4b05
SBS
164 echoerr " -o, --output [ directory ]"
165 echoerr " Specify output directory to save logs."
17d49005 166 echoerr
408a342b
SBS
167 echoerr " -c, --compress"
168 echoerr " Compress output with gzip (before encryption if enabled)."
169 echoerr
f7f33d33
SBS
170 echoerr " -z, --time-zone"
171 echoerr " Specify time zone. (ex: \"America/New_York\")"
172 echoerr
173 echoerr " -t, --temp-dir"
174 echoerr " Specify parent directory for temporary working directory."
175 echoerr " Default: \"/dev/shm\""
176 echoerr
17d49005 177 echoerr "EXAMPLE: (bash script lines)"
408a342b 178 echoerr "/bin/bash bkgpslog -e -c \\"
17d49005
SBS
179 echoerr "-r age1mrmfnwhtlprn4jquex0ukmwcm7y2nxlphuzgsgv8ew2k9mewy3rs8u7su5 \\"
180 echoerr "-r age1ala848kqrvxc88rzaauc6vc5v0fqrvef9dxyk79m0vjea3hagclswu0lgq \\"
181 echoerr "-o ~/Sync/Location"
032f4b05
SBS
182} # Display information on how to use this script.
183showVersion() {
184 echoerr "$SCRIPT_VERSION"
185} # Display script version.
186vbm() {
0b3dde05
SBS
187 # Usage: vbm "DEBUG:verbose message here"
188 # Description: Prints verbose message ("vbm") to stderr if OPTION_VERBOSE is set to "true".
189 # Input:
190 # - OPTION_VERBOSE variable set by processArguments function. (ex: "true", "false")
191 # - "$@" positional arguments fed to this function.
192 # Output: stderr
193 # Script function dependencies: echoerr
194 # External function dependencies: echo
195 # Last modified: 2020-04-11T23:57Z
196 # Last modified by: Steven Baltakatei Sandoval
197 # License: GPLv3+
198 # Ref./Attrib:
199
200 if [ "$OPTION_VERBOSE" = "true" ]; then
201 FUNCTION_TIME=$(date --iso-8601=ns); # Save current time in nano seconds.
202 echoerr "[$FUNCTION_TIME] ""$*"; # Display argument text.
032f4b05 203 fi
0b3dde05
SBS
204
205 # End function
206 return 0; # Function finished.
032f4b05
SBS
207} # Verbose message display function.
208processArguments() {
209 while [ ! $# -eq 0 ]; do # While number of arguments ($#) is not (!) equal to (-eq) zero (0).
d6896d3b
SBS
210 #echoerr "DEBUG:Starting processArguments while loop."
211 #echoerr "DEBUG:Provided arguments are:""$*"
032f4b05 212 case "$1" in
c1bbf9f7 213 -h | --help) showUsage; exit 1;; # Display usage.
032f4b05 214 --version) showVersion; exit 1;; # Show version
c1bbf9f7 215 -v | --verbose) OPTION_VERBOSE="true"; vbm "DEBUG:Verbose mode enabled.";; # Enable verbose mode.
6c30388f 216 -o | --output) if [ -d "$2" ]; then DIR_OUT="$2"; vbm "DEBUG:DIR_OUT:$DIR_OUT"; shift; fi ;; # Define output directory.
17d49005
SBS
217 -e | --encrypt) OPTION_ENCRYPT="true"; vbm "DEBUG:Encrypted output mode enabled.";;
218 -r | --recipient) # Add 'age' recipient via public key string
405ce7df 219 recPubKeys+=("$2"); vbm "STATUS:pubkey added:""$2"; shift;;
408a342b 220 -c | --compress) OPTION_COMPRESS="true"; vbm "DEBUG:Compressed output mode enabled.";;
6a17e8e7
SBS
221 -z | --time-zone) try setTimeZoneEV "$2"; shift;;
222 -t | --temp-dir) OPTION_TMPDIR="true" && TMP_DIR_PRIORITY="$2"; shift;;
b0da06ca 223 *) echoerr "ERROR: Unrecognized argument: $1"; echoerr "STATUS:All arguments:$*"; exit 1;; # Handle unrecognized options.
032f4b05
SBS
224 esac
225 shift
226 done
227} # Argument Processing
6c30388f
SBS
228setTimeZoneEV(){
229 # Desc: Set time zone environment variable TZ
230 # Usage: setTimeZoneEV arg1
231 # Input: arg1: 'date'-compatible timezone string (ex: "America/New_York")
232 # TZDIR env var (optional; default: "/usr/share/zoneinfo")
233 # Output: exports TZ
234 # exit code 0 on success
235 # exit code 1 on incorrect number of arguments
236 # exit code 2 if unable to validate arg1
237 # Depends: yell, printenv, bash 5
238 # Tested on: Debian 10
239 ARG1="$1"
240 local tzDir returnState
241 if ! [[ $# -eq 1 ]]; then
242 yell "ERROR:Invalid argument count.";
243 return 1;
244 fi
245
246 # Read TZDIR env var if available
247 if printenv TZDIR 1>/dev/null 2>&1; then
248 tzDir="$(printenv TZDIR)";
249 else
250 tzDir="/usr/share/zoneinfo";
251 fi
252
253 # Validate TZ string
254 if ! [[ -f "$tzDir"/"$ARG1" ]]; then
255 yell "ERROR:Invalid time zone argument.";
256 return 2;
257 else
258 # Export ARG1 as TZ environment variable
259 TZ="$ARG1" && export TZ && returnState="true";
260 fi
261
262 # Determine function return code
263 if [ "$returnState" = "true" ]; then
264 return 0;
265 fi
266} # Exports TZ environment variable
c2aaff78
SBS
267timeUntilNextDay(){
268 # Desc: Report seconds until next day.
3395ae22 269 # Version: 1.0.0
c2aaff78 270 # Output: stdout: integer seconds until next day
8fbca23d 271 # Output: exit code 0 if stdout > 0; 1 if stdout = 0; 2 if stdout < 0
c2aaff78
SBS
272 # Usage: timeUntilNextDay
273 # Usage: if ! myTTL="$(timeUntilNextDay)"; then yell "ERROR in if statement"; exit 1; fi
3395ae22
SBS
274 # Depends: date 8, echo 8, yell, try
275
c2aaff78 276 local returnState TIME_CURRENT TIME_NEXT_DAY SECONDS_UNTIL_NEXT_DAY
3395ae22 277
8fbca23d 278 TIME_CURRENT="$(date --iso-8601=seconds)" ; # Produce `date`-parsable current timestamp with resolution of 1 second.
c2aaff78
SBS
279 TIME_NEXT_DAY="$(date -d "$TIME_CURRENT next day" --iso-8601=date)"; # Produce timestamp of beginning of tomorrow with resolution of 1 second.
280 SECONDS_UNTIL_NEXT_DAY="$(( $(date +%s -d "$TIME_NEXT_DAY") - $(date +%s -d "$TIME_CURRENT") ))" ; # Calculate seconds until closest future midnight (res. 1 second).
281 if [[ "$SECONDS_UNTIL_NEXT_DAY" -gt 0 ]]; then
282 returnState="true";
283 elif [[ "$SECONDS_UNTIL_NEXT_DAY" -eq 0 ]]; then
3395ae22 284 returnState="warning_zero";
c2aaff78
SBS
285 yell "WARNING:Reported time until next day exactly zero.";
286 elif [[ "$SECONDS_UNTIL_NEXT_DAY" -lt 0 ]]; then
3395ae22 287 returnState="warning_negative";
c2aaff78
SBS
288 yell "WARNING:Reported time until next day is negative.";
289 fi
290
291 try echo "$SECONDS_UNTIL_NEXT_DAY"; # Report
292
3395ae22 293 # Determine function return code
c2aaff78
SBS
294 if [[ "$returnState" = "true" ]]; then
295 return 0;
3395ae22 296 elif [[ "$returnState" = "warning_zero" ]]; then
c2aaff78 297 return 1;
3395ae22 298 elif [[ "$returnState" = "warning_negative" ]]; then
c2aaff78
SBS
299 return 2;
300 fi
301} # Report seconds until next day
302timeUntilNextHour(){
303 # Desc: Report seconds until next hour
3395ae22 304 # Version 1.0.0
c2aaff78
SBS
305 # Output: stdout: integer seconds until next hour
306 # Output: exit code 0 if stdout > 0; 1 if stdout = 0; 2 if stdout < 0
307 # Usage: timeUntilNextHour
308 # Usage: if ! myTTL="$(timeUntilNextHour)"; then yell "ERROR in if statement"; exit 1; fi
3395ae22 309
c2aaff78
SBS
310 local returnState TIME_CURRENT TIME_NEXT_HOUR SECONDS_UNTIL_NEXT_HOUR
311 TIME_CURRENT="$(date --iso-8601=seconds)"; # Produce `date`-parsable current timestamp with resolution of 1 second.
312 TIME_NEXT_HOUR="$(date -d "$TIME_CURRENT next hour" --iso-8601=hours)"; # Produce `date`-parsable current time stamp with resolution of 1 second.
313 SECONDS_UNTIL_NEXT_HOUR="$(( $(date +%s -d "$TIME_NEXT_HOUR") - $(date +%s -d "$TIME_CURRENT") ))"; # Calculate seconds until next hour (res. 1 second).
314 if [[ "$SECONDS_UNTIL_NEXT_HOUR" -gt 0 ]]; then
8fbca23d 315 returnState="true";
c2aaff78 316 elif [[ "$SECONDS_UNTIL_NEXT_HOUR" -eq 0 ]]; then
3395ae22 317 returnState="warning_zero";
c2aaff78
SBS
318 yell "WARNING:Reported time until next hour exactly zero.";
319 elif [[ "$SECONDS_UNTIL_NEXT_HOUR" -lt 0 ]]; then
3395ae22 320 returnState="warning_negative";
c2aaff78 321 yell "WARNING:Reported time until next hour is negative.";
8fbca23d 322 fi
032f4b05 323
c2aaff78 324 try echo "$SECONDS_UNTIL_NEXT_HOUR"; # Report
8fbca23d 325
3395ae22 326 # Determine function return code
8fbca23d
SBS
327 if [[ "$returnState" = "true" ]]; then
328 return 0;
3395ae22 329 elif [[ "$returnState" = "warning_zero" ]]; then
8fbca23d 330 return 1;
3395ae22 331 elif [[ "$returnState" = "warning_negative" ]]; then
8fbca23d
SBS
332 return 2;
333 fi
c2aaff78 334} # Report seconds until next hour
8fbca23d
SBS
335dateTimeShort(){
336 # Desc: Timestamp without separators (YYYYmmddTHHMMSS+zzzz)
337 # Usage: dateTimeShort
338 # Output: stdout: timestamp (ISO-8601, no separators)
c2aaff78 339 local TIME_CURRENT TIME_CURRENT_SHORT
8fbca23d
SBS
340 TIME_CURRENT="$(date --iso-8601=seconds)" ; # Produce `date`-parsable current timestamp with resolution of 1 second.
341 TIME_CURRENT_SHORT="$(date -d "$TIME_CURRENT" +%Y%m%dT%H%M%S%z)"; # Produce separator-less current timestamp with resolution 1 second.
342 echo "$TIME_CURRENT_SHORT";
6c30388f
SBS
343} # Get YYYYmmddTHHMMSS±zzzz
344dateShort(){
345 # Desc: Date without separators (YYYYmmdd)
346 # Usage: dateShort
347 # Output: stdout: date (ISO-8601, no separators)
348 local TIME_CURRENT DATE_CURRENT_SHORT
349 TIME_CURRENT="$(date --iso-8601=seconds)" ; # Produce `date`-parsable current timestamp with resolution of 1 second.
350 DATE_CURRENT_SHORT="$(date -d "$TIME_CURRENT" +%Y%m%d)"; # Produce separator-less current date with resolution 1 day.
351 echo "$DATE_CURRENT_SHORT";
352} # Get YYYYmmdd
353timeDuration(){
a7b4a273 354 # Desc: Given seconds, output ISO-8601 duration string
6c30388f
SBS
355 # Ref/Attrib: ISO-8601:2004(E), §4.4.4.2 Representations of time intervals by duration and context information
356 # Note: "1 month" ("P1M") is assumed to be "30 days" (see ISO-8601:2004(E), §2.2.1.2)
a7b4a273
SBS
357 # Usage: timeDuration [1:seconds] ([2:precision])
358 # Version: 1.0.3
6c30388f
SBS
359 # Input: arg1: seconds as base 10 integer >= 0 (ex: 3601)
360 # arg2: precision level (optional; default=2)
361 # Output: stdout: ISO-8601 duration string (ex: "P1H1S", "P2Y10M15DT10H30M20S")
a7b4a273
SBS
362 # exit code 0: success
363 # exit code 1: error_input
364 # exit code 2: error_unknown
6c30388f 365 # Example: 'timeDuration 111111 3' yields 'P1DT6H51M'
3395ae22 366 # Depends: date 8 (gnucoreutils), yell,
a7b4a273 367 local returnState argSeconds argPrecision remainder precision witherPrecision
3395ae22
SBS
368 local fullYears fullMonths fullDays fullHours fullMinutes fullSeconds
369 local displayYears displayMonths displayDays displayHours displayMinutes displaySeconds
370 local hasYears hasMonths hasDays hasHours hasMinutes hasSeconds
371
a7b4a273
SBS
372 argSeconds="$1"; # read arg1 (seconds)
373 argPrecision="$2"; # read arg2 (precision)
6c30388f 374 precision=2; # set default precision
6c30388f
SBS
375
376 # Check that between one and two arguments is supplied
377 if ! { [[ $# -ge 1 ]] && [[ $# -le 2 ]]; }; then
378 yell "ERROR:Invalid number of arguments:$# . Exiting.";
a7b4a273 379 returnState="error_input"; fi
6c30388f 380
a7b4a273 381 # Check that argSeconds provided
6c30388f 382 if [[ $# -ge 1 ]]; then
a7b4a273
SBS
383 ## Check that argSeconds is a positive integer
384 if [[ "$argSeconds" =~ ^[[:digit:]]+$ ]]; then
3395ae22 385 :
6c30388f 386 else
a7b4a273
SBS
387 yell "ERROR:argSeconds not a digit.";
388 returnState="error_input";
6c30388f
SBS
389 fi
390 else
391 yell "ERROR:No argument provided. Exiting.";
392 exit 1;
393 fi
394
a7b4a273 395 # Consider whether argPrecision was provided
6c30388f 396 if [[ $# -eq 2 ]]; then
a7b4a273
SBS
397 # Check that argPrecision is a positive integer
398 if [[ "$argPrecision" =~ ^[[:digit:]]+$ ]] && [[ "$argPrecision" -gt 0 ]]; then
399 precision="$argPrecision";
6c30388f 400 else
a7b4a273
SBS
401 yell "ERROR:argPrecision not a positive integer. (is $argPrecision ). Leaving early.";
402 returnState="error_input";
6c30388f
SBS
403 fi;
404 else
3395ae22 405 :
6c30388f
SBS
406 fi;
407
a7b4a273 408 remainder="$argSeconds" ; # seconds
6c30388f
SBS
409 ## Calculate full years Y, update remainder
410 fullYears=$(( remainder / (365*24*60*60) ));
411 remainder=$(( remainder - (fullYears*365*24*60*60) ));
412 ## Calculate full months M, update remainder
413 fullMonths=$(( remainder / (30*24*60*60) ));
414 remainder=$(( remainder - (fullMonths*30*24*60*60) ));
415 ## Calculate full days D, update remainder
416 fullDays=$(( remainder / (24*60*60) ));
417 remainder=$(( remainder - (fullDays*24*60*60) ));
418 ## Calculate full hours H, update remainder
419 fullHours=$(( remainder / (60*60) ));
420 remainder=$(( remainder - (fullHours*60*60) ));
421 ## Calculate full minutes M, update remainder
422 fullMinutes=$(( remainder / (60) ));
423 remainder=$(( remainder - (fullMinutes*60) ));
424 ## Calculate full seconds S, update remainder
425 fullSeconds=$(( remainder / (1) ));
426 remainder=$(( remainder - (remainder*1) ));
427 ## Check which fields filled
428 if [[ $fullYears -gt 0 ]]; then hasYears="true"; else hasYears="false"; fi
429 if [[ $fullMonths -gt 0 ]]; then hasMonths="true"; else hasMonths="false"; fi
430 if [[ $fullDays -gt 0 ]]; then hasDays="true"; else hasDays="false"; fi
431 if [[ $fullHours -gt 0 ]]; then hasHours="true"; else hasHours="false"; fi
432 if [[ $fullMinutes -gt 0 ]]; then hasMinutes="true"; else hasMinutes="false"; fi
433 if [[ $fullSeconds -gt 0 ]]; then hasSeconds="true"; else hasSeconds="false"; fi
434
435 ## Determine which fields to display (see ISO-8601:2004 §4.4.3.2)
436 witherPrecision="false"
437
438 ### Years
439 if $hasYears && [[ $precision -gt 0 ]]; then
440 displayYears="true";
441 witherPrecision="true";
442 else
443 displayYears="false";
444 fi;
445 if $witherPrecision; then ((precision--)); fi;
446
447 ### Months
448 if $hasMonths && [[ $precision -gt 0 ]]; then
449 displayMonths="true";
450 witherPrecision="true";
451 else
452 displayMonths="false";
453 fi;
454 if $witherPrecision && [[ $precision -gt 0 ]]; then
455 displayMonths="true";
456 fi;
457 if $witherPrecision; then ((precision--)); fi;
458
459 ### Days
460 if $hasDays && [[ $precision -gt 0 ]]; then
461 displayDays="true";
462 witherPrecision="true";
463 else
464 displayDays="false";
465 fi;
466 if $witherPrecision && [[ $precision -gt 0 ]]; then
467 displayDays="true";
468 fi;
469 if $witherPrecision; then ((precision--)); fi;
470
471 ### Hours
472 if $hasHours && [[ $precision -gt 0 ]]; then
473 displayHours="true";
474 witherPrecision="true";
475 else
476 displayHours="false";
477 fi;
478 if $witherPrecision && [[ $precision -gt 0 ]]; then
479 displayHours="true";
480 fi;
481 if $witherPrecision; then ((precision--)); fi;
482
483 ### Minutes
484 if $hasMinutes && [[ $precision -gt 0 ]]; then
485 displayMinutes="true";
486 witherPrecision="true";
487 else
488 displayMinutes="false";
489 fi;
490 if $witherPrecision && [[ $precision -gt 0 ]]; then
491 displayMinutes="true";
492 fi;
493 if $witherPrecision; then ((precision--)); fi;
494
495 ### Seconds
496
497 if $hasSeconds && [[ $precision -gt 0 ]]; then
498 displaySeconds="true";
499 witherPrecision="true";
500 else
501 displaySeconds="false";
502 fi;
503 if $witherPrecision && [[ $precision -gt 0 ]]; then
504 displaySeconds="true";
505 fi;
506 if $witherPrecision; then ((precision--)); fi;
507
6c30388f
SBS
508 ## Determine whether or not the "T" separator is needed to separate date and time elements
509 if ( $displayHours || $displayMinutes || $displaySeconds); then
510 displayDateTime="true"; else displayDateTime="false"; fi
511
512 ## Construct duration output string
513 OUTPUT="P"
514 if $displayYears; then
515 OUTPUT=$OUTPUT$fullYears"Y"; fi
516 if $displayMonths; then
517 OUTPUT=$OUTPUT$fullMonths"M"; fi
518 if $displayDays; then
519 OUTPUT=$OUTPUT$fullDays"D"; fi
520 if $displayDateTime; then
521 OUTPUT=$OUTPUT"T"; fi
522 if $displayHours; then
523 OUTPUT=$OUTPUT$fullHours"H"; fi
524 if $displayMinutes; then
525 OUTPUT=$OUTPUT$fullMinutes"M"; fi
526 if $displaySeconds; then
527 OUTPUT=$OUTPUT$fullSeconds"S"; fi
528
529 ## Output duration string to stdout
a7b4a273 530 echo "$OUTPUT" && returnState="true";
6c30388f
SBS
531
532 #===Determine function return code===
533 if [ "$returnState" = "true" ]; then
534 return 0;
a7b4a273
SBS
535 elif [ "$returnState" = "error_input" ]; then
536 yell "ERROR:input";
6c30388f 537 return 1;
a7b4a273
SBS
538 else
539 yell "ERROR:Unknown";
540 return 2;
6c30388f
SBS
541 fi
542
543} # Get duration (ex: PT10M4S )
544displayMissing() {
545 # Desc: Displays missing apps, files, and dirs
546 # Usage: displayMissing
547 # Input: associative arrays: appRollCall, fileRollCall, dirRollCall
548 # Output: stderr messages
549 #==BEGIN Display errors==
550 #===BEGIN Display Missing Apps===
551 missingApps="Missing apps :"
552 #for key in "${!appRollCall[@]}"; do echo "DEBUG:$key => ${appRollCall[$key]}"; done
553 for key in "${!appRollCall[@]}"; do
554 value="${appRollCall[$key]}"
555 if [ "$value" = "false" ]; then
556 #echo "DEBUG:Missing apps: $key => $value";
557 missingApps="$missingApps""$key "
558 appMissing="true"
559 fi
560 done
561 if [ "$appMissing" = "true" ]; then # Only indicate if an app is missing.
562 echo "$missingApps" 1>&2;
563 fi
564 #===END Display Missing Apps===
565
566 #===BEGIN Display Missing Files===
567 missingFiles="Missing files:"
568 #for key in "${!fileRollCall[@]}"; do echo "DEBUG:$key => ${fileRollCall[$key]}"; done
569 for key in "${!fileRollCall[@]}"; do
570 value="${fileRollCall[$key]}"
571 if [ "$value" = "false" ]; then
572 #echo "DEBUG:Missing files: $key => $value";
573 missingFiles="$missingFiles""$key "
574 fileMissing="true"
575 fi
576 done
577 if [ "$fileMissing" = "true" ]; then # Only indicate if an app is missing.
578 echo "$missingFiles" 1>&2;
579 fi
580 #===END Display Missing Files===
581
582 #===BEGIN Display Missing Directories===
583 missingDirs="Missing dirs:"
584 #for key in "${!dirRollCall[@]}"; do echo "DEBUG:$key => ${dirRollCall[$key]}"; done
585 for key in "${!dirRollCall[@]}"; do
586 value="${dirRollCall[$key]}"
587 if [ "$value" = "false" ]; then
588 #echo "DEBUG:Missing dirs: $key => $value";
589 missingDirs="$missingDirs""$key "
590 dirMissing="true"
591 fi
592 done
593 if [ "$dirMissing" = "true" ]; then # Only indicate if an dir is missing.
594 echo "$missingDirs" 1>&2;
595 fi
596 #===END Display Missing Directories===
597
598 #==END Display errors==
599} # Display missing apps, files, dirs
600setScriptTTL() {
601 #Desc: Sets script TTL
602 #Usage: setScriptTTL arg1
603 #Input: arg1: "day" or "hour"
604 #Output: scriptTTL
605 #Depends: timeUntilNextHour or timeUntilNextDay
606 local ARG1
607 ARG1="$1"
608 if [[ "$ARG1" = "day" ]]; then
609 # Set script lifespan to end at start of next day
610 if ! scriptTTL="$(timeUntilNextDay)"; then
611 if [[ "$scriptTTL" -eq 0 ]]; then
612 ((scriptTTL++)); # Add 1 because 0 would cause 'timeout' to never timeout.
613 else
614 yell "ERROR: timeUntilNextDay exit code $?"; exit 1;
615 fi;
616 fi;
617 elif [[ "$ARG1" = "hour" ]]; then
618 # Set script lifespan to end at start of next hour
619 if ! scriptTTL="$(timeUntilNextHour)"; then
620 if [[ "$scriptTTL" -eq 0 ]]; then
621 ((scriptTTL++)); # Add 1 because 0 would cause 'timeout' to never timeout.
622 else
623 yell "ERROR: timeUntilNextHour exit code $?"; exit 1;
624 fi;
625 fi;
626 else
627 yell "ERROR:Invalid argument for setScriptTTL function."; exit 1;
628 fi
629} # Seconds until next (day|hour).
f6fb18bd
SBS
630checkMakeTar() {
631 # Desc: Checks that a valid tar archive exists, creates one otherwise
632 # Usage: checkMakeTar [ path ]
2fc10824 633 # Version: 1.0.1
f6fb18bd 634 # Input: arg1: path of tar archive
2fc10824
SBS
635 # Output: exit code 0 : tar readable
636 # exit code 1 : tar missing; created
637 # exit code 2 : tar not readable; moved; replaced
f6fb18bd 638 # Depends: try, tar, date
2fc10824
SBS
639 local PATH_TAR returnFlag0 returnFlag1 returnFlag2
640 PATH_TAR="$1"
f6fb18bd
SBS
641
642 # Check if file is a valid tar archive
643 if tar --list --file="$PATH_TAR" 1>/dev/null 2>&1; then
644 ## T1: return success
2fc10824 645 returnFlag0="tar valid";
f6fb18bd
SBS
646 else
647 ## F1: Check if file exists
648 if [[ -f "$PATH_TAR" ]]; then
649 ### T: Rename file
2fc10824
SBS
650 try mv "$PATH_TAR" "$PATH_TAR""--broken--""$(date +%Y%m%dT%H%M%S)" && \
651 returnFlag1="tar moved";
f6fb18bd
SBS
652 else
653 ### F: -
654 :
655 fi
656 ## F2: Create tar archive, return 0
2fc10824
SBS
657 try tar --create --file="$PATH_TAR" --files-from=/dev/null && \
658 returnFlag2="tar created";
659 fi
660
661 # Determine function return code
662 if [[ "$returnFlag0" = "tar valid" ]]; then
f6fb18bd 663 return 0;
2fc10824
SBS
664 elif [[ "$returnFlag2" = "tar created" ]] && ! [[ "$returnFlag1" = "tar moved" ]]; then
665 return 1; # tar missing so created
666 elif [[ "$returnFlag2" = "tar created" ]] && [[ "$returnFlag1" = "tar moved" ]]; then
667 return 2; # tar not readable so moved; replaced
f6fb18bd
SBS
668 fi
669} # checks if arg1 is tar; creates one otherwise
66af6225
SBS
670appendArgTar(){
671 # Desc: Writes first argument to temporary file with arguments as options, then appends file to tar
672 # Usage: writeArg "$(echo "Data to be written.")" [name of file to be inserted] [tar path] [temp dir] ([cmd1] [cmd2] [cmd3] [cmd4]...)
d7138c7f 673 # Version: 1.0.0
66af6225
SBS
674 # Input: arg1: data to be written
675 # arg2: file name of file to be inserted into tar
676 # arg3: tar archive path (must exist first)
677 # arg4: temporary working dir
678 # arg5+: command strings (ex: "gpsbabel -i nmea -f - -o kml -F - ")
679 # Output: file written to disk
680 # Example: decrypt multiple large files in parallel
681 # appendArgTar "$(cat /tmp/largefile1.gpg)" "largefile1" $HOME/archive.tar /tmp "gpg --decrypt" &
682 # appendArgTar "$(cat /tmp/largefile2.gpg)" "largefile2" $HOME/archive.tar /tmp "gpg --decrypt" &
683 # appendArgTar "$(cat /tmp/largefile3.gpg)" "largefile3" $HOME/archive.tar /tmp "gpg --decrypt" &
66af6225
SBS
684 # Depends: bash 5
685
d9fe1eba 686 # Save function name
d7138c7f
SBS
687 local FN="${FUNCNAME[0]}";
688 #yell "DEBUG:STATUS:$FN:Finished appendArgTar()."
d9fe1eba 689
66af6225 690 # Set file name
d9fe1eba 691 if ! [ -z "$2" ]; then FILENAME="$2"; else yell "ERROR:$FN:Not enough arguments."; exit 1; fi
66af6225
SBS
692
693 # Check tar path is a file
d9fe1eba 694 if [ -f "$3" ]; then TAR_PATH="$3"; else yell "ERROR:$FN:Tar archive arg not a file."; exit 1; fi
66af6225
SBS
695
696 # Check temp dir arg
d9fe1eba 697 if ! [ -z "$4" ]; then TMP_DIR="$4"; else yell "ERROR:$FN:No temporary working dir set."; exit 1; fi
66af6225
SBS
698
699 # Set command strings
700 if ! [ -z "$5" ]; then CMD1="$5"; else CMD1="tee /dev/null "; fi # command string 1
701 if ! [ -z "$6" ]; then CMD2="$6"; else CMD2="tee /dev/null "; fi # command string 2
702 if ! [ -z "$7" ]; then CMD3="$7"; else CMD3="tee /dev/null "; fi # command string 3
703 if ! [ -z "$8" ]; then CMD4="$8"; else CMD4="tee /dev/null "; fi # command string 4
704
d7138c7f
SBS
705 # # Debug
706 # yell "DEBUG:STATUS:$FN:CMD1:$CMD1"
707 # yell "DEBUG:STATUS:$FN:CMD2:$CMD2"
708 # yell "DEBUG:STATUS:$FN:CMD3:$CMD3"
709 # yell "DEBUG:STATUS:$FN:CMD4:$CMD4"
710 # yell "DEBUG:STATUS:$FN:FILENAME:$FILENAME"
711 # yell "DEBUG:STATUS:$FN:TAR_PATH:$TAR_PATH"
712 # yell "DEBUG:STATUS:$FN:TMP_DIR:$TMP_DIR"
713
66af6225
SBS
714 # Write to temporary working dir
715 echo "$1" | $CMD1 | $CMD2 | $CMD3 | $CMD4 > "$TMP_DIR"/"$FILENAME";
716
717 # Append to tar
718 try tar --append --directory="$TMP_DIR" --file="$TAR_PATH" "$FILENAME";
d7138c7f 719 #yell "DEBUG:STATUS:$FN:Finished appendArgTar()."
66af6225 720} # Append Bash var to file appended to Tar archive
3395ae22
SBS
721magicWriteVersion() {
722 # Desc: Appends time-stamped VERSION to PATHOUT_TAR
723 # Usage: magicWriteVersion
ff22a93f 724 # Version: 0.1.0
3395ae22 725 # Input: CONTENT_VERSION, FILEOUT_VERSION, PATHOUT_TAR, DIR_TMP
ff22a93f
SBS
726 # Input: SCRIPT_VERSION, SCRIPT_URL, AGE_VERSION, AGE_URL, SCRIPT_HOSTNAME
727 # Output: appends tar PATHOUT_TAR
3395ae22 728 # Depends: dateTimeShort, appendArgTar
ff22a93f 729 local CONTENT_VERSION pubKeyIndex
3395ae22 730
ff22a93f 731 # Set VERSION file name
3395ae22 732 FILEOUT_VERSION="$(dateTimeShort)..VERSION";
ff22a93f
SBS
733
734 # Gather VERSION data in CONTENT_VERSION
735 CONTENT_VERSION="SCRIPT_VERSION=$SCRIPT_VERSION";
aa2d7921
SBS
736 #CONTENT_VERSION="$CONTENT_VERSION""\\n";
737 CONTENT_VERSION="$CONTENT_VERSION""\\n""SCRIPT_NAME=$SCRIPT_NAME";
738 CONTENT_VERSION="$CONTENT_VERSION""\\n""SCRIPT_URL=$SCRIPT_URL";
739 CONTENT_VERSION="$CONTENT_VERSION""\\n""AGE_VERSION=$AGE_VERSION";
740 CONTENT_VERSION="$CONTENT_VERSION""\\n""AGE_URL=$AGE_URL";
741 CONTENT_VERSION="$CONTENT_VERSION""\\n""DATE=$(date --iso-8601=seconds)";
742 CONTENT_VERSION="$CONTENT_VERSION""\\n""HOSTNAME=$SCRIPT_HOSTNAME";
ff22a93f
SBS
743 ## Add list of recipient pubkeys
744 for pubkey in "${recPubKeysValid[@]}"; do
745 ((pubKeyIndex++))
aa2d7921 746 CONTENT_VERSION="$CONTENT_VERSION""\\n""PUBKEY_$pubKeyIndex=$pubkey";
ff22a93f
SBS
747 done
748 ## Process newline escapes
4c0c5850
SBS
749 CONTENT_VERSION="$(echo -e "$CONTENT_VERSION")"
750
ff22a93f 751 # Write CONTENT_VERSION as file FILEOUT_VERSION and write-append to PATHOUT_TAR
3395ae22 752 appendArgTar "$CONTENT_VERSION" "$FILEOUT_VERSION" "$PATHOUT_TAR" "$DIR_TMP";
ff22a93f 753
3395ae22 754} # bkgpslog: write version data to PATHOUT_TAR via appendArgTar()
66af6225
SBS
755magicWriteBuffer() {
756 # Desc: bkgpslog-specific meta function for writing data to DIR_TMP then appending each file to PATHOUT_TAR
f6fb18bd
SBS
757 # Inputs: PATHOUT_TAR FILEOUT_{NMEA,GPX,KML} CMD_CONV_{NMEA,GPX,KML} CMD_{COMPRESS,ENCRYPT} DIR_TMP
758 # Depends: yell, try, vbm, appendArgTar, tar
1b0e6227 759 local FN="${FUNCNAME[0]}";
872c737e 760 wait; # Wait to avoid collision with older magicWriteBuffer() instances (see https://www.tldp.org/LDP/abs/html/x9644.html )
f6fb18bd
SBS
761 vbm "DEBUG:STATUS:$FN:Started magicWriteBuffer().";
762
3395ae22
SBS
763 # Validate PATHOUT_TAR as tar.
764 checkMakeTar "$PATHOUT_TAR";
765 ## Add VERSION file if checkMakeTar had to create a tar (exited 1) or replace one (exited 2)
766 if [[ $? -eq 1 ]] || [[ $? -eq 2 ]]; then magicWriteVersion; fi
f6fb18bd
SBS
767
768 # Write bufferBash to PATHOUT_TAR
66af6225 769 appendArgTar "$bufferBash" "$FILEOUT_NMEA" "$PATHOUT_TAR" "$DIR_TMP" "$CMD_CONV_NMEA" "$CMD_COMPRESS" "$CMD_ENCRYPT"; # Write NMEA data
8e83fee8
SBS
770 appendArgTar "$bufferBash" "$FILEOUT_GPX" "$PATHOUT_TAR" "$DIR_TMP" "$CMD_CONV_GPX" "$CMD_COMPRESS" "$CMD_ENCRYPT"; # Write GPX file
771 appendArgTar "$bufferBash" "$FILEOUT_KML" "$PATHOUT_TAR" "$DIR_TMP" "$CMD_CONV_KML" "$CMD_COMPRESS" "$CMD_ENCRYPT"; # Write KML file
e0452100
SBS
772 # Remove secured chunks from DIR_TMP
773 try rm "$PATHOUT_NMEA" "$PATHOUT_GPX" "$PATHOUT_KML";
1b0e6227 774 yell "DEBUG:STATUS:$FN:Finished magicWriteBuffer().";
66af6225
SBS
775} # bkgpslog write function
776
032f4b05 777main() {
0b3dde05 778 processArguments "$@" # Process arguments.
cfc25c90 779
aa2a49f1 780 # Determine working directory
cfc25c90
SBS
781 ## Set DIR_TMP_PARENT to user-specified value if specified
782 if [[ "$OPTION_TMPDIR" = "true" ]]; then
783 if [[ -d "$TMP_DIR_PRIORITY" ]]; then
784 DIR_TMP_PARENT="$OPTION_TMPDIR";
785 else
66af6225 786 yell "WARNING:Specified temporary working directory not valid:$OPTION_TMPDIR";
cfc25c90
SBS
787 exit 1;
788 fi
789 fi
790
791 ## Set DIR_TMP_PARENT to default or fallback otherwise
aa2a49f1 792 if [[ -d "$DIR_TMP_DEFAULT" ]]; then
cfc25c90
SBS
793 DIR_TMP_PARENT="$DIR_TMP_DEFAULT";
794 elif [[ -d /tmp ]]; then
795 yell "WARNING:/dev/shm not available. Falling back to /tmp .";
796 DIR_TMP_PARENT="/tmp";
aa2a49f1
SBS
797 else
798 yell "ERROR:No valid working directory available. Exiting.";
799 exit 1;
800 fi
cfc25c90
SBS
801
802 ## Set DIR_TMP using DIR_TMP_PARENT and nonce (SCRIPT_TIME_START)
0f4d2d90 803 DIR_TMP="$DIR_TMP_PARENT"/"$SCRIPT_TIME_START""..bkgpslog" && vbm "DEBUG:Set DIR_TMP to:$DIR_TMP"; # Note: removed at end of main().
aa2a49f1 804
6c30388f 805 # Set output encryption and compression option strings
17d49005
SBS
806 if [[ "$OPTION_ENCRYPT" = "true" ]]; then # Check if encryption option active.
807 if checkapp age; then # Check that age is available.
808 for pubkey in "${recPubKeys[@]}"; do # Validate recipient pubkey strings by forming test message
809 vbm "DEBUG:Testing pubkey string:$pubkey"
408a342b 810 if echo "butts" | age -a -r "$pubkey" 1>/dev/null; then
ff22a93f 811 #### Form age recipient string
77361307 812 recipients="$recipients""-r $pubkey ";
405ce7df 813 vbm "STATUS:Added pubkey for forming age recipient string:""$pubkey";
77361307 814 vbm "DEBUG:recipients:""$recipients";
ff22a93f
SBS
815 #### Add validated pubkey to recPubKeysValid array
816 recPubKeysValid+=("$pubkey") && vbm "DEBUG:recPubkeysValid:pubkey added:$pubkey";
408a342b
SBS
817 else
818 yell "ERROR:Exit code ""$?"". Invalid recipient pubkey string. Exiting."; exit 1;
77361307 819 fi
17d49005 820 done
77361307 821 vbm "DEBUG:Finished processing recPubKeys array";
ff22a93f
SBS
822
823 ## Form age command string
c97313bf 824 CMD_ENCRYPT="age ""$recipients ";
408a342b 825 CMD_ENCRYPT_SUFFIX=".age";
17d49005
SBS
826 else
827 yell "ERROR:Encryption enabled but \"age\" not found. Exiting."; exit 1;
828 fi
408a342b 829 else
c97313bf 830 CMD_ENCRYPT="tee /dev/null ";
408a342b
SBS
831 CMD_ENCRYPT_SUFFIX="";
832 vbm "DEBUG:Encryption not enabled."
17d49005 833 fi
408a342b
SBS
834 if [[ "$OPTION_COMPRESS" = "true" ]]; then # Check if compression option active
835 if checkapp gzip; then # Check if gzip available
c97313bf 836 CMD_COMPRESS="gzip ";
408a342b
SBS
837 CMD_COMPRESS_SUFFIX=".gz";
838 else
839 yell "ERROR:Compression enabled but \"gzip\" not found. Exiting."; exit 1;
286d9825 840 fi
408a342b 841 else
c97313bf 842 CMD_COMPRESS="tee /dev/null ";
408a342b 843 CMD_COMPRESS_SUFFIX="";
1b0e6227 844 vbm "DEBUG:Compression not enabled.";
408a342b 845 fi
032f4b05 846
6c30388f
SBS
847 # Check that critical apps and dirs are available, displag missing ones.
848 if ! checkapp gpspipe tar && ! checkdir "$DIR_OUT" "/dev/shm"; then
849 yell "ERROR:Critical components missing.";
850 displayMissing; yell "Exiting."; exit 1; fi
851
852 # Set script lifespan
3395ae22 853 setScriptTTL "$SCRIPT_TTL"; # seconds until next new SCRIPT_TTL (ex: "day" or "hour")
6c30388f
SBS
854
855 # File name substring: encoded bufferTTL
856 bufferTTL_STR="$(timeDuration $BUFFER_TTL)";
857
858 # Init temp working dir
3a7b92f8 859 try mkdir "$DIR_TMP" && vbm "DEBUG:Working dir creatd at:$DIR_TMP";
6c30388f
SBS
860
861 # Initialize 'tar' archive
862 ## Define output tar path (note: each day gets *one* tar file (Ex: "20200731..hostname_location.[.gpx.gz].tar"))
9efeccb5
SBS
863 PATHOUT_TAR="$DIR_OUT"/"$(dateShort)".."$SCRIPT_HOSTNAME""_location""$CMD_COMPRESS_SUFFIX""$CMD_ENCRYPT_SUFFIX".tar && \
864 vbm "STATUS:Set PATHOUT_TAR to:$PATHOUT_TAR";
f6fb18bd
SBS
865 ## Check that PATHOUT_TAR is a tar. Rename old and create empty one otherwise.
866 checkMakeTar "$PATHOUT_TAR" && vbm "DEBUG:Confirmed or Created to be a tar:$PATHOUT_TAR";
6c30388f 867 ## Append VERSION file to PATHOUT_TAR
3395ae22 868 magicWriteVersion;
6c30388f
SBS
869
870 # Record gps data until script lifespan ends
871 declare debugCounter; debugCounter="0"; # set debug counter
6c30388f 872 while [[ "$SECONDS" -lt "$scriptTTL" ]]; do
29ef133a 873 timeBufferStart="$(dateTimeShort)"; # Note start time
6c30388f 874 # Determine file paths (time is start of buffer period)
29ef133a 875 FILEOUT_BASENAME="$timeBufferStart""--""$bufferTTL_STR""..""$SCRIPT_HOSTNAME""_location" && vbm "STATUS:Set FILEOUT_BASENAME to:$FILEOUT_BASENAME";
aa2a49f1 876 ## Files saved to DIR_TMP
1b0e6227
SBS
877 FILEOUT_NMEA="$FILEOUT_BASENAME".nmea"$CMD_COMPRESS_SUFFIX""$CMD_ENCRYPT_SUFFIX" && vbm "STATUS:Set FILEOUT_NMEA to:$FILEOUT_NMEA";
878 FILEOUT_GPX="$FILEOUT_BASENAME".gpx"$CMD_COMPRESS_SUFFIX""$CMD_ENCRYPT_SUFFIX" && vbm "STATUS:Set FILEOUT_GPX to:$FILEOUT_GPX";
879 FILEOUT_KML="$FILEOUT_BASENAME".kml"$CMD_COMPRESS_SUFFIX""$CMD_ENCRYPT_SUFFIX" && vbm "STATUS:Set FILEOUT_KML to:$FILEOUT_KML";
66af6225
SBS
880 PATHOUT_NMEA="$DIR_TMP"/"$FILEOUT_NMEA" && vbm "STATUS:Set PATHOUT_NMEA to:$PATHOUT_NMEA";
881 PATHOUT_GPX="$DIR_TMP"/"$FILEOUT_GPX" && vbm "STATUS:Set PATHOUT_GPX to:$PATHOUT_GPX";
882 PATHOUT_KML="$DIR_TMP"/"$FILEOUT_KML" && vbm "STATUS:Set PATHOUT_KML to:$PATHOUT_KML";
6c30388f
SBS
883 ## Files saved to disk (DIR_OUT)
884 ### one file per day (Ex: "20200731..hostname_location.[.gpx.gz].tar")
9e75f849 885 PATHOUT_TAR="$DIR_OUT"/"$(dateShort)".."$SCRIPT_HOSTNAME""_location""$CMD_COMPRESS_SUFFIX""$CMD_ENCRYPT_SUFFIX".tar && \
1b0e6227 886 vbm "STATUS:Set PATHOUT_TAR to:$PATHOUT_TAR";
6c30388f 887 # Define GPS conversion commands
405ce7df 888 CMD_CONV_NMEA="tee /dev/null " && vbm "STATUS:Set CMD_CONV_NMEA to:$CMD_CONV_NMEA"; # tee as passthrough
66af6225
SBS
889 CMD_CONV_GPX="gpsbabel -i nmea -f - -o gpx -F - " && vbm "STATUS:Set CMD_CONV_GPX to:$CMD_CONV_GPX"; # convert NMEA to GPX
890 CMD_CONV_KML="gpsbabel -i nmea -f - -o kml -F - " && vbm "STATUS:Set CMD_CONV_KML to:$CMD_CONV_KML"; # convert NMEA to KML
6c30388f 891 # Fill Bash variable buffer
18490e2b 892 bufferBash="$(timeout "$BUFFER_TTL""s" gpspipe -r)" && vbm "STATUS:Successfully filled bufferBash variable with gpspipe data."; # Record gpspipe nmea data to buffer for bufferTTL seconds
6c30388f 893 # Process bufferBash, save secured chunk set to DIR_TMP
18490e2b 894 vbm "STATUS:Beginning to save data to $DIR_TMP";
66af6225 895 magicWriteBuffer &
6c30388f 896 # Append each secured chunk in memory dir (DIR_TMP) to file on disk (PATHOUT_TAR in DIR_OUT)
405ce7df
SBS
897 vbm "STATUS:DIR_TMP :$DIR_TMP";
898 vbm "STATUS:PATHOUT_TAR :$PATHOUT_TAR";
899 vbm "STATUS:PATHOUT_NMEA:$PATHOUT_NMEA";
66af6225
SBS
900 vbm "STATUS:PATHOUT_GPX:$PATHOUT_GPX";
901 vbm "STATUS:PATHOUT_KML:$PATHOUT_KML";
e0452100 902
6c30388f 903 # Reset buffer and filenames
29ef133a 904 unset bufferBash FILEOUT_BASENAME PATHOUT_NMEA PATHOUT_GPX PATHOUT_KML PATHOUT_TAR timeBufferStart;
18490e2b 905 vbm "DEBUG:Completed buffer session $debugCounter ." 1>&2;
6c30388f
SBS
906 ((debugCounter++))
907 done
cfc25c90
SBS
908
909 # Remove DIR_TMP
910 try rm -r "$DIR_TMP";
0aabe6a3 911
1b0e6227 912 vbm "STATUS:Main function finished.";
8fbca23d
SBS
913} # Main function.
914#===END Declare local script functions===
915#==END Define script parameters==
032f4b05
SBS
916
917
8fbca23d
SBS
918#==BEGIN Perform work and exit==
919main "$@" # Run main function.
920exit 0;
921#==END Perform work and exit==