# -*-eselect-*- vim: ft=eselect # Copyright 1999-2017 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 DESCRIPTION="Manage the Java system and user VM" MAINTAINER="java@gentoo.org" VERSION="@VERSION@" VM_BASE="${EROOT}/usr/lib/jvm/" VM_SYSTEM="${EROOT}/etc/java-config-2/current-system-vm" VM_USER="${HOME}/.gentoo${EPREFIX}/java-config-2/current-user-vm" VM_CONFIG="${EROOT}/usr/share/java-config-2/vm" find_targets() { local TARGETS=() target for target in "${VM_BASE}"/*; do [[ -L "${target}" ]] && TARGETS+=( ${target##*/} ) done printf "%s\n" "${TARGETS[@]}" | sort -uV } sym_to_vm() { basename $(readlink "${1}") } ### show action ### describe_show() { echo "Show the current vm" } do_show() { if [[ ${1} == "system" ]]; then my_show "${VM_SYSTEM}" 'system-vm' elif [[ ${1} == "user" ]]; then my_show "${VM_USER}" 'user-vm' else my_show "${VM_SYSTEM}" 'system-vm' my_show "${VM_USER}" 'user-vm' fi } my_show() { local symlink=${1} vm_type=${2} write_list_start "Current ${vm_type}" if [[ -L "${symlink}" ]] ; then write_kv_list_entry "$(sym_to_vm ${symlink})" "" else write_kv_list_entry "(unset)" "" fi } ### list action ### describe_list() { echo "List Available Virtual Machines" } do_list() { targets=( $(find_targets) ) write_list_start "Available Java Virtual Machines:" local found_build_only if [[ -n ${targets[@]} ]] ; then local i system_name user_name [[ -L ${VM_SYSTEM} ]] && system_name=$(sym_to_vm "${VM_SYSTEM}") [[ -L ${VM_USER} ]] && user_name=$(sym_to_vm "${VM_USER}") for (( i = 0 ; i < ${#targets[@]} ; i = i + 1 )) ; do local build_only=$(grep 'BUILD_ONLY' "${VM_CONFIG}/${targets[${i}]}" | cut -c 13-16 ) local mark="" if [[ "${build_only}" == "TRUE" || "{build_only}" == "true" ]]; then mark="$(highlight_warning 'Build Only')" found_build_only="TRUE" fi if [[ ${targets[${i}]} == ${system_name} ]]; then mark="${mark} $(highlight 'system-vm')" fi if [[ ${targets[${i}]} == ${user_name} ]]; then mark="${mark} $(highlight 'user-vm' )" fi targets[${i}]="${targets[${i}]} ${mark}" done write_numbered_list "${targets[@]}" else write_kv_list_entry "(none found)" "" fi echo if [[ "${found_build_only}" == "TRUE" ]]; then write_warning_msg "VMs marked as Build Only may contain Security Vulnerabilities and/or be EOL." write_warning_msg "Gentoo recommends not setting these VMs as either your System or User VM." write_warning_msg "Please see https://wiki.gentoo.org/wiki/Java#Build_Only_VM for more information." fi } ### set action ### describe_set() { echo "Set a new system or user vm" } do_set() { local usage="Usage [user|system] [vm]" if [[ ${#} != 2 ]]; then die -q ${usage} elif [[ ${1} == "system" ]]; then if [[ -w ${VM_SYSTEM%/*} ]]; then my_set "${VM_SYSTEM}" "${2}" else die -q "Sorry, you don't have enough permission to set system" fi elif [[ ${1} == "user" ]]; then if [[ ${UID} != 0 ]]; then my_set "${VM_USER}" "${2}" else die -q "Sorry, you cannot set a user vm as root. Set the system vm instead" fi else die -q ${usage} fi } my_set() { local target=${2} symlink=${1} if [[ -z ${target} ]] ; then die -q "You didn't tell me what to set the symlink to" elif [[ -L "${symlink}" ]] ; then set_symlink "${target}" "${symlink}" || die -q "Couldn't set a new symlink" elif [[ -e ${symlink} ]] ; then die -q "Target file already exists and is not a symlink: ${symlink}" else set_symlink "${target}" "${symlink}" || die -q "Couldn't set a new symlink" fi } set_symlink() { local target=${1} symlink=${2} if is_number "${target}" ; then targets=( $(find_targets) ) target=${targets[$(( ${target} - 1 ))]} fi if [[ -z ${target} ]] ; then die -q "Target \"${1}\" doesn't appear to be valid!" elif [[ -d ${VM_BASE}/${target} ]] ; then local sym_dir=${symlink%/*} mkdir -p "${sym_dir}" || die -q "Could not create ${sym_dir}" ln -snf "${VM_BASE}/${target}" "${symlink}" else die -q "Target \"${1}\" doesn't appear to be valid!" fi }