From 2705aa066b152c2583887dc558dd9822506d7362 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 22 Feb 2024 09:21:47 -0500 Subject: bash introspection experiments --- bash/SOURCES.bash | 113 ++++++++++++++++++++++++++++++++++++++++++ bash/bootstrap_SOURCES.bash | 1 + bash/denominate-function.bash | 82 ++++++++++++++++++++++++++++++ 3 files changed, 196 insertions(+) create mode 100644 bash/SOURCES.bash create mode 120000 bash/bootstrap_SOURCES.bash create mode 100644 bash/denominate-function.bash diff --git a/bash/SOURCES.bash b/bash/SOURCES.bash new file mode 100644 index 0000000..a274223 --- /dev/null +++ b/bash/SOURCES.bash @@ -0,0 +1,113 @@ +#!/bin/bash +source() +{ + if [[ $1 != */* ]] && + ( + command -v base64_embedded_source__"$1" || + command -v src/"$1" + ) >&2 # >/dev/null + then + rewrite_self \ + "$1" \ + src/"$1" \ + base64_embedded_source__"$1" \ + "${@:2}" + else + builtin source "$@" + fi +} + +rewrite_self() +{ + # TODO: Check if version in src/ updates this version + # by checking for its hash in a record kept in the source + # file in src/ + if command -v "$3" >/dev/null + then + ( + set +e + sha256sum <("$3") >&2 + sha256sum <(builtin source "$2" "${@:4}" && "$3") >&2 + ) + builtin source \ + <("$3") \ + "${@:4}" + return + fi + [ -f "$2" -a -r "$2" ] || return + declare -n tmpfile=tmpfile${RANDOM} + tmpfile=$(mktemp) || return + if embed "$1" "$2" > "$tmpfile" && + builtin source "$tmpfile" && + command -v "$3" >/dev/null && + builtin source <("$3") "${@:4}" && + [ -w "$0" ] && + sed \ + -i~"$(date -Ins)" \ + -e "1 { r ${tmpfile}"$'\n'" }" \ + "$0" + then + local r=0 + else + local r=$? + fi + rm "$tmpfile" + return $r +} + +embed() +{ + cat <<. +base64_embedded_source__${1}() +{ + base64 -d <<. +$(base64 < "$2" && echo .) +} +. +} + +print_test_script_for_SOURCES.bash() +{ + cat <<. +#!/bin/bash +source SOURCES.bash +source SOURCES.bash +source rpc.bash +: base64_embedded_source__rpc.bash +: base64_embedded_source__dependencies.bash +BASH_RPC_REMOTE_DEST=localhost \\ + remote_run_function \\ + source rpc.bash +. +} + +setup_test_dir() +{ + ( + set -e + mkdir -p test_SOURCES.bash + cd test_SOURCES.bash + mkdir -p src + ln -sf -t src \ + ../../SOURCES.bash \ + ../../src/{rpc,dependencies}.bash + print_test_script_for_SOURCES.bash > test-SOURCES.bash + ) +} + +run_test() +{ + ( + set -ex + cd test_SOURCES.bash + PATH=$PWD/src:$PATH bash test-SOURCES.bash || true + PATH=$PWD/src:$PATH bash test-SOURCES.bash + ) +} + +bootstrap_SOURCES.bash() +{ + setup_test_dir && run_test +} + +[ "$0" = 'bootstrap_SOURCES.bash' ] && bootstrap_SOURCES.bash diff --git a/bash/bootstrap_SOURCES.bash b/bash/bootstrap_SOURCES.bash new file mode 120000 index 0000000..a0054dd --- /dev/null +++ b/bash/bootstrap_SOURCES.bash @@ -0,0 +1 @@ +SOURCES.bash \ No newline at end of file diff --git a/bash/denominate-function.bash b/bash/denominate-function.bash new file mode 100644 index 0000000..9e5cb31 --- /dev/null +++ b/bash/denominate-function.bash @@ -0,0 +1,82 @@ +#!/bin/bash +denominate_function() +{ + declare -n func_name="$1" + local func_output_b64encoded output_hash + read -r -d '' \ + func_output_b64encoded \ + < <(base64) || [ "${func_output_b64encoded}" ] + read output_hash _ \ + < <(base64 -d <<< "$func_output_b64encoded" | sha256sum) + [ ${#output_hash} = 64 ] || return + func_name=SHA256_${output_hash:0:32} + source <(cat <