From 77a8b21893a3063c0bd0b9b68b496c10c07dc971 Mon Sep 17 00:00:00 2001 From: Aaron Fiore Date: Wed, 14 Aug 2024 17:10:17 -0700 Subject: [PATCH] container: lib_fetch: implement Tor support - Adds 'tor' option - Uses `proxychains-ng` - Expects docker-finance's Tor plugin --- .../src/finance/lib/internal/lib_fetch.bash | 57 +++++++++++++++++-- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/container/src/finance/lib/internal/lib_fetch.bash b/container/src/finance/lib/internal/lib_fetch.bash index 92eff72..94d0920 100644 --- a/container/src/finance/lib/internal/lib_fetch.bash +++ b/container/src/finance/lib/internal/lib_fetch.bash @@ -79,6 +79,10 @@ function lib_fetch::__parse_args() (block)chain${global_arg_delim_2} + Tor (proxy): + + tor${global_arg_delim_2}<{on|true}|{off|false}> (default 'off') + \e[32mExamples:\e[0m \e[37;2m#\e[0m @@ -136,6 +140,14 @@ function lib_fetch::__parse_args() \e[37;2m# Fetch specific blockchain/subaccount/address for metamask\e[0m $ $global_usage account${global_arg_delim_2}metamask chain${global_arg_delim_2}ethereum/phone:wallet-1/0x236ba53B56FEE4901cdac3170D17f827DF43E969 + + \e[37;2m# Fetch given blochchain-based subaccounts for current year, over the Tor network\e[0m + $ $global_usage account${global_arg_delim_2}metamask${global_arg_delim_3}ledger blockchain${global_arg_delim_2}ethereum${global_arg_delim_3}polygon${global_arg_delim_3}tezos${global_arg_delim_3}algorand tor${global_arg_delim_2}on + +\e[32mNotes:\e[0m + + - For all commands, you can proxy your fetch through Tor with the \`tor${global_arg_delim_2}on\` option + * IMPORTANT: client-side \`tor\` plugin must be started *prior* to fetch " # @@ -151,6 +163,7 @@ function lib_fetch::__parse_args() && [[ ! "$_arg" =~ ^account[s]?${global_arg_delim_2} ]] \ && [[ ! "$_arg" =~ ^(^block)?chain[s]?${global_arg_delim_2} ]] \ && [[ ! "$_arg" =~ ^year[s]?${global_arg_delim_2} ]] \ + && [[ ! "$_arg" =~ ^tor${global_arg_delim_2} ]] \ && lib_utils::die_usage "$_usage" done @@ -193,6 +206,11 @@ function lib_fetch::__parse_args() local _arg_year="${_arg:${_len}}" [ -z "$_arg_year" ] && lib_utils::die_usage "$_usage" fi + + if [[ "$_key" =~ ^tor$ ]]; then + local _arg_tor="${_arg:${_len}}" + [ -z "$_arg_tor" ] && lib_utils::die_usage "$_usage" + fi done # @@ -247,6 +265,14 @@ function lib_fetch::__parse_args() fi fi + # Arg: tor + if [ ! -z "$_arg_tor" ]; then + # Need a valid arg + if [[ -z "$_arg_all" && -z "$_arg_price" && -z "$_arg_account" ]]; then + lib_utils::die_usage "$_usage" + fi + fi + # # Test argument values, set globals # @@ -318,6 +344,12 @@ function lib_fetch::__parse_args() global_arg_year="$(date +%Y)" # Set default current declare -gr global_arg_year fi + + # Arg: tor + if [ ! -z "$_arg_tor" ]; then + [[ ! "$_arg_tor" =~ ^on$|^true$|^off$|^false$ ]] && lib_utils::die_usage "$_usage" + declare -gr global_arg_tor="$_arg_tor" + fi } function lib_fetch::__fetch() @@ -752,15 +784,30 @@ function lib_fetch::__fetch_exec() [ -z "$_subtype" ] && lib_utils::die_fatal local _dir="${DOCKER_FINANCE_CONTAINER_REPO}/src/finance/lib/internal/fetch" - local _ifs="$IFS" IFS=' ' - # TODO: remove no-limit after internal fetching writes per-paginated instead of per-fetch - local _php=("/usr/bin/php" "-d" "memory_limit=\"-1\"" "-d" "include_path=\"/usr/local/lib:${_dir}\"") - lib_utils::print_debug "${_php[@]}" + # + # Setup fetch + # - "${_php[@]}" "${_dir}/fetch.php" "$_type" "$_subtype" + local _exec=() + [[ "$global_arg_tor" =~ ^on$|^true$ ]] && _exec+=("proxychains") # Wrap with proxychains + + # Test for Tor plugin + if ! "${_exec[@]}" curl -s "https://check.torproject.org" &>/dev/null; then + lib_utils::die_fatal "Tor plugin not started (or needs restart)" + fi + + # TODO: remove no-limit after internal fetching writes per-paginated instead of per-fetch + _exec+=("/usr/bin/php" "-d" "memory_limit=\"-1\"" "-d" "include_path=\"/usr/local/lib:${_dir}\"") + lib_utils::print_debug "${_exec[@]}" + + # + # Execute fetch + # + + "${_exec[@]}" "${_dir}/fetch.php" "$_type" "$_subtype" IFS="$_ifs" }