#!/usr/bin/env bash
# Define variables
+declare -g max_job_count="2"; # default max job count
+declare -g age_threshold="60"; # min age to add file; seconds;
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
calendars+=("https://btc.calendar.catallaxy.com");
calendars+=("https://alice.btc.calendar.opentimestamps.org");
calendars+=("https://bob.btc.calendar.opentimestamps.org");
-age_threshold="60"; # min age to add file; seconds;
-max_job_count="2"; # default max job count
# Declare functions
yell() { echo "$0: $*" >&2; } # print script path and all args to stderr
vbm "DEBUG:showVersion function called."
cat <<'EOF'
-bkots 2.0.0
+bkots 2.1.1
Copyright (C) 2022 Steven Baltakatei Sandoval
License GPLv3: GNU GPL version 3
This is free software; you are free to change and redistribute it.
# Ref/Attrib: [1] How to create an array of unique elements from a string/array in bash https://unix.stackexchange.com/a/167194
# [2] How to find files containing newlines in their names https://stackoverflow.com/a/21727028
# [3] Get mtime of specific file using Bash? https://stackoverflow.com/a/4774377
- # [4] Search/Replace with string substitution instead of sed. https://www.shellcheck.net/wiki/SC2001
local -a file_list file_list_pruned;
local -a files_to_verify files_to_upgrade files_to_stamp
local -a files_to_verify_pruned files_to_upgrade_pruned files_to_stamp_pruned
vbm "DEBUG:files_to_stamp_pruned:";
printf "%s\n" "${files_to_stamp_pruned[@]}";
fi;
-
+
# Act on files
## Assemble and execute upgrade file commands
for item in "${files_to_upgrade_pruned[@]}"; do
- path_prf="$(cut -d $'\n' -f1 < <(echo "$item"))";
- path_prf_sesc="${path_prf//\"/\\\"}"; # escape path double quotes. See [4].
- if [[ -z "$path_prf" ]]; then
- yell "ERROR:blank upgrade item encountered. Skipping:item:$item";
- continue;
- fi;
- vbm "DEBUG:Attempting to upgrade proof file:path_prf:$path_prf";
- if [[ ! $option_dry_run == "true" ]]; then
- ### Try upgrade with known calendars in random order
- while read -r url; do
- vbm "DEBUG:Upgrading with calendar:url:$url";
-
- #### assemble command
- local -a cmd_temp;
- cmd_temp+=("ots");
- if [[ "$opVerbose" = "true" ]]; then cmd_temp+=("-v"); fi;
- cmd_temp+=("-l" "$url" "--no-default-whitelist");
- cmd_temp+=("upgrade" "$path_prf_sesc");
- if [[ "$opVerbose" = "true" ]]; then declare -p cmd_temp; fi;
-
- #### execute command
- wait_for_jobslot && must "${cmd_temp[@]}" &
- unset cmd_temp;
- break;
- #ots -l "$url" --no-default-whitelist upgrade "$path_prf" && break;
- done < <(printf "%s\n" "${calendars[@]}" | shuf);
- else
- yell "DEBUG:DRY RUN:Not running:\"ots upgrade $path_prf\"";
- fi;
+ wait_for_jobslot && {
+ path_prf="$(cut -d $'\n' -f1 < <(echo "$item"))";
+ if [[ -z "$path_prf" ]]; then
+ yell "ERROR:blank upgrade item encountered. Skipping:item:$item";
+ return 1; # would have been `continue` were it not in a subshell
+ fi;
+ vbm "DEBUG:Attempting to upgrade proof file:path_prf:$path_prf";
+ if [[ ! $option_dry_run == "true" ]]; then
+ ### Try upgrade with known calendars in random order
+ while read -r url; do
+ vbm "DEBUG:Upgrading with calendar:url:$url";
+
+ #### assemble command
+ local -a cmd_temp;
+ cmd_temp=("ots");
+ if [[ "$opVerbose" = "true" ]]; then cmd_temp+=("-v"); fi;
+ cmd_temp+=("-l" "$url" "--no-default-whitelist");
+ cmd_temp+=("upgrade" "$path_prf");
+ if [[ "$opVerbose" = "true" ]]; then declare -p cmd_temp; fi;
+
+ #### execute command
+ "${cmd_temp[@]}";
+ unset cmd_temp;
+ break;
+ #ots -l "$url" --no-default-whitelist upgrade "$path_prf" && break;
+ done < <(printf "%s\n" "${calendars[@]}" | shuf);
+ else
+ yell "DEBUG:DRY RUN:Not running:\"ots upgrade $path_prf\"";
+ fi;
+ } &
done;
## Assemble and execute verify file commands
for item in "${files_to_verify_pruned[@]}"; do
- path_src="$(cut -d $'\n' -f1 < <(echo "$item"))";
- path_prf="$(cut -d $'\n' -f2 < <(echo "$item"))";
- path_src_sesc="${path_src//\"/\\\"}"; # escape path double quotes. See [4].
- path_prf_sesc="${path_prf//\"/\\\"}"; # escape path double quotes. See [4].
- if [[ -z "$path_src" ]] || [[ -z "$path_prf" ]]; then
- yell "ERROR:blank verify item encountered. Skipping:item:$item";
- continue;
- fi;
- vbm "DEBUG:Attempting to verify source file:path_src:$path_src";
- vbm "DEBUG: against proof file: path_prf:$path_prf";
- if [[ ! $option_dry_run == "true" ]]; then
- ### Try verify with known calendars in random order
- while read -r url; do
- vbm "DEBUG:Verifying with calendar:url:$url";
+ wait_for_jobslot && {
+ path_src="$(cut -d $'\n' -f1 < <(echo "$item"))";
+ path_prf="$(cut -d $'\n' -f2 < <(echo "$item"))";
+ if [[ -z "$path_src" ]] || [[ -z "$path_prf" ]]; then
+ yell "ERROR:blank verify item encountered. Skipping:item:$item";
+ return 1; # would have been `continue` were it not in a subshell
+ fi;
+ vbm "DEBUG:Attempting to verify source file:path_src:$path_src";
+ vbm "DEBUG: against proof file: path_prf:$path_prf";
+ if [[ ! $option_dry_run == "true" ]]; then
+ ### Try verify with known calendars in random order
+ while read -r url; do
+ vbm "DEBUG:Verifying with calendar:url:$url";
+
+ #### assemble command
+ local -a cmd_temp;
+ cmd_temp=("ots");
+ if [[ "$opVerbose" = "true" ]]; then cmd_temp+=("-v"); fi;
+ cmd_temp+=("-l" "$url" "--no-default-whitelist");
+ cmd_temp+=("verify" "-f" "$path_src" "$path_prf");
+ if [[ "$opVerbose" = "true" ]]; then declare -p cmd_temp; fi;
+
+ #### execute command
+ "${cmd_temp[@]}";
+ unset cmd_temp;
+ break;
+ #ots -l "$url" --no-default-whitelist verify -f "$path_src" "$path_prf" && break;
+ done < <(printf "%s\n" "${calendars[@]}" | shuf);
+ else
+ yell "DEBUG:DRY RUN:Not running:\"ots verify -f $path_src $path_prf\"";
+ fi;
+ } &
+ done;
+
+ ## Assemble and execute stamp file commands
+ for item in "${files_to_stamp_pruned[@]}"; do
+ wait_for_jobslot && {
+ path_src="$(cut -d $'\n' -f1 < <(echo "$item"))";
+ if [[ -z "$path_src" ]]; then
+ yell "ERROR:blank stamp item encountered. Skipping:item:$item";
+ return 1; # would have been `continue` were it not in a subshell
+ fi;
+ vbm "DEBUG:Attempting to stamp source file:path_src:$path_src";
+ if [[ ! $option_dry_run == "true" ]]; then
#### assemble command
local -a cmd_temp;
- cmd_temp+=("ots");
+ cmd_temp=("ots");
if [[ "$opVerbose" = "true" ]]; then cmd_temp+=("-v"); fi;
- cmd_temp+=("-l" "$url" "--no-default-whitelist");
- cmd_temp+=("verify" "-f" "$path_src_sesc" "$path_prf_sesc");
+ cmd_temp+=("stamp" "$path_src");
if [[ "$opVerbose" = "true" ]]; then declare -p cmd_temp; fi;
#### execute command
- wait_for_jobslot && must "${cmd_temp[@]}" &
+ "${cmd_temp[@]}";
unset cmd_temp;
- break;
- #ots -l "$url" --no-default-whitelist verify -f "$path_src" "$path_prf" && break;
- done < <(printf "%s\n" "${calendars[@]}" | shuf);
- else
- yell "DEBUG:DRY RUN:Not running:\"ots verify -f $path_src $path_prf\"";
- fi;
- done;
-
- ## Assemble and execute stamp file commands
- for item in "${files_to_stamp_pruned[@]}"; do
- path_src="$(cut -d $'\n' -f1 < <(echo "$item"))";
- path_src_sesc="${path_src//\"/\\\"}"; # escape path double quotes. See [4].
- if [[ -z "$path_src" ]]; then
- yell "ERROR:blank stamp item encountered. Skipping:item:$item";
- continue;
- fi;
- vbm "DEBUG:Attempting to stamp source file:path_src:$path_src";
- if [[ ! $option_dry_run == "true" ]]; then
-
- #### assemble command
- local -a cmd_temp;
- cmd_temp+=("ots");
- if [[ "$opVerbose" = "true" ]]; then cmd_temp+=("-v"); fi;
- cmd_temp+=("stamp" "$path_src_sesc");
- if [[ "$opVerbose" = "true" ]]; then declare -p cmd_temp; fi;
-
- #### execute command
- wait_for_jobslot && must "${cmd_temp[@]}" &
- unset cmd_temp;
- #ots stamp "$path_src";
- else
- yell "DEBUG:DRY RUN:Not running:\"ots stamp $path_src\"";
- fi;
+ #ots stamp "$path_src";
+ else
+ yell "DEBUG:DRY RUN:Not running:\"ots stamp $path_src\"";
+ fi;
+ } &
done;
+
+ ## Wait for jobs to finish.
+ wait;
}; # main program
# Run program