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