diff --git a/bin/.inc/common b/bin/.inc/common
index e2281b9..a37dd18 100644
--- a/bin/.inc/common
+++ b/bin/.inc/common
@@ -16,3 +16,55 @@ needs_commands() { # $status $cmd1 $cmd2 ...
fi
done
}
+
+download_gui() { # $uri $file $sha256
+ needs_commands "curl" "zenity" "sha256sum" || return 1
+ echo "Downloading '${1}' to '${2}'"
+
+ curl --show-error --fail --location \
+ --output "${2}" \
+ "${1}" &
+ _dg_curlpid=$!
+
+ yes | zenity \
+ --progress --pulsate --auto-close \
+ --title="Downloading" \
+ --text="Downloading '${2}' ..." &
+ _dg_zenpid=$!
+
+ while kill -0 "${_dg_curlpid}" 2>/dev/null; do
+ if ! kill -0 "${_dg_zenpid}" 2>/dev/null; then
+ # progress bar died; ask for abort
+ if zenity \
+ --question \
+ --text="Abort Download?"; then
+ kill "${_dg_curlpid}" 2>/dev/null || true
+ echo "Download cancelled!" >&2
+ break
+ fi
+
+ # restart progress bar
+ yes | zenity \
+ --progress --pulsate --auto-close \
+ --title="Downloading" \
+ --text="Downloading '${2}' ..." &
+ _dg_zenpid=$!
+ fi
+
+ sleep 0.2
+ done
+
+ kill "${_dg_zenpid}" 2>/dev/null || true
+ wait "${_dg_curlpid}"
+
+ if [ -z "${3}" ]; then
+ echo "No SHA256 (OK)!" >&2
+ return 0
+ elif [ "$( sha256sum "${2}" | cut -d' ' -f1 )" = "${3}" ]; then
+ echo "SHA256 ${3} OK!" >&2
+ return 0
+ else
+ echo "SHA256 ${3} mismatch!" >&2
+ return 1
+ fi
+}
diff --git a/bin/citrix-update b/bin/citrix-update
index dc39bdd..e2c1d38 100755
--- a/bin/citrix-update
+++ b/bin/citrix-update
@@ -4,27 +4,16 @@
# summary: Startup script: Downloads and installs "Citrix Workspace"
# params: none
+THISDIR="$(dirname "$(readlink -f "${0}")")"
+# shellcheck disable=SC1091
+. "${THISDIR}/.inc/common"
+
########
# INIT #
########
# find all download links on update page
# find corresponding checksums
-has_command() { # $command
- command -v "$1" &>/dev/null
-}
-
-needs_commands() { # $cmd1 $cmd2 ...
- local cmd
- for cmd in "${@}"; do
- if ! has_command "${cmd}"; then
- echo "Command '${cmd}' not available!" >&2
- return 1
- fi
- done
- return 0
-}
-
needs_commands "xidel" "curl" || exit 1
echo -n "Downloading citrix update page ... " >&2
@@ -42,33 +31,33 @@ echo "OK!" >&2
# parse using XPath
declare -a links csums
eval "$( \
- echo "${html_data}" | xidel - \
- --silent \
- --output-format bash \
- --extract "links:=//div[contains(@class, 'ctx-dl-content')]//a[contains(@class, 'ctx-dl-link') and @rel]/@rel" \
- --extract "csums:=//div[contains(@class, 'ctx-dl-content')]//ul[contains(@class, 'ctx-checksum-list')]/li[1]/text()" \
+ echo "${html_data}" | xidel - \
+ --silent \
+ --output-format bash \
+ --extract "links:=//div[contains(@class, 'ctx-dl-content')]//a[contains(@class, 'ctx-dl-link') and @rel]/@rel" \
+ --extract "csums:=//div[contains(@class, 'ctx-dl-content')]//ul[contains(@class, 'ctx-checksum-list')]/li[1]/text()" \
)"
# ensure every link has a checksum
if [[ "${!links[*]}" != "${!csums[*]}" ]]; then
- echo "Links and Checksums don't match up!" >&2
- exit 1
+ echo "Links and Checksums don't match up!" >&2
+ exit 1
fi
# postprocess data
declare -A citrix_data
for key in "${!links[@]}"; do
- link="${links["${key}"]}"
+ link="${links["${key}"]}"
- # if link starts with "//" (no protocol), assume https
- if [[ "${link}" == "//"* ]]; then
- link="https:${link}"
- fi
+ # if link starts with "//" (no protocol), assume https
+ if [[ "${link}" == "//"* ]]; then
+ link="https:${link}"
+ fi
- # extract checksum only (64 hex digits)
- csum="$(echo "${csums["${key}"]}" | grep -Eo "\<[[:xdigit:]]{64}\>")"
+ # extract checksum only (64 hex digits)
+ csum="$(echo "${csums["${key}"]}" | grep -Eo "\<[[:xdigit:]]{64}\>")"
- citrix_data["${csum}"]="${link}"
+ citrix_data["${csum}"]="${link}"
done
# remove intermediate containers
@@ -78,181 +67,135 @@ unset links csums
# FUNCS #
#########
-find_link() { # $filename_regex
- local link_regex="://downloads\.citrix\.com/[[:digit:]]+/${1}\?__gda__=exp=[[:digit:]]+~acl=[^~]+~hmac=[[:digit:]a-f]{64}$"
+find_links() { # $filename_regex
+ local link_regex="://downloads\.citrix\.com/[[:digit:]]+/${1}\?__gda__=exp=[[:digit:]]+~acl=[^~]+~hmac=[[:digit:]a-f]{64}$"
- for key in "${!citrix_data[@]}"; do
- if echo "${citrix_data["${key}"]}" | grep -E "${link_regex}" &>/dev/null; then
- echo "${key} ${citrix_data["${key}"]}"
- fi
- done
+ for key in "${!citrix_data[@]}"; do
+ if echo "${citrix_data["${key}"]}" | grep -E "${link_regex}" &>/dev/null; then
+ echo "${key} ${citrix_data["${key}"]}"
+ fi
+ done
}
-find_link_deb() { # $name $arch
- case "${2}" in
- x86_64) local arch="amd64" ;;
- arm64) local arch="arm64" ;;
- *) local arch="${2}" ;;
- esac
+find_links_deb() { # $name $arch
+ case "${2}" in
+ x86_64) local arch="amd64" ;;
+ arm64) local arch="arm64" ;;
+ *) local arch="${2}" ;;
+ esac
- find_link "${1}_[[:digit:]\.]+_${arch}\.deb"
+ find_links "${1}_[[:digit:]\.]+_${arch}\.deb"
}
-find_link_rpm() { # $name $flavor $arch
- find_link "${1}(:?-${2})?-[[:digit:]\.]+(:?-[[:digit:]]+)?.${3}\.rpm"
+find_links_rpm() { # $name $flavor $arch
+ find_links "${1}(:?-${2})?-[[:digit:]\.]+(:?-[[:digit:]]+)?.${3}\.rpm"
}
-find_link_targz() { # $arch
- case "${1}" in
- x86_64) local arch="x64" ;;
- arm64) local arch="arm64" ;;
- *) local arch="${1}" ;;
- esac
+find_links_targz() { # $arch
+ case "${1}" in
+ x86_64) local arch="x64" ;;
+ arm64) local arch="arm64" ;;
+ *) local arch="${1}" ;;
+ esac
- find_link "linux${arch}-[[:digit:]\.]+\.tar.gz"
+ find_links "linux${arch}-[[:digit:]\.]+\.tar.gz"
}
# shellcheck disable=SC2155
-list_all() {
- local debs="$(find_link_deb "[[:lower:]]+" "[[:alnum:]]+")"
- local debc="$(echo "${debs}" | wc -l)"
- echo "deb:"
- echo "${debs}"
+list_all_links() {
+ local debs="$(find_links_deb "[[:lower:]]+" "[[:alnum:]]+")"
+ local debc="$(echo "${debs}" | wc -l)"
+ echo "deb:"
+ echo "${debs}"
- local rpms="$(find_link_rpm "[[:alpha:]]+" "[[:lower:]]+" "[[:alnum:]_]+")"
- local rpmc="$(echo "${rpms}" | wc -l)"
- echo "rpm:"
- echo "${rpms}"
+ local rpms="$(find_links_rpm "[[:alpha:]]+" "[[:lower:]]+" "[[:alnum:]_]+")"
+ local rpmc="$(echo "${rpms}" | wc -l)"
+ echo "rpm:"
+ echo "${rpms}"
- local tars="$(find_link_targz "[[:alnum:]]+")"
- local tarc="$(echo "${tars}" | wc -l)"
- echo "tar.gz:"
- echo "${tars}"
+ local tars="$(find_links_targz "[[:alnum:]]+")"
+ local tarc="$(echo "${tars}" | wc -l)"
+ echo "tar.gz:"
+ echo "${tars}"
- local anys="$(find_link "[[:alnum:]\._-]+")"
- local anyc="$(echo "${anys}" | wc -l)"
- echo "any:"
- echo "${anys}"
+ local anys="$(find_links "[[:alnum:]\._-]+")"
+ local anyc="$(echo "${anys}" | wc -l)"
+ echo "any:"
+ echo "${anys}"
- if [ $(( debc + rpmc + tarc )) -ne $(( anyc )) ]; then
- echo "Not all links matched!" >&2
- exit 1
- fi
-}
-
-download_gui() { # $link $csum $destfile
- needs_commands "curl" "zenity" "sha256sum" || return 1
- echo "Downloading '${1}' to '${3}'"
-
- curl -fL -o "${3}" "${1}" &
- local curlpid=$!
-
- yes | zenity \
- --progress --pulsate --auto-close \
- --title="Downloading" \
- --text="Downloading '${3}' ..." &
- local zenpid=$!
-
- while kill -0 "${curlpid}" 2>/dev/null; do
- if ! kill -0 "${zenpid}" 2>/dev/null; then
- # progress bar died; ask for abort
- if zenity \
- --question \
- --text="Abort Download?"; then
- kill "${curlpid}" 2>/dev/null || true
- echo "Download cancelled!" >&2
- break
- fi
-
- # restart progress bar
- yes | zenity \
- --progress --pulsate --auto-close \
- --title="Downloading" \
- --text="Downloading '${3}' ..." &
- zenpid=$!
+ if [ $(( debc + rpmc + tarc )) -ne $(( anyc )) ]; then
+ echo "Not all links matched!" >&2
+ exit 1
fi
-
- sleep 0.2
- done
-
- kill "${zenpid}" 2>/dev/null || true
- wait "${curlpid}"
-
- if [ "$( sha256sum "${3}" | cut -d' ' -f1 )" = "${2}" ]; then
- echo "SHA256 ${2} OK!" >&2
- return 0
- else
- echo "SHA256 ${2} mismatch!" >&2
- return 1
- fi
}
install_deb() { # $name
- needs_commands "dpkg-query" "zenity" "gdebi-gtk" || return 1
+ needs_commands "dpkg-query" "zenity" "notify-send" "gdebi-gtk" || return 1
- local arch
- arch="$(uname -m)"
- echo "Trying to install ${1} DEB for ${arch}" >&2
+ local arch
+ arch="$(uname -m)"
+ echo "Trying to install ${1} DEB for ${arch}" >&2
- local link
- if ! link="$(find_link_deb "${1}" "${arch}")"; then
- echo "No DEB found!" >&2
- return 1
- elif [ "$(echo "${link}" | wc -l)" -ne 1 ]; then
- echo "More than one DEB found!" >&2
- return 1
- fi
+ local link
+ if ! link="$(find_links_deb "${1}" "${arch}")"; then
+ echo "No DEB found!" >&2
+ return 1
+ elif [ "$(echo "${link}" | wc -l)" -ne 1 ]; then
+ echo "More than one DEB found!" >&2
+ return 1
+ fi
- local csum
- csum="$(echo "${link}" | cut -d' ' -f1)"
- link="$(echo "${link}" | cut -d' ' -f2)"
+ local csum
+ csum="$(echo "${link}" | cut -d' ' -f1)"
+ link="$(echo "${link}" | cut -d' ' -f2)"
- local version_available
- version_available="$(echo "${link}" | sed -r 's/^.*\/[^_]+_([[:digit:]\.]+)_[^\.]+\.deb.*$/\1/')"
+ local version_available
+ version_available="$(echo "${link}" | sed -r 's/^.*\/[^_]+_([[:digit:]\.]+)_[^\.]+\.deb.*$/\1/')"
- local version_installed
- if version_installed="$(dpkg-query --show --showformat='${Version}\n' "${1}")" \
- && [ "${version_available}" = "${version_installed}" ]; then
- echo "Newest version already installed!" >&2
- zenity \
- --notification \
- --window-icon="info" \
- --text="Citrix \"${1}\": Newest version is installed!"
- sleep 2
+ local version_installed
+ if version_installed="$(dpkg-query --show --showformat='${Version}\n' "${1}")" \
+ && [ "${version_available}" = "${version_installed}" ]; then
+ echo "Newest version already installed!" >&2
+ notify-send \
+ --app-name "citrix-update" \
+ --icon "info" \
+ "Citrix Update" \
+ "Citrix \"${1}\": Newest version is installed!"
+ sleep 2
+ return 0
+ fi
+
+ if ! zenity \
+ --question \
+ --title="New Version Available" \
+ --text="Citrix Upgrade Available!\n\nInstall ${1} version ${version_available} now?"; then
+ echo "Installation of ${1} cancelled!" >&2
+ return 0
+ fi
+
+ local destfile
+ destfile="$(mktemp --tmpdir "XXXXX_${1}_${version_available}.deb")"
+
+ if download_gui "${link}" "${destfile}" "${csum}"; then
+ echo "Download for ${1} successful!" >&2
+ gdebi-gtk "${destfile}"
+ fi
+
+ rm -f "${destfile}"
+ echo "Cleaned up '${destfile}'" >&2
return 0
- fi
-
- if ! zenity \
- --question \
- --title="New Version Available" \
- --text="Citrix Upgrade Available!\n\nInstall ${1} version ${version_available} now?"; then
- echo "Installation of ${1} cancelled!" >&2
- return 0
- fi
-
- local destfile
- destfile="$(mktemp --tmpdir "XXXXX_${1}_${version_available}.deb")"
-
- if download_gui "${link}" "${csum}" "${destfile}"; then
- echo "Download for ${1} successful!" >&2
- gdebi-gtk "${destfile}"
- fi
-
- rm -f "${destfile}"
- echo "Cleaned up '${destfile}'" >&2
- return 0
}
########
# MAIN #
########
-list_all > /dev/null
+list_all_links > /dev/null
if has_command "apt"; then
- install_deb "icaclient" || exit 1
- install_deb "ctxusb" || exit 1
+ install_deb "icaclient" || exit 1
+ install_deb "ctxusb" || exit 1
fi
exit 0
diff --git a/bin/nextcloud-appimage-launch b/bin/nextcloud-appimage-launch
index 4e7c595..559937d 100755
--- a/bin/nextcloud-appimage-launch
+++ b/bin/nextcloud-appimage-launch
@@ -14,7 +14,7 @@ needs_commands "curl" "notify-send"
version_available="$( \
curl --silent --verbose --retry-all-errors --retry-delay 3 --retry 5 \
- 'https://github.com/nextcloud-releases/desktop/releases/latest' 2>&1 \
+ 'https://github.com/nextcloud-releases/desktop/releases/latest' 2>&1 \
| grep '^< location: ' \
| grep -Eo '[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+' \
| head -n1 \
@@ -33,17 +33,18 @@ version_installed="$( \
if [ "${version_available}" != "${version_installed}" ]; then
echo "new nextcloud version available: ${version_available}" >&2
notify-send \
- --app-name "Nextcloud" \
- --icon "${THISDIR}/.icon/nextcloud.svg" \
- "nextcloud-appimage-launch" \
- "new nextcloud version available: ${version_available}"
+ --app-name "nextcloud-appimage-launch" \
+ --icon "${THISDIR}/.icon/nextcloud.svg" \
+ "Nextcloud" \
+ "Installing new Nextcloud version: ${version_available}"
- curl --silent --show-error --fail --location \
- "https://github.com/nextcloud-releases/desktop/releases/download/v${version_available}/Nextcloud-${version_available}-x86_64.AppImage" \
- --output "${INSTALL_DIR}/Nextcloud-${version_available}-x86_64.AppImage"
-
- chmod +x "${INSTALL_DIR}/Nextcloud-${version_available}-x86_64.AppImage"
- ln -sf "./Nextcloud-${version_available}-x86_64.AppImage" "${INSTALL_DIR}/current"
+ if download_gui \
+ "https://github.com/nextcloud-releases/desktop/releases/download/v${version_available}/Nextcloud-${version_available}-x86_64.AppImage" \
+ "${INSTALL_DIR}/Nextcloud-${version_available}-x86_64.AppImage" \
+ ""; then # no sha256
+ chmod +x "${INSTALL_DIR}/Nextcloud-${version_available}-x86_64.AppImage"
+ ln -sf "./Nextcloud-${version_available}-x86_64.AppImage" "${INSTALL_DIR}/current"
+ fi
fi
exec "${INSTALL_DIR}/current" --background "${@}"