diff options
Diffstat (limited to 'app-admin/eselect-pinentry/files/eselect-pinentry-0.1')
-rw-r--r-- | app-admin/eselect-pinentry/files/eselect-pinentry-0.1 | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/app-admin/eselect-pinentry/files/eselect-pinentry-0.1 b/app-admin/eselect-pinentry/files/eselect-pinentry-0.1 new file mode 100644 index 000000000000..8bddc5b9bc4a --- /dev/null +++ b/app-admin/eselect-pinentry/files/eselect-pinentry-0.1 @@ -0,0 +1,140 @@ +# Copyright 1999-2010 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id: eselect-pinentry-0.1,v 1.1 2010/09/30 13:48:58 ssuominen Exp $ + +# Based on select-sh by Michał Górny + +DESCRIPTION="Manage /usr/bin/pinentry symlink" +MAINTAINER="ssuominen@gentoo.org" +VERSION="0.1" + +## 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 ${ROOT}/usr/bin/${t} ]]; then + echo ${t} + fi + done +} + +# set the pinentry symlink +set_symlinks() { + local target="${1}" targets + + [[ ! -L ${ROOT}/usr/bin/pinentry && -e ${ROOT}/usr/bin/pinentry ]] && \ + die -q "/usr/bin/pinentry is not a symlink!" + + if is_number "${target}" && [[ ${target} -ge 1 ]]; then + targets=( $(find_targets) ) + target=${targets[target-1]} + fi + + if [[ -x ${ROOT}/usr/bin/${target} ]]; then + local tmpf="${ROOT}"/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}" "${ROOT}"/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 ${ROOT}/usr/bin/pinentry ]]; then + write_kv_list_entry "$(basename $(readlink ${ROOT}/usr/bin/pinentry))" "" + elif [[ -e ${ROOT}/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 ${ROOT}/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 "<target>" +} + +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 ${ROOT}/usr/bin/pinentry && -x ${ROOT}/usr/bin/pinentry ]] && \ + return + + set_symlinks 1 +} |