Преглед изворни кода

feat(core): add new functions for github releases (#3164)

* feat(core): add new functions for github releases

* minor stuff

Co-authored-by: Daniel Gibbs <me@danielgibbs.co.uk>
Christian пре 5 година
родитељ
комит
cd6257445f
3 измењених фајлова са 158 додато и 0 уклоњено
  1. 40 0
      lgsm/functions/core_dl.sh
  2. 5 0
      lgsm/functions/core_functions.sh
  3. 113 0
      lgsm/functions/core_github.sh

+ 40 - 0
lgsm/functions/core_dl.sh

@@ -447,6 +447,46 @@ fn_update_function(){
 
 }
 
+# Function to download latest github release.
+# $1 GitHub user / organisation.
+# $2 Repo name.
+# $3 Destination for download.
+# $4 Search string in releases (needed if there are more files that can be downloaded from the release pages).
+fn_dl_latest_release_github(){
+	local githubreleaseuser="${1}"
+	local githubreleaserepo="${2}"
+	local githubreleasedownloadpath="${3}"
+	local githubreleasesearch="${4}"
+	local githublatestreleaseurl="https://api.github.com/repos/${githubreleaseuser}/${githubreleaserepo}/releases/latest"
+
+	# Get last github release.
+	# If no search for the release filename is set, just get the first file from the latest release.
+	if [ -z "${githubreleasesearch}" ]; then
+		githubreleaseassets=$(curl -s "${githublatestreleaseurl}" | jq '[ .assets[] ]')
+	else
+		githubreleaseassets=$(curl -s "${githublatestreleaseurl}" | jq "[ .assets[]|select(.browser_download_url | contains(\"${githubreleasesearch}\")) ]")
+	fi
+
+	# Check how many releases we got from the api and exit if we have more then one.
+	if [ "$(echo -e "${githubreleaseassets}" | jq '. | length')" -gt 1 ]; then
+		fn_print_fatal_nl "Found more than one release to download - Please report this to the LinuxGSM issue tracker"
+		fn_script_log_fatal "Found more than one release to download - Please report this to the LinuxGSM issue tracker"
+	else
+		# Set variables for download via fn_fetch_file.
+		githubreleasefilename=$(echo -e "${githubreleaseassets}" | jq -r '.[]name')
+		githubreleasedownloadlink=$(echo -e "${githubreleaseassets}" | jq -r '.[]browser_download_url')
+
+		# Error if no version is there.
+		if [ -z "${githubreleasefilename}" ]; then
+			fn_print_fail_nl "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
+			fn_script_log_fatal "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
+		else
+			# Fetch file from the remote location from the existing function to the ${tmpdir} for now.
+			fn_fetch_file "${githubreleasedownloadlink}" "" "${githubreleasefilename}" "" "${githubreleasedownloadpath}" "${githubreleasefilename}"
+		fi
+	fi
+}
+
 # Check that curl is installed
 if [ ! "$(command -v curl 2>/dev/null)" ]; then
 	echo -e "[ FAIL ] Curl is not installed"

+ 5 - 0
lgsm/functions/core_functions.sh

@@ -58,6 +58,11 @@ functionfile="${FUNCNAME[0]}"
 fn_fetch_function
 }
 
+core_github.sh(){
+functionfile="${FUNCNAME[0]}"
+fn_fetch_function
+}
+
 # Commands
 
 command_backup.sh(){

+ 113 - 0
lgsm/functions/core_github.sh

@@ -0,0 +1,113 @@
+#!/bin/bash
+# LinuxGSM core_github.sh function
+# Author: Christian Birk
+# Website: https://linuxgsm.com
+# Description: core function file for updates via github
+
+functionselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
+
+github_api="https://api.github.com"
+
+fn_githublocalversionfile(){
+	local githubreleaseuser="${1}"
+	local githubreleaserepo="${2}"
+
+	githublocalversionfile="${datadir}/github-${githubreleaseuser}-${githubreleaserepo}-version"
+}
+
+# $1 githubuser/group
+# $2 github repo name
+fn_github_get_latest_release_version(){
+	local githubreleaseuser="${1}"
+	local githubreleaserepo="${2}"
+	local githublatestreleaseurl="${github_api}/repos/${githubreleaseuser}/${githubreleaserepo}/releases/latest"
+
+	githubreleaseversion=$(curl -s --connect-timeout 10 "${githublatestreleaseurl}" | jq '.tag_name' )
+
+	# error if no version is there
+	if [ -z "${githubreleaseversion}" ]; then
+		fn_print_fail_nl "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
+		fn_script_log_fatal "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
+	fi
+}
+
+# $1 githubuser/group
+# $2 github repo name
+fn_github_set_latest_release_version(){
+	local githubreleaseuser="${1}"
+	local githubreleaserepo="${2}"
+
+	fn_githublocalversionfile "${githubreleaseuser}" "${githubreleaserepo}"
+
+	local githublatestreleaseurl="${github_api}/repos/${githubreleaseuser}/${githubreleaserepo}/releases/latest"
+	githubreleaseversion=$(curl -s "${githublatestreleaseurl}" | jq -r '.tag_name' )
+
+	# error if no version is there
+	if [ -z "${githubreleaseversion}" ]; then
+		fn_print_fail_nl "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
+		fn_script_log_fatal "Cannot get version from GitHub API for ${githubreleaseuser}/${githubreleaserepo}"
+	else
+		echo "${githubreleaseversion}" > "${githublocalversionfile}"
+	fi
+}
+
+# $1 githubuser/group
+# $2 github repo name
+fn_github_get_installed_version(){
+	local githubreleaseuser="${1}"
+	local githubreleaserepo="${2}"
+
+	fn_githublocalversionfile "${githubreleaseuser}" "${githubreleaserepo}"
+
+	githublocalversion=$(cat "${githublocalversionfile}")
+}
+
+# $1 githubuser/group
+# $2 github repo name
+# if a update needs to be downloaded - updateneeded is set to 1
+fn_github_compare_version(){
+	local githubreleaseuser="${1}"
+	local githubreleaserepo="${2}"
+	exitcode=0
+	updateneeded=0
+
+	fn_githublocalversionfile "${githubreleaseuser}" "${githubreleaserepo}"
+	local githublatestreleaseurl="${github_api}/repos/${githubreleaseuser}/${githubreleaserepo}/releases/latest"
+
+	githublocalversion=$(cat "${githublocalversionfile}")
+	githubreleaseversion=$(curl -s "${githublatestreleaseurl}" | jq '.tag_name' )
+
+	# error if no version is there
+	if [ -z "${githubreleaseversion}" ]; then
+		fn_print_fail_nl "Can not get version from Github Api for ${githubreleaseuser}/${githubreleaserepo}"
+		fn_script_log_fatal "Can not get version from Github Api for ${githubreleaseuser}/${githubreleaserepo}"
+	else
+		if [ "${githublocalversion}" == "${githubreleaseversion}" ]; then
+			echo -en "\n"
+			echo -e "No update from github.com/${githubreleaseuser}/${githubreleaserepo}/ available:"
+			echo -e "* Local build: ${red}${githublocalversion}${default}"
+			echo -e "* Remote build: ${green}${githubreleaseversion}${default}"
+			echo -en "\n"
+		else
+			# check if version that is installed is higher than the remote version to not override it
+			last_version=$(echo -e "${githublocalversion}\n${githubreleaseversion}" | sort -V | head -n1 )
+			if [ "${githubreleaseversion}" == "${last_version}" ]; then
+				echo -en "\n"
+				echo -e "Update from github.com/${githubreleaseuser}/${githubreleaserepo}/ available:"
+				echo -e "* Local build: ${red}${githublocalversion}${default}"
+				echo -e "* Remote build: ${green}${githubreleaseversion}${default}"
+				echo -en "\n"
+				updateneeded=1
+			else
+				# local version is higher than the remote version output this to the user
+				# strange case but could be possible, as a release could be removed from github
+				echo -en "\n"
+				echo -e "Local version is newer than the remote version"
+				echo -e "* Local version: ${green}${githublocalversion}${default}"
+				echo -e "* Remote version: ${green}${githubreleaseversion}${default}"
+				echo -en "\n"
+				exitcode=1
+			fi
+		fi
+	fi
+}