| #!/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 "$@" |