From 0ea0fe3528373477fff4177b9b1328c084dcaacd Mon Sep 17 00:00:00 2001 From: Ricardo Pardini Date: Tue, 17 Jan 2023 23:48:47 +0100 Subject: [PATCH] armbian-next: `mktemp` and `tmpfs` related utility functions with automatic cleanup handlers --- lib/functions/host/mktemp-utils.sh | 65 ++++++++++++++++++++++++++++++ lib/functions/host/tmpfs-utils.sh | 10 +++++ lib/library-functions.sh | 9 +++++ 3 files changed, 84 insertions(+) create mode 100644 lib/functions/host/mktemp-utils.sh diff --git a/lib/functions/host/mktemp-utils.sh b/lib/functions/host/mktemp-utils.sh new file mode 100644 index 0000000000..c4c84db6cc --- /dev/null +++ b/lib/functions/host/mktemp-utils.sh @@ -0,0 +1,65 @@ +# Those are convenience helpers for creating sub-dirs, for each usage, in WORKDIR. +# They also setup a cleanup trap, and allow early calling of the cleanup handler. +# Usage: +# declare cleanup_id="" temp_dir="" +# prepare_temp_dir_in_workdir_and_schedule_cleanup "NAME_HERE" cleanup_id temp_dir # namerefs +# # ... do stuff with temp_dir ... +# # at the end: +# done_with_temp_dir "${cleanup_id}" +function prepare_temp_dir_in_workdir_and_schedule_cleanup() { + declare temp_dir_id="${1}" # gotta be unique across all concurrent invocations. + declare -n nameref_cleanup_id="${2}" # nameref + declare -n nameref_temp_dir="${3}" # nameref + + # if no WORKDIR set, or not an existing directory, bail with error + if [[ -z "${WORKDIR}" ]] || [[ ! -d "${WORKDIR}" ]]; then + exit_with_error "prepare_temp_dir_in_workdir_and_schedule_cleanup: WORKDIR is not set or not a directory: ${temp_dir_id}" + fi + + nameref_temp_dir="$(mktemp -d)" # subject to TMPDIR/WORKDIR + display_alert "prepare_temp_dir_in_workdir_and_schedule_cleanup: created temp dir" "${nameref_temp_dir}" "cleanup" + + chmod 700 "${nameref_temp_dir}" # does every usage need this? why? + + # add the cleanup handler + declare -a cleanup_params=("${temp_dir_id}" "${nameref_temp_dir}") + nameref_cleanup_id="cleanup_temp_dir_in_workdir ${cleanup_params[*]@Q}" + display_alert "prepare_temp_dir_in_workdir_and_schedule_cleanup: add cleanup handler" "${nameref_cleanup_id}" "cleanup" + add_cleanup_handler "${nameref_cleanup_id}" +} + +function done_with_temp_dir() { + declare cleanup_id="${1}" + # validate + if [[ -z "${cleanup_id}" ]]; then + exit_with_error "done_with_temp_dir: cleanup_id (arg 1) is empty" + fi + + # just de-stack from the trap manager. this will trigger an early cleanup under normal conditions. + # if something fails _before_ this, then the normal trap manager will take care of it. + execute_and_remove_cleanup_handler "${cleanup_id}" +} + +function cleanup_temp_dir_in_workdir() { + declare temp_dir_id="${1}" + declare temp_dir="${2}" + + # if no WORKDIR set, or not an existing directory, bail with error + if [[ -z "${WORKDIR}" ]] || [[ ! -d "${WORKDIR}" ]]; then + display_alert "cleanup_temp_dir_in_workdir" "WORKDIR is not set or not a directory: ${temp_dir_id}" "err" + return 1 + fi + + # if no temp_dir set, or not an existing directory, bail with error + if [[ -z "${temp_dir}" ]] || [[ ! -d "${temp_dir}" ]]; then + exit_with_error "cleanup_temp_dir_in_workdir" "temp_dir is not set or not a directory: ${temp_dir_id}" "err" + return 1 + fi + + # remove the dir if we created it. + cd "${SRC}" || display_alert "cleanup_temp_dir_in_workdir: cd failed" "${SRC}" "err" + display_alert "cleanup_temp_dir_in_workdir: removing dir" "${temp_dir}" "cleanup" + rm -rf "${temp_dir:?}" + + return 0 +} diff --git a/lib/functions/host/tmpfs-utils.sh b/lib/functions/host/tmpfs-utils.sh index 2367559c44..f09b8e69d9 100644 --- a/lib/functions/host/tmpfs-utils.sh +++ b/lib/functions/host/tmpfs-utils.sh @@ -91,3 +91,13 @@ function cleanup_tmpfs_for() { return 0 } + +# Debugging utility. +function debug_tmpfs_show_usage() { + if [[ "${SHOW_TMPFS}" == "yes" ]]; then + display_alert "TMPFS debugging:" "${CURRENT_LOGGING_SECTION:-none} $*" "debug" + run_host_command_logged df -h -t tmpfs "||" true + run_host_command_logged free -m "||" true + fi + return 0 +} diff --git a/lib/library-functions.sh b/lib/library-functions.sh index c97dd62a16..7004fe879b 100644 --- a/lib/library-functions.sh +++ b/lib/library-functions.sh @@ -532,6 +532,15 @@ set -o errexit ## set -e : exit the script if any statement returns a non-true # shellcheck source=lib/functions/host/host-utils.sh source "${SRC}"/lib/functions/host/host-utils.sh +# no errors tolerated. invoked before each sourced file to make sure. +#set -o pipefail # trace ERR through pipes - will be enabled "soon" +#set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled +set -o errtrace # trace ERR through - enabled +set -o errexit ## set -e : exit the script if any statement returns a non-true return value - enabled +### lib/functions/host/mktemp-utils.sh +# shellcheck source=lib/functions/host/mktemp-utils.sh +source "${SRC}"/lib/functions/host/mktemp-utils.sh + # no errors tolerated. invoked before each sourced file to make sure. #set -o pipefail # trace ERR through pipes - will be enabled "soon" #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - one day will be enabled