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/common/ubuntu_info.sh b/common/ubuntu_info.sh
index 903c121..8a944bd 100644
--- a/common/ubuntu_info.sh
+++ b/common/ubuntu_info.sh
@@ -2,4 +2,9 @@
 
 # Save some basic debug information.
 
-dpkg-query -W -f='${Package}=${Version}\n' >> /var/log/vcp_initial_pkgs.log
+mkdir -p /var/log/bootstrap_logs/
+pushd /var/log/bootstrap_logs/
+  dpkg-query -W -f='${Package}=${Version}\n' | sort -u >> vcp_initial_pkgs.log
+popd
+
+
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/cleanup.sh b/day01-image/scripts/cleanup.sh
index 47b34de..0968dd5 100644
--- a/day01-image/scripts/cleanup.sh
+++ b/day01-image/scripts/cleanup.sh
@@ -4,9 +4,11 @@
 apt-get purge salt-formula-* -y
 apt-get -y autoremove --purge
 apt-get -y clean
+
 rm -rf /var/lib/apt/lists/*
 rm -rf /etc/apt/sources.list.d/*
 echo "" > /etc/apt/sources.list
+
 rm -rf /srv/salt/reclass/classes/*
 rm /srv/salt/reclass/nodes/cfg01.mcp-day01.local.yml
 mkdir -p /srv/salt/reclass/classes/service
diff --git a/day01-image/scripts/info.sh b/day01-image/scripts/info.sh
new file mode 120000
index 0000000..772d054
--- /dev/null
+++ b/day01-image/scripts/info.sh
@@ -0,0 +1 @@
+../../common/ubuntu_info.sh
\ No newline at end of file
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 4488a50..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` }}",
@@ -82,7 +84,8 @@
       "pause_before": "10s",
       "scripts": [
         "scripts/security.sh",
-        "scripts/cleanup.sh"
+        "scripts/cleanup.sh",
+        "scripts/info.sh"
       ]
     },
     {
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` }}",
