diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 666e065..8ed9c68 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -486,7 +486,7 @@ jobs: distro-slug: photon-3 display-name: Photon OS 3 timeout: 20 - instances: '["stable-3006", "onedir-3006", "stable-3006-1", "git-master", "latest", "default"]' + instances: '["stable-3006", "onedir-3006", "stable-3006-1", "latest", "default"]' photon-4: diff --git a/.github/workflows/templates/generate.py b/.github/workflows/templates/generate.py index 4fb4ded..190c118 100755 --- a/.github/workflows/templates/generate.py +++ b/.github/workflows/templates/generate.py @@ -276,7 +276,13 @@ BLACKLIST_GIT_3006 = [ "ubuntu-2204", ] -BLACKLIST_GIT_MASTER = ["amazon-2", "debian-10", "freebsd-131", "freebsd-123"] +BLACKLIST_GIT_MASTER = [ + "amazon-2", + "debian-10", + "freebsd-131", + "freebsd-123", + "photon-3", +] SALT_VERSIONS = [ "3003", diff --git a/CHANGELOG.md b/CHANGELOG.md index d911569..1e4b226 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +# v2023.11.07 + +## What's Changed + +- cleanup old information in the README.rst file by @garethgreenaway in https://github.com/saltstack/salt-bootstrap/pull/1955 +- Moving quick start scripts to bootstrap repo. by @garethgreenaway in https://github.com/saltstack/salt-bootstrap/pull/1960 +- Suppress progress bar by @twangboy in https://github.com/saltstack/salt-bootstrap/pull/1964 +- Fix global variable by @twangboy in https://github.com/saltstack/salt-bootstrap/pull/1965 +- Debian 12 arm64 by @joelpmichael in https://github.com/saltstack/salt-bootstrap/pull/1962 +- Mirror Linux output, display root_dir by @twangboy in https://github.com/saltstack/salt-bootstrap/pull/1967 +- Add asterisks to the output by @twangboy in https://github.com/saltstack/salt-bootstrap/pull/1968 +- Fixes to salt-quick-start.sh by @garethgreenaway in https://github.com/saltstack/salt-bootstrap/pull/1973 +- Update requirements by @twangboy in https://github.com/saltstack/salt-bootstrap/pull/1974 + +**Full Changelog**: https://github.com/saltstack/salt-bootstrap/compare/v2023.08.03...v2023.11.07 + # v2023.08.03 ## What's Changed diff --git a/README.rst b/README.rst index 210d38b..66d07dc 100644 --- a/README.rst +++ b/README.rst @@ -32,40 +32,12 @@ sum** of the downloaded ``bootstrap-salt.sh`` file. The SHA256 sum of the ``bootstrap-salt.sh`` file, per release, is: +- 2023.08.03: ``963e559bdb85adecfbbec2c3b81190392bc59b24992e4491e919cd748eeafcb8`` - 2023.07.25: ``eaaaadaed40fe2e791d59a9e48f24449428a35ca61782d9139f1272c05524323`` - 2023.06.28: ``f45f5da8abee27ef385131f5cfa9382d3a15863d0a05688a0404d2f057b27776`` - 2023.04.26: ``516fa9cc2e258cb8484ff360b9674b46918f657985c21ca9301e42a3dd263d60`` - 2023.04.21: ``e364428aa7a25f8e2c5e18e36e222351724c6cf35a1d57158f3357cde1e0a0f0`` - 2023.04.06: ``994bf7e8bd92fe6d70d291c7562aff299f5651046b4e76dfa506cee0d9bb0843`` -- 2022.10.04: ``d0686c2daeed18bb726e58eef75a69afe9ee56a1a23b2c32cd4e87d6005638e2`` -- 2022.08.13: ``af922699c1a2bb3b89b6dac04397389999df1b3416b8d0b5c93766412f14c95c`` -- 2022.08.12: ``b46f018bbf02f45c6096ab96e9261a9adb3a78ff65092c3976f32ffde909afcb`` -- 2022.05.19: ``e92e1df6930285cf23eda188bee3cfa3dd6c577b4fb7aa91b29213ad820199b1`` -- 2022.03.15: ``8f65952c3435f441e7f793941d5162d3ec2033a9ef82722ff1da67a2ef860a2f`` -- 2021.09.17: ``090d652cd6290debce0e3a4eded65086a4272e69446e711eb26f87160593b6a2`` -- 2021.09.14: ``30fdcba972f449630b4f13492cb5525e69e08fa2cdb66a6dc78f1536ad279e52`` -- 2021.08.19: ``ee40a9d8d057cce88a288fc1cb94b1d31408a61d262db6f77b34ad63d66f0806`` -- 2021.06.23: ``35b397dd0a50f832af453c17f138fd29e3692e492d7f463c404a57e1fac10665`` -- 2021.03.02: ``91baa0073308f1be20c7be65238ef67e5733c75285314b302a5b2456e73a0758`` -- 2020.10.20: ``b47bfc8d63cccf22eb4cd94491d30cc1d571e184be25a5be7f775e7f2daaf6e2`` -- 2020.10.19: ``f6c3e2c52f98d115809044b09062219369957caf30228b594033f0543e202c52`` -- 2020.06.23: ``1d07db867c195c864d0ae70664524f2099cc9a46872953293c67c3f239d4f4f5`` -- 2020.05.28: ``6b3ea15c78f01060ab12fc01c0bb18480eaf36858c7ba188b200c0fb11aac173`` -- 2020.02.24: ``efc46700aca78b8e51d7af9b06293f52ad495f3a8179c6bfb21a8c97ee41f1b7`` -- 2020.02.04: ``ce877651b4938e3480f76b1629f582437f6ca8b73d7199fdb9e905e86fe85b34`` -- 2020.01.29: ``e9afdfa877998c1c7f0e141a6728b33d0d24348e197aab2b9bde4fe6bc6db1b2`` -- 2020.01.21: ``53299aa0dfbf7ab381f3856bb7babfc04a1d6525be11db0b9466277b1e4d0c1a`` -- 2019.11.04: ``905924fccd4ebf168d19ba598bf10af53efe02302b792aeb15433e73fd3ad1d2`` -- 2019.10.03: ``34f196f06d586ce9e1b9907660ea6e67caf57abcecfea66e0343697e3fd0d17d`` -- 2019.05.20: ``46fb5e4b7815efafd69fd703f033fe86e7b584b6770f7e0b936995bcae1cedd8`` -- 2019.02.27: ``23728e4b5e54f564062070e3be53c5602b55c24c9a76671968abbf3d609258cb`` -- 2019.01.08: ``ab7f29b75711da4bb79aff98d46654f910d569ebe3e908753a3c5119017bb163`` -- 2018.08.15: ``6d414a39439a7335af1b78203f9d37e11c972b3c49c519742c6405e2944c6c4b`` -- 2018.08.13: ``98284bdc2b5ebaeb619b22090374e42a68e8fdefe6bff1e73bd1760db4407ed0`` -- 2018.04.25: ``e2e3397d6642ba6462174b4723f1b30d04229b75efc099a553e15ea727877dfb`` -- 2017.12.13: ``c127b3aa4a8422f6b81f5b4a40d31d13cec97bf3a39bca9c11a28f24910a6895`` -- 2017.08.17: ``909b4d35696b9867b34b22ef4b60edbc5a0e9f8d1ed8d05f922acb79a02e46e3`` -- 2017.05.24: ``8c42c2e5ad3d4384ddc557da5c214ba3e40c056ca1b758d14a392c1364650e89`` If you're looking for a *one-liner* to install Salt, please scroll to the bottom and use the instructions for `Installing via an Insecure One-Liner`_. @@ -206,6 +178,8 @@ To view the latest options and descriptions for ``salt-bootstrap``, use ``-h`` a sh bootstrap.sh -P -y -x python2.7 git v2017.7.2 The above will install python27 and install the git version of salt using the python2.7 executable. This only works for git and pip installations. + -Q Quickstart, install the Salt master and the Salt minion. + And automatically accept the minion key. The Salt Bootstrap script has a wide variety of options that can be passed as well as several ways of obtaining the bootstrap script itself. Note that the use of ``sudo`` @@ -215,25 +189,25 @@ is not needed when running these commands as the ``root`` user. The examples below show how to bootstrap Salt directly from GitHub or another Git repository. Run the script without any parameters to get latest stable Salt packages for your system from -`SaltStack's corporate repository`_. See first example in the `Install using wget`_ section. +the `Salt Project's repository`_. See first example in the `Install using wget`_ section. Install using curl ~~~~~~~~~~~~~~~~~~ -If you want to install a package of a specific release version, from the SaltStack repo: +If you want to install a package of a specific release version, from the Salt Project repo: .. code:: console curl -o bootstrap-salt.sh -L https://bootstrap.saltproject.io - sudo sh bootstrap-salt.sh -P stable 3004.1 + sudo sh bootstrap-salt.sh -P stable 3006.1 If you want to install a specific release version, based on the Git tags: .. code:: console curl -o bootstrap-salt.sh -L https://bootstrap.saltproject.io - sudo sh bootstrap-salt.sh git v3004.1 + sudo sh bootstrap-salt.sh git v3006.1 Using ``curl`` to install latest development version from GitHub: @@ -256,7 +230,7 @@ If all you want is to install a ``salt-master`` using latest Git: curl -o bootstrap-salt.sh -L https://bootstrap.saltproject.io sudo sh bootstrap-salt.sh -M -N git master -If your host has Internet access only via HTTP proxy, from the SaltStack repo: +If your host has Internet access only via HTTP proxy, from the Salt Project repo: .. code:: console @@ -290,12 +264,12 @@ Installing a specific version from git using ``wget``: wget -O bootstrap-salt.sh https://bootstrap.saltproject.io sudo sh bootstrap-salt.sh git v3004.1 -Installing a specific version package from the SaltStack repo using ``wget``: +Installing a specific version package from the Salt Project repo using ``wget``: .. code:: console wget -O bootstrap-salt.sh https://bootstrap.saltproject.io - sudo sh bootstrap-salt.sh -P stable 3004.1 + sudo sh bootstrap-salt.sh -P stable 3006.1 **NOTE** @@ -311,7 +285,7 @@ If you already have Python installed, ``python 2.7``, then it's as easy as: .. code:: console python -m urllib "https://bootstrap.saltproject.io" > bootstrap-salt.sh - sudo sh bootstrap-salt.sh -P stable 3004.1 + sudo sh bootstrap-salt.sh -P stable 3006.1 With python version 2, the following in-line code should always work: @@ -325,7 +299,7 @@ With python version 3: .. code:: console python3 -c 'import urllib.request; print(urllib.request.urlopen("https://bootstrap.saltproject.io").read().decode("ascii"))' > bootstrap-salt.sh - sudo sh bootstrap-salt.sh git v3004.1 + sudo sh bootstrap-salt.sh git v3006.1 Install using fetch ~~~~~~~~~~~~~~~~~~~ @@ -382,11 +356,11 @@ Using ``wget`` to install your distribution's stable packages: wget -O - https://bootstrap.saltproject.io | sudo sh -Installing a target version package of Salt from the SaltStack repo: +Installing a target version package of Salt from the Salt Project repo: .. code:: console - curl -L https://bootstrap.saltproject.io | sudo sh -s -- stable 3004.1 + curl -L https://bootstrap.saltproject.io | sudo sh -s -- stable 3006.1 Installing the latest master branch of Salt from git: @@ -430,10 +404,10 @@ listed below should reflect this document but may become out of date. If an oper listed below, but is not listed on the official supported operating systems document, the level of support is "best-effort". -Since Salt is written in Python, the packages available from `SaltStack's corporate repository`_ -are CPU architecture independent and could be installed on any hardware supported by Linux kernel. -However, SaltStack does package Salt's binary dependencies only for ``x86_64`` (``amd64``) and -``AArch32`` (``armhf``). The latter is available only for Debian/Raspbian 8 platforms. +Since Salt is written in Python, the packages available from the `Salt Project's repository`_ are +CPU architecture independent and could be installed on any hardware supported by Linux kernel. +However, the Salt Project does package Salt's binary dependencies only for ``x86_64`` (``amd64``) +and ``AArch64`` (``arm64``). It is recommended to use ``git`` bootstrap mode as described above to install Salt on other architectures, such as ``x86`` (``i386``), ``AArch64`` (``arm64``) or ``ARM EABI`` (``armel``). @@ -467,12 +441,12 @@ Red Hat family - Amazon Linux 2012.3 and later - Amazon Linux 2 -- CentOS 6/7/8 +- CentOS 7/8/9 - Cloud Linux 6/7 -- Fedora 30/31 (install latest stable from standard repositories) -- Oracle Linux 6/7 -- Red Hat Enterprise Linux 6/7/8 -- Scientific Linux 6/7 +- Fedora 36/37/38 (install latest stable from standard repositories) +- Oracle Linux 7/8 +- Red Hat Enterprise Linux 7/8/9 +- Scientific Linux 7/8/9 SUSE family @@ -489,7 +463,7 @@ in combination with the ``git`` installation method. .. code:: console - sh bootstrap-salt.sh -x python2 git v2018.3.2 + sh bootstrap-salt.sh -x python3 git v3006.1 Ubuntu and derivatives @@ -502,12 +476,12 @@ Ubuntu Best Effort Support: Non-LTS Releases ******************************************** This script provides best-effort support for current, non-LTS Ubuntu releases. If package -repositories are not provided on `SaltStack's Ubuntu repository`_ for the non-LTS release, the -bootstrap script will attempt to install the packages for the most closely related LTS Ubuntu +repositories are not provided on the `Salt Project's Ubuntu repository`_ for the non-LTS release, +the bootstrap script will attempt to install the packages for the most closely related LTS Ubuntu release instead. For example, when installing Salt on Ubuntu 21.10, the bootstrap script will setup the repository -for Ubuntu 20.04 from `SaltStack's Ubuntu repository`_ and install the 20.04 packages. +for Ubuntu 20.04 from the `Salt Project's Ubuntu repository`_ and install the 20.04 packages. Non-LTS Ubuntu releases are not supported once the release reaches End-of-Life as defined by `Ubuntu's release schedule`_. @@ -564,42 +538,6 @@ please run the following commands and report their output when creating an issue For information on how to add support for a currently unsupported distribution, please refer to the `Contributing Guidelines`_. -Python 3 Support ----------------- - -Some distributions support installing Salt to use Python 3 instead of Python 2. The availability of -this offering, while limited, is as follows: - -- CentOS 7 -- Debian 10 -- Debian 11 -- Fedora (only git installations) -- Ubuntu 18.04 -- Ubuntu 20.04 - -On Fedora, PIP installation must be allowed (-P) due to incompatibility with the shipped Tornado -library. - -Installing the Python 3 packages for Salt is done via the ``-x`` option: - -.. code:: console - - sh bootstrap-salt.sh -x python3 - -See the ``-x`` option for more information. - -The earliest release of Salt that supports Python3 is `2018.3.4`. - -Tornado 5/6 Workaround ----------------------- -Salt does not support tornado>=5.0 currently. This support will be included in an upcoming release. -In order to work around this requirement on OSs that no longer have the tornado 4 package -available in their repositories we are pip installing tornado<5.0 in the bootstrap script. This -requires the user to pass -P to the bootstrap script if installing via git to ensure tornado is pip -installed. If a user does not pass this argument they will be warned that it is required for the -tornado 5 workaround. So far the OSs that are using this workaround are Debian 10, Centos 8 and -Fedora 31. - Testing ------- @@ -649,33 +587,4 @@ The ``Dockerfile`` here inherits the Ubuntu 14.04 public image with Upstart conf system. Use it as an example or starting point of how to make your own Docker images with suitable Salt components, custom configurations, and even `pre-accepted Minion keys`_ already installed. -Updating Drone Pipelines -======================== - -You should install and configure the drone-cli as shown here: https://docs.drone.io/cli/install/ - -Make edits to .drone.jsonnet and then save them into the .drone.yml by doing the following: - -.. code:: console - - drone jsonnet --format --stream - drone sign saltstack/salt-bootstrap --save - -.. _Contributing Guidelines: https://github.com/saltstack/salt-bootstrap/blob/develop/CONTRIBUTING.md -.. _Docker: https://www.docker.com/ -.. _`pre-accepted Minion keys`: https://docs.saltproject.io/en/latest/topics/tutorials/preseed_key.html -.. _`read the source`: https://github.com/saltstack/salt-bootstrap/blob/develop/bootstrap-salt.sh -.. _`Salt`: https://saltproject.io/ -.. _`Salt's Supported Operating Systems`: http://get.saltstack.com/rs/304-PHQ-615/images/SaltStack-Supported-Operating-Systems.pdf -.. _`SaltStack's corporate repository`: https://repo.saltproject.io/ -.. _`SaltStack's Debian repository`: http://repo.saltproject.io/#debian -.. _`SaltStack's Ubuntu repository`: http://repo.saltproject.io/#ubuntu -.. _`Ubuntu's release schedule`: https://wiki.ubuntu.com/Releases -.. _Vagrant: http://www.vagrantup.com -.. _hardening salt: https://docs.saltproject.io/en/latest/topics/hardening.html - -.. |build| image:: https://github.com/saltstack/salt-bootstrap/workflows/Testing/badge.svg?branch=develop - :target: https://github.com/saltstack/salt-bootstrap/actions?query=branch%3Adevelop - :alt: Build Status - .. vim: fenc=utf-8 spell spl=en cc=100 tw=99 fo=want sts=2 sw=2 et diff --git a/bootstrap-salt.sh b/bootstrap-salt.sh index ace3bce..f66aeea 100755 --- a/bootstrap-salt.sh +++ b/bootstrap-salt.sh @@ -23,7 +23,7 @@ #====================================================================================================================== set -o nounset # Treat unset variables as an error -__ScriptVersion="2023.08.03" +__ScriptVersion="2023.11.07" __ScriptName="bootstrap-salt.sh" __ScriptFullName="$0" @@ -1523,7 +1523,7 @@ __check_dpkg_architecture() { else # Saltstack official repository has arm64 metadata beginning with Debian 11, # use amd64 repositories on arm64 for anything older, since all pkgs are arch-independent - if [ "$DISTRO_NAME_L" = "debian" ] || [ "$DISTRO_MAJOR_VERSION" -lt 11 ]; then + if [ "$DISTRO_NAME_L" = "debian" ] && [ "$DISTRO_MAJOR_VERSION" -lt 11 ]; then __REPO_ARCH="amd64" else __REPO_ARCH="arm64" @@ -1709,6 +1709,14 @@ __debian_codename_translation() { "11") DISTRO_CODENAME="bullseye" ;; + "12") + DISTRO_CODENAME="bookworm" + # FIXME - TEMPORARY + # use bullseye packages until bookworm packages are available + DISTRO_CODENAME="bullseye" + DISTRO_MAJOR_VERSION=11 + rv=11 + ;; *) DISTRO_CODENAME="stretch" ;; @@ -2196,7 +2204,7 @@ __dnf_install_noinput() { #--- FUNCTION ------------------------------------------------------------------------------------------------------- # NAME: __tdnf_install_noinput -# DESCRIPTION: (DRY) dnf install with noinput options +# DESCRIPTION: (DRY) tdnf install with noinput options #---------------------------------------------------------------------------------------------------------------------- __tdnf_install_noinput() { @@ -7033,15 +7041,17 @@ install_photon_git_deps() { "${__python}" -m pip install "${dep}" || return 1 done else - __PACKAGES="python${PY_PKG_VER}-devel python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools gcc" + __PACKAGES="python${PY_PKG_VER}-devel python${PY_PKG_VER}-pip python${PY_PKG_VER}-setuptools gcc glibc-devel linux-devel.x86_64" # shellcheck disable=SC2086 __tdnf_install_noinput ${__PACKAGES} || return 1 fi - # Need newer version of setuptools on Photon - _setuptools_dep="setuptools>=${_MINIMUM_SETUPTOOLS_VERSION}" - echodebug "Running '${_PY_EXE} -m pip --upgrade install ${_setuptools_dep}'" - ${_PY_EXE} -m pip install --upgrade "${_setuptools_dep}" + if [ "${DISTRO_MAJOR_VERSION}" -gt 3 ]; then + # Need newer version of setuptools on Photon + _setuptools_dep="setuptools>=${_MINIMUM_SETUPTOOLS_VERSION}" + echodebug "Running '${_PY_EXE} -m pip --upgrade install ${_setuptools_dep}'" + ${_PY_EXE} -m pip install --upgrade "${_setuptools_dep}" + fi # Let's trigger config_salt() if [ "$_TEMP_CONFIG_DIR" = "null" ]; then diff --git a/requirements/release.txt b/requirements/release.txt index 992ea03..5fff107 100644 --- a/requirements/release.txt +++ b/requirements/release.txt @@ -1,28 +1,28 @@ # -# This file is autogenerated by pip-compile with Python 3.9 +# This file is autogenerated by pip-compile with Python 3.10 # by the following command: # -# pip-compile requirements/release.in +# pip-compile '.\requirements\release.in' # -attrs==22.2.0 +attrs==23.1.0 # via python-tools-scripts -boto3==1.26.110 - # via -r requirements/release.in -botocore==1.29.110 +boto3==1.28.79 + # via -r .\requirements\release.in +botocore==1.31.79 # via # boto3 # s3transfer -certifi==2023.07.22 +certifi==2023.7.22 # via requests -cfgv==3.3.1 +cfgv==3.4.0 # via pre-commit -charset-normalizer==3.1.0 +charset-normalizer==3.3.2 # via requests -distlib==0.3.6 +distlib==0.3.7 # via virtualenv -filelock==3.11.0 +filelock==3.13.1 # via virtualenv -identify==2.5.22 +identify==2.5.31 # via pre-commit idna==3.4 # via requests @@ -30,39 +30,39 @@ jmespath==1.0.1 # via # boto3 # botocore -markdown-it-py==2.2.0 +markdown-it-py==3.0.0 # via rich mdurl==0.1.2 # via markdown-it-py -nodeenv==1.7.0 +nodeenv==1.8.0 # via pre-commit -platformdirs==3.2.0 +platformdirs==3.11.0 # via virtualenv -pre-commit==3.2.2 - # via -r requirements/release.in -pygments==2.15.0 +pre-commit==3.5.0 + # via -r .\requirements\release.in +pygments==2.16.1 # via rich python-dateutil==2.8.2 # via botocore -python-tools-scripts==0.12.0 - # via -r requirements/release.in -pyyaml==6.0 +python-tools-scripts==0.18.1 + # via -r .\requirements\release.in +pyyaml==6.0.1 # via pre-commit -requests==2.28.2 +requests==2.31.0 # via python-tools-scripts -rich==13.3.3 +rich==13.6.0 # via python-tools-scripts -s3transfer==0.6.0 +s3transfer==0.7.0 # via boto3 six==1.16.0 # via python-dateutil -typing-extensions==4.5.0 +typing-extensions==4.8.0 # via python-tools-scripts -urllib3==1.26.15 +urllib3==2.0.7 # via # botocore # requests -virtualenv==20.21.0 +virtualenv==20.24.6 # via pre-commit # The following packages are considered to be unsafe in a requirements file: diff --git a/salt-quick-start.ps1 b/salt-quick-start.ps1 new file mode 100644 index 0000000..16c7055 --- /dev/null +++ b/salt-quick-start.ps1 @@ -0,0 +1,162 @@ +function Convert-PSObjectToHashtable { + param ( + [Parameter(ValueFromPipeline)] + $InputObject + ) + if ($null -eq $InputObject) { return $null } + + $is_enum = $InputObject -is [System.Collections.IEnumerable] + $not_string = $InputObject -isnot [string] + if ($is_enum -and $not_string) { + $collection = @( + foreach ($object in $InputObject) { + Convert-PSObjectToHashtable $object + } + ) + + Write-Host -NoEnumerate $collection + } elseif ($InputObject -is [PSObject]) { + $hash = @{} + + foreach ($property in $InputObject.PSObject.Properties) { + $hash[$property.Name] = Convert-PSObjectToHashtable $property.Value + } + + $hash + } else { + $InputObject + } +} + +function Expand-ZipFile { + # Extract a zip file + # + # Used by: + # - Install-SaltMinion + # + # Args: + # ZipFile (string): The file to extract + # Destination (string): The location to extract to + # + # Error: + # Sets the failed status and exits with a scriptFailed exit code + [CmdletBinding()] + param( + [Parameter(Mandatory = $true)] + [string] $ZipFile, + + [Parameter(Mandatory = $true)] + [string] $Destination + ) + + if (!(Test-Path -Path $Destination)) { + Write-Debug "Creating missing directory: $Destination" + New-Item -ItemType directory -Path $Destination + } + Write-Debug "Unzipping '$ZipFile' to '$Destination'" + if ($PSVersionTable.PSVersion.Major -ge 5) { + # PowerShell 5 introduced Expand-Archive + Write-Debug "Using Expand-Archive to unzip" + try{ + Expand-Archive -Path $ZipFile -DestinationPath $Destination -Force + } catch { + Write-Debug "Failed to unzip $ZipFile : $_" + exit 1 + } + } else { + # This method will work with older versions of powershell, but it is + # slow + Write-Debug "Using Shell.Application to unzip" + $objShell = New-Object -Com Shell.Application + $objZip = $objShell.NameSpace($ZipFile) + try{ + foreach ($item in $objZip.Items()) { + $objShell.Namespace($Destination).CopyHere($item, 0x14) + } + } catch { + Write-Debug "Failed to unzip $ZipFile : $_" + exit 1 + } + } + Write-Debug "Finished unzipping '$ZipFile' to '$Destination'" +} + + +[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]'Tls12' + +$global:ProgressPreference = 'SilentlyContinue' + +$RepoUrl = "https://repo.saltproject.io/salt/py3/onedir" + +if ([IntPtr]::Size -eq 4) { + $arch = "x86" +} else { + $arch = "amd64" +} +$enc = [System.Text.Encoding]::UTF8 +try { + $response = Invoke-WebRequest -Uri "$RepoUrl/repo.json" -UseBasicParsing + if ($response.Content.GetType().Name -eq "Byte[]") { + $psobj = $enc.GetString($response.Content) | ConvertFrom-Json + + } else { + $psobj = $response.Content | ConvertFrom-Json + } + $hash = Convert-PSObjectToHashtable $psobj +} catch { + Write-Host "repo.json not found at: $RepoUrl" + $hash = @{} +} +$searchVersion = "latest" +if ( $hash.Contains($searchVersion)) { + foreach ($item in $hash.($searchVersion).Keys) { + if ( $item.EndsWith(".zip") ) { + if ( $item.Contains($arch) ) { + $saltFileName = $hash.($searchVersion).($item).name + $saltVersion = $hash.($searchVersion).($item).version + $saltSha512 = $hash.($searchVersion).($item).SHA512 + } + } + } +} +if ( $saltFileName -and $saltVersion -and $saltSha512 ) { + if ( $RepoUrl.Contains("minor") ) { + $saltFileUrl = @($RepoUrl, $saltVersion, $saltFileName) -join "/" + } else { + $saltFileUrl = @($RepoUrl, "minor", $saltVersion, $saltFileName) -join "/" + } +} + +Write-Host "* INFO: Downloading Salt" +Invoke-WebRequest -Uri $saltFileUrl -OutFile .\salt.zip + +Write-Host "* INFO: Extracting Salt" +Expand-ZipFile -ZipFile .\salt.zip -Destination . + +$PATH = $(Get-Location).Path + +$saltfile_contents = @" +salt-call: + local: True + config_dir: $PATH\salt\conf + log_file: $PATH\salt\var\log\salt\minion + cachedir: $PATH\salt\var\cache\salt + file_root: $PATH\salt\srv\salt +"@ + +Set-Content -Path .\salt\Saltfile -Value $saltfile_contents + +New-Item -Path "$PATH\salt\var\log\salt" -Type Directory -Force | Out-Null +New-Item -Path "$PATH\salt\conf" -Type Directory -Force | Out-Null +New-Item -Path "$PATH\salt\var\cache\salt" -Type Directory -Force | Out-Null +New-Item -Path "$PATH\salt\srv\salt" -Type Directory -Force | Out-Null + +Write-Host "* INFO: Adding Salt to current path" +Write-Host "* INFO: $PATH\salt" +$env:Path = "$PATH\salt;$env:PATH" + +Write-Host "* INFO: Setting the SALT_SALTFILE environment variable" +Write-Host "* INFO: $PATH\salt\Saltfile" +$env:SALT_SALTFILE="$PATH\salt\Saltfile" + +Write-Host "* INFO: Create Salt states in $PATH\salt\srv\salt" diff --git a/salt-quick-start.sh b/salt-quick-start.sh new file mode 100755 index 0000000..8449abb --- /dev/null +++ b/salt-quick-start.sh @@ -0,0 +1,239 @@ +#!/bin/sh + +__ScriptName="salt-quick-start.sh" +SALT_REPO_URL="https://repo.saltproject.io/salt/py3/onedir" +_COLORS=${QS_COLORS:-$(tput colors 2>/dev/null || echo 0)} + +_LOCAL=0 +_FULL=0 +_STOP=0 + +PWD="$(pwd)" +_PATH=${PWD}/salt + + +__usage() { + cat << EOT + + Usage : ${__ScriptName} [options] + + Options: + -h Show usage. + -f Full setup with a Salt minion and Salt master running. + -l Local setup, no Salt minion or Salt master running. + -s Attempt to stop a running Salt minion and Salt master. + +EOT +} # ---------- end of function __usage ---------- + + +echoinfo() { + printf "${GC} * INFO${EC}: %s\\n" "$@"; +} + +echoerror() { + printf "${RC} * ERROR${EC}: %s\\n" "$@" 1>&2; +} + +__detect_color_support() { + # shellcheck disable=SC2181 + 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 + +while getopts ':fhls' opt +do + case "${opt}" in + + h ) __usage; exit 0 ;; + l ) _LOCAL=1 ;; + f ) _FULL=1 ;; + s ) _STOP=1 ;; + + esac # --- end of case --- +done +shift $((OPTIND-1)) + +if [[ "${_STOP}" == "1" ]]; then + if [[ -f "${_PATH}/var/run/salt-minion.pid" ]]; then + echoinfo "Stopping the salt-minion" + kill $(cat "${_PATH}/var/run/salt-minion.pid") + else + echoerror "${_PATH}/var/run/salt-minion.pid not found" + fi + if [[ -f "${_PATH}/var/run/salt-master.pid" ]]; then + echoinfo "Stopping the salt-master" + kill $(cat "${_PATH}/var/run/salt-master.pid") + else + echoerror "${_PATH}/var/run/salt-master.pid not found" + fi + exit 0 +fi + +if [[ "$_LOCAL" == "1" && "$_FULL" == "1" ]]; then + echo "Only specify either local or full" + exit 0 +fi + +__parse_repo_json_jq() { + _JSON_FILE="${SALT_REPO_URL}/repo.json" + _JSON_VERSION=$(curl -s ${_JSON_FILE} | jq -sr ".[].latest[] | select(.os == \"$1\") | select(.arch == \"$2\").version") +} + +__fetch_url() { + # shellcheck disable=SC2086 + curl $_CURL_ARGS -L -s -f -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 + (echoerror "$2 failed to download to $1"; exit 1) +} + +__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_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 +__gather_os_info + +_DARWIN_ARM=0 +if [[ "${OS_NAME_L}" == "darwin" ]]; then + OS_NAME="macos" + # Use x86_64 packages until we are able build arm packages + if [[ "${CPU_ARCH_L}" == "arm64" ]]; then + CPU_ARCH_L="x86_64" + _DARWIN_ARM=1 + fi +else + OS_NAME="${OS_NAME_L}" +fi + +__parse_repo_json_jq ${OS_NAME} ${CPU_ARCH_L} + +FILE="salt-${_JSON_VERSION}-onedir-${OS_NAME_L}-${CPU_ARCH_L}.tar.xz" +URL="${SALT_REPO_URL}/latest/${FILE}" + +if [[ ! -f ${FILE} ]]; then + echoinfo "Downloading Salt" + __fetch_url "${FILE}" "${URL}" +fi + +if [[ ! -d "salt" ]]; then + echoinfo "Extracting Salt" + tar xf ${FILE} + + # very very hacky, remove ASAP + if [[ "${_DARWIN_ARM}" == "1" ]]; then + mkdir -p ${_PATH}/opt/openssl/lib + ln -s ${_PATH}/lib/libcrypto.dylib ${_PATH}/opt/openssl/lib/libcrypto.dylib + fi +else + echoinfo "A salt directory already exists here, not extracting." +fi + +mkdir -p ${_PATH}/etc/salt +mkdir -p ${_PATH}/srv/salt + +cat <${_PATH}/etc/salt/master +root_dir: ${_PATH} +file_root: ${_PATH}/srv/salt +EOT + +cat <${_PATH}/etc/salt/minion +root_dir: ${_PATH} +master: 127.0.0.1 +id: minion +EOT + +cat <${_PATH}/Saltfile +salt-call: + local: True + config_dir: ${_PATH}/etc/salt + log_file: ${_PATH}/var/log/salt/minion + cachedir: ${_PATH}/var/cache/salt + file_root: ${_PATH}/srv/salt + +salt-master: + config_dir: ${_PATH}/etc/salt + file_root: ${_PATH}/srv/salt + +salt-minion: + config_dir: ${_PATH}/etc/salt + file_root: ${_PATH}/srv/salt + +salt-key: + config_dir: ${_PATH}/etc/salt + +salt: + config_dir: ${_PATH}/etc/salt +EOT + +PATH_MSG="export PATH=${_PATH}" +PATH_MSG+=':$PATH' + +echoinfo "Get started with Salt by running the following commands" +echoinfo "Add Salt to current path" +echoinfo " ${PATH_MSG}" +echoinfo "Use the provided Saltfile" +echoinfo " export SALT_SALTFILE=${_PATH}/Saltfile" +# very very hacky, remove ASAP +if [[ "${_DARWIN_ARM}" == "1" ]]; then + echoinfo "Setup HOMEBREW" + echoinfo " export HOMEBREW_PREFIX=${_PATH}" +fi + +echoinfo "Create Salt states in ${_PATH}/srv/salt" + +if [[ "${_FULL}" == "1" ]]; then + + export PATH="${_PATH}:$PATH" + export SALT_SALTFILE="${_PATH}/Saltfile" + # very very hacky, remove ASAP + if [[ "${_DARWIN_ARM}" == "1" ]]; then + export HOMEBREW_PREFIX=${_PATH} + fi + echoinfo "Starting salt-master" + salt-master -d -c ${_PATH}/etc/salt + sleep 5 + echoinfo "Starting salt-minion" + salt-minion -d -c ${_PATH}/etc/salt + +echoinfo "Run salt-key -L to see pending minion keys" +echoinfo "Run salt-key -a minion to accept the pending minion key" + +fi