1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
#!/usr/bin/env bash
# Microsoft Azure Linux Agent
#
# Copyright 2018 Microsoft Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# Installs the tools in ~/bin/scripts/* to ~/bin, as well as Pypy.
#
# It also makes Pypy the default python for the current user.
#
set -euo pipefail
PATH="$HOME/bin:$PATH"
python=$(get-agent-python)
echo "Python executable: $python"
echo "Python version: $($python --version)"
#
# Install Pypy as ~/bin/pypy3
#
# Note that bzip2/lbzip2 (used by tar to uncompress *.bz2 files) are not available by default in some distros;
# use Python to uncompress the Pypy tarball.
#
echo "Installing Pypy 3.7"
$python ~/bin/uncompress.py ~/tmp/pypy3.7-*.tar.bz2 ~/tmp/pypy3.7.tar
tar xf ~/tmp/pypy3.7.tar -C ~/bin
echo "Pypy was installed in $(ls -d ~/bin/pypy*)"
ln -s ~/bin/pypy*/bin/pypy3.7 ~/bin/pypy3
echo "Creating symbolic link to Pypy: ~/bin/pypy3"
#
# The 'distro' and 'platform' modules in Pypy have small differences with the ones in the system's Python.
# This can create problems in tests that use the get_distro() method in the Agent's 'version.py' module.
# To work around this, we copy the system's 'distro' module to Pypy.
#
# In the case of 'platform', the 'linux_distribution' method was removed on Python 3.7 so we check the
# system's module and, if the method does not exist, we also remove it from Pypy. Ubuntu 16 and 18 are
# special cases in that the 'platform' module in Pypy identifies the distro as 'debian'; in this case we
# copy the system's 'platform' module to Pypy.
#
distro_path=$($python -c '
try:
import distro
except:
exit(0)
print(distro.__file__.replace("__init__.py", "distro.py"))
exit(0)
')
if [[ "$distro_path" != "" ]]; then
echo "Copying the system's distro module to Pypy"
cp -v "$distro_path" ~/bin/pypy*/site-packages
else
echo "The distro module is not is not installing on the system; skipping."
fi
has_linux_distribution=$($python -c 'import platform; print(hasattr(platform, "linux_distribution"))')
if [[ "$has_linux_distribution" == "False" ]]; then
echo "Python does not have platform.linux_distribution; removing it from Pypy"
sed -i 's/def linux_distribution(/def __linux_distribution__(/' ~/bin/pypy*/lib-python/3/platform.py
else
echo "Python has platform.linux_distribution"
uname=$(uname -v)
if [[ "$uname" == *~18*-Ubuntu* || "$uname" == *~16*-Ubuntu* ]]; then
echo "Copying the system's platform module to Pypy"
pypy_platform=$(pypy3 -c 'import platform; print(platform.__file__)')
python_platform=$($python -c 'import platform; print(platform.__file__)')
cp -v "$python_platform" "$pypy_platform"
fi
fi
#
# Now install the test Agent as a module package in Pypy.
#
echo "Installing Agent modules to Pypy"
unzip.py ~/tmp/WALinuxAgent-*.zip ~/tmp/WALinuxAgent
unzip.py ~/tmp/WALinuxAgent/bin/WALinuxAgent-*.egg ~/tmp/WALinuxAgent/bin/WALinuxAgent.egg
mv ~/tmp/WALinuxAgent/bin/WALinuxAgent.egg/azurelinuxagent ~/bin/pypy*/site-packages
#
# Log the results of get_distro() in Pypy and Python.
#
pypy_get_distro=$(pypy3 -c 'from azurelinuxagent.common.version import get_distro; print(get_distro())')
python_get_distro=$($python -c 'from azurelinuxagent.common.version import get_distro; print(get_distro())')
echo "Pypy get_distro(): $pypy_get_distro"
echo "Python get_distro(): $python_get_distro"
#
# Create ~/bin/set-agent-env to set PATH and PYTHONPATH.
#
# We append $HOME/bin to PATH and set PYTHONPATH to $HOME/lib (bin contains the scripts used by tests, while
# lib contains the Python libraries used by tests).
#
echo "Creating ~/bin/set-agent-env to set PATH and PYTHONPATH"
echo "
if [[ \$PATH != *\"$HOME/bin\"* ]]; then
PATH=\"$HOME/bin:\$PATH:\"
fi
export PYTHONPATH=\"$HOME/lib\"
" > ~/bin/set-agent-env
chmod u+x ~/bin/set-agent-env
#
# Add ~/bin/set-agent-env to .bash_profile to simplify interactive debugging sessions
#
# Note that in some distros .bash_profile is a symbolic link to a read-only file. Make a copy in that case.
#
echo "Adding ~/bin/set-agent-env to ~/.bash_profile"
if test -e ~/.bash_profile && ls -l .bash_profile | grep '\->'; then
cp ~/.bash_profile ~/.bash_profile-bk
rm ~/.bash_profile
mv ~/.bash_profile-bk ~/.bash_profile
fi
if ! test -e ~/.bash_profile || ! grep '~/bin/set-agent-env' ~/.bash_profile > /dev/null; then
echo 'source ~/bin/set-agent-env
' >> ~/.bash_profile
fi
|