X-Git-Url: https://zdv2.bktei.com/gitweb/EVA-2020-02.git/blobdiff_plain/be9b36849bf083e47ff9deaf67c096ab7802e54b..79bb6c16db0def5cb43b07e9a923b883eeb0737c:/exec/bklog?ds=inline diff --git a/exec/bklog b/exec/bklog index be3dded..f3722df 100644 --- a/exec/bklog +++ b/exec/bklog @@ -11,7 +11,7 @@ dirTmpDefault="/dev/shm"; # Default parent of working directory # Script Metadata scriptName="bklog"; # Define basename of script file. -scriptVersion="0.1.3"; # Define version of script. +scriptVersion="0.1.5"; # Define version of script. scriptURL="https://gitlab.com/baltakatei/ninfacyzga-01"; # Define wesite hosting this script. scriptTimeStart="$(date +%Y%m%dT%H%M%S.%N)"; # YYYYmmddTHHMMSS.NNNNNNNNN scriptHostname=$(hostname); # Save hostname of system running this script. @@ -225,11 +225,142 @@ displayMissing() { #==END Display errors== } # Display missing apps, files, dirs + +appendFileTar(){ + # Desc: Appends [processed] file to tar + # Usage: appendFileTar [file path] [name of file to be inserted] [tar path] [temp dir] ([process cmd]) + # Version: 2.0.1 + # 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) + # arg4: temporary working dir + # arg5: (optional) command string to process file (ex: "gpsbabel -i nmea -f - -o kml -F - ") + # Output: file written to disk + # Example: decrypt multiple large files in parallel + # 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.0.3, tar 1.30, cat 8.30, yell() + local fn fileName tarPath tmpDir + + # Save function name + fn="${FUNCNAME[0]}"; + #yell "DEBUG:STATUS:$fn:Started appendFileTar()." + + # Set file name + if ! [ -z "$2" ]; then fileName="$2"; else yell "ERROR:$fn:Not enough arguments."; exit 1; fi + # Check tar path is a file + if [ -f "$3" ]; then tarPath="$3"; else yell "ERROR:$fn:Tar archive arg not a file:$3"; exit 1; fi + # Check temp dir arg + if ! [ -z "$4" ]; then tmpDir="$4"; else yell "ERROR:$fn:No temporary working dir set."; exit 1; fi + # Set command strings + if ! [ -z "$5" ]; then cmd1="$5"; else cmd1="cat "; fi # command string + + # Input command string + cmd0="cat \"\$1\""; + + # Write to temporary working dir + eval "$cmd0 | $cmd1" > "$tmpDir"/"$fileName"; + + # Append to tar + try tar --append --directory="$tmpDir" --file="$tarPath" "$fileName"; + #yell "DEBUG:STATUS:$fn:Finished appendFileTar()." +} # Append [processed] file to Tar archive +checkAgePubkey() { + # Desc: Checks if string is an age-compatible pubkey + # Usage: checkAgePubkey [str pubkey] + # Version: 0.1.2 + # Input: arg1: string + # Output: return code 0: string is age-compatible pubkey + # return code 1: string is NOT an age-compatible pubkey + # age stderr (ex: there is stderr if invalid string provided) + # Depends: age (v0.1.0-beta2; https://github.com/FiloSottile/age/releases/tag/v1.0.0-beta2 ) + + argPubkey="$1"; + + if echo "test" | age -a -r "$argPubkey" 1>/dev/null; then + return 0; + else + return 1; + fi; +} # Check age pubkey +dateShort(){ + # Desc: Date without separators (YYYYmmdd) + # Usage: dateShort ([str date]) + # Version: 1.1.2 + # Input: arg1: 'date'-parsable timestamp string (optional) + # Output: stdout: date (ISO-8601, no separators) + # Depends: bash 5.0.3, date 8.30, yell() + local argTime timeCurrent timeInput dateCurrentShort + + argTime="$1"; + # Get Current Time + 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 + 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 + timeInput="$argTime"; + else + ### F: Time argument not valid; exit + yell "ERROR:Invalid time argument supplied. Exiting."; exit 1; + fi; + fi; + # Construct and deliver separator-les date string + dateCurrentShort="$(date -d "$timeInput" +%Y%m%d)"; # Produce separator-less current date with resolution 1 day. + echo "$dateCurrentShort"; +} # Get YYYYmmdd +setTimeZoneEV(){ + # Desc: Set time zone environment variable TZ + # Usage: setTimeZoneEV arg1 + # Version 0.1.2 + # Input: arg1: 'date'-compatible timezone string (ex: "America/New_York") + # TZDIR env var (optional; default: "/usr/share/zoneinfo") + # Output: exports TZ + # exit code 0 on success + # exit code 1 on incorrect number of arguments + # exit code 2 if unable to validate arg1 + # Depends: yell(), printenv 8.30, bash 5.0.3 + # Tested on: Debian 10 + local tzDir returnState argTimeZone + + argTimeZone="$1" + if ! [[ $# -eq 1 ]]; then + yell "ERROR:Invalid argument count."; + return 1; + fi + + # Read TZDIR env var if available + if printenv TZDIR 1>/dev/null 2>&1; then + tzDir="$(printenv TZDIR)"; + else + tzDir="/usr/share/zoneinfo"; + fi + + # Validate TZ string + if ! [[ -f "$tzDir"/"$argTimeZone" ]]; then + yell "ERROR:Invalid time zone argument."; + return 2; + else + # Export ARG1 as TZ environment variable + TZ="$argTimeZone" && export TZ && returnState="true"; + fi + + # Determine function return code + if [ "$returnState" = "true" ]; then + return 0; + fi +} # Exports TZ environment variable showUsage() { cat <<'EOF' USAGE: cmd | bklog [ options ] - echoerr + OPTIONS: -h, --help Display help information. @@ -287,7 +418,7 @@ showUsage() { -B, --script-ttl [time element string] Specify custom script time-to-live in seconds (default: "day") Valid values: "day", "hour" - echoerr + EXAMPLE: (bash script lines) $ gpspipe -r | /bin/bash bklog -v -e -c -z "UTC" -t "/dev/shm" \ -r age1mrmfnwhtlprn4jquex0ukmwcm7y2nxlphuzgsgv8ew2k9mewy3rs8u7su5 \ @@ -301,118 +432,6 @@ EOF showVersion() { yell "$scriptVersion" } # Display script version. -setTimeZoneEV(){ - # Desc: Set time zone environment variable TZ - # Usage: setTimeZoneEV arg1 - # Version 0.1.2 - # Input: arg1: 'date'-compatible timezone string (ex: "America/New_York") - # TZDIR env var (optional; default: "/usr/share/zoneinfo") - # Output: exports TZ - # exit code 0 on success - # exit code 1 on incorrect number of arguments - # exit code 2 if unable to validate arg1 - # Depends: yell(), printenv 8.30, bash 5.0.3 - # Tested on: Debian 10 - local tzDir returnState argTimeZone - - argTimeZone="$1" - if ! [[ $# -eq 1 ]]; then - yell "ERROR:Invalid argument count."; - return 1; - fi - - # Read TZDIR env var if available - if printenv TZDIR 1>/dev/null 2>&1; then - tzDir="$(printenv TZDIR)"; - else - tzDir="/usr/share/zoneinfo"; - fi - - # Validate TZ string - if ! [[ -f "$tzDir"/"$argTimeZone" ]]; then - yell "ERROR:Invalid time zone argument."; - return 2; - else - # Export ARG1 as TZ environment variable - TZ="$argTimeZone" && export TZ && returnState="true"; - fi - - # Determine function return code - if [ "$returnState" = "true" ]; then - return 0; - fi -} # Exports TZ environment variable -dateShort(){ - # Desc: Date without separators (YYYYmmdd) - # Usage: dateShort ([str date]) - # Version: 1.1.2 - # Input: arg1: 'date'-parsable timestamp string (optional) - # Output: stdout: date (ISO-8601, no separators) - # Depends: bash 5.0.3, date 8.30, yell() - local argTime timeCurrent timeInput dateCurrentShort - - argTime="$1"; - # Get Current Time - 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 - 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 - timeInput="$argTime"; - else - ### F: Time argument not valid; exit - yell "ERROR:Invalid time argument supplied. Exiting."; exit 1; - fi; - fi; - # Construct and deliver separator-les date string - dateCurrentShort="$(date -d "$timeInput" +%Y%m%d)"; # Produce separator-less current date with resolution 1 day. - echo "$dateCurrentShort"; -} # Get YYYYmmdd -appendFileTar(){ - # Desc: Appends [processed] file to tar - # Usage: appendFileTar [file path] [name of file to be inserted] [tar path] [temp dir] ([process cmd]) - # Version: 2.0.1 - # 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) - # arg4: temporary working dir - # arg5: (optional) command string to process file (ex: "gpsbabel -i nmea -f - -o kml -F - ") - # Output: file written to disk - # Example: decrypt multiple large files in parallel - # 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.0.3, tar 1.30, cat 8.30, yell() - local fn fileName tarPath tmpDir - - # Save function name - fn="${FUNCNAME[0]}"; - #yell "DEBUG:STATUS:$fn:Started appendFileTar()." - - # Set file name - if ! [ -z "$2" ]; then fileName="$2"; else yell "ERROR:$fn:Not enough arguments."; exit 1; fi - # Check tar path is a file - if [ -f "$3" ]; then tarPath="$3"; else yell "ERROR:$fn:Tar archive arg not a file:$3"; exit 1; fi - # Check temp dir arg - if ! [ -z "$4" ]; then tmpDir="$4"; else yell "ERROR:$fn:No temporary working dir set."; exit 1; fi - # Set command strings - if ! [ -z "$5" ]; then cmd1="$5"; else cmd1="cat "; fi # command string - - # Input command string - cmd0="cat \"\$1\""; - - # Write to temporary working dir - eval "$cmd0 | $cmd1" > "$tmpDir"/"$fileName"; - - # Append to tar - try tar --append --directory="$tmpDir" --file="$tarPath" "$fileName"; - #yell "DEBUG:STATUS:$fn:Finished appendFileTar()." -} # Append [processed] file to Tar archive 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 @@ -605,6 +624,7 @@ timeDuration(){ fi } # Get duration (ex: PT10M4S ) + magicInitWorkingDir() { # Desc: Determine temporary working directory from defaults or user input # Usage: magicInitWorkingDir