blob: 77b09dccf5c9862f4245fb7e55c298b06b920ea7 [file] [log] [blame]
#!/usr/bin/env bash
# Copyright 2020 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This script provisions a salt minion on a Flutter test bed, it supports Linux and macOS.
set -e
MINION_PLIST_PATH=/Library/LaunchDaemons/com.saltstack.salt.minion.plist
LINUX_SALT_CLIENT_PATH="$HOME/salt-client"
# NOTE: https://github.com/flutter/flutter/issues/142627#issuecomment-1919922724
# before increasing this
SALT_VERSION='3006.3'
# Installs salt minion.
# Pins the version to 2019.2.0 and Python 2 to be compatible with Fuchsia salt master.
function install_salt() {
OS="$(uname)"
if [[ "$OS" == 'Darwin' ]]; then
curl -L "https://packages.broadcom.com/artifactory/saltproject-generic/macos/$SALT_VERSION/salt-$SALT_VERSION-py3-x86_64.pkg" -o /tmp/salt.pkg
sudo installer -pkg /tmp/salt.pkg -target /
elif [[ "$OS" == 'Linux' ]]; then
DISTRO="$(lsb_release -is)"
if [[ "$DISTRO" == 'Ubuntu' ]]; then
# Uninstall previous SaltStack packages, if any.
sudo dpkg --remove salt-minion salt-api salt-common
# Install SaltStack's dependencies.
sudo apt install -y dctrl-tools
# Install SaltStack.
declare -a SALT_PACKAGES=(
"salt-common_3006.9_amd64.deb"
"salt-minion_3006.9_amd64.deb"
)
for PACKAGE in "${SALT_PACKAGES[@]}"
do
echo "Installing salt package $PACKAGE..."
curl -L -o "/tmp/$PACKAGE" "https://packages.broadcom.com/artifactory/saltproject-deb/pool/$PACKAGE"
sudo dpkg --install "/tmp/$PACKAGE"
done
# Install m2crypto wheel build dependencies.
sudo apt install -y libssl-dev gcc swig python3-dev
# Install m2crypto in SaltStack's python environment (for the x509 module).
sudo /opt/saltstack/salt/bin/pip install m2crypto==0.39
else
echo "Unsupported Linux distribution: $DISTRO" >&2
exit 1
fi
else
echo "Unsupported operating system $OS" >&2
exit 1
fi
}
function config_minion() {
sudo mkdir -p /etc/salt
echo "master: $1" | sudo tee /etc/salt/minion
# Uses hostname as the minion id.
echo "id: $(hostname -s)" | sudo tee -a /etc/salt/minion
# Set fqdn for salt key autoaccept
echo "autosign_grains:" | sudo tee -a /etc/salt/minion
echo " - fqdn" | sudo tee -a /etc/salt/minion
if [[ "$(uname)" == 'Darwin' ]]; then
sudo cp salt.minion.plist "$MINION_PLIST_PATH"
fi
}
function set_deviceos_grains() {
if [ -n "$1" ]; then
sudo PATH="/opt/salt/bin:/usr/local/sbin:$PATH" /opt/salt/bin/salt-call grains.set 'device_os' "$1"
fi
}
function reboot_salt() {
if [[ "$(uname)" == 'Linux' ]]; then
# TODO hmm....
sudo systemctl restart salt-minion
elif [[ "$(uname)" == 'Darwin' ]]; then
sudo launchctl unload "$MINION_PLIST_PATH"
sudo launchctl load -w "$MINION_PLIST_PATH"
fi
}
function verify_provision() {
if sudo PATH="$PATH:/opt/salt/bin:/usr/bin" salt-minion --version; then
echo 'Succeed!'
else
echo 'Failed!'
fi
}
function Usage() {
echo "
Usage: ./provision_salt.sh [SERVER] [DEVICE_OS]
Arguments:
SERVER: required. Either 'prod' or 'dev'.
DEVICE_OS: optional. Either 'ios' or 'android'.
"
}
function main() {
local master_hostname=''
# TODO(yusuf-goog): Update the hostname below when we get a dev flutter salt master.
case "$1" in
prod) master_hostname='salt-flutter.endpoints.fuchsia-infra.cloud.goog' ;;
dev) master_hostname='salt-flutter.endpoints.fuchsia-infra.cloud.goog' ;;
*)
Usage
exit 1
;;
esac
local device_os=''
case "$2" in
ios) device_os='ios' ;;
android) device_os='android' ;;
"") device_os='' ;;
*)
Usage
exit 1
;;
esac
install_salt
config_minion "$master_hostname"
reboot_salt
verify_provision
set_deviceos_grains "$device_os"
}
main "$@"