#source <(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVED/main/misc/build.func) get_gh_release() { local repo="$1" local app="${repo##*/}" local api_url="https://api.github.com/repos/$repo/releases/latest" local header=() local attempt=0 local max_attempts=3 local api_response tag echo "šŸ” Checking latest release for: $repo" [[ -n "${GITHUB_TOKEN:-}" ]] && header=(-H "Authorization: token $GITHUB_TOKEN") until [[ $attempt -ge $max_attempts ]]; do ((attempt++)) $STD msg_info "[$attempt/$max_attempts] Fetching GitHub release for $repo...\n" if ! api_response=$(curl -fsSL "${header[@]}" "$api_url"); then $STD msg_info "Request failed, retrying...\n" sleep 2 continue fi if echo "$api_response" | grep -q "API rate limit exceeded"; then msg_error "GitHub API rate limit exceeded." return 1 fi if echo "$api_response" | jq -e '.message == "Not Found"' &>/dev/null; then msg_error "Repository not found: $repo" return 1 fi tag=$(echo "$api_response" | jq -r '.tag_name // .name // empty') [[ "$tag" =~ ^v[0-9] ]] && tag="${tag:1}" if [[ -z "$tag" ]]; then $STD msg_info "Empty tag received, retrying...\n" sleep 2 continue fi $STD msg_ok "Found release: $tag for $repo" echo "$tag" return 0 done msg_error "Failed to fetch release for $repo after $max_attempts attempts." return 1 } fetch_and_extract_gh_release() { set -Eeuo pipefail trap 'echo -e "\nāŒ [fetch_and_extract_gh_release] Error on line $LINENO: $BASH_COMMAND"' ERR local repo="$1" local tag="$2" local app="${repo##*/}" local temp_file temp_file=$(mktemp) local tarball_url="https://github.com/$repo/archive/refs/tags/v$tag.tar.gz" msg_info "Downloading tarball for $app from $tarball_url..." if ! curl -fsSL "$tarball_url" -o "$temp_file"; then msg_error "Failed to download tarball: $tarball_url" return 1 fi mkdir -p "/opt/$app" echo "šŸ“¦ Extracting tarball to /opt/$app..." tar -xzf "$temp_file" -C /opt mv "/opt/${app}-${tag}"/* "/opt/$app/" 2>/dev/null || msg_warn "Could not move extracted files." rm -rf "/opt/${app}-${tag}" msg_ok "Extracted $app to /opt/$app" }