gh function into helper.func
This commit is contained in:
		
							parent
							
								
									2622703e8b
								
							
						
					
					
						commit
						403f08fd63
					
				
							
								
								
									
										172
									
								
								misc/helper.func
									
									
									
									
									
								
							
							
						
						
									
										172
									
								
								misc/helper.func
									
									
									
									
									
								
							| @ -206,3 +206,175 @@ function install_mysql() { | |||||||
|     msg_ok "Installed MySQL $MYSQL_VERSION" |     msg_ok "Installed MySQL $MYSQL_VERSION" | ||||||
|   fi |   fi | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | fetch_and_deploy_gh_release() { | ||||||
|  |   local repo="$1" | ||||||
|  |   local app=$(echo ${APPLICATION,,} | tr -d ' ') | ||||||
|  |   local api_url="https://api.github.com/repos/$repo/releases/latest" | ||||||
|  |   local header=() | ||||||
|  |   local attempt=0 | ||||||
|  |   local max_attempts=3 | ||||||
|  |   local api_response tag http_code | ||||||
|  |   local current_version="" | ||||||
|  |   local curl_timeout="--connect-timeout 10 --max-time 30" | ||||||
|  | 
 | ||||||
|  |   # Check if the app directory exists and if there's a version file | ||||||
|  |   if [[ -f "/opt/${app}_version.txt" ]]; then | ||||||
|  |     current_version=$(cat "/opt/${app}_version.txt") | ||||||
|  |     $STD msg_info "Current version: $current_version" | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   # ensure that jq is installed | ||||||
|  |   if ! command -v jq &>/dev/null; then | ||||||
|  |     $STD msg_info "Installing jq..." | ||||||
|  |     apt-get update -qq &>/dev/null | ||||||
|  |     apt-get install -y jq &>/dev/null || { | ||||||
|  |       msg_error "Failed to install jq" | ||||||
|  |       return 1 | ||||||
|  |     } | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   [[ -n "${GITHUB_TOKEN:-}" ]] && header=(-H "Authorization: token $GITHUB_TOKEN") | ||||||
|  | 
 | ||||||
|  |   until [[ $attempt -ge $max_attempts ]]; do | ||||||
|  |     ((attempt++)) || true | ||||||
|  |     $STD msg_info "[$attempt/$max_attempts] Fetching GitHub release for $repo...\n" | ||||||
|  | 
 | ||||||
|  |     api_response=$(curl $curl_timeout -fsSL -w "%{http_code}" -o /tmp/gh_resp.json "${header[@]}" "$api_url") | ||||||
|  |     http_code="${api_response:(-3)}" | ||||||
|  | 
 | ||||||
|  |     if [[ "$http_code" == "404" ]]; then | ||||||
|  |       msg_error "Repository $repo has no Release candidate (404)" | ||||||
|  |       return 1 | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     if [[ "$http_code" != "200" ]]; then | ||||||
|  |       $STD msg_info "Request failed with HTTP $http_code, retrying...\n" | ||||||
|  |       sleep $((attempt * 2)) | ||||||
|  |       continue | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     api_response=$(</tmp/gh_resp.json) | ||||||
|  | 
 | ||||||
|  |     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 $((attempt * 2)) | ||||||
|  |       continue | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     $STD msg_ok "Found release: $tag for $repo" | ||||||
|  |     break | ||||||
|  |   done | ||||||
|  | 
 | ||||||
|  |   if [[ -z "$tag" ]]; then | ||||||
|  |     msg_error "Failed to fetch release for $repo after $max_attempts attempts." | ||||||
|  |     exit 1 | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   # Version comparison (if we already have this version, skip) | ||||||
|  |   if [[ "$current_version" == "$tag" ]]; then | ||||||
|  |     $STD msg_info "Already running the latest version ($tag). Skipping update." | ||||||
|  |     return 0 | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   local version="$tag" | ||||||
|  |   local base_url="https://github.com/$repo/releases/download/v$tag" | ||||||
|  |   local tmpdir | ||||||
|  |   tmpdir=$(mktemp -d) || return 1 | ||||||
|  | 
 | ||||||
|  |   # Extract list of assets from the Release API | ||||||
|  |   local assets urls | ||||||
|  |   assets=$(echo "$api_response" | jq -r '.assets[].browser_download_url') || true | ||||||
|  | 
 | ||||||
|  |   # Detect current architecture | ||||||
|  |   local arch | ||||||
|  |   if command -v dpkg &>/dev/null; then | ||||||
|  |     arch=$(dpkg --print-architecture) | ||||||
|  |   elif command -v uname &>/dev/null; then | ||||||
|  |     case "$(uname -m)" in | ||||||
|  |     x86_64) arch="amd64" ;; | ||||||
|  |     aarch64) arch="arm64" ;; | ||||||
|  |     armv7l) arch="armv7" ;; | ||||||
|  |     armv6l) arch="armv6" ;; | ||||||
|  |     *) arch="unknown" ;; | ||||||
|  |     esac | ||||||
|  |   else | ||||||
|  |     arch="unknown" | ||||||
|  |   fi | ||||||
|  |   $STD msg_info "Detected system architecture: $arch" | ||||||
|  | 
 | ||||||
|  |   # Try to find a matching asset for our architecture | ||||||
|  |   local url="" | ||||||
|  |   for u in $assets; do | ||||||
|  |     if [[ "$u" =~ $arch.*\.tar\.gz$ ]]; then | ||||||
|  |       url="$u" | ||||||
|  |       $STD msg_info "Found matching architecture asset: $url" | ||||||
|  |       break | ||||||
|  |     fi | ||||||
|  |   done | ||||||
|  | 
 | ||||||
|  |   # Fallback to other architectures if our specific one isn't found | ||||||
|  |   if [[ -z "$url" ]]; then | ||||||
|  |     for u in $assets; do | ||||||
|  |       if [[ "$u" =~ (x86_64|amd64|arm64|armv7|armv6).*\.tar\.gz$ ]]; then | ||||||
|  |         url="$u" | ||||||
|  |         $STD msg_info "Architecture-specific asset not found, using: $url" | ||||||
|  |         break | ||||||
|  |       fi | ||||||
|  |     done | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   # Fallback to any tar.gz | ||||||
|  |   if [[ -z "$url" ]]; then | ||||||
|  |     for u in $assets; do | ||||||
|  |       if [[ "$u" =~ \.tar\.gz$ ]]; then | ||||||
|  |         url="$u" | ||||||
|  |         $STD msg_info "Using generic tarball: $url" | ||||||
|  |         break | ||||||
|  |       fi | ||||||
|  |     done | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   # Final fallback to GitHub source tarball | ||||||
|  |   if [[ -z "$url" ]]; then | ||||||
|  |     url="https://github.com/$repo/archive/refs/tags/$version.tar.gz" | ||||||
|  |     $STD msg_info "Trying GitHub source tarball fallback: $url" | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   local filename="${url##*/}" | ||||||
|  |   $STD msg_info "Downloading $url" | ||||||
|  | 
 | ||||||
|  |   if ! curl $curl_timeout -fsSL -o "$tmpdir/$filename" "$url"; then | ||||||
|  |     msg_error "Failed to download release asset from $url" | ||||||
|  |     rm -rf "$tmpdir" | ||||||
|  |     return 1 | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   mkdir -p "/opt/$app" | ||||||
|  | 
 | ||||||
|  |   tar -xzf "$tmpdir/$filename" -C "$tmpdir" | ||||||
|  |   local content_root | ||||||
|  |   content_root=$(find "$tmpdir" -mindepth 1 -maxdepth 1 -type d) | ||||||
|  |   if [[ $(echo "$content_root" | wc -l) -eq 1 ]]; then | ||||||
|  |     cp -r "$content_root"/* "/opt/$app/" | ||||||
|  |   else | ||||||
|  |     cp -r "$tmpdir"/* "/opt/$app/" | ||||||
|  |   fi | ||||||
|  | 
 | ||||||
|  |   echo "$version" >"/opt/${app}_version.txt" | ||||||
|  |   $STD msg_ok "Deployed $app v$version to /opt/$app" | ||||||
|  |   rm -rf "$tmpdir" | ||||||
|  | } | ||||||
|  | |||||||
| @ -276,174 +276,3 @@ EOF | |||||||
|   fi |   fi | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fetch_and_deploy_gh_release() { |  | ||||||
|   local repo="$1" |  | ||||||
|   local app=$(echo ${APPLICATION,,} | tr -d ' ') |  | ||||||
|   local api_url="https://api.github.com/repos/$repo/releases/latest" |  | ||||||
|   local header=() |  | ||||||
|   local attempt=0 |  | ||||||
|   local max_attempts=3 |  | ||||||
|   local api_response tag http_code |  | ||||||
|   local current_version="" |  | ||||||
|   local curl_timeout="--connect-timeout 10 --max-time 30" |  | ||||||
| 
 |  | ||||||
|   # Check if the app directory exists and if there's a version file |  | ||||||
|   if [[ -f "/opt/${app}_version.txt" ]]; then |  | ||||||
|     current_version=$(cat "/opt/${app}_version.txt") |  | ||||||
|     $STD msg_info "Current version: $current_version" |  | ||||||
|   fi |  | ||||||
| 
 |  | ||||||
|   # ensure that jq is installed |  | ||||||
|   if ! command -v jq &>/dev/null; then |  | ||||||
|     $STD msg_info "Installing jq..." |  | ||||||
|     apt-get update -qq &>/dev/null |  | ||||||
|     apt-get install -y jq &>/dev/null || { |  | ||||||
|       msg_error "Failed to install jq" |  | ||||||
|       return 1 |  | ||||||
|     } |  | ||||||
|   fi |  | ||||||
| 
 |  | ||||||
|   [[ -n "${GITHUB_TOKEN:-}" ]] && header=(-H "Authorization: token $GITHUB_TOKEN") |  | ||||||
| 
 |  | ||||||
|   until [[ $attempt -ge $max_attempts ]]; do |  | ||||||
|     ((attempt++)) || true |  | ||||||
|     $STD msg_info "[$attempt/$max_attempts] Fetching GitHub release for $repo...\n" |  | ||||||
| 
 |  | ||||||
|     api_response=$(curl $curl_timeout -fsSL -w "%{http_code}" -o /tmp/gh_resp.json "${header[@]}" "$api_url") |  | ||||||
|     http_code="${api_response:(-3)}" |  | ||||||
| 
 |  | ||||||
|     if [[ "$http_code" == "404" ]]; then |  | ||||||
|       msg_error "Repository $repo has no Release candidate (404)" |  | ||||||
|       return 1 |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     if [[ "$http_code" != "200" ]]; then |  | ||||||
|       $STD msg_info "Request failed with HTTP $http_code, retrying...\n" |  | ||||||
|       sleep $((attempt * 2)) |  | ||||||
|       continue |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     api_response=$(</tmp/gh_resp.json) |  | ||||||
| 
 |  | ||||||
|     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 $((attempt * 2)) |  | ||||||
|       continue |  | ||||||
|     fi |  | ||||||
| 
 |  | ||||||
|     $STD msg_ok "Found release: $tag for $repo" |  | ||||||
|     break |  | ||||||
|   done |  | ||||||
| 
 |  | ||||||
|   if [[ -z "$tag" ]]; then |  | ||||||
|     msg_error "Failed to fetch release for $repo after $max_attempts attempts." |  | ||||||
|     exit 1 |  | ||||||
|   fi |  | ||||||
| 
 |  | ||||||
|   # Version comparison (if we already have this version, skip) |  | ||||||
|   if [[ "$current_version" == "$tag" ]]; then |  | ||||||
|     $STD msg_info "Already running the latest version ($tag). Skipping update." |  | ||||||
|     return 0 |  | ||||||
|   fi |  | ||||||
| 
 |  | ||||||
|   local version="$tag" |  | ||||||
|   local base_url="https://github.com/$repo/releases/download/v$tag" |  | ||||||
|   local tmpdir |  | ||||||
|   tmpdir=$(mktemp -d) || return 1 |  | ||||||
| 
 |  | ||||||
|   # Extract list of assets from the Release API |  | ||||||
|   local assets urls |  | ||||||
|   assets=$(echo "$api_response" | jq -r '.assets[].browser_download_url') || true |  | ||||||
| 
 |  | ||||||
|   # Detect current architecture |  | ||||||
|   local arch |  | ||||||
|   if command -v dpkg &>/dev/null; then |  | ||||||
|     arch=$(dpkg --print-architecture) |  | ||||||
|   elif command -v uname &>/dev/null; then |  | ||||||
|     case "$(uname -m)" in |  | ||||||
|     x86_64) arch="amd64" ;; |  | ||||||
|     aarch64) arch="arm64" ;; |  | ||||||
|     armv7l) arch="armv7" ;; |  | ||||||
|     armv6l) arch="armv6" ;; |  | ||||||
|     *) arch="unknown" ;; |  | ||||||
|     esac |  | ||||||
|   else |  | ||||||
|     arch="unknown" |  | ||||||
|   fi |  | ||||||
|   $STD msg_info "Detected system architecture: $arch" |  | ||||||
| 
 |  | ||||||
|   # Try to find a matching asset for our architecture |  | ||||||
|   local url="" |  | ||||||
|   for u in $assets; do |  | ||||||
|     if [[ "$u" =~ $arch.*\.tar\.gz$ ]]; then |  | ||||||
|       url="$u" |  | ||||||
|       $STD msg_info "Found matching architecture asset: $url" |  | ||||||
|       break |  | ||||||
|     fi |  | ||||||
|   done |  | ||||||
| 
 |  | ||||||
|   # Fallback to other architectures if our specific one isn't found |  | ||||||
|   if [[ -z "$url" ]]; then |  | ||||||
|     for u in $assets; do |  | ||||||
|       if [[ "$u" =~ (x86_64|amd64|arm64|armv7|armv6).*\.tar\.gz$ ]]; then |  | ||||||
|         url="$u" |  | ||||||
|         $STD msg_info "Architecture-specific asset not found, using: $url" |  | ||||||
|         break |  | ||||||
|       fi |  | ||||||
|     done |  | ||||||
|   fi |  | ||||||
| 
 |  | ||||||
|   # Fallback to any tar.gz |  | ||||||
|   if [[ -z "$url" ]]; then |  | ||||||
|     for u in $assets; do |  | ||||||
|       if [[ "$u" =~ \.tar\.gz$ ]]; then |  | ||||||
|         url="$u" |  | ||||||
|         $STD msg_info "Using generic tarball: $url" |  | ||||||
|         break |  | ||||||
|       fi |  | ||||||
|     done |  | ||||||
|   fi |  | ||||||
| 
 |  | ||||||
|   # Final fallback to GitHub source tarball |  | ||||||
|   if [[ -z "$url" ]]; then |  | ||||||
|     url="https://github.com/$repo/archive/refs/tags/$version.tar.gz" |  | ||||||
|     $STD msg_info "Trying GitHub source tarball fallback: $url" |  | ||||||
|   fi |  | ||||||
| 
 |  | ||||||
|   local filename="${url##*/}" |  | ||||||
|   $STD msg_info "Downloading $url" |  | ||||||
| 
 |  | ||||||
|   if ! curl $curl_timeout -fsSL -o "$tmpdir/$filename" "$url"; then |  | ||||||
|     msg_error "Failed to download release asset from $url" |  | ||||||
|     rm -rf "$tmpdir" |  | ||||||
|     return 1 |  | ||||||
|   fi |  | ||||||
| 
 |  | ||||||
|   mkdir -p "/opt/$app" |  | ||||||
| 
 |  | ||||||
|   tar -xzf "$tmpdir/$filename" -C "$tmpdir" |  | ||||||
|   local content_root |  | ||||||
|   content_root=$(find "$tmpdir" -mindepth 1 -maxdepth 1 -type d) |  | ||||||
|   if [[ $(echo "$content_root" | wc -l) -eq 1 ]]; then |  | ||||||
|     cp -r "$content_root"/* "/opt/$app/" |  | ||||||
|   else |  | ||||||
|     cp -r "$tmpdir"/* "/opt/$app/" |  | ||||||
|   fi |  | ||||||
| 
 |  | ||||||
|   echo "$version" >"/opt/${app}_version.txt" |  | ||||||
|   $STD msg_ok "Deployed $app v$version to /opt/$app" |  | ||||||
|   rm -rf "$tmpdir" |  | ||||||
| } |  | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 CanbiZ
						CanbiZ