install-aws-server: Build a tool to smuggle scripts inline in the bootdata.

This commit is contained in:
Alex Vandiver 2024-01-31 12:06:23 -05:00 committed by Tim Abbott
parent 333cc902fb
commit bd87f53c86
4 changed files with 37 additions and 7 deletions

View File

@ -29,6 +29,3 @@ if [ ! -d "/srv/zulip-aws-tools/v2/$AWS_CLI_VERSION" ]; then
)
rm -rf awscli.zip awscli.zip.sha256 aws/
fi
# shellcheck disable=SC2034
AWS="/srv/zulip-aws-tools/bin/aws"

View File

@ -38,8 +38,13 @@ export DEBIAN_FRONTEND=noninteractive
apt-get -qy autoclean
)
# The following line gets subbed in with the contents of install-aws-cli
AWS=
# The following line gets subbed in by a call to pack-local-script,
# which will make $AWS_INSTALLER the path to a local copy of install-aws-cli
AWS_INSTALLER="inline!puppet/zulip_ops/files/install-aws-cli"
# We then call it, to install the AWS CLI
"$AWS_INSTALLER"
AWS=/srv/zulip-aws-tools/bin/aws
# Set up a bare-bones AWS configuration
mkdir -p /root/.aws

View File

@ -78,7 +78,8 @@ set -x
cd "$(dirname "$0")/../.."
source ./puppet/zulip_ops/files/install-aws-cli
./puppet/zulip_ops/files/install-aws-cli
AWS=/srv/zulip-aws-tools/bin/aws
zulip_install_config_file="$HOME/.zulip-install-server.conf"
if [ ! -f "$zulip_install_config_file" ]; then
@ -157,7 +158,11 @@ BOOTDATA=$(mktemp)
echo "REPO_URL=$REPO_URL"
echo "BRANCH=$BRANCH"
echo "SSH_SECRET_ID=$SSH_SECRET_ID"
sed '/^AWS=/ r ./puppet/zulip_ops/files/install-aws-cli' bootstrap-aws-installer
# Replace anything which looks like FOO="inline!bar/baz" with the
# output of pack-local-script, which will make "$FOO" inside the
# $BOOTDATA be the path to that script (smuggled inline and
# unpacked before use).
perl -ple 's|^(\w+)="inline!([^"]+)"|qx(./tools/setup/pack-local-script $1 $2)|e' ./tools/setup/bootstrap-aws-installer
} >>"$BOOTDATA"
TAG_ROLE_NAMES="$ROLES"

23
tools/setup/pack-local-script Executable file
View File

@ -0,0 +1,23 @@
#!/usr/bin/env bash
# This tool generates code in shell which is meant to be inline'd into
# a larger script; called with a variable name and a path, it produces
# a script which will result in that variable being set to the path to
# the contents of that path.
#
# This is used in bootstrap-aws-installer to bundle local files into
# the EC2 user data, so that those canonical versions can be used to
# bootstrap the host.
set -eu
var="$1"
file="$2"
encoded="$(gzip --stdout "$file" | base64)"
cat <<embedded-shell-output
$var="\$(mktemp)"
chmod 755 "\$$var"
base64 -d <<"encoded-shell-script" | gzip -d > "\$$var"
$encoded
encoded-shell-script
embedded-shell-output