X-Git-Url: https://zdv2.bktei.com/gitweb/EVA-2020-02.git/blobdiff_plain/e014f2394d460e40c8ca9f16fd4efb9addd30ada..7103c8b0857a3538a014dacfd0d99c209890dad8:/exec/bkgpslog?ds=inline diff --git a/exec/bkgpslog b/exec/bkgpslog deleted file mode 100755 index d621e4e..0000000 --- a/exec/bkgpslog +++ /dev/null @@ -1,263 +0,0 @@ -#!/bin/bash - -# Desc: Records gps data until midnight -# Author: Steven Baltakatei Sandoval; License: GPLv3+ -# Usage: bkgpslog --output [output dir] - -#==BEGIN Define script parameters== -PATH="/opt/bktei:$PATH" # Add default baltakatei script install directory to PATH (necessary for other bk scripts) -SCRIPT_HOSTNAME=$(hostname) # Save hostname of system running this script. -SCRIPT_VERSION="bkgpslog 0.0.1" # Define version of script. -SCRIPT_TIME_SHORT="$(date +%Y%m%dT%H%M%S%z)" # Save current date & time in ISO-8601 format. -SCRIPT_DATE_SHORT="$(date +%Y%m%d)" # Save current date in ISO-8601 format. - -declare -Ag appRollCall # Associative array for storing app status -declare -Ag fileRollCall # Associative array for storing file status -declare -Ag dirRollCall # Associative array for storing dir status - -#===BEGIN Declare local script functions=== -checkapp() { - # Desc: If arg is a command, save result in assoc array 'appRollCall' - # Usage: checkapp arg1 arg2 arg3 ... - # Input: global assoc. array 'appRollCall' - # Output: adds/updates key(value) to global assoc array 'appRollCall' - local returnState - #echo "DEBUG:$(date +%S.%N)..Starting checkapp function." - #echo "DEBUG:args: $@" - #echo "DEBUG:returnState:$returnState" - - #===Process Args=== - for arg in "$@"; do - #echo "DEBUG:processing arg:$arg" - if command -v "$arg" 1>/dev/null 2>&1; then # Check if arg is a valid command - appRollCall[$arg]="true"; - #echo "DEBUG:appRollCall[$arg]:"${appRollCall[$arg]} - if ! [ "$returnState" = "false" ]; then returnState="true"; fi - else - appRollCall[$arg]="false"; returnState="false"; - fi - done - - #for key in "${!appRollCall[@]}"; do echo "DEBUG:$key => ${appRollCall[$key]}"; done - #echo "DEBUG:evaluating returnstate. returnState:"$returnState - - #===Determine function return code=== - if [ "$returnState" = "true" ]; then - #echo "DEBUG:checkapp returns true for $arg"; - return 0; - else - #echo "DEBUG:checkapp returns false for $arg"; - return 1; - fi -} # Check that app exists -checkfile() { - # Desc: If arg is a file path, save result in assoc array 'fileRollCall' - # Usage: checkfile arg1 arg2 arg3 ... - # Input: global assoc. array 'fileRollCall' - # Output: adds/updates key(value) to global assoc array 'fileRollCall'; - # Output: returns 0 if app found, 1 otherwise - local returnState - - #===Process Args=== - for arg in "$@"; do - #echo "DEBUG:processing arg:$arg" - if [ -f "$arg" ]; then - fileRollCall["$arg"]="true"; - #echo "DEBUG:fileRollCall[\"$arg\"]:"${fileRollCall["$arg"]} - if ! [ "$returnState" = "false" ]; then returnState="true"; fi - else - fileRollCall["$arg"]="false"; returnState="false"; - fi - done - - #for key in "${!fileRollCall[@]}"; do echo "DEBUG:fileRollCall key [$key] is:${fileRollCall[$key]}"; done - #echo "DEBUG:evaluating returnstate. returnState:"$returnState - - #===Determine function return code=== - if [ "$returnState" = "true" ]; then - #echo "DEBUG:checkapp returns true for $arg"; - return 0; - else - #echo "DEBUG:checkapp returns false for $arg"; - return 1; - fi -} # Check that file exists -checkdir() { - # Desc: If arg is a dir path, save result in assoc array 'dirRollCall' - # Usage: checkdir arg1 arg2 arg3 ... - # Input: global assoc. array 'dirRollCall' - # Output: adds/updates key(value) to global assoc array 'dirRollCall'; - # Output: returns 0 if app found, 1 otherwise - local returnState - - #===Process Args=== - for arg in "$@"; do - #echo "DEBUG:processing arg:$arg" - if [ -d "$arg" ]; then - dirRollCall["$arg"]="true"; - #echo "DEBUG:dirRollCall[\"$arg\"]:"${dirRollCall["$arg"]} - if ! [ "$returnState" = "false" ]; then returnState="true"; fi - elif [ "$arg" = "" ]; then - dirRollCall["$arg"]="false"; returnState="false"; - else - returnState="false"; - fi - done - - #for key in "${!dirRollCall[@]}"; do echo "DEBUG:dirRollCall key [$key] is:${dirRollCall[$key]}"; done - #echo "DEBUG:evaluating returnstate. returnState:"$returnState - - #===Determine function return code=== - if [ "$returnState" = "true" ]; then - #echo "DEBUG:checkapp returns true for $arg"; - return 0; - else - #echo "DEBUG:checkapp returns false for $arg"; - 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. -showUsage() { - echoerr "USAGE:" - echoerr " bkgpslog.sh [ options ]" - echoerr - echoerr "OPTIONS:" - echoerr " -h, --help" - echoerr " Display help information." - echoerr - echoerr " --version" - echoerr " Display script version." - echoerr - echoerr " -v, --verbose" - echoerr " Display debugging info." - echoerr - echoerr " -o, --output [ directory ]" - echoerr " Specify output directory to save logs." -} # Display information on how to use this script. -showVersion() { - echoerr "$SCRIPT_VERSION" -} # Display script version. -vbm() { - # 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. - # Output: stderr - # 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. - fi - - # End function - return 0; # Function finished. -} # Verbose message display function. -processArguments() { - while [ ! $# -eq 0 ]; do # While number of arguments ($#) is not (!) equal to (-eq) zero (0). - echoerr "DEBUG:Starting processArguments while loop." - echoerr "DEBUG:Provided arguments are:""$*" - 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 DIROUT="$2"; vbm "DEBUG:DIROUT:$DIROUT"; shift; fi ;; # Define output directory. - *) echoerr "ERROR: Unrecognized argument."; exit 1;; # Handle unrecognized options. - esac - shift - done -} # Argument Processing -timeUntilMidnight(){ - # Desc: Report seconds until midnight - # Output: stdout: integer seconds until midnight - # Output: exit code 0 if stdout > 0; 1 if stdout = 0; 2 if stdout < 0 - # Usage: timeUntilMidnight - # Usage: if ! myTTL="$(timeUntilMidnight)"; then yell "ERROR in if statement"; exit 1; fi - local returnState - TIME_CURRENT="$(date --iso-8601=seconds)" ; # Produce `date`-parsable current timestamp with resolution of 1 second. - TIME_CURRENT_SHORT="$(date -d "$TIME_CURRENT" +%Y%m%dT%H%M%S%z)" # Produce separator-less current timestamp with resolution 1 second. - DATE_CURRENT="$(date -d "$TIME_CURRENT" --iso-8601=date)" ; # Produce `date`-parsable current timestamp with resolution of 1 day. - DATE_CURRENT_SHORT="$(date -d "$TIME_CURRENT" +%Y%m%d)" ; # Produce separator-less current timestamp with resolution 1 day. - DATE_TOMORROW="$(date -d "$TIME_CURRENT next day" --iso-8601=date)" ; # Produce timestamp of tomorrow's date (res. 1 day). - TIME_NEXT_MIDNIGHT="$(date -d "$DATE_TOMORROW" --iso-8601=seconds)" ; # Produce `date`-parsable timestamp of closest future midnight (res. 1 second). - SECONDS_UNTIL_NEXT_MIDNIGHT="$(( $(date +%s -d "$TIME_NEXT_MIDNIGHT") - $(date +%s -d "$TIME_CURRENT") ))" ; # Calculate seconds until closest future midnight (res. 1 second). - if [[ "$SECONDS_UNTIL_NEXT_MIDNIGHT" -gt 0 ]]; then - returnState="true"; - elif [[ "$SECONDS_UNTIL_NEXT_MIDNIGHT" -eq 0 ]]; then - returnState="WARNING_ZERO"; - yell "WARNING:Reported time until midnight exactly zero."; - elif [[ "$SECONDS_UNTIL_NEXT_MIDNIGHT" -lt 0 ]]; then - returnState="WARNING_NEGATIVE"; - yell "WARNING:Reported time until midnight is negative."; - fi - - try echo "$SECONDS_UNTIL_NEXT_MIDNIGHT"; # Report - - #===Determine function return code=== - if [[ "$returnState" = "true" ]]; then - return 0; - elif [[ "$returnState" = "WARNING_ZERO" ]]; then - return 1; - elif [[ "$returnState" = "WARNING_NEGATIVE" ]]; then - return 2; - fi -} # Report seconds until next midnight -dateTimeShort(){ - # Desc: Timestamp without separators (YYYYmmddTHHMMSS+zzzz) - # Usage: dateTimeShort - # Output: stdout: timestamp (ISO-8601, no separators) - TIME_CURRENT="$(date --iso-8601=seconds)" ; # Produce `date`-parsable current timestamp with resolution of 1 second. - TIME_CURRENT_SHORT="$(date -d "$TIME_CURRENT" +%Y%m%dT%H%M%S%z)"; # Produce separator-less current timestamp with resolution 1 second. - echo "$TIME_CURRENT_SHORT"; -} # Get date&time without separators -main() { - processArguments "$@" # Process arguments. - if checkapp gpspipe && checkdir "$DIROUT"; then - # Determine output file paths - FILEOUT_NMEA="$(dateTimeShort)".."$SCRIPT_HOSTNAME"_location.nmea ; - #FILEOUT_GPX="" ; - #FILEOUT_KML="" ; - - # Determine script lifespan (note: exit if <= 0 since 'timeout' runs forever if provided "0s". - #if ! scriptTTL="$(timeUntilMidnight)"; then yell "ERROR: timeUntilMidnight exit code $?"; exit 1; fi - scriptTTL="60"; #DEBUG DEBUG DEBUG DEBUG - - # Determine buffer lifespan - bufferTTL="15"; - - # Record gps data until life ends - declare debugCounter; debugCounter="0" - while [[ "$SECONDS" -lt "$scriptTTL" ]]; do - ((debugCounter++)) - timeout "$bufferTTL""s" gpspipe -r 1>> "$DIROUT"/"$FILEOUT_NMEA""$debugCounter" - echo "do stuff" 1>&2; - done - fi -} # Main function. -#===END Declare local script functions=== -#==END Define script parameters== - - -#==BEGIN Perform work and exit== -main "$@" # Run main function. -exit 0; -#==END Perform work and exit== - - - - #gpspipe -r -d -l -o "$DIROUT1"/"$FILEOUT1" ;