rbash-upgrade() { local target url tmp rendered backup local host domain color content target="$__RBASH_SCRIPT" url="$(rbash_url "rbashrc")" host="${1:-$RHOSTNAME}" domain="${2:-$RDOMAIN}" color="${3:-$RCOLOR}" echo "Updating $target" tmp="$(mktemp "${TMPDIR:-/tmp}/rbashrc.download.XXXXXX")" || return 1 rendered="$(mktemp "${TMPDIR:-/tmp}/rbashrc.rendered.XXXXXX")" || { rm -f "$tmp" return 1 } if ! rbash_download "$url" > "$tmp"; then echo "rbash: upgrade download failed: $url" >&2 rm -f "$tmp" "$rendered" return 1 fi if [ ! -s "$tmp" ]; then echo "rbash: downloaded rbashrc is empty; refusing to install" >&2 rm -f "$tmp" "$rendered" return 1 fi content="$(cat "$tmp")" content="${content///$host}" content="${content///$domain}" content="${content///$color}" printf '%s\n' "$content" > "$rendered" || { echo "rbash: failed to render new rbashrc" >&2 rm -f "$tmp" "$rendered" return 1 } if ! grep -q 'RBASH_HOME' "$rendered"; then echo "rbash: rendered file does not look like rbashrc; refusing to install" >&2 rm -f "$tmp" "$rendered" return 1 fi if ! bash -n "$rendered"; then echo "rbash: rendered rbashrc has syntax errors; refusing to install" >&2 rm -f "$tmp" "$rendered" return 1 fi backup="$target.bak.$(date +%Y%m%d%H%M%S)" if [ -f "$target" ]; then cp "$target" "$backup" || { echo "rbash: failed to create backup: $backup" >&2 rm -f "$tmp" "$rendered" return 1 } echo "Backup: $backup" fi chmod 700 "$rendered" if ! mv "$rendered" "$target"; then echo "rbash: failed to replace $target" >&2 echo "rbash: backup remains at $backup" >&2 rm -f "$tmp" "$rendered" return 1 fi rm -f "$tmp" rm -rf "$RBASH_CACHE_DIR" mkdir -p "$RBASH_CACHE_DIR" # shellcheck source=/dev/null source "$target" }