From a42bc7fe28f2778b26086e778ba62ee8c3adeaa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Fri, 25 Mar 2016 21:12:50 +0100 Subject: [PATCH] Minor refactoring --- prepare-vms/scripts/trainer-cli | 2 + prepare-vms/trainer | 113 ++++++++------------------------ 2 files changed, 31 insertions(+), 84 deletions(-) diff --git a/prepare-vms/scripts/trainer-cli b/prepare-vms/scripts/trainer-cli index 2244894f..2047e3d3 100755 --- a/prepare-vms/scripts/trainer-cli +++ b/prepare-vms/scripts/trainer-cli @@ -3,6 +3,8 @@ set -e # if we encounter an error, abort +export AWS_DEFAULT_OUTPUT=text + greet() { hello=$(aws iam get-user --query 'User.UserName') echo "Greetings, $hello!" diff --git a/prepare-vms/trainer b/prepare-vms/trainer index db165422..c8c65534 100755 --- a/prepare-vms/trainer +++ b/prepare-vms/trainer @@ -2,26 +2,14 @@ TRAINER_IMAGE="soulshake/prepare-vms" -PIP_DEPENDENCIES=" - awscli -" - -# dpkg -l/pip/type-friendly DEPENDENCIES=" aws - awscli ssh curl jq - bsdmainutils pssh pip - python-pip wkhtmltopdf - JP_PLACEHOLDER - " - -OPTIONAL_DEPENDENCIES=" man " @@ -29,109 +17,66 @@ ENVVARS=" AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION - AWS_DEFAULT_PROFILE - SSH_AGENT_PID SSH_AUTH_SOCK - SSH_AUTH_DIRNAME " -envvars_ok() { - # This script expects plain text output from the AWS CLI in some places - export AWS_DEFAULT_OUTPUT=text - +check_envvars() { + STATUS=0 for envvar in $ENVVARS; do if [ -z "${!envvar}" ]; then - echo "Please export $envvar environment variable. Unsetting." + echo "Please set environment variable $envvar." + STATUS=1 unset $envvar - #return 1 fi done - return 0 + return $STATUS } -package_is_installed() { - # Try "type", "dpkg -l", and "pip freeze" to see if a package is installed - dependency=$1 - type $dependency >/dev/null 2>&1 \ - || dpkg -l $dependency >/dev/null 2>&1 \ - || pip freeze | grep $dependency >/dev/null 2>&1 || return 1 -} - -show_missing_dependencies() { - for dependency in $DEPENDENCIES; do - package_is_installed $dependency \ - && echo " $dependency: [OK]" \ - || { echo >&2 "$(tput setaf 1) $dependency: [NOK] $(tput sgr0)" ;} - done - - echo "Recommended:" - for dependency in $OPTIONAL_DEPENDENCIES; do - package_is_installed $dependency \ - && echo " $dependency: [OK]" \ - || { echo >&2 "$(tput setaf 1) $dependency: [NOK] $(tput sgr0)" ;} +check_dependencies() { + STATUS=0 + for dependency in $DEPENDENCIES ; do + if ! command -v $dependency >/dev/null; then + echo "Could not find dependency $dependency." + STATUS=1 + fi done + return $STATUS } -run_natively() { - scripts/trainer-cli "$@" -} - -run_containerized() { +check_ssh_auth_sock() { if [ -z $SSH_AUTH_SOCK ]; then echo -n "SSH_AUTH_SOCK envvar not set, so its parent directory can't be " echo "mounted as a volume in a container." echo "Try running the command below and trying again:" - echo "eval \$(ssh-agent) && ssh-agent && ssh-add" + echo "eval \$(ssh-agent) && ssh-add" exit 1 fi - - #/tmp/ssh-uN1oMimerRo0/agent.1411 - ( - cd $SCRIPT_DIR - export SSH_AUTH_DIRNAME=$(dirname $SSH_AUTH_SOCK) - docker-compose -f docker-compose.yml run prepare-vms "$@" - - ) } -dependencies_fulfilled() { - for dependency in $DEPENDENCIES ; do - package_is_installed $dependency || return 1 - done - - echo "All dependencies fulfilled. Running locally." -} - -trainer_image_exists_locally() { - ret=$(docker inspect $TRAINER_IMAGE >/dev/null 2>&1) - return $? +check_image() { + docker inspect $TRAINER_IMAGE >/dev/null 2>&1 } # Get the script's real directory, whether we're being called directly or via a symlink -if [ -L $0 ]; then - export SCRIPT_DIR=$(dirname $(readlink $0)) +if [ -L "$0" ]; then + export SCRIPT_DIR=$(dirname $(readlink "$0")) else - export SCRIPT_DIR=$(dirname $(readlink -f $0)) + export SCRIPT_DIR=$(dirname "$0") fi +cd "$SCRIPT_DIR" -export SSH_AUTH_DIRNAME=$(dirname $SSH_AUTH_SOCK) +check_envvars || exit 1 -if ! envvars_ok; then - exit 1 -fi - -if dependencies_fulfilled; then - ( - cd $SCRIPT_DIR - run_natively "$@" - ) -elif trainer_image_exists_locally; then - run_containerized "$@" +if check_dependencies; then + scripts/trainer-cli "$@" +elif check_image; then + check_ssh_auth_sock + export SSH_AUTH_DIRNAME=$(dirname $SSH_AUTH_SOCK) + docker-compose -f docker-compose.yml run prepare-vms "$@" else echo "Some dependencies are missing, and docker image $TRAINER_IMAGE doesn't exist locally." echo "Please do one of the following: " echo "- run \`docker build -t soulshake/prepare-vms .\`" echo "- run \`docker pull soulshake/prepare-vms\`" - echo "- install all dependencies: " - show_missing_dependencies + echo "- install missing dependencies" fi