diff --git a/day01-image/files/tmp/bootstrap.saltstack.com.sh b/common/files/bootstrap.saltstack.com.sh
similarity index 100%
rename from day01-image/files/tmp/bootstrap.saltstack.com.sh
rename to common/files/bootstrap.saltstack.com.sh
diff --git a/common/ubuntu_cleanup.sh b/common/ubuntu_cleanup.sh
index f043e26..4eb9c7f 100644
--- a/common/ubuntu_cleanup.sh
+++ b/common/ubuntu_cleanup.sh
@@ -15,6 +15,7 @@
 
 echo "cleaning up dhcp leases"
 rm -rf /var/lib/dhcp/* || true
+rm -rf /var/lib/ntp/ntp.conf.dhcp || true
 
 echo "cleaning up udev rules"
 rm -f /etc/udev/rules.d/70-persistent-net.rules || true
diff --git a/mirror-image/scripts/salt_bootstrap.sh b/common/ubuntu_salt_bootstrap.sh
similarity index 87%
rename from mirror-image/scripts/salt_bootstrap.sh
rename to common/ubuntu_salt_bootstrap.sh
index cd9a487..ad3757e 100644
--- a/mirror-image/scripts/salt_bootstrap.sh
+++ b/common/ubuntu_salt_bootstrap.sh
@@ -1,5 +1,7 @@
 #!/bin/bash -xe
 
+CLUSTER_NAME=${CLUSTER_NAME:-lost_cluster_name_variable}
+CLUSTER_MODEL=${CLUSTER_MODEL:-https://github.com/Mirantis/mcp-offline-model.git}
 CLUSTER_MODEL_REF=${CLUSTER_MODEL_REF:-master}
 FORMULA_VERSION=${FORMULA_VERSION:-testing}
 SALTSTACK_GPG=${SALTSTACK_GPG:-"https://repo.saltstack.com/apt/ubuntu/16.04/amd64/2016.3/SALTSTACK-GPG-KEY.pub"}
@@ -36,9 +38,9 @@
 
 # bootstrap.sh opts
 export FORMULAS_SOURCE=pkg
-export HOSTNAME=apt01
+export HOSTNAME=${BS_HOSTNAME:-lost_bs_hostname_variable}
 export DOMAIN="${CLUSTER_NAME}.local"
-export EXTRA_FORMULAS="ntp aptly nginx iptables docker"
+export EXTRA_FORMULAS=${EXTRA_FORMULAS:-"ntp aptly nginx iptables docker git maas jenkins"}
 export APT_REPOSITORY=" deb [arch=amd64] ${APT_MIRANTIS_SALT_REPO} "
 export APT_REPOSITORY_GPG=${APT_MIRANTIS_GPG}
 if [[ ! -z "${PACKER_OFFLINE_BUILD}" ]];then
diff --git a/day01-image/files/tmp/bootstrap.saltstack.com.sh b/day01-image/files/tmp/bootstrap.saltstack.com.sh
new file mode 120000
index 0000000..41f68f4
--- /dev/null
+++ b/day01-image/files/tmp/bootstrap.saltstack.com.sh
@@ -0,0 +1 @@
+../../../common/files/bootstrap.saltstack.com.sh
\ No newline at end of file
diff --git a/day01-image/run.example.sh b/day01-image/run.example.sh
index 9b8602e..e9ada77 100755
--- a/day01-image/run.example.sh
+++ b/day01-image/run.example.sh
@@ -2,7 +2,7 @@
 
 # pre-requirments:
 # apt-get install cloud-localds
-# Cloudimg: wget https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img
+# Cloudimg: wget https://cloud-images.ubuntu.com/xenial/XXXX/xenial-server-cloudimg-amd64-disk1.img
 # Packer: https://releases.hashicorp.com/packer/1.1.3/packer_1.1.3_linux_amd64.zip
 
 # Those script - only example for variables, which should be passed to packer and
@@ -12,27 +12,26 @@
 # http/bootstrap.saltstack.com.sh https://github.com/saltstack/salt-bootstrap
 #
 
-export CLUSTER_MODEL="https://github.com/jiribroulik/day01.git"
-export CLUSTER_MODEL_REF="master"
-export CLUSTER_NAME="mcp-day01"
-
-export MCP_VERSION="nightly"
-export FORMULA_VERSION="nightly"
-
-BINARY_MCP_VERSION="nightly"
-export UBUNTU_BASEURL="http://mirror.mirantis.com/${BINARY_MCP_VERSION}/ubuntu/"
-export SALTSTACK_REPO="http://apt.mirantis.com/xenial/salt/2016.3/ ${BINARY_MCP_VERSION} main"
+#
+export CLUSTER_MODEL=https://github.com/Mirantis/mcp-drivetrain-model.git
+export CLUSTER_MODEL_REF=master
+export MCP_VERSION=proposed
+export SCRIPTS_REF=master
+export CLUSTER_NAME=mcp-day01
+export FORMULA_VERSION=proposed
+export BINARY_MCP_VERSION=proposed
+export UBUNTU_BASEURL="http://mirror.mirantis.com/proposed/ubuntu/"
+export SALTSTACK_REPO="http://mirror.mirantis.com/proposed/saltstack-2016.3/xenial xenial main"
 export APT_MIRANTIS_GPG="http://apt.mirantis.com/public.gpg"
-export SALTSTACK_GPG="${APT_MIRANTIS_GPG}"
-export APT_MIRANTIS_SALT_REPO="http://apt.mirantis.com/xenial/ ${BINARY_MCP_VERSION} salt "
-#
-export GIT_SALT_FORMULAS_SCRIPTS="https://github.com/salt-formulas/salt-formulas-scripts.git"
-#
-export APT_REPOSITORY=" deb [arch=amd64] ${APT_MIRANTIS_SALT_REPO} "
-export APT_REPOSITORY_GPG=${APT_MIRANTIS_GPG}
+export SALTSTACK_GPG="https://repo.saltstack.com/apt/ubuntu/16.04/amd64/2016.3/SALTSTACK-GPG-KEY.pub"
+export APT_MIRANTIS_SALT_REPO="http://apt.mirantis.com/xenial/ proposed salt"
+export GIT_SALT_FORMULAS_SCRIPTS=https://github.com/salt-formulas/salt-formulas-scripts.git
+export APT_REPOSITORY="deb [arch=amd64] http://apt.mirantis.com/xenial/ proposed salt"
+export APT_REPOSITORY_GPG=http://apt.mirantis.com/public.gpg
+###
 
 export PACKER_LOG=1
 # For qemu test-build:
 cloud-localds  --hostname ubuntu --dsmode local config-drive/cloudata.iso  config-drive/user-data.yaml
-./packer build -only=qemu -parallel=false -on-error=ask template.json
-rm -rf ~/.packer.d/
+packer build -only=qemu -parallel=false -on-error=ask template.json
+#rm -rf ~/.packer.d/
diff --git a/day01-image/scripts/salt_bootstrap.sh b/day01-image/scripts/salt_bootstrap.sh
deleted file mode 100644
index 40b25b4..0000000
--- a/day01-image/scripts/salt_bootstrap.sh
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/bin/bash -xe
-CLUSTER_NAME=${CLUSTER_NAME:-mcp-day01}
-CLUSTER_MODEL=${CLUSTER_MODEL:-https://github.com/Mirantis/mcp-drivetrain-model.git}
-CLUSTER_MODEL_REF=${CLUSTER_MODEL_REF:-master}
-FORMULA_VERSION=${FORMULA_VERSION:-2018.3.1}
-SALTSTACK_GPG=${SALTSTACK_GPG:-"https://repo.saltstack.com/apt/ubuntu/16.04/amd64/2016.3/SALTSTACK-GPG-KEY.pub"}
-SALTSTACK_REPO=${SALTSTACK_REPO:-"http://repo.saltstack.com/apt/ubuntu/16.04/amd64/2016.3 xenial main"}
-APT_MIRANTIS_GPG=${APT_MIRANTIS_GPG:-"http://apt.mirantis.com/public.gpg"}
-APT_MIRANTIS_SALT_REPO=${APT_MIRANTIS_SALT_REPO:-"http://apt.mirantis.com/xenial/ $FORMULA_VERSION salt"}
-GIT_SALT_FORMULAS_SCRIPTS=${GIT_SALT_FORMULAS_SCRIPTS:-"https://github.com/salt-formulas/salt-formulas-scripts"}
-GIT_SALT_FORMULAS_SCRIPTS_REF=${GIT_SALT_FORMULAS_SCRIPTS_REF:-master}
-
-wget -O - ${SALTSTACK_GPG} | sudo apt-key add -
-wget -O - ${APT_MIRANTIS_GPG} | apt-key add -
-echo "deb [arch=amd64] ${SALTSTACK_REPO}"  > /etc/apt/sources.list.d/saltstack.list
-apt-get update
-apt-get install git-core -y
-
-for g_host in ${CLUSTER_MODEL} ${GIT_SALT_FORMULAS_SCRIPTS} ; do
-  _tmp_host=$(echo ${g_host} | awk -F/ '{print $3}')
-  ssh-keyscan -T 1 -H ${_tmp_host} >> ~/.ssh/known_hosts || true
-done
-
-if [[ ! -d /srv/salt/reclass ]]; then
-  git clone --recursive ${CLUSTER_MODEL} /srv/salt/reclass
-  pushd /srv/salt/reclass/
-    git checkout ${CLUSTER_MODEL_REF}
-  popd
-fi
-
-if [[ ! -d /srv/salt/scripts ]]; then
-  git clone --recursive ${GIT_SALT_FORMULAS_SCRIPTS} /srv/salt/scripts
-  pushd /srv/salt/scripts/
-    git checkout ${GIT_SALT_FORMULAS_SCRIPTS_REF}
-  popd
-fi
-
-# bootstrap.sh opts
-export FORMULAS_SOURCE=pkg
-export HOSTNAME=cfg01
-export DOMAIN="${CLUSTER_NAME}.local"
-export EXTRA_FORMULAS="git ntp maas jenkins"
-export APT_REPOSITORY=" deb [arch=amd64] ${APT_MIRANTIS_SALT_REPO} "
-export APT_REPOSITORY_GPG=${APT_MIRANTIS_GPG}
-
-if [[ ! -f /srv/salt/scripts/bootstrap.sh ]]; then
-  echo "ERROR: File /srv/salt/scripts/bootstrap.sh not found"
-  exit 1
-fi
-bash -x /srv/salt/scripts/bootstrap.sh || true
diff --git a/day01-image/scripts/salt_bootstrap.sh b/day01-image/scripts/salt_bootstrap.sh
new file mode 120000
index 0000000..fd4ae2b
--- /dev/null
+++ b/day01-image/scripts/salt_bootstrap.sh
@@ -0,0 +1 @@
+../../common/ubuntu_salt_bootstrap.sh
\ No newline at end of file
diff --git a/day01-image/template.json b/day01-image/template.json
index 1a00889..6cc5ce5 100644
--- a/day01-image/template.json
+++ b/day01-image/template.json
@@ -7,6 +7,7 @@
     "cluster_model": "{{ env `CLUSTER_MODEL` }}",
     "cluster_model_ref": "{{ env `CLUSTER_MODEL_REF` }}",
     "cluster_name": "{{ env `CLUSTER_NAME` }}",
+    "bs_hostname": "cfg01",
     "formula_version": "{{ env `FORMULA_VERSION` }}",
     "mcp_version": "{{ env `MCP_VERSION` }}",
     "ubuntu_baseurl": "{{ env `UBUNTU_BASEURL` }}",
@@ -41,6 +42,7 @@
         "CLUSTER_MODEL={{ user `cluster_model` }}",
         "CLUSTER_MODEL_REF={{ user `cluster_model_ref` }}",
         "CLUSTER_NAME={{ user `cluster_name` }}",
+        "BS_HOSTNAME={{ user `bs_hostname` }}",
         "FORMULA_VERSION={{ user `formula_version` }}",
         "UBUNTU_BASEURL={{ user `ubuntu_baseurl` }}",
         "SALTSTACK_GPG={{ user `saltstack_gpg` }}",
diff --git a/mirror-image/files/tmp/bootstrap.saltstack.com.sh b/mirror-image/files/tmp/bootstrap.saltstack.com.sh
deleted file mode 100644
index f1e86bb..0000000
--- a/mirror-image/files/tmp/bootstrap.saltstack.com.sh
+++ /dev/null
@@ -1,6717 +0,0 @@
-#!/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.12.13"
-__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}"
-            ;;
-        *://*)
-            echoerror "Unsupported URI scheme for $CC_DIR_NAME"
-            echo "null"
-            return
-            ;;
-        *)
-            if [ ! -e "${CC_DIR_NAME}" ]; then
-                echoerror "The configuration directory or archive $CC_DIR_NAME does not exist."
-                echo "null"
-                return
-            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}"
-}
-
-#---  FUNCTION  -------------------------------------------------------------------------------------------------------
-#         NAME:  __check_unparsed_options
-#  DESCRIPTION:  Checks the placed after the install arguments
-#----------------------------------------------------------------------------------------------------------------------
-__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
-}
-
-
-#----------------------------------------------------------------------------------------------------------------------
-#  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
-_REPO_URL="repo.saltstack.com"
-_PY_EXE=""
-_INSTALL_PY="$BS_FALSE"
-
-# Defaults for install arguments
-ITYPE="stable"
-
-
-#---  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 and Debian 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)
-    -x  Changes the python version used to install a git version of salt. Currently
-        this is considered experimental and has only been tested on Centos 6. This
-        only works for git installations.
-    -y  Installs a different python version on host. Currently this has only been
-        tested with Centos 6 and is considered experimental. This will install the
-        ius repo on the box if disable repo is false. This must be used in conjunction
-        with -x <pythonversion>.  For example:
-            sh bootstrap.sh -P -y -x python2.7 git v2016.11.3
-        The above will install python27 and install the git version of salt using the
-        python2.7 executable. This only works for git and pip installations.
-
-EOT
-}   # ----------  end of function __usage  ----------
-
-
-while getopts ':hvnDc:g:Gyx:wk: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="$OPTARG"                     ;;
-    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"                       ;;
-    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               ;;
-    x )  _PY_EXE="$OPTARG"                              ;;
-    y )  _INSTALL_PY="$BS_TRUE"                         ;;
-
-    \?)  echo
-         echoerror "Option does not exist : $OPTARG"
-         __usage
-         exit 1
-         ;;
-
-  esac    # --- end of case ---
-done
-shift $((OPTIND-1))
-
-
-# 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"
-
-
-#---  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
-    if [ -p "$LOGPIPE" ]; then
-        echodebug "Removing the logging pipe $LOGPIPE"
-        rm -f "$LOGPIPE"
-    fi
-
-    # 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
-
-
-# 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
-
-echoinfo "Running version: ${__ScriptVersion}"
-echoinfo "Executed by: ${CALLER}"
-echoinfo "Command line: '${__ScriptFullName} ${__ScriptArgs}'"
-#echowarn "Running the unstable version of ${__ScriptName}"
-
-# Define installation type
-if [ "$#" -gt 0 ];then
-    __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
-        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
-        if [ "$(echo "$1" | egrep '^(latest|1\.6|1\.7|2014\.1|2014\.7|2015\.5|2015\.8|2016\.3|2016\.11|2017\.7)$')" != "" ]; 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, 2017.7, latest, \$MAJOR.\$MINOR.\$PATCH)"
-            exit 1
-        fi
-    fi
-fi
-
-# Check for any unparsed arguments. Should be an error.
-if [ "$#" -gt 0 ]; then
-    __usage
-    echo
-    echoerror "Too many arguments."
-    exit 1
-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
-
-# 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 1
-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
-
-# If the configuration directory or archive does not exist, error out
-if [ "$_TEMP_CONFIG_DIR" != "null" ]; then
-    _TEMP_CONFIG_DIR="$(__check_config_dir "$_TEMP_CONFIG_DIR")"
-    [ "$_TEMP_CONFIG_DIR" = "null" ] && exit 1
-fi
-
-# If the pre-seed keys directory does not exist, error out
-if [ "$_TEMP_KEYS_DIR" != "null" ] && [ ! -d "$_TEMP_KEYS_DIR" ]; then
-    echoerror "The pre-seed keys directory ${_TEMP_KEYS_DIR} does not exist."
-    exit 1
-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
-
-# Set the _REPO_URL value based on if -R was passed or not. Defaults to repo.saltstack.com.
-if [ "$_CUSTOM_REPO_URL" != "null" ]; then
-    _REPO_URL="$_CUSTOM_REPO_URL"
-
-    # Check for -r since -R is being passed. Set -r with a warning.
-    if [ "$_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
-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
-
-# 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
-
-# Export the http_proxy configuration to our current environment
-if [ "${_HTTP_PROXY}" != "" ]; then
-    export http_proxy="${_HTTP_PROXY}"
-    export https_proxy="${_HTTP_PROXY}"
-    # Using "deprecated" option here, but that appears the only way to make it work.
-    # See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=818802
-    # and https://bugs.launchpad.net/ubuntu/+source/gnupg2/+bug/1625848
-    _GPG_ARGS="${_GPG_ARGS},http-proxy=${_HTTP_PROXY}"
-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
-
-
-#---  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
-            NUMERIC_VERSION=$(__parse_version_string "9.0")
-        elif [ "$INPUT_VERSION" = "buster/sid" ]; then
-            # Let's start detecting the upcoming Debian 10 (Buster) release
-            NUMERIC_VERSION=$(__parse_version_string "10.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|void|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 fedora-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}" = "ManjaroLinux" ]; then
-            DISTRO_NAME="Arch Linux"
-        elif [ "${DISTRO_NAME}" = "Arch" ]; then
-            DISTRO_NAME="Arch Linux"
-            return
-        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
-
-        [ ! -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"    ;;
-            void               ) n="VoidLinux"      ;;
-            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:  __install_python()
-#   DESCRIPTION:  Install a different version of python on a host. Currently this has only been tested on CentOS 6 and
-#                 is considered experimental.
-#----------------------------------------------------------------------------------------------------------------------
-__install_python() {
-    if [ "$_PY_EXE" = "" ]; then
-        echoerror "Must specify -x <pythonversion> with -y to install a specific python version"
-        exit 1
-    fi
-
-    PY_PKG_V=$(echo "$_PY_EXE" | sed -r "s/\.//g")
-    __PACKAGES="${PY_PKG_V}"
-
-
-    if [ ${_DISABLE_REPOS} -eq ${BS_FALSE} ]; then
-        echoinfo "Attempting to install a repo to help provide a separate python package"
-        echoinfo "$DISTRO_NAME_L"
-        case "$DISTRO_NAME_L" in
-            "red_hat"|"centos")
-                __PYTHON_REPO_URL="https://centos${DISTRO_MAJOR_VERSION}.iuscommunity.org/ius-release.rpm"
-                ;;
-            *)
-                echoerror "Installing a repo to provide a python package is only supported on Redhat/CentOS.
-                If a repo is already available, please try running script with -r."
-                exit 1
-                ;;
-        esac
-
-        echoinfo "Installing IUS repo"
-        __yum_install_noinput "${__PYTHON_REPO_URL}" || return 1
-    fi
-
-    echoinfo "Installing ${__PACKAGES}"
-    __yum_install_noinput "${__PACKAGES}" || return 1
-}
-
-
-#---  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:  __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|neon)"
-    # 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"
-    neon_16_ubuntu_base="16.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:  __check_dpkg_architecture
-#   DESCRIPTION:  Determine the primary architecture for packages to install on Debian and derivatives
-#                 and issue all necessary error messages.
-#----------------------------------------------------------------------------------------------------------------------
-__check_dpkg_architecture() {
-    if __check_command_exists dpkg; then
-        DPKG_ARCHITECTURE="$(dpkg --print-architecture)"
-    else
-        echoerror "dpkg: command not found."
-        return 1
-    fi
-
-    __REPO_ARCH="$DPKG_ARCHITECTURE"
-    __return_code=0
-
-    case $DPKG_ARCHITECTURE in
-        "i386")
-            error_msg="$_REPO_URL likely doesn't have all required 32-bit packages for $DISTRO_NAME $DISTRO_MAJOR_VERSION."
-            # amd64 is just a part of repository URI, 32-bit pkgs are hosted under the same location
-            __REPO_ARCH="amd64"
-            ;;
-        "amd64")
-            error_msg=""
-            ;;
-        "armhf")
-            if [ "$DISTRO_NAME_L" = "ubuntu" ] || [ "$DISTRO_MAJOR_VERSION" -lt 8 ]; then
-                error_msg="Support for armhf packages at $_REPO_URL is limited to Debian/Raspbian 8 platforms."
-                __return_code=1
-            else
-                error_msg=""
-            fi
-            ;;
-        *)
-            error_msg="$_REPO_URL doesn't have packages for your system architecture: $DPKG_ARCHITECTURE."
-            __return_code=1
-            ;;
-    esac
-
-    if [ "${error_msg}" != "" ]; then
-        echoerror "${error_msg}"
-        if [ "$ITYPE" != "git" ]; then
-            echoerror "You can try git installation mode, i.e.: sh ${__ScriptName} git v2016.11.5."
-            echoerror "It may be necessary to use git installation mode with pip and disable the SaltStack apt repository."
-            echoerror "For example:"
-            echoerror "    sh ${__ScriptName} -r -P git v2016.11.5"
-        fi
-    fi
-
-    if [ "${__return_code}" -eq 0 ]; then
-        return 0
-    else
-        return 1
-    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
-            ;;
-        "17")
-            if [ "$_april" ]; then
-                DISTRO_CODENAME="zesty"
-            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="(cumulus_.+|devuan|kali|linuxmint|raspbian)"
-    # Mappings
-    cumulus_2_debian_base="7.0"
-    cumulus_3_debian_base="8.0"
-    devuan_1_debian_base="8.0"
-    devuan_2_debian_base="9.0"
-    kali_1_debian_base="7.0"
-    linuxmint_1_debian_base="8.0"
-    raspbian_8_debian_base="8.0"
-    raspbian_9_debian_base="9.0"
-
-    # Translate Debian derivatives to their base Debian version
-    match=$(echo "$DISTRO_NAME_L" | egrep ${DEBIAN_DERIVATIVES})
-
-    if [ "${match}" != "" ]; then
-        case $match in
-            cumulus_*)
-                _major=$(echo "$DISTRO_VERSION" | sed 's/^\([0-9]*\).*/\1/g')
-                _debian_derivative="cumulus"
-                ;;
-            devuan)
-                _major=$(echo "$DISTRO_VERSION" | sed 's/^\([0-9]*\).*/\1/g')
-                _debian_derivative="devuan"
-                ;;
-            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"
-                ;;
-            raspbian)
-                _major=$(echo "$DISTRO_VERSION" | sed 's/^\([0-9]*\).*/\1/g')
-                _debian_derivative="raspbian"
-                ;;
-        esac
-
-        _debian_version=$(eval echo "\$${_debian_derivative}_${_major}_debian_base" 2>/dev/null)
-
-        if [ "$_debian_version" != "" ]; then
-            echodebug "Detected Debian $_debian_version derivative"
-            DISTRO_NAME_L="debian"
-            DISTRO_VERSION="$_debian_version"
-            DISTRO_MAJOR_VERSION="$(echo "$DISTRO_VERSION" | sed 's/^\([0-9]*\).*/\1/g')"
-        fi
-    fi
-}
-
-
-#---  FUNCTION  -------------------------------------------------------------------------------------------------------
-#          NAME:  __debian_codename_translation
-#   DESCRIPTION:  Map Debian major versions to their corresponding code names
-#----------------------------------------------------------------------------------------------------------------------
-# shellcheck disable=SC2034
-__debian_codename_translation() {
-
-    case $DISTRO_MAJOR_VERSION in
-        "7")
-            DISTRO_CODENAME="wheezy"
-            ;;
-        "8")
-            DISTRO_CODENAME="jessie"
-            ;;
-        "9")
-            DISTRO_CODENAME="stretch"
-            ;;
-        "10")
-            DISTRO_CODENAME="buster"
-            ;;
-        *)
-            DISTRO_CODENAME="jessie"
-            ;;
-    esac
-}
-
-
-#---  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 below 7 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
-            #
-            #  < 14.04
-            #  = 14.10
-            #  = 15.04, 15.10
-            if [ "$DISTRO_MAJOR_VERSION" -lt 14 ] || \
-                [ "$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
-            #
-            #  <= 13.X
-            #  <= 42.1
-            if [ "$DISTRO_MAJOR_VERSION" -le 13 ] || \
-                ([ "$DISTRO_MAJOR_VERSION" -eq 42 ] && [ "$DISTRO_MINOR_VERSION" -le 1 ]); 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 SP4
-            # < 12 SP2
-            SUSE_PATCHLEVEL=$(awk '/PATCHLEVEL/ {print $3}' /etc/SuSE-release )
-            if [ "${SUSE_PATCHLEVEL}" = "" ]; then
-                SUSE_PATCHLEVEL="00"
-            fi
-            if [ "$DISTRO_MAJOR_VERSION" -lt 11 ] || \
-                ([ "$DISTRO_MAJOR_VERSION" -eq 11 ] && [ "$SUSE_PATCHLEVEL" -lt 04 ]) || \
-                ([ "$DISTRO_MAJOR_VERSION" -eq 12 ] && [ "$SUSE_PATCHLEVEL" -lt 02 ]); then
-                echoerror "Versions lower than SuSE 11 SP4 or 12 SP2 are not supported."
-                echoerror "Please consider upgrading to the next stable"
-                echoerror "    https://www.suse.com/lifecycle/"
-                exit 1
-            fi
-            ;;
-
-        fedora)
-            # Fedora lower than 25 are no longer supported
-            if [ "$DISTRO_MAJOR_VERSION" -lt 25 ]; 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 6 are no longer supported
-            if [ "$DISTRO_MAJOR_VERSION" -lt 6 ]; 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 6 are no longer supported
-            if [ "$DISTRO_MAJOR_VERSION" -lt 6 ]; 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
-            ;;
-
-        oracle*linux)
-            # Oracle Linux versions lower than 6 are no longer supported
-            if [ "$DISTRO_MAJOR_VERSION" -lt 6 ]; then
-                echoerror "End of life distributions are not supported."
-                echoerror "Please consider upgrading to the next stable. See:"
-                echoerror "    http://www.oracle.com/us/support/library/elsp-lifetime-069338.pdf"
-                exit 1
-            fi
-            ;;
-
-        scientific*linux)
-            # Scientific Linux versions lower than 6 are no longer supported
-            if [ "$DISTRO_MAJOR_VERSION" -lt 6 ]; then
-                echoerror "End of life distributions are not supported."
-                echoerror "Please consider upgrading to the next stable. See:"
-                echoerror "    https://www.scientificlinux.org/downloads/sl-versions/"
-                exit 1
-            fi
-            ;;
-
-        cloud*linux)
-            # Cloud Linux versions lower than 6 are no longer supported
-            if [ "$DISTRO_MAJOR_VERSION" -lt 6 ]; then
-                echoerror "End of life distributions are not supported."
-                echoerror "Please consider upgrading to the next stable. See:"
-                echoerror "    https://docs.cloudlinux.com/index.html?cloudlinux_life-cycle.html"
-                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
-}
-
-
-__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
-
-# 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')
-
-# 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 derivatives, pretend to be their Ubuntu base version
-__ubuntu_derivatives_translation
-
-# For Debian derivates, pretend to be their Debian base version
-__debian_derivatives_translation
-
-# Fail soon for end of life versions
-__check_end_of_life_versions
-
-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
-
-if [ "${DISTRO_NAME_L}" = "ubuntu" ]; then
-  # For ubuntu versions, obtain the codename from the release version
-  __ubuntu_codename_translation
-elif [ "${DISTRO_NAME_L}" = "debian" ]; then
-  # For debian versions, obtain the codename from the release version
-  __debian_codename_translation
-fi
-
-# 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|amazon)')" = "" ] && [ "$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
-
-
-#---  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
-
-    # 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=""
-    # Skip Amazon Linux for the first round, since EPEL is no longer required.
-    # See issue #724
-    if [ $_DISABLE_REPOS -eq $BS_FALSE ] && [ "$DISTRO_NAME_L" != "amazon_linux_ami" ]; 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
-
-    case ${OS_NAME_L} in
-        openbsd|freebsd|netbsd )
-            __TAG_REGEX_MATCH=$(echo "${GIT_REV}" | sed -E 's/^(v?[0-9]{1,4}\.[0-9]{1,2})(\.[0-9]{1,2})?.*$/MATCH/')
-            ;;
-        * )
-            __TAG_REGEX_MATCH=$(echo "${GIT_REV}" | sed 's/^.*\(v\?[[:digit:]]\{1,4\}\.[[:digit:]]\{1,2\}\)\(\.[[:digit:]]\{1,2\}\)\?.*$/MATCH/')
-            ;;
-    esac
-
-    __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 [ "$__TAG_REGEX_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:  __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-status $(rc-status -r) | tail -n +2 | grep -q "\<$servicename\>"; 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_pkgs
-#   DESCRIPTION:  Return 0 or 1 if successfully able to install pip packages. Can provide a different python version to
-#                 install pip packages with. If $py_ver is not specified it will use the default python version.
-#    PARAMETERS:  pkgs, py_ver
-#----------------------------------------------------------------------------------------------------------------------
-
-__install_pip_pkgs() {
-    _pip_pkgs="$1"
-    _py_exe="$2"
-    _py_pkg=$(echo "$_py_exe" | sed -r "s/\.//g")
-    _pip_cmd="${_py_exe} -m pip"
-
-    if [ "${_py_exe}" = "" ]; then
-        _py_exe='python'
-    fi
-
-    __check_pip_allowed
-
-    # Install pip and pip dependencies
-    if ! __check_command_exists "${_pip_cmd} --version"; then
-        __PACKAGES="${_py_pkg}-setuptools ${_py_pkg}-pip gcc ${_py_pkg}-devel"
-        # shellcheck disable=SC2086
-        __yum_install_noinput ${__PACKAGES} || return 1
-    fi
-
-    echoinfo "Installing pip packages: ${_pip_pkgs} using ${_py_exe}"
-    # shellcheck disable=SC2086
-    ${_pip_cmd} install ${_pip_pkgs} || return 1
-}
-
-#---  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_saltstack_ubuntu_repository() {
-    # Workaround for latest non-LTS ubuntu
-    if [ "$DISTRO_VERSION" = "16.10" ] || [ "$DISTRO_MAJOR_VERSION" -gt 16 ]; 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
-
-    __PACKAGES=''
-
-    # Install downloader backend for GPG keys fetching
-    if [ "$DISTRO_VERSION" = "16.10" ] || [ "$DISTRO_MAJOR_VERSION" -gt 16 ]; then
-        __PACKAGES="${__PACKAGES} gnupg2 dirmngr"
-    else
-        __PACKAGES="${__PACKAGES} gnupg-curl"
-    fi
-
-    # Make sure https transport is available
-    if [ "$HTTP_VAL" = "https" ] ; then
-        __PACKAGES="${__PACKAGES} apt-transport-https ca-certificates"
-    fi
-
-    # shellcheck disable=SC2086,SC2090
-    __apt_get_install_noinput ${__PACKAGES} || return 1
-
-    # SaltStack's stable Ubuntu repository:
-    SALTSTACK_UBUNTU_URL="${HTTP_VAL}://${_REPO_URL}/apt/ubuntu/${UBUNTU_VERSION}/${__REPO_ARCH}/${STABLE_REV}"
-    echo "deb $SALTSTACK_UBUNTU_URL $UBUNTU_CODENAME main" > /etc/apt/sources.list.d/saltstack.list
-
-    __apt_key_fetch "$SALTSTACK_UBUNTU_URL/SALTSTACK-GPG-KEY.pub" || return 1
-
-    apt-get update
-}
-
-install_ubuntu_deps() {
-    if [ $_DISABLE_REPOS -eq $BS_FALSE ]; then
-        # Install add-apt-repository
-        if ! __check_command_exists add-apt-repository; then
-            __apt_get_install_noinput software-properties-common || return 1
-        fi
-
-        __enable_universe_repository || return 1
-
-        apt-get update
-    fi
-
-    __PACKAGES=''
-
-    if [ "$DISTRO_MAJOR_VERSION" -lt 16 ]; then
-        # Minimal systems might not have upstart installed, install it
-        __PACKAGES="upstart"
-    fi
-
-    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" ] || [ "$_CUSTOM_REPO_URL" != "null" ]; then
-        __check_dpkg_architecture || return 1
-        __install_saltstack_ubuntu_repository || return 1
-    fi
-
-    install_ubuntu_deps || return 1
-}
-
-install_ubuntu_daily_deps() {
-    install_ubuntu_stable_deps || return 1
-
-    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
-
-    return 0
-}
-
-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/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}/pkg/salt-${fname}.init" ]; then
-            echodebug "There's NO upstart support!?"
-            echodebug "Copying ${_SALT_GIT_CHECKOUT_DIR}/pkg/salt-${fname}.init to /etc/init.d/salt-$fname"
-            __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/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
-
-    return 0
-}
-
-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_saltstack_debian_repository() {
-    if [ "$DISTRO_MAJOR_VERSION" -eq 10 ]; then
-        # Packages for Debian 10 at repo.saltstack.com are not yet available
-        # Set up repository for Debian 9 for Debian 10 for now until support
-        # is available at repo.saltstack.com for Debian 10.
-        echowarn "Debian 10 distribution detected, but stable packages requested. Trying packages from Debian 9. You may experience problems."
-        DEBIAN_RELEASE="9"
-        DEBIAN_CODENAME="stretch"
-    else
-        DEBIAN_RELEASE="$DISTRO_MAJOR_VERSION"
-        DEBIAN_CODENAME="$DISTRO_CODENAME"
-    fi
-
-    __PACKAGES=''
-
-    # Install downloader backend for GPG keys fetching
-    if [ "$DISTRO_MAJOR_VERSION" -ge 9 ]; then
-        __PACKAGES="${__PACKAGES} gnupg2 dirmngr"
-    else
-        __PACKAGES="${__PACKAGES} gnupg-curl"
-    fi
-
-    # Make sure https transport is available
-    if [ "$HTTP_VAL" = "https" ] ; then
-        __PACKAGES="${__PACKAGES} apt-transport-https ca-certificates"
-    fi
-
-    # shellcheck disable=SC2086,SC2090
-    __apt_get_install_noinput ${__PACKAGES} || return 1
-
-    # amd64 is just a part of repository URI, 32-bit pkgs are hosted under the same location
-    SALTSTACK_DEBIAN_URL="${HTTP_VAL}://${_REPO_URL}/apt/debian/${DEBIAN_RELEASE}/${__REPO_ARCH}/${STABLE_REV}"
-    echo "deb $SALTSTACK_DEBIAN_URL $DEBIAN_CODENAME main" > "/etc/apt/sources.list.d/saltstack.list"
-
-    __apt_key_fetch "$SALTSTACK_DEBIAN_URL/SALTSTACK-GPG-KEY.pub" || return 1
-
-    apt-get update
-}
-
-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
-
-    # 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 [ "$_DISABLE_REPOS" -eq "$BS_FALSE" ] || [ "$_CUSTOM_REPO_URL" != "null" ]; then
-        __check_dpkg_architecture || return 1
-        __install_saltstack_debian_repository || return 1
-    fi
-
-    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_deps || return 1
-    install_debian_git_deps || return 1
-
-    return 0
-}
-
-install_debian_8_git_deps() {
-    install_debian_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_9_git_deps() {
-    install_debian_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="libzmq5 lsb-release python-apt python-backports-abc python-crypto"
-    __PACKAGES="${__PACKAGES} python-jinja2 python-msgpack python-requests python-systemd"
-    __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_10_git_deps() {
-    install_debian_9_git_deps || return 1
-    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_9_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_9_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/salt-${fname}.service" ]; then
-                    __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/salt-${fname}.service" /lib/systemd/system
-                    __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/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/salt-$fname.init" ]; then
-                __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/salt-${fname}.init" "/etc/init.d/salt-${fname}"
-                __copyfile "${_SALT_GIT_CHECKOUT_DIR}/pkg/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="PyYAML libyaml python-crypto python-jinja2 python-zmq python2-msgpack python2-requests"
-
-    if [ "$DISTRO_MAJOR_VERSION" -lt 26 ]; then
-        __PACKAGES="${__PACKAGES} yum-utils"
-    else
-        __PACKAGES="${__PACKAGES} dnf-utils"
-    fi
-
-    # 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="python2-tornado systemd-python"
-
-    if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
-        __PACKAGES="${__PACKAGES} python-libcloud python-netaddr"
-    fi
-
-    # shellcheck disable=SC2086
-    dnf install -y ${__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_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
-
-    # 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"
-    rpm -Uvh --force "$epel_repo_url" || return 1
-
-    _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
-
-    # Avoid using '$releasever' variable for yum.
-    # Instead, this should work correctly on all RHEL variants.
-    base_url="${HTTP_VAL}://${_REPO_URL}/yum/redhat/${DISTRO_MAJOR_VERSION}/\$basearch/${repo_rev}/"
-    gpg_key="SALTSTACK-GPG-KEY.pub"
-    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
-
-        fetch_url="${HTTP_VAL}://${_REPO_URL}/yum/redhat/${DISTRO_MAJOR_VERSION}/${CPU_ARCH_L}/${repo_rev}/"
-        __rpm_import_gpg "${fetch_url}${gpg_key}" || 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 [ $_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
-
-    # YAML module is used for generating custom master/minion configs
-    __PACKAGES="yum-utils chkconfig PyYAML"
-
-    # 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() {
-    install_centos_stable_deps || return 1
-
-    if [ "$_INSECURE_DL" -eq $BS_FALSE ] && [ "${_SALT_REPO_URL%%://*}" = "https" ]; then
-        __yum_install_noinput ca-certificates || return 1
-    fi
-
-    if ! __check_command_exists git; then
-        __yum_install_noinput git || return 1
-    fi
-
-    __git_clone_and_checkout || return 1
-
-    __PACKAGES="python-crypto python-futures python-msgpack python-zmq python-jinja2 python-requests python-tornado"
-
-    if [ "$DISTRO_MAJOR_VERSION" -ge 7 ]; then
-        __PACKAGES="${__PACKAGES} systemd-python"
-    fi
-
-    if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
-        __PACKAGES="${__PACKAGES} python-libcloud"
-    fi
-
-    if [ "${_INSTALL_PY}" -eq "${BS_TRUE}" ]; then
-        # Install Python if "-y" was passed in.
-        __install_python || return 1
-    fi
-
-    if [ "${_PY_EXE}" != "" ]; then
-        # If "-x" is defined, install dependencies with pip based on the Python version given.
-        _PIP_PACKAGES="jinja2 msgpack-python pycrypto PyYAML tornado zmq"
-
-        if [ -f "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt" ]; then
-            for SINGLE_PACKAGE in $_PIP_PACKAGES; do
-                __REQUIRED_VERSION="$(grep "${SINGLE_PACKAGE}" "${_SALT_GIT_CHECKOUT_DIR}/requirements/base.txt")"
-                if [ "${__REQUIRED_VERSION}" != "" ]; then
-                    _PIP_PACKAGES=$(echo "$_PIP_PACKAGES" | sed "s/${SINGLE_PACKAGE}/${__REQUIRED_VERSION}/")
-                fi
-            done
-        fi
-
-        if [ "$_INSTALL_CLOUD" -eq "${BS_TRUE}" ]; then
-            _PIP_PACKAGES="${_PIP_PACKAGES} apache-libcloud"
-        fi
-
-        __install_pip_pkgs "${_PIP_PACKAGES}" "${_PY_EXE}" || return 1
-    else
-        # shellcheck disable=SC2086
-        __yum_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_centos_git() {
-    if [ "${_PY_EXE}" != "" ]; then
-        _PYEXE=${_PY_EXE}
-        echoinfo "Using the following python version: ${_PY_EXE} to install salt"
-    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() {
-    if ! grep -q '^[^#].\+alpine/.\+/community' /etc/apk/repositories; then
-        # Add community repository entry based on the "main" repo URL
-        __REPO=$(grep '^[^#].\+alpine/.\+/main\>' /etc/apk/repositories)
-        echo "${__REPO}" | sed -e 's/main/community/' >> /etc/apk/repositories
-    fi
-
-    apk update
-
-    # Get latest root CA certs
-    apk -U add ca-certificates
-
-    if ! __check_command_exists openssl; then
-        # Install OpenSSL to be able to pull from https:// URLs
-        apk -U add openssl
-    fi
-}
-
-install_alpine_linux_git_deps() {
-    install_alpine_linux_stable_deps || return 1
-
-    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
-
-    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 || return 1
-        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
-}
-
-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
-
-    # shellcheck disable=SC2086
-    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
-}
-
-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
-
-        if [ -f /sbin/rc-update ]; then
-            script_url="${_SALTSTACK_REPO_URL%.git}/raw/develop/pkg/alpine/salt-$fname"
-            [ -f "/etc/init.d/salt-$fname" ] || __fetch_url "/etc/init.d/salt-$fname" "$script_url"
-
-            if [ $? -eq 0 ]; then
-                chmod +x "/etc/init.d/salt-$fname"
-            else
-                echoerror "Failed to get OpenRC init script for $OS_NAME from $script_url."
-                return 1
-            fi
-
-            # Skip salt-api since the service should be opt-in and not necessarily started on boot
-            [ $fname = "api" ] && continue
-
-            /sbin/rc-update add "salt-$fname" > /dev/null 2>&1 || return 1
-        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 if not meant to be installed
-        [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
-        [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
-
-        # Disable stdin to fix shell session hang on killing tee pipe
-        /sbin/rc-service salt-$fname stop < /dev/null > /dev/null 2>&1
-        /sbin/rc-service salt-$fname start < /dev/null || return 1
-    done
-}
-
-install_alpine_linux_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
-
-        __check_services_alpine salt-$fname || return 1
-    done
-
-    return 0
-}
-
-daemons_running_alpine_linux() {
-    [ "${_START_DAEMONS}" -eq $BS_FALSE ] && return
-
-    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
-
-        # 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() {
-    # Shim to figure out if we're using old (rhel) or new (aws) rpms.
-    _USEAWS=$BS_FALSE
-    pkg_append="python"
-
-    repo_rev="$(echo "${STABLE_REV}"  | sed 's|.*\/||g')"
-
-    if echo "$repo_rev" | egrep -q '^(latest|2016\.11)$' || \
-            [ "$(echo "$repo_rev" | cut -c1-4)" -gt 2016 ]; then
-       _USEAWS=$BS_TRUE
-       pkg_append="python27"
-    fi
-
-    # We need to install yum-utils before doing anything else when installing on
-    # Amazon Linux ECS-optimized images. See issue #974.
-    __yum_install_noinput yum-utils
-
-    # Do upgrade early
-    if [ "$_UPGRADE_SYS" -eq $BS_TRUE ]; then
-        yum -y update || return 1
-    fi
-
-    if [ $_DISABLE_REPOS -eq $BS_FALSE ] || [ "$_CUSTOM_REPO_URL" != "null" ]; then
-        __REPO_FILENAME="saltstack-repo.repo"
-
-        # Set a few vars to make life easier.
-        if [ $_USEAWS -eq $BS_TRUE ]; then
-           base_url="$HTTP_VAL://${_REPO_URL}/yum/amazon/latest/\$basearch/$repo_rev/"
-           gpg_key="${base_url}SALTSTACK-GPG-KEY.pub"
-           repo_name="SaltStack repo for Amazon Linux"
-        else
-           base_url="$HTTP_VAL://${_REPO_URL}/yum/redhat/6/\$basearch/$repo_rev/"
-           gpg_key="${base_url}SALTSTACK-GPG-KEY.pub"
-           repo_name="SaltStack repo for RHEL/CentOS 6"
-        fi
-
-        # This should prob be refactored to use __install_saltstack_rhel_repository()
-        # With args passed in to do the right thing.  Reformatted to be more like the
-        # amazon linux yum file.
-        if [ ! -s "/etc/yum.repos.d/${__REPO_FILENAME}" ]; then
-          cat <<_eof > "/etc/yum.repos.d/${__REPO_FILENAME}"
-[saltstack-repo]
-name=$repo_name
-failovermethod=priority
-priority=10
-gpgcheck=1
-gpgkey=$gpg_key
-baseurl=$base_url
-_eof
-        fi
-
-    fi
-
-    # Package python-ordereddict-1.1-2.el6.noarch is obsoleted by python26-2.6.9-2.88.amzn1.x86_64
-    # which is already installed
-    __PACKAGES="${pkg_append}-PyYAML ${pkg_append}-crypto ${pkg_append}-msgpack ${pkg_append}-zmq ${pkg_append}-jinja2 ${pkg_append}-requests"
-
-    # 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
-}
-
-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
-
-    PIP_EXE='pip'
-    if __check_command_exists python2.7; then
-        if ! __check_command_exists pip2.7; then
-            /usr/bin/easy_install-2.7 pip || return 1
-        fi
-        PIP_EXE='/usr/local/bin/pip2.7'
-        _PY_EXE='python2.7'
-    fi
-
-    install_amazon_linux_ami_deps || return 1
-
-    if ! __check_command_exists git; then
-        __yum_install_noinput git || 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} ${pkg_append}-tornado"
-        fi
-    fi
-
-    if [ "${__PACKAGES}" != "" ]; then
-        # shellcheck disable=SC2086
-        __yum_install_noinput ${__PACKAGES} || return 1
-    fi
-
-    if [ "${__PIP_PACKAGES}" != "" ]; then
-        # shellcheck disable=SC2086
-        ${PIP_EXE} 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 does not resolve dependencies on outdated versions
-    # They always need to be updated
-    pacman -Syy --noconfirm
-
-    pacman -S --noconfirm --needed archlinux-keyring || return 1
-
-    pacman -Su --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 -Su --noconfirm --needed python2-yaml
-
-    if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
-        pacman -Su --noconfirm --needed python2-apache-libcloud || return 1
-    fi
-
-    if [ "${_EXTRA_PACKAGES}" != "" ]; then
-        echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}"
-        # shellcheck disable=SC2086
-        pacman -Su --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 -Su --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 -Su --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 does not resolve dependencies on outdated versions
-    # They always need to be updated
-    pacman -Syy --noconfirm
-
-    pacman -Su --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
-
-    /usr/local/sbin/pkg update -f || return 1
-}
-
-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
-
-    # shellcheck disable=SC2086
-    SALT_DEPENDENCIES=$(/usr/local/sbin/pkg search ${FROM_FREEBSD} -R -d sysutils/py-salt | grep -i origin | sed -e 's/^[[:space:]]*//' | tail -n +2 | awk -F\" '{print $2}' | tr '\n' ' ')
-    # shellcheck disable=SC2086
-    /usr/local/sbin/pkg install ${FROM_FREEBSD} -y ${SALT_DEPENDENCIES} || 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() {
-    # shellcheck disable=SC2086
-    /usr/local/sbin/pkg install ${FROM_FREEBSD} -y sysutils/py-salt || return 1
-    return 0
-}
-
-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() {
-
-    # /usr/local/bin/python2 in FreeBSD is a symlink to /usr/local/bin/python2.7
-    __PYTHON_PATH=$(readlink -f "$(which python2)")
-    __ESCAPED_PYTHON_PATH=$(echo "${__PYTHON_PATH}" | sed 's/\//\\\//g')
-
-    # Install from git
-    if [ ! -f salt/syspaths.py ]; then
-        # We still can't provide the system paths, salt 0.16.x
-        ${__PYTHON_PATH} setup.py ${SETUP_PY_INSTALL_ARGS} install || return 1
-    else
-        ${__PYTHON_PATH} setup.py \
-            --salt-root-dir=/ \
-            --salt-config-dir="${_SALT_ETC_DIR}" \
-            --salt-cache-dir="${_SALT_CACHE_DIR}" \
-            --salt-sock-dir=/var/run/salt \
-            --salt-srv-root-dir="${_SALT_ETC_DIR}" \
-            --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
-
-    for script in salt_api salt_master salt_minion salt_proxy salt_syndic; do
-        __fetch_url "/usr/local/etc/rc.d/${script}" "https://raw.githubusercontent.com/freebsd/freebsd-ports/master/sysutils/py-salt/files/${script}.in" || return 1
-        sed -i '' 's/%%PREFIX%%/\/usr\/local/g' /usr/local/etc/rc.d/${script}
-        sed -i '' "s/%%PYTHON_CMD%%/${__ESCAPED_PYTHON_PATH}/g" /usr/local/etc/rc.d/${script}
-        chmod +x /usr/local/etc/rc.d/${script} || return 1
-    done
-
-    # 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() {
-    if [ -f $salt_conf_file ]; then
-        rm -f $salt_conf_file
-    fi
-    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=$(ftp -w 15 -Vao - 'https://ftp.openbsd.org/cgi-bin/ftplist.cgi?dbversion=1' | awk '/^http/ {print $1}')
-
-    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() {
-    if [ $_DISABLE_REPOS -eq $BS_FALSE ]; then
-        __choose_openbsd_mirror || return 1
-        echoinfo "setting package repository to $OPENBSD_REPO with ping time of $MINTIME"
-        [ -n "$OPENBSD_REPO" ] || return 1
-        echo "${OPENBSD_REPO}" >>/etc/installurl || return 1
-    fi
-
-    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() {
-
-    # Set distro repo variable
-    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="SLE_${DISTRO_MAJOR_VERSION}_SP${SUSE_PATCHLEVEL}"
-    fi
-
-    if [ "$_DOWNSTREAM_PKG_REPO" -eq $BS_TRUE ]; then
-        suse_pkg_url_base="https://download.opensuse.org/repositories/systemsmanagement:/saltstack"
-        suse_pkg_url_path="${DISTRO_REPO}/systemsmanagement:saltstack.repo"
-    else
-        suse_pkg_url_base="${HTTP_VAL}://repo.saltstack.com/opensuse"
-        suse_pkg_url_path="${DISTRO_REPO}/systemsmanagement:saltstack:products.repo"
-    fi
-    SUSE_PKG_URL="$suse_pkg_url_base/$suse_pkg_url_path"
-}
-
-__check_and_refresh_suse_pkg_repo() {
-    # Check to see if systemsmanagement_saltstack exists
-    __zypper repos | grep -q systemsmanagement_saltstack
-
-    if [ $? -eq 1 ]; then
-        # zypper does not yet know anything about systemsmanagement_saltstack
-        __zypper addrepo --refresh "${SUSE_PKG_URL}" || return 1
-    fi
-}
-
-__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 [ $_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
-
-    # YAML module is used for generating custom master/minion configs
-    # requests is still used by many salt modules
-    # Salt needs python-zypp installed in order to use the zypper module
-    __PACKAGES="python-PyYAML python-requests python-zypp"
-
-    # shellcheck disable=SC2086
-    __zypper_install ${__PACKAGES} || return 1
-
-    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="libzmq5 python-Jinja2 python-msgpack-python python-pycrypto python-pyzmq python-xml"
-
-    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() {
-    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
-
-    # YAML module is used for generating custom master/minion configs
-    # requests is still used by many salt modules
-    # Salt needs python-zypp installed in order to use the zypper module
-    __PACKAGES="python-PyYAML python-requests python-zypp"
-
-    if [ "$_INSTALL_CLOUD" -eq $BS_TRUE ]; then
-        __PACKAGES="${__PACKAGES} python-apache-libcloud"
-    fi
-
-    # shellcheck disable=SC2086,SC2090
-    __zypper_install ${__PACKAGES} || return 1
-
-    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=""
-    # shellcheck disable=SC2089
-    __PACKAGES="${__PACKAGES} libzmq3 python-Jinja2 python-msgpack-python python-pycrypto"
-    __PACKAGES="${__PACKAGES} python-pyzmq python-xml"
-
-    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() {
-    install_opensuse_stable || return 1
-    return 0
-}
-
-install_suse_12_git() {
-    install_opensuse_git || return 1
-    return 0
-}
-
-install_suse_12_stable_post() {
-    install_opensuse_stable_post || return 1
-    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() {
-    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
-
-    # YAML module is used for generating custom master/minion configs
-    __PACKAGES="python-PyYAML"
-
-    # shellcheck disable=SC2086,SC2090
-    __zypper_install ${__PACKAGES} || return 1
-
-    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=""
-    # shellcheck disable=SC2089
-    __PACKAGES="${__PACKAGES} libzmq4 python-Jinja2 python-msgpack-python python-pycrypto"
-    __PACKAGES="${__PACKAGES} python-pyzmq python-xml python-zypp"
-
-    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() {
-    install_opensuse_stable || return 1
-    return 0
-}
-
-install_suse_11_git() {
-    install_opensuse_git || return 1
-    return 0
-}
-
-install_suse_11_stable_post() {
-    install_opensuse_stable_post || return 1
-    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
-}
-
-#
-#   End of SUSE Enterprise General Functions
-#
-#######################################################################################################################
-
-#######################################################################################################################
-#
-#    Gentoo Install Functions.
-#
-__autounmask() {
-    emerge --autounmask-write --autounmask-only "${@}"; return $?
-}
-
-__emerge() {
-    if [ "$_GENTOO_USE_BINHOST" -eq $BS_TRUE ]; then
-        emerge --getbinpkg "${@}"; return $?
-    fi
-    emerge "${@}"; 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"
-
-    # emerge currently won't write to files that aren't there, so we need to ensure their presence
-    touch /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
-        __autounmask 'dev-python/libcloud'
-        __emerge -v 'dev-python/libcloud'
-    fi
-
-    __autounmask 'dev-python/requests'
-    __autounmask 'app-admin/salt'
-
-    __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
-        __autounmask ${_EXTRA_PACKAGES} || return 1
-        # 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.
-#
-#######################################################################################################################
-
-#######################################################################################################################
-#
-#   VoidLinux Install Functions
-#
-install_voidlinux_stable_deps() {
-    if [ "$_UPGRADE_SYS" -eq $BS_TRUE ]; then
-        xbps-install -Suy || return 1
-    fi
-
-    if [ "${_EXTRA_PACKAGES}" != "" ]; then
-        echoinfo "Installing the following extra packages as requested: ${_EXTRA_PACKAGES}"
-        xbps-install -Suy "${_EXTRA_PACKAGES}" || return 1
-    fi
-
-    return 0
-}
-
-install_voidlinux_stable() {
-    xbps-install -Suy salt || return 1
-    return 0
-}
-
-install_voidlinux_stable_post() {
-    for fname in master minion syndic; do
-        [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
-        [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
-        [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
-
-        ln -s /etc/sv/salt-$fname /var/service/.
-    done
-}
-
-install_voidlinux_restart_daemons() {
-    [ $_START_DAEMONS -eq $BS_FALSE ] && return
-
-    for fname in master minion syndic; do
-        [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
-        [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
-        [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
-
-        sv restart salt-$fname
-    done
-}
-
-install_voidlinux_check_services() {
-    for fname in master minion syndic; do
-        [ $fname = "master" ] && [ "$_INSTALL_MASTER" -eq $BS_FALSE ] && continue
-        [ $fname = "minion" ] && [ "$_INSTALL_MINION" -eq $BS_FALSE ] && continue
-        [ $fname = "syndic" ] && [ "$_INSTALL_SYNDIC" -eq $BS_FALSE ] && continue
-
-        [ -e /var/service/salt-$fname ] || return 1
-    done
-
-    return 0
-}
-
-daemons_running_voidlinux() {
-    [ "$_START_DAEMONS" -eq $BS_FALSE ] && return 0
-
-    FAILED_DAEMONS=0
-    for fname in master minion syndic; do
-        [ $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 [ "$(sv status salt-$fname | grep run)" = "" ]; then
-            echoerror "salt-$fname was not found running"
-            FAILED_DAEMONS=$((FAILED_DAEMONS + 1))
-        fi
-    done
-
-    return $FAILED_DAEMONS
-}
-#
-#   Ended VoidLinux 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/" "$_FORCE_OVERWRITE" || 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/" "$_FORCE_OVERWRITE" || 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 [ ${_NO_DEPS} -eq $BS_FALSE ] && [ "$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 [ ${_NO_DEPS} -eq $BS_FALSE ] && [ $_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 [ ${_NO_DEPS} -eq $BS_FALSE ] && [ $_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
diff --git a/mirror-image/files/tmp/bootstrap.saltstack.com.sh b/mirror-image/files/tmp/bootstrap.saltstack.com.sh
new file mode 120000
index 0000000..41f68f4
--- /dev/null
+++ b/mirror-image/files/tmp/bootstrap.saltstack.com.sh
@@ -0,0 +1 @@
+../../../common/files/bootstrap.saltstack.com.sh
\ No newline at end of file
diff --git a/mirror-image/scripts/salt_bootstrap.sh b/mirror-image/scripts/salt_bootstrap.sh
new file mode 120000
index 0000000..fd4ae2b
--- /dev/null
+++ b/mirror-image/scripts/salt_bootstrap.sh
@@ -0,0 +1 @@
+../../common/ubuntu_salt_bootstrap.sh
\ No newline at end of file
diff --git a/mirror-image/template.json b/mirror-image/template.json
index b48c15d..bd5f6e8 100644
--- a/mirror-image/template.json
+++ b/mirror-image/template.json
@@ -8,6 +8,7 @@
     "cluster_model": "{{ env `CLUSTER_MODEL` }}",
     "cluster_model_ref": "{{ env `CLUSTER_MODEL_REF` }}",
     "cluster_name": "{{ env `CLUSTER_NAME` }}",
+    "bs_hostname": "apt01",
     "formula_version": "{{ env `FORMULA_VERSION` }}",
     "mcp_version": "{{ env `MCP_VERSION` }}",
     "ubuntu_baseurl": "{{ env `UBUNTU_BASEURL` }}",
@@ -50,6 +51,7 @@
         "CLUSTER_MODEL={{ user `cluster_model` }}",
         "CLUSTER_MODEL_REF={{ user `cluster_model_ref` }}",
         "CLUSTER_NAME={{ user `cluster_name` }}",
+        "BS_HOSTNAME={{ user `bs_hostname` }}",
         "FORMULA_VERSION={{ user `formula_version` }}",
         "UBUNTU_BASEURL={{ user `ubuntu_baseurl` }}",
         "SALTSTACK_GPG={{ user `saltstack_gpg` }}",
