Change all-caps variable names to mix of lowercase and uppercase names
in order to avoid naming conflicts with environment variables.
Ref: https://mywiki.wooledge.org/BashGuide/InputAndOutput
scriptTimeStart=$(date +%Y%m%dT%H%M%S.%N);
PATH="$HOME/.local/bin:$PATH"; # Add "$(systemd-path user-binaries)" path in case apps saved there
scriptHostname=$(hostname); # Save hostname of system running this script.
scriptTimeStart=$(date +%Y%m%dT%H%M%S.%N);
PATH="$HOME/.local/bin:$PATH"; # Add "$(systemd-path user-binaries)" path in case apps saved there
scriptHostname=$(hostname); # Save hostname of system running this script.
-scriptVersion="0.5.7"; # Define version of script.
+scriptVersion="0.5.8"; # Define version of script.
scriptName="bkgpslog"; # Define basename of script file.
scriptURL="https://gitlab.com/baltakatei/ninfacyzga-01"; # Define wesite hosting this script.
ageVersion="1.0.0-beta2"; # Define version of age (encryption program)
scriptName="bkgpslog"; # Define basename of script file.
scriptURL="https://gitlab.com/baltakatei/ninfacyzga-01"; # Define wesite hosting this script.
ageVersion="1.0.0-beta2"; # Define version of age (encryption program)
# declare -a errorHistory # for correcting buffer lag
## Initialize variables
# declare -a errorHistory # for correcting buffer lag
## Initialize variables
-OPTION_VERBOSE=""; OPTION_ENCRYPT=""; OPTION_COMPRESS=""; OPTION_TMPDIR="";
-errReset=0; BUFFER_TTL_ADJ_FLOAT="";
+optionVerbose=""; optionEncrypt=""; optionCompress=""; optionTmpDir="";
+errReset=0; bufferTTL_AdjFloat=""; scriptTTL="";
#===BEGIN Declare local script functions===
#===BEGIN Declare local script functions===
+yell() { echo "$0: $*" >&2; } #o Yell, Die, Try Three-Fingered Claw technique
+die() { yell "$*"; exit 111; } #o Ref/Attrib: https://stackoverflow.com/a/25515370
+try() { "$@" || die "cannot $*"; } #o
checkapp() {
# Desc: If arg is a command, save result in assoc array 'appRollCall'
# Usage: checkapp arg1 arg2 arg3 ...
checkapp() {
# Desc: If arg is a command, save result in assoc array 'appRollCall'
# Usage: checkapp arg1 arg2 arg3 ...
return 1;
fi
} # Check that dir exists
return 1;
fi
} # Check that dir exists
-
-# Yell, Die, Try Three-Fingered Claw technique
-# Ref/Attrib: https://stackoverflow.com/a/25515370
-yell() { echo "$0: $*" >&2; }
-die() { yell "$*"; exit 111; }
-try() { "$@" || die "cannot $*"; }
-
echoerr() {
echo "$@" 1>&2; # Define stderr echo function.
} # Define stderr message function.
echoerr() {
echo "$@" 1>&2; # Define stderr echo function.
} # Define stderr message function.
echoerr "$scriptVersion"
} # Display script version.
vbm() {
echoerr "$scriptVersion"
} # Display script version.
vbm() {
+ # Description: Prints verbose message ("vbm") to stderr if optionVerbose is set to "true".
# Usage: vbm "DEBUG:verbose message here"
# Usage: vbm "DEBUG:verbose message here"
- # Description: Prints verbose message ("vbm") to stderr if OPTION_VERBOSE is set to "true".
- # Input:
- # - OPTION_VERBOSE variable set by processArguments function. (ex: "true", "false")
- # - "$@" positional arguments fed to this function.
+ # Version 0.1.1
+ # Input: arg1: string
+ # vars: optionVerbose
- # Script function dependencies: echoerr
- # External function dependencies: echo
- # Last modified: 2020-04-11T23:57Z
- # Last modified by: Steven Baltakatei Sandoval
- # License: GPLv3+
- # Ref./Attrib:
-
- if [ "$OPTION_VERBOSE" = "true" ]; then
- FUNCTION_TIME=$(date --iso-8601=ns); # Save current time in nano seconds.
- echoerr "[$FUNCTION_TIME] ""$*"; # Display argument text.
+ # Depends: echo 8, date 8
+
+ if [ "$optionVerbose" = "true" ]; then
+ functionTime=$(date --iso-8601=ns); # Save current time in nano seconds.
+ echo "[$functionTime] ""$*" 1>&2; # Display argument text.
fi
# End function
return 0; # Function finished.
fi
# End function
return 0; # Function finished.
-} # Verbose message display function.
+} # Displays message if optionVerbose true
processArguments() {
while [ ! $# -eq 0 ]; do # While number of arguments ($#) is not (!) equal to (-eq) zero (0).
#echoerr "DEBUG:Starting processArguments while loop."
processArguments() {
while [ ! $# -eq 0 ]; do # While number of arguments ($#) is not (!) equal to (-eq) zero (0).
#echoerr "DEBUG:Starting processArguments while loop."
case "$1" in
-h | --help) showUsage; exit 1;; # Display usage.
--version) showVersion; exit 1;; # Show version
case "$1" in
-h | --help) showUsage; exit 1;; # Display usage.
--version) showVersion; exit 1;; # Show version
- -v | --verbose) OPTION_VERBOSE="true"; vbm "DEBUG:Verbose mode enabled.";; # Enable verbose mode.
- -o | --output) if [ -d "$2" ]; then DIR_OUT="$2"; vbm "DEBUG:DIR_OUT:$DIR_OUT"; shift; fi ;; # Define output directory.
- -e | --encrypt) OPTION_ENCRYPT="true"; vbm "DEBUG:Encrypted output mode enabled.";; # Enable encryption
- -r | --recipient) OPTION_RECIPIENTS="true"; argRecPubKeys+=("$2"); vbm "STATUS:pubkey added:""$2"; shift;; # Add recipients
- -c | --compress) OPTION_COMPRESS="true"; vbm "DEBUG:Compressed output mode enabled.";; # Enable compression
+ -v | --verbose) optionVerbose="true"; vbm "DEBUG:Verbose mode enabled.";; # Enable verbose mode.
+ -o | --output) if [ -d "$2" ]; then dirOut="$2"; vbm "DEBUG:dirOut:$dirOut"; shift; fi ;; # Define output directory.
+ -e | --encrypt) optionEncrypt="true"; vbm "DEBUG:Encrypted output mode enabled.";; # Enable encryption
+ -r | --recipient) optionRecipients="true"; argRecPubKeys+=("$2"); vbm "STATUS:pubkey added:""$2"; shift;; # Add recipients
+ -c | --compress) optionCompress="true"; vbm "DEBUG:Compressed output mode enabled.";; # Enable compression
-z | --time-zone) try setTimeZoneEV "$2"; shift;; # Set timestamp timezone
-z | --time-zone) try setTimeZoneEV "$2"; shift;; # Set timestamp timezone
- -t | --temp-dir) OPTION_TMPDIR="true" && argTempDirPriority="$2"; shift;; # Set time zone
- -R | --recipient-dir) OPTION_RECIPIENTS="true"; OPTION_RECDIR="true" && argRecDir="$2"; shift;; # Add recipient watch dir
- -b | --buffer-ttl) OPTION_CUSTOM_BUFFERTTL="true" && argCustomBufferTTL="$2"; shift;; # Set custom buffer period (default: 300 seconds)
- -B | --script-ttl) OPTION_CUSTOM_SCRIPTTTL_TE="true" && argCustomScriptTTL="$2"; shift;; # Set custom script TTL (default: "day")
+ -t | --temp-dir) optionTmpDir="true" && argTempDirPriority="$2"; shift;; # Set time zone
+ -R | --recipient-dir) optionRecipients="true"; optionRecDir="true" && argRecDir="$2"; shift;; # Add recipient watch dir
+ -b | --buffer-ttl) optionCustomBufferTTL="true" && argCustomBufferTTL="$2"; shift;; # Set custom buffer period (default: 300 seconds)
+ -B | --script-ttl) optionCustomScriptTTL_TE="true" && argCustomScriptTTL="$2"; shift;; # Set custom script TTL (default: "day")
*) echoerr "ERROR: Unrecognized argument: $1"; echoerr "STATUS:All arguments:$*"; exit 1;; # Handle unrecognized options.
esac
shift
*) echoerr "ERROR: Unrecognized argument: $1"; echoerr "STATUS:All arguments:$*"; exit 1;; # Handle unrecognized options.
esac
shift
setTimeZoneEV(){
# Desc: Set time zone environment variable TZ
# Usage: setTimeZoneEV arg1
setTimeZoneEV(){
# Desc: Set time zone environment variable TZ
# Usage: setTimeZoneEV arg1
# Input: arg1: 'date'-compatible timezone string (ex: "America/New_York")
# TZDIR env var (optional; default: "/usr/share/zoneinfo")
# Output: exports TZ
# Input: arg1: 'date'-compatible timezone string (ex: "America/New_York")
# TZDIR env var (optional; default: "/usr/share/zoneinfo")
# Output: exports TZ
# exit code 2 if unable to validate arg1
# Depends: yell, printenv, bash 5
# Tested on: Debian 10
# exit code 2 if unable to validate arg1
# Depends: yell, printenv, bash 5
# Tested on: Debian 10
- ARG1="$1"
- local tzDir returnState
+ local tzDir returnState argTimeZone
+
+ argTimeZone="$1"
if ! [[ $# -eq 1 ]]; then
yell "ERROR:Invalid argument count.";
return 1;
if ! [[ $# -eq 1 ]]; then
yell "ERROR:Invalid argument count.";
return 1;
- if ! [[ -f "$tzDir"/"$ARG1" ]]; then
+ if ! [[ -f "$tzDir"/"$argTimeZone" ]]; then
yell "ERROR:Invalid time zone argument.";
return 2;
else
# Export ARG1 as TZ environment variable
yell "ERROR:Invalid time zone argument.";
return 2;
else
# Export ARG1 as TZ environment variable
- TZ="$ARG1" && export TZ && returnState="true";
+ TZ="$argTimeZone" && export TZ && returnState="true";
fi
# Determine function return code
fi
# Determine function return code
} # Exports TZ environment variable
timeUntilNextDay(){
# Desc: Report seconds until next day.
} # Exports TZ environment variable
timeUntilNextDay(){
# Desc: Report seconds until next day.
# Output: stdout: integer seconds until next day
# Output: exit code 0 if stdout > 0; 1 if stdout = 0; 2 if stdout < 0
# Usage: timeUntilNextDay
# Usage: if ! myTTL="$(timeUntilNextDay)"; then yell "ERROR in if statement"; exit 1; fi
# Depends: date 8, echo 8, yell, try
# Output: stdout: integer seconds until next day
# Output: exit code 0 if stdout > 0; 1 if stdout = 0; 2 if stdout < 0
# Usage: timeUntilNextDay
# Usage: if ! myTTL="$(timeUntilNextDay)"; then yell "ERROR in if statement"; exit 1; fi
# Depends: date 8, echo 8, yell, try
- local returnState TIME_CURRENT TIME_NEXT_DAY SECONDS_UNTIL_NEXT_DAY
-
- TIME_CURRENT="$(date --iso-8601=seconds)" ; # Produce `date`-parsable current timestamp with resolution of 1 second.
- TIME_NEXT_DAY="$(date -d "$TIME_CURRENT next day" --iso-8601=date)"; # Produce timestamp of beginning of tomorrow with resolution of 1 second.
- SECONDS_UNTIL_NEXT_DAY="$(( $(date +%s -d "$TIME_NEXT_DAY") - $(date +%s -d "$TIME_CURRENT") ))" ; # Calculate seconds until closest future midnight (res. 1 second).
- if [[ "$SECONDS_UNTIL_NEXT_DAY" -gt 0 ]]; then
+ local returnState timeCurrent timeNextDay secondsUntilNextDay returnState
+ timeCurrent="$(date --iso-8601=seconds)" ; # Produce `date`-parsable current timestamp with resolution of 1 second.
+ timeNextDay="$(date -d "$timeCurrent next day" --iso-8601=date)"; # Produce timestamp of beginning of tomorrow with resolution of 1 second.
+ secondsUntilNextDay="$(( $(date +%s -d "$timeNextDay") - $(date +%s -d "$timeCurrent") ))" ; # Calculate seconds until closest future midnight (res. 1 second).
+ if [[ "$secondsUntilNextDay" -gt 0 ]]; then
- elif [[ "$SECONDS_UNTIL_NEXT_DAY" -eq 0 ]]; then
+ elif [[ "$secondsUntilNextDay" -eq 0 ]]; then
returnState="warning_zero";
yell "WARNING:Reported time until next day exactly zero.";
returnState="warning_zero";
yell "WARNING:Reported time until next day exactly zero.";
- elif [[ "$SECONDS_UNTIL_NEXT_DAY" -lt 0 ]]; then
+ elif [[ "$secondsUntilNextDay" -lt 0 ]]; then
returnState="warning_negative";
yell "WARNING:Reported time until next day is negative.";
fi
returnState="warning_negative";
yell "WARNING:Reported time until next day is negative.";
fi
- try echo "$SECONDS_UNTIL_NEXT_DAY"; # Report
+ try echo "$secondsUntilNextDay"; # Report
# Determine function return code
if [[ "$returnState" = "true" ]]; then
# Determine function return code
if [[ "$returnState" = "true" ]]; then
} # Report seconds until next day
timeUntilNextHour(){
# Desc: Report seconds until next hour
} # Report seconds until next day
timeUntilNextHour(){
# Desc: Report seconds until next hour
# Output: stdout: integer seconds until next hour
# Output: exit code 0 if stdout > 0; 1 if stdout = 0; 2 if stdout < 0
# Usage: timeUntilNextHour
# Usage: if ! myTTL="$(timeUntilNextHour)"; then yell "ERROR in if statement"; exit 1; fi
# Output: stdout: integer seconds until next hour
# Output: exit code 0 if stdout > 0; 1 if stdout = 0; 2 if stdout < 0
# Usage: timeUntilNextHour
# Usage: if ! myTTL="$(timeUntilNextHour)"; then yell "ERROR in if statement"; exit 1; fi
- local returnState TIME_CURRENT TIME_NEXT_HOUR SECONDS_UNTIL_NEXT_HOUR
- TIME_CURRENT="$(date --iso-8601=seconds)"; # Produce `date`-parsable current timestamp with resolution of 1 second.
- TIME_NEXT_HOUR="$(date -d "$TIME_CURRENT next hour" --iso-8601=hours)"; # Produce `date`-parsable current time stamp with resolution of 1 second.
- SECONDS_UNTIL_NEXT_HOUR="$(( $(date +%s -d "$TIME_NEXT_HOUR") - $(date +%s -d "$TIME_CURRENT") ))"; # Calculate seconds until next hour (res. 1 second).
- if [[ "$SECONDS_UNTIL_NEXT_HOUR" -gt 0 ]]; then
+ local returnState timeCurrent timeNextHour secondsUntilNextHour
+ timeCurrent="$(date --iso-8601=seconds)"; # Produce `date`-parsable current timestamp with resolution of 1 second.
+ timeNextHour="$(date -d "$timeCurrent next hour" --iso-8601=hours)"; # Produce `date`-parsable current time stamp with resolution of 1 second.
+ secondsUntilNextHour="$(( $(date +%s -d "$timeNextHour") - $(date +%s -d "$timeCurrent") ))"; # Calculate seconds until next hour (res. 1 second).
+ if [[ "$secondsUntilNextHour" -gt 0 ]]; then
- elif [[ "$SECONDS_UNTIL_NEXT_HOUR" -eq 0 ]]; then
+ elif [[ "$secondsUntilNextHour" -eq 0 ]]; then
returnState="warning_zero";
yell "WARNING:Reported time until next hour exactly zero.";
returnState="warning_zero";
yell "WARNING:Reported time until next hour exactly zero.";
- elif [[ "$SECONDS_UNTIL_NEXT_HOUR" -lt 0 ]]; then
+ elif [[ "$secondsUntilNextHour" -lt 0 ]]; then
returnState="warning_negative";
yell "WARNING:Reported time until next hour is negative.";
returnState="warning_negative";
yell "WARNING:Reported time until next hour is negative.";
- try echo "$SECONDS_UNTIL_NEXT_HOUR"; # Report
+ try echo "$secondsUntilNextHour"; # Report
# Determine function return code
if [[ "$returnState" = "true" ]]; then
# Determine function return code
if [[ "$returnState" = "true" ]]; then
return 1;
elif [[ "$returnState" = "warning_negative" ]]; then
return 2;
return 1;
elif [[ "$returnState" = "warning_negative" ]]; then
return 2;
} # Report seconds until next hour
dateTimeShort(){
# Desc: Timestamp without separators (YYYYmmddTHHMMSS+zzzz)
# Usage: dateTimeShort ([str date])
} # Report seconds until next hour
dateTimeShort(){
# Desc: Timestamp without separators (YYYYmmddTHHMMSS+zzzz)
# Usage: dateTimeShort ([str date])
# Input: arg1: 'date'-parsable timestamp string (optional)
# Output: stdout: timestamp (ISO-8601, no separators)
# Depends: yell
# Input: arg1: 'date'-parsable timestamp string (optional)
# Output: stdout: timestamp (ISO-8601, no separators)
# Depends: yell
- local TIME_CURRENT TIME_CURRENT_SHORT argTime
+ local argTime timeCurrent timeInput timeCurrentShort
argTime="$1";
# Get Current Time
argTime="$1";
# Get Current Time
- TIME_CURRENT="$(date --iso-8601=seconds)" ; # Produce `date`-parsable current timestamp with resolution of 1 second.
+ timeCurrent="$(date --iso-8601=seconds)" ; # Produce `date`-parsable current timestamp with resolution of 1 second.
# Decide to parse current or supplied date
## Check if time argument empty
if [[ -z "$argTime" ]]; then
## T: Time argument empty, use current time
# Decide to parse current or supplied date
## Check if time argument empty
if [[ -z "$argTime" ]]; then
## T: Time argument empty, use current time
- TIME_INPUT="$TIME_CURRENT";
+ timeInput="$timeCurrent";
else
## F: Time argument exists, validate time
if date --date="$argTime" 1>/dev/null 2>&1; then
### T: Time argument is valid; use it
else
## F: Time argument exists, validate time
if date --date="$argTime" 1>/dev/null 2>&1; then
### T: Time argument is valid; use it
else
### F: Time argument not valid; exit
else
### F: Time argument not valid; exit
- yell "ERROR:Invalid time argument supplied: \"$argTime\""; yell "Exiting."; exit 1;
+ yell "ERROR:Invalid time argument supplied. Exiting."; exit 1;
fi
fi
# Construct and deliver separator-les date string
fi
fi
# Construct and deliver separator-les date string
- TIME_CURRENT_SHORT="$(date -d "$TIME_INPUT" +%Y%m%dT%H%M%S%z)";
- echo "$TIME_CURRENT_SHORT";
+ timeCurrentShort="$(date -d "$timeInput" +%Y%m%dT%H%M%S%z)";
+ echo "$timeCurrentShort";
} # Get YYYYmmddTHHMMSS±zzzz
dateShort(){
# Desc: Date without separators (YYYYmmdd)
# Usage: dateShort ([str date])
} # Get YYYYmmddTHHMMSS±zzzz
dateShort(){
# Desc: Date without separators (YYYYmmdd)
# Usage: dateShort ([str date])
# Input: arg1: 'date'-parsable timestamp string (optional)
# Output: stdout: date (ISO-8601, no separators)
# Depends: yell
# Input: arg1: 'date'-parsable timestamp string (optional)
# Output: stdout: date (ISO-8601, no separators)
# Depends: yell
- local TIME_CURRENT DATE_CURRENT_SHORT
+ local argTime timeCurrent timeInput dateCurrentShort
argTime="$1";
# Get Current Time
argTime="$1";
# Get Current Time
- TIME_CURRENT="$(date --iso-8601=seconds)" ; # Produce `date`-parsable current timestamp with resolution of 1 second.
+ timeCurrent="$(date --iso-8601=seconds)" ; # Produce `date`-parsable current timestamp with resolution of 1 second.
# Decide to parse current or supplied date
## Check if time argument empty
if [[ -z "$argTime" ]]; then
## T: Time argument empty, use current time
# Decide to parse current or supplied date
## Check if time argument empty
if [[ -z "$argTime" ]]; then
## T: Time argument empty, use current time
- TIME_INPUT="$TIME_CURRENT";
+ timeInput="$timeCurrent";
else
## F: Time argument exists, validate time
if date --date="$argTime" 1>/dev/null 2>&1; then
### T: Time argument is valid; use it
else
## F: Time argument exists, validate time
if date --date="$argTime" 1>/dev/null 2>&1; then
### T: Time argument is valid; use it
else
### F: Time argument not valid; exit
else
### F: Time argument not valid; exit
- yell "ERROR:Invalid time argument supplied: \"$argTime\""; yell "Exiting."; exit 1;
+ yell "ERROR:Invalid time argument supplied. Exiting."; exit 1;
fi
fi
# Construct and deliver separator-les date string
fi
fi
# Construct and deliver separator-les date string
- DATE_CURRENT_SHORT="$(date -d "$TIME_INPUT" +%Y%m%d)"; # Produce separator-less current date with resolution 1 day.
- echo "$DATE_CURRENT_SHORT";
+ dateCurrentShort="$(date -d "$timeInput" +%Y%m%d)"; # Produce separator-less current date with resolution 1 day.
+ echo "$dateCurrentShort";
} # Get YYYYmmdd
timeDuration(){
# Desc: Given seconds, output ISO-8601 duration string
# Ref/Attrib: ISO-8601:2004(E), §4.4.4.2 Representations of time intervals by duration and context information
# Note: "1 month" ("P1M") is assumed to be "30 days" (see ISO-8601:2004(E), §2.2.1.2)
# Usage: timeDuration [1:seconds] ([2:precision])
} # Get YYYYmmdd
timeDuration(){
# Desc: Given seconds, output ISO-8601 duration string
# Ref/Attrib: ISO-8601:2004(E), §4.4.4.2 Representations of time intervals by duration and context information
# Note: "1 month" ("P1M") is assumed to be "30 days" (see ISO-8601:2004(E), §2.2.1.2)
# Usage: timeDuration [1:seconds] ([2:precision])
# Input: arg1: seconds as base 10 integer >= 0 (ex: 3601)
# arg2: precision level (optional; default=2)
# Output: stdout: ISO-8601 duration string (ex: "P1H1S", "P2Y10M15DT10H30M20S")
# Input: arg1: seconds as base 10 integer >= 0 (ex: 3601)
# arg2: precision level (optional; default=2)
# Output: stdout: ISO-8601 duration string (ex: "P1H1S", "P2Y10M15DT10H30M20S")
# exit code 1: error_input
# exit code 2: error_unknown
# Example: 'timeDuration 111111 3' yields 'P1DT6H51M'
# exit code 1: error_input
# exit code 2: error_unknown
# Example: 'timeDuration 111111 3' yields 'P1DT6H51M'
- # Depends: date 8 (gnucoreutils), yell,
- local returnState argSeconds argPrecision remainder precision witherPrecision
+ # Depends: date 8, bash 5, yell,
+ local argSeconds argPrecision precision returnState remainder
local fullYears fullMonths fullDays fullHours fullMinutes fullSeconds
local fullYears fullMonths fullDays fullHours fullMinutes fullSeconds
- local displayYears displayMonths displayDays displayHours displayMinutes displaySeconds
local hasYears hasMonths hasDays hasHours hasMinutes hasSeconds
local hasYears hasMonths hasDays hasHours hasMinutes hasSeconds
+ local witherPrecision output
+ local displayYears displayMonths displayDays displayHours displayMinutes displaySeconds
argSeconds="$1"; # read arg1 (seconds)
argPrecision="$2"; # read arg2 (precision)
argSeconds="$1"; # read arg1 (seconds)
argPrecision="$2"; # read arg2 (precision)
displayDateTime="true"; else displayDateTime="false"; fi
## Construct duration output string
displayDateTime="true"; else displayDateTime="false"; fi
## Construct duration output string
- OUTPUT=$OUTPUT$fullYears"Y"; fi
+ output=$output$fullYears"Y"; fi
- OUTPUT=$OUTPUT$fullMonths"M"; fi
+ output=$output$fullMonths"M"; fi
- OUTPUT=$OUTPUT$fullDays"D"; fi
+ output=$output$fullDays"D"; fi
if $displayDateTime; then
if $displayDateTime; then
- OUTPUT=$OUTPUT$fullHours"H"; fi
+ output=$output$fullHours"H"; fi
- OUTPUT=$OUTPUT$fullMinutes"M"; fi
+ output=$output$fullMinutes"M"; fi
- OUTPUT=$OUTPUT$fullSeconds"S"; fi
+ output=$output$fullSeconds"S"; fi
## Output duration string to stdout
## Output duration string to stdout
- echo "$OUTPUT" && returnState="true";
+ echo "$output" && returnState="true";
#===Determine function return code===
if [ "$returnState" = "true" ]; then
#===Determine function return code===
if [ "$returnState" = "true" ]; then
displayMissing() {
# Desc: Displays missing apps, files, and dirs
# Usage: displayMissing
displayMissing() {
# Desc: Displays missing apps, files, and dirs
# Usage: displayMissing
# Input: associative arrays: appRollCall, fileRollCall, dirRollCall
# Input: associative arrays: appRollCall, fileRollCall, dirRollCall
- # Output: stderr messages
+ # Output: stderr: messages indicating missing apps, file, or dirs
+ # Depends: bash 5, checkAppFileDir()
#==BEGIN Display errors==
#===BEGIN Display Missing Apps===
missingApps="Missing apps :"
#==BEGIN Display errors==
#===BEGIN Display Missing Apps===
missingApps="Missing apps :"
#Desc: Sets script_TTL seconds from provided time_element string argument
#Usage: magicSetScriptTTL [str time_element]
#Input: arg1: string (Ex: scriptTTL_TE; "day" or "hour")
#Desc: Sets script_TTL seconds from provided time_element string argument
#Usage: magicSetScriptTTL [str time_element]
#Input: arg1: string (Ex: scriptTTL_TE; "day" or "hour")
- #Output: var: SCRIPT_TTL (integer seconds)
+ #Output: var: scriptTTL (integer seconds)
#Depends: timeUntilNextHour, timeUntilNextDay
local argTimeElement
argTimeElement="$1"
if [[ "$argTimeElement" = "day" ]]; then
# Set script lifespan to end at start of next day
#Depends: timeUntilNextHour, timeUntilNextDay
local argTimeElement
argTimeElement="$1"
if [[ "$argTimeElement" = "day" ]]; then
# Set script lifespan to end at start of next day
- if ! SCRIPT_TTL="$(timeUntilNextDay)"; then
- if [[ "$SCRIPT_TTL" -eq 0 ]]; then
- ((SCRIPT_TTL++)); # Add 1 because 0 would cause 'timeout' to never timeout.
+ if ! scriptTTL="$(timeUntilNextDay)"; then
+ if [[ "$scriptTTL" -eq 0 ]]; then
+ ((scriptTTL++)); # Add 1 because 0 would cause 'timeout' to never timeout.
else
yell "ERROR: timeUntilNextDay exit code $?"; exit 1;
fi;
fi;
elif [[ "$argTimeElement" = "hour" ]]; then
# Set script lifespan to end at start of next hour
else
yell "ERROR: timeUntilNextDay exit code $?"; exit 1;
fi;
fi;
elif [[ "$argTimeElement" = "hour" ]]; then
# Set script lifespan to end at start of next hour
- if ! SCRIPT_TTL="$(timeUntilNextHour)"; then
- if [[ "$SCRIPT_TTL" -eq 0 ]]; then
- ((SCRIPT_TTL++)); # Add 1 because 0 would cause 'timeout' to never timeout.
+ if ! scriptTTL="$(timeUntilNextHour)"; then
+ if [[ "$scriptTTL" -eq 0 ]]; then
+ ((scriptTTL++)); # Add 1 because 0 would cause 'timeout' to never timeout.
else
yell "ERROR: timeUntilNextHour exit code $?"; exit 1;
fi;
else
yell "ERROR: timeUntilNextHour exit code $?"; exit 1;
fi;
checkMakeTar() {
# Desc: Checks that a valid tar archive exists, creates one otherwise
# Usage: checkMakeTar [ path ]
checkMakeTar() {
# Desc: Checks that a valid tar archive exists, creates one otherwise
# Usage: checkMakeTar [ path ]
# Input: arg1: path of tar archive
# Output: exit code 0 : tar readable
# exit code 1 : tar missing; created
# exit code 2 : tar not readable; moved; replaced
# Input: arg1: path of tar archive
# Output: exit code 0 : tar readable
# exit code 1 : tar missing; created
# exit code 2 : tar not readable; moved; replaced
- # Depends: try, tar, date
- local PATH_TAR returnFlag0 returnFlag1 returnFlag2
- PATH_TAR="$1"
+ # Depends: bash 5, date 8, tar 1, try()
+ local pathTar returnFlag0 returnFlag1 returnFlag2
+ pathTar="$1";
# Check if file is a valid tar archive
# Check if file is a valid tar archive
- if tar --list --file="$PATH_TAR" 1>/dev/null 2>&1; then
+ if tar --list --file="$pathTar" 1>/dev/null 2>&1; then
## T1: return success
returnFlag0="tar valid";
else
## F1: Check if file exists
## T1: return success
returnFlag0="tar valid";
else
## F1: Check if file exists
- if [[ -f "$PATH_TAR" ]]; then
+ if [[ -f "$pathTar" ]]; then
- try mv "$PATH_TAR" "$PATH_TAR""--broken--""$(date +%Y%m%dT%H%M%S)" && \
+ try mv "$pathTar" "$pathTar""--broken--""$(date +%Y%m%dT%H%M%S)" && \
returnFlag1="tar moved";
else
### F: -
:
returnFlag1="tar moved";
else
### F: -
:
## F2: Create tar archive, return 0
## F2: Create tar archive, return 0
- try tar --create --file="$PATH_TAR" --files-from=/dev/null && \
+ try tar --create --file="$pathTar" --files-from=/dev/null && \
returnFlag2="tar created";
returnFlag2="tar created";
# Determine function return code
if [[ "$returnFlag0" = "tar valid" ]]; then
# Determine function return code
if [[ "$returnFlag0" = "tar valid" ]]; then
return 1; # tar missing so created
elif [[ "$returnFlag2" = "tar created" ]] && [[ "$returnFlag1" = "tar moved" ]]; then
return 2; # tar not readable so moved; replaced
return 1; # tar missing so created
elif [[ "$returnFlag2" = "tar created" ]] && [[ "$returnFlag1" = "tar moved" ]]; then
return 2; # tar not readable so moved; replaced
} # checks if arg1 is tar; creates one otherwise
appendArgTar(){
# Desc: Writes first argument to temporary file with arguments as options, then appends file to tar
# Usage: appendArgTar "$(echo "Data to be written.")" [name of file to be inserted] [tar path] [temp dir] ([cmd1] [cmd2] [cmd3] [cmd4]...)
} # checks if arg1 is tar; creates one otherwise
appendArgTar(){
# Desc: Writes first argument to temporary file with arguments as options, then appends file to tar
# Usage: appendArgTar "$(echo "Data to be written.")" [name of file to be inserted] [tar path] [temp dir] ([cmd1] [cmd2] [cmd3] [cmd4]...)
# Input: arg1: data to be written
# arg2: file name of file to be inserted into tar
# arg3: tar archive path (must exist first)
# Input: arg1: data to be written
# arg2: file name of file to be inserted into tar
# arg3: tar archive path (must exist first)
# appendArgTar "$(cat /tmp/largefile1.gpg)" "largefile1" $HOME/archive.tar /tmp "gpg --decrypt" &
# appendArgTar "$(cat /tmp/largefile2.gpg)" "largefile2" $HOME/archive.tar /tmp "gpg --decrypt" &
# appendArgTar "$(cat /tmp/largefile3.gpg)" "largefile3" $HOME/archive.tar /tmp "gpg --decrypt" &
# appendArgTar "$(cat /tmp/largefile1.gpg)" "largefile1" $HOME/archive.tar /tmp "gpg --decrypt" &
# appendArgTar "$(cat /tmp/largefile2.gpg)" "largefile2" $HOME/archive.tar /tmp "gpg --decrypt" &
# appendArgTar "$(cat /tmp/largefile3.gpg)" "largefile3" $HOME/archive.tar /tmp "gpg --decrypt" &
+ # Depends: bash 5, tar 1, yell()
# Ref/Attrib: Using 'eval' to construct command strings https://askubuntu.com/a/476533
# Ref/Attrib: Using 'eval' to construct command strings https://askubuntu.com/a/476533
+ local fn fileName tarPath tmpDir cmd0 cmd1 cmd2 cmd3 cmd4
+
- local FN="${FUNCNAME[0]}";
- #yell "DEBUG:STATUS:$FN:Finished appendArgTar()."
+ fn="${FUNCNAME[0]}";
+ #yell "DEBUG:STATUS:$fn:Finished appendArgTar()."
- if ! [ -z "$2" ]; then FILENAME="$2"; else yell "ERROR:$FN:Not enough arguments."; exit 1; fi
+ if ! [ -z "$2" ]; then fileName="$2"; else yell "ERROR:$fn:Not enough arguments."; exit 1; fi
# Check tar path is a file
# Check tar path is a file
- if [ -f "$3" ]; then TAR_PATH="$3"; else yell "ERROR:$FN:Tar archive arg not a file."; exit 1; fi
+ if [ -f "$3" ]; then tarPath="$3"; else yell "ERROR:$fn:Tar archive arg not a file."; exit 1; fi
- if ! [ -z "$4" ]; then TMP_DIR="$4"; else yell "ERROR:$FN:No temporary working dir set."; exit 1; fi
+ if ! [ -z "$4" ]; then tmpDir="$4"; else yell "ERROR:$fn:No temporary working dir set."; exit 1; fi
- if ! [ -z "$5" ]; then CMD1="$5"; else CMD1="tee /dev/null "; fi # command string 1
- if ! [ -z "$6" ]; then CMD2="$6"; else CMD2="tee /dev/null "; fi # command string 2
- if ! [ -z "$7" ]; then CMD3="$7"; else CMD3="tee /dev/null "; fi # command string 3
- if ! [ -z "$8" ]; then CMD4="$8"; else CMD4="tee /dev/null "; fi # command string 4
+ if ! [ -z "$5" ]; then cmd1="$5"; else cmd1="cat "; fi # command string 1
+ if ! [ -z "$6" ]; then cmd2="$6"; else cmd2="cat "; fi # command string 2
+ if ! [ -z "$7" ]; then cmd3="$7"; else cmd3="cat "; fi # command string 3
+ if ! [ -z "$8" ]; then cmd4="$8"; else cmd4="cat "; fi # command string 4
- # yell "DEBUG:STATUS:$FN:CMD0:$CMD0"
- # yell "DEBUG:STATUS:$FN:CMD1:$CMD1"
- # yell "DEBUG:STATUS:$FN:CMD2:$CMD2"
- # yell "DEBUG:STATUS:$FN:CMD3:$CMD3"
- # yell "DEBUG:STATUS:$FN:CMD4:$CMD4"
- # yell "DEBUG:STATUS:$FN:FILENAME:$FILENAME"
- # yell "DEBUG:STATUS:$FN:TAR_PATH:$TAR_PATH"
- # yell "DEBUG:STATUS:$FN:TMP_DIR:$TMP_DIR"
+ # yell "DEBUG:STATUS:$fn:cmd0:$cmd0"
+ # yell "DEBUG:STATUS:$fn:cmd1:$cmd1"
+ # yell "DEBUG:STATUS:$fn:cmd2:$cmd2"
+ # yell "DEBUG:STATUS:$fn:cmd3:$cmd3"
+ # yell "DEBUG:STATUS:$fn:cmd4:$cmd4"
+ # yell "DEBUG:STATUS:$fn:fileName:$fileName"
+ # yell "DEBUG:STATUS:$fn:tarPath:$tarPath"
+ # yell "DEBUG:STATUS:$fn:tmpDir:$tmpDir"
# Write to temporary working dir
# Write to temporary working dir
- eval "$CMD0"" | ""$CMD1"" | ""$CMD2"" | ""$CMD3"" | ""$CMD4" > "$TMP_DIR"/"$FILENAME";
+ eval "$cmd0 | $cmd1 | $cmd2 | $cmd3 | $cmd4" > "$tmpDir"/"$fileName";
- try tar --append --directory="$TMP_DIR" --file="$TAR_PATH" "$FILENAME";
- #yell "DEBUG:STATUS:$FN:Finished appendArgTar()."
+ try tar --append --directory="$tmpDir" --file="$tarPath" "$fileName";
+ #yell "DEBUG:STATUS:$fn:Finished appendArgTar()."
} # Append Bash var to file appended to Tar archive
appendFileTar(){
# Desc: Processes first file and then appends to tar
# Usage: appendFileTar [file path] [name of file to be inserted] [tar path] [temp dir] ([cmd1] [cmd2] [cmd3] [cmd4]...)
} # Append Bash var to file appended to Tar archive
appendFileTar(){
# Desc: Processes first file and then appends to tar
# Usage: appendFileTar [file path] [name of file to be inserted] [tar path] [temp dir] ([cmd1] [cmd2] [cmd3] [cmd4]...)
# Input: arg1: path of file to be (processed and) written
# arg2: name to use for file inserted into tar
# arg3: tar archive path (must exist first)
# Input: arg1: path of file to be (processed and) written
# arg2: name to use for file inserted into tar
# arg3: tar archive path (must exist first)
# appendFileTar /tmp/largefile1.gpg "largefile1" $HOME/archive.tar /tmp "gpg --decrypt" &
# appendFileTar /tmp/largefile2.gpg "largefile2" $HOME/archive.tar /tmp "gpg --decrypt" &
# appendFileTar /tmp/largefile3.gpg "largefile3" $HOME/archive.tar /tmp "gpg --decrypt" &
# appendFileTar /tmp/largefile1.gpg "largefile1" $HOME/archive.tar /tmp "gpg --decrypt" &
# appendFileTar /tmp/largefile2.gpg "largefile2" $HOME/archive.tar /tmp "gpg --decrypt" &
# appendFileTar /tmp/largefile3.gpg "largefile3" $HOME/archive.tar /tmp "gpg --decrypt" &
+ # Depends: bash 5, tar 1, yell()
+
+ local fn fileName tarPath tmpDir
- local FN="${FUNCNAME[0]}";
- #yell "DEBUG:STATUS:$FN:Finished appendFileTar()."
+ fn="${FUNCNAME[0]}";
+ #yell "DEBUG:STATUS:$fn:Finished appendFileTar()."
- if ! [ -z "$2" ]; then FILENAME="$2"; else yell "ERROR:$FN:Not enough arguments."; exit 1; fi
+ if ! [ -z "$2" ]; then fileName="$2"; else yell "ERROR:$fn:Not enough arguments."; exit 1; fi
# Check tar path is a file
# Check tar path is a file
- if [ -f "$3" ]; then TAR_PATH="$3"; else yell "ERROR:$FN:Tar archive arg not a file."; exit 1; fi
+ if [ -f "$3" ]; then tarPath="$3"; else yell "ERROR:$fn:Tar archive arg not a file:$3"; exit 1; fi
- if ! [ -z "$4" ]; then TMP_DIR="$4"; else yell "ERROR:$FN:No temporary working dir set."; exit 1; fi
+ if ! [ -z "$4" ]; then tmpDir="$4"; else yell "ERROR:$fn:No temporary working dir set."; exit 1; fi
- if ! [ -z "$5" ]; then CMD1="$5"; else CMD1="tee /dev/null "; fi # command string 1
- if ! [ -z "$6" ]; then CMD2="$6"; else CMD2="tee /dev/null "; fi # command string 2
- if ! [ -z "$7" ]; then CMD3="$7"; else CMD3="tee /dev/null "; fi # command string 3
- if ! [ -z "$8" ]; then CMD4="$8"; else CMD4="tee /dev/null "; fi # command string 4
+ if ! [ -z "$5" ]; then cmd1="$5"; else cmd1="cat "; fi # command string 1
+ if ! [ -z "$6" ]; then cmd2="$6"; else cmd2="cat "; fi # command string 2
+ if ! [ -z "$7" ]; then cmd3="$7"; else cmd3="cat "; fi # command string 3
+ if ! [ -z "$8" ]; then cmd4="$8"; else cmd4="cat "; fi # command string 4
- # yell "DEBUG:STATUS:$FN:CMD0:$CMD0"
- # yell "DEBUG:STATUS:$FN:CMD1:$CMD1"
- # yell "DEBUG:STATUS:$FN:CMD2:$CMD2"
- # yell "DEBUG:STATUS:$FN:CMD3:$CMD3"
- # yell "DEBUG:STATUS:$FN:CMD4:$CMD4"
- # yell "DEBUG:STATUS:$FN:FILENAME:$FILENAME"
- # yell "DEBUG:STATUS:$FN:TAR_PATH:$TAR_PATH"
- # yell "DEBUG:STATUS:$FN:TMP_DIR:$TMP_DIR"
+ # yell "DEBUG:STATUS:$fn:cmd0:$cmd0"
+ # yell "DEBUG:STATUS:$fn:cmd1:$cmd1"
+ # yell "DEBUG:STATUS:$fn:cmd2:$cmd2"
+ # yell "DEBUG:STATUS:$fn:cmd3:$cmd3"
+ # yell "DEBUG:STATUS:$fn:cmd4:$cmd4"
+ # yell "DEBUG:STATUS:$fn:fileName:$fileName"
+ # yell "DEBUG:STATUS:$fn:tarPath:$tarPath"
+ # yell "DEBUG:STATUS:$fn:tmpDir:$tmpDir"
# Write to temporary working dir
# Write to temporary working dir
- eval "$CMD0 | $CMD1 | $CMD2 | $CMD3 | $CMD4" > "$TMP_DIR"/"$FILENAME";
+ eval "$cmd0 | $cmd1 | $cmd2 | $cmd3 | $cmd4" > "$tmpDir"/"$fileName";
- try tar --append --directory="$TMP_DIR" --file="$TAR_PATH" "$FILENAME";
- #yell "DEBUG:STATUS:$FN:Finished appendFileTar()."
+ try tar --append --directory="$tmpDir" --file="$tarPath" "$fileName";
+ #yell "DEBUG:STATUS:$fn:Finished appendFileTar()."
} # Append file to Tar archive
checkAgePubkey() {
# Desc: Checks if string is an age-compatible pubkey
} # Append file to Tar archive
checkAgePubkey() {
# Desc: Checks if string is an age-compatible pubkey
validateInput() {
# Desc: Validates Input
# Usage: validateInput [str input] [str input type]
validateInput() {
# Desc: Validates Input
# Usage: validateInput [str input] [str input type]
# Input: arg1: string to validate
# arg2: string specifying input type (ex:"ssh_pubkey")
# Output: return code 0: if input string matched specified string type
# Input: arg1: string to validate
# arg2: string specifying input type (ex:"ssh_pubkey")
# Output: return code 0: if input string matched specified string type
- # Depends: bash 5, yell
+ # Depends: bash 5, yell()
+
+ local fn argInput argType
- local FN="${FUNCNAME[0]}";
# Process arguments
argInput="$1";
argType="$2";
# Process arguments
argInput="$1";
argType="$2";
- if [[ $# -gt 2 ]]; then yell "ERROR:$0:$FN:Too many arguments."; exit 1; fi;
+ if [[ $# -gt 2 ]]; then yell "ERROR:$0:$fn:Too many arguments."; exit 1; fi;
# Check for blank
if [[ -z "$argInput" ]]; then return 1; fi
# Check for blank
if [[ -z "$argInput" ]]; then return 1; fi
timeEpochNS() {
# Desc: Get epoch nanoseconds
# Usage: timeEpochNS
timeEpochNS() {
# Desc: Get epoch nanoseconds
# Usage: timeEpochNS
# Input: arg1: 'date'-parsable timestamp string (optional)
# Output: Nanoseconds since 1970-01-01
# Input: arg1: 'date'-parsable timestamp string (optional)
# Output: Nanoseconds since 1970-01-01
- # Depends: date 8, yell()
+ # Depends: date 8, cut 8, yell()
# Ref/Attrib: Force base 10 Bash arith with '10#'. https://stackoverflow.com/a/24777667
# Ref/Attrib: Force base 10 Bash arith with '10#'. https://stackoverflow.com/a/24777667
- local TIME_CURRENT TIME_INPUT TIME_EPOCH_FLOAT TIME_EPOCH_NSFRAC
- local TIME_EPOCH_NS
+ local argTime timeCurrent timeInput timeEpochFloat timeEpochInt
+ local timeEpochNsFrac timeEpochNs
argTime="$1";
# Get Current Time
argTime="$1";
# Get Current Time
- TIME_CURRENT="$(date --iso-8601=ns)"; # Produce `date`-parsable current timestamp with resolution of 1 nanosecond.
+ timeCurrent="$(date --iso-8601=ns)"; # Produce `date`-parsable current timestamp with resolution of 1 nanosecond.
# Decide to parse current or supplied time
## Check if time argument empty
if [[ -z "$argTime" ]]; then
## T: Time argument empty, use current time
# Decide to parse current or supplied time
## Check if time argument empty
if [[ -z "$argTime" ]]; then
## T: Time argument empty, use current time
- TIME_INPUT="$TIME_CURRENT";
+ timeInput="$timeCurrent";
else
## F: Time argument exists, validate time
if date --date="$argTime" 1>/dev/null 2>&1; then
### T: Time argument is valid; use it
else
## F: Time argument exists, validate time
if date --date="$argTime" 1>/dev/null 2>&1; then
### T: Time argument is valid; use it
else
### F: Time argument not valid; exit
yell "ERROR:Invalid time argument supplied. Exiting."; exit 1;
fi;
fi;
# Construct and deliver nanoseconds since 1970-01-01
else
### F: Time argument not valid; exit
yell "ERROR:Invalid time argument supplied. Exiting."; exit 1;
fi;
fi;
# Construct and deliver nanoseconds since 1970-01-01
- TIME_EPOCH_FLOAT="$(date --date="$TIME_INPUT" +%s.%N)"; # Save ssss.NNNNNNNNN
- TIME_EPOCH_INT="$(echo "$TIME_EPOCH_FLOAT" | cut -d. -f1)"; # Get ssss
- TIME_EPOCH_NSFRAC="$(echo "$TIME_EPOCH_FLOAT" | cut -d. -f2)"; # Get NNNNNNNNN
- TIME_EPOCH_NS="$(( (10#"$TIME_EPOCH_INT" * 10**9) + (10#"$TIME_EPOCH_NSFRAC") ))";
- echo "$TIME_EPOCH_NS";
+ timeEpochFloat="$(date --date="$timeInput" +%s.%N)"; # Save ssss.NNNNNNNNN
+ timeEpochInt="$(echo "$timeEpochFloat" | cut -d. -f1)"; # Get ssss
+ timeEpochNsFrac="$(echo "$timeEpochFloat" | cut -d. -f2)"; # Get NNNNNNNNN
+ timeEpochNs="$(( (10#"$timeEpochInt" * 10**9) + (10#"$timeEpochNsFrac") ))";
+ echo "$timeEpochNs";
} # Nanoseconds since 1970-01-01
magicBufferSleepPID() {
# Desc: Compensates for lag so buffer rounds start every bufferTTL seconds
} # Nanoseconds since 1970-01-01
magicBufferSleepPID() {
# Desc: Compensates for lag so buffer rounds start every bufferTTL seconds
- # Input: vars: bufferTTL, errResetx10e3, K_P, T_I, T_D
- # # Input: array: errorHistory
- # Output: vars: BUFFER_TTL_ADJ_FLOAT
+ # Input: vars: bufferTTL, errReset
+ # # Input: array: errorHistory errResetx10e3
+ # Output: vars: bufferTTL_AdjFloat
# Re/Attrib: https://en.wikipedia.org/wiki/PID_controller#Standard_versus_parallel_(ideal)_form
# Re/Attrib: https://en.wikipedia.org/wiki/PID_controller#Standard_versus_parallel_(ideal)_form
- local BUFFER_TTL_NS
- local timeBufferStartNS timeBufferStartNSExp errNS errNSx10e3
- local errResetx10e3 errRatex10e3 ADJ BUFFER_TTL_ADJ_NS BUFFER_TTL_ADJ_INT
- local BUFFER_TTL_ADJ_FLOATFRAC
+ local buffer_ttl_ns k_p t_i t_d
+ local timeBufferStartNS timeBufferStartNSExp errNS errReset errRate
+ local adj buffer_ttl_adj_ns buffer_ttl_adj_int buffer_ttl_adj_floatfrac
+ # local errNSx10e3 errResetx10e3 errRatex10e3
# local errorHistorySize
# ## Define errorHistorySize
# errorHistorySize=100;
# local errorHistorySize
# ## Define errorHistorySize
# errorHistorySize=100;
- ## Define BUFFER_TTL in nanoseconds
- BUFFER_TTL_NS=$((BUFFER_TTL * 10**9)) && vbm "BUFFER_TTL_NS:$BUFFER_TTL_NS";
+ ## Define bufferTTL in nanoseconds
+ buffer_ttl_ns=$((bufferTTL * 10**9)) && vbm "buffer_ttl_ns:$buffer_ttl_ns";
- K_P=1; # Gain for compensating buffer round lag
- T_I="$(((4)*BUFFER_TTL_NS/(1)))"; # Consider this number of past nanoseconds to eliminate error
- T_D="$(((1)*BUFFER_TTL_NS/(1)))"; # Predict value this number of nanoseconds into the future
+ k_p=1; # Gain for compensating buffer round lag
+ t_i="$(((4)*buffer_ttl_ns/(1)))"; # Consider this number of past nanoseconds to eliminate error
+ t_d="$(((1)*buffer_ttl_ns/(1)))"; # Predict value this number of nanoseconds into the future
# Calculate Error, errNS, in nanoseconds
## Get current time
timeBufferStartNS="$(timeEpochNS)" && vbm "timeBufferStartNS :$timeBufferStartNS";
# Calculate Error, errNS, in nanoseconds
## Get current time
timeBufferStartNS="$(timeEpochNS)" && vbm "timeBufferStartNS :$timeBufferStartNS";
- ## Calculate expected time (from start time, current buffer round number, nominal BUFFER_TTL)
- timeBufferStartNSExp="$(( (timeBufferFirstNS) + (BUFFER_TTL_NS * bufferRound) ))" && vbm "timeBufferStartNSExp:$timeBufferStartNSExp";
+ ## Calculate expected time (from start time, current buffer round number, nominal bufferTTL)
+ timeBufferStartNSExp="$(( (timeBufferFirstNS) + (buffer_ttl_ns * bufferRound) ))" && vbm "timeBufferStartNSExp:$timeBufferStartNSExp";
## Calculate error (diff between timeBufferStartNSExp and timeBufferStartNS; usually negative)
errNS="$(( timeBufferStartNSExp - timeBufferStartNS ))" && vbm "errNS:$errNS";
# errNSx10e3="$((errNS*10**3))" && vbm "errNSx10e3:$errNSx10e3";
## Calculate error (diff between timeBufferStartNSExp and timeBufferStartNS; usually negative)
errNS="$(( timeBufferStartNSExp - timeBufferStartNS ))" && vbm "errNS:$errNS";
# errNSx10e3="$((errNS*10**3))" && vbm "errNSx10e3:$errNSx10e3";
# done;
# Calculate errReset in nanoseconds^2
# done;
# Calculate errReset in nanoseconds^2
- ## errReset = int(errHistory(t),wrt(delta_BUFFER_TTL))
+ ## errReset = int(errHistory(t),wrt(delta_buffer_ttl))
## Integrate errorHistory with respect to time
# for value in "${errorHistory[@]}"; do
## Integrate errorHistory with respect to time
# for value in "${errorHistory[@]}"; do
- # errReset=$(( errReset + ( value*BUFFER_TTL_NS ) ));
+ # errReset=$(( errReset + ( value*buffer_ttl_ns ) ));
# done;
vbm "errReset(orig):$errReset"
# done;
vbm "errReset(orig):$errReset"
- errReset="$(( (errReset + (errNS*BUFFER_TTL_NS)) ))" && vbm "errReset(post):$errReset";
-# errResetx10e3="$(( ( errResetx10e3 + ( errNSx10e3 * BUFFER_TTL_NS ) )*10**3 ))" && vbm "errResetx10e3:$errResetx10e3";
+ errReset="$(( (errReset + (errNS*buffer_ttl_ns)) ))" && vbm "errReset(post):$errReset";
+# errResetx10e3="$(( ( errResetx10e3 + ( errNSx10e3 * buffer_ttl_ns ) )*10**3 ))" && vbm "errResetx10e3:$errResetx10e3";
# Calculate errRate in nanoseconds per nanosecond
# Calculate errRate in nanoseconds per nanosecond
- errRate="$(( errNS / BUFFER_TTL_NS ))" && vbm "errRate:$errRate";
-# errRatex10e3="$(( ( errNSx10e3 ) / BUFFER_TTL_NS ))" && vbm "errRatex10e3:$errRatex10e3";
+ errRate="$(( errNS / buffer_ttl_ns ))" && vbm "errRate:$errRate";
+# errRatex10e3="$(( ( errNSx10e3 ) / buffer_ttl_ns ))" && vbm "errRatex10e3:$errRatex10e3";
# Debug
vbm "errNS :$errNS";
# Debug
vbm "errNS :$errNS";
- vbm "errResetTerm:$((errReset/T_I))";
- vbm "errRateTerm :$((errRate*T_D))";
+ vbm "errResetTerm:$((errReset/t_i))";
+ vbm "errRateTerm :$((errRate*t_d))";
# Calculate PID control signal
# Calculate PID control signal
- ## ADJ = K_P * (errNS + errReset/T_I + errRate*T_D)
- ADJ="$(( K_P*(errNS + errReset/T_I + errRate*T_D) ))" && vbm "ADJ:$ADJ";
-# ADJ="$((K_P*(errNSx10e3 + (errResetx10e3/T_I) + (errRatex10e3*T_D) )/(10**3)))" && vbm "ADJ:$ADJ";
+ ## adj = k_p * (errNS + errReset/t_i + errRate*t_d)
+ adj="$(( k_p*(errNS + errReset/t_i + errRate*t_d) ))" && vbm "adj:$adj";
+# adj="$((k_p*(errNSx10e3 + (errResetx10e3/t_i) + (errRatex10e3*t_d) )/(10**3)))" && vbm "adj:$adj";
- # Calculate BUFFER_TTL_ADJ_FLOAT from ADJ (ns)
- ## Calculate BUFFER_TTL_ADJ in nanoseconds (BUFFER_TTL_ADJ_NS = BUFFER_TTL_NS + ADJ)
- BUFFER_TTL_ADJ_NS="$((BUFFER_TTL_NS + ADJ))" && vbm "BUFFER_TTL_ADJ_NS:$BUFFER_TTL_ADJ_NS";
+ # Calculate bufferTTL_AdjFloat from adj (ns)
+ ## Calculate buffer_ttl_adj in nanoseconds (buffer_ttl_adj_ns = buffer_ttl_ns + adj)
+ buffer_ttl_adj_ns="$((buffer_ttl_ns + adj))" && vbm "buffer_ttl_adj_ns:$buffer_ttl_adj_ns";
## Calculate integer seconds
## Calculate integer seconds
- BUFFER_TTL_ADJ_INT="$((BUFFER_TTL_ADJ_NS/(10**9)))" && vbm "BUFFER_TTL_ADJ_INT:$BUFFER_TTL_ADJ_INT";
- ### Catch negative integer seconds, set minimum of BUFFER_TTL/10 seconds
- if [[ "$BUFFER_TTL_ADJ_INT" -le "$((BUFFER_TTL/10))" ]]; then
- BUFFER_TTL_ADJ_INT="$((BUFFER_TTL/10))";
+ buffer_ttl_adj_int="$((buffer_ttl_adj_ns/(10**9)))" && vbm "buffer_ttl_adj_int:$buffer_ttl_adj_int";
+ ### Catch negative integer seconds, set minimum of bufferTTL/10 seconds
+ if [[ "$buffer_ttl_adj_int" -le "$((bufferTTL/10))" ]]; then
+ buffer_ttl_adj_int="$((bufferTTL/10))";
yell "WARNING:Buffer lag adjustment yielded negative seconds.";
fi;
## Calculate nanosecond remainder
### Remove integer
yell "WARNING:Buffer lag adjustment yielded negative seconds.";
fi;
## Calculate nanosecond remainder
### Remove integer
- BUFFER_TTL_ADJ_FLOATFRAC="$((BUFFER_TTL_ADJ_NS - (BUFFER_TTL_ADJ_INT*(10**9)) ))" && vbm "BUFFER_TTL_ADJ_FLOATFRAC:$BUFFER_TTL_ADJ_FLOATFRAC";
+ buffer_ttl_adj_floatfrac="$((buffer_ttl_adj_ns - (buffer_ttl_adj_int*(10**9)) ))" && vbm "buffer_ttl_adj_floatfrac:$buffer_ttl_adj_floatfrac";
### Calc absolute value of fraction (by removing '-' if present; see https://stackoverflow.com/a/47240327
### Calc absolute value of fraction (by removing '-' if present; see https://stackoverflow.com/a/47240327
- BUFFER_TTL_ADJ_FLOATFRAC="${BUFFER_TTL_ADJ_FLOATFRAC#-}" && vbm "BUFFER_TTL_ADJ_FLOATFRAC:$BUFFER_TTL_ADJ_FLOATFRAC";
- ## Form float BUFFER_TTL_ADJ_FLOAT
- BUFFER_TTL_ADJ_FLOAT="$BUFFER_TTL_ADJ_INT"."$BUFFER_TTL_ADJ_FLOATFRAC" && vbm "BUFFER_TTL_ADJ_FLOAT:$BUFFER_TTL_ADJ_FLOAT";
- vbm "STATUS:Calculated adjusted BUFFER_TTL (seconds):$BUFFER_TTL_ADJ_FLOAT";
-} # Calc BUFFER_TTL_ADJ_FLOAT so buffer starts every BUFFER_TTL seconds
+ buffer_ttl_adj_floatfrac="${buffer_ttl_adj_floatfrac#-}" && vbm "buffer_ttl_adj_floatfrac:$buffer_ttl_adj_floatfrac";
+ ## Form float bufferTTL_AdjFloat (function output)
+ bufferTTL_AdjFloat="$buffer_ttl_adj_int"."$buffer_ttl_adj_floatfrac" && vbm "bufferTTL_AdjFloat:$bufferTTL_AdjFloat";
+ vbm "STATUS:Calculated adjusted bufferTTL (seconds):$bufferTTL_AdjFloat";
+} # Calc bufferTTL_AdjFloat so buffer starts every bufferTTL seconds
- # Desc: Appends time-stamped VERSION to PATHOUT_TAR
+ # Desc: Appends time-stamped VERSION to pathout_tar
# Usage: magicWriteVersion
# Usage: magicWriteVersion
- # Version: 0.1.0
- # Input: CONTENT_VERSION, FILEOUT_VERSION, PATHOUT_TAR, DIR_TMP
+ # Input: vars: pathout_tar, dir_tmp
+ # Input: array: recPubKeysValid
# Input: scriptVersion, scriptURL, ageVersion, ageURL, scriptHostname
# Input: scriptVersion, scriptURL, ageVersion, ageURL, scriptHostname
- # Output: appends tar PATHOUT_TAR
+ # Output: appends tar (pathout_tar)
# Depends: dateTimeShort, appendArgTar
# Depends: dateTimeShort, appendArgTar
- local CONTENT_VERSION pubKeyIndex
+ local fileoutVersion contentVersion pubKeyIndex
- FILEOUT_VERSION="$(dateTimeShort)..VERSION";
-
- # Gather VERSION data in CONTENT_VERSION
- CONTENT_VERSION="scriptVersion=$scriptVersion";
- #CONTENT_VERSION="$CONTENT_VERSION""\\n";
- CONTENT_VERSION="$CONTENT_VERSION""\\n""scriptName=$scriptName";
- CONTENT_VERSION="$CONTENT_VERSION""\\n""scriptURL=$scriptURL";
- CONTENT_VERSION="$CONTENT_VERSION""\\n""ageVersion=$ageVersion";
- CONTENT_VERSION="$CONTENT_VERSION""\\n""ageURL=$ageURL";
- CONTENT_VERSION="$CONTENT_VERSION""\\n""DATE=$(date --iso-8601=seconds)";
- CONTENT_VERSION="$CONTENT_VERSION""\\n""HOSTNAME=$scriptHostname";
+ fileoutVersion="$(dateTimeShort)..VERSION";
+
+ # Gather VERSION data in contentVersion
+ contentVersion="scriptVersion=$scriptVersion";
+ #contentVersion="$contentVersion""\\n";
+ contentVersion="$contentVersion""\\n""scriptName=$scriptName";
+ contentVersion="$contentVersion""\\n""scriptURL=$scriptURL";
+ contentVersion="$contentVersion""\\n""ageVersion=$ageVersion";
+ contentVersion="$contentVersion""\\n""ageURL=$ageURL";
+ contentVersion="$contentVersion""\\n""date=$(date --iso-8601=seconds)";
+ contentVersion="$contentVersion""\\n""hostname=$scriptHostname";
## Add list of recipient pubkeys
for pubkey in "${recPubKeysValid[@]}"; do
((pubKeyIndex++))
## Add list of recipient pubkeys
for pubkey in "${recPubKeysValid[@]}"; do
((pubKeyIndex++))
- CONTENT_VERSION="$CONTENT_VERSION""\\n""PUBKEY_$pubKeyIndex=$pubkey";
+ contentVersion="$contentVersion""\\n""PUBKEY_$pubKeyIndex=$pubkey";
done
## Process newline escapes
done
## Process newline escapes
- CONTENT_VERSION="$(echo -e "$CONTENT_VERSION")"
+ contentVersion="$(echo -e "$contentVersion")"
- # Write CONTENT_VERSION as file FILEOUT_VERSION and write-append to PATHOUT_TAR
- appendArgTar "$CONTENT_VERSION" "$FILEOUT_VERSION" "$PATHOUT_TAR" "$DIR_TMP";
-
-} # bkgpslog: write version data to PATHOUT_TAR via appendArgTar()
+ # Write contentVersion as file fileoutVersion and write-append to pathout_tar
+ appendArgTar "$contentVersion" "$fileoutVersion" "$pathout_tar" "$dir_tmp";
+} # bkgpslog: write version data to pathout_tar via appendArgTar()
magicGatherWriteBuffer() {
magicGatherWriteBuffer() {
- # Desc: bkgpslog-specific meta function for writing data to DIR_TMP then appending each file to PATHOUT_TAR
- # Inputs: vars: PATHOUT_TAR FILEOUT_{NMEA,GPX,KML} CMD_CONV_{NMEA,GPX,KML} CMD_{COMPRESS,ENCRYPT} DIR_TMP,
- # Inputs: vars: BUFFER_TTL bufferTTL_STR scriptHostname CMD_COMPRESS_SUFFIX CMD_ENCRYPT_SUFFIX
- # Output: file: (PATHOUT_TAR)
- # Depends: yell(), try(), vbm(), appendArgTar(), tar 1, sleep 8, checkMakeTar()
+ # Desc: bkgpslog-specific meta function for writing data to dir_tmp then appending each file to pathout_tar
+ # Inputs: vars: pathout_tar, cmd_conv_{nmea,gpx,kml}, cmd_{compress,encrypt} dir_tmp,
+ # Inputs: vars: bufferTTL bufferTTL_STR scriptHostname cmd_compress_suffix cmd_encrypt_suffix
+ # Output: file: (pathout_tar)
+ # Depends: tar 1, date 8, sleep 8, yell(), try(), vbm(), appendArgTar(), checkMakeTar()
# Depends: magicWriteVersion(), appendFileTar()
# Depends: magicWriteVersion(), appendFileTar()
+ local fn pathoutBuffer timeBufferStartLong timeBufferStart fileoutBasename
+ local fileout_nmea fileout_gpx fileout_kml pathout_nmea pathout_gpx pathout_kml pathout_tar
- vbm "DEBUG:STATUS:$FN:Started magicGatherWriteBuffer().";
# Debug:Get function name
# Debug:Get function name
+ fn="${FUNCNAME[0]}";
+
+ vbm "DEBUG:STATUS:$fn:Started magicGatherWriteBuffer().";
# Create buffer file with unique name
# Create buffer file with unique name
- PATHOUT_BUFFER="$DIR_TMP/buffer$SECONDS" && vbm "PATHOUT_BUFFER:$PATHOUT_BUFFER";
+ pathoutBuffer="$dir_tmp/buffer$SECONDS" && vbm "pathoutBuffer:$pathoutBuffer";
- timeout "$BUFFER_TTL"s gpspipe -r -o "$PATHOUT_BUFFER" ;
- timeBufferStartLong="$(date --date="$BUFFER_TTL seconds ago" --iso-8601=seconds)" && vbm "timeBufferStartLong:$timeBufferStartLong" || yell "ERROR:timeBufferStartLong fail";
- timeBufferStart="$(dateTimeShort "$timeBufferStartLong" )" && vbm "timeBufferStart:$timeBufferStart" || yell "ERROR:timeBufferStart fail"; # Note start time
+ timeout "$bufferTTL"s gpspipe -r -o "$pathoutBuffer" ;
+ timeBufferStartLong="$(date --date="$bufferTTL seconds ago" --iso-8601=seconds)" && vbm "timeBufferStartLong:$timeBufferStartLong";
+ timeBufferStart="$(dateTimeShort "$timeBufferStartLong" )" && vbm "timeBufferStart:$timeBufferStart"; # Note start time
# Determine file paths (time is start of buffer period)
# Determine file paths (time is start of buffer period)
- FILEOUT_BASENAME="$timeBufferStart""--""$bufferTTL_STR""..""$scriptHostname""_location" && vbm "STATUS:Set FILEOUT_BASENAME to:$FILEOUT_BASENAME";
- ## Files saved to DIR_TMP
- FILEOUT_NMEA="$FILEOUT_BASENAME".nmea"$CMD_COMPRESS_SUFFIX""$CMD_ENCRYPT_SUFFIX" && vbm "STATUS:Set FILEOUT_NMEA to:$FILEOUT_NMEA";
- FILEOUT_GPX="$FILEOUT_BASENAME".gpx"$CMD_COMPRESS_SUFFIX""$CMD_ENCRYPT_SUFFIX" && vbm "STATUS:Set FILEOUT_GPX to:$FILEOUT_GPX";
- FILEOUT_KML="$FILEOUT_BASENAME".kml"$CMD_COMPRESS_SUFFIX""$CMD_ENCRYPT_SUFFIX" && vbm "STATUS:Set FILEOUT_KML to:$FILEOUT_KML";
- PATHOUT_NMEA="$DIR_TMP"/"$FILEOUT_NMEA" && vbm "STATUS:Set PATHOUT_NMEA to:$PATHOUT_NMEA";
- PATHOUT_GPX="$DIR_TMP"/"$FILEOUT_GPX" && vbm "STATUS:Set PATHOUT_GPX to:$PATHOUT_GPX";
- PATHOUT_KML="$DIR_TMP"/"$FILEOUT_KML" && vbm "STATUS:Set PATHOUT_KML to:$PATHOUT_KML";
- ## Files saved to disk (DIR_OUT)
+ fileoutBasename="$timeBufferStart""--""$bufferTTL_STR""..""$scriptHostname""_location" && vbm "STATUS:Set fileoutBasename to:$fileoutBasename";
+ ## Files saved to dir_tmp
+ fileout_nmea="$fileoutBasename".nmea"$cmd_compress_suffix""$cmd_encrypt_suffix" && vbm "STATUS:Set fileout_nmea to:$fileout_nmea";
+ fileout_gpx="$fileoutBasename".gpx"$cmd_compress_suffix""$cmd_encrypt_suffix" && vbm "STATUS:Set fileout_gpx to:$fileout_gpx";
+ fileout_kml="$fileoutBasename".kml"$cmd_compress_suffix""$cmd_encrypt_suffix" && vbm "STATUS:Set fileout_kml to:$fileout_kml";
+ pathout_nmea="$dir_tmp"/"$fileout_nmea" && vbm "STATUS:Set pathout_nmea to:$pathout_nmea";
+ pathout_gpx="$dir_tmp"/"$fileout_gpx" && vbm "STATUS:Set pathout_gpx to:$pathout_gpx";
+ pathout_kml="$dir_tmp"/"$fileout_kml" && vbm "STATUS:Set pathout_kml to:$pathout_kml";
+ ## Files saved to disk (dirOut)
### one file per day (Ex: "20200731..hostname_location.[.gpx.gz].tar")
### one file per day (Ex: "20200731..hostname_location.[.gpx.gz].tar")
- PATHOUT_TAR="$DIR_OUT"/"$(dateShort "$(date --date="$BUFFER_TTL seconds ago" --iso-8601=seconds)")".."$scriptHostname""_location""$CMD_COMPRESS_SUFFIX""$CMD_ENCRYPT_SUFFIX".tar && \
- vbm "STATUS:Set PATHOUT_TAR to:$PATHOUT_TAR";
+ pathout_tar="$dirOut"/"$(dateShort "$(date --date="$bufferTTL seconds ago" --iso-8601=seconds)")".."$scriptHostname""_location""$cmd_compress_suffix""$cmd_encrypt_suffix".tar && \
+ vbm "STATUS:Set pathout_tar to:$pathout_tar";
- vbm "STATUS:FN :$FN";
- vbm "STATUS:DIR_TMP :$DIR_TMP";
- vbm "STATUS:PATHOUT_TAR :$PATHOUT_TAR";
- vbm "STATUS:PATHOUT_NMEA :$PATHOUT_NMEA";
- vbm "STATUS:PATHOUT_GPX :$PATHOUT_GPX";
- vbm "STATUS:PATHOUT_KML :$PATHOUT_KML";
- vbm "STATUS:BUFFER_TTL :$BUFFER_TTL";
- vbm "STATUS:PATHOUT_BUFFER :$PATHOUT_BUFFER";
+ vbm "STATUS:fn :$fn";
+ vbm "STATUS:dir_tmp :$dir_tmp";
+ vbm "STATUS:pathout_tar :$pathout_tar";
+ vbm "STATUS:pathout_nmea :$pathout_nmea";
+ vbm "STATUS:pathout_gpx :$pathout_gpx";
+ vbm "STATUS:pathout_kml :$pathout_kml";
+ vbm "STATUS:bufferTTL :$bufferTTL";
+ vbm "STATUS:pathoutBuffer :$pathoutBuffer";
vbm "STATUS:timeBufferStart:$timeBufferStart";
vbm "STATUS:timeBufferStart:$timeBufferStart";
- vbm "FILEOUT_BASENAME :$FILEOUT_BASENAME";
-
+ vbm "fileoutBasename :$fileoutBasename";
- # Validate PATHOUT_TAR as tar.
- checkMakeTar "$PATHOUT_TAR";
+ # Validate pathout_tar as tar.
+ checkMakeTar "$pathout_tar";
## Add VERSION file if checkMakeTar had to create a tar (exited 1) or replace one (exited 2)
vbm "exit status before magicWriteVersion:$?"
if [[ $? -eq 1 ]] || [[ $? -eq 2 ]]; then magicWriteVersion; fi
## Add VERSION file if checkMakeTar had to create a tar (exited 1) or replace one (exited 2)
vbm "exit status before magicWriteVersion:$?"
if [[ $? -eq 1 ]] || [[ $? -eq 2 ]]; then magicWriteVersion; fi
- # Write bufferBash to PATHOUT_TAR
+ # Write bufferBash to pathout_tar
wait; # Wait to avoid collision with older magicWriteBuffer() instances (see https://www.tldp.org/LDP/abs/html/x9644.html )
wait; # Wait to avoid collision with older magicWriteBuffer() instances (see https://www.tldp.org/LDP/abs/html/x9644.html )
- appendFileTar "$PATHOUT_BUFFER" "$FILEOUT_NMEA" "$PATHOUT_TAR" "$DIR_TMP" "$CMD_CONV_NMEA" "$CMD_COMPRESS" "$CMD_ENCRYPT"; # Write NMEA data
- appendFileTar "$PATHOUT_BUFFER" "$FILEOUT_GPX" "$PATHOUT_TAR" "$DIR_TMP" "$CMD_CONV_GPX" "$CMD_COMPRESS" "$CMD_ENCRYPT"; # Write GPX file
- appendFileTar "$PATHOUT_BUFFER" "$FILEOUT_KML" "$PATHOUT_TAR" "$DIR_TMP" "$CMD_CONV_KML" "$CMD_COMPRESS" "$CMD_ENCRYPT"; # Write KML file
+ appendFileTar "$pathoutBuffer" "$fileout_nmea" "$pathout_tar" "$dir_tmp" "$cmd_conv_nmea" "$cmd_compress" "$cmd_encrypt"; # Write NMEA data
+ appendFileTar "$pathoutBuffer" "$fileout_gpx" "$pathout_tar" "$dir_tmp" "$cmd_conv_gpx" "$cmd_compress" "$cmd_encrypt"; # Write GPX file
+ appendFileTar "$pathoutBuffer" "$fileout_kml" "$pathout_tar" "$dir_tmp" "$cmd_conv_kml" "$cmd_compress" "$cmd_encrypt"; # Write KML file
- # Remove secured chunks from DIR_TMP
- rm "$PATHOUT_BUFFER" "$PATHOUT_NMEA" "$PATHOUT_GPX" "$PATHOUT_KML";
- vbm "DEBUG:STATUS:$FN:Finished magicGatherWriteBuffer().";
+ # Remove secured chunks from dir_tmp
+ rm "$pathoutBuffer" "$pathout_nmea" "$pathout_gpx" "$pathout_kml";
+ vbm "DEBUG:STATUS:$fn:Finished magicGatherWriteBuffer().";
} # write buffer to disk
magicParseRecipientDir() {
# Desc: Updates recPubKeysValid with pubkeys in dir specified by '-R' option ("recipient directory")
} # write buffer to disk
magicParseRecipientDir() {
# Desc: Updates recPubKeysValid with pubkeys in dir specified by '-R' option ("recipient directory")
- # Inputs: vars: OPTION_RECDIR, argRecDir, OPTION_ENCRYPT
+ # Inputs: vars: optionRecDir, argRecDir, optionEncrypt
# arry: recPubKeysValid
# Outputs: arry: recPubKeysValid
# Depends: processArguments,
# arry: recPubKeysValid
# Outputs: arry: recPubKeysValid
# Depends: processArguments,
- local recFileLine updateRecipients recipientDir
+ local recipientDir recFileLine updateRecipients
declare -a candRecPubKeysValid
# Check that '-e' and '-R' set
declare -a candRecPubKeysValid
# Check that '-e' and '-R' set
- if [[ "$OPTION_ENCRYPT" = "true" ]] && [[ "$OPTION_RECDIR" = "true" ]]; then
+ if [[ "$optionEncrypt" = "true" ]] && [[ "$optionRecDir" = "true" ]]; then
### Check that argRecDir is a directory.
if [[ -d "$argRecDir" ]]; then
recipientDir="$argRecDir" && vbm "STATUS:Recipient watch directory detected:\"$recipientDir\"";
### Check that argRecDir is a directory.
if [[ -d "$argRecDir" ]]; then
recipientDir="$argRecDir" && vbm "STATUS:Recipient watch directory detected:\"$recipientDir\"";
fi;
fi;
# Handle case if '-R' set but '-e' not set
fi;
fi;
# Handle case if '-R' set but '-e' not set
- if [[ ! "$OPTION_ENCRYPT" = "true" ]] && [[ "$OPTION_RECDIR" = "true" ]]; then
+ if [[ ! "$optionEncrypt" = "true" ]] && [[ "$optionRecDir" = "true" ]]; then
yell "ERROR: \\'-R\\' is set but \\'-e\\' is not set."; fi;
} # Update recPubKeysValid with argRecDir
magicParseRecipientArgs() {
# Desc: Parses recipient arguments specified by '-r' option
yell "ERROR: \\'-R\\' is set but \\'-e\\' is not set."; fi;
} # Update recPubKeysValid with argRecDir
magicParseRecipientArgs() {
# Desc: Parses recipient arguments specified by '-r' option
- # Input: vars: OPTION_ENCRYPT from processArguments()
+ # Input: vars: optionEncrypt, optionRecipients
# arry: argRecPubKeys from processArguments()
# arry: argRecPubKeys from processArguments()
- # Output: vars: CMD_ENCRYPT, CMD_ENCRYPT_SUFFIX
+ # Output: vars: cmd_encrypt, cmd_encrypt_suffix
# arry: recPubKeysValid, recPubKeysValidStatic
# Depends: checkapp(), checkAgePubkey(), validateInput(), processArguments()
local recipients
# Check if encryption option active.
# arry: recPubKeysValid, recPubKeysValidStatic
# Depends: checkapp(), checkAgePubkey(), validateInput(), processArguments()
local recipients
# Check if encryption option active.
- if [[ "$OPTION_ENCRYPT" = "true" ]] && [[ "$OPTION_RECIPIENTS" = "true" ]]; then
+ if [[ "$optionEncrypt" = "true" ]] && [[ "$optionRecipients" = "true" ]]; then
if checkapp age; then # Check that age is available.
for pubkey in "${argRecPubKeys[@]}"; do # Validate recipient pubkey strings by forming test message
vbm "DEBUG:Testing pubkey string:$pubkey";
if checkapp age; then # Check that age is available.
for pubkey in "${argRecPubKeys[@]}"; do # Validate recipient pubkey strings by forming test message
vbm "DEBUG:Testing pubkey string:$pubkey";
recPubKeysValidStatic=("${recPubKeysValid[@]}"); # Save static image of pubkeys validated by this function
## Form age command string
recPubKeysValidStatic=("${recPubKeysValid[@]}"); # Save static image of pubkeys validated by this function
## Form age command string
- CMD_ENCRYPT="age ""$recipients " && vbm "CMD_ENCRYPT:$CMD_ENCRYPT";
- CMD_ENCRYPT_SUFFIX=".age" && vbm "CMD_ENCRYPT_SUFFIX:$CMD_ENCRYPT_SUFFIX";
+ cmd_encrypt="age ""$recipients " && vbm "cmd_encrypt:$cmd_encrypt";
+ cmd_encrypt_suffix=".age" && vbm "cmd_encrypt_suffix:$cmd_encrypt_suffix";
else
yell "ERROR:Encryption enabled but \"age\" not found. Exiting."; exit 1;
fi;
else
else
yell "ERROR:Encryption enabled but \"age\" not found. Exiting."; exit 1;
fi;
else
- CMD_ENCRYPT="tee /dev/null " && vbm "CMD_ENCRYPT:$CMD_ENCRYPT";
- CMD_ENCRYPT_SUFFIX="" && vbm "CMD_ENCRYPT_SUFFIX:$CMD_ENCRYPT_SUFFIX";
+ cmd_encrypt="tee /dev/null " && vbm "cmd_encrypt:$cmd_encrypt";
+ cmd_encrypt_suffix="" && vbm "cmd_encrypt_suffix:$cmd_encrypt_suffix";
vbm "DEBUG:Encryption not enabled."
fi;
# Catch case if '-e' is set but '-r' or '-R' is not
vbm "DEBUG:Encryption not enabled."
fi;
# Catch case if '-e' is set but '-r' or '-R' is not
- if [[ "$OPTION_ENCRYPT" = "true" ]] && [[ ! "$OPTION_RECIPIENTS" = "true" ]]; then
+ if [[ "$optionEncrypt" = "true" ]] && [[ ! "$optionRecipients" = "true" ]]; then
yell "ERROR:\\'-e\\' set but no \\'-r\\' or \\'-R\\' set."; exit 1; fi;
# Catch case if '-r' or '-R' set but '-e' is not
yell "ERROR:\\'-e\\' set but no \\'-r\\' or \\'-R\\' set."; exit 1; fi;
# Catch case if '-r' or '-R' set but '-e' is not
- if [[ ! "$OPTION_ENCRYPT" = "true" ]] && [[ "$OPTION_RECIPIENTS" = "true" ]]; then
+ if [[ ! "$optionEncrypt" = "true" ]] && [[ "$optionRecipients" = "true" ]]; then
yell "ERROR:\\'-r\\' or \\'-R\\' set but \\'-e\\' is not set."; exit 1; fi;
} # Populate recPubKeysValid with argRecPubKeys; form encryption cmd string and filename suffix
magicParseCompressionArg() {
# Desc: Parses compression arguments specified by '-c' option
yell "ERROR:\\'-r\\' or \\'-R\\' set but \\'-e\\' is not set."; exit 1; fi;
} # Populate recPubKeysValid with argRecPubKeys; form encryption cmd string and filename suffix
magicParseCompressionArg() {
# Desc: Parses compression arguments specified by '-c' option
- # Input: vars: OPTION_COMPRESS
- # Output: CMD_COMPRESS, CMD_COMPRESS_SUFFIX
+ # Input: vars: optionCompress
+ # Output: cmd_compress, cmd_compress_suffix
# Depends: checkapp(), vbm(), gzip,
# Depends: checkapp(), vbm(), gzip,
- if [[ "$OPTION_COMPRESS" = "true" ]]; then # Check if compression option active
+ if [[ "$optionCompress" = "true" ]]; then # Check if compression option active
if checkapp gzip; then # Check if gzip available
if checkapp gzip; then # Check if gzip available
- CMD_COMPRESS="gzip " && vbm "CMD_COMPRESS:$CMD_COMPRESS";
- CMD_COMPRESS_SUFFIX=".gz" && vbm "CMD_COMPRESS_SUFFIX:$CMD_COMPRESS_SUFFIX";
+ cmd_compress="gzip " && vbm "cmd_compress:$cmd_compress";
+ cmd_compress_suffix=".gz" && vbm "cmd_compress_suffix:$cmd_compress_suffix";
else
yell "ERROR:Compression enabled but \"gzip\" not found. Exiting."; exit 1;
fi
else
else
yell "ERROR:Compression enabled but \"gzip\" not found. Exiting."; exit 1;
fi
else
- CMD_COMPRESS="tee /dev/null " && vbm "CMD_COMPRESS:$CMD_COMPRESS";
- CMD_COMPRESS_SUFFIX="" && vbm "CMD_COMPRESS_SUFFIX:$CMD_COMPRESS_SUFFIX";
+ cmd_compress="tee /dev/null " && vbm "cmd_compress:$cmd_compress";
+ cmd_compress_suffix="" && vbm "cmd_compress_suffix:$cmd_compress_suffix";
vbm "DEBUG:Compression not enabled.";
fi
} # Form compression cmd string and filename suffix
magicInitWorkingDir() {
# Desc: Determine temporary working directory from defaults or user input
vbm "DEBUG:Compression not enabled.";
fi
} # Form compression cmd string and filename suffix
magicInitWorkingDir() {
# Desc: Determine temporary working directory from defaults or user input
- # Usage: magicInitWorkignDir
- # Input: vars: OPTION_TEMPDIR, argTempDirPriority, dirTmpDefault
+ # Usage: magicInitWorkingDir
+ # Input: vars: optionTmpDir, argTempDirPriority, dirTmpDefault
# Input: vars: scriptTimeStart
# Input: vars: scriptTimeStart
- # Output: vars: DIR_TMP
+ # Output: vars: dir_tmp
# Depends: processArguments(), vbm(), yell()
# Parse '-t' option (user-specified temporary working dir)
# Depends: processArguments(), vbm(), yell()
# Parse '-t' option (user-specified temporary working dir)
- ## Set DIR_TMP_PARENT to user-specified value if specified
- local DIR_TMP_PARENT
+ ## Set dir_tmp_parent to user-specified value if specified
+ local dir_tmp_parent
- if [[ "$OPTION_TMPDIR" = "true" ]]; then
+ if [[ "$optionTmpDir" = "true" ]]; then
if [[ -d "$argTempDirPriority" ]]; then
if [[ -d "$argTempDirPriority" ]]; then
- DIR_TMP_PARENT="$argTempDirPriority";
+ dir_tmp_parent="$argTempDirPriority";
else
yell "WARNING:Specified temporary working directory not valid:$argTempDirPriority";
exit 1; # Exit since user requires a specific temp dir and it is not available.
fi;
else
else
yell "WARNING:Specified temporary working directory not valid:$argTempDirPriority";
exit 1; # Exit since user requires a specific temp dir and it is not available.
fi;
else
- ## Set DIR_TMP_PARENT to default or fallback otherwise
+ ## Set dir_tmp_parent to default or fallback otherwise
if [[ -d "$dirTmpDefault" ]]; then
if [[ -d "$dirTmpDefault" ]]; then
- DIR_TMP_PARENT="$dirTmpDefault";
+ dir_tmp_parent="$dirTmpDefault";
elif [[ -d /tmp ]]; then
yell "WARNING:$dirTmpDefault not available. Falling back to /tmp .";
elif [[ -d /tmp ]]; then
yell "WARNING:$dirTmpDefault not available. Falling back to /tmp .";
else
yell "ERROR:No valid working directory available. Exiting.";
exit 1;
fi
fi;
else
yell "ERROR:No valid working directory available. Exiting.";
exit 1;
fi
fi;
- ## Set DIR_TMP using DIR_TMP_PARENT and nonce (scriptTimeStart)
- DIR_TMP="$DIR_TMP_PARENT"/"$scriptTimeStart""..bkgpslog" && vbm "DEBUG:Set DIR_TMP to:$DIR_TMP"; # Note: removed at end of main().
+ ## Set dir_tmp using dir_tmp_parent and nonce (scriptTimeStart)
+ dir_tmp="$dir_tmp_parent"/"$scriptTimeStart""..bkgpslog" && vbm "DEBUG:Set dir_tmp to:$dir_tmp"; # Note: removed at end of main().
} # Sets working dir
magicParseCustomTTL() {
# Desc: Set user-specified TTLs for buffer and script
# Input: vars: argCustomBufferTTL (integer), argCustomScriptTTL_TE (string)
} # Sets working dir
magicParseCustomTTL() {
# Desc: Set user-specified TTLs for buffer and script
# Input: vars: argCustomBufferTTL (integer), argCustomScriptTTL_TE (string)
- # Input: vars: OPTION_CUSTOM_BUFFERTTL, OPTION_CUSTOM_SCRIPTTTL
- # Input: vars: BUFFER_TTL (integer), scriptTTL_TE (string)
- # Output: BUFFER_TTL (integer), scriptTTL_TE (string)
+ # Input: vars: optionCustomBufferTTL, optionCustomScriptTTL_TE
+ # Input: vars: bufferTTL (integer), scriptTTL_TE (string)
+ # Output: bufferTTL (integer), scriptTTL_TE (string)
# Depends validateInput(), showUsage(), yell
# React to '-b, --buffer-ttl' option
# Depends validateInput(), showUsage(), yell
# React to '-b, --buffer-ttl' option
- if [[ "$OPTION_CUSTOM_BUFFERTTL" = "true" ]]; then
+ if [[ "$optionCustomBufferTTL" = "true" ]]; then
## T: Check if argCustomBufferTTL is an integer
if validateInput "$argCustomBufferTTL" "integer"; then
### T: argCustomBufferTTL is an integer
## T: Check if argCustomBufferTTL is an integer
if validateInput "$argCustomBufferTTL" "integer"; then
### T: argCustomBufferTTL is an integer
- BUFFER_TTL="$argCustomBufferTTL" && vbm "Custom BUFFER_TTL from -b:$BUFFER_TTL";
+ bufferTTL="$argCustomBufferTTL" && vbm "Custom bufferTTL from -b:$bufferTTL";
else
### F: argcustomBufferTTL is not an integer
yell "ERROR:Invalid integer argument for custom buffer time-to-live."; showUsage; exit 1;
fi;
else
### F: argcustomBufferTTL is not an integer
yell "ERROR:Invalid integer argument for custom buffer time-to-live."; showUsage; exit 1;
fi;
- ## F: do not change BUFFER_TTL
+ ## F: do not change bufferTTL
fi;
# React to '-B, --script-ttl' option
fi;
# React to '-B, --script-ttl' option
- if [[ "$OPTION_CUSTOM_SCRIPTTTL_TE" = "true" ]]; then
+ if [[ "$optionCustomScriptTTL_TE" = "true" ]]; then
## T: Check if argCustomScriptTTL is a time element (ex: "day", "hour")
if validateInput "$argCustomScriptTTL" "time_element"; then
### T: argCustomScriptTTL is a time element
## T: Check if argCustomScriptTTL is a time element (ex: "day", "hour")
if validateInput "$argCustomScriptTTL" "time_element"; then
### T: argCustomScriptTTL is a time element
processArguments "$@";
## Act upon arguments
### Determine working directory
processArguments "$@";
## Act upon arguments
### Determine working directory
- magicInitWorkingDir; # Sets DIR_TMP from argTempDirPriority
+ magicInitWorkingDir; # Sets dir_tmp from argTempDirPriority
### Set output encryption and compression option strings
#### React to "-r" ("encryption recipients") option
### Set output encryption and compression option strings
#### React to "-r" ("encryption recipients") option
- magicParseRecipientArgs; # Updates recPubKeysValid, CMD_ENCRYPT[_SUFFIX] from argRecPubKeys
+ magicParseRecipientArgs; # Updates recPubKeysValid, cmd_encrypt[_suffix] from argRecPubKeys
#### React to "-c" ("compression") option
#### React to "-c" ("compression") option
- magicParseCompressionArg; # Updates CMD_COMPRESS[_SUFFIX]
+ magicParseCompressionArg; # Updates cmd_compress[_suffix]
#### React to "-R" ("recipient directory") option
magicParseRecipientDir; # Updates recPubKeysValid
#### React to custom buffer and script TTL options ("-b", "-B")
magicParseCustomTTL; # Sets custom scriptTTL_TE and/or bufferTTL if specified
# Check that critical apps and dirs are available, display missing ones.
#### React to "-R" ("recipient directory") option
magicParseRecipientDir; # Updates recPubKeysValid
#### React to custom buffer and script TTL options ("-b", "-B")
magicParseCustomTTL; # Sets custom scriptTTL_TE and/or bufferTTL if specified
# Check that critical apps and dirs are available, display missing ones.
- if ! checkapp gpspipe tar && ! checkdir "$DIR_OUT" "DIR_TMP"; then
+ if ! checkapp gpspipe tar && ! checkdir "$dirOut" "dir_tmp"; then
yell "ERROR:Critical components missing.";
displayMissing; yell "Exiting."; exit 1; fi
yell "ERROR:Critical components missing.";
displayMissing; yell "Exiting."; exit 1; fi
- # Set script lifespan (SCRIPT_TTL from scriptTTL_TE)
+ # Set script lifespan (scriptTTL from scriptTTL_TE)
magicSetScriptTTL "$scriptTTL_TE";
magicSetScriptTTL "$scriptTTL_TE";
- ## Note: scriptTTL_TE is time element string (ex: "day") while SCRIPT_TTL is integer seconds
+ ## Note: scriptTTL_TE is time element string (ex: "day") while scriptTTL is integer seconds
- # File name substring (ISO-8601 duration from BUFFER_TTL)
+ # File name substring (ISO-8601 duration from bufferTTL)
bufferTTL_STR="$(timeDuration "$bufferTTL")" && vbm "DEBUG:bufferTTL_STR:$bufferTTL_STR";
# Init temp working dir
bufferTTL_STR="$(timeDuration "$bufferTTL")" && vbm "DEBUG:bufferTTL_STR:$bufferTTL_STR";
# Init temp working dir
- try mkdir "$DIR_TMP" && vbm "DEBUG:Working dir created at DIR_TMP:$DIR_TMP";
+ try mkdir "$dir_tmp" && vbm "DEBUG:Working dir created at dir_tmp:$dir_tmp";
# Initialize 'tar' archive
## Define output tar path (note: each day gets *one* tar file (Ex: "20200731..hostname_location.[.gpx.gz].tar"))
# Initialize 'tar' archive
## Define output tar path (note: each day gets *one* tar file (Ex: "20200731..hostname_location.[.gpx.gz].tar"))
- PATHOUT_TAR="$DIR_OUT"/"$(dateShort)".."$scriptHostname""_location""$CMD_COMPRESS_SUFFIX""$CMD_ENCRYPT_SUFFIX".tar && \
- vbm "STATUS:Set PATHOUT_TAR to:$PATHOUT_TAR";
- ## Check that PATHOUT_TAR is a tar. Rename old and create empty one otherwise.
- checkMakeTar "$PATHOUT_TAR" && vbm "DEBUG:Confirmed or Created to be a tar:$PATHOUT_TAR";
- ## Append VERSION file to PATHOUT_TAR
+ pathout_tar="$dirOut"/"$(dateShort "$(date --date="$bufferTTL seconds ago" --iso-8601=seconds)")".."$scriptHostname""_location""$cmd_compress_suffix""$cmd_encrypt_suffix".tar && \
+ vbm "STATUS:Set pathout_tar to:$pathout_tar";
+ ## Check that pathout_tar is a tar. Rename old and create empty one otherwise.
+ checkMakeTar "$pathout_tar" && vbm "DEBUG:Confirmed or Created to be a tar:$pathout_tar";
+ ## Append VERSION file to pathout_tar
magicWriteVersion;
# Define GPS conversion commands
magicWriteVersion;
# Define GPS conversion commands
- CMD_CONV_NMEA="tee /dev/null " && vbm "STATUS:Set CMD_CONV_NMEA to:$CMD_CONV_NMEA"; # tee as passthrough
- CMD_CONV_GPX="gpsbabel -i nmea -f - -o gpx -F - " && vbm "STATUS:Set CMD_CONV_GPX to:$CMD_CONV_GPX"; # convert NMEA to GPX
- CMD_CONV_KML="gpsbabel -i nmea -f - -o kml -F - " && vbm "STATUS:Set CMD_CONV_KML to:$CMD_CONV_KML"; # convert NMEA to KML
+ cmd_conv_nmea="tee /dev/null " && vbm "STATUS:Set cmd_conv_nmea to:$cmd_conv_nmea"; # tee as passthrough
+ cmd_conv_gpx="gpsbabel -i nmea -f - -o gpx -F - " && vbm "STATUS:Set cmd_conv_gpx to:$cmd_conv_gpx"; # convert NMEA to GPX
+ cmd_conv_kml="gpsbabel -i nmea -f - -o kml -F - " && vbm "STATUS:Set cmd_conv_kml to:$cmd_conv_kml"; # convert NMEA to KML
# MAIN LOOP:Record gps data until script lifespan ends
# MAIN LOOP:Record gps data until script lifespan ends
- timeBufferFirstNS="$(timeEpochNS)"; bufferRound=0; BUFFER_TTL_ADJ_FLOAT="$BUFFER_TTL";
- while [[ "$SECONDS" -lt "$SCRIPT_TTL" ]]; do
- if ! [[ -d "$DIR_TMP" ]]; then yell "ERROR:DIR_TMP existence failure:$DIR_TMP"; try mkdir "$DIR_TMP" && vbm "DEBUG:Working dir recreated DIR_TMP:$DIR_TMP"; fi
+ timeBufferFirstNS="$(timeEpochNS)"; bufferRound=0; bufferTTL_AdjFloat="$bufferTTL";
+ while [[ "$SECONDS" -lt "$scriptTTL" ]]; do
+ if ! [[ -d "$dir_tmp" ]]; then yell "ERROR:dir_tmp existence failure:$dir_tmp"; try mkdir "$dir_tmp" && vbm "DEBUG:Working dir recreated dir_tmp:$dir_tmp"; fi
magicParseRecipientDir;
magicGatherWriteBuffer &
magicParseRecipientDir;
magicGatherWriteBuffer &
- sleep "$BUFFER_TTL_ADJ_FLOAT"; # adjusted by magicBufferSleepPID
+ sleep "$bufferTTL_AdjFloat"; # adjusted by magicBufferSleepPID
- magicBufferSleepPID; # Calculates BUFFER_TTL_ADJ_FLOAT from BUFFER_TTL given buffer expected start time vs. actual
+ magicBufferSleepPID; # Calculates bufferTTL_AdjFloat from bufferTTL given buffer expected start time vs. actual
- ## Remove DIR_TMP
- try rm -r "$DIR_TMP" && vbm "Removed DIR_TMP:$DIR_TMP";
+ ## Remove dir_tmp
+ try rm -r "$dir_tmp" && vbm "Removed dir_tmp:$dir_tmp";
vbm "STATUS:Main function finished.";
} # Main function.
vbm "STATUS:Main function finished.";
} # Main function.