Created
September 30, 2021 15:08
-
-
Save Hayao0819/4814b01e5693f4c34188d07d1124f245 to your computer and use it in GitHub Desktop.
archlinux-java fixed shellcheck error
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /bin/bash | |
# Arch Linux helper script to set/unset/check/fix the enabled Java environment | |
# This program may be freely redistributed under the terms of the GNU General Public License | |
# | |
# Author: Guillaume ALAUX <guillaume@archlinux.org> | |
# Yamada Hayao <hayao@fascode.net> | |
JVM_DIR=/usr/lib/jvm | |
DEFAULT_NAME=default | |
DEFAULT_PATH=${JVM_DIR}/${DEFAULT_NAME} | |
DEFAULT_NAME_JRE="default-runtime" | |
DEFAULT_PATH_JRE=${JVM_DIR}/${DEFAULT_NAME_JRE} | |
# Utility functions | |
check_root() { | |
#if [ $(id -u) -ne 0 ]; then | |
if (( UID != 0 )); then | |
echo 'This script must be run as root' | |
exit 1 | |
fi | |
} | |
# $1: parameter count given to this script for this option | |
# $2: expected parameter count for this option | |
check_param_count() { | |
if [[ "${1}" -ne "${2}" ]]; then | |
echo 'Wrong parameter count' | |
exit 2 | |
fi | |
} | |
# Second level functions | |
get_default_java() { | |
path=$(readlink -e ${DEFAULT_PATH}) | |
if [[ "${path}" != "/dev/null" ]]; then | |
echo "${path/${JVM_DIR}\/}" | |
else | |
echo "" | |
fi | |
} | |
get_installed_javas() { | |
if [[ -d "${JVM_DIR}" ]]; then | |
for dir in $(find ${JVM_DIR} -mindepth 1 -maxdepth 1 -type d | sort); do | |
if [ -x "${dir}/bin/java" ]; then | |
javas+=("${dir/${JVM_DIR}\/}") | |
else | |
if [ -x "${dir}/jre/bin/java" ]; then | |
javas+=("${dir/${JVM_DIR}\/}/jre") | |
fi | |
fi | |
done | |
fi | |
echo "${javas[*]}" | |
} | |
# $1: Java environment name to test | |
is_java_valid() { | |
[[ "${1}" != "${DEFAULT_NAME}" ]] && [[ -x "${JVM_DIR}/${1}/bin/java" ]] | |
} | |
# $1: Java environment name to set as default | |
set_default_link_to() { | |
new_default="${1}" | |
unlink "${DEFAULT_PATH}" 2>/dev/null | |
ln -sf "${new_default}" "${DEFAULT_PATH}" | |
unlink "${DEFAULT_PATH_JRE}" 2>/dev/null | |
if [[ -d "${new_default}/jre" ]]; then | |
ln -sf "${new_default}/jre" "${DEFAULT_PATH_JRE}" | |
else | |
ln -sf "${new_default}" "${DEFAULT_PATH_JRE}" | |
fi | |
} | |
unset_default_link() { | |
unlink ${DEFAULT_PATH} 2>/dev/null | |
unlink ${DEFAULT_PATH_JRE} 2>/dev/null | |
} | |
# First level functions | |
do_status() { | |
#installed_java=($(get_installed_javas)) | |
IFS=" " read -r -a installed_java < <(get_installed_javas) | |
if [ ${#installed_java[@]} -eq 0 ]; then | |
echo 'No compatible Java environment installed' | |
else | |
default_java=$(get_default_java) | |
echo 'Available Java environments:' | |
for java in "${installed_java[@]}"; do | |
# We discoverd this Java env but its JRE is actually set as default | |
if [ "${java}/jre" = "${default_java}" ]; then | |
echo -e " ${java} (${java}/jre default)" | |
elif [ "${java}" = "${default_java}" ]; then | |
echo -e " ${java} (default)" | |
else | |
echo " ${java}" | |
fi | |
done | |
if [ -z "${default_java}" ]; then | |
echo "No Java environment set as default" | |
fi | |
fi | |
} | |
do_get() { | |
get_default_java | |
} | |
# $1: Java environment name to set as default | |
do_set() { | |
if ! is_java_valid "${1}"; then | |
echo "'${JVM_DIR}/$1' is not a valid Java environment path" | |
exit 1 | |
fi | |
default=$(get_default_java) | |
if [[ "$1" != "${default}" ]] || ! is_java_valid "${default}"; then | |
unset_default_link | |
set_default_link_to "${1}" | |
fi | |
#parent_dir=$(dirname $1) | |
#if is_java_valid ${parent_dir}; then | |
# echo "Warning: '${parent_dir}' looks like a valid JDK whereas '$1' is set as default" | |
# echo "Fix this with 'archlinux-java set ${parent_dir}'" | |
#fi | |
} | |
# $1: Java environment name to unset | |
do_unset() { | |
unset_default_link | |
} | |
do_fix() { | |
default=$(get_default_java) | |
if is_java_valid "${default}"; then | |
# If its parent is also a valid Java environment | |
if is_java_valid "$(dirname "${default}")"; then | |
unset_default_link | |
set_default_link_to "$(dirname "${default}")" | |
fi | |
else | |
prev=$(readlink ${DEFAULT_PATH}) | |
unset_default_link | |
potential_fixes=("${prev/\/jre}" "${prev}/jre") | |
openjdk8=('java-8-openjdk' 'java-8-openjdk/jre') | |
# List of environments to check by order of preference: | |
# - first potential fixes of user choices, | |
# - then OpenJDK8 as it is considered a default in Arch Linux | |
# - finally, any installed environment | |
IFS=" " read -r -a to_check < <(get_installed_javas) | |
to_check=("${potential_fixes[@]}" "${openjdk8[@]}" "${to_check[@]}") | |
for java in "${to_check[@]}"; do | |
if ! is_java_valid "$(get_default_java)" && is_java_valid "${java}"; then | |
set_default_link_to "${java}" | |
fi | |
done | |
fi | |
if ! is_java_valid "$(get_default_java)"; then | |
echo 'No valid Java environment found' | |
fi | |
} | |
usage() { | |
echo "$(basename "${0}") <COMMAND>" | |
echo -e "\nCOMMAND:" | |
echo -e '\tstatus\t\tList installed Java environments and enabled one' | |
echo -e '\tget\t\tReturn the short name of the Java environment set as default' | |
echo -e '\tset <JAVA_ENV>\tForce <JAVA_ENV> as default' | |
echo -e '\tunset\t\tUnset current default Java environment' | |
echo -e '\tfix\t\tFix an invalid/broken default Java environment configuration' | |
} | |
## Main | |
case "${1}" in | |
'status') do_status;; | |
'get') do_get;; | |
'set') check_root; check_param_count "${#}" 2; do_set "${2}";; | |
'unset') check_root; do_unset;; | |
'fix') check_root; do_fix;; | |
'help' | '--help' | '-h' | '') usage;; | |
*) echo "$(basename "${0}"): unknown option '${*}'"; exit 1;; | |
esac |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment