Initial commit
diff --git a/bootstrap-salt.sh b/bootstrap-salt.sh
new file mode 100755
index 0000000..22ba484
--- /dev/null
+++ b/bootstrap-salt.sh
@@ -0,0 +1,6717 @@
+#!/bin/sh -
+#======================================================================================================================
+# vim: softtabstop=4 shiftwidth=4 expandtab fenc=utf-8 spell spelllang=en cc=120
+#======================================================================================================================
+#
+# FILE: bootstrap-salt.sh
+#
+# DESCRIPTION: Bootstrap Salt installation for various systems/distributions
+#
+# BUGS: https://github.com/saltstack/salt-bootstrap/issues
+#
+# COPYRIGHT: (c) 2012-2017 by the SaltStack Team, see AUTHORS.rst for more
+# details.
+#
+# LICENSE: Apache 2.0
+# ORGANIZATION: SaltStack (saltstack.com)
+# CREATED: 10/15/2012 09:49:37 PM WEST
+#======================================================================================================================
+set -o nounset # Treat unset variables as an error
+
+__ScriptVersion="2017.01.10"
+__ScriptName="bootstrap-salt.sh"
+
+__ScriptFullName="$0"
+__ScriptArgs="$*"
+
+#======================================================================================================================
+# Environment variables taken into account.
+#----------------------------------------------------------------------------------------------------------------------
+# * BS_COLORS: If 0 disables colour support
+# * BS_PIP_ALLOWED: If 1 enable pip based installations(if needed)
+# * BS_PIP_ALL: If 1 enable all python packages to be installed via pip instead of apt, requires setting virtualenv
+# * BS_VIRTUALENV_DIR: The virtualenv to install salt into (shouldn't exist yet)
+# * BS_ECHO_DEBUG: If 1 enable debug echo which can also be set by -D
+# * BS_SALT_ETC_DIR: Defaults to /etc/salt (Only tweak'able on git based installations)
+# * BS_SALT_CACHE_DIR: Defaults to /var/cache/salt (Only tweak'able on git based installations)
+# * BS_KEEP_TEMP_FILES: If 1, don't move temporary files, instead copy them
+# * BS_FORCE_OVERWRITE: Force overriding copied files(config, init.d, etc)
+# * BS_UPGRADE_SYS: If 1 and an option, upgrade system. Default 0.
+# * BS_GENTOO_USE_BINHOST: If 1 add `--getbinpkg` to gentoo's emerge
+# * BS_SALT_MASTER_ADDRESS: The IP or DNS name of the salt-master the minion should connect to
+# * BS_SALT_GIT_CHECKOUT_DIR: The directory where to clone Salt on git installations
+#======================================================================================================================
+
+
+#======================================================================================================================
+# LET THE BLACK MAGIC BEGIN!!!!
+#======================================================================================================================
+
+# Bootstrap script truth values
+BS_TRUE=1
+BS_FALSE=0
+
+# Default sleep time used when waiting for daemons to start, restart and checking for these running
+__DEFAULT_SLEEP=3
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __detect_color_support
+# DESCRIPTION: Try to detect color support.
+#----------------------------------------------------------------------------------------------------------------------
+_COLORS=${BS_COLORS:-$(tput colors 2>/dev/null || echo 0)}
+__detect_color_support() {
+ if [ $? -eq 0 ] && [ "$_COLORS" -gt 2 ]; then
+ RC="\033[1;31m"
+ GC="\033[1;32m"
+ BC="\033[1;34m"
+ YC="\033[1;33m"
+ EC="\033[0m"
+ else
+ RC=""
+ GC=""
+ BC=""
+ YC=""
+ EC=""
+ fi
+}
+__detect_color_support
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: echoerr
+# DESCRIPTION: Echo errors to stderr.
+#----------------------------------------------------------------------------------------------------------------------
+echoerror() {
+ printf "${RC} * ERROR${EC}: %s\n" "$@" 1>&2;
+}
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: echoinfo
+# DESCRIPTION: Echo information to stdout.
+#----------------------------------------------------------------------------------------------------------------------
+echoinfo() {
+ printf "${GC} * INFO${EC}: %s\n" "$@";
+}
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: echowarn
+# DESCRIPTION: Echo warning informations to stdout.
+#----------------------------------------------------------------------------------------------------------------------
+echowarn() {
+ printf "${YC} * WARN${EC}: %s\n" "$@";
+}
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: echodebug
+# DESCRIPTION: Echo debug information to stdout.
+#----------------------------------------------------------------------------------------------------------------------
+echodebug() {
+ if [ "$_ECHO_DEBUG" -eq $BS_TRUE ]; then
+ printf "${BC} * DEBUG${EC}: %s\n" "$@";
+ fi
+}
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __check_command_exists
+# DESCRIPTION: Check if a command exists.
+#----------------------------------------------------------------------------------------------------------------------
+__check_command_exists() {
+ command -v "$1" > /dev/null 2>&1
+}
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __check_pip_allowed
+# DESCRIPTION: Simple function to let the users know that -P needs to be
+# used.
+#----------------------------------------------------------------------------------------------------------------------
+__check_pip_allowed() {
+ if [ $# -eq 1 ]; then
+ _PIP_ALLOWED_ERROR_MSG=$1
+ else
+ _PIP_ALLOWED_ERROR_MSG="pip based installations were not allowed. Retry using '-P'"
+ fi
+
+ if [ "$_PIP_ALLOWED" -eq $BS_FALSE ]; then
+ echoerror "$_PIP_ALLOWED_ERROR_MSG"
+ __usage
+ exit 1
+ fi
+}
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __check_config_dir
+# DESCRIPTION: Checks the config directory, retrieves URLs if provided.
+#----------------------------------------------------------------------------------------------------------------------
+__check_config_dir() {
+ CC_DIR_NAME="$1"
+ CC_DIR_BASE=$(basename "${CC_DIR_NAME}")
+
+ case "$CC_DIR_NAME" in
+ http://*|https://*)
+ __fetch_url "/tmp/${CC_DIR_BASE}" "${CC_DIR_NAME}"
+ CC_DIR_NAME="/tmp/${CC_DIR_BASE}"
+ ;;
+ ftp://*)
+ __fetch_url "/tmp/${CC_DIR_BASE}" "${CC_DIR_NAME}"
+ CC_DIR_NAME="/tmp/${CC_DIR_BASE}"
+ ;;
+ *)
+ if [ ! -e "${CC_DIR_NAME}" ]; then
+ echo "null"
+ return 0
+ fi
+ ;;
+ esac
+
+ case "$CC_DIR_NAME" in
+ *.tgz|*.tar.gz)
+ tar -zxf "${CC_DIR_NAME}" -C /tmp
+ CC_DIR_BASE=$(basename "${CC_DIR_BASE}" ".tgz")
+ CC_DIR_BASE=$(basename "${CC_DIR_BASE}" ".tar.gz")
+ CC_DIR_NAME="/tmp/${CC_DIR_BASE}"
+ ;;
+ *.tbz|*.tar.bz2)
+ tar -xjf "${CC_DIR_NAME}" -C /tmp
+ CC_DIR_BASE=$(basename "${CC_DIR_BASE}" ".tbz")
+ CC_DIR_BASE=$(basename "${CC_DIR_BASE}" ".tar.bz2")
+ CC_DIR_NAME="/tmp/${CC_DIR_BASE}"
+ ;;
+ *.txz|*.tar.xz)
+ tar -xJf "${CC_DIR_NAME}" -C /tmp
+ CC_DIR_BASE=$(basename "${CC_DIR_BASE}" ".txz")
+ CC_DIR_BASE=$(basename "${CC_DIR_BASE}" ".tar.xz")
+ CC_DIR_NAME="/tmp/${CC_DIR_BASE}"
+ ;;
+ esac
+
+ echo "${CC_DIR_NAME}"
+}
+
+
+#----------------------------------------------------------------------------------------------------------------------
+# Handle command line arguments
+#----------------------------------------------------------------------------------------------------------------------
+_KEEP_TEMP_FILES=${BS_KEEP_TEMP_FILES:-$BS_FALSE}
+_TEMP_CONFIG_DIR="null"
+_SALTSTACK_REPO_URL="https://github.com/saltstack/salt.git"
+_SALT_REPO_URL=${_SALTSTACK_REPO_URL}
+_DOWNSTREAM_PKG_REPO=$BS_FALSE
+_TEMP_KEYS_DIR="null"
+_SLEEP="${__DEFAULT_SLEEP}"
+_INSTALL_MASTER=$BS_FALSE
+_INSTALL_SYNDIC=$BS_FALSE
+_INSTALL_MINION=$BS_TRUE
+_INSTALL_CLOUD=$BS_FALSE
+_VIRTUALENV_DIR=${BS_VIRTUALENV_DIR:-"null"}
+_START_DAEMONS=$BS_TRUE
+_DISABLE_SALT_CHECKS=$BS_FALSE
+_ECHO_DEBUG=${BS_ECHO_DEBUG:-$BS_FALSE}
+_CONFIG_ONLY=$BS_FALSE
+_PIP_ALLOWED=${BS_PIP_ALLOWED:-$BS_FALSE}
+_PIP_ALL=${BS_PIP_ALL:-$BS_FALSE}
+_SALT_ETC_DIR=${BS_SALT_ETC_DIR:-/etc/salt}
+_SALT_CACHE_DIR=${BS_SALT_CACHE_DIR:-/var/cache/salt}
+_PKI_DIR=${_SALT_ETC_DIR}/pki
+_FORCE_OVERWRITE=${BS_FORCE_OVERWRITE:-$BS_FALSE}
+_GENTOO_USE_BINHOST=${BS_GENTOO_USE_BINHOST:-$BS_FALSE}
+_EPEL_REPO=${BS_EPEL_REPO:-epel}
+_EPEL_REPOS_INSTALLED=$BS_FALSE
+_UPGRADE_SYS=${BS_UPGRADE_SYS:-$BS_FALSE}
+_INSECURE_DL=${BS_INSECURE_DL:-$BS_FALSE}
+_CURL_ARGS=${BS_CURL_ARGS:-}
+_FETCH_ARGS=${BS_FETCH_ARGS:-}
+_GPG_ARGS=${BS_GPG_ARGS:-}
+_WGET_ARGS=${BS_WGET_ARGS:-}
+_ENABLE_EXTERNAL_ZMQ_REPOS=${BS_ENABLE_EXTERNAL_ZMQ_REPOS:-$BS_FALSE}
+_SALT_MASTER_ADDRESS=${BS_SALT_MASTER_ADDRESS:-null}
+_SALT_MINION_ID="null"
+# _SIMPLIFY_VERSION is mostly used in Solaris based distributions
+_SIMPLIFY_VERSION=$BS_TRUE
+_LIBCLOUD_MIN_VERSION="0.14.0"
+_EXTRA_PACKAGES=""
+_HTTP_PROXY=""
+_SALT_GIT_CHECKOUT_DIR=${BS_SALT_GIT_CHECKOUT_DIR:-/tmp/git/salt}
+_NO_DEPS=$BS_FALSE
+_FORCE_SHALLOW_CLONE=$BS_FALSE
+_DISABLE_SSL=$BS_FALSE
+_DISABLE_REPOS=$BS_FALSE
+_CUSTOM_REPO_URL="null"
+_CUSTOM_MASTER_CONFIG="null"
+_CUSTOM_MINION_CONFIG="null"
+_QUIET_GIT_INSTALLATION=$BS_FALSE
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __usage
+# DESCRIPTION: Display usage information.
+#----------------------------------------------------------------------------------------------------------------------
+__usage() {
+ cat << EOT
+
+ Usage : ${__ScriptName} [options] <install-type> [install-type-args]
+
+ Installation types:
+ - stable Install latest stable release. This is the default
+ install type
+ - stable [branch] Install latest version on a branch. Only supported
+ for packages available at repo.saltstack.com
+ - stable [version] Install a specific version. Only supported for
+ packages available at repo.saltstack.com
+ - daily Ubuntu specific: configure SaltStack Daily PPA
+ - testing RHEL-family specific: configure EPEL testing repo
+ - git Install from the head of the develop branch
+ - git [ref] Install from any git ref (such as a branch, tag, or
+ commit)
+
+ Examples:
+ - ${__ScriptName}
+ - ${__ScriptName} stable
+ - ${__ScriptName} stable 2016.3
+ - ${__ScriptName} stable 2016.3.1
+ - ${__ScriptName} daily
+ - ${__ScriptName} testing
+ - ${__ScriptName} git
+ - ${__ScriptName} git 2016.3
+ - ${__ScriptName} git v2016.3.1
+ - ${__ScriptName} git 06f249901a2e2f1ed310d58ea3921a129f214358
+
+ Options:
+ -h Display this message
+ -v Display script version
+ -n No colours
+ -D Show debug output
+ -c Temporary configuration directory
+ -g Salt Git repository URL. Default: ${_SALTSTACK_REPO_URL}
+ -w Install packages from downstream package repository rather than
+ upstream, saltstack package repository. This is currently only
+ implemented for SUSE.
+ -k Temporary directory holding the minion keys which will pre-seed
+ the master.
+ -s Sleep time used when waiting for daemons to start, restart and when
+ checking for the services running. Default: ${__DEFAULT_SLEEP}
+ -L Also install salt-cloud and required python-libcloud package
+ -M Also install salt-master
+ -S Also install salt-syndic
+ -N Do not install salt-minion
+ -X Do not start daemons after installation
+ -d Disables checking if Salt services are enabled to start on system boot.
+ You can also do this by touching /tmp/disable_salt_checks on the target
+ host. Default: \${BS_FALSE}
+ -P Allow pip based installations. On some distributions the required salt
+ packages or its dependencies are not available as a package for that
+ distribution. Using this flag allows the script to use pip as a last
+ resort method. NOTE: This only works for functions which actually
+ implement pip based installations.
+ -U If set, fully upgrade the system prior to bootstrapping Salt
+ -I If set, allow insecure connections while downloading any files. For
+ example, pass '--no-check-certificate' to 'wget' or '--insecure' to
+ 'curl'. On Debian and Ubuntu, using this option with -U allows to obtain
+ GnuPG archive keys insecurely if distro has changed release signatures.
+ -F Allow copied files to overwrite existing (config, init.d, etc)
+ -K If set, keep the temporary files in the temporary directories specified
+ with -c and -k
+ -C Only run the configuration function. Implies -F (forced overwrite).
+ To overwrite Master or Syndic configs, -M or -S, respectively, must
+ also be specified. Salt installation will be ommitted, but some of the
+ dependencies could be installed to write configuration with -j or -J.
+ -A Pass the salt-master DNS name or IP. This will be stored under
+ \${BS_SALT_ETC_DIR}/minion.d/99-master-address.conf
+ -i Pass the salt-minion id. This will be stored under
+ \${BS_SALT_ETC_DIR}/minion_id
+ -p Extra-package to install while installing Salt dependencies. One package
+ per -p flag. You're responsible for providing the proper package name.
+ -H Use the specified HTTP proxy for all download URLs (including https://).
+ For example: http://myproxy.example.com:3128
+ -Z Enable additional package repository for newer ZeroMQ
+ (only available for RHEL/CentOS/Fedora/Ubuntu based distributions)
+ -b Assume that dependencies are already installed and software sources are
+ set up. If git is selected, git tree is still checked out as dependency
+ step.
+ -f Force shallow cloning for git installations.
+ This may result in an "n/a" in the version number.
+ -l Disable ssl checks. When passed, switches "https" calls to "http" where
+ possible.
+ -V Install Salt into virtualenv
+ (only available for Ubuntu based distributions)
+ -a Pip install all Python pkg dependencies for Salt. Requires -V to install
+ all pip pkgs into the virtualenv.
+ (Only available for Ubuntu based distributions)
+ -r Disable all repository configuration performed by this script. This
+ option assumes all necessary repository configuration is already present
+ on the system.
+ -R Specify a custom repository URL. Assumes the custom repository URL
+ points to a repository that mirrors Salt packages located at
+ repo.saltstack.com. The option passed with -R replaces the
+ "repo.saltstack.com". If -R is passed, -r is also set. Currently only
+ works on CentOS/RHEL based distributions.
+ -J Replace the Master config file with data passed in as a JSON string. If
+ a Master config file is found, a reasonable effort will be made to save
+ the file with a ".bak" extension. If used in conjunction with -C or -F,
+ no ".bak" file will be created as either of those options will force
+ a complete overwrite of the file.
+ -j Replace the Minion config file with data passed in as a JSON string. If
+ a Minion config file is found, a reasonable effort will be made to save
+ the file with a ".bak" extension. If used in conjunction with -C or -F,
+ no ".bak" file will be created as either of those options will force
+ a complete overwrite of the file.
+ -q Quiet salt installation from git (setup.py install -q)
+
+EOT
+} # ---------- end of function __usage ----------
+
+
+while getopts ':hvnDc:g:Gwk:s:MSNXCPFUKIA:i:Lp:dH:ZbflV:J:j:rR:aq' opt
+do
+ case "${opt}" in
+
+ h ) __usage; exit 0 ;;
+ v ) echo "$0 -- Version $__ScriptVersion"; exit 0 ;;
+ n ) _COLORS=0; __detect_color_support ;;
+ D ) _ECHO_DEBUG=$BS_TRUE ;;
+
+ c ) _TEMP_CONFIG_DIR=$(__check_config_dir "$OPTARG")
+ # If the configuration directory does not exist, error out
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ echoerror "Unsupported URI scheme for $OPTARG"
+ exit 1
+ fi
+ if [ ! -d "$_TEMP_CONFIG_DIR" ]; then
+ echoerror "The configuration directory ${_TEMP_CONFIG_DIR} does not exist."
+ exit 1
+ fi
+ ;;
+
+ g ) _SALT_REPO_URL=$OPTARG ;;
+
+ G ) echowarn "The '-G' option is DEPRECATED and will be removed in the future stable release!"
+ echowarn "Bootstrap will always use 'https' protocol to clone from SaltStack GitHub repo."
+ echowarn "No need to provide this option anymore, now it is a default behavior."
+ ;;
+
+ w ) _DOWNSTREAM_PKG_REPO=$BS_TRUE ;;
+
+ k ) _TEMP_KEYS_DIR="$OPTARG"
+ # If the configuration directory does not exist, error out
+ if [ ! -d "$_TEMP_KEYS_DIR" ]; then
+ echoerror "The pre-seed keys directory ${_TEMP_KEYS_DIR} does not exist."
+ exit 1
+ fi
+ ;;
+ s ) _SLEEP=$OPTARG ;;
+ M ) _INSTALL_MASTER=$BS_TRUE ;;
+ S ) _INSTALL_SYNDIC=$BS_TRUE ;;
+ N ) _INSTALL_MINION=$BS_FALSE ;;
+ X ) _START_DAEMONS=$BS_FALSE ;;
+ C ) _CONFIG_ONLY=$BS_TRUE ;;
+ P ) _PIP_ALLOWED=$BS_TRUE ;;
+ F ) _FORCE_OVERWRITE=$BS_TRUE ;;
+ U ) _UPGRADE_SYS=$BS_TRUE ;;
+ K ) _KEEP_TEMP_FILES=$BS_TRUE ;;
+ I ) _INSECURE_DL=$BS_TRUE ;;
+ A ) _SALT_MASTER_ADDRESS=$OPTARG ;;
+ i ) _SALT_MINION_ID=$OPTARG ;;
+ L ) _INSTALL_CLOUD=$BS_TRUE ;;
+ p ) _EXTRA_PACKAGES="$_EXTRA_PACKAGES $OPTARG" ;;
+ d ) _DISABLE_SALT_CHECKS=$BS_TRUE ;;
+ H ) _HTTP_PROXY="$OPTARG" ;;
+ Z ) _ENABLE_EXTERNAL_ZMQ_REPOS=$BS_TRUE ;;
+ b ) _NO_DEPS=$BS_TRUE ;;
+ f ) _FORCE_SHALLOW_CLONE=$BS_TRUE ;;
+ l ) _DISABLE_SSL=$BS_TRUE ;;
+ V ) _VIRTUALENV_DIR="$OPTARG" ;;
+ a ) _PIP_ALL=$BS_TRUE ;;
+ r ) _DISABLE_REPOS=$BS_TRUE ;;
+ R ) _CUSTOM_REPO_URL=$OPTARG ;;
+ J ) _CUSTOM_MASTER_CONFIG=$OPTARG ;;
+ j ) _CUSTOM_MINION_CONFIG=$OPTARG ;;
+ q ) _QUIET_GIT_INSTALLATION=$BS_TRUE ;;
+
+ \?) echo
+ echoerror "Option does not exist : $OPTARG"
+ __usage
+ exit 1
+ ;;
+
+ esac # --- end of case ---
+done
+shift $((OPTIND-1))
+
+
+__check_unparsed_options() {
+ shellopts="$1"
+ # grep alternative for SunOS
+ if [ -f /usr/xpg4/bin/grep ]; then
+ grep='/usr/xpg4/bin/grep'
+ else
+ grep='grep'
+ fi
+ unparsed_options=$( echo "$shellopts" | ${grep} -E '(^|[[:space:]])[-]+[[:alnum:]]' )
+ if [ "$unparsed_options" != "" ]; then
+ __usage
+ echo
+ echoerror "options are only allowed before install arguments"
+ echo
+ exit 1
+ fi
+}
+
+
+# Check that we're actually installing one of minion/master/syndic
+if [ "$_INSTALL_MINION" -eq $BS_FALSE ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && [ "$_CONFIG_ONLY" -eq $BS_FALSE ]; then
+ echowarn "Nothing to install or configure"
+ exit 0
+fi
+
+# Check that we're installing a minion if we're being passed a master address
+if [ "$_INSTALL_MINION" -eq $BS_FALSE ] && [ "$_SALT_MASTER_ADDRESS" != "null" ]; then
+ echoerror "Don't pass a master address (-A) if no minion is going to be bootstrapped."
+ exit 1
+fi
+
+# Check that we're installing a minion if we're being passed a minion id
+if [ "$_INSTALL_MINION" -eq $BS_FALSE ] && [ "$_SALT_MINION_ID" != "null" ]; then
+ echoerror "Don't pass a minion id (-i) if no minion is going to be bootstrapped."
+ exit 1
+fi
+
+# Check that we're installing or configuring a master if we're being passed a master config json dict
+if [ "$_CUSTOM_MASTER_CONFIG" != "null" ]; then
+ if [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && [ "$_CONFIG_ONLY" -eq $BS_FALSE ]; then
+ echoerror "Don't pass a master config JSON dict (-J) if no master is going to be bootstrapped or configured."
+ exit 1
+ fi
+fi
+
+# Check that we're installing or configuring a minion if we're being passed a minion config json dict
+if [ "$_CUSTOM_MINION_CONFIG" != "null" ]; then
+ if [ "$_INSTALL_MINION" -eq $BS_FALSE ] && [ "$_CONFIG_ONLY" -eq $BS_FALSE ]; then
+ echoerror "Don't pass a minion config JSON dict (-j) if no minion is going to be bootstrapped or configured."
+ exit 1
+ fi
+fi
+
+# Define installation type
+if [ "$#" -eq 0 ];then
+ ITYPE="stable"
+else
+ __check_unparsed_options "$*"
+ ITYPE=$1
+ shift
+fi
+
+# Check installation type
+if [ "$(echo "$ITYPE" | egrep '(stable|testing|daily|git)')" = "" ]; then
+ echoerror "Installation type \"$ITYPE\" is not known..."
+ exit 1
+fi
+
+# If doing a git install, check what branch/tag/sha will be checked out
+if [ "$ITYPE" = "git" ]; then
+ if [ "$#" -eq 0 ];then
+ GIT_REV="develop"
+ else
+ __check_unparsed_options "$*"
+ GIT_REV="$1"
+ shift
+ fi
+
+ # Disable shell warning about unbound variable during git install
+ STABLE_REV="latest"
+
+# If doing stable install, check if version specified
+elif [ "$ITYPE" = "stable" ]; then
+ if [ "$#" -eq 0 ];then
+ STABLE_REV="latest"
+ else
+ __check_unparsed_options "$*"
+
+ if [ "$(echo "$1" | egrep '^(latest|1\.6|1\.7|2014\.1|2014\.7|2015\.5|2015\.8|2016\.3|2016\.11)$')" != "" ]; then
+ STABLE_REV="$1"
+ shift
+ elif [ "$(echo "$1" | egrep '^([0-9]*\.[0-9]*\.[0-9]*)$')" != "" ]; then
+ STABLE_REV="archive/$1"
+ shift
+ else
+ echo "Unknown stable version: $1 (valid: 1.6, 1.7, 2014.1, 2014.7, 2015.5, 2015.8, 2016.3, 2016.11, latest, \$MAJOR.\$MINOR.\$PATCH)"
+ exit 1
+ fi
+ fi
+fi
+
+# -a and -V only work from git
+if [ "$ITYPE" != "git" ]; then
+ if [ $_PIP_ALL -eq $BS_TRUE ]; then
+ echoerror "Pip installing all python packages with -a is only possible when installing Salt via git"
+ exit 1
+ fi
+ if [ "$_VIRTUALENV_DIR" != "null" ]; then
+ echoerror "Virtualenv installs via -V is only possible when installing Salt via git"
+ exit 1
+ fi
+fi
+
+# Check for -r if -R is being passed. Set -r with a warning.
+if [ "$_CUSTOM_REPO_URL" != "null" ] && [ "$_DISABLE_REPOS" -eq $BS_FALSE ]; then
+ echowarn "Detected -R option. No other repositories will be configured when -R is used. Setting -r option to True."
+ _DISABLE_REPOS=$BS_TRUE
+fi
+
+# Check for any unparsed arguments. Should be an error.
+if [ "$#" -gt 0 ]; then
+ __check_unparsed_options "$*"
+ __usage
+ echo
+ echoerror "Too many arguments."
+ exit 1
+fi
+
+# Check the _DISABLE_SSL value and set HTTP or HTTPS.
+if [ "$_DISABLE_SSL" -eq $BS_TRUE ]; then
+ HTTP_VAL="http"
+else
+ HTTP_VAL="https"
+fi
+
+# Check the _QUIET_GIT_INSTALLATION value and set SETUP_PY_INSTALL_ARGS.
+if [ "$_QUIET_GIT_INSTALLATION" -eq $BS_TRUE ]; then
+ SETUP_PY_INSTALL_ARGS="-q"
+else
+ SETUP_PY_INSTALL_ARGS=""
+fi
+
+# whoami alternative for SunOS
+if [ -f /usr/xpg4/bin/id ]; then
+ whoami='/usr/xpg4/bin/id -un'
+else
+ whoami='whoami'
+fi
+
+# Root permissions are required to run this script
+if [ "$($whoami)" != "root" ]; then
+ echoerror "Salt requires root privileges to install. Please re-run this script as root."
+ exit 1
+fi
+
+# Export the http_proxy configuration to our current environment
+if [ "${_HTTP_PROXY}" != "" ]; then
+ export http_proxy="$_HTTP_PROXY"
+ export https_proxy="$_HTTP_PROXY"
+fi
+
+# Let's discover how we're being called
+# shellcheck disable=SC2009
+CALLER=$(ps -a -o pid,args | grep $$ | grep -v grep | tr -s ' ' | cut -d ' ' -f 3)
+
+if [ "${CALLER}x" = "${0}x" ]; then
+ CALLER="shell pipe"
+fi
+
+# Work around for 'Docker + salt-bootstrap failure' https://github.com/saltstack/salt-bootstrap/issues/394
+if [ "${_DISABLE_SALT_CHECKS}" -eq $BS_FALSE ] && [ -f /tmp/disable_salt_checks ]; then
+ # shellcheck disable=SC2016
+ echowarn 'Found file: /tmp/disable_salt_checks, setting _DISABLE_SALT_CHECKS=$BS_TRUE'
+ _DISABLE_SALT_CHECKS=$BS_TRUE
+fi
+
+# Because -a can only be installed into virtualenv
+if [ "${_PIP_ALL}" -eq $BS_TRUE ] && [ "${_VIRTUALENV_DIR}" = "null" ]; then
+ usage
+ # Could possibly set up a default virtualenv location when -a flag is passed
+ echoerror "Using -a requires -V because pip pkgs should be siloed from python system pkgs"
+ exit 1
+fi
+
+# Make sure virtualenv directory does not already exist
+if [ -d "${_VIRTUALENV_DIR}" ]; then
+ echoerror "The directory ${_VIRTUALENV_DIR} for virtualenv already exists"
+ exit 1
+fi
+
+echoinfo "Running version: ${__ScriptVersion}"
+echoinfo "Executed by: ${CALLER}"
+echoinfo "Command line: '${__ScriptFullName} ${__ScriptArgs}'"
+echowarn "Running the unstable version of ${__ScriptName}"
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __exit_cleanup
+# DESCRIPTION: Cleanup any leftovers after script has ended
+#
+#
+# http://www.unix.com/man-page/POSIX/1posix/trap/
+#
+# Signal Number Signal Name
+# 1 SIGHUP
+# 2 SIGINT
+# 3 SIGQUIT
+# 6 SIGABRT
+# 9 SIGKILL
+# 14 SIGALRM
+# 15 SIGTERM
+#----------------------------------------------------------------------------------------------------------------------
+__exit_cleanup() {
+ EXIT_CODE=$?
+
+ if [ "$ITYPE" = "git" ] && [ -d "${_SALT_GIT_CHECKOUT_DIR}" ]; then
+ if [ $_KEEP_TEMP_FILES -eq $BS_FALSE ]; then
+ # Clean up the checked out repository
+ echodebug "Cleaning up the Salt Temporary Git Repository"
+ # shellcheck disable=SC2164
+ cd "${__SALT_GIT_CHECKOUT_PARENT_DIR}"
+ rm -rf "${_SALT_GIT_CHECKOUT_DIR}"
+ else
+ echowarn "Not cleaning up the Salt Temporary git repository on request"
+ echowarn "Note that if you intend to re-run this script using the git approach, you might encounter some issues"
+ fi
+ fi
+
+ # Remove the logging pipe when the script exits
+ echodebug "Removing the logging pipe $LOGPIPE"
+ rm -f "$LOGPIPE"
+
+ # Kill tee when exiting, CentOS, at least requires this
+ # shellcheck disable=SC2009
+ TEE_PID=$(ps ax | grep tee | grep "$LOGFILE" | awk '{print $1}')
+
+ [ "$TEE_PID" = "" ] && exit $EXIT_CODE
+
+ echodebug "Killing logging pipe tee's with pid(s): $TEE_PID"
+
+ # We need to trap errors since killing tee will cause a 127 errno
+ # We also do this as late as possible so we don't "mis-catch" other errors
+ __trap_errors() {
+ echoinfo "Errors Trapped: $EXIT_CODE"
+ # Exit with the "original" exit code, not the trapped code
+ exit $EXIT_CODE
+ }
+ trap "__trap_errors" INT ABRT QUIT TERM
+
+ # Now we're "good" to kill tee
+ kill -s TERM "$TEE_PID"
+
+ # In case the 127 errno is not triggered, exit with the "original" exit code
+ exit $EXIT_CODE
+}
+trap "__exit_cleanup" EXIT INT
+
+
+# Define our logging file and pipe paths
+LOGFILE="/tmp/$( echo "$__ScriptName" | sed s/.sh/.log/g )"
+LOGPIPE="/tmp/$( echo "$__ScriptName" | sed s/.sh/.logpipe/g )"
+
+# Create our logging pipe
+# On FreeBSD we have to use mkfifo instead of mknod
+mknod "$LOGPIPE" p >/dev/null 2>&1 || mkfifo "$LOGPIPE" >/dev/null 2>&1
+if [ $? -ne 0 ]; then
+ echoerror "Failed to create the named pipe required to log"
+ exit 1
+fi
+
+# What ever is written to the logpipe gets written to the logfile
+tee < "$LOGPIPE" "$LOGFILE" &
+
+# Close STDOUT, reopen it directing it to the logpipe
+exec 1>&-
+exec 1>"$LOGPIPE"
+# Close STDERR, reopen it directing it to the logpipe
+exec 2>&-
+exec 2>"$LOGPIPE"
+
+
+# Handle the insecure flags
+if [ "$_INSECURE_DL" -eq $BS_TRUE ]; then
+ _CURL_ARGS="${_CURL_ARGS} --insecure"
+ _FETCH_ARGS="${_FETCH_ARGS} --no-verify-peer"
+ _GPG_ARGS="${_GPG_ARGS} --keyserver-options no-check-cert"
+ _WGET_ARGS="${_WGET_ARGS} --no-check-certificate"
+else
+ _GPG_ARGS="${_GPG_ARGS} --keyserver-options ca-cert-file=/etc/ssl/certs/ca-certificates.crt"
+fi
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __fetch_url
+# DESCRIPTION: Retrieves a URL and writes it to a given path
+#----------------------------------------------------------------------------------------------------------------------
+__fetch_url() {
+ # shellcheck disable=SC2086
+ curl $_CURL_ARGS -L -s -o "$1" "$2" >/dev/null 2>&1 ||
+ wget $_WGET_ARGS -q -O "$1" "$2" >/dev/null 2>&1 ||
+ fetch $_FETCH_ARGS -q -o "$1" "$2" >/dev/null 2>&1 || # FreeBSD
+ fetch -q -o "$1" "$2" >/dev/null 2>&1 || # Pre FreeBSD 10
+ ftp -o "$1" "$2" >/dev/null 2>&1 # OpenBSD
+}
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __fetch_verify
+# DESCRIPTION: Retrieves a URL, verifies its content and writes it to standard output
+#----------------------------------------------------------------------------------------------------------------------
+__fetch_verify() {
+ fetch_verify_url="$1"
+ fetch_verify_sum="$2"
+ fetch_verify_size="$3"
+
+ fetch_verify_tmpf=$(mktemp) && \
+ __fetch_url "$fetch_verify_tmpf" "$fetch_verify_url" && \
+ test "$(stat --format=%s "$fetch_verify_tmpf")" -eq "$fetch_verify_size" && \
+ test "$(md5sum "$fetch_verify_tmpf" | awk '{ print $1 }')" = "$fetch_verify_sum" && \
+ cat "$fetch_verify_tmpf" && \
+ rm -f "$fetch_verify_tmpf"
+ if [ $? -eq 0 ]; then
+ return 0
+ fi
+ echo "Failed verification of $fetch_verify_url"
+ return 1
+}
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __gather_hardware_info
+# DESCRIPTION: Discover hardware information
+#----------------------------------------------------------------------------------------------------------------------
+__gather_hardware_info() {
+ if [ -f /proc/cpuinfo ]; then
+ CPU_VENDOR_ID=$(awk '/vendor_id|Processor/ {sub(/-.*$/,"",$3); print $3; exit}' /proc/cpuinfo )
+ elif [ -f /usr/bin/kstat ]; then
+ # SmartOS.
+ # Solaris!?
+ # This has only been tested for a GenuineIntel CPU
+ CPU_VENDOR_ID=$(/usr/bin/kstat -p cpu_info:0:cpu_info0:vendor_id | awk '{print $2}')
+ else
+ CPU_VENDOR_ID=$( sysctl -n hw.model )
+ fi
+ # shellcheck disable=SC2034
+ CPU_VENDOR_ID_L=$( echo "$CPU_VENDOR_ID" | tr '[:upper:]' '[:lower:]' )
+ CPU_ARCH=$(uname -m 2>/dev/null || uname -p 2>/dev/null || echo "unknown")
+ CPU_ARCH_L=$( echo "$CPU_ARCH" | tr '[:upper:]' '[:lower:]' )
+}
+__gather_hardware_info
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __gather_os_info
+# DESCRIPTION: Discover operating system information
+#----------------------------------------------------------------------------------------------------------------------
+__gather_os_info() {
+ OS_NAME=$(uname -s 2>/dev/null)
+ OS_NAME_L=$( echo "$OS_NAME" | tr '[:upper:]' '[:lower:]' )
+ OS_VERSION=$(uname -r)
+ # shellcheck disable=SC2034
+ OS_VERSION_L=$( echo "$OS_VERSION" | tr '[:upper:]' '[:lower:]' )
+}
+__gather_os_info
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __parse_version_string
+# DESCRIPTION: Parse version strings ignoring the revision.
+# MAJOR.MINOR.REVISION becomes MAJOR.MINOR
+#----------------------------------------------------------------------------------------------------------------------
+__parse_version_string() {
+ VERSION_STRING="$1"
+ PARSED_VERSION=$(
+ echo "$VERSION_STRING" |
+ sed -e 's/^/#/' \
+ -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\)\(\.[0-9][0-9]*\).*$/\1/' \
+ -e 's/^#[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/' \
+ -e 's/^#[^0-9]*\([0-9][0-9]*\).*$/\1/' \
+ -e 's/^#.*$//'
+ )
+ echo "$PARSED_VERSION"
+}
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __derive_debian_numeric_version
+# DESCRIPTION: Derive the numeric version from a Debian version string.
+#----------------------------------------------------------------------------------------------------------------------
+__derive_debian_numeric_version() {
+ NUMERIC_VERSION=""
+ INPUT_VERSION="$1"
+ if echo "$INPUT_VERSION" | grep -q '^[0-9]'; then
+ NUMERIC_VERSION="$INPUT_VERSION"
+ elif [ -z "$INPUT_VERSION" ] && [ -f "/etc/debian_version" ]; then
+ INPUT_VERSION="$(cat /etc/debian_version)"
+ fi
+ if [ -z "$NUMERIC_VERSION" ]; then
+ if [ "$INPUT_VERSION" = "wheezy/sid" ]; then
+ # I've found an EC2 wheezy image which did not tell its version
+ NUMERIC_VERSION=$(__parse_version_string "7.0")
+ elif [ "$INPUT_VERSION" = "jessie/sid" ]; then
+ NUMERIC_VERSION=$(__parse_version_string "8.0")
+ elif [ "$INPUT_VERSION" = "stretch/sid" ]; then
+ # Let's start detecting the upcoming Debian 9 (Stretch)
+ NUMERIC_VERSION=$(__parse_version_string "9.0")
+ else
+ echowarn "Unable to parse the Debian Version (codename: '$INPUT_VERSION')"
+ fi
+ fi
+ echo "$NUMERIC_VERSION"
+}
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __unquote_string
+# DESCRIPTION: Strip single or double quotes from the provided string.
+#----------------------------------------------------------------------------------------------------------------------
+__unquote_string() {
+ echo "$*" | sed -e "s/^\([\"\']\)\(.*\)\1\$/\2/g"
+}
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __camelcase_split
+# DESCRIPTION: Convert 'CamelCased' strings to 'Camel Cased'
+#----------------------------------------------------------------------------------------------------------------------
+__camelcase_split() {
+ echo "$*" | sed -e 's/\([^[:upper:][:punct:]]\)\([[:upper:]]\)/\1 \2/g'
+}
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __strip_duplicates
+# DESCRIPTION: Strip duplicate strings
+#----------------------------------------------------------------------------------------------------------------------
+__strip_duplicates() {
+ echo "$*" | tr -s '[:space:]' '\n' | awk '!x[$0]++'
+}
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __sort_release_files
+# DESCRIPTION: Custom sort function. Alphabetical or numerical sort is not
+# enough.
+#----------------------------------------------------------------------------------------------------------------------
+__sort_release_files() {
+ KNOWN_RELEASE_FILES=$(echo "(arch|alpine|centos|debian|ubuntu|fedora|redhat|suse|\
+ mandrake|mandriva|gentoo|slackware|turbolinux|unitedlinux|lsb|system|\
+ oracle|os)(-|_)(release|version)" | sed -r 's:[[:space:]]::g')
+ primary_release_files=""
+ secondary_release_files=""
+ # Sort know VS un-known files first
+ for release_file in $(echo "${@}" | sed -r 's:[[:space:]]:\n:g' | sort -f | uniq); do
+ match=$(echo "$release_file" | egrep -i "${KNOWN_RELEASE_FILES}")
+ if [ "${match}" != "" ]; then
+ primary_release_files="${primary_release_files} ${release_file}"
+ else
+ secondary_release_files="${secondary_release_files} ${release_file}"
+ fi
+ done
+
+ # Now let's sort by know files importance, max important goes last in the max_prio list
+ max_prio="redhat-release centos-release oracle-release"
+ for entry in $max_prio; do
+ if [ "$(echo "${primary_release_files}" | grep "$entry")" != "" ]; then
+ primary_release_files=$(echo "${primary_release_files}" | sed -e "s:\(.*\)\($entry\)\(.*\):\2 \1 \3:g")
+ fi
+ done
+ # Now, least important goes last in the min_prio list
+ min_prio="lsb-release"
+ for entry in $min_prio; do
+ if [ "$(echo "${primary_release_files}" | grep "$entry")" != "" ]; then
+ primary_release_files=$(echo "${primary_release_files}" | sed -e "s:\(.*\)\($entry\)\(.*\):\1 \3 \2:g")
+ fi
+ done
+
+ # Echo the results collapsing multiple white-space into a single white-space
+ echo "${primary_release_files} ${secondary_release_files}" | sed -r 's:[[:space:]]+:\n:g'
+}
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __gather_linux_system_info
+# DESCRIPTION: Discover Linux system information
+#----------------------------------------------------------------------------------------------------------------------
+__gather_linux_system_info() {
+ DISTRO_NAME=""
+ DISTRO_VERSION=""
+
+ # Let's test if the lsb_release binary is available
+ rv=$(lsb_release >/dev/null 2>&1)
+ if [ $? -eq 0 ]; then
+ DISTRO_NAME=$(lsb_release -si)
+ if [ "${DISTRO_NAME}" = "Scientific" ]; then
+ DISTRO_NAME="Scientific Linux"
+ elif [ "$(echo "$DISTRO_NAME" | grep ^CloudLinux)" != "" ]; then
+ DISTRO_NAME="Cloud Linux"
+ elif [ "$(echo "$DISTRO_NAME" | grep ^RedHat)" != "" ]; then
+ # Let's convert 'CamelCased' to 'Camel Cased'
+ n=$(__camelcase_split "$DISTRO_NAME")
+ # Skip setting DISTRO_NAME this time, splitting CamelCase has failed.
+ # See https://github.com/saltstack/salt-bootstrap/issues/918
+ [ "$n" = "$DISTRO_NAME" ] && DISTRO_NAME="" || DISTRO_NAME="$n"
+ elif [ "${DISTRO_NAME}" = "openSUSE project" ]; then
+ # lsb_release -si returns "openSUSE project" on openSUSE 12.3
+ DISTRO_NAME="opensuse"
+ elif [ "${DISTRO_NAME}" = "SUSE LINUX" ]; then
+ if [ "$(lsb_release -sd | grep -i opensuse)" != "" ]; then
+ # openSUSE 12.2 reports SUSE LINUX on lsb_release -si
+ DISTRO_NAME="opensuse"
+ else
+ # lsb_release -si returns "SUSE LINUX" on SLES 11 SP3
+ DISTRO_NAME="suse"
+ fi
+ elif [ "${DISTRO_NAME}" = "EnterpriseEnterpriseServer" ]; then
+ # This the Oracle Linux Enterprise ID before ORACLE LINUX 5 UPDATE 3
+ DISTRO_NAME="Oracle Linux"
+ elif [ "${DISTRO_NAME}" = "OracleServer" ]; then
+ # This the Oracle Linux Server 6.5
+ DISTRO_NAME="Oracle Linux"
+ elif [ "${DISTRO_NAME}" = "AmazonAMI" ]; then
+ DISTRO_NAME="Amazon Linux AMI"
+ elif [ "${DISTRO_NAME}" = "Arch" ]; then
+ DISTRO_NAME="Arch Linux"
+ return
+ elif [ "${DISTRO_NAME}" = "Raspbian" ]; then
+ DISTRO_NAME="Debian"
+ elif [ "${DISTRO_NAME}" = "Cumulus Linux" ]; then
+ DISTRO_NAME="Debian"
+ fi
+ rv=$(lsb_release -sr)
+ [ "${rv}" != "" ] && DISTRO_VERSION=$(__parse_version_string "$rv")
+ elif [ -f /etc/lsb-release ]; then
+ # We don't have the lsb_release binary, though, we do have the file it parses
+ DISTRO_NAME=$(grep DISTRIB_ID /etc/lsb-release | sed -e 's/.*=//')
+ rv=$(grep DISTRIB_RELEASE /etc/lsb-release | sed -e 's/.*=//')
+ [ "${rv}" != "" ] && DISTRO_VERSION=$(__parse_version_string "$rv")
+ fi
+
+ if [ "$DISTRO_NAME" != "" ] && [ "$DISTRO_VERSION" != "" ]; then
+ # We already have the distribution name and version
+ return
+ fi
+ # shellcheck disable=SC2035,SC2086
+ for rsource in $(__sort_release_files "$(
+ cd /etc && /bin/ls *[_-]release *[_-]version 2>/dev/null | env -i sort | \
+ sed -e '/^redhat-release$/d' -e '/^lsb-release$/d'; \
+ echo redhat-release lsb-release
+ )"); do
+
+ [ -L "/etc/${rsource}" ] && continue # Don't follow symlinks
+ [ ! -f "/etc/${rsource}" ] && continue # Does not exist
+
+ n=$(echo "${rsource}" | sed -e 's/[_-]release$//' -e 's/[_-]version$//')
+ shortname=$(echo "${n}" | tr '[:upper:]' '[:lower:]')
+ if [ "$shortname" = "debian" ]; then
+ rv=$(__derive_debian_numeric_version "$(cat /etc/${rsource})")
+ else
+ rv=$( (grep VERSION "/etc/${rsource}"; cat "/etc/${rsource}") | grep '[0-9]' | sed -e 'q' )
+ fi
+ [ "${rv}" = "" ] && [ "$shortname" != "arch" ] && continue # There's no version information. Continue to next rsource
+ v=$(__parse_version_string "$rv")
+ case $shortname in
+ redhat )
+ if [ "$(egrep 'CentOS' /etc/${rsource})" != "" ]; then
+ n="CentOS"
+ elif [ "$(egrep 'Scientific' /etc/${rsource})" != "" ]; then
+ n="Scientific Linux"
+ elif [ "$(egrep 'Red Hat Enterprise Linux' /etc/${rsource})" != "" ]; then
+ n="<R>ed <H>at <E>nterprise <L>inux"
+ else
+ n="<R>ed <H>at <L>inux"
+ fi
+ ;;
+ arch ) n="Arch Linux" ;;
+ alpine ) n="Alpine Linux" ;;
+ centos ) n="CentOS" ;;
+ debian ) n="Debian" ;;
+ ubuntu ) n="Ubuntu" ;;
+ fedora ) n="Fedora" ;;
+ suse ) n="SUSE" ;;
+ mandrake*|mandriva ) n="Mandriva" ;;
+ gentoo ) n="Gentoo" ;;
+ slackware ) n="Slackware" ;;
+ turbolinux ) n="TurboLinux" ;;
+ unitedlinux ) n="UnitedLinux" ;;
+ oracle ) n="Oracle Linux" ;;
+ system )
+ while read -r line; do
+ [ "${n}x" != "systemx" ] && break
+ case "$line" in
+ *Amazon*Linux*AMI*)
+ n="Amazon Linux AMI"
+ break
+ esac
+ done < "/etc/${rsource}"
+ ;;
+ os )
+ nn="$(__unquote_string "$(grep '^ID=' /etc/os-release | sed -e 's/^ID=\(.*\)$/\1/g')")"
+ rv="$(__unquote_string "$(grep '^VERSION_ID=' /etc/os-release | sed -e 's/^VERSION_ID=\(.*\)$/\1/g')")"
+ [ "${rv}" != "" ] && v=$(__parse_version_string "$rv") || v=""
+ case $(echo "${nn}" | tr '[:upper:]' '[:lower:]') in
+ alpine )
+ n="Alpine Linux"
+ v="${rv}"
+ ;;
+ amzn )
+ # Amazon AMI's after 2014.09 match here
+ n="Amazon Linux AMI"
+ ;;
+ arch )
+ n="Arch Linux"
+ v="" # Arch Linux does not provide a version.
+ ;;
+ cloudlinux )
+ n="Cloud Linux"
+ ;;
+ debian )
+ n="Debian"
+ v=$(__derive_debian_numeric_version "$v")
+ ;;
+ sles )
+ n="SUSE"
+ v="${rv}"
+ ;;
+ * )
+ n=${nn}
+ ;;
+ esac
+ ;;
+ * ) n="${n}" ;
+ esac
+ DISTRO_NAME=$n
+ DISTRO_VERSION=$v
+ break
+ done
+}
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __gather_sunos_system_info
+# DESCRIPTION: Discover SunOS system info
+#----------------------------------------------------------------------------------------------------------------------
+__gather_sunos_system_info() {
+ if [ -f /sbin/uname ]; then
+ DISTRO_VERSION=$(/sbin/uname -X | awk '/[kK][eE][rR][nN][eE][lL][iI][dD]/ { print $3 }')
+ fi
+
+ DISTRO_NAME=""
+ if [ -f /etc/release ]; then
+ while read -r line; do
+ [ "${DISTRO_NAME}" != "" ] && break
+ case "$line" in
+ *OpenIndiana*oi_[0-9]*)
+ DISTRO_NAME="OpenIndiana"
+ DISTRO_VERSION=$(echo "$line" | sed -nr "s/OpenIndiana(.*)oi_([[:digit:]]+)(.*)/\2/p")
+ break
+ ;;
+ *OpenSolaris*snv_[0-9]*)
+ DISTRO_NAME="OpenSolaris"
+ DISTRO_VERSION=$(echo "$line" | sed -nr "s/OpenSolaris(.*)snv_([[:digit:]]+)(.*)/\2/p")
+ break
+ ;;
+ *Oracle*Solaris*[0-9]*)
+ DISTRO_NAME="Oracle Solaris"
+ DISTRO_VERSION=$(echo "$line" | sed -nr "s/(Oracle Solaris) ([[:digit:]]+)(.*)/\2/p")
+ break
+ ;;
+ *Solaris*)
+ DISTRO_NAME="Solaris"
+ # Let's make sure we not actually on a Joyent's SmartOS VM since some releases
+ # don't have SmartOS in `/etc/release`, only `Solaris`
+ uname -v | grep joyent >/dev/null 2>&1
+ if [ $? -eq 0 ]; then
+ DISTRO_NAME="SmartOS"
+ fi
+ break
+ ;;
+ *NexentaCore*)
+ DISTRO_NAME="Nexenta Core"
+ break
+ ;;
+ *SmartOS*)
+ DISTRO_NAME="SmartOS"
+ break
+ ;;
+ *OmniOS*)
+ DISTRO_NAME="OmniOS"
+ DISTRO_VERSION=$(echo "$line" | awk '{print $3}')
+ _SIMPLIFY_VERSION=$BS_FALSE
+ break
+ ;;
+ esac
+ done < /etc/release
+ fi
+
+ if [ "${DISTRO_NAME}" = "" ]; then
+ DISTRO_NAME="Solaris"
+ DISTRO_VERSION=$(
+ echo "${OS_VERSION}" |
+ sed -e 's;^4\.;1.;' \
+ -e 's;^5\.\([0-6]\)[^0-9]*$;2.\1;' \
+ -e 's;^5\.\([0-9][0-9]*\).*;\1;'
+ )
+ fi
+
+ if [ "${DISTRO_NAME}" = "SmartOS" ]; then
+ VIRTUAL_TYPE="smartmachine"
+ if [ "$(zonename)" = "global" ]; then
+ VIRTUAL_TYPE="global"
+ fi
+ fi
+}
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __gather_bsd_system_info
+# DESCRIPTION: Discover OpenBSD, NetBSD and FreeBSD systems information
+#----------------------------------------------------------------------------------------------------------------------
+__gather_bsd_system_info() {
+ DISTRO_NAME=${OS_NAME}
+ DISTRO_VERSION=$(echo "${OS_VERSION}" | sed -e 's;[()];;' -e 's/-.*$//')
+}
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __gather_system_info
+# DESCRIPTION: Discover which system and distribution we are running.
+#----------------------------------------------------------------------------------------------------------------------
+__gather_system_info() {
+ case ${OS_NAME_L} in
+ linux )
+ __gather_linux_system_info
+ ;;
+ sunos )
+ __gather_sunos_system_info
+ ;;
+ openbsd|freebsd|netbsd )
+ __gather_bsd_system_info
+ ;;
+ * )
+ echoerror "${OS_NAME} not supported.";
+ exit 1
+ ;;
+ esac
+
+}
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __get_dpkg_architecture
+# DESCRIPTION: Determine primary architecture for packages to install on Debian and derivatives
+#----------------------------------------------------------------------------------------------------------------------
+__get_dpkg_architecture() {
+ if __check_command_exists dpkg; then
+ DPKG_ARCHITECTURE="$(dpkg --print-architecture)"
+ else
+ echoerror "dpkg: command not found."
+ return 1
+ fi
+
+ return 0
+}
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __ubuntu_derivatives_translation
+# DESCRIPTION: Map Ubuntu derivatives to their Ubuntu base versions.
+# If distro has a known Ubuntu base version, use those install
+# functions by pretending to be Ubuntu (i.e. change global vars)
+#----------------------------------------------------------------------------------------------------------------------
+# shellcheck disable=SC2034
+__ubuntu_derivatives_translation() {
+ UBUNTU_DERIVATIVES="(trisquel|linuxmint|linaro|elementary_os)"
+ # Mappings
+ trisquel_6_ubuntu_base="12.04"
+ linuxmint_13_ubuntu_base="12.04"
+ linuxmint_17_ubuntu_base="14.04"
+ linuxmint_18_ubuntu_base="16.04"
+ linaro_12_ubuntu_base="12.04"
+ elementary_os_02_ubuntu_base="12.04"
+
+ # Translate Ubuntu derivatives to their base Ubuntu version
+ match=$(echo "$DISTRO_NAME_L" | egrep ${UBUNTU_DERIVATIVES})
+
+ if [ "${match}" != "" ]; then
+ case $match in
+ "elementary_os")
+ _major=$(echo "$DISTRO_VERSION" | sed 's/\.//g')
+ ;;
+ "linuxmint")
+ export LSB_ETC_LSB_RELEASE=/etc/upstream-release/lsb-release
+ _major=$(echo "$DISTRO_VERSION" | sed 's/^\([0-9]*\).*/\1/g')
+ ;;
+ *)
+ _major=$(echo "$DISTRO_VERSION" | sed 's/^\([0-9]*\).*/\1/g')
+ ;;
+ esac
+
+ _ubuntu_version=$(eval echo "\$${match}_${_major}_ubuntu_base")
+
+ if [ "$_ubuntu_version" != "" ]; then
+ echodebug "Detected Ubuntu $_ubuntu_version derivative"
+ DISTRO_NAME_L="ubuntu"
+ DISTRO_VERSION="$_ubuntu_version"
+ fi
+ fi
+}
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __ubuntu_codename_translation
+# DESCRIPTION: Map Ubuntu major versions to their corresponding codenames
+#----------------------------------------------------------------------------------------------------------------------
+# shellcheck disable=SC2034
+__ubuntu_codename_translation() {
+ case $DISTRO_MINOR_VERSION in
+ "04")
+ _april="yes"
+ ;;
+ "10")
+ _april=""
+ ;;
+ *)
+ _april="yes"
+ ;;
+ esac
+
+ case $DISTRO_MAJOR_VERSION in
+ "12")
+ DISTRO_CODENAME="precise"
+ ;;
+ "14")
+ DISTRO_CODENAME="trusty"
+ ;;
+ "16")
+ if [ "$_april" ]; then
+ DISTRO_CODENAME="xenial"
+ else
+ DISTRO_CODENAME="yakkety"
+ fi
+ ;;
+ *)
+ DISTRO_CODENAME="trusty"
+ ;;
+ esac
+}
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __debian_derivatives_translation
+# DESCRIPTION: Map Debian derivatives to their Debian base versions.
+# If distro has a known Debian base version, use those install
+# functions by pretending to be Debian (i.e. change global vars)
+#----------------------------------------------------------------------------------------------------------------------
+# shellcheck disable=SC2034
+__debian_derivatives_translation() {
+
+ # If the file does not exist, return
+ [ ! -f /etc/os-release ] && return
+
+ DEBIAN_DERIVATIVES="(kali|linuxmint|cumulus-linux)"
+ # Mappings
+ kali_1_debian_base="7.0"
+ linuxmint_1_debian_base="8.0"
+ cumulus_2_debian_base="7.0"
+ cumulus_3_debian_base="8.0"
+
+ # Detect derivates, Cumulus Linux, Kali and LinuxMint *only* for now
+ rv=$(grep ^ID= /etc/os-release | sed -e 's/.*=//')
+
+ # Translate Debian derivatives to their base Debian version
+ match=$(echo "$rv" | egrep ${DEBIAN_DERIVATIVES})
+
+ if [ "${match}" != "" ]; then
+ case $match in
+ kali)
+ _major=$(echo "$DISTRO_VERSION" | sed 's/^\([0-9]*\).*/\1/g')
+ _debian_derivative="kali"
+ ;;
+ linuxmint)
+ _major=$(echo "$DISTRO_VERSION" | sed 's/^\([0-9]*\).*/\1/g')
+ _debian_derivative="linuxmint"
+ ;;
+ cumulus-linux)
+ _major=$(echo "$DISTRO_VERSION" | sed 's/^\([0-9]*\).*/\1/g')
+ _debian_derivative="cumulus"
+ ;;
+ esac
+
+ _debian_version=$(eval echo "\$${_debian_derivative}_${_major}_debian_base")
+
+ if [ "$_debian_version" != "" ]; then
+ echodebug "Detected Debian $_debian_version derivative"
+ DISTRO_NAME_L="debian"
+ DISTRO_VERSION="$_debian_version"
+ fi
+ fi
+}
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __check_and_refresh_suse_pkg_repo
+# DESCRIPTION: Check if zypper knows about systemsmanagement_saltstack repo yet.
+# If it doesn't, add the repo and refresh with the SUSE_PKG_URL.
+#----------------------------------------------------------------------------------------------------------------------
+__check_and_refresh_suse_pkg_repo() {
+ # Check to see if systemsmanagement_saltstack exists
+ __zypper repos | grep systemsmanagement_saltstack >/dev/null 2>&1
+
+ if [ $? -eq 1 ]; then
+ # zypper does not yet know anything about systemsmanagement_saltstack
+ __zypper addrepo --refresh "${SUSE_PKG_URL}" || return 1
+ fi
+}
+
+__gather_system_info
+
+echo
+echoinfo "System Information:"
+echoinfo " CPU: ${CPU_VENDOR_ID}"
+echoinfo " CPU Arch: ${CPU_ARCH}"
+echoinfo " OS Name: ${OS_NAME}"
+echoinfo " OS Version: ${OS_VERSION}"
+echoinfo " Distribution: ${DISTRO_NAME} ${DISTRO_VERSION}"
+echo
+
+echodebug "Binaries will be searched using the following \$PATH: ${PATH}"
+
+# Let users know that we'll use a proxy
+if [ "${_HTTP_PROXY}" != "" ]; then
+ echoinfo "Using http proxy $_HTTP_PROXY"
+fi
+
+# Let users know what's going to be installed/configured
+if [ "$_INSTALL_MINION" -eq $BS_TRUE ]; then
+ if [ "$_CONFIG_ONLY" -eq $BS_FALSE ]; then
+ echoinfo "Installing minion"
+ else
+ echoinfo "Configuring minion"
+ fi
+fi
+
+if [ "$_INSTALL_MASTER" -eq $BS_TRUE ]; then
+ if [ "$_CONFIG_ONLY" -eq $BS_FALSE ]; then
+ echoinfo "Installing master"
+ else
+ echoinfo "Configuring master"
+ fi
+fi
+
+if [ "$_INSTALL_SYNDIC" -eq $BS_TRUE ]; then
+ if [ "$_CONFIG_ONLY" -eq $BS_FALSE ]; then
+ echoinfo "Installing syndic"
+ else
+ echoinfo "Configuring syndic"
+ fi
+fi
+
+if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ] && [ "$_CONFIG_ONLY" -eq $BS_FALSE ]; then
+ echoinfo "Installing salt-cloud and required python-libcloud package"
+fi
+
+if [ $_START_DAEMONS -eq $BS_FALSE ]; then
+ echoinfo "Daemons will not be started"
+fi
+
+# Simplify distro name naming on functions
+DISTRO_NAME_L=$(echo "$DISTRO_NAME" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-zA-Z0-9_ ]//g' | sed -re 's/([[:space:]])+/_/g')
+
+# For Ubuntu derivatives, pretend to be their Ubuntu base version
+__ubuntu_derivatives_translation
+
+# For Debian derivates, pretend to be their Debian base version
+__debian_derivatives_translation
+
+# Simplify version naming on functions
+if [ "$DISTRO_VERSION" = "" ] || [ ${_SIMPLIFY_VERSION} -eq $BS_FALSE ]; then
+ DISTRO_MAJOR_VERSION=""
+ DISTRO_MINOR_VERSION=""
+ PREFIXED_DISTRO_MAJOR_VERSION=""
+ PREFIXED_DISTRO_MINOR_VERSION=""
+else
+ DISTRO_MAJOR_VERSION=$(echo "$DISTRO_VERSION" | sed 's/^\([0-9]*\).*/\1/g')
+ DISTRO_MINOR_VERSION=$(echo "$DISTRO_VERSION" | sed 's/^\([0-9]*\).\([0-9]*\).*/\2/g')
+ PREFIXED_DISTRO_MAJOR_VERSION="_${DISTRO_MAJOR_VERSION}"
+ if [ "${PREFIXED_DISTRO_MAJOR_VERSION}" = "_" ]; then
+ PREFIXED_DISTRO_MAJOR_VERSION=""
+ fi
+ PREFIXED_DISTRO_MINOR_VERSION="_${DISTRO_MINOR_VERSION}"
+ if [ "${PREFIXED_DISTRO_MINOR_VERSION}" = "_" ]; then
+ PREFIXED_DISTRO_MINOR_VERSION=""
+ fi
+fi
+
+# For ubuntu versions, obtain the codename from the release version
+__ubuntu_codename_translation
+
+# Only Ubuntu has daily packages, let's let users know about that
+if ([ "${DISTRO_NAME_L}" != "ubuntu" ] && [ "$ITYPE" = "daily" ]); then
+ echoerror "${DISTRO_NAME} does not have daily packages support"
+ exit 1
+elif ([ "$(echo "${DISTRO_NAME_L}" | egrep '(debian|ubuntu|centos|red_hat|oracle|scientific)')" = "" ] && [ "$ITYPE" = "stable" ] && [ "$STABLE_REV" != "latest" ]); then
+ echoerror "${DISTRO_NAME} does not have major version pegged packages support"
+ exit 1
+fi
+
+# Only RedHat based distros have testing support
+if [ "${ITYPE}" = "testing" ]; then
+ if [ "$(echo "${DISTRO_NAME_L}" | egrep '(centos|red_hat|amazon|oracle)')" = "" ]; then
+ echoerror "${DISTRO_NAME} does not have testing packages support"
+ exit 1
+ fi
+ _EPEL_REPO="epel-testing"
+fi
+
+# Only Ubuntu has support for installing to virtualenvs
+if ([ "${DISTRO_NAME_L}" != "ubuntu" ] && [ "$_VIRTUALENV_DIR" != "null" ]); then
+ echoerror "${DISTRO_NAME} does not have -V support"
+ exit 1
+fi
+
+# Only Ubuntu has support for pip installing all packages
+if ([ "${DISTRO_NAME_L}" != "ubuntu" ] && [ $_PIP_ALL -eq $BS_TRUE ]);then
+ echoerror "${DISTRO_NAME} does not have -a support"
+ exit 1
+fi
+
+# Starting from Ubuntu 16.10, gnupg-curl has been renamed to gnupg1-curl.
+GNUPG_CURL="gnupg-curl"
+if ([ "${DISTRO_NAME_L}" = "ubuntu" ] && [ "${DISTRO_VERSION}" = "16.10" ]); then
+ GNUPG_CURL="gnupg1-curl"
+fi
+
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __function_defined
+# DESCRIPTION: Checks if a function is defined within this scripts scope
+# PARAMETERS: function name
+# RETURNS: 0 or 1 as in defined or not defined
+#----------------------------------------------------------------------------------------------------------------------
+__function_defined() {
+ FUNC_NAME=$1
+ if [ "$(command -v "$FUNC_NAME")" != "" ]; then
+ echoinfo "Found function $FUNC_NAME"
+ return 0
+ fi
+ echodebug "$FUNC_NAME not found...."
+ return 1
+}
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __apt_get_install_noinput
+# DESCRIPTION: (DRY) apt-get install with noinput options
+# PARAMETERS: packages
+#----------------------------------------------------------------------------------------------------------------------
+__apt_get_install_noinput() {
+ apt-get install -y -o DPkg::Options::=--force-confold "${@}"; return $?
+} # ---------- end of function __apt_get_install_noinput ----------
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __apt_get_upgrade_noinput
+# DESCRIPTION: (DRY) apt-get upgrade with noinput options
+#----------------------------------------------------------------------------------------------------------------------
+__apt_get_upgrade_noinput() {
+ apt-get upgrade -y -o DPkg::Options::=--force-confold; return $?
+} # ---------- end of function __apt_get_upgrade_noinput ----------
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __apt_key_fetch
+# DESCRIPTION: Download and import GPG public key for "apt-secure"
+# PARAMETERS: url
+#----------------------------------------------------------------------------------------------------------------------
+__apt_key_fetch() {
+ url=$1
+
+ __apt_get_install_noinput ${GNUPG_CURL} || return 1
+
+ # shellcheck disable=SC2086
+ apt-key adv ${_GPG_ARGS} --fetch-keys "$url"; return $?
+} # ---------- end of function __apt_key_fetch ----------
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __rpm_import_gpg
+# DESCRIPTION: Download and import GPG public key to rpm database
+# PARAMETERS: url
+#----------------------------------------------------------------------------------------------------------------------
+__rpm_import_gpg() {
+ url=$1
+
+ if __check_command_exists mktemp; then
+ tempfile="$(mktemp /tmp/salt-gpg-XXXXXXXX.pub 2>/dev/null)"
+
+ if [ -z "$tempfile" ]; then
+ echoerror "Failed to create temporary file in /tmp"
+ return 1
+ fi
+ else
+ tempfile="/tmp/salt-gpg-$$.pub"
+ fi
+
+ __fetch_url "$tempfile" "$url" || return 1
+ rpm --import "$tempfile" || return 1
+ rm -f "$tempfile"
+
+ return 0
+} # ---------- end of function __rpm_import_gpg ----------
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __yum_install_noinput
+# DESCRIPTION: (DRY) yum install with noinput options
+#----------------------------------------------------------------------------------------------------------------------
+__yum_install_noinput() {
+
+ ENABLE_EPEL_CMD=""
+ if [ $_DISABLE_REPOS -eq $BS_TRUE ]; then
+ ENABLE_EPEL_CMD="--enablerepo=${_EPEL_REPO}"
+ fi
+
+ if [ "$DISTRO_NAME_L" = "oracle_linux" ]; then
+ # We need to install one package at a time because --enablerepo=X disables ALL OTHER REPOS!!!!
+ for package in "${@}"; do
+ yum -y install "${package}" || yum -y install "${package}" ${ENABLE_EPEL_CMD} || return $?
+ done
+ else
+ yum -y install "${@}" ${ENABLE_EPEL_CMD} || return $?
+ fi
+} # ---------- end of function __yum_install_noinput ----------
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __git_clone_and_checkout
+# DESCRIPTION: (DRY) Helper function to clone and checkout salt to a
+# specific revision.
+#----------------------------------------------------------------------------------------------------------------------
+__git_clone_and_checkout() {
+
+ echodebug "Installed git version: $(git --version | awk '{ print $3 }')"
+ # Turn off SSL verification if -I flag was set for insecure downloads
+ if [ "$_INSECURE_DL" -eq $BS_TRUE ]; then
+ export GIT_SSL_NO_VERIFY=1
+ fi
+
+ __SALT_GIT_CHECKOUT_PARENT_DIR=$(dirname "${_SALT_GIT_CHECKOUT_DIR}" 2>/dev/null)
+ __SALT_GIT_CHECKOUT_PARENT_DIR="${__SALT_GIT_CHECKOUT_PARENT_DIR:-/tmp/git}"
+ __SALT_CHECKOUT_REPONAME="$(basename "${_SALT_GIT_CHECKOUT_DIR}" 2>/dev/null)"
+ __SALT_CHECKOUT_REPONAME="${__SALT_CHECKOUT_REPONAME:-salt}"
+ [ -d "${__SALT_GIT_CHECKOUT_PARENT_DIR}" ] || mkdir "${__SALT_GIT_CHECKOUT_PARENT_DIR}"
+ # shellcheck disable=SC2164
+ cd "${__SALT_GIT_CHECKOUT_PARENT_DIR}"
+ if [ -d "${_SALT_GIT_CHECKOUT_DIR}" ]; then
+ echodebug "Found a checked out Salt repository"
+ # shellcheck disable=SC2164
+ cd "${_SALT_GIT_CHECKOUT_DIR}"
+ echodebug "Fetching git changes"
+ git fetch || return 1
+ # Tags are needed because of salt's versioning, also fetch that
+ echodebug "Fetching git tags"
+ git fetch --tags || return 1
+
+ # If we have the SaltStack remote set as upstream, we also need to fetch the tags from there
+ if [ "$(git remote -v | grep $_SALTSTACK_REPO_URL)" != "" ]; then
+ echodebug "Fetching upstream(SaltStack's Salt repository) git tags"
+ git fetch --tags upstream
+ else
+ echoinfo "Adding SaltStack's Salt repository as a remote"
+ git remote add upstream "$_SALTSTACK_REPO_URL"
+ echodebug "Fetching upstream(SaltStack's Salt repository) git tags"
+ git fetch --tags upstream
+ fi
+
+ echodebug "Hard reseting the cloned repository to ${GIT_REV}"
+ git reset --hard "$GIT_REV" || return 1
+
+ # Just calling `git reset --hard $GIT_REV` on a branch name that has
+ # already been checked out will not update that branch to the upstream
+ # HEAD; instead it will simply reset to itself. Check the ref to see
+ # if it is a branch name, check out the branch, and pull in the
+ # changes.
+ git branch -a | grep -q "${GIT_REV}"
+ if [ $? -eq 0 ]; then
+ echodebug "Rebasing the cloned repository branch"
+ git pull --rebase || return 1
+ fi
+ else
+ if [ "$_FORCE_SHALLOW_CLONE" -eq "${BS_TRUE}" ]; then
+ echoinfo "Forced shallow cloning of git repository."
+ __SHALLOW_CLONE=$BS_TRUE
+ elif [ "$(echo "$GIT_REV" | sed 's/^.*\(v\?[[:digit:]]\{1,4\}\.[[:digit:]]\{1,2\}\)\(\.[[:digit:]]\{1,2\}\)\?.*$/MATCH/')" = "MATCH" ]; then
+ echoinfo "Git revision matches a Salt version tag, shallow cloning enabled."
+ __SHALLOW_CLONE=$BS_TRUE
+ else
+ echowarn "The git revision being installed does not match a Salt version tag. Shallow cloning disabled"
+ __SHALLOW_CLONE=$BS_FALSE
+ fi
+
+ if [ "$__SHALLOW_CLONE" -eq $BS_TRUE ]; then
+ # Let's try shallow cloning to speed up.
+ # Test for "--single-branch" option introduced in git 1.7.10, the minimal version of git where the shallow
+ # cloning we need actually works
+ if [ "$(git clone 2>&1 | grep 'single-branch')" != "" ]; then
+ # The "--single-branch" option is supported, attempt shallow cloning
+ echoinfo "Attempting to shallow clone $GIT_REV from Salt's repository ${_SALT_REPO_URL}"
+ git clone --depth 1 --branch "$GIT_REV" "$_SALT_REPO_URL" "$__SALT_CHECKOUT_REPONAME"
+ if [ $? -eq 0 ]; then
+ # shellcheck disable=SC2164
+ cd "${_SALT_GIT_CHECKOUT_DIR}"
+ __SHALLOW_CLONE=$BS_TRUE
+ else
+ # Shallow clone above failed(missing upstream tags???), let's resume the old behaviour.
+ echowarn "Failed to shallow clone."
+ echoinfo "Resuming regular git clone and remote SaltStack repository addition procedure"
+ __SHALLOW_CLONE=$BS_FALSE
+ fi
+ else
+ echodebug "Shallow cloning not possible. Required git version not met."
+ __SHALLOW_CLONE=$BS_FALSE
+ fi
+ fi
+
+ if [ "$__SHALLOW_CLONE" -eq $BS_FALSE ]; then
+ git clone "$_SALT_REPO_URL" "$__SALT_CHECKOUT_REPONAME" || return 1
+ # shellcheck disable=SC2164
+ cd "${_SALT_GIT_CHECKOUT_DIR}"
+
+ if ! echo "$_SALT_REPO_URL" | grep -q -F -w "${_SALTSTACK_REPO_URL#*://}"; then
+ # We need to add the saltstack repository as a remote and fetch tags for proper versioning
+ echoinfo "Adding SaltStack's Salt repository as a remote"
+ git remote add upstream "$_SALTSTACK_REPO_URL" || return 1
+
+ echodebug "Fetching upstream (SaltStack's Salt repository) git tags"
+ git fetch --tags upstream || return 1
+
+ # Check if GIT_REV is a remote branch or just a commit hash
+ if git branch -r | grep -q -F -w "origin/$GIT_REV"; then
+ GIT_REV="origin/$GIT_REV"
+ fi
+ fi
+
+ echodebug "Checking out $GIT_REV"
+ git checkout "$GIT_REV" || return 1
+ fi
+
+ fi
+
+ echoinfo "Cloning Salt's git repository succeeded"
+ return 0
+}
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __check_end_of_life_versions
+# DESCRIPTION: Check for end of life distribution versions
+#----------------------------------------------------------------------------------------------------------------------
+__check_end_of_life_versions() {
+ case "${DISTRO_NAME_L}" in
+ debian)
+ # Debian versions bellow 6 are not supported
+ if [ "$DISTRO_MAJOR_VERSION" -lt 7 ]; then
+ echoerror "End of life distributions are not supported."
+ echoerror "Please consider upgrading to the next stable. See:"
+ echoerror " https://wiki.debian.org/DebianReleases"
+ exit 1
+ fi
+ ;;
+
+ ubuntu)
+ # Ubuntu versions not supported
+ #
+ # < 12.04
+ # 13.x, 15.x
+ # 12.10, 14.10
+ if [ "$DISTRO_MAJOR_VERSION" -lt 12 ] || \
+ [ "$DISTRO_MAJOR_VERSION" -eq 13 ] || \
+ [ "$DISTRO_MAJOR_VERSION" -eq 15 ] || \
+ ([ "$DISTRO_MAJOR_VERSION" -lt 16 ] && [ "$DISTRO_MINOR_VERSION" -eq 10 ]); then
+ echoerror "End of life distributions are not supported."
+ echoerror "Please consider upgrading to the next stable. See:"
+ echoerror " https://wiki.ubuntu.com/Releases"
+ exit 1
+ fi
+ ;;
+
+ opensuse)
+ # openSUSE versions not supported
+ #
+ # <= 12.1
+ if ([ "$DISTRO_MAJOR_VERSION" -eq 12 ] && [ "$DISTRO_MINOR_VERSION" -eq 1 ]) || [ "$DISTRO_MAJOR_VERSION" -lt 12 ]; then
+ echoerror "End of life distributions are not supported."
+ echoerror "Please consider upgrading to the next stable. See:"
+ echoerror " http://en.opensuse.org/Lifetime"
+ exit 1
+ fi
+ ;;
+
+ suse)
+ # SuSE versions not supported
+ #
+ # < 11 SP2
+ SUSE_PATCHLEVEL=$(awk '/PATCHLEVEL/ {print $3}' /etc/SuSE-release )
+ if [ "${SUSE_PATCHLEVEL}" = "" ]; then
+ SUSE_PATCHLEVEL="00"
+ fi
+ if ([ "$DISTRO_MAJOR_VERSION" -eq 11 ] && [ "$SUSE_PATCHLEVEL" -lt 02 ]) || [ "$DISTRO_MAJOR_VERSION" -lt 11 ]; then
+ echoerror "Versions lower than SuSE 11 SP2 are not supported."
+ echoerror "Please consider upgrading to the next stable"
+ exit 1
+ fi
+ ;;
+
+ fedora)
+ # Fedora lower than 18 are no longer supported
+ if [ "$DISTRO_MAJOR_VERSION" -lt 23 ]; then
+ echoerror "End of life distributions are not supported."
+ echoerror "Please consider upgrading to the next stable. See:"
+ echoerror " https://fedoraproject.org/wiki/Releases"
+ exit 1
+ fi
+ ;;
+
+ centos)
+ # CentOS versions lower than 5 are no longer supported
+ if [ "$DISTRO_MAJOR_VERSION" -lt 5 ]; then
+ echoerror "End of life distributions are not supported."
+ echoerror "Please consider upgrading to the next stable. See:"
+ echoerror " http://wiki.centos.org/Download"
+ exit 1
+ fi
+ ;;
+
+ red_hat*linux)
+ # Red Hat (Enterprise) Linux versions lower than 5 are no longer supported
+ if [ "$DISTRO_MAJOR_VERSION" -lt 5 ]; then
+ echoerror "End of life distributions are not supported."
+ echoerror "Please consider upgrading to the next stable. See:"
+ echoerror " https://access.redhat.com/support/policy/updates/errata/"
+ exit 1
+ fi
+ ;;
+
+ amazon*linux*ami)
+ # Amazon Linux versions lower than 2012.0X no longer supported
+ if [ "$DISTRO_MAJOR_VERSION" -lt 2012 ]; then
+ echoerror "End of life distributions are not supported."
+ echoerror "Please consider upgrading to the next stable. See:"
+ echoerror " https://aws.amazon.com/amazon-linux-ami/"
+ exit 1
+ fi
+ ;;
+
+ freebsd)
+ # FreeBSD versions lower than 9.1 are not supported.
+ if ([ "$DISTRO_MAJOR_VERSION" -eq 9 ] && [ "$DISTRO_MINOR_VERSION" -lt 01 ]) || [ "$DISTRO_MAJOR_VERSION" -lt 9 ]; then
+ echoerror "Versions lower than FreeBSD 9.1 are not supported."
+ exit 1
+ fi
+ ;;
+
+ *)
+ ;;
+ esac
+}
+# Fail soon for end of life versions
+__check_end_of_life_versions
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __copyfile
+# DESCRIPTION: Simple function to copy files. Overrides if asked.
+#----------------------------------------------------------------------------------------------------------------------
+__copyfile() {
+ overwrite=$_FORCE_OVERWRITE
+ if [ $# -eq 2 ]; then
+ sfile=$1
+ dfile=$2
+ elif [ $# -eq 3 ]; then
+ sfile=$1
+ dfile=$2
+ overwrite=$3
+ else
+ echoerror "Wrong number of arguments for __copyfile()"
+ echoinfo "USAGE: __copyfile <source> <dest> OR __copyfile <source> <dest> <overwrite>"
+ exit 1
+ fi
+
+ # Does the source file exist?
+ if [ ! -f "$sfile" ]; then
+ echowarn "$sfile does not exist!"
+ return 1
+ fi
+
+ # If the destination is a directory, let's make it a full path so the logic
+ # below works as expected
+ if [ -d "$dfile" ]; then
+ echodebug "The passed destination ($dfile) is a directory"
+ dfile="${dfile}/$(basename "$sfile")"
+ echodebug "Full destination path is now: $dfile"
+ fi
+
+ if [ ! -f "$dfile" ]; then
+ # The destination file does not exist, copy
+ echodebug "Copying $sfile to $dfile"
+ cp "$sfile" "$dfile" || return 1
+ elif [ -f "$dfile" ] && [ "$overwrite" -eq $BS_TRUE ]; then
+ # The destination exist and we're overwriting
+ echodebug "Overwriting $dfile with $sfile"
+ cp -f "$sfile" "$dfile" || return 1
+ elif [ -f "$dfile" ] && [ "$overwrite" -ne $BS_TRUE ]; then
+ echodebug "Not overwriting $dfile with $sfile"
+ fi
+ return 0
+}
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __movefile
+# DESCRIPTION: Simple function to move files. Overrides if asked.
+#----------------------------------------------------------------------------------------------------------------------
+__movefile() {
+ overwrite=$_FORCE_OVERWRITE
+ if [ $# -eq 2 ]; then
+ sfile=$1
+ dfile=$2
+ elif [ $# -eq 3 ]; then
+ sfile=$1
+ dfile=$2
+ overwrite=$3
+ else
+ echoerror "Wrong number of arguments for __movefile()"
+ echoinfo "USAGE: __movefile <source> <dest> OR __movefile <source> <dest> <overwrite>"
+ exit 1
+ fi
+
+ if [ $_KEEP_TEMP_FILES -eq $BS_TRUE ]; then
+ # We're being told not to move files, instead copy them so we can keep
+ # them around
+ echodebug "Since BS_KEEP_TEMP_FILES=1 we're copying files instead of moving them"
+ __copyfile "$sfile" "$dfile" "$overwrite"
+ return $?
+ fi
+
+ # Does the source file exist?
+ if [ ! -f "$sfile" ]; then
+ echowarn "$sfile does not exist!"
+ return 1
+ fi
+
+ # If the destination is a directory, let's make it a full path so the logic
+ # below works as expected
+ if [ -d "$dfile" ]; then
+ echodebug "The passed destination($dfile) is a directory"
+ dfile="${dfile}/$(basename "$sfile")"
+ echodebug "Full destination path is now: $dfile"
+ fi
+
+ if [ ! -f "$dfile" ]; then
+ # The destination file does not exist, move
+ echodebug "Moving $sfile to $dfile"
+ mv "$sfile" "$dfile" || return 1
+ elif [ -f "$dfile" ] && [ "$overwrite" -eq $BS_TRUE ]; then
+ # The destination exist and we're overwriting
+ echodebug "Overriding $dfile with $sfile"
+ mv -f "$sfile" "$dfile" || return 1
+ elif [ -f "$dfile" ] && [ "$overwrite" -ne $BS_TRUE ]; then
+ echodebug "Not overriding $dfile with $sfile"
+ fi
+
+ return 0
+}
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __linkfile
+# DESCRIPTION: Simple function to create symlinks. Overrides if asked. Accepts globs.
+#----------------------------------------------------------------------------------------------------------------------
+__linkfile() {
+ overwrite=$_FORCE_OVERWRITE
+ if [ $# -eq 2 ]; then
+ target=$1
+ linkname=$2
+ elif [ $# -eq 3 ]; then
+ target=$1
+ linkname=$2
+ overwrite=$3
+ else
+ echoerror "Wrong number of arguments for __linkfile()"
+ echoinfo "USAGE: __linkfile <target> <link> OR __linkfile <tagret> <link> <overwrite>"
+ exit 1
+ fi
+
+ for sfile in $target; do
+ # Does the source file exist?
+ if [ ! -f "$sfile" ]; then
+ echowarn "$sfile does not exist!"
+ return 1
+ fi
+
+ # If the destination is a directory, let's make it a full path so the logic
+ # below works as expected
+ if [ -d "$linkname" ]; then
+ echodebug "The passed link name ($linkname) is a directory"
+ linkname="${linkname}/$(basename "$sfile")"
+ echodebug "Full destination path is now: $linkname"
+ fi
+
+ if [ ! -e "$linkname" ]; then
+ # The destination file does not exist, create link
+ echodebug "Creating $linkname symlink pointing to $sfile"
+ ln -s "$sfile" "$linkname" || return 1
+ elif [ -e "$linkname" ] && [ "$overwrite" -eq $BS_TRUE ]; then
+ # The destination exist and we're overwriting
+ echodebug "Overwriting $linkname symlink to point on $sfile"
+ ln -sf "$sfile" "$linkname" || return 1
+ elif [ -e "$linkname" ] && [ "$overwrite" -ne $BS_TRUE ]; then
+ echodebug "Not overwriting $linkname symlink to point on $sfile"
+ fi
+ done
+
+ return 0
+}
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __overwriteconfig()
+# DESCRIPTION: Simple function to overwrite master or minion config files.
+#----------------------------------------------------------------------------------------------------------------------
+__overwriteconfig() {
+ if [ $# -eq 2 ]; then
+ target=$1
+ json=$2
+ else
+ echoerror "Wrong number of arguments for __convert_json_to_yaml_str()"
+ echoinfo "USAGE: __convert_json_to_yaml_str <configfile> <jsonstring>"
+ exit 1
+ fi
+
+ # Make a tempfile to dump any python errors into.
+ if __check_command_exists mktemp; then
+ tempfile="$(mktemp /tmp/salt-config-XXXXXXXX 2>/dev/null)"
+
+ if [ -z "$tempfile" ]; then
+ echoerror "Failed to create temporary file in /tmp"
+ return 1
+ fi
+ else
+ tempfile="/tmp/salt-config-$$"
+ fi
+
+ # If python does not have yaml installed we're on Arch and should use python2
+ if python -c "import yaml" 2> /dev/null; then
+ good_python=python
+ else
+ good_python=python2
+ fi
+
+ # Convert json string to a yaml string and write it to config file. Output is dumped into tempfile.
+ $good_python -c "import json; import yaml; jsn=json.loads('$json'); yml=yaml.safe_dump(jsn, line_break='\n', default_flow_style=False); config_file=open('$target', 'w'); config_file.write(yml); config_file.close();" 2>$tempfile
+
+ # No python errors output to the tempfile
+ if [ ! -s "$tempfile" ]; then
+ rm -f "$tempfile"
+ return 0
+ fi
+
+ # Errors are present in the tempfile - let's expose them to the user.
+ fullerror=$(cat "$tempfile")
+ echodebug "$fullerror"
+ echoerror "Python error encountered. This is likely due to passing in a malformed JSON string. Please use -D to see stacktrace."
+
+ rm -f "$tempfile"
+
+ return 1
+
+}
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __check_services_systemd
+# DESCRIPTION: Return 0 or 1 in case the service is enabled or not
+# PARAMETERS: servicename
+#----------------------------------------------------------------------------------------------------------------------
+__check_services_systemd() {
+ if [ $# -eq 0 ]; then
+ echoerror "You need to pass a service name to check!"
+ exit 1
+ elif [ $# -ne 1 ]; then
+ echoerror "You need to pass a service name to check as the single argument to the function"
+ fi
+
+ servicename=$1
+ echodebug "Checking if service ${servicename} is enabled"
+
+ if [ "$(systemctl is-enabled "${servicename}")" = "enabled" ]; then
+ echodebug "Service ${servicename} is enabled"
+ return 0
+ else
+ echodebug "Service ${servicename} is NOT enabled"
+ return 1
+ fi
+} # ---------- end of function __check_services_systemd ----------
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __check_services_upstart
+# DESCRIPTION: Return 0 or 1 in case the service is enabled or not
+# PARAMETERS: servicename
+#----------------------------------------------------------------------------------------------------------------------
+__check_services_upstart() {
+ if [ $# -eq 0 ]; then
+ echoerror "You need to pass a service name to check!"
+ exit 1
+ elif [ $# -ne 1 ]; then
+ echoerror "You need to pass a service name to check as the single argument to the function"
+ fi
+
+ servicename=$1
+ echodebug "Checking if service ${servicename} is enabled"
+
+ # Check if service is enabled to start at boot
+ initctl list | grep "${servicename}" > /dev/null 2>&1
+
+ if [ $? -eq 0 ]; then
+ echodebug "Service ${servicename} is enabled"
+ return 0
+ else
+ echodebug "Service ${servicename} is NOT enabled"
+ return 1
+ fi
+} # ---------- end of function __check_services_upstart ----------
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __check_services_sysvinit
+# DESCRIPTION: Return 0 or 1 in case the service is enabled or not
+# PARAMETERS: servicename
+#----------------------------------------------------------------------------------------------------------------------
+__check_services_sysvinit() {
+ if [ $# -eq 0 ]; then
+ echoerror "You need to pass a service name to check!"
+ exit 1
+ elif [ $# -ne 1 ]; then
+ echoerror "You need to pass a service name to check as the single argument to the function"
+ fi
+
+ servicename=$1
+ echodebug "Checking if service ${servicename} is enabled"
+
+ if [ "$(LC_ALL=C /sbin/chkconfig --list | grep "\<${servicename}\>" | grep '[2-5]:on')" != "" ]; then
+ echodebug "Service ${servicename} is enabled"
+ return 0
+ else
+ echodebug "Service ${servicename} is NOT enabled"
+ return 1
+ fi
+} # ---------- end of function __check_services_sysvinit ----------
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __check_services_debian
+# DESCRIPTION: Return 0 or 1 in case the service is enabled or not
+# PARAMETERS: servicename
+#----------------------------------------------------------------------------------------------------------------------
+__check_services_debian() {
+ if [ $# -eq 0 ]; then
+ echoerror "You need to pass a service name to check!"
+ exit 1
+ elif [ $# -ne 1 ]; then
+ echoerror "You need to pass a service name to check as the single argument to the function"
+ fi
+
+ servicename=$1
+ echodebug "Checking if service ${servicename} is enabled"
+
+ # Check if the service is going to be started at any runlevel, fixes bootstrap in container (Docker, LXC)
+ if ls /etc/rc?.d/S*"${servicename}" >/dev/null 2>&1; then
+ echodebug "Service ${servicename} is enabled"
+ return 0
+ else
+ echodebug "Service ${servicename} is NOT enabled"
+ return 1
+ fi
+} # ---------- end of function __check_services_debian ----------
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __check_services_openbsd
+# DESCRIPTION: Return 0 or 1 in case the service is enabled or not
+# PARAMETERS: servicename
+#----------------------------------------------------------------------------------------------------------------------
+__check_services_openbsd() {
+ if [ $# -eq 0 ]; then
+ echoerror "You need to pass a service name to check!"
+ exit 1
+ elif [ $# -ne 1 ]; then
+ echoerror "You need to pass a service name to check as the single argument to the function"
+ fi
+
+ servicename=$1
+ echodebug "Checking if service ${servicename} is enabled"
+
+ # shellcheck disable=SC2086,SC2046,SC2144
+ if rcctl get ${servicename} status; then
+ echodebug "Service ${servicename} is enabled"
+ return 0
+ else
+ echodebug "Service ${servicename} is NOT enabled"
+ return 1
+ fi
+} # ---------- end of function __check_services_openbsd ----------
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __check_services_alpine
+# DESCRIPTION: Return 0 or 1 in case the service is enabled or not
+# PARAMETERS: servicename
+#----------------------------------------------------------------------------------------------------------------------
+__check_services_alpine() {
+ if [ $# -eq 0 ]; then
+ echoerror "You need to pass a service name to check!"
+ exit 1
+ elif [ $# -ne 1 ]; then
+ echoerror "You need to pass a service name to check as the single argument to the function"
+ fi
+
+ servicename=$1
+ echodebug "Checking if service ${servicename} is enabled"
+
+ # shellcheck disable=SC2086,SC2046,SC2144
+ if rc-service ${servicename} status; then
+ echodebug "Service ${servicename} is enabled"
+ return 0
+ else
+ echodebug "Service ${servicename} is NOT enabled"
+ return 1
+ fi
+} # ---------- end of function __check_services_openbsd ----------
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __create_virtualenv
+# DESCRIPTION: Return 0 or 1 depending on successful creation of virtualenv
+#----------------------------------------------------------------------------------------------------------------------
+__create_virtualenv() {
+ if [ ! -d "$_VIRTUALENV_DIR" ]; then
+ echoinfo "Creating virtualenv ${_VIRTUALENV_DIR}"
+ if [ $_PIP_ALL -eq $BS_TRUE ]; then
+ virtualenv --no-site-packages "${_VIRTUALENV_DIR}" || return 1
+ else
+ virtualenv --system-site-packages "${_VIRTUALENV_DIR}" || return 1
+ fi
+ fi
+ return 0
+} # ---------- end of function __create_virtualenv ----------
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __activate_virtualenv
+# DESCRIPTION: Return 0 or 1 depending on successful activation of virtualenv
+#----------------------------------------------------------------------------------------------------------------------
+__activate_virtualenv() {
+ set +o nounset
+ # Is virtualenv empty
+ if [ -z "$VIRTUAL_ENV" ]; then
+ __create_virtualenv || return 1
+ # shellcheck source=/dev/null
+ . "${_VIRTUALENV_DIR}/bin/activate" || return 1
+ echoinfo "Activated virtualenv ${_VIRTUALENV_DIR}"
+ fi
+ set -o nounset
+ return 0
+} # ---------- end of function __activate_virtualenv ----------
+
+
+#--- FUNCTION -------------------------------------------------------------------------------------------------------
+# NAME: __install_pip_deps
+# DESCRIPTION: Return 0 or 1 if successfully able to install pip packages via requirements file
+# PARAMETERS: requirements_file
+#----------------------------------------------------------------------------------------------------------------------
+__install_pip_deps() {
+ # Install virtualenv to system pip before activating virtualenv if thats going to be used
+ # We assume pip pkg is installed since that is distro specific
+ if [ "$_VIRTUALENV_DIR" != "null" ]; then
+ if ! __check_command_exists pip; then
+ echoerror "Pip not installed: required for -a installs"
+ exit 1
+ fi
+ pip install -U virtualenv
+ __activate_virtualenv || return 1
+ else
+ echoerror "Must have virtualenv dir specified for -a installs"
+ fi
+
+ requirements_file=$1
+ if [ ! -f "${requirements_file}" ]; then
+ echoerror "Requirements file: ${requirements_file} cannot be found, needed for -a (pip pkg) installs"
+ exit 1
+ fi
+
+ __PIP_PACKAGES=''
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
+ # shellcheck disable=SC2089
+ __PIP_PACKAGES="${__PIP_PACKAGES} 'apache-libcloud>=$_LIBCLOUD_MIN_VERSION'"
+ fi
+
+ # shellcheck disable=SC2086,SC2090
+ pip install -U -r ${requirements_file} ${__PIP_PACKAGES}
+} # ---------- end of function __install_pip_deps ----------
+
+
+#######################################################################################################################
+#
+# Distribution install functions
+#
+# In order to install salt for a distribution you need to define:
+#
+# To Install Dependencies, which is required, one of:
+# 1. install_<distro>_<major_version>_<install_type>_deps
+# 2. install_<distro>_<major_version>_<minor_version>_<install_type>_deps
+# 3. install_<distro>_<major_version>_deps
+# 4 install_<distro>_<major_version>_<minor_version>_deps
+# 5. install_<distro>_<install_type>_deps
+# 6. install_<distro>_deps
+#
+# Optionally, define a salt configuration function, which will be called if
+# the -c (config-dir) option is passed. One of:
+# 1. config_<distro>_<major_version>_<install_type>_salt
+# 2. config_<distro>_<major_version>_<minor_version>_<install_type>_salt
+# 3. config_<distro>_<major_version>_salt
+# 4 config_<distro>_<major_version>_<minor_version>_salt
+# 5. config_<distro>_<install_type>_salt
+# 6. config_<distro>_salt
+# 7. config_salt [THIS ONE IS ALREADY DEFINED AS THE DEFAULT]
+#
+# Optionally, define a salt master pre-seed function, which will be called if
+# the -k (pre-seed master keys) option is passed. One of:
+# 1. preseed_<distro>_<major_version>_<install_type>_master
+# 2. preseed_<distro>_<major_version>_<minor_version>_<install_type>_master
+# 3. preseed_<distro>_<major_version>_master
+# 4 preseed_<distro>_<major_version>_<minor_version>_master
+# 5. preseed_<distro>_<install_type>_master
+# 6. preseed_<distro>_master
+# 7. preseed_master [THIS ONE IS ALREADY DEFINED AS THE DEFAULT]
+#
+# To install salt, which, of course, is required, one of:
+# 1. install_<distro>_<major_version>_<install_type>
+# 2. install_<distro>_<major_version>_<minor_version>_<install_type>
+# 3. install_<distro>_<install_type>
+#
+# Optionally, define a post install function, one of:
+# 1. install_<distro>_<major_version>_<install_type>_post
+# 2. install_<distro>_<major_version>_<minor_version>_<install_type>_post
+# 3. install_<distro>_<major_version>_post
+# 4 install_<distro>_<major_version>_<minor_version>_post
+# 5. install_<distro>_<install_type>_post
+# 6. install_<distro>_post
+#
+# Optionally, define a start daemons function, one of:
+# 1. install_<distro>_<major_version>_<install_type>_restart_daemons
+# 2. install_<distro>_<major_version>_<minor_version>_<install_type>_restart_daemons
+# 3. install_<distro>_<major_version>_restart_daemons
+# 4 install_<distro>_<major_version>_<minor_version>_restart_daemons
+# 5. install_<distro>_<install_type>_restart_daemons
+# 6. install_<distro>_restart_daemons
+#
+# NOTE: The start daemons function should be able to restart any daemons
+# which are running, or start if they're not running.
+#
+# Optionally, define a daemons running function, one of:
+# 1. daemons_running_<distro>_<major_version>_<install_type>
+# 2. daemons_running_<distro>_<major_version>_<minor_version>_<install_type>
+# 3. daemons_running_<distro>_<major_version>
+# 4 daemons_running_<distro>_<major_version>_<minor_version>
+# 5. daemons_running_<distro>_<install_type>
+# 6. daemons_running_<distro>
+# 7. daemons_running [THIS ONE IS ALREADY DEFINED AS THE DEFAULT]
+#
+# Optionally, check enabled Services:
+# 1. install_<distro>_<major_version>_<install_type>_check_services
+# 2. install_<distro>_<major_version>_<minor_version>_<install_type>_check_services
+# 3. install_<distro>_<major_version>_check_services
+# 4 install_<distro>_<major_version>_<minor_version>_check_services
+# 5. install_<distro>_<install_type>_check_services
+# 6. install_<distro>_check_services
+#
+#######################################################################################################################
+
+
+#######################################################################################################################
+#
+# Ubuntu Install Functions
+#
+__enable_universe_repository() {
+ if [ "$(grep -R universe /etc/apt/sources.list /etc/apt/sources.list.d/ | grep -v '#')" != "" ]; then
+ # The universe repository is already enabled
+ return 0
+ fi
+
+ echodebug "Enabling the universe repository"
+
+ add-apt-repository -y "deb http://archive.ubuntu.com/ubuntu $(lsb_release -sc) universe" || return 1
+
+ return 0
+}
+
+install_ubuntu_deps() {
+ if [ "$DISTRO_MAJOR_VERSION" -gt 12 ]; then
+ # Above Ubuntu 12.04 add-apt-repository is in a different package
+ __apt_get_install_noinput software-properties-common || return 1
+ else
+ __apt_get_install_noinput python-software-properties || return 1
+ fi
+
+ if [ $_DISABLE_REPOS -eq $BS_FALSE ]; then
+ __enable_universe_repository || return 1
+
+ # Versions starting with 2015.5.6 and 2015.8.1 are hosted at repo.saltstack.com
+ if [ "$(echo "$STABLE_REV" | egrep '^(2015\.5|2015\.8|2016\.3|2016\.11|latest|archive\/)')" = "" ]; then
+ if [ "$DISTRO_MAJOR_VERSION" -lt 14 ]; then
+ echoinfo "Installing Python Requests/Chardet from Chris Lea's PPA repository"
+ add-apt-repository -y "ppa:chris-lea/python-requests" || return 1
+ add-apt-repository -y "ppa:chris-lea/python-chardet" || return 1
+ add-apt-repository -y "ppa:chris-lea/python-urllib3" || return 1
+ add-apt-repository -y "ppa:chris-lea/python-crypto" || return 1
+ fi
+
+ fi
+
+ apt-get update
+ fi
+
+ # Minimal systems might not have upstart installed, install it
+ __PACKAGES="upstart"
+
+ if [ "$DISTRO_MAJOR_VERSION" -ge 16 ]; then
+ __PACKAGES="${__PACKAGES} python2.7"
+ fi
+ if [ "$_VIRTUALENV_DIR" != "null" ]; then
+ __PACKAGES="${__PACKAGES} python-virtualenv"
+ fi
+ # Need python-apt for managing packages via Salt
+ __PACKAGES="${__PACKAGES} python-apt"
+
+ # requests is still used by many salt modules
+ __PACKAGES="${__PACKAGES} python-requests"
+
+ # YAML module is used for generating custom master/minion configs
+ __PACKAGES="${__PACKAGES} python-yaml"
+
+ # Additionally install procps and pciutils which allows for Docker bootstraps. See 366#issuecomment-39666813
+ __PACKAGES="${__PACKAGES} procps pciutils"
+
+ # shellcheck disable=SC2086,SC2090
+ __apt_get_install_noinput ${__PACKAGES} || return 1
+
+ if [ "${_EXTRA_PACKAGES}" != "" ]; then
+ echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}"
+ # shellcheck disable=SC2086
+ __apt_get_install_noinput ${_EXTRA_PACKAGES} || return 1
+ fi
+
+ return 0
+}
+
+install_ubuntu_stable_deps() {
+ if [ "${_SLEEP}" -eq "${__DEFAULT_SLEEP}" ] && [ "$DISTRO_MAJOR_VERSION" -lt 16 ]; then
+ # The user did not pass a custom sleep value as an argument, let's increase the default value
+ echodebug "On Ubuntu systems we increase the default sleep value to 10."
+ echodebug "See https://github.com/saltstack/salt/issues/12248 for more info."
+ _SLEEP=10
+ fi
+
+ if [ $_START_DAEMONS -eq $BS_FALSE ]; then
+ echowarn "Not starting daemons on Debian based distributions is not working mostly because starting them is the default behaviour."
+ fi
+
+ # No user interaction, libc6 restart services for example
+ export DEBIAN_FRONTEND=noninteractive
+
+ apt-get update
+
+ if [ "${_UPGRADE_SYS}" -eq $BS_TRUE ]; then
+ if [ "${_INSECURE_DL}" -eq $BS_TRUE ]; then
+ __apt_get_install_noinput --allow-unauthenticated debian-archive-keyring &&
+ apt-key update && apt-get update
+ fi
+
+ __apt_get_upgrade_noinput || return 1
+ fi
+
+ if [ ${_DISABLE_REPOS} -eq $BS_FALSE ]; then
+ __get_dpkg_architecture || return 1
+ __REPO_ARCH="$DPKG_ARCHITECTURE"
+
+ if [ "$DPKG_ARCHITECTURE" = "i386" ]; then
+ echoerror "repo.saltstack.com likely doesn't have all required 32-bit packages for Ubuntu $DISTRO_MAJOR_VERSION (yet?)."
+
+ # amd64 is just a part of repository URI, 32-bit pkgs are hosted under the same location
+ __REPO_ARCH="amd64"
+ elif [ "$DPKG_ARCHITECTURE" != "amd64" ]; then
+ echoerror "repo.saltstack.com doesn't have packages for your system architecture: $DPKG_ARCHITECTURE."
+ if [ "$ITYPE" != "git" ]; then
+ echoerror "You can try git installation mode, i.e.: sh ${__ScriptName} git v2016.3.1"
+ exit 1
+ fi
+ fi
+
+ # Versions starting with 2015.5.6, 2015.8.1 and 2016.3.0 are hosted at repo.saltstack.com
+ if [ "$(echo "$STABLE_REV" | egrep '^(2015\.5|2015\.8|2016\.3|2016\.11|latest|archive\/)')" != "" ]; then
+ # Workaround for latest non-LTS ubuntu
+ if [ "$DISTRO_VERSION" = "16.10" ]; then
+ echowarn "Non-LTS Ubuntu detected, but stable packages requested. Trying packages from latest LTS release. You may experience problems."
+ UBUNTU_VERSION=16.04
+ UBUNTU_CODENAME=xenial
+ else
+ UBUNTU_VERSION=$DISTRO_VERSION
+ UBUNTU_CODENAME=$DISTRO_CODENAME
+ fi
+
+ # SaltStack's stable Ubuntu repository:
+ SALTSTACK_UBUNTU_URL="${HTTP_VAL}://repo.saltstack.com/apt/ubuntu/${UBUNTU_VERSION}/${__REPO_ARCH}/${STABLE_REV}"
+ echo "deb $SALTSTACK_UBUNTU_URL $UBUNTU_CODENAME main" > /etc/apt/sources.list.d/saltstack.list
+
+ # Make sure https transport is available
+ if [ "$HTTP_VAL" = "https" ] ; then
+ __apt_get_install_noinput apt-transport-https ca-certificates || return 1
+ fi
+
+ __apt_key_fetch "$SALTSTACK_UBUNTU_URL/SALTSTACK-GPG-KEY.pub" || return 1
+ else
+ # Alternate PPAs: salt16, salt17, salt2014-1, salt2014-7
+ if [ ! "$(echo "$STABLE_REV" | egrep '^(1\.6|1\.7)$')" = "" ]; then
+ STABLE_PPA="saltstack/salt$(echo "$STABLE_REV" | tr -d .)"
+ elif [ ! "$(echo "$STABLE_REV" | egrep '^(2014\.1|2014\.7)$')" = "" ]; then
+ STABLE_PPA="saltstack/salt$(echo "$STABLE_REV" | tr . -)"
+ else
+ STABLE_PPA="saltstack/salt"
+ fi
+
+ add-apt-repository -y "ppa:$STABLE_PPA" || return 1
+ fi
+
+ apt-get update
+ fi
+
+ install_ubuntu_deps || return 1
+}
+
+install_ubuntu_daily_deps() {
+ install_ubuntu_stable_deps || return 1
+
+ if [ "$DISTRO_MAJOR_VERSION" -gt 12 ]; then
+ __apt_get_install_noinput software-properties-common || return 1
+ else
+ # Ubuntu 12.04 needs python-software-properties to get add-apt-repository binary
+ __apt_get_install_noinput python-software-properties || return 1
+ fi
+
+ if [ $_DISABLE_REPOS -eq $BS_FALSE ]; then
+ __enable_universe_repository || return 1
+
+ add-apt-repository -y ppa:saltstack/salt-daily || return 1
+ apt-get update
+ fi
+
+ if [ "$_UPGRADE_SYS" -eq $BS_TRUE ]; then
+ __apt_get_upgrade_noinput || return 1
+ fi
+
+ return 0
+}
+
+install_ubuntu_git_deps() {
+ apt-get update
+
+ if ! __check_command_exists git; then
+ __apt_get_install_noinput git-core || return 1
+ fi
+
+ if [ "$_INSECURE_DL" -eq $BS_FALSE ] && [ "${_SALT_REPO_URL%%://*}" = "https" ]; then
+ __apt_get_install_noinput ca-certificates
+ fi
+
+ __git_clone_and_checkout || return 1
+
+ __PACKAGES=""
+
+ # See how we are installing packages
+ if [ "${_PIP_ALL}" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} python-dev swig libssl-dev libzmq3 libzmq3-dev"
+
+ if ! __check_command_exists pip; then
+ __PACKAGES="${__PACKAGES} python-setuptools python-pip"
+ fi
+
+ # Get just the apt packages that are required to build all the pythons
+ # shellcheck disable=SC2086
+ __apt_get_install_noinput ${__PACKAGES} || return 1
+ # Install the pythons from requirements (only zmq for now)
+ __install_pip_deps "${_SALT_GIT_CHECKOUT_DIR}/requirements/zeromq.txt" || return 1
+ else
+ install_ubuntu_stable_deps || return 1
+
+ __PACKAGES="${__PACKAGES} python-crypto python-jinja2 python-msgpack python-requests"
+ __PACKAGES="${__PACKAGES} python-tornado python-yaml python-zmq"
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
+ # Install python-libcloud if asked to
+ __PACKAGES="${__PACKAGES} python-libcloud"
+ fi
+
+ # shellcheck disable=SC2086
+ __apt_get_install_noinput ${__PACKAGES} || return 1
+ fi
+
+ # Let's trigger config_salt()
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/"
+ CONFIG_SALT_FUNC="config_salt"
+ fi
+
+ return 0
+}
+
+install_ubuntu_stable() {
+ __PACKAGES=""
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ];then
+ __PACKAGES="${__PACKAGES} salt-cloud"
+ fi
+ if [ "$_INSTALL_MASTER" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} salt-master"
+ fi
+ if [ "$_INSTALL_MINION" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} salt-minion"
+ fi
+ if [ "$_INSTALL_SYNDIC" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} salt-syndic"
+ fi
+
+ # shellcheck disable=SC2086
+ __apt_get_install_noinput ${__PACKAGES} || return 1
+ return 0
+}
+
+install_ubuntu_daily() {
+ install_ubuntu_stable || return 1
+ return 0
+}
+
+install_ubuntu_git() {
+ # Activate virtualenv before install
+ if [ "${_VIRTUALENV_DIR}" != "null" ]; then
+ __activate_virtualenv || return 1
+ fi
+
+ if [ -f "${_SALT_GIT_CHECKOUT_DIR}/salt/syspaths.py" ]; then
+ python setup.py --salt-config-dir="$_SALT_ETC_DIR" --salt-cache-dir="${_SALT_CACHE_DIR}" ${SETUP_PY_INSTALL_ARGS} install --install-layout=deb || return 1
+ else
+ python setup.py ${SETUP_PY_INSTALL_ARGS} install --install-layout=deb || return 1
+ fi
+ return 0
+}
+
+install_ubuntu_stable_post() {
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -f /bin/systemctl ]; then
+ # Using systemd
+ /bin/systemctl is-enabled salt-$fname.service > /dev/null 2>&1 || (
+ /bin/systemctl preset salt-$fname.service > /dev/null 2>&1 &&
+ /bin/systemctl enable salt-$fname.service > /dev/null 2>&1
+ )
+ sleep 0.1
+ /bin/systemctl daemon-reload
+ elif [ -f /etc/init.d/salt-$fname ]; then
+ update-rc.d salt-$fname defaults
+ fi
+ done
+}
+
+install_ubuntu_git_post() {
+ for fname in api master minion syndic; do
+ # Skip if not meant to be installed
+ [ $fname = "api" ] && \
+ ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || ! __check_command_exists "salt-${fname}") && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -f /bin/systemctl ] && [ "$DISTRO_MAJOR_VERSION" -ge 16 ]; then
+ __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/deb/salt-${fname}.service" "/lib/systemd/system/salt-${fname}.service"
+
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ systemctl is-enabled salt-$fname.service || (systemctl preset salt-$fname.service && systemctl enable salt-$fname.service)
+ sleep 0.1
+ systemctl daemon-reload
+ elif [ -f /sbin/initctl ]; then
+ _upstart_conf="/etc/init/salt-$fname.conf"
+ # We have upstart support
+ echodebug "There's upstart support"
+ if [ ! -f $_upstart_conf ]; then
+ # upstart does not know about our service, let's copy the proper file
+ echowarn "Upstart does not appear to know about salt-$fname"
+ echodebug "Copying ${_SALT_GIT_CHECKOUT_DIR}/pkg/salt-$fname.upstart to $_upstart_conf"
+ __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/salt-${fname}.upstart" "$_upstart_conf"
+ # Set service to know about virtualenv
+ if [ "${_VIRTUALENV_DIR}" != "null" ]; then
+ echo "SALT_USE_VIRTUALENV=${_VIRTUALENV_DIR}" > /etc/default/salt-${fname}
+ fi
+ /sbin/initctl reload-configuration || return 1
+ fi
+ # No upstart support in Ubuntu!?
+ elif [ -f "${_SALT_GIT_CHECKOUT_DIR}/debian/salt-${fname}.init" ]; then
+ echodebug "There's NO upstart support!?"
+ echodebug "Copying ${_SALT_GIT_CHECKOUT_DIR}/debian/salt-${fname}.init to /etc/init.d/salt-$fname"
+ __copyfile "${_SALT_GIT_CHECKOUT_DIR}/debian/salt-${fname}.init" "/etc/init.d/salt-$fname"
+ chmod +x /etc/init.d/salt-$fname
+
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ update-rc.d salt-$fname defaults
+ else
+ echoerror "Neither upstart nor init.d was setup for salt-$fname"
+ fi
+ done
+}
+
+install_ubuntu_restart_daemons() {
+ [ $_START_DAEMONS -eq $BS_FALSE ] && return
+
+ # Ensure upstart configs / systemd units are loaded
+ if [ -f /bin/systemctl ] && [ "$DISTRO_MAJOR_VERSION" -ge 16 ]; then
+ systemctl daemon-reload
+ elif [ -f /sbin/initctl ]; then
+ /sbin/initctl reload-configuration
+ fi
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -f /bin/systemctl ] && [ "$DISTRO_MAJOR_VERSION" -ge 16 ]; then
+ echodebug "There's systemd support while checking salt-$fname"
+ systemctl stop salt-$fname > /dev/null 2>&1
+ systemctl start salt-$fname.service
+ [ $? -eq 0 ] && continue
+ # We failed to start the service, let's test the SysV code below
+ echodebug "Failed to start salt-$fname using systemd"
+ fi
+
+ if [ -f /sbin/initctl ]; then
+ echodebug "There's upstart support while checking salt-$fname"
+
+ status salt-$fname 2>/dev/null | grep -q running
+ if [ $? -eq 0 ]; then
+ stop salt-$fname || (echodebug "Failed to stop salt-$fname" && return 1)
+ fi
+
+ start salt-$fname
+ [ $? -eq 0 ] && continue
+ # We failed to start the service, let's test the SysV code below
+ echodebug "Failed to start salt-$fname using Upstart"
+ fi
+
+ if [ ! -f /etc/init.d/salt-$fname ]; then
+ echoerror "No init.d support for salt-$fname was found"
+ return 1
+ fi
+
+ /etc/init.d/salt-$fname stop > /dev/null 2>&1
+ /etc/init.d/salt-$fname start
+ done
+ return 0
+}
+
+install_ubuntu_check_services() {
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -f /bin/systemctl ] && [ "$DISTRO_MAJOR_VERSION" -ge 16 ]; then
+ __check_services_systemd salt-$fname || return 1
+ elif [ -f /sbin/initctl ] && [ -f /etc/init/salt-${fname}.conf ]; then
+ __check_services_upstart salt-$fname || return 1
+ elif [ -f /etc/init.d/salt-$fname ]; then
+ __check_services_debian salt-$fname || return 1
+ fi
+ done
+
+ return 0
+}
+#
+# End of Ubuntu Install Functions
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# Debian Install Functions
+#
+install_debian_deps() {
+ if [ $_START_DAEMONS -eq $BS_FALSE ]; then
+ echowarn "Not starting daemons on Debian based distributions is not working mostly because starting them is the default behaviour."
+ fi
+
+ # No user interaction, libc6 restart services for example
+ export DEBIAN_FRONTEND=noninteractive
+
+ apt-get update
+
+ if [ "${_UPGRADE_SYS}" -eq $BS_TRUE ]; then
+ # Try to update GPG keys first if allowed
+ if [ "${_INSECURE_DL}" -eq $BS_TRUE ]; then
+ __apt_get_install_noinput --allow-unauthenticated debian-archive-keyring &&
+ apt-key update && apt-get update
+ fi
+
+ __apt_get_upgrade_noinput || return 1
+ fi
+
+ # Install procps and pciutils which allows for Docker bootstraps. See #366#issuecomment-39666813
+ __PACKAGES="procps pciutils"
+ __PIP_PACKAGES=""
+
+ # YAML module is used for generating custom master/minion configs
+ __PACKAGES="${__PACKAGES} python-yaml"
+
+ # shellcheck disable=SC2086
+ __apt_get_install_noinput ${__PACKAGES} || return 1
+
+ if [ "${_EXTRA_PACKAGES}" != "" ]; then
+ echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}"
+ # shellcheck disable=SC2086
+ __apt_get_install_noinput ${_EXTRA_PACKAGES} || return 1
+ fi
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
+ # shellcheck disable=SC2089
+ __PIP_PACKAGES="${__PIP_PACKAGES} 'apache-libcloud>=$_LIBCLOUD_MIN_VERSION'"
+ fi
+
+ if [ "${__PIP_PACKAGES}" != "" ]; then
+ # shellcheck disable=SC2086,SC2090
+ pip install -U ${__PIP_PACKAGES} || return 1
+ fi
+
+ return 0
+}
+
+install_debian_7_deps() {
+ if [ $_START_DAEMONS -eq $BS_FALSE ]; then
+ echowarn "Not starting daemons on Debian based distributions is not working mostly because starting them is the default behaviour."
+ fi
+
+ # No user interaction, libc6 restart services for example
+ export DEBIAN_FRONTEND=noninteractive
+
+ apt-get update
+
+ if [ "${_UPGRADE_SYS}" -eq $BS_TRUE ]; then
+ # Try to update GPG keys first if allowed
+ if [ "${_INSECURE_DL}" -eq $BS_TRUE ]; then
+ __apt_get_install_noinput --allow-unauthenticated debian-archive-keyring &&
+ apt-key update && apt-get update
+ fi
+
+ __apt_get_upgrade_noinput || return 1
+ fi
+
+ if [ "${_DISABLE_REPOS}" -eq $BS_FALSE ]; then
+ __get_dpkg_architecture || return 1
+
+ __REPO_ARCH="$DPKG_ARCHITECTURE"
+
+ if [ "$DPKG_ARCHITECTURE" = "i386" ]; then
+ echoerror "repo.saltstack.com likely doesn't have all required 32-bit packages for Debian $DISTRO_MAJOR_VERSION (yet?)."
+
+ if [ "$ITYPE" != "git" ]; then
+ echoerror "You can try git installation mode, i.e.: sh ${__ScriptName} git v2016.3.1"
+ fi
+
+ # amd64 is just a part of repository URI, 32-bit pkgs are hosted under the same location
+ __REPO_ARCH="amd64"
+ elif [ "$DPKG_ARCHITECTURE" != "amd64" ]; then
+ echoerror "repo.saltstack.com doesn't have packages for your system architecture: $DPKG_ARCHITECTURE."
+ exit 1
+ fi
+
+ # Versions starting with 2015.8.7 and 2016.3.0 are hosted at repo.saltstack.com
+ if [ "$(echo "$STABLE_REV" | egrep '^(2015\.8|2016\.3|2016\.11|latest|archive\/201[5-6]\.)')" != "" ]; then
+ # amd64 is just a part of repository URI, 32-bit pkgs are hosted under the same location
+ SALTSTACK_DEBIAN_URL="${HTTP_VAL}://repo.saltstack.com/apt/debian/${DISTRO_MAJOR_VERSION}/${__REPO_ARCH}/${STABLE_REV}"
+ echo "deb $SALTSTACK_DEBIAN_URL wheezy main" > "/etc/apt/sources.list.d/saltstack.list"
+
+ if [ "$HTTP_VAL" = "https" ] ; then
+ __apt_get_install_noinput apt-transport-https ca-certificates || return 1
+ fi
+
+ __apt_key_fetch "$SALTSTACK_DEBIAN_URL/SALTSTACK-GPG-KEY.pub" || return 1
+ elif [ -n "$STABLE_REV" ]; then
+ echoerror "Installation of Salt ${STABLE_REV#*/} packages not supported by ${__ScriptName} ${__ScriptVersion} on Debian $DISTRO_MAJOR_VERSION."
+
+ return 1
+ fi
+
+ apt-get update
+ else
+ echowarn "Packages from repo.saltstack.com are required to install Salt version 2015.8 or higher on Debian $DISTRO_MAJOR_VERSION."
+ fi
+
+ # Additionally install procps and pciutils which allows for Docker bootstraps. See 366#issuecomment-39666813
+ __PACKAGES='procps pciutils'
+
+ # YAML module is used for generating custom master/minion configs
+ __PACKAGES="${__PACKAGES} python-yaml"
+
+ # shellcheck disable=SC2086
+ __apt_get_install_noinput ${__PACKAGES} || return 1
+
+ if [ "${_EXTRA_PACKAGES}" != "" ]; then
+ echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}"
+ # shellcheck disable=SC2086
+ __apt_get_install_noinput ${_EXTRA_PACKAGES} || return 1
+ fi
+
+ return 0
+}
+
+install_debian_8_deps() {
+ if [ $_START_DAEMONS -eq $BS_FALSE ]; then
+ echowarn "Not starting daemons on Debian based distributions is not working mostly because starting them is the default behaviour."
+ fi
+
+ # No user interaction, libc6 restart services for example
+ export DEBIAN_FRONTEND=noninteractive
+
+ apt-get update
+
+ if [ "${_UPGRADE_SYS}" -eq $BS_TRUE ]; then
+ # Try to update GPG keys first if allowed
+ if [ "${_INSECURE_DL}" -eq $BS_TRUE ]; then
+ __apt_get_install_noinput --allow-unauthenticated debian-archive-keyring &&
+ apt-key update && apt-get update
+ fi
+
+ __apt_get_upgrade_noinput || return 1
+ fi
+
+ if [ ${_DISABLE_REPOS} -eq $BS_FALSE ]; then
+ __get_dpkg_architecture || return 1
+
+ __REPO_ARCH="$DPKG_ARCHITECTURE"
+
+ if [ "$DPKG_ARCHITECTURE" = "i386" ]; then
+ echoerror "repo.saltstack.com likely doesn't have all required 32-bit packages for Debian $DISTRO_MAJOR_VERSION (yet?)."
+
+ if [ "$ITYPE" != "git" ]; then
+ echoerror "You can try git installation mode, i.e.: sh ${__ScriptName} git v2016.3.1"
+ fi
+
+ # amd64 is just a part of repository URI, 32-bit pkgs are hosted under the same location
+ __REPO_ARCH="amd64"
+ elif [ "$DPKG_ARCHITECTURE" != "amd64" ] && [ "$DPKG_ARCHITECTURE" != "armhf" ]; then
+ echoerror "repo.saltstack.com doesn't have packages for your system architecture: $DPKG_ARCHITECTURE."
+ echoerror "Try git installation mode with pip and disable SaltStack apt repository, for example:"
+ echoerror " sh ${__ScriptName} -r -P git v2016.3.1"
+
+ exit 1
+ fi
+
+ # Versions starting with 2015.5.6, 2015.8.1 and 2016.3.0 are hosted at repo.saltstack.com
+ if [ "$(echo "$STABLE_REV" | egrep '^(2015\.5|2015\.8|2016\.3|2016\.11|latest|archive\/201[5-6]\.)')" != "" ]; then
+ SALTSTACK_DEBIAN_URL="${HTTP_VAL}://repo.saltstack.com/apt/debian/${DISTRO_MAJOR_VERSION}/${__REPO_ARCH}/${STABLE_REV}"
+ echo "deb $SALTSTACK_DEBIAN_URL jessie main" > "/etc/apt/sources.list.d/saltstack.list"
+
+ if [ "$HTTP_VAL" = "https" ] ; then
+ __apt_get_install_noinput apt-transport-https ca-certificates || return 1
+ fi
+
+ __apt_key_fetch "$SALTSTACK_DEBIAN_URL/SALTSTACK-GPG-KEY.pub" || return 1
+ elif [ -n "$STABLE_REV" ]; then
+ echoerror "Installation of Salt ${STABLE_REV#*/} packages not supported by ${__ScriptName} ${__ScriptVersion} on Debian $DISTRO_MAJOR_VERSION."
+
+ return 1
+ fi
+
+ apt-get update
+ fi
+
+ # Additionally install procps and pciutils which allows for Docker bootstraps. See 366#issuecomment-39666813
+ __PACKAGES='procps pciutils'
+
+ # shellcheck disable=SC2086
+ __apt_get_install_noinput ${__PACKAGES} || return 1
+
+ # YAML module is used for generating custom master/minion configs
+ __PACKAGES="${__PACKAGES} python-yaml"
+
+ if [ "${_EXTRA_PACKAGES}" != "" ]; then
+ echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}"
+ # shellcheck disable=SC2086
+ __apt_get_install_noinput ${_EXTRA_PACKAGES} || return 1
+ fi
+
+ return 0
+}
+
+install_debian_git_deps() {
+ if ! __check_command_exists git; then
+ __apt_get_install_noinput git || return 1
+ fi
+
+ if [ "$_INSECURE_DL" -eq $BS_FALSE ] && [ "${_SALT_REPO_URL%%://*}" = "https" ]; then
+ __apt_get_install_noinput ca-certificates
+ fi
+
+ __git_clone_and_checkout || return 1
+
+ __PACKAGES="libzmq3 libzmq3-dev lsb-release python-apt python-backports.ssl-match-hostname python-crypto"
+ __PACKAGES="${__PACKAGES} python-jinja2 python-msgpack python-requests"
+ __PACKAGES="${__PACKAGES} python-tornado python-yaml python-zmq"
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
+ # Install python-libcloud if asked to
+ __PACKAGES="${__PACKAGES} python-libcloud"
+ fi
+
+ # shellcheck disable=SC2086
+ __apt_get_install_noinput ${__PACKAGES} || return 1
+
+ # Let's trigger config_salt()
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/"
+ CONFIG_SALT_FUNC="config_salt"
+ fi
+
+ return 0
+}
+
+install_debian_7_git_deps() {
+ install_debian_7_deps || return 1
+ install_debian_git_deps || return 1
+
+ return 0
+}
+
+install_debian_8_git_deps() {
+ install_debian_8_deps || return 1
+
+ if ! __check_command_exists git; then
+ __apt_get_install_noinput git || return 1
+ fi
+
+ if [ "$_INSECURE_DL" -eq $BS_FALSE ] && [ "${_SALT_REPO_URL%%://*}" = "https" ]; then
+ __apt_get_install_noinput ca-certificates
+ fi
+
+ __git_clone_and_checkout || return 1
+
+ __PACKAGES="libzmq3 libzmq3-dev lsb-release python-apt python-crypto python-jinja2 python-msgpack"
+ __PACKAGES="${__PACKAGES} python-requests python-systemd python-yaml python-zmq"
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
+ # Install python-libcloud if asked to
+ __PACKAGES="${__PACKAGES} python-libcloud"
+ fi
+
+ __PIP_PACKAGES=''
+ if (__check_pip_allowed >/dev/null 2>&1); then
+ __PIP_PACKAGES='tornado'
+ # Install development environment for building tornado Python module
+ __PACKAGES="${__PACKAGES} build-essential python-dev"
+
+ if ! __check_command_exists pip; then
+ __PACKAGES="${__PACKAGES} python-pip"
+ fi
+ # Attempt to configure backports repo on non-x86_64 system
+ elif [ $_DISABLE_REPOS -eq $BS_FALSE ] && [ "$DPKG_ARCHITECTURE" != "amd64" ]; then
+ # Check if Debian Backports repo already configured
+ if ! apt-cache policy | grep -q 'Debian Backports'; then
+ echo 'deb http://httpredir.debian.org/debian jessie-backports main' > \
+ /etc/apt/sources.list.d/backports.list
+ fi
+
+ apt-get update || return 1
+
+ # python-tornado package should be installed from backports repo
+ __PACKAGES="${__PACKAGES} python-backports.ssl-match-hostname python-tornado/jessie-backports"
+ else
+ __PACKAGES="${__PACKAGES} python-backports.ssl-match-hostname python-tornado"
+ fi
+
+ # shellcheck disable=SC2086
+ __apt_get_install_noinput ${__PACKAGES} || return 1
+
+ if [ "${__PIP_PACKAGES}" != "" ]; then
+ # shellcheck disable=SC2086,SC2090
+ pip install -U ${__PIP_PACKAGES} || return 1
+ fi
+
+ # Let's trigger config_salt()
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/"
+ CONFIG_SALT_FUNC="config_salt"
+ fi
+
+ return 0
+}
+
+install_debian_stable() {
+ __PACKAGES=""
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ];then
+ __PACKAGES="${__PACKAGES} salt-cloud"
+ fi
+ if [ "$_INSTALL_MASTER" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} salt-master"
+ fi
+ if [ "$_INSTALL_MINION" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} salt-minion"
+ fi
+ if [ "$_INSTALL_SYNDIC" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} salt-syndic"
+ fi
+
+ # shellcheck disable=SC2086
+ __apt_get_install_noinput ${__PACKAGES} || return 1
+
+ return 0
+}
+
+install_debian_7_stable() {
+ install_debian_stable || return 1
+ return 0
+}
+
+install_debian_8_stable() {
+ install_debian_stable || return 1
+ return 0
+}
+
+install_debian_git() {
+ if [ -f "${_SALT_GIT_CHECKOUT_DIR}/salt/syspaths.py" ]; then
+ python setup.py --salt-config-dir="$_SALT_ETC_DIR" --salt-cache-dir="${_SALT_CACHE_DIR}" ${SETUP_PY_INSTALL_ARGS} install --install-layout=deb || return 1
+ else
+ python setup.py ${SETUP_PY_INSTALL_ARGS} install --install-layout=deb || return 1
+ fi
+}
+
+install_debian_7_git() {
+ install_debian_git || return 1
+ return 0
+}
+
+install_debian_8_git() {
+ install_debian_git || return 1
+ return 0
+}
+
+install_debian_git_post() {
+ for fname in api master minion syndic; do
+ # Skip if not meant to be installed
+ [ "$fname" = "api" ] && \
+ ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || ! __check_command_exists "salt-${fname}") && continue
+ [ "$fname" = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ "$fname" = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ "$fname" = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ # Configure SystemD for Debian 8 "Jessie" and later
+ if [ -f /bin/systemctl ]; then
+ if [ ! -f /lib/systemd/system/salt-${fname}.service ] || \
+ ([ -f /lib/systemd/system/salt-${fname}.service ] && [ $_FORCE_OVERWRITE -eq $BS_TRUE ]); then
+ if [ -f "${_SALT_GIT_CHECKOUT_DIR}/pkg/deb/salt-${fname}.service" ]; then
+ __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/deb/salt-${fname}.service" /lib/systemd/system
+ __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/deb/salt-${fname}.environment" "/etc/default/salt-${fname}"
+ else
+ # workaround before adding Debian-specific unit files to the Salt main repo
+ __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/salt-${fname}.service" /lib/systemd/system
+ sed -i -e '/^Type/ s/notify/simple/' /lib/systemd/system/salt-${fname}.service
+ fi
+ fi
+
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ "$fname" = "api" ] && continue
+
+ /bin/systemctl enable "salt-${fname}.service"
+ SYSTEMD_RELOAD=$BS_TRUE
+
+ # Install initscripts for Debian 7 "Wheezy"
+ elif [ ! -f "/etc/init.d/salt-$fname" ] || \
+ ([ -f "/etc/init.d/salt-$fname" ] && [ "$_FORCE_OVERWRITE" -eq $BS_TRUE ]); then
+ if [ -f "${_SALT_GIT_CHECKOUT_DIR}/pkg/deb/salt-$fname.init" ]; then
+ __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/deb/salt-${fname}.init" "/etc/init.d/salt-${fname}"
+ __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/deb/salt-${fname}.environment" "/etc/default/salt-${fname}"
+ else
+ # Make sure wget is available
+ __check_command_exists wget || __apt_get_install_noinput wget || return 1
+ __fetch_url "/etc/init.d/salt-${fname}" "${HTTP_VAL}://anonscm.debian.org/cgit/pkg-salt/salt.git/plain/debian/salt-${fname}.init"
+ fi
+
+ if [ ! -f "/etc/init.d/salt-${fname}" ]; then
+ echowarn "The init script for salt-${fname} was not found, skipping it..."
+ continue
+ fi
+
+ chmod +x "/etc/init.d/salt-${fname}"
+
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ "$fname" = "api" ] && continue
+
+ update-rc.d "salt-${fname}" defaults
+ fi
+ done
+}
+
+install_debian_restart_daemons() {
+ [ "$_START_DAEMONS" -eq $BS_FALSE ] && return 0
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -f /bin/systemctl ]; then
+ # Debian 8 uses systemd
+ /bin/systemctl stop salt-$fname > /dev/null 2>&1
+ /bin/systemctl start salt-$fname.service
+ elif [ -f /etc/init.d/salt-$fname ]; then
+ # Still in SysV init
+ /etc/init.d/salt-$fname stop > /dev/null 2>&1
+ /etc/init.d/salt-$fname start
+ fi
+ done
+}
+
+install_debian_check_services() {
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -f /bin/systemctl ]; then
+ __check_services_systemd salt-$fname || return 1
+ elif [ -f /etc/init.d/salt-$fname ]; then
+ __check_services_debian salt-$fname || return 1
+ fi
+ done
+ return 0
+}
+#
+# Ended Debian Install Functions
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# Fedora Install Functions
+#
+
+install_fedora_deps() {
+
+ if [ $_DISABLE_REPOS -eq $BS_FALSE ]; then
+ if [ "$_ENABLE_EXTERNAL_ZMQ_REPOS" -eq $BS_TRUE ]; then
+ __install_saltstack_copr_zeromq_repository || return 1
+ fi
+
+ __install_saltstack_copr_salt_repository || return 1
+ fi
+
+ __PACKAGES="yum-utils PyYAML libyaml python-crypto python-jinja2 python-zmq python2-msgpack python2-requests"
+
+ # shellcheck disable=SC2086
+ dnf install -y ${__PACKAGES} || return 1
+
+ if [ "$_UPGRADE_SYS" -eq $BS_TRUE ]; then
+ dnf -y update || return 1
+ fi
+
+ if [ "${_EXTRA_PACKAGES}" != "" ]; then
+ echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}"
+ # shellcheck disable=SC2086
+ dnf install -y ${_EXTRA_PACKAGES} || return 1
+ fi
+
+ return 0
+}
+
+install_fedora_stable() {
+ __PACKAGES=""
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ];then
+ __PACKAGES="${__PACKAGES} salt-cloud"
+ fi
+ if [ "$_INSTALL_MASTER" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} salt-master"
+ fi
+ if [ "$_INSTALL_MINION" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} salt-minion"
+ fi
+ if [ "$_INSTALL_SYNDIC" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} salt-syndic"
+ fi
+
+ # shellcheck disable=SC2086
+ dnf install -y ${__PACKAGES} || return 1
+
+ return 0
+}
+
+install_fedora_stable_post() {
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ systemctl is-enabled salt-$fname.service || (systemctl preset salt-$fname.service && systemctl enable salt-$fname.service)
+ sleep 0.1
+ systemctl daemon-reload
+ done
+}
+
+install_fedora_git_deps() {
+
+ if [ "$_INSECURE_DL" -eq $BS_FALSE ] && [ "${_SALT_REPO_URL%%://*}" = "https" ]; then
+ dnf install -y ca-certificates || return 1
+ fi
+
+ install_fedora_deps || return 1
+
+ if ! __check_command_exists git; then
+ dnf install -y git || return 1
+ fi
+
+ __git_clone_and_checkout || return 1
+
+ __PACKAGES="systemd-python"
+ __PIP_PACKAGES=""
+
+ if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then
+ # We're on the develop branch, install whichever tornado is on the requirements file
+ __REQUIRED_TORNADO="$(grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")"
+ if [ "${__REQUIRED_TORNADO}" != "" ]; then
+ __check_pip_allowed "You need to allow pip based installations (-P) in order to install tornado"
+
+ # Install pip and pip dependencies
+ if ! __check_command_exists pip; then
+ __PACKAGES="${__PACKAGES} python-setuptools python-pip gcc python-devel"
+ fi
+
+ __PIP_PACKAGES="${__PIP_PACKAGES} tornado"
+ fi
+ fi
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} python-libcloud python-netaddr"
+ fi
+
+ # shellcheck disable=SC2086
+ dnf install -y ${__PACKAGES} || return 1
+
+ if [ "${__PIP_PACKAGES}" != "" ]; then
+ # shellcheck disable=SC2086,SC2090
+ pip install -U ${__PIP_PACKAGES} || return 1
+ fi
+
+ # Let's trigger config_salt()
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/"
+ CONFIG_SALT_FUNC="config_salt"
+ fi
+
+ return 0
+}
+
+install_fedora_git() {
+ if [ -f "${_SALT_GIT_CHECKOUT_DIR}/salt/syspaths.py" ]; then
+ python setup.py --salt-config-dir="$_SALT_ETC_DIR" --salt-cache-dir="${_SALT_CACHE_DIR}" ${SETUP_PY_INSTALL_ARGS} install || return 1
+ else
+ python setup.py ${SETUP_PY_INSTALL_ARGS} install || return 1
+ fi
+ return 0
+}
+
+install_fedora_git_post() {
+ for fname in api master minion syndic; do
+ # Skip if not meant to be installed
+ [ $fname = "api" ] && \
+ ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || ! __check_command_exists "salt-${fname}") && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/rpm/salt-${fname}.service" "/lib/systemd/system/salt-${fname}.service"
+
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ systemctl is-enabled salt-$fname.service || (systemctl preset salt-$fname.service && systemctl enable salt-$fname.service)
+ sleep 0.1
+ systemctl daemon-reload
+ done
+}
+
+install_fedora_restart_daemons() {
+ [ $_START_DAEMONS -eq $BS_FALSE ] && return
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ systemctl stop salt-$fname > /dev/null 2>&1
+ systemctl start salt-$fname.service
+ done
+}
+
+install_fedora_check_services() {
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ __check_services_systemd salt-$fname || return 1
+ done
+
+ return 0
+}
+#
+# Ended Fedora Install Functions
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# CentOS Install Functions
+#
+__install_epel_repository() {
+ if [ ${_EPEL_REPOS_INSTALLED} -eq $BS_TRUE ]; then
+ return 0
+ fi
+
+ # Check if epel repo is already enabled and flag it accordingly
+ yum repolist | grep -q "^[!]\?${_EPEL_REPO}/"
+ if [ $? -eq 0 ]; then
+ _EPEL_REPOS_INSTALLED=$BS_TRUE
+ return 0
+ fi
+
+ # Check if epel-release is already installed and flag it accordingly
+ rpm --nodigest --nosignature -q epel-release > /dev/null 2>&1
+ if [ $? -eq 0 ]; then
+ _EPEL_REPOS_INSTALLED=$BS_TRUE
+ return 0
+ fi
+
+ # Download latest 'epel-release' package for the distro version directly
+ epel_repo_url="${HTTP_VAL}://dl.fedoraproject.org/pub/epel/epel-release-latest-${DISTRO_MAJOR_VERSION}.noarch.rpm"
+ if [ "$DISTRO_MAJOR_VERSION" -eq 5 ]; then
+ __fetch_url /tmp/epel-release.rpm "$epel_repo_url" || return 1
+ rpm -Uvh --force /tmp/epel-release.rpm || return 1
+ rm -f /tmp/epel-release.rpm
+ elif [ "$DISTRO_MAJOR_VERSION" -ge 6 ]; then
+ rpm -Uvh --force "$epel_repo_url" || return 1
+ else
+ echoerror "Failed add EPEL repository support."
+ return 1
+ fi
+
+ _EPEL_REPOS_INSTALLED=$BS_TRUE
+ return 0
+}
+
+__install_saltstack_copr_zeromq_repository() {
+ echoinfo "Installing Zeromq >=4 and PyZMQ>=14 from SaltStack's COPR repository"
+ if [ ! -s /etc/yum.repos.d/saltstack-zeromq4.repo ]; then
+ if [ "${DISTRO_NAME_L}" = "fedora" ]; then
+ __REPOTYPE="${DISTRO_NAME_L}"
+ else
+ __REPOTYPE="epel"
+ fi
+ __fetch_url /etc/yum.repos.d/saltstack-zeromq4.repo \
+ "${HTTP_VAL}://copr.fedorainfracloud.org/coprs/saltstack/zeromq4/repo/${__REPOTYPE}-${DISTRO_MAJOR_VERSION}/saltstack-zeromq4-${__REPOTYPE}-${DISTRO_MAJOR_VERSION}.repo" || return 1
+ fi
+ return 0
+}
+
+__install_saltstack_rhel_repository() {
+ if [ "$ITYPE" = "stable" ]; then
+ repo_rev="$STABLE_REV"
+ else
+ repo_rev="latest"
+ fi
+
+ # Check if a custom repo URL was passed with -R. If not, use repo.salstack.com.
+ if [ "$_CUSTOM_REPO_URL" != "null" ]; then
+ repo_url="$_CUSTOM_REPO_URL"
+ else
+ repo_url="repo.saltstack.com"
+ fi
+
+ # Cloud Linux $releasever = 7.x, which doesn't exist in repo.saltstack.com, we need this to be "7"
+ if [ "${DISTRO_NAME}" = "Cloud Linux" ] && [ "${DISTRO_MAJOR_VERSION}" = "7" ]; then
+ base_url="${HTTP_VAL}://${repo_url}/yum/redhat/${DISTRO_MAJOR_VERSION}/\$basearch/${repo_rev}/"
+ else
+ base_url="${HTTP_VAL}://${repo_url}/yum/redhat/\$releasever/\$basearch/${repo_rev}/"
+ fi
+
+ fetch_url="${HTTP_VAL}://${repo_url}/yum/redhat/${DISTRO_MAJOR_VERSION}/${CPU_ARCH_L}/${repo_rev}/"
+
+ if [ "${DISTRO_MAJOR_VERSION}" -eq 5 ]; then
+ gpg_key="SALTSTACK-EL5-GPG-KEY.pub"
+ else
+ gpg_key="SALTSTACK-GPG-KEY.pub"
+ fi
+
+ repo_file="/etc/yum.repos.d/saltstack.repo"
+ if [ ! -s "$repo_file" ]; then
+ cat <<_eof > "$repo_file"
+[saltstack]
+name=SaltStack ${repo_rev} Release Channel for RHEL/CentOS \$releasever
+baseurl=$base_url
+skip_if_unavailable=True
+gpgcheck=1
+gpgkey=${base_url}${gpg_key}
+enabled=1
+enabled_metadata=1
+_eof
+
+ __rpm_import_gpg "${fetch_url}${gpg_key}" || return 1
+ fi
+
+ if [ "$DISTRO_MAJOR_VERSION" -eq 7 ] && ([ "$repo_rev" = "latest" ] || [ "$repo_rev" = "2015.8" ]); then
+ # Import CentOS 7 GPG key on RHEL for installing base dependencies from
+ # Salt corporate repository
+ rpm -qa gpg-pubkey\* --qf "%{name}-%{version}\n" | grep -q ^gpg-pubkey-f4a80eb5$ || \
+ __rpm_import_gpg "${HTTP_VAL}://${repo_url}/yum/redhat/7/x86_64/${repo_rev}/base/RPM-GPG-KEY-CentOS-7" || return 1
+ fi
+
+ return 0
+}
+
+__install_saltstack_copr_salt_repository() {
+ echoinfo "Adding SaltStack's COPR repository"
+
+ if [ "${DISTRO_NAME_L}" = "fedora" ]; then
+ [ "$DISTRO_MAJOR_VERSION" -ge 22 ] && return 0
+ __REPOTYPE="${DISTRO_NAME_L}"
+ else
+ __REPOTYPE="epel"
+ fi
+
+ __REPO_FILENAME="saltstack-salt-${__REPOTYPE}-${DISTRO_MAJOR_VERSION}.repo"
+
+ if [ ! -s "/etc/yum.repos.d/${__REPO_FILENAME}" ]; then
+ __fetch_url "/etc/yum.repos.d/${__REPO_FILENAME}" \
+ "${HTTP_VAL}://copr.fedorainfracloud.org/coprs/saltstack/salt/repo/${__REPOTYPE}-${DISTRO_MAJOR_VERSION}/${__REPO_FILENAME}" || return 1
+ fi
+
+ return 0
+}
+
+install_centos_stable_deps() {
+ if [ "$_UPGRADE_SYS" -eq $BS_TRUE ]; then
+ yum -y update || return 1
+ fi
+
+ if [ "$DISTRO_MAJOR_VERSION" -eq 5 ]; then
+ # Install curl which is not included in @core CentOS 5 installation
+ __check_command_exists curl || yum -y install "curl.${CPU_ARCH_L}" || return 1
+ fi
+
+ if [ $_DISABLE_REPOS -eq $BS_FALSE ]; then
+ __install_epel_repository || return 1
+ __install_saltstack_rhel_repository || return 1
+ fi
+
+ # If -R was passed, we need to configure custom repo url with rsync-ed packages
+ # Which is still handled in __install_saltstack_rhel_repository. This call has
+ # its own check in case -r was passed without -R.
+ if [ "$_CUSTOM_REPO_URL" != "null" ]; then
+ __install_saltstack_rhel_repository || return 1
+ fi
+
+ __PACKAGES="yum-utils chkconfig"
+
+ # YAML module is used for generating custom master/minion configs
+ if [ "$DISTRO_MAJOR_VERSION" -eq 5 ]; then
+ __PACKAGES="${__PACKAGES} python26-PyYAML"
+ else
+ __PACKAGES="${__PACKAGES} PyYAML"
+ fi
+
+ # shellcheck disable=SC2086
+ __yum_install_noinput ${__PACKAGES} || return 1
+
+ if [ "${_EXTRA_PACKAGES}" != "" ]; then
+ echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}"
+ # shellcheck disable=SC2086
+ __yum_install_noinput ${_EXTRA_PACKAGES} || return 1
+ fi
+
+
+ return 0
+}
+
+install_centos_stable() {
+ __PACKAGES=""
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ];then
+ __PACKAGES="${__PACKAGES} salt-cloud"
+ fi
+ if [ "$_INSTALL_MASTER" -eq $BS_TRUE ];then
+ __PACKAGES="${__PACKAGES} salt-master"
+ fi
+ if [ "$_INSTALL_MINION" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} salt-minion"
+ fi
+ if [ "$_INSTALL_SYNDIC" -eq $BS_TRUE ];then
+ __PACKAGES="${__PACKAGES} salt-syndic"
+ fi
+
+ # shellcheck disable=SC2086
+ __yum_install_noinput ${__PACKAGES} || return 1
+
+ return 0
+}
+
+install_centos_stable_post() {
+ SYSTEMD_RELOAD=$BS_FALSE
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -f /bin/systemctl ]; then
+ /bin/systemctl is-enabled salt-${fname}.service > /dev/null 2>&1 || (
+ /bin/systemctl preset salt-${fname}.service > /dev/null 2>&1 &&
+ /bin/systemctl enable salt-${fname}.service > /dev/null 2>&1
+ )
+
+ SYSTEMD_RELOAD=$BS_TRUE
+ elif [ -f "/etc/init.d/salt-${fname}" ]; then
+ /sbin/chkconfig salt-${fname} on
+ fi
+ done
+
+ if [ "$SYSTEMD_RELOAD" -eq $BS_TRUE ]; then
+ /bin/systemctl daemon-reload
+ fi
+
+ return 0
+}
+
+install_centos_git_deps() {
+ if [ "$_INSECURE_DL" -eq $BS_FALSE ] && [ "${_SALT_REPO_URL%%://*}" = "https" ]; then
+ if [ "$DISTRO_MAJOR_VERSION" -gt 5 ]; then
+ __yum_install_noinput ca-certificates || return 1
+ else
+ __yum_install_noinput "openssl.${CPU_ARCH_L}" || return 1
+ fi
+ fi
+
+ install_centos_stable_deps || return 1
+
+ if ! __check_command_exists git; then
+ __yum_install_noinput git || return 1
+ fi
+
+ __git_clone_and_checkout || return 1
+
+ __PACKAGES=""
+
+ if [ "$DISTRO_MAJOR_VERSION" -eq 5 ]; then
+ __PACKAGES="${__PACKAGES} python26 python26-crypto python26-jinja2 python26-msgpack python26-requests"
+ __PACKAGES="${__PACKAGES} python26-tornado python26-zmq"
+ else
+ __PACKAGES="${__PACKAGES} python-crypto python-futures python-msgpack python-zmq python-jinja2"
+ __PACKAGES="${__PACKAGES} python-requests python-tornado"
+ fi
+
+ if [ "$DISTRO_MAJOR_VERSION" -ge 7 ]; then
+ __PACKAGES="${__PACKAGES} systemd-python"
+ fi
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} python-libcloud"
+ fi
+
+ # shellcheck disable=SC2086
+ __yum_install_noinput ${__PACKAGES} || return 1
+
+ # Let's trigger config_salt()
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/"
+ CONFIG_SALT_FUNC="config_salt"
+ fi
+
+ return 0
+}
+
+install_centos_git() {
+ if [ "$DISTRO_MAJOR_VERSION" -eq 5 ]; then
+ _PYEXE=python2.6
+ else
+ _PYEXE=python2
+ fi
+
+ if [ -f "${_SALT_GIT_CHECKOUT_DIR}/salt/syspaths.py" ]; then
+ $_PYEXE setup.py --salt-config-dir="$_SALT_ETC_DIR" --salt-cache-dir="${_SALT_CACHE_DIR}" ${SETUP_PY_INSTALL_ARGS} install --prefix=/usr || return 1
+ else
+ $_PYEXE setup.py ${SETUP_PY_INSTALL_ARGS} install --prefix=/usr || return 1
+ fi
+
+ return 0
+}
+
+install_centos_git_post() {
+ SYSTEMD_RELOAD=$BS_FALSE
+
+ for fname in api master minion syndic; do
+ # Skip if not meant to be installed
+ [ $fname = "api" ] && \
+ ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || ! __check_command_exists "salt-${fname}") && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -f /bin/systemctl ]; then
+ if [ ! -f "/usr/lib/systemd/system/salt-${fname}.service" ] || \
+ ([ -f "/usr/lib/systemd/system/salt-${fname}.service" ] && [ "$_FORCE_OVERWRITE" -eq $BS_TRUE ]); then
+ __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/rpm/salt-${fname}.service" /usr/lib/systemd/system
+ fi
+
+ SYSTEMD_RELOAD=$BS_TRUE
+ elif [ ! -f "/etc/init.d/salt-$fname" ] || \
+ ([ -f "/etc/init.d/salt-$fname" ] && [ "$_FORCE_OVERWRITE" -eq $BS_TRUE ]); then
+ __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/rpm/salt-${fname}" /etc/init.d
+ chmod +x /etc/init.d/salt-${fname}
+ fi
+ done
+
+ if [ "$SYSTEMD_RELOAD" -eq $BS_TRUE ]; then
+ /bin/systemctl daemon-reload
+ fi
+
+ install_centos_stable_post || return 1
+
+ return 0
+}
+
+install_centos_restart_daemons() {
+ [ $_START_DAEMONS -eq $BS_FALSE ] && return
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -f /sbin/initctl ] && [ -f /etc/init/salt-${fname}.conf ]; then
+ # We have upstart support and upstart knows about our service
+ /sbin/initctl status salt-$fname > /dev/null 2>&1
+ if [ $? -ne 0 ]; then
+ # Everything is in place and upstart gave us an error code? Fail!
+ return 1
+ fi
+
+ # upstart knows about this service.
+ # Let's try to stop it, and then start it
+ /sbin/initctl stop salt-$fname > /dev/null 2>&1
+ /sbin/initctl start salt-$fname > /dev/null 2>&1
+ # Restart service
+ if [ $? -ne 0 ]; then
+ # Failed the restart?!
+ return 1
+ fi
+ elif [ -f /etc/init.d/salt-$fname ]; then
+ # Disable stdin to fix shell session hang on killing tee pipe
+ service salt-$fname stop < /dev/null > /dev/null 2>&1
+ service salt-$fname start < /dev/null
+ elif [ -f /usr/bin/systemctl ]; then
+ # CentOS 7 uses systemd
+ /usr/bin/systemctl stop salt-$fname > /dev/null 2>&1
+ /usr/bin/systemctl start salt-$fname.service
+ fi
+ done
+}
+
+install_centos_testing_deps() {
+ install_centos_stable_deps || return 1
+ return 0
+}
+
+install_centos_testing() {
+ install_centos_stable || return 1
+ return 0
+}
+
+install_centos_testing_post() {
+ install_centos_stable_post || return 1
+ return 0
+}
+
+install_centos_check_services() {
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -f /sbin/initctl ] && [ -f /etc/init/salt-${fname}.conf ]; then
+ __check_services_upstart salt-$fname || return 1
+ elif [ -f /etc/init.d/salt-$fname ]; then
+ __check_services_sysvinit salt-$fname || return 1
+ elif [ -f /usr/bin/systemctl ]; then
+ __check_services_systemd salt-$fname || return 1
+ fi
+ done
+
+ return 0
+}
+#
+# Ended CentOS Install Functions
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# RedHat Install Functions
+#
+install_red_hat_linux_stable_deps() {
+ install_centos_stable_deps || return 1
+ return 0
+}
+
+install_red_hat_linux_git_deps() {
+ install_centos_git_deps || return 1
+ return 0
+}
+
+install_red_hat_enterprise_linux_stable_deps() {
+ install_red_hat_linux_stable_deps || return 1
+ return 0
+}
+
+install_red_hat_enterprise_linux_git_deps() {
+ install_red_hat_linux_git_deps || return 1
+ return 0
+}
+
+install_red_hat_enterprise_server_stable_deps() {
+ install_red_hat_linux_stable_deps || return 1
+ return 0
+}
+
+install_red_hat_enterprise_server_git_deps() {
+ install_red_hat_linux_git_deps || return 1
+ return 0
+}
+
+install_red_hat_enterprise_workstation_stable_deps() {
+ install_red_hat_linux_stable_deps || return 1
+ return 0
+}
+
+install_red_hat_enterprise_workstation_git_deps() {
+ install_red_hat_linux_git_deps || return 1
+ return 0
+}
+
+install_red_hat_linux_stable() {
+ install_centos_stable || return 1
+ return 0
+}
+
+install_red_hat_linux_git() {
+ install_centos_git || return 1
+ return 0
+}
+
+install_red_hat_enterprise_linux_stable() {
+ install_red_hat_linux_stable || return 1
+ return 0
+}
+
+install_red_hat_enterprise_linux_git() {
+ install_red_hat_linux_git || return 1
+ return 0
+}
+
+install_red_hat_enterprise_server_stable() {
+ install_red_hat_linux_stable || return 1
+ return 0
+}
+
+install_red_hat_enterprise_server_git() {
+ install_red_hat_linux_git || return 1
+ return 0
+}
+
+install_red_hat_enterprise_workstation_stable() {
+ install_red_hat_linux_stable || return 1
+ return 0
+}
+
+install_red_hat_enterprise_workstation_git() {
+ install_red_hat_linux_git || return 1
+ return 0
+}
+
+install_red_hat_linux_stable_post() {
+ install_centos_stable_post || return 1
+ return 0
+}
+
+install_red_hat_linux_restart_daemons() {
+ install_centos_restart_daemons || return 1
+ return 0
+}
+
+install_red_hat_linux_git_post() {
+ install_centos_git_post || return 1
+ return 0
+}
+
+install_red_hat_enterprise_linux_stable_post() {
+ install_red_hat_linux_stable_post || return 1
+ return 0
+}
+
+install_red_hat_enterprise_linux_restart_daemons() {
+ install_red_hat_linux_restart_daemons || return 1
+ return 0
+}
+
+install_red_hat_enterprise_linux_git_post() {
+ install_red_hat_linux_git_post || return 1
+ return 0
+}
+
+install_red_hat_enterprise_server_stable_post() {
+ install_red_hat_linux_stable_post || return 1
+ return 0
+}
+
+install_red_hat_enterprise_server_restart_daemons() {
+ install_red_hat_linux_restart_daemons || return 1
+ return 0
+}
+
+install_red_hat_enterprise_server_git_post() {
+ install_red_hat_linux_git_post || return 1
+ return 0
+}
+
+install_red_hat_enterprise_workstation_stable_post() {
+ install_red_hat_linux_stable_post || return 1
+ return 0
+}
+
+install_red_hat_enterprise_workstation_restart_daemons() {
+ install_red_hat_linux_restart_daemons || return 1
+ return 0
+}
+
+install_red_hat_enterprise_workstation_git_post() {
+ install_red_hat_linux_git_post || return 1
+ return 0
+}
+
+install_red_hat_linux_testing_deps() {
+ install_centos_testing_deps || return 1
+ return 0
+}
+
+install_red_hat_linux_testing() {
+ install_centos_testing || return 1
+ return 0
+}
+
+install_red_hat_linux_testing_post() {
+ install_centos_testing_post || return 1
+ return 0
+}
+
+install_red_hat_enterprise_server_testing_deps() {
+ install_centos_testing_deps || return 1
+ return 0
+}
+
+install_red_hat_enterprise_server_testing() {
+ install_centos_testing || return 1
+ return 0
+}
+
+install_red_hat_enterprise_server_testing_post() {
+ install_centos_testing_post || return 1
+ return 0
+}
+
+install_red_hat_enterprise_workstation_testing_deps() {
+ install_centos_testing_deps || return 1
+ return 0
+}
+
+install_red_hat_enterprise_workstation_testing() {
+ install_centos_testing || return 1
+ return 0
+}
+
+install_red_hat_enterprise_workstation_testing_post() {
+ install_centos_testing_post || return 1
+ return 0
+}
+#
+# Ended RedHat Install Functions
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# Oracle Linux Install Functions
+#
+install_oracle_linux_stable_deps() {
+ install_centos_stable_deps || return 1
+ return 0
+}
+
+install_oracle_linux_git_deps() {
+ install_centos_git_deps || return 1
+ return 0
+}
+
+install_oracle_linux_testing_deps() {
+ install_centos_testing_deps || return 1
+ return 0
+}
+
+install_oracle_linux_stable() {
+ install_centos_stable || return 1
+ return 0
+}
+
+install_oracle_linux_git() {
+ install_centos_git || return 1
+ return 0
+}
+
+install_oracle_linux_testing() {
+ install_centos_testing || return 1
+ return 0
+}
+
+install_oracle_linux_stable_post() {
+ install_centos_stable_post || return 1
+ return 0
+}
+
+install_oracle_linux_git_post() {
+ install_centos_git_post || return 1
+ return 0
+}
+
+install_oracle_linux_testing_post() {
+ install_centos_testing_post || return 1
+ return 0
+}
+
+install_oracle_linux_restart_daemons() {
+ install_centos_restart_daemons || return 1
+ return 0
+}
+
+install_oracle_linux_check_services() {
+ install_centos_check_services || return 1
+ return 0
+}
+#
+# Ended Oracle Linux Install Functions
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# Scientific Linux Install Functions
+#
+install_scientific_linux_stable_deps() {
+ install_centos_stable_deps || return 1
+ return 0
+}
+
+install_scientific_linux_git_deps() {
+ install_centos_git_deps || return 1
+ return 0
+}
+
+install_scientific_linux_testing_deps() {
+ install_centos_testing_deps || return 1
+ return 0
+}
+
+install_scientific_linux_stable() {
+ install_centos_stable || return 1
+ return 0
+}
+
+install_scientific_linux_git() {
+ install_centos_git || return 1
+ return 0
+}
+
+install_scientific_linux_testing() {
+ install_centos_testing || return 1
+ return 0
+}
+
+install_scientific_linux_stable_post() {
+ install_centos_stable_post || return 1
+ return 0
+}
+
+install_scientific_linux_git_post() {
+ install_centos_git_post || return 1
+ return 0
+}
+
+install_scientific_linux_testing_post() {
+ install_centos_testing_post || return 1
+ return 0
+}
+
+install_scientific_linux_restart_daemons() {
+ install_centos_restart_daemons || return 1
+ return 0
+}
+
+install_scientific_linux_check_services() {
+ install_centos_check_services || return 1
+ return 0
+}
+#
+# Ended Scientific Linux Install Functions
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# CloudLinux Install Functions
+#
+install_cloud_linux_stable_deps() {
+ install_centos_stable_deps || return 1
+ return 0
+}
+
+install_cloud_linux_git_deps() {
+ install_centos_git_deps || return 1
+ return 0
+}
+
+install_cloud_linux_testing_deps() {
+ install_centos_testing_deps || return 1
+ return 0
+}
+
+install_cloud_linux_stable() {
+ install_centos_stable || return 1
+ return 0
+}
+
+install_cloud_linux_git() {
+ install_centos_git || return 1
+ return 0
+}
+
+install_cloud_linux_testing() {
+ install_centos_testing || return 1
+ return 0
+}
+
+install_cloud_linux_stable_post() {
+ install_centos_stable_post || return 1
+ return 0
+}
+
+install_cloud_linux_git_post() {
+ install_centos_git_post || return 1
+ return 0
+}
+
+install_cloud_linux_testing_post() {
+ install_centos_testing_post || return 1
+ return 0
+}
+
+install_cloud_linux_restart_daemons() {
+ install_centos_restart_daemons || return 1
+ return 0
+}
+
+install_cloud_linux_check_services() {
+ install_centos_check_services || return 1
+ return 0
+}
+#
+# End of CloudLinux Install Functions
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# Alpine Linux Install Functions
+#
+install_alpine_linux_stable_deps() {
+ __COMUNITY_REPO_ENABLED="$(grep '^https://dl-cdn.alpinelinux.org/alpine/edge/community$' /etc/apk/repositories)"
+ if [ "${__COMUNITY_REPO_ENABLED}" != "" ]; then
+ apk update
+ else
+ echo 'https://dl-cdn.alpinelinux.org/alpine/edge/community' >> /etc/apk/repositories
+ apk update
+ fi
+}
+
+install_alpine_linux_git_deps() {
+ apk -U add python2 py-virtualenv py2-crypto py2-setuptools \
+ py2-jinja2 py2-yaml py2-markupsafe py2-msgpack py2-psutil \
+ py2-zmq zeromq py2-requests || return 1
+
+ # Don't fail if un-installing python2-distribute threw an error
+ if ! __check_command_exists git; then
+ apk -U add git || return 1
+ fi
+
+ __git_clone_and_checkout || return 1
+
+ if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then
+ # We're on the develop branch, install whichever tornado is on the requirements file
+ __REQUIRED_TORNADO="$(grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")"
+ if [ "${__REQUIRED_TORNADO}" != "" ]; then
+ apk -U add py2-tornado
+ fi
+ fi
+
+ # Let's trigger config_salt()
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/"
+ CONFIG_SALT_FUNC="config_salt"
+ fi
+
+ return 0
+}
+
+install_alpine_linux_stable() {
+ __PACKAGES="salt"
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ];then
+ __PACKAGES="${__PACKAGES} salt-cloud"
+ fi
+ if [ "$_INSTALL_MASTER" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} salt-master"
+ fi
+ if [ "$_INSTALL_MINION" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} salt-minion"
+ fi
+ if [ "$_INSTALL_SYNDIC" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} salt-syndic"
+ fi
+
+ apk -U add "${__PACKAGES}" || return 1
+ return 0
+}
+
+install_alpine_linux_git() {
+ if [ -f "${_SALT_GIT_CHECKOUT_DIR}/salt/syspaths.py" ]; then
+ python2 setup.py --salt-config-dir="$_SALT_ETC_DIR" --salt-cache-dir="${_SALT_CACHE_DIR}" ${SETUP_PY_INSTALL_ARGS} install || return 1
+ else
+ python2 setup.py ${SETUP_PY_INSTALL_ARGS} install || return 1
+ fi
+ return 0
+}
+
+install_alpine_linux_post() {
+ for fname in api master minion syndic; do
+ # Skip if not meant to be installed
+ [ $fname = "api" ] && \
+ ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || ! __check_command_exists "salt-${fname}") && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip salt-syndic as there is no service for it on Alpine Linux
+ [ $fname = "syndic" ] && continue
+
+ if [ -f /sbin/rc-update ]; then
+ /sbin/rc-update add salt-$fname > /dev/null 2>&1
+ continue
+ fi
+
+ done
+}
+
+install_alpine_linux_git_post() {
+ for fname in api master minion syndic; do
+ # Skip if not meant to be installed
+ [ $fname = "api" ] && \
+ ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || ! __check_command_exists "salt-${fname}") && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip salt-syndic as there is no service for it on Alpine Linux
+ [ $fname = "syndic" ] && continue
+
+ if [ -f /sbin/rc-update ]; then
+ /sbin/rc-update add salt-$fname > /dev/null 2>&1
+ continue
+ fi
+
+ done
+}
+
+install_alpine_linux_restart_daemons() {
+ [ $_START_DAEMONS -eq $BS_FALSE ] && return
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip salt-syndic as there is no service for it on Alpine Linux
+ [ $fname = "syndic" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+
+ /sbin/rc-service salt-$fname stop > /dev/null 2>&1
+ /sbin/rc-service salt-$fname start
+ done
+}
+
+install_alpine_linux_check_services() {
+ if [ ! -f /usr/bin/systemctl ]; then
+ # Not running systemd!? Don't check!
+ return 0
+ fi
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip salt-syndic as there is no service for it on Alpine Linux
+ [ $fname = "syndic" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+
+ __check_services_alpine salt-$fname || return 1
+ done
+
+ return 0
+}
+
+daemons_running_alpine_linux() {
+ [ "$_START_DAEMONS" -eq $BS_FALSE ] && return 0
+
+ FAILED_DAEMONS=0
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip salt-syndic as there is no service for it on Alpine Linux
+ [ $fname = "syndic" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+
+ # shellcheck disable=SC2009
+ if [ "$(ps wwwaux | grep -v grep | grep salt-$fname)" = "" ]; then
+ echoerror "salt-$fname was not found running"
+ FAILED_DAEMONS=$((FAILED_DAEMONS + 1))
+ fi
+ done
+
+ return $FAILED_DAEMONS
+}
+
+#
+# Ended Alpine Linux Install Functions
+#
+#######################################################################################################################
+
+
+#######################################################################################################################
+#
+# Amazon Linux AMI Install Functions
+#
+
+install_amazon_linux_ami_deps() {
+
+ # We need to install yum-utils before doing anything else when installing on
+ # Amazon Linux ECS-optimized images. See issue #974.
+ yum -y install yum-utils
+
+ ENABLE_EPEL_CMD=""
+ if [ $_DISABLE_REPOS -eq $BS_TRUE ]; then
+ ENABLE_EPEL_CMD="--enablerepo=${_EPEL_REPO}"
+ fi
+
+ if [ $_DISABLE_REPOS -eq $BS_FALSE ]; then
+ # enable the EPEL repo
+ /usr/bin/yum-config-manager --enable epel || return 1
+
+ # exclude Salt and ZeroMQ packages from EPEL
+ /usr/bin/yum-config-manager epel --setopt "epel.exclude=zeromq* salt* python-zmq*" --save || return 1
+
+ __REPO_FILENAME="saltstack-repo.repo"
+
+ if [ ! -s "/etc/yum.repos.d/${__REPO_FILENAME}" ]; then
+ cat <<_eof > "/etc/yum.repos.d/${__REPO_FILENAME}"
+[saltstack-repo]
+disabled=False
+name=SaltStack repo for RHEL/CentOS 6
+gpgcheck=1
+gpgkey=$HTTP_VAL://repo.saltstack.com/yum/redhat/6/\$basearch/$STABLE_REV/SALTSTACK-GPG-KEY.pub
+baseurl=$HTTP_VAL://repo.saltstack.com/yum/redhat/6/\$basearch/$STABLE_REV/
+humanname=SaltStack repo for RHEL/CentOS 6
+_eof
+ fi
+
+ if [ "$_UPGRADE_SYS" -eq $BS_TRUE ]; then
+ yum -y update || return 1
+ fi
+ fi
+
+ __PACKAGES="PyYAML python-crypto python-msgpack python-zmq python26-ordereddict python-jinja2 python-requests"
+
+ # shellcheck disable=SC2086
+ yum -y install ${__PACKAGES} ${ENABLE_EPEL_CMD} || return 1
+
+ if [ "${_EXTRA_PACKAGES}" != "" ]; then
+ echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}"
+ # shellcheck disable=SC2086
+ yum install -y ${_EXTRA_PACKAGES} ${ENABLE_EPEL_CMD} || return 1
+ fi
+}
+
+install_amazon_linux_ami_git_deps() {
+ if [ "$_INSECURE_DL" -eq $BS_FALSE ] && [ "${_SALT_REPO_URL%%://*}" = "https" ]; then
+ yum -y install ca-certificates || return 1
+ fi
+
+ install_amazon_linux_ami_deps || return 1
+
+ ENABLE_EPEL_CMD=""
+ if [ $_DISABLE_REPOS -eq $BS_TRUE ]; then
+ ENABLE_EPEL_CMD="--enablerepo=${_EPEL_REPO}"
+ fi
+
+ if ! __check_command_exists git; then
+ yum -y install git ${ENABLE_EPEL_CMD} || return 1
+ fi
+
+ __git_clone_and_checkout || return 1
+
+ __PACKAGES=""
+ __PIP_PACKAGES=""
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
+ __check_pip_allowed "You need to allow pip based installations (-P) in order to install apache-libcloud"
+ __PACKAGES="${__PACKAGES} python-pip"
+ __PIP_PACKAGES="${__PIP_PACKAGES} apache-libcloud>=$_LIBCLOUD_MIN_VERSION"
+ fi
+
+ if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then
+ # We're on the develop branch, install whichever tornado is on the requirements file
+ __REQUIRED_TORNADO="$(grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")"
+ if [ "${__REQUIRED_TORNADO}" != "" ]; then
+ __PACKAGES="${__PACKAGES} python-tornado"
+ fi
+ fi
+
+ if [ "${__PACKAGES}" != "" ]; then
+ # shellcheck disable=SC2086
+ yum -y install ${__PACKAGES} ${ENABLE_EPEL_CMD} || return 1
+ fi
+
+ if [ "${__PIP_PACKAGES}" != "" ]; then
+ # shellcheck disable=SC2086
+ pip-python install ${__PIP_PACKAGES} || return 1
+ fi
+
+ # Let's trigger config_salt()
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/"
+ CONFIG_SALT_FUNC="config_salt"
+ fi
+
+ return 0
+}
+
+install_amazon_linux_ami_stable() {
+ install_centos_stable || return 1
+ return 0
+}
+
+install_amazon_linux_ami_stable_post() {
+ install_centos_stable_post || return 1
+ return 0
+}
+
+install_amazon_linux_ami_restart_daemons() {
+ install_centos_restart_daemons || return 1
+ return 0
+}
+
+install_amazon_linux_ami_git() {
+ install_centos_git || return 1
+ return 0
+}
+
+install_amazon_linux_ami_git_post() {
+ install_centos_git_post || return 1
+ return 0
+}
+
+install_amazon_linux_ami_testing() {
+ install_centos_testing || return 1
+ return 0
+}
+
+install_amazon_linux_ami_testing_post() {
+ install_centos_testing_post || return 1
+ return 0
+}
+#
+# Ended Amazon Linux AMI Install Functions
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# Arch Install Functions
+#
+install_arch_linux_stable_deps() {
+ if [ ! -f /etc/pacman.d/gnupg ]; then
+ pacman-key --init && pacman-key --populate archlinux || return 1
+ fi
+
+ pacman -Sy --noconfirm --needed archlinux-keyring || return 1
+
+ pacman -Sy --noconfirm --needed pacman || return 1
+
+ if __check_command_exists pacman-db-upgrade; then
+ pacman-db-upgrade || return 1
+ fi
+
+ # YAML module is used for generating custom master/minion configs
+ pacman -Sy --noconfirm --needed python2-yaml
+
+ if [ "$_UPGRADE_SYS" -eq $BS_TRUE ]; then
+ pacman -Syyu --noconfirm --needed || return 1
+ fi
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
+ pacman -Sy --noconfirm --needed apache-libcloud || return 1
+ fi
+
+ if [ "${_EXTRA_PACKAGES}" != "" ]; then
+ echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}"
+ # shellcheck disable=SC2086
+ pacman -Sy --noconfirm --needed ${_EXTRA_PACKAGES} || return 1
+ fi
+}
+
+install_arch_linux_git_deps() {
+ install_arch_linux_stable_deps
+
+ # Don't fail if un-installing python2-distribute threw an error
+ if ! __check_command_exists git; then
+ pacman -Sy --noconfirm --needed git || return 1
+ fi
+ pacman -R --noconfirm python2-distribute
+ pacman -Sy --noconfirm --needed python2-crypto python2-setuptools python2-jinja \
+ python2-markupsafe python2-msgpack python2-psutil \
+ python2-pyzmq zeromq python2-requests python2-systemd || return 1
+
+ __git_clone_and_checkout || return 1
+
+ if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then
+ # We're on the develop branch, install whichever tornado is on the requirements file
+ __REQUIRED_TORNADO="$(grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")"
+ if [ "${__REQUIRED_TORNADO}" != "" ]; then
+ pacman -Sy --noconfirm --needed python2-tornado
+ fi
+ fi
+
+
+ # Let's trigger config_salt()
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/"
+ CONFIG_SALT_FUNC="config_salt"
+ fi
+
+ return 0
+}
+
+install_arch_linux_stable() {
+ pacman -Sy --noconfirm --needed pacman || return 1
+ # See https://mailman.archlinux.org/pipermail/arch-dev-public/2013-June/025043.html
+ # to know why we're ignoring below.
+ pacman -Syu --noconfirm --ignore filesystem,bash || return 1
+ pacman -S --noconfirm --needed bash || return 1
+ pacman -Su --noconfirm || return 1
+ # We can now resume regular salt update
+ pacman -Syu --noconfirm salt || return 1
+ return 0
+}
+
+install_arch_linux_git() {
+ if [ -f "${_SALT_GIT_CHECKOUT_DIR}/salt/syspaths.py" ]; then
+ python2 setup.py --salt-config-dir="$_SALT_ETC_DIR" --salt-cache-dir="${_SALT_CACHE_DIR}" ${SETUP_PY_INSTALL_ARGS} install || return 1
+ else
+ python2 setup.py ${SETUP_PY_INSTALL_ARGS} install || return 1
+ fi
+ return 0
+}
+
+install_arch_linux_post() {
+ for fname in api master minion syndic; do
+ # Skip if not meant to be installed
+ [ $fname = "api" ] && \
+ ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || ! __check_command_exists "salt-${fname}") && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ # Since Arch's pacman renames configuration files
+ if [ "$_TEMP_CONFIG_DIR" != "null" ] && [ -f "$_SALT_ETC_DIR/$fname.pacorig" ]; then
+ # Since a configuration directory was provided, it also means that any
+ # configuration file copied was renamed by Arch, see:
+ # https://wiki.archlinux.org/index.php/Pacnew_and_Pacsave_Files#.pacorig
+ __copyfile "$_SALT_ETC_DIR/$fname.pacorig" "$_SALT_ETC_DIR/$fname" $BS_TRUE
+ fi
+
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ if [ -f /usr/bin/systemctl ]; then
+ # Using systemd
+ /usr/bin/systemctl is-enabled salt-$fname.service > /dev/null 2>&1 || (
+ /usr/bin/systemctl preset salt-$fname.service > /dev/null 2>&1 &&
+ /usr/bin/systemctl enable salt-$fname.service > /dev/null 2>&1
+ )
+ sleep 0.1
+ /usr/bin/systemctl daemon-reload
+ continue
+ fi
+
+ # XXX: How do we enable old Arch init.d scripts?
+ done
+}
+
+install_arch_linux_git_post() {
+ for fname in api master minion syndic; do
+ # Skip if not meant to be installed
+ [ $fname = "api" ] && \
+ ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || ! __check_command_exists "salt-${fname}") && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -f /usr/bin/systemctl ]; then
+ __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/rpm/salt-${fname}.service" "/lib/systemd/system/salt-${fname}.service"
+
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ /usr/bin/systemctl is-enabled salt-${fname}.service > /dev/null 2>&1 || (
+ /usr/bin/systemctl preset salt-${fname}.service > /dev/null 2>&1 &&
+ /usr/bin/systemctl enable salt-${fname}.service > /dev/null 2>&1
+ )
+ sleep 0.1
+ /usr/bin/systemctl daemon-reload
+ continue
+ fi
+
+ # SysV init!?
+ __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/rpm/salt-$fname" "/etc/rc.d/init.d/salt-$fname"
+ chmod +x /etc/rc.d/init.d/salt-$fname
+ done
+}
+
+install_arch_linux_restart_daemons() {
+ [ $_START_DAEMONS -eq $BS_FALSE ] && return
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -f /usr/bin/systemctl ]; then
+ /usr/bin/systemctl stop salt-$fname.service > /dev/null 2>&1
+ /usr/bin/systemctl start salt-$fname.service
+ continue
+ fi
+
+ /etc/rc.d/salt-$fname stop > /dev/null 2>&1
+ /etc/rc.d/salt-$fname start
+ done
+}
+
+install_arch_check_services() {
+ if [ ! -f /usr/bin/systemctl ]; then
+ # Not running systemd!? Don't check!
+ return 0
+ fi
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ __check_services_systemd salt-$fname || return 1
+ done
+
+ return 0
+}
+#
+# Ended Arch Install Functions
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# FreeBSD Install Functions
+#
+
+__freebsd_get_packagesite() {
+ if [ "$CPU_ARCH_L" = "amd64" ]; then
+ BSD_ARCH="x86:64"
+ elif [ "$CPU_ARCH_L" = "x86_64" ]; then
+ BSD_ARCH="x86:64"
+ elif [ "$CPU_ARCH_L" = "i386" ]; then
+ BSD_ARCH="x86:32"
+ elif [ "$CPU_ARCH_L" = "i686" ]; then
+ BSD_ARCH="x86:32"
+ fi
+
+ # Since the variable might not be set, don't, momentarily treat it as a
+ # failure
+ set +o nounset
+
+ # ABI is a std format for identifying release / architecture combos
+ ABI="freebsd:${DISTRO_MAJOR_VERSION}:${BSD_ARCH}"
+ _PACKAGESITE="http://pkg.freebsd.org/${ABI}/latest"
+ # Awkwardly, we want the `${ABI}` to be in conf file without escaping
+ PKGCONFURL="pkg+http://pkg.freebsd.org/\${ABI}/latest"
+ SALTPKGCONFURL="http://repo.saltstack.com/freebsd/\${ABI}/"
+
+ # Treat unset variables as errors once more
+ set -o nounset
+}
+
+# Using a separate conf step to head for idempotent install...
+__configure_freebsd_pkg_details() {
+ ## pkg.conf is deprecated.
+ ## We use conf files in /usr/local or /etc instead
+ mkdir -p /usr/local/etc/pkg/repos/
+ mkdir -p /etc/pkg/
+
+ ## Use new JSON-like format for pkg repo configs
+ ## check if /etc/pkg/FreeBSD.conf is already in place
+ if [ ! -f /etc/pkg/FreeBSD.conf ]; then
+ conf_file=/usr/local/etc/pkg/repos/freebsd.conf
+ {
+ echo "FreeBSD:{"
+ echo " url: \"${PKGCONFURL}\","
+ echo " mirror_type: \"srv\","
+ echo " signature_type: \"fingerprints\","
+ echo " fingerprints: \"/usr/share/keys/pkg\","
+ echo " enabled: true"
+ echo "}"
+ } > $conf_file
+ __copyfile $conf_file /etc/pkg/FreeBSD.conf
+ fi
+ FROM_FREEBSD="-r FreeBSD"
+
+ ## add saltstack freebsd repo
+ salt_conf_file=/usr/local/etc/pkg/repos/saltstack.conf
+ {
+ echo "SaltStack:{"
+ echo " url: \"${SALTPKGCONFURL}\","
+ echo " mirror_type: \"http\","
+ echo " enabled: true"
+ echo " priority: 10"
+ echo "}"
+ } > $salt_conf_file
+ FROM_SALTSTACK="-r SaltStack"
+
+ ## ensure future ports builds use pkgng
+ echo "WITH_PKGNG= yes" >> /etc/make.conf
+}
+
+install_freebsd_9_stable_deps() {
+ _SALT_ETC_DIR=${BS_SALT_ETC_DIR:-/usr/local/etc/salt}
+ _PKI_DIR=${_SALT_ETC_DIR}/pki
+
+ if [ $_DISABLE_REPOS -eq $BS_FALSE ]; then
+ #make variables available even if pkg already installed
+ __freebsd_get_packagesite
+
+ if [ ! -x /usr/local/sbin/pkg ]; then
+
+ # install new `pkg` code from its own tarball.
+ fetch "${_PACKAGESITE}/Latest/pkg.txz" || return 1
+ tar xf ./pkg.txz -s ",/.*/,,g" "*/pkg-static" || return 1
+ ./pkg-static add ./pkg.txz || return 1
+ /usr/local/sbin/pkg2ng || return 1
+ fi
+
+ # Configure the pkg repository using new approach
+ __configure_freebsd_pkg_details || return 1
+ fi
+
+ # Now install swig
+ # shellcheck disable=SC2086
+ /usr/local/sbin/pkg install ${FROM_FREEBSD} -y swig || return 1
+
+ # YAML module is used for generating custom master/minion configs
+ # shellcheck disable=SC2086
+ /usr/local/sbin/pkg install ${FROM_FREEBSD} -y py27-yaml || return 1
+
+ if [ "${_EXTRA_PACKAGES}" != "" ]; then
+ echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}"
+ # shellcheck disable=SC2086
+ /usr/local/sbin/pkg install ${FROM_FREEBSD} -y ${_EXTRA_PACKAGES} || return 1
+ fi
+
+ if [ "$_UPGRADE_SYS" -eq $BS_TRUE ]; then
+ pkg upgrade -y || return 1
+ fi
+
+ return 0
+}
+
+install_freebsd_10_stable_deps() {
+ install_freebsd_9_stable_deps
+}
+
+install_freebsd_11_stable_deps() {
+ install_freebsd_9_stable_deps
+}
+
+install_freebsd_git_deps() {
+ install_freebsd_9_stable_deps || return 1
+
+ if ! __check_command_exists git; then
+ /usr/local/sbin/pkg install -y git || return 1
+ fi
+
+ /usr/local/sbin/pkg install -y www/py-requests || return 1
+
+ __git_clone_and_checkout || return 1
+
+ if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then
+ # We're on the develop branch, install whichever tornado is on the requirements file
+ __REQUIRED_TORNADO="$(grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")"
+ if [ "${__REQUIRED_TORNADO}" != "" ]; then
+ /usr/local/sbin/pkg install -y www/py-tornado || return 1
+ fi
+ fi
+
+ echodebug "Adapting paths to FreeBSD"
+ # The list of files was taken from Salt's BSD port Makefile
+ for file in doc/man/salt-key.1 doc/man/salt-cp.1 doc/man/salt-minion.1 \
+ doc/man/salt-syndic.1 doc/man/salt-master.1 doc/man/salt-run.1 \
+ doc/man/salt.7 doc/man/salt.1 doc/man/salt-call.1; do
+ [ ! -f $file ] && continue
+ echodebug "Patching ${file}"
+ sed -in -e "s|/etc/salt|${_SALT_ETC_DIR}|" \
+ -e "s|/srv/salt|${_SALT_ETC_DIR}/states|" \
+ -e "s|/srv/pillar|${_SALT_ETC_DIR}/pillar|" ${file}
+ done
+ if [ ! -f salt/syspaths.py ]; then
+ # We still can't provide the system paths, salt 0.16.x
+ # Let's patch salt's source and adapt paths to what's expected on FreeBSD
+ echodebug "Replacing occurrences of '/etc/salt' with \'${_SALT_ETC_DIR}\'"
+ # The list of files was taken from Salt's BSD port Makefile
+ for file in conf/minion conf/master salt/config.py salt/client.py \
+ salt/modules/mysql.py salt/utils/parsers.py salt/modules/tls.py \
+ salt/modules/postgres.py salt/utils/migrations.py; do
+ [ ! -f $file ] && continue
+ echodebug "Patching ${file}"
+ sed -in -e "s|/etc/salt|${_SALT_ETC_DIR}|" \
+ -e "s|/srv/salt|${_SALT_ETC_DIR}/states|" \
+ -e "s|/srv/pillar|${_SALT_ETC_DIR}/pillar|" ${file}
+ done
+ fi
+ echodebug "Finished patching"
+
+ # Let's trigger config_salt()
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/"
+ CONFIG_SALT_FUNC="config_salt"
+
+ fi
+
+ return 0
+}
+
+install_freebsd_9_stable() {
+ # shellcheck disable=SC2086
+ /usr/local/sbin/pkg install ${FROM_SALTSTACK} -y sysutils/py-salt || return 1
+ return 0
+}
+
+install_freebsd_10_stable() {
+ install_freebsd_9_stable
+}
+
+install_freebsd_11_stable() {
+#
+# installing latest version of salt from FreeBSD CURRENT ports repo
+#
+ # shellcheck disable=SC2086
+ /usr/local/sbin/pkg install ${FROM_FREEBSD} -y sysutils/py-salt || return 1
+
+ return 0
+}
+
+install_freebsd_git() {
+ # shellcheck disable=SC2086
+ /usr/local/sbin/pkg install ${FROM_SALTSTACK} -y sysutils/py-salt || return 1
+
+ # Let's keep the rc.d files before deleting the package
+ mkdir /tmp/rc-scripts || return 1
+ cp /usr/local/etc/rc.d/salt* /tmp/rc-scripts || return 1
+
+ # Let's delete the package
+ /usr/local/sbin/pkg delete -y sysutils/py-salt || return 1
+
+ # Install from git
+ if [ ! -f salt/syspaths.py ]; then
+ # We still can't provide the system paths, salt 0.16.x
+ /usr/local/bin/python2 setup.py ${SETUP_PY_INSTALL_ARGS} install || return 1
+ else
+ /usr/local/bin/python2 setup.py \
+ --salt-root-dir=/usr/local \
+ --salt-config-dir="${_SALT_ETC_DIR}" \
+ --salt-cache-dir="${_SALT_CACHE_DIR}" \
+ --salt-sock-dir=/var/run/salt \
+ --salt-srv-root-dir=/srv \
+ --salt-base-file-roots-dir="${_SALT_ETC_DIR}/states" \
+ --salt-base-pillar-roots-dir="${_SALT_ETC_DIR}/pillar" \
+ --salt-base-master-roots-dir="${_SALT_ETC_DIR}/salt-master" \
+ --salt-logs-dir=/var/log/salt \
+ --salt-pidfile-dir=/var/run ${SETUP_PY_INSTALL_ARGS} install \
+ || return 1
+ fi
+
+ # Restore the rc.d scripts
+ cp /tmp/rc-scripts/salt* /usr/local/etc/rc.d/ || return 1
+
+ # Delete our temporary scripts directory
+ rm -rf /tmp/rc-scripts || return 1
+
+ # And we're good to go
+ return 0
+}
+
+install_freebsd_9_stable_post() {
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ enable_string="salt_${fname}_enable=\"YES\""
+ grep "$enable_string" /etc/rc.conf >/dev/null 2>&1
+ [ $? -eq 1 ] && echo "$enable_string" >> /etc/rc.conf
+
+ if [ $fname = "minion" ] ; then
+ grep "salt_minion_paths" /etc/rc.conf >/dev/null 2>&1
+ [ $? -eq 1 ] && echo "salt_minion_paths=\"/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin\"" >> /etc/rc.conf
+ fi
+ done
+}
+
+install_freebsd_10_stable_post() {
+ install_freebsd_9_stable_post
+}
+
+install_freebsd_11_stable_post() {
+ install_freebsd_9_stable_post
+}
+
+install_freebsd_git_post() {
+ install_freebsd_9_stable_post || return 1
+ return 0
+}
+
+install_freebsd_restart_daemons() {
+ [ $_START_DAEMONS -eq $BS_FALSE ] && return
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ service salt_$fname stop > /dev/null 2>&1
+ service salt_$fname start
+ done
+}
+#
+# Ended FreeBSD Install Functions
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# OpenBSD Install Functions
+#
+
+__choose_openbsd_mirror() {
+ OPENBSD_REPO=''
+ MINTIME=''
+ MIRROR_LIST=$(awk -F= '/installpath = / {print $2}' /etc/examples/pkg.conf)
+
+ for MIRROR in $MIRROR_LIST; do
+ MIRROR_HOST=$(echo "$MIRROR" | sed -e 's|.*//||' -e 's|+*/.*$||')
+ TIME=$(ping -c 1 -w 1 -q "$MIRROR_HOST" | awk -F/ '/round-trip/ { print $5 }')
+ [ -z "$TIME" ] && continue
+
+ echodebug "ping time for $MIRROR_HOST is $TIME"
+ if [ -z "$MINTIME" ]; then
+ FASTER_MIRROR=1
+ else
+ FASTER_MIRROR=$(echo "$TIME < $MINTIME" | bc)
+ fi
+ if [ "$FASTER_MIRROR" -eq 1 ]; then
+ MINTIME=$TIME
+ OPENBSD_REPO="$MIRROR"
+ fi
+ done
+}
+
+install_openbsd_deps() {
+ __choose_openbsd_mirror || return 1
+ echoinfo "setting package repository to $OPENBSD_REPO with ping time of $MINTIME"
+ [ -n "$OPENBSD_REPO" ] || return 1
+ echo "installpath += ${OPENBSD_REPO}" >>/etc/pkg.conf || return 1
+
+ if [ "${_EXTRA_PACKAGES}" != "" ]; then
+ echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}"
+ # shellcheck disable=SC2086
+ pkg_add -I -v ${_EXTRA_PACKAGES} || return 1
+ fi
+ return 0
+}
+
+install_openbsd_git_deps() {
+ install_openbsd_deps || return 1
+ pkg_add -I -v git || return 1
+ __git_clone_and_checkout || return 1
+ #
+ # Let's trigger config_salt()
+ #
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/"
+ CONFIG_SALT_FUNC="config_salt"
+ fi
+ return 0
+}
+
+install_openbsd_git() {
+ #
+ # Install from git
+ #
+ if [ ! -f salt/syspaths.py ]; then
+ # We still can't provide the system paths, salt 0.16.x
+ /usr/local/bin/python2.7 setup.py ${SETUP_PY_INSTALL_ARGS} install || return 1
+ fi
+ return 0
+}
+
+install_openbsd_stable() {
+ pkg_add -r -I -v salt || return 1
+ return 0
+}
+
+install_openbsd_post() {
+ for fname in api master minion syndic; do
+ [ $fname = "api" ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ rcctl enable salt_$fname
+ done
+
+ return 0
+}
+
+install_openbsd_check_services() {
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && continue
+
+ if [ -f /etc/rc.d/salt_${fname} ]; then
+ __check_services_openbsd salt_${fname} || return 1
+ fi
+ done
+
+ return 0
+}
+
+install_openbsd_restart_daemons() {
+ [ $_START_DAEMONS -eq $BS_FALSE ] && return
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ rcctl restart salt_${fname}
+ done
+
+ return 0
+}
+
+#
+# Ended OpenBSD Install Functions
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# SmartOS Install Functions
+#
+install_smartos_deps() {
+ pkgin -y install zeromq py27-crypto py27-msgpack py27-yaml py27-jinja2 py27-zmq py27-requests || return 1
+
+ # Set _SALT_ETC_DIR to SmartOS default if they didn't specify
+ _SALT_ETC_DIR=${BS_SALT_ETC_DIR:-/opt/local/etc/salt}
+ # We also need to redefine the PKI directory
+ _PKI_DIR=${_SALT_ETC_DIR}/pki
+
+ # Let's trigger config_salt()
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ # Let's set the configuration directory to /tmp
+ _TEMP_CONFIG_DIR="/tmp"
+ CONFIG_SALT_FUNC="config_salt"
+
+ # Let's download, since they were not provided, the default configuration files
+ if [ ! -f "$_SALT_ETC_DIR/minion" ] && [ ! -f "$_TEMP_CONFIG_DIR/minion" ]; then
+ # shellcheck disable=SC2086
+ curl $_CURL_ARGS -s -o "$_TEMP_CONFIG_DIR/minion" -L \
+ https://raw.githubusercontent.com/saltstack/salt/develop/conf/minion || return 1
+ fi
+ if [ ! -f "$_SALT_ETC_DIR/master" ] && [ ! -f $_TEMP_CONFIG_DIR/master ]; then
+ # shellcheck disable=SC2086
+ curl $_CURL_ARGS -s -o "$_TEMP_CONFIG_DIR/master" -L \
+ https://raw.githubusercontent.com/saltstack/salt/develop/conf/master || return 1
+ fi
+ fi
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
+ pkgin -y install py27-apache-libcloud || return 1
+ fi
+
+ if [ "${_EXTRA_PACKAGES}" != "" ]; then
+ echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}"
+ # shellcheck disable=SC2086
+ pkgin -y install ${_EXTRA_PACKAGES} || return 1
+ fi
+
+ return 0
+}
+
+install_smartos_git_deps() {
+ install_smartos_deps || return 1
+
+ if ! __check_command_exists git; then
+ pkgin -y install git || return 1
+ fi
+
+ if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then
+ # Install whichever tornado is in the requirements file
+ __REQUIRED_TORNADO="$(grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")"
+ __check_pip_allowed "You need to allow pip based installations (-P) in order to install the python package '${__REQUIRED_TORNADO}'"
+
+ # Install whichever futures is in the requirements file
+ __REQUIRED_FUTURES="$(grep futures "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")"
+ __check_pip_allowed "You need to allow pip based installations (-P) in order to install the python package '${__REQUIRED_FUTURES}'"
+
+ if [ "${__REQUIRED_TORNADO}" != "" ]; then
+ if ! __check_command_exists pip; then
+ pkgin -y install py27-pip
+ fi
+ pip install -U "${__REQUIRED_TORNADO}"
+ fi
+
+ if [ "${__REQUIRED_FUTURES}" != "" ]; then
+ if ! __check_command_exists pip; then
+ pkgin -y install py27-pip
+ fi
+ pip install -U "${__REQUIRED_FUTURES}"
+ fi
+ fi
+
+ __git_clone_and_checkout || return 1
+ # Let's trigger config_salt()
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/"
+ CONFIG_SALT_FUNC="config_salt"
+ fi
+
+ return 0
+}
+
+install_smartos_stable() {
+ pkgin -y install salt || return 1
+ return 0
+}
+
+install_smartos_git() {
+ # Use setuptools in order to also install dependencies
+ # lets force our config path on the setup for now, since salt/syspaths.py only got fixed in 2015.5.0
+ USE_SETUPTOOLS=1 /opt/local/bin/python setup.py --salt-config-dir="$_SALT_ETC_DIR" --salt-cache-dir="${_SALT_CACHE_DIR}" ${SETUP_PY_INSTALL_ARGS} install || return 1
+ return 0
+}
+
+install_smartos_post() {
+ smf_dir="/opt/custom/smf"
+
+ # Install manifest files if needed.
+ for fname in api master minion syndic; do
+ # Skip if not meant to be installed
+ [ $fname = "api" ] && \
+ ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || ! __check_command_exists "salt-${fname}") && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ svcs network/salt-$fname > /dev/null 2>&1
+ if [ $? -eq 1 ]; then
+ if [ ! -f "$_TEMP_CONFIG_DIR/salt-$fname.xml" ]; then
+ # shellcheck disable=SC2086
+ curl $_CURL_ARGS -s -o "$_TEMP_CONFIG_DIR/salt-$fname.xml" -L \
+ "https://raw.githubusercontent.com/saltstack/salt/develop/pkg/smartos/salt-$fname.xml"
+ fi
+ svccfg import "$_TEMP_CONFIG_DIR/salt-$fname.xml"
+ if [ "${VIRTUAL_TYPE}" = "global" ]; then
+ if [ ! -d "$smf_dir" ]; then
+ mkdir -p "$smf_dir" || return 1
+ fi
+ if [ ! -f "$smf_dir/salt-$fname.xml" ]; then
+ __copyfile "$_TEMP_CONFIG_DIR/salt-$fname.xml" "$smf_dir/" || return 1
+ fi
+ fi
+ fi
+ done
+
+ return 0
+}
+
+install_smartos_git_post() {
+ smf_dir="/opt/custom/smf"
+
+ # Install manifest files if needed.
+ for fname in api master minion syndic; do
+ # Skip if not meant to be installed
+ [ $fname = "api" ] && \
+ ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || ! __check_command_exists "salt-${fname}") && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ svcs "network/salt-$fname" > /dev/null 2>&1
+ if [ $? -eq 1 ]; then
+ svccfg import "${_SALT_GIT_CHECKOUT_DIR}/pkg/smartos/salt-$fname.xml"
+ if [ "${VIRTUAL_TYPE}" = "global" ]; then
+ if [ ! -d $smf_dir ]; then
+ mkdir -p "$smf_dir"
+ fi
+ if [ ! -f "$smf_dir/salt-$fname.xml" ]; then
+ __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/smartos/salt-$fname.xml" "$smf_dir/"
+ fi
+ fi
+ fi
+ done
+
+ return 0
+}
+
+install_smartos_restart_daemons() {
+ [ $_START_DAEMONS -eq $BS_FALSE ] && return
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ # Stop if running && Start service
+ svcadm disable salt-$fname > /dev/null 2>&1
+ svcadm enable salt-$fname
+ done
+
+ return 0
+}
+#
+# Ended SmartOS Install Functions
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# openSUSE Install Functions.
+#
+__ZYPPER_REQUIRES_REPLACE_FILES=-1
+
+__set_suse_pkg_repo() {
+ suse_pkg_url_path="${DISTRO_REPO}/systemsmanagement:saltstack.repo"
+ if [ "$_DOWNSTREAM_PKG_REPO" -eq $BS_TRUE ]; then
+ suse_pkg_url_base="http://download.opensuse.org/repositories/systemsmanagement:/saltstack"
+ else
+ suse_pkg_url_base="${HTTP_VAL}://repo.saltstack.com/opensuse"
+ fi
+ SUSE_PKG_URL="$suse_pkg_url_base/$suse_pkg_url_path"
+}
+
+__version_lte() {
+ if ! __check_command_exists python; then
+ zypper zypper --non-interactive install --replacefiles --auto-agree-with-licenses python || \
+ zypper zypper --non-interactive install --auto-agree-with-licenses python || return 1
+ fi
+
+ if [ "$(python -c 'import sys; V1=tuple([int(i) for i in sys.argv[1].split(".")]); V2=tuple([int(i) for i in sys.argv[2].split(".")]); print V1<=V2' "$1" "$2")" = "True" ]; then
+ __ZYPPER_REQUIRES_REPLACE_FILES=${BS_TRUE}
+ else
+ __ZYPPER_REQUIRES_REPLACE_FILES=${BS_FALSE}
+ fi
+}
+
+__zypper() {
+ zypper --non-interactive "${@}"; return $?
+}
+
+__zypper_install() {
+ if [ "${__ZYPPER_REQUIRES_REPLACE_FILES}" = "-1" ]; then
+ __version_lte "1.10.4" "$(zypper --version | awk '{ print $2 }')"
+ fi
+ if [ "${__ZYPPER_REQUIRES_REPLACE_FILES}" = "${BS_TRUE}" ]; then
+ # In case of file conflicts replace old files.
+ # Option present in zypper 1.10.4 and newer:
+ # https://github.com/openSUSE/zypper/blob/95655728d26d6d5aef7796b675f4cc69bc0c05c0/package/zypper.changes#L253
+ __zypper install --auto-agree-with-licenses --replacefiles "${@}"; return $?
+ else
+ __zypper install --auto-agree-with-licenses "${@}"; return $?
+ fi
+}
+
+install_opensuse_stable_deps() {
+ if [ "${DISTRO_MAJOR_VERSION}" -gt 2015 ]; then
+ DISTRO_REPO="openSUSE_Tumbleweed"
+ elif [ "${DISTRO_MAJOR_VERSION}" -ge 42 ]; then
+ DISTRO_REPO="openSUSE_Leap_${DISTRO_MAJOR_VERSION}.${DISTRO_MINOR_VERSION}"
+ elif [ "${DISTRO_MAJOR_VERSION}" -lt 42 ]; then
+ DISTRO_REPO="openSUSE_${DISTRO_MAJOR_VERSION}.${DISTRO_MINOR_VERSION}"
+ fi
+
+ if [ $_DISABLE_REPOS -eq $BS_FALSE ]; then
+ # Is the repository already known
+ __set_suse_pkg_repo
+ # Check zypper repos and refresh if necessary
+ __check_and_refresh_suse_pkg_repo
+ fi
+
+ __zypper --gpg-auto-import-keys refresh
+ if [ $? -ne 0 ] && [ $? -ne 4 ]; then
+ # If the exit code is not 0, and it's not 4 (failed to update a
+ # repository) return a failure. Otherwise continue.
+ return 1
+ fi
+
+ if [ "$DISTRO_MAJOR_VERSION" -eq 12 ] && [ "$DISTRO_MINOR_VERSION" -eq 3 ]; then
+ # Because patterns-openSUSE-minimal_base-conflicts conflicts with python, lets remove the first one
+ __zypper remove patterns-openSUSE-minimal_base-conflicts
+ fi
+
+ if [ "$_UPGRADE_SYS" -eq $BS_TRUE ]; then
+ __zypper --gpg-auto-import-keys update || return 1
+ fi
+
+ # Salt needs python-zypp installed in order to use the zypper module
+ __PACKAGES="python-zypp"
+ __PACKAGES="${__PACKAGES} python python-Jinja2 python-M2Crypto python-PyYAML python-requests"
+ __PACKAGES="${__PACKAGES} python-msgpack-python python-pycrypto python-pyzmq python-xml"
+
+ if [ "$DISTRO_MAJOR_VERSION" -lt 13 ]; then
+ __PACKAGES="${__PACKAGES} libzmq3"
+ elif [ "$DISTRO_MAJOR_VERSION" -eq 13 ]; then
+ __PACKAGES="${__PACKAGES} libzmq3"
+ elif [ "$DISTRO_MAJOR_VERSION" -gt 13 ]; then
+ __PACKAGES="${__PACKAGES} libzmq5"
+ fi
+
+ # shellcheck disable=SC2086
+ __zypper_install ${__PACKAGES} || return 1
+
+ # Fix for OpenSUSE 13.2 and 2015.8 - gcc should not be required. Work around until package is fixed by SuSE
+ _EXTRA_PACKAGES="${_EXTRA_PACKAGES} gcc python-devel libgit2-devel"
+
+ if [ "${_EXTRA_PACKAGES}" != "" ]; then
+ echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}"
+ # shellcheck disable=SC2086
+ __zypper_install ${_EXTRA_PACKAGES} || return 1
+ fi
+
+ return 0
+}
+
+install_opensuse_git_deps() {
+ if [ "$_INSECURE_DL" -eq $BS_FALSE ] && [ "${_SALT_REPO_URL%%://*}" = "https" ]; then
+ __zypper_install ca-certificates || return 1
+ fi
+
+ install_opensuse_stable_deps || return 1
+
+ if ! __check_command_exists git; then
+ __zypper_install git || return 1
+ fi
+
+ __zypper_install patch || return 1
+
+ __git_clone_and_checkout || return 1
+
+ __PACKAGES=""
+
+ if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then
+ # We're on the develop branch, install whichever tornado is on the requirements file
+ __REQUIRED_TORNADO="$(grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")"
+ if [ "${__REQUIRED_TORNADO}" != "" ]; then
+ __PACKAGES="${__PACKAGES} python-tornado"
+ fi
+ fi
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} python-apache-libcloud"
+ fi
+
+ # shellcheck disable=SC2086
+ __zypper_install ${__PACKAGES} || return 1
+
+ # Let's trigger config_salt()
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/"
+ CONFIG_SALT_FUNC="config_salt"
+ fi
+
+ return 0
+}
+
+install_opensuse_stable() {
+ __PACKAGES=""
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ];then
+ __PACKAGES="${__PACKAGES} salt-cloud"
+ fi
+ if [ "$_INSTALL_MASTER" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} salt-master"
+ fi
+ if [ "$_INSTALL_MINION" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} salt-minion"
+ fi
+ if [ "$_INSTALL_SYNDIC" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} salt-syndic"
+ fi
+
+ # shellcheck disable=SC2086
+ __zypper_install $__PACKAGES || return 1
+
+ return 0
+}
+
+install_opensuse_git() {
+ python setup.py ${SETUP_PY_INSTALL_ARGS} install --prefix=/usr || return 1
+ return 0
+}
+
+install_opensuse_stable_post() {
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -f /bin/systemctl ]; then
+ systemctl is-enabled salt-$fname.service || (systemctl preset salt-$fname.service && systemctl enable salt-$fname.service)
+ sleep 0.1
+ systemctl daemon-reload
+ continue
+ fi
+
+ /sbin/chkconfig --add salt-$fname
+ /sbin/chkconfig salt-$fname on
+ done
+
+ return 0
+}
+
+install_opensuse_git_post() {
+ for fname in api master minion syndic; do
+ # Skip if not meant to be installed
+ [ $fname = "api" ] && \
+ ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || ! __check_command_exists "salt-${fname}") && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -f /bin/systemctl ]; then
+ use_usr_lib=$BS_FALSE
+
+ if [ "${DISTRO_MAJOR_VERSION}" -gt 13 ] || ([ "${DISTRO_MAJOR_VERSION}" -eq 13 ] && [ "${DISTRO_MINOR_VERSION}" -ge 2 ]); then
+ use_usr_lib=$BS_TRUE
+ fi
+
+ if [ "${DISTRO_MAJOR_VERSION}" -eq 12 ] && [ -d "/usr/lib/systemd/" ]; then
+ use_usr_lib=$BS_TRUE
+ fi
+
+ if [ "${use_usr_lib}" -eq $BS_TRUE ]; then
+ __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/salt-${fname}.service" "/usr/lib/systemd/system/salt-${fname}.service"
+ else
+ __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/salt-${fname}.service" "/lib/systemd/system/salt-${fname}.service"
+ fi
+
+ continue
+ fi
+
+ __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/rpm/salt-$fname" "/etc/init.d/salt-$fname"
+ chmod +x /etc/init.d/salt-$fname
+ done
+
+ install_opensuse_stable_post || return 1
+
+ return 0
+}
+
+install_opensuse_restart_daemons() {
+ [ $_START_DAEMONS -eq $BS_FALSE ] && return
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -f /bin/systemctl ]; then
+ systemctl stop salt-$fname > /dev/null 2>&1
+ systemctl start salt-$fname.service
+ continue
+ fi
+
+ service salt-$fname stop > /dev/null 2>&1
+ service salt-$fname start
+ done
+}
+
+install_opensuse_check_services() {
+ if [ ! -f /bin/systemctl ]; then
+ # Not running systemd!? Don't check!
+ return 0
+ fi
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ __check_services_systemd salt-$fname > /dev/null 2>&1 || __check_services_systemd salt-$fname.service > /dev/null 2>&1 || return 1
+ done
+
+ return 0
+}
+#
+# End of openSUSE Install Functions.
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# SUSE Enterprise 12
+#
+
+install_suse_12_stable_deps() {
+ SUSE_PATCHLEVEL=$(awk '/PATCHLEVEL/ {print $3}' /etc/SuSE-release )
+
+ if [ "${SUSE_PATCHLEVEL}" != "" ]; then
+ DISTRO_PATCHLEVEL="_SP${SUSE_PATCHLEVEL}"
+ fi
+ DISTRO_REPO="SLE_${DISTRO_MAJOR_VERSION}${DISTRO_PATCHLEVEL}"
+
+ # SLES 12 repo name does not use a patch level so PATCHLEVEL will need to be updated with SP1
+ #DISTRO_REPO="SLE_${DISTRO_MAJOR_VERSION}${DISTRO_PATCHLEVEL}"
+
+ DISTRO_REPO="SLE_${DISTRO_MAJOR_VERSION}"
+
+ if [ $_DISABLE_REPOS -eq $BS_FALSE ]; then
+ # Is the repository already known
+ __set_suse_pkg_repo
+ # Check zypper repos and refresh if necessary
+ __check_and_refresh_suse_pkg_repo
+ fi
+
+ __zypper --gpg-auto-import-keys refresh || return 1
+
+ if [ "$_UPGRADE_SYS" -eq $BS_TRUE ]; then
+ __zypper --gpg-auto-import-keys update || return 1
+ fi
+
+ # Salt needs python-zypp installed in order to use the zypper module
+ __PACKAGES="python-zypp"
+ # shellcheck disable=SC2089
+ __PACKAGES="${__PACKAGES} libzmq5 python python-Jinja2 python-msgpack-python"
+ __PACKAGES="${__PACKAGES} python-pycrypto python-pyzmq python-pip python-xml python-requests"
+
+ if [ "$SUSE_PATCHLEVEL" -eq 1 ]; then
+ __check_pip_allowed
+ echowarn "PyYaml will be installed using pip"
+ else
+ __PACKAGES="${__PACKAGES} python-PyYAML"
+ fi
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} python-apache-libcloud"
+ fi
+
+ # shellcheck disable=SC2086,SC2090
+ __zypper_install ${__PACKAGES} || return 1
+
+ if [ "$SUSE_PATCHLEVEL" -eq 1 ]; then
+ # There's no python-PyYaml in SP1, let's install it using pip
+ pip install PyYaml || return 1
+ fi
+
+ # PIP based installs need to copy configuration files "by hand".
+ if [ "$SUSE_PATCHLEVEL" -eq 1 ]; then
+ # Let's trigger config_salt()
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ # Let's set the configuration directory to /tmp
+ _TEMP_CONFIG_DIR="/tmp"
+ CONFIG_SALT_FUNC="config_salt"
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since there is no example config for it in the Salt git repo
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ # Syndic uses the same configuration file as the master
+ [ $fname = "syndic" ] && fname=master
+
+ # Let's download, since they were not provided, the default configuration files
+ if [ ! -f "$_SALT_ETC_DIR/$fname" ] && [ ! -f "$_TEMP_CONFIG_DIR/$fname" ]; then
+ # shellcheck disable=SC2086
+ curl $_CURL_ARGS -s -o "$_TEMP_CONFIG_DIR/$fname" -L \
+ "https://raw.githubusercontent.com/saltstack/salt/develop/conf/$fname" || return 1
+ fi
+ done
+ fi
+ fi
+
+ if [ "${_EXTRA_PACKAGES}" != "" ]; then
+ echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}"
+ # shellcheck disable=SC2086
+ __zypper_install ${_EXTRA_PACKAGES} || return 1
+ fi
+
+ return 0
+}
+
+install_suse_12_git_deps() {
+ install_suse_12_stable_deps || return 1
+
+ if ! __check_command_exists git; then
+ __zypper_install git || return 1
+ fi
+
+ __git_clone_and_checkout || return 1
+
+ __PACKAGES=""
+
+ if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then
+ # We're on the develop branch, install whichever tornado is on the requirements file
+ __REQUIRED_TORNADO="$(grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")"
+ if [ "${__REQUIRED_TORNADO}" != "" ]; then
+ __PACKAGES="${__PACKAGES} python-tornado"
+ fi
+ fi
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} python-apache-libcloud"
+ fi
+
+ # shellcheck disable=SC2086
+ __zypper_install ${__PACKAGES} || return 1
+
+ # Let's trigger config_salt()
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/"
+ CONFIG_SALT_FUNC="config_salt"
+ fi
+
+ return 0
+}
+
+install_suse_12_stable() {
+ if [ "$SUSE_PATCHLEVEL" -gt 1 ]; then
+ install_opensuse_stable || return 1
+ else
+ # USE_SETUPTOOLS=1 To work around
+ # error: option --single-version-externally-managed not recognized
+ USE_SETUPTOOLS=1 pip install salt || return 1
+ fi
+
+ return 0
+}
+
+install_suse_12_git() {
+ install_opensuse_git || return 1
+ return 0
+}
+
+install_suse_12_stable_post() {
+ if [ "$SUSE_PATCHLEVEL" -gt 1 ]; then
+ install_opensuse_stable_post || return 1
+ else
+ for fname in api master minion syndic; do
+ # Skip if not meant to be installed
+ [ $fname = "api" ] && \
+ ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || ! __check_command_exists "salt-${fname}") && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -f /bin/systemctl ]; then
+ # shellcheck disable=SC2086
+ curl $_CURL_ARGS -L "https://github.com/saltstack/salt/raw/develop/pkg/salt-$fname.service" \
+ -o "/usr/lib/systemd/system/salt-$fname.service" || return 1
+ continue
+ fi
+
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ if [ -f /bin/systemctl ]; then
+ systemctl is-enabled salt-$fname.service || (systemctl preset salt-$fname.service && systemctl enable salt-$fname.service)
+ sleep 0.1
+ systemctl daemon-reload
+ fi
+ done
+ fi
+
+ return 0
+}
+
+install_suse_12_git_post() {
+ install_opensuse_git_post || return 1
+ return 0
+}
+
+install_suse_12_restart_daemons() {
+ install_opensuse_restart_daemons || return 1
+ return 0
+}
+
+#
+# End of SUSE Enterprise 12
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# SUSE Enterprise 11
+#
+
+install_suse_11_stable_deps() {
+ SUSE_PATCHLEVEL=$(awk '/PATCHLEVEL/ {print $3}' /etc/SuSE-release )
+ if [ "${SUSE_PATCHLEVEL}" != "" ]; then
+ if [ "${SUSE_PATCHLEVEL}" != "4" ]; then
+ echowarn "Salt packages for SLE 11 are only build for SP4."
+ echowarn "Attempting to install SP4 packages on SP${SUSE_PATCHLEVEL}."
+ fi
+ DISTRO_PATCHLEVEL="_SP4"
+ fi
+ DISTRO_REPO="SLE_${DISTRO_MAJOR_VERSION}${DISTRO_PATCHLEVEL}"
+
+ if [ $_DISABLE_REPOS -eq $BS_FALSE ]; then
+ # Is the repository already known
+ __set_suse_pkg_repo
+ # Check zypper repos and refresh if necessary
+ __check_and_refresh_suse_pkg_repo
+ fi
+
+ __zypper --gpg-auto-import-keys refresh || return 1
+
+ if [ "$_UPGRADE_SYS" -eq $BS_TRUE ]; then
+ __zypper --gpg-auto-import-keys update || return 1
+ fi
+
+ # Salt needs python-zypp installed in order to use the zypper module
+ __PACKAGES="python-zypp"
+ # shellcheck disable=SC2089
+ __PACKAGES="${__PACKAGES} libzmq5 python python-Jinja2 python-msgpack-python"
+ __PACKAGES="${__PACKAGES} python-pycrypto python-pyzmq python-pip python-xml python-requests"
+
+ if [ "$SUSE_PATCHLEVEL" -eq 1 ]; then
+ __check_pip_allowed
+ echowarn "PyYaml will be installed using pip"
+ else
+ __PACKAGES="${__PACKAGES} python-PyYAML"
+ fi
+
+ # shellcheck disable=SC2086,SC2090
+ __zypper_install ${__PACKAGES} || return 1
+
+ if [ "$SUSE_PATCHLEVEL" -eq 1 ]; then
+ # There's no python-PyYaml in SP1, let's install it using pip
+ pip install PyYaml || return 1
+ fi
+
+ # PIP based installs need to copy configuration files "by hand".
+ if [ "$SUSE_PATCHLEVEL" -eq 1 ]; then
+ # Let's trigger config_salt()
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ # Let's set the configuration directory to /tmp
+ _TEMP_CONFIG_DIR="/tmp"
+ CONFIG_SALT_FUNC="config_salt"
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since there is no example config for it in the Salt git repo
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ # Syndic uses the same configuration file as the master
+ [ $fname = "syndic" ] && fname=master
+
+ # Let's download, since they were not provided, the default configuration files
+ if [ ! -f "$_SALT_ETC_DIR/$fname" ] && [ ! -f "$_TEMP_CONFIG_DIR/$fname" ]; then
+ # shellcheck disable=SC2086
+ curl $_CURL_ARGS -s -o "$_TEMP_CONFIG_DIR/$fname" -L \
+ "https://raw.githubusercontent.com/saltstack/salt/develop/conf/$fname" || return 1
+ fi
+ done
+ fi
+ fi
+
+ if [ "${_EXTRA_PACKAGES}" != "" ]; then
+ echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}"
+ # shellcheck disable=SC2086
+ __zypper_install ${_EXTRA_PACKAGES} || return 1
+ fi
+
+ return 0
+}
+
+install_suse_11_git_deps() {
+ install_suse_11_stable_deps || return 1
+
+ if ! __check_command_exists git; then
+ __zypper_install git || return 1
+ fi
+
+ __git_clone_and_checkout || return 1
+
+ __PACKAGES=""
+
+ if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then
+ # We're on the develop branch, install whichever tornado is on the requirements file
+ __REQUIRED_TORNADO="$(grep tornado "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")"
+ if [ "${__REQUIRED_TORNADO}" != "" ]; then
+ __PACKAGES="${__PACKAGES} python-tornado"
+ fi
+ fi
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
+ __PACKAGES="${__PACKAGES} python-apache-libcloud"
+ fi
+
+ # shellcheck disable=SC2086
+ __zypper_install ${__PACKAGES} || return 1
+
+ # Let's trigger config_salt()
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ _TEMP_CONFIG_DIR="${_SALT_GIT_CHECKOUT_DIR}/conf/"
+ CONFIG_SALT_FUNC="config_salt"
+ fi
+
+ return 0
+}
+
+install_suse_11_stable() {
+ if [ "$SUSE_PATCHLEVEL" -gt 1 ]; then
+ install_opensuse_stable || return 1
+ else
+ # USE_SETUPTOOLS=1 To work around
+ # error: option --single-version-externally-managed not recognized
+ USE_SETUPTOOLS=1 pip install salt || return 1
+ fi
+ return 0
+}
+
+install_suse_11_git() {
+ install_opensuse_git || return 1
+ return 0
+}
+
+install_suse_11_stable_post() {
+ if [ "$SUSE_PATCHLEVEL" -gt 1 ]; then
+ install_opensuse_stable_post || return 1
+ else
+ for fname in api master minion syndic; do
+ # Skip if not meant to be installed
+ [ $fname = "api" ] && \
+ ([ "$_INSTALL_MASTER" -eq $BS_FALSE ] || ! __check_command_exists "salt-${fname}") && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -f /bin/systemctl ]; then
+ # shellcheck disable=SC2086
+ curl $_CURL_ARGS -L "https://github.com/saltstack/salt/raw/develop/pkg/salt-$fname.service" \
+ -o "/lib/systemd/system/salt-$fname.service" || return 1
+ continue
+ fi
+
+ # shellcheck disable=SC2086
+ curl $_CURL_ARGS -L "https://github.com/saltstack/salt/raw/develop/pkg/rpm/salt-$fname" \
+ -o "/etc/init.d/salt-$fname" || return 1
+ chmod +x "/etc/init.d/salt-$fname"
+
+ done
+ fi
+
+ return 0
+}
+
+install_suse_11_git_post() {
+ install_opensuse_git_post || return 1
+ return 0
+}
+
+install_suse_11_restart_daemons() {
+ install_opensuse_restart_daemons || return 1
+ return 0
+}
+
+
+#
+# End of SUSE Enterprise 11
+#
+#######################################################################################################################
+#
+# SUSE Enterprise General Functions
+#
+
+# Used for both SLE 11 and 12
+install_suse_check_services() {
+ if [ ! -f /bin/systemctl ]; then
+ # Not running systemd!? Don't check!
+ return 0
+ fi
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ __check_services_systemd salt-$fname || return 1
+ done
+
+ return 0
+}
+
+#
+# SUSE Enterprise General Functions
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# Gentoo Install Functions.
+#
+__emerge() {
+ if [ "$_GENTOO_USE_BINHOST" -eq $BS_TRUE ]; then
+ emerge --autounmask-write --getbinpkg "${@}"; return $?
+ fi
+ emerge --autounmask-write "${@}"; return $?
+}
+
+__gentoo_config_protection() {
+ # usually it's a good thing to have config files protected by portage, but
+ # in this case this would require to interrupt the bootstrapping script at
+ # this point, manually merge the changes using etc-update/dispatch-conf/
+ # cfg-update and then restart the bootstrapping script, so instead we allow
+ # at this point to modify certain config files directly
+ export CONFIG_PROTECT_MASK="${CONFIG_PROTECT_MASK:-} /etc/portage/package.accept_keywords /etc/portage/package.keywords /etc/portage/package.license /etc/portage/package.unmask /etc/portage/package.use"
+}
+
+__gentoo_pre_dep() {
+ if [ "$_ECHO_DEBUG" -eq $BS_TRUE ]; then
+ if __check_command_exists eix; then
+ eix-sync
+ else
+ emerge --sync
+ fi
+ else
+ if __check_command_exists eix; then
+ eix-sync -q
+ else
+ emerge --sync --quiet
+ fi
+ fi
+ if [ ! -d /etc/portage ]; then
+ mkdir /etc/portage
+ fi
+}
+
+__gentoo_post_dep() {
+ # ensures dev-lib/crypto++ compiles happily
+ __emerge --oneshot 'sys-devel/libtool'
+ # the -o option asks it to emerge the deps but not the package.
+ __gentoo_config_protection
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
+ __emerge -v 'dev-python/libcloud'
+ fi
+
+ __emerge -vo 'dev-python/requests'
+ __emerge -vo 'app-admin/salt'
+
+ if [ "${_EXTRA_PACKAGES}" != "" ]; then
+ echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}"
+ # shellcheck disable=SC2086
+ __emerge -v ${_EXTRA_PACKAGES} || return 1
+ fi
+}
+
+install_gentoo_deps() {
+ __gentoo_pre_dep || return 1
+ __gentoo_post_dep || return 1
+}
+
+install_gentoo_git_deps() {
+ __gentoo_pre_dep || return 1
+ __gentoo_post_dep || return 1
+}
+
+install_gentoo_stable() {
+ __gentoo_config_protection
+ __emerge -v 'app-admin/salt' || return 1
+}
+
+install_gentoo_git() {
+ __gentoo_config_protection
+ __emerge -v '=app-admin/salt-9999' || return 1
+}
+
+install_gentoo_post() {
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -d "/run/systemd/system" ]; then
+ systemctl enable salt-$fname.service
+ systemctl start salt-$fname.service
+ else
+ rc-update add salt-$fname default
+ /etc/init.d/salt-$fname start
+ fi
+ done
+}
+
+install_gentoo_restart_daemons() {
+ [ $_START_DAEMONS -eq $BS_FALSE ] && return
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ -d "/run/systemd/system" ]; then
+ systemctl stop salt-$fname > /dev/null 2>&1
+ systemctl start salt-$fname.service
+ else
+ /etc/init.d/salt-$fname stop > /dev/null 2>&1
+ /etc/init.d/salt-$fname start
+ fi
+ done
+}
+
+install_gentoo_check_services() {
+ if [ ! -d "/run/systemd/system" ]; then
+ # Not running systemd!? Don't check!
+ return 0
+ fi
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ __check_services_systemd salt-$fname || return 1
+ done
+
+ return 0
+}
+#
+# End of Gentoo Install Functions.
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# Default minion configuration function. Matches ANY distribution as long as
+# the -c options is passed.
+#
+config_salt() {
+ # If the configuration directory is not passed, return
+ [ "$_TEMP_CONFIG_DIR" = "null" ] && return
+
+ if [ "$_CONFIG_ONLY" -eq $BS_TRUE ]; then
+ echowarn "Passing -C (config only) option implies -F (forced overwrite)."
+
+ if [ "$_FORCE_OVERWRITE" -ne $BS_TRUE ]; then
+ echowarn "Overwriting configs in 11 seconds!"
+ sleep 11
+ _FORCE_OVERWRITE=$BS_TRUE
+ fi
+ fi
+
+ # Let's create the necessary directories
+ [ -d "$_SALT_ETC_DIR" ] || mkdir "$_SALT_ETC_DIR" || return 1
+ [ -d "$_PKI_DIR" ] || (mkdir -p "$_PKI_DIR" && chmod 700 "$_PKI_DIR") || return 1
+
+ # If -C or -F was passed, we don't need a .bak file for the config we're updating
+ # This is used in the custom master/minion config file checks below
+ CREATE_BAK=$BS_TRUE
+ if [ "$_FORCE_OVERWRITE" -eq $BS_TRUE ]; then
+ CREATE_BAK=$BS_FALSE
+ fi
+
+ CONFIGURED_ANYTHING=$BS_FALSE
+
+ # Copy the grains file if found
+ if [ -f "$_TEMP_CONFIG_DIR/grains" ]; then
+ echodebug "Moving provided grains file from $_TEMP_CONFIG_DIR/grains to $_SALT_ETC_DIR/grains"
+ __movefile "$_TEMP_CONFIG_DIR/grains" "$_SALT_ETC_DIR/grains" || return 1
+ CONFIGURED_ANYTHING=$BS_TRUE
+ fi
+
+ if [ "$_INSTALL_MINION" -eq $BS_TRUE ] || \
+ [ "$_CONFIG_ONLY" -eq $BS_TRUE ] || [ "$_CUSTOM_MINION_CONFIG" != "null" ]; then
+ # Create the PKI directory
+ [ -d "$_PKI_DIR/minion" ] || (mkdir -p "$_PKI_DIR/minion" && chmod 700 "$_PKI_DIR/minion") || return 1
+
+ # Check to see if a custom minion config json dict was provided
+ if [ "$_CUSTOM_MINION_CONFIG" != "null" ]; then
+
+ # Check if a minion config file already exists and move to .bak if needed
+ if [ -f "$_SALT_ETC_DIR/minion" ] && [ "$CREATE_BAK" -eq "$BS_TRUE" ]; then
+ __movefile "$_SALT_ETC_DIR/minion" "$_SALT_ETC_DIR/minion.bak" $BS_TRUE || return 1
+ CONFIGURED_ANYTHING=$BS_TRUE
+ fi
+
+ # Overwrite/create the config file with the yaml string
+ __overwriteconfig "$_SALT_ETC_DIR/minion" "$_CUSTOM_MINION_CONFIG" || return 1
+ CONFIGURED_ANYTHING=$BS_TRUE
+
+ # Copy the minions configuration if found
+ # Explicitly check for custom master config to avoid moving the minion config
+ elif [ -f "$_TEMP_CONFIG_DIR/minion" ] && [ "$_CUSTOM_MASTER_CONFIG" = "null" ]; then
+ __movefile "$_TEMP_CONFIG_DIR/minion" "$_SALT_ETC_DIR" "$_FORCE_OVERWRITE" || return 1
+ CONFIGURED_ANYTHING=$BS_TRUE
+ fi
+
+ # Copy the minion's keys if found
+ if [ -f "$_TEMP_CONFIG_DIR/minion.pem" ]; then
+ __movefile "$_TEMP_CONFIG_DIR/minion.pem" "$_PKI_DIR/minion/" "$_CONFIG_ONLY" || return 1
+ chmod 400 "$_PKI_DIR/minion/minion.pem" || return 1
+ CONFIGURED_ANYTHING=$BS_TRUE
+ fi
+ if [ -f "$_TEMP_CONFIG_DIR/minion.pub" ]; then
+ __movefile "$_TEMP_CONFIG_DIR/minion.pub" "$_PKI_DIR/minion/" "$_CONFIG_ONLY" || return 1
+ chmod 664 "$_PKI_DIR/minion/minion.pub" || return 1
+ CONFIGURED_ANYTHING=$BS_TRUE
+ fi
+ # For multi-master-pki, copy the master_sign public key if found
+ if [ -f "$_TEMP_CONFIG_DIR/master_sign.pub" ]; then
+ __movefile "$_TEMP_CONFIG_DIR/master_sign.pub" "$_PKI_DIR/minion/" || return 1
+ chmod 664 "$_PKI_DIR/minion/master_sign.pub" || return 1
+ CONFIGURED_ANYTHING=$BS_TRUE
+ fi
+ fi
+
+ # only (re)place master or syndic configs if -M (install master) or -S
+ # (install syndic) specified
+ OVERWRITE_MASTER_CONFIGS=$BS_FALSE
+ if [ "$_INSTALL_MASTER" -eq $BS_TRUE ] && [ "$_CONFIG_ONLY" -eq $BS_TRUE ]; then
+ OVERWRITE_MASTER_CONFIGS=$BS_TRUE
+ fi
+ if [ "$_INSTALL_SYNDIC" -eq $BS_TRUE ] && [ "$_CONFIG_ONLY" -eq $BS_TRUE ]; then
+ OVERWRITE_MASTER_CONFIGS=$BS_TRUE
+ fi
+
+ if [ "$_INSTALL_MASTER" -eq $BS_TRUE ] || [ "$_INSTALL_SYNDIC" -eq $BS_TRUE ] || [ "$OVERWRITE_MASTER_CONFIGS" -eq $BS_TRUE ] || [ "$_CUSTOM_MASTER_CONFIG" != "null" ]; then
+ # Create the PKI directory
+ [ -d "$_PKI_DIR/master" ] || (mkdir -p "$_PKI_DIR/master" && chmod 700 "$_PKI_DIR/master") || return 1
+
+ # Check to see if a custom master config json dict was provided
+ if [ "$_CUSTOM_MASTER_CONFIG" != "null" ]; then
+
+ # Check if a master config file already exists and move to .bak if needed
+ if [ -f "$_SALT_ETC_DIR/master" ] && [ "$CREATE_BAK" -eq "$BS_TRUE" ]; then
+ __movefile "$_SALT_ETC_DIR/master" "$_SALT_ETC_DIR/master.bak" $BS_TRUE || return 1
+ CONFIGURED_ANYTHING=$BS_TRUE
+ fi
+
+ # Overwrite/create the config file with the yaml string
+ __overwriteconfig "$_SALT_ETC_DIR/master" "$_CUSTOM_MASTER_CONFIG" || return 1
+ CONFIGURED_ANYTHING=$BS_TRUE
+
+ # Copy the masters configuration if found
+ elif [ -f "$_TEMP_CONFIG_DIR/master" ]; then
+ __movefile "$_TEMP_CONFIG_DIR/master" "$_SALT_ETC_DIR" || return 1
+ CONFIGURED_ANYTHING=$BS_TRUE
+ fi
+
+ # Copy the master's keys if found
+ if [ -f "$_TEMP_CONFIG_DIR/master.pem" ]; then
+ __movefile "$_TEMP_CONFIG_DIR/master.pem" "$_PKI_DIR/master/" || return 1
+ chmod 400 "$_PKI_DIR/master/master.pem" || return 1
+ CONFIGURED_ANYTHING=$BS_TRUE
+ fi
+ if [ -f "$_TEMP_CONFIG_DIR/master.pub" ]; then
+ __movefile "$_TEMP_CONFIG_DIR/master.pub" "$_PKI_DIR/master/" || return 1
+ chmod 664 "$_PKI_DIR/master/master.pub" || return 1
+ CONFIGURED_ANYTHING=$BS_TRUE
+ fi
+ fi
+
+ if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
+ # Recursively copy salt-cloud configs with overwriting if necessary
+ for file in "$_TEMP_CONFIG_DIR"/cloud*; do
+ if [ -f "$file" ]; then
+ __copyfile "$file" "$_SALT_ETC_DIR" || return 1
+ elif [ -d "$file" ]; then
+ subdir="$(basename "$file")"
+ mkdir -p "$_SALT_ETC_DIR/$subdir"
+ for file_d in "$_TEMP_CONFIG_DIR/$subdir"/*; do
+ if [ -f "$file_d" ]; then
+ __copyfile "$file_d" "$_SALT_ETC_DIR/$subdir" || return 1
+ fi
+ done
+ fi
+ done
+ fi
+
+ if [ "$_CONFIG_ONLY" -eq $BS_TRUE ] && [ $CONFIGURED_ANYTHING -eq $BS_FALSE ]; then
+ echowarn "No configuration or keys were copied over. No configuration was done!"
+ exit 0
+ fi
+
+ return 0
+}
+#
+# Ended Default Configuration function
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# Default salt master minion keys pre-seed function. Matches ANY distribution
+# as long as the -k option is passed.
+#
+preseed_master() {
+ # Create the PKI directory
+
+ if [ "$(find "$_TEMP_KEYS_DIR" -maxdepth 1 -type f | wc -l)" -lt 1 ]; then
+ echoerror "No minion keys were uploaded. Unable to pre-seed master"
+ return 1
+ fi
+
+ SEED_DEST="$_PKI_DIR/master/minions"
+ [ -d "$SEED_DEST" ] || (mkdir -p "$SEED_DEST" && chmod 700 "$SEED_DEST") || return 1
+
+ for keyfile in $_TEMP_KEYS_DIR/*; do
+ keyfile=$(basename "${keyfile}")
+ src_keyfile="${_TEMP_KEYS_DIR}/${keyfile}"
+ dst_keyfile="${SEED_DEST}/${keyfile}"
+
+ # If it's not a file, skip to the next
+ [ ! -f "$src_keyfile" ] && continue
+
+ __movefile "$src_keyfile" "$dst_keyfile" || return 1
+ chmod 664 "$dst_keyfile" || return 1
+ done
+
+ return 0
+}
+#
+# Ended Default Salt Master Pre-Seed minion keys function
+#
+#######################################################################################################################
+
+#######################################################################################################################
+#
+# This function checks if all of the installed daemons are running or not.
+#
+daemons_running() {
+ [ "$_START_DAEMONS" -eq $BS_FALSE ] && return 0
+
+ FAILED_DAEMONS=0
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ # shellcheck disable=SC2009
+ if [ "${DISTRO_NAME}" = "SmartOS" ]; then
+ if [ "$(svcs -Ho STA salt-$fname)" != "ON" ]; then
+ echoerror "salt-$fname was not found running"
+ FAILED_DAEMONS=$((FAILED_DAEMONS + 1))
+ fi
+ elif [ "$(ps wwwaux | grep -v grep | grep salt-$fname)" = "" ]; then
+ echoerror "salt-$fname was not found running"
+ FAILED_DAEMONS=$((FAILED_DAEMONS + 1))
+ fi
+ done
+
+ return $FAILED_DAEMONS
+}
+#
+# Ended daemons running check function
+#
+#######################################################################################################################
+
+#======================================================================================================================
+# LET'S PROCEED WITH OUR INSTALLATION
+#======================================================================================================================
+
+# Let's get the dependencies install function
+if [ ${_NO_DEPS} -eq $BS_FALSE ]; then
+ DEP_FUNC_NAMES="install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}_${ITYPE}_deps"
+ DEP_FUNC_NAMES="$DEP_FUNC_NAMES install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}${PREFIXED_DISTRO_MINOR_VERSION}_${ITYPE}_deps"
+ DEP_FUNC_NAMES="$DEP_FUNC_NAMES install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}_deps"
+ DEP_FUNC_NAMES="$DEP_FUNC_NAMES install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}${PREFIXED_DISTRO_MINOR_VERSION}_deps"
+ DEP_FUNC_NAMES="$DEP_FUNC_NAMES install_${DISTRO_NAME_L}_${ITYPE}_deps"
+ DEP_FUNC_NAMES="$DEP_FUNC_NAMES install_${DISTRO_NAME_L}_deps"
+elif [ "${ITYPE}" = "git" ]; then
+ DEP_FUNC_NAMES="__git_clone_and_checkout"
+else
+ DEP_FUNC_NAMES=""
+fi
+
+DEPS_INSTALL_FUNC="null"
+for FUNC_NAME in $(__strip_duplicates "$DEP_FUNC_NAMES"); do
+ if __function_defined "$FUNC_NAME"; then
+ DEPS_INSTALL_FUNC="$FUNC_NAME"
+ break
+ fi
+done
+echodebug "DEPS_INSTALL_FUNC=${DEPS_INSTALL_FUNC}"
+
+# Let's get the Salt config function
+CONFIG_FUNC_NAMES="config_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}_${ITYPE}_salt"
+CONFIG_FUNC_NAMES="$CONFIG_FUNC_NAMES config_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}${PREFIXED_DISTRO_MINOR_VERSION}_${ITYPE}_salt"
+CONFIG_FUNC_NAMES="$CONFIG_FUNC_NAMES config_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}_salt"
+CONFIG_FUNC_NAMES="$CONFIG_FUNC_NAMES config_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}${PREFIXED_DISTRO_MINOR_VERSION}_salt"
+CONFIG_FUNC_NAMES="$CONFIG_FUNC_NAMES config_${DISTRO_NAME_L}_${ITYPE}_salt"
+CONFIG_FUNC_NAMES="$CONFIG_FUNC_NAMES config_${DISTRO_NAME_L}_salt"
+CONFIG_FUNC_NAMES="$CONFIG_FUNC_NAMES config_salt"
+
+CONFIG_SALT_FUNC="null"
+for FUNC_NAME in $(__strip_duplicates "$CONFIG_FUNC_NAMES"); do
+ if __function_defined "$FUNC_NAME"; then
+ CONFIG_SALT_FUNC="$FUNC_NAME"
+ break
+ fi
+done
+echodebug "CONFIG_SALT_FUNC=${CONFIG_SALT_FUNC}"
+
+# Let's get the pre-seed master function
+PRESEED_FUNC_NAMES="preseed_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}_${ITYPE}_master"
+PRESEED_FUNC_NAMES="$PRESEED_FUNC_NAMES preseed_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}${PREFIXED_DISTRO_MINOR_VERSION}_${ITYPE}_master"
+PRESEED_FUNC_NAMES="$PRESEED_FUNC_NAMES preseed_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}_master"
+PRESEED_FUNC_NAMES="$PRESEED_FUNC_NAMES preseed_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}${PREFIXED_DISTRO_MINOR_VERSION}_master"
+PRESEED_FUNC_NAMES="$PRESEED_FUNC_NAMES preseed_${DISTRO_NAME_L}_${ITYPE}_master"
+PRESEED_FUNC_NAMES="$PRESEED_FUNC_NAMES preseed_${DISTRO_NAME_L}_master"
+PRESEED_FUNC_NAMES="$PRESEED_FUNC_NAMES preseed_master"
+
+PRESEED_MASTER_FUNC="null"
+for FUNC_NAME in $(__strip_duplicates "$PRESEED_FUNC_NAMES"); do
+ if __function_defined "$FUNC_NAME"; then
+ PRESEED_MASTER_FUNC="$FUNC_NAME"
+ break
+ fi
+done
+echodebug "PRESEED_MASTER_FUNC=${PRESEED_MASTER_FUNC}"
+
+# Let's get the install function
+INSTALL_FUNC_NAMES="install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}_${ITYPE}"
+INSTALL_FUNC_NAMES="$INSTALL_FUNC_NAMES install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}${PREFIXED_DISTRO_MINOR_VERSION}_${ITYPE}"
+INSTALL_FUNC_NAMES="$INSTALL_FUNC_NAMES install_${DISTRO_NAME_L}_${ITYPE}"
+
+INSTALL_FUNC="null"
+for FUNC_NAME in $(__strip_duplicates "$INSTALL_FUNC_NAMES"); do
+ if __function_defined "$FUNC_NAME"; then
+ INSTALL_FUNC="$FUNC_NAME"
+ break
+ fi
+done
+echodebug "INSTALL_FUNC=${INSTALL_FUNC}"
+
+# Let's get the post install function
+POST_FUNC_NAMES="install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}_${ITYPE}_post"
+POST_FUNC_NAMES="$POST_FUNC_NAMES install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}${PREFIXED_DISTRO_MINOR_VERSION}_${ITYPE}_post"
+POST_FUNC_NAMES="$POST_FUNC_NAMES install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}_post"
+POST_FUNC_NAMES="$POST_FUNC_NAMES install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}${PREFIXED_DISTRO_MINOR_VERSION}_post"
+POST_FUNC_NAMES="$POST_FUNC_NAMES install_${DISTRO_NAME_L}_${ITYPE}_post"
+POST_FUNC_NAMES="$POST_FUNC_NAMES install_${DISTRO_NAME_L}_post"
+
+POST_INSTALL_FUNC="null"
+for FUNC_NAME in $(__strip_duplicates "$POST_FUNC_NAMES"); do
+ if __function_defined "$FUNC_NAME"; then
+ POST_INSTALL_FUNC="$FUNC_NAME"
+ break
+ fi
+done
+echodebug "POST_INSTALL_FUNC=${POST_INSTALL_FUNC}"
+
+# Let's get the start daemons install function
+STARTDAEMONS_FUNC_NAMES="install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}_${ITYPE}_restart_daemons"
+STARTDAEMONS_FUNC_NAMES="$STARTDAEMONS_FUNC_NAMES install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}${PREFIXED_DISTRO_MINOR_VERSION}_${ITYPE}_restart_daemons"
+STARTDAEMONS_FUNC_NAMES="$STARTDAEMONS_FUNC_NAMES install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}_restart_daemons"
+STARTDAEMONS_FUNC_NAMES="$STARTDAEMONS_FUNC_NAMES install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}${PREFIXED_DISTRO_MINOR_VERSION}_restart_daemons"
+STARTDAEMONS_FUNC_NAMES="$STARTDAEMONS_FUNC_NAMES install_${DISTRO_NAME_L}_${ITYPE}_restart_daemons"
+STARTDAEMONS_FUNC_NAMES="$STARTDAEMONS_FUNC_NAMES install_${DISTRO_NAME_L}_restart_daemons"
+
+STARTDAEMONS_INSTALL_FUNC="null"
+for FUNC_NAME in $(__strip_duplicates "$STARTDAEMONS_FUNC_NAMES"); do
+ if __function_defined "$FUNC_NAME"; then
+ STARTDAEMONS_INSTALL_FUNC="$FUNC_NAME"
+ break
+ fi
+done
+echodebug "STARTDAEMONS_INSTALL_FUNC=${STARTDAEMONS_INSTALL_FUNC}"
+
+# Let's get the daemons running check function.
+DAEMONS_RUNNING_FUNC_NAMES="daemons_running_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}_${ITYPE}"
+DAEMONS_RUNNING_FUNC_NAMES="$DAEMONS_RUNNING_FUNC_NAMES daemons_running_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}${PREFIXED_DISTRO_MINOR_VERSION}_${ITYPE}"
+DAEMONS_RUNNING_FUNC_NAMES="$DAEMONS_RUNNING_FUNC_NAMES daemons_running_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}"
+DAEMONS_RUNNING_FUNC_NAMES="$DAEMONS_RUNNING_FUNC_NAMES daemons_running_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}${PREFIXED_DISTRO_MINOR_VERSION}"
+DAEMONS_RUNNING_FUNC_NAMES="$DAEMONS_RUNNING_FUNC_NAMES daemons_running_${DISTRO_NAME_L}_${ITYPE}"
+DAEMONS_RUNNING_FUNC_NAMES="$DAEMONS_RUNNING_FUNC_NAMES daemons_running_${DISTRO_NAME_L}"
+DAEMONS_RUNNING_FUNC_NAMES="$DAEMONS_RUNNING_FUNC_NAMES daemons_running"
+
+DAEMONS_RUNNING_FUNC="null"
+for FUNC_NAME in $(__strip_duplicates "$DAEMONS_RUNNING_FUNC_NAMES"); do
+ if __function_defined "$FUNC_NAME"; then
+ DAEMONS_RUNNING_FUNC="$FUNC_NAME"
+ break
+ fi
+done
+echodebug "DAEMONS_RUNNING_FUNC=${DAEMONS_RUNNING_FUNC}"
+
+# Let's get the check services function
+if [ ${_DISABLE_SALT_CHECKS} -eq $BS_FALSE ]; then
+ CHECK_SERVICES_FUNC_NAMES="install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}_${ITYPE}_check_services"
+ CHECK_SERVICES_FUNC_NAMES="$CHECK_SERVICES_FUNC_NAMES install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}${PREFIXED_DISTRO_MINOR_VERSION}_${ITYPE}_check_services"
+ CHECK_SERVICES_FUNC_NAMES="$CHECK_SERVICES_FUNC_NAMES install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}_check_services"
+ CHECK_SERVICES_FUNC_NAMES="$CHECK_SERVICES_FUNC_NAMES install_${DISTRO_NAME_L}${PREFIXED_DISTRO_MAJOR_VERSION}${PREFIXED_DISTRO_MINOR_VERSION}_check_services"
+ CHECK_SERVICES_FUNC_NAMES="$CHECK_SERVICES_FUNC_NAMES install_${DISTRO_NAME_L}_${ITYPE}_check_services"
+ CHECK_SERVICES_FUNC_NAMES="$CHECK_SERVICES_FUNC_NAMES install_${DISTRO_NAME_L}_check_services"
+else
+ CHECK_SERVICES_FUNC_NAMES=""
+fi
+
+CHECK_SERVICES_FUNC="null"
+for FUNC_NAME in $(__strip_duplicates "$CHECK_SERVICES_FUNC_NAMES"); do
+ if __function_defined "$FUNC_NAME"; then
+ CHECK_SERVICES_FUNC="$FUNC_NAME"
+ break
+ fi
+done
+echodebug "CHECK_SERVICES_FUNC=${CHECK_SERVICES_FUNC}"
+
+if [ "$DEPS_INSTALL_FUNC" = "null" ]; then
+ echoerror "No dependencies installation function found. Exiting..."
+ exit 1
+fi
+
+if [ "$INSTALL_FUNC" = "null" ]; then
+ echoerror "No installation function found. Exiting..."
+ exit 1
+fi
+
+# Install dependencies
+if [ "$_CONFIG_ONLY" -eq $BS_FALSE ]; then
+ # Only execute function is not in config mode only
+ echoinfo "Running ${DEPS_INSTALL_FUNC}()"
+ $DEPS_INSTALL_FUNC
+ if [ $? -ne 0 ]; then
+ echoerror "Failed to run ${DEPS_INSTALL_FUNC}()!!!"
+ exit 1
+ fi
+fi
+
+# Triggering config_salt() if overwriting master or minion configs
+if [ "$_CUSTOM_MASTER_CONFIG" != "null" ] || [ "$_CUSTOM_MINION_CONFIG" != "null" ]; then
+ if [ "$_TEMP_CONFIG_DIR" = "null" ]; then
+ _TEMP_CONFIG_DIR="$_SALT_ETC_DIR"
+ fi
+
+ if [ "$_CONFIG_ONLY" -eq $BS_TRUE ]; then
+ # Execute function to satisfy dependencies for configuration step
+ echoinfo "Running ${DEPS_INSTALL_FUNC}()"
+ $DEPS_INSTALL_FUNC
+ if [ $? -ne 0 ]; then
+ echoerror "Failed to run ${DEPS_INSTALL_FUNC}()!!!"
+ exit 1
+ fi
+ fi
+fi
+
+# Configure Salt
+if [ "$CONFIG_SALT_FUNC" != "null" ] && [ "$_TEMP_CONFIG_DIR" != "null" ]; then
+ echoinfo "Running ${CONFIG_SALT_FUNC}()"
+ $CONFIG_SALT_FUNC
+ if [ $? -ne 0 ]; then
+ echoerror "Failed to run ${CONFIG_SALT_FUNC}()!!!"
+ exit 1
+ fi
+fi
+
+# Drop the master address if passed
+if [ "$_SALT_MASTER_ADDRESS" != "null" ]; then
+ [ ! -d "$_SALT_ETC_DIR/minion.d" ] && mkdir -p "$_SALT_ETC_DIR/minion.d"
+ cat <<_eof > $_SALT_ETC_DIR/minion.d/99-master-address.conf
+master: $_SALT_MASTER_ADDRESS
+_eof
+fi
+
+# Drop the minion id if passed
+if [ "$_SALT_MINION_ID" != "null" ]; then
+ [ ! -d "$_SALT_ETC_DIR" ] && mkdir -p "$_SALT_ETC_DIR"
+ echo "$_SALT_MINION_ID" > "$_SALT_ETC_DIR/minion_id"
+fi
+
+# Pre-seed master keys
+if [ "$PRESEED_MASTER_FUNC" != "null" ] && [ "$_TEMP_KEYS_DIR" != "null" ]; then
+ echoinfo "Running ${PRESEED_MASTER_FUNC}()"
+ $PRESEED_MASTER_FUNC
+ if [ $? -ne 0 ]; then
+ echoerror "Failed to run ${PRESEED_MASTER_FUNC}()!!!"
+ exit 1
+ fi
+fi
+
+# Install Salt
+if [ "$_CONFIG_ONLY" -eq $BS_FALSE ]; then
+ # Only execute function is not in config mode only
+ echoinfo "Running ${INSTALL_FUNC}()"
+ $INSTALL_FUNC
+ if [ $? -ne 0 ]; then
+ echoerror "Failed to run ${INSTALL_FUNC}()!!!"
+ exit 1
+ fi
+fi
+
+# Run any post install function. Only execute function if not in config mode only
+if [ "$POST_INSTALL_FUNC" != "null" ] && [ "$_CONFIG_ONLY" -eq $BS_FALSE ]; then
+ echoinfo "Running ${POST_INSTALL_FUNC}()"
+ $POST_INSTALL_FUNC
+ if [ $? -ne 0 ]; then
+ echoerror "Failed to run ${POST_INSTALL_FUNC}()!!!"
+ exit 1
+ fi
+fi
+
+# Run any check services function, Only execute function if not in config mode only
+if [ "$CHECK_SERVICES_FUNC" != "null" ] && [ "$_CONFIG_ONLY" -eq $BS_FALSE ]; then
+ echoinfo "Running ${CHECK_SERVICES_FUNC}()"
+ $CHECK_SERVICES_FUNC
+ if [ $? -ne 0 ]; then
+ echoerror "Failed to run ${CHECK_SERVICES_FUNC}()!!!"
+ exit 1
+ fi
+fi
+
+# Run any start daemons function
+if [ "$STARTDAEMONS_INSTALL_FUNC" != "null" ] && [ ${_START_DAEMONS} -eq $BS_TRUE ]; then
+ echoinfo "Running ${STARTDAEMONS_INSTALL_FUNC}()"
+ echodebug "Waiting ${_SLEEP} seconds for processes to settle before checking for them"
+ sleep ${_SLEEP}
+ $STARTDAEMONS_INSTALL_FUNC
+ if [ $? -ne 0 ]; then
+ echoerror "Failed to run ${STARTDAEMONS_INSTALL_FUNC}()!!!"
+ exit 1
+ fi
+fi
+
+# Check if the installed daemons are running or not
+if [ "$DAEMONS_RUNNING_FUNC" != "null" ] && [ ${_START_DAEMONS} -eq $BS_TRUE ]; then
+ echoinfo "Running ${DAEMONS_RUNNING_FUNC}()"
+ echodebug "Waiting ${_SLEEP} seconds for processes to settle before checking for them"
+ sleep ${_SLEEP} # Sleep a little bit to let daemons start
+ $DAEMONS_RUNNING_FUNC
+ if [ $? -ne 0 ]; then
+ echoerror "Failed to run ${DAEMONS_RUNNING_FUNC}()!!!"
+
+ for fname in api master minion syndic; do
+ # Skip salt-api since the service should be opt-in and not necessarily started on boot
+ [ $fname = "api" ] && continue
+
+ # Skip if not meant to be installed
+ [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
+ [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
+ [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
+
+ if [ "$_ECHO_DEBUG" -eq $BS_FALSE ]; then
+ echoerror "salt-$fname was not found running. Pass '-D' to ${__ScriptName} when bootstrapping for additional debugging information..."
+ continue
+ fi
+
+ [ ! -f "$_SALT_ETC_DIR/$fname" ] && [ $fname != "syndic" ] && echodebug "$_SALT_ETC_DIR/$fname does not exist"
+
+ echodebug "Running salt-$fname by hand outputs: $(nohup salt-$fname -l debug)"
+
+ [ ! -f /var/log/salt/$fname ] && echodebug "/var/log/salt/$fname does not exist. Can't cat its contents!" && continue
+
+ echodebug "DAEMON LOGS for $fname:"
+ echodebug "$(cat /var/log/salt/$fname)"
+ echo
+ done
+
+ echodebug "Running Processes:"
+ echodebug "$(ps auxwww)"
+
+ exit 1
+ fi
+fi
+
+# Done!
+if [ "$_CONFIG_ONLY" -eq $BS_FALSE ]; then
+ echoinfo "Salt installed!"
+else
+ echoinfo "Salt configured!"
+fi
+
+exit 0