# Copyright 1999-2015 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Id: eselect-pinentry-0.3,v 1.1 2015/03/31 16:54:08 ulm Exp $ # Based on eselect-sh by Michał Górny DESCRIPTION="Manage /usr/bin/pinentry symlink" MAINTAINER="ssuominen@gentoo.org" VERSION="0.2" ## Functions ## # find a list of pinentry symlink targets, best first find_targets() { local t for t in \ pinentry-qt \ pinentry-gtk-2 \ pinentry-qt4 \ pinentry-curses \ ; do if [[ -x ${EROOT}/usr/bin/${t} ]]; then echo ${t} fi done } # set the pinentry symlink set_symlinks() { local target="${1}" targets [[ ! -L ${EROOT}/usr/bin/pinentry && -e ${EROOT}/usr/bin/pinentry ]] && \ die -q "/usr/bin/pinentry is not a symlink!" if is_number "${target}" && [[ ${target} -ge 1 ]]; then targets=( $(find_targets) ) # If no targets are found, remove the symlink and exit if [[ -L ${EROOT}/usr/bin/pinentry && -z ${targets} ]]; then rm -f "${EROOT}"/usr/bin/pinentry return fi target=${targets[target-1]} fi if [[ -x ${EROOT}/usr/bin/${target} ]]; then local tmpf="${EROOT}"/usr/bin/pinentry.new # we could use 'ln -f' to directly replace the symlink # but 'mv' is an atomic operation so it should be more fault-proof ln -s "${target}" "${tmpf}" || \ die -q "Unable to create temporary symlink" if ! mv "${tmpf}" "${EROOT}"/usr/bin/pinentry; then rm -f "${tmpf}" # cleanup die -q "Unable to replace /usr/bin/pinentry symlink with ${target}" fi else die -q "Target '${target}' doesn't appear to be valid!" fi } ### show action ### describe_show() { echo "Show the current pinentry implementation" } do_show() { [[ -z ${@} ]] || die -q "Too many parameters" write_list_start "Current pinentry implementation:" if [[ -L ${EROOT}/usr/bin/pinentry ]]; then write_kv_list_entry "$(basename $(readlink ${EROOT}/usr/bin/pinentry))" "" elif [[ -e ${EROOT}/usr/bin/pinentry ]]; then write_kv_list_entry "(not a symlink)" "" else write_kv_list_entry "(unset)" "" fi } ### list action ### describe_list() { echo "List available pinentry implementations" } do_list() { [[ -z ${@} ]] || die -q "Too many parameters" local i targets targets=( $(find_targets) ) if [[ -n ${targets[@]} ]]; then for (( i = 0; i < ${#targets[@]}; i++ )) ; do [[ ${targets[${i}]} == $(basename $(readlink ${EROOT}/usr/bin/pinentry)) ]] && \ targets[${i}]="${targets[${i}]} $(highlight '*')" done write_list_start "Available pinentry implementations:" write_numbered_list "${targets[@]}" else write_kv_list_entry "(none found)" "" fi } ### set action ### describe_set() { echo "Set a new pinentry implementation" } describe_set_options() { echo "target : Target name or number (from 'list' action)" } describe_set_parameters() { echo "" } do_set() { if [[ -z ${1} ]]; then die -q "Not enough parameters" elif [[ -n ${2} ]]; then die -q "Too many parameters" else set_symlinks "${1}" fi } ### update action ### describe_update() { echo "Automatically update the pinentry implementation" } describe_update_options() { echo "ifunset : Do not override existing implementation" } do_update() { [[ -z ${1} || ( -z ${2} && ( ${1} == ifunset || ${1} == '--if-unset' ) ) ]] || \ die -q "Usage error" [[ ( ${1} == ifunset || ${1} == '--if-unset' ) && -L ${EROOT}/usr/bin/pinentry && -x ${EROOT}/usr/bin/pinentry ]] && \ return set_symlinks 1 }