1#!/bin/sh 2# 3# Copyright 2017 Google Inc. All Rights Reserved. 4# 5 6# <cloud-sdk-sh-preamble> 7# 8# CLOUDSDK_ROOT_DIR (a) installation root dir 9# CLOUDSDK_PYTHON (u) python interpreter path 10# CLOUDSDK_GSUTIL_PYTHON (u) python interpreter path for gsutil 11# CLOUDSDK_PYTHON_ARGS (u) python interpreter arguments 12# CLOUDSDK_PYTHON_SITEPACKAGES (u) use python site packages 13# CLOUDSDK_BQ_PYTHON (u) python interpreter for bq 14# 15# (a) always defined by the preamble 16# (u) user definition overrides preamble 17 18# Wrapper around 'which' and 'command -v', tries which first, then falls back 19# to command -v 20_cloudsdk_which() { 21 which "$1" 2>/dev/null || command -v "$1" 2>/dev/null 22} 23 24# Check whether passed in python command reports major version 3. 25_is_python3() { 26 echo "$("$1" -V 2>&1)" | grep -E "Python 3" > /dev/null 27} 28 29# For Python 3, gsutil requires Python 3.5+. 30_py3_interpreter_compat_with_gsutil () { 31 # Some environments (e.g. macOS) don't support grep -P, so we use grep -E. 32 echo "$("$1" -V 2>&1)" | grep -E "Python 3[.]([5-9]|[1-9][0-9])" > /dev/null 33} 34 35order_python() { 36 selected_version="" 37 for python_version in "$@" 38 do 39 if [ -z "$selected_version" ]; then 40 if _cloudsdk_which $python_version > /dev/null && "$python_version" -c "import sys; print(sys.version)" > /dev/null; then 41 selected_version=$python_version 42 fi 43 fi 44 done 45 if [ -z "$selected_version" ]; then 46 selected_version=python 47 fi 48 echo $selected_version 49} 50 51# Determines the real cloud sdk root dir given the script path. 52# Would be easier with a portable "readlink -f". 53_cloudsdk_root_dir() { 54 case $1 in 55 /*) _cloudsdk_path=$1 56 ;; 57 */*) _cloudsdk_path=$PWD/$1 58 ;; 59 *) _cloudsdk_path=$(_cloudsdk_which $1) 60 case $_cloudsdk_path in 61 /*) ;; 62 *) _cloudsdk_path=$PWD/$_cloudsdk_path ;; 63 esac 64 ;; 65 esac 66 _cloudsdk_dir=0 67 while : 68 do 69 while _cloudsdk_link=$(readlink "$_cloudsdk_path") 70 do 71 case $_cloudsdk_link in 72 /*) _cloudsdk_path=$_cloudsdk_link ;; 73 *) _cloudsdk_path=$(dirname "$_cloudsdk_path")/$_cloudsdk_link ;; 74 esac 75 done 76 case $_cloudsdk_dir in 77 1) break ;; 78 esac 79 if [ -d "${_cloudsdk_path}" ]; then 80 break 81 fi 82 _cloudsdk_dir=1 83 _cloudsdk_path=$(dirname "$_cloudsdk_path") 84 done 85 while : 86 do case $_cloudsdk_path in 87 */) _cloudsdk_path=$(dirname "$_cloudsdk_path/.") 88 ;; 89 */.) _cloudsdk_path=$(dirname "$_cloudsdk_path") 90 ;; 91 */bin) dirname "$_cloudsdk_path" 92 break 93 ;; 94 *) echo "$_cloudsdk_path" 95 break 96 ;; 97 esac 98 done 99} 100CLOUDSDK_ROOT_DIR=$(_cloudsdk_root_dir "$0") 101 102setup_cloudsdk_python() { 103 # if $CLOUDSDK_PYTHON is not set, look for bundled python else 104 # prefer python3 over python2 105 if [ -z "$CLOUDSDK_PYTHON" ]; then 106 # Is bundled python present? 107 if [ -x "$CLOUDSDK_ROOT_DIR/platform/bundledpythonunix/bin/python3" ]; 108 then 109 CLOUDSDK_PYTHON="$CLOUDSDK_ROOT_DIR/platform/bundledpythonunix/bin/python3" 110 CLOUDSDK_PYTHON_SITEPACKAGES=1 111 else 112 CLOUDSDK_PYTHON=$(order_python python3 python2 /usr/local/bin/python3.8 python) 113 fi 114 fi 115} 116 117setup_cloudsdk_python 118 119# $PYTHONHOME can interfere with gcloud. Users should use 120# CLOUDSDK_PYTHON to configure which python gcloud uses. 121unset PYTHONHOME 122 123# if CLOUDSDK_PYTHON_SITEPACKAGES and VIRTUAL_ENV are empty 124case :$CLOUDSDK_PYTHON_SITEPACKAGES:$VIRTUAL_ENV: in 125:::) # add -S to CLOUDSDK_PYTHON_ARGS if not already there 126 case " $CLOUDSDK_PYTHON_ARGS " in 127 *" -S "*) ;; 128 " ") CLOUDSDK_PYTHON_ARGS="-S" 129 ;; 130 *) CLOUDSDK_PYTHON_ARGS="$CLOUDSDK_PYTHON_ARGS -S" 131 ;; 132 esac 133 unset CLOUDSDK_PYTHON_SITEPACKAGES 134 ;; 135*) # remove -S from CLOUDSDK_PYTHON_ARGS if already there 136 while :; do 137 case " $CLOUDSDK_PYTHON_ARGS " in 138 *" -S "*) CLOUDSDK_PYTHON_ARGS=${CLOUDSDK_PYTHON_ARGS%%-S*}' '${CLOUDSDK_PYTHON_ARGS#*-S} ;; 139 *) break ;; 140 esac 141 done 142 # if CLOUDSDK_PYTHON_SITEPACKAGES is empty 143 [ -z "$CLOUDSDK_PYTHON_SITEPACKAGES" ] && 144 CLOUDSDK_PYTHON_SITEPACKAGES=1 145 export CLOUDSDK_PYTHON_SITEPACKAGES 146 ;; 147esac 148 149# Allow users to set the Python interpreter used to launch gsutil, falling 150# back to the CLOUDSDK_PYTHON interpreter otherwise. 151if [ -z "$CLOUDSDK_GSUTIL_PYTHON" ]; then 152 CLOUDSDK_GSUTIL_PYTHON="$CLOUDSDK_PYTHON" 153fi 154 155if [ -z "$CLOUDSDK_BQ_PYTHON" ]; then 156 CLOUDSDK_BQ_PYTHON="$CLOUDSDK_PYTHON" 157fi 158 159export CLOUDSDK_ROOT_DIR 160export CLOUDSDK_PYTHON_ARGS 161export CLOUDSDK_GSUTIL_PYTHON 162export CLOUDSDK_BQ_PYTHON 163 164case $HOSTNAME in 165 *.corp.google.com|*.c.googlers.com) export CLOUDSDK_GOOGLE_AUTH_IS_GOOGLE_DOMAIN=true;; 166esac 167 168# </cloud-sdk-sh-preamble> 169 170export CLOUDSDK_COMPONENT_MANAGER_DISABLE_UPDATE_CHECK=1 171 172"${CLOUDSDK_ROOT_DIR}/bin/gcloud" auth docker-helper "$@" 173