From 21ef511ff005e37e3377c89ed8602f43a8421181 Mon Sep 17 00:00:00 2001 From: MSVSphere Packaging Team Date: Wed, 4 Sep 2024 17:57:28 +0300 Subject: [PATCH] import salt-3006.8-1.el8 --- .gitignore | 1 + .salt.metadata | 1 + SOURCES/64675.patch | 368 +++++++++ SOURCES/README.fedora | 11 + SOURCES/contextvars.patch | 15 + SOURCES/match_hostname.patch | 24 + SOURCES/salt-api | 154 ++++ SOURCES/salt-api.service | 14 + SOURCES/salt-call.fish | 23 + SOURCES/salt-common.logrotate | 47 ++ SOURCES/salt-cp.fish | 5 + SOURCES/salt-key.fish | 36 + SOURCES/salt-master | 142 ++++ SOURCES/salt-master.fish | 6 + SOURCES/salt-master.service | 13 + SOURCES/salt-minion | 323 ++++++++ SOURCES/salt-minion.fish | 6 + SOURCES/salt-minion.service | 14 + SOURCES/salt-proxy@.service | 13 + SOURCES/salt-py3-2019.2.1-rpmsign.patch | 214 ++++++ SOURCES/salt-run.fish | 6 + SOURCES/salt-syndic | 136 ++++ SOURCES/salt-syndic.fish | 6 + SOURCES/salt-syndic.service | 14 + SOURCES/salt.bash | 375 ++++++++++ SOURCES/salt.fish | 38 + SOURCES/salt.sysusers | 3 + SOURCES/salt_common.fish | 439 +++++++++++ SPECS/salt.spec | 955 ++++++++++++++++++++++++ 29 files changed, 3402 insertions(+) create mode 100644 .gitignore create mode 100644 .salt.metadata create mode 100644 SOURCES/64675.patch create mode 100644 SOURCES/README.fedora create mode 100644 SOURCES/contextvars.patch create mode 100644 SOURCES/match_hostname.patch create mode 100755 SOURCES/salt-api create mode 100644 SOURCES/salt-api.service create mode 100644 SOURCES/salt-call.fish create mode 100644 SOURCES/salt-common.logrotate create mode 100644 SOURCES/salt-cp.fish create mode 100644 SOURCES/salt-key.fish create mode 100755 SOURCES/salt-master create mode 100644 SOURCES/salt-master.fish create mode 100644 SOURCES/salt-master.service create mode 100755 SOURCES/salt-minion create mode 100644 SOURCES/salt-minion.fish create mode 100644 SOURCES/salt-minion.service create mode 100644 SOURCES/salt-proxy@.service create mode 100644 SOURCES/salt-py3-2019.2.1-rpmsign.patch create mode 100644 SOURCES/salt-run.fish create mode 100755 SOURCES/salt-syndic create mode 100644 SOURCES/salt-syndic.fish create mode 100644 SOURCES/salt-syndic.service create mode 100644 SOURCES/salt.bash create mode 100644 SOURCES/salt.fish create mode 100644 SOURCES/salt.sysusers create mode 100644 SOURCES/salt_common.fish create mode 100644 SPECS/salt.spec diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c71583c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/salt-3006.8.tar.gz diff --git a/.salt.metadata b/.salt.metadata new file mode 100644 index 0000000..7baf8d0 --- /dev/null +++ b/.salt.metadata @@ -0,0 +1 @@ +cff6fe9151cc8d1c231ce166aac975450d72c118 SOURCES/salt-3006.8.tar.gz diff --git a/SOURCES/64675.patch b/SOURCES/64675.patch new file mode 100644 index 0000000..1bf6fb2 --- /dev/null +++ b/SOURCES/64675.patch @@ -0,0 +1,368 @@ +From f51113921a4a1ba6c37150e7ed5f1b206e96e18a Mon Sep 17 00:00:00 2001 +From: David Murphy < dmurphy@saltstack.com> +Date: Wed, 19 Jul 2023 18:13:57 -0600 +Subject: [PATCH 01/11] Added support for dnf5 for Fedora + +--- + salt/modules/yumpkg.py | 38 +++++++++++++++-------- + tests/pytests/unit/modules/test_yumpkg.py | 14 +++++++-- + 2 files changed, 36 insertions(+), 16 deletions(-) + +diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py +index 413c0e12f77a..08a7d7d05860 100644 +--- a/salt/modules/yumpkg.py ++++ b/salt/modules/yumpkg.py +@@ -145,7 +147,7 @@ def _get_hold(line, pattern=__HOLD_PATTERN, full=True): + + def _yum(): + """ +- Determine package manager name (yum or dnf), ++ Determine package manager name (yum or dnf[5]), + depending on the executable existence in $PATH. + """ + +@@ -168,7 +170,10 @@ def _check(file): + contextkey = "yum_bin" + if contextkey not in context: + for dir in os.environ.get("PATH", os.defpath).split(os.pathsep): +- if _check(os.path.join(dir, "dnf")): ++ if _check(os.path.join(dir, "dnf5")): ++ context[contextkey] = "dnf5" ++ break ++ elif _check(os.path.join(dir, "dnf")): + context[contextkey] = "dnf" + break + elif _check(os.path.join(dir, "tdnf")): +@@ -245,7 +250,8 @@ def _versionlock_pkg(grains=None): + """ + if grains is None: + grains = __grains__ +- if _yum() == "dnf": ++ ++ if _yum() == "dnf" or _yum() == "dnf5": + if grains["os"].lower() == "fedora": + return ( + "python3-dnf-plugin-versionlock" +@@ -272,10 +278,11 @@ def _check_versionlock(): + + def _get_options(**kwargs): + """ +- Returns a list of options to be used in the yum/dnf command, based on the ++ Returns a list of options to be used in the yum/dnf[5] command, based on the + kwargs passed. + """ + # Get repo options from the kwargs ++ # dnf5 aliases dnf options, so no need to change + fromrepo = kwargs.pop("fromrepo", "") + repo = kwargs.pop("repo", "") + disablerepo = kwargs.pop("disablerepo", "") +@@ -1053,7 +1060,9 @@ def list_upgrades(refresh=True, **kwargs): + + cmd = ["--quiet"] + cmd.extend(options) +- cmd.extend(["list", "upgrades" if _yum() == "dnf" else "updates"]) ++ cmd.extend( ++ ["list", "upgrades" if (_yum() == "dnf" or _yum() == "dnf5") else "updates"] ++ ) + out = _call_yum(cmd, ignore_retcode=True) + if out["retcode"] != 0 and "Error:" in out: + return {} +@@ -1708,7 +1717,8 @@ def _add_common_args(cmd): + if skip_verify: + cmd.append("--nogpgcheck") + if downloadonly: +- cmd.append("--downloadonly") ++ if _yum() != "dnf5": ++ cmd.append("--downloadonly") + + try: + holds = list_holds(full=False) +@@ -1769,6 +1779,8 @@ def _temporarily_unhold(pkgs, targets): + cmd.extend(["--best", "--allowerasing"]) + _add_common_args(cmd) + cmd.append("install" if pkg_type != "advisory" else "update") ++ if _yum() == "dnf5": ++ cmd.extend(["--best", "--allowerasing"]) + cmd.extend(targets) + out = _call_yum(cmd, ignore_retcode=False, redirect_stderr=True) + if out["retcode"] != 0: +@@ -2002,7 +2014,7 @@ def upgrade( + + salt '*' pkg.upgrade security=True exclude='kernel*' + """ +- if _yum() == "dnf" and not obsoletes: ++ if (_yum() == "dnf" or _yum() == "dnf5") and not obsoletes: + # for dnf we can just disable obsoletes + _setopt = [ + opt +@@ -2040,7 +2052,7 @@ def upgrade( + cmd.append("upgrade" if not minimal else "upgrade-minimal") + else: + # do not force the removal of obsolete packages +- if _yum() == "dnf": ++ if _yum() == "dnf" or _yum() == "dnf5": + cmd.append("upgrade" if not minimal else "upgrade-minimal") + else: + # for yum we have to use update instead of upgrade +@@ -2396,7 +2408,7 @@ def unhold(name=None, pkgs=None, sources=None, **kwargs): # pylint: disable=W06 + + ret[target] = {"name": target, "changes": {}, "result": False, "comment": ""} + +- if _yum() == "dnf": ++ if _yum() == "dnf" or _yum() == "dnf5": + search_locks = [x for x in current_locks if x == target] + else: + # To accommodate yum versionlock's lack of support for removing +@@ -3032,7 +3044,7 @@ def mod_repo(repo, basedir=None, **kwargs): + if use_copr: + # Is copr plugin installed? + copr_plugin_name = "" +- if _yum() == "dnf": ++ if _yum() == "dnf" or _yum() == "dnf5": + copr_plugin_name = "dnf-plugins-core" + else: + copr_plugin_name = "yum-plugin-copr" +@@ -3493,7 +3505,7 @@ def services_need_restart(**kwargs): + + salt '*' pkg.services_need_restart + """ +- if _yum() != "dnf": ++ if _yum() == "dnf": + raise CommandExecutionError("dnf is required to list outdated services.") + if not salt.utils.systemd.booted(__context__): + raise CommandExecutionError("systemd is required to list outdated services.") +diff --git a/tests/pytests/unit/modules/test_yumpkg.py b/tests/pytests/unit/modules/test_yumpkg.py +index 1354ee5d2d0d..1b1992daf475 100644 +--- a/tests/pytests/unit/modules/test_yumpkg.py ++++ b/tests/pytests/unit/modules/test_yumpkg.py +@@ -72,7 +72,7 @@ def list_repos_var(): + + + @pytest.fixture( +- ids=["yum", "dnf"], ++ ids=["yum", "dnf", "dnf5"], + params=[ + { + "context": {"yum_bin": "yum"}, +@@ -84,6 +84,11 @@ def list_repos_var(): + "grains": {"os": "Fedora", "osrelease": 27}, + "cmd": ["dnf", "-y", "--best", "--allowerasing"], + }, ++ { ++ "context": {"yum_bin": "dnf5"}, ++ "grains": {"os": "Fedora", "osrelease": 39}, ++ "cmd": ["dnf5", "-y"], ++ }, + ], + ) + def yum_and_dnf(request): +@@ -692,7 +697,7 @@ def test_list_repo_pkgs_with_options(list_repos_var): + except AssertionError: + continue + else: +- pytest.fail("repo '{}' not checked".format(repo)) ++ pytest.fail(f"repo '{repo}' not checked") + + + def test_list_upgrades_dnf(): +@@ -2085,7 +2090,10 @@ def test_59705_version_as_accidental_float_should_become_text( + new, full_pkg_string, yum_and_dnf + ): + name = "fnord" +- expected_cmd = yum_and_dnf + ["install", full_pkg_string] ++ expected_cmd = yum_and_dnf + ["install"] ++ if expected_cmd[0] == "dnf5": ++ expected_cmd += ["--best", "--allowerasing"] ++ expected_cmd += [full_pkg_string] + cmd_mock = MagicMock( + return_value={"pid": 12345, "retcode": 0, "stdout": "", "stderr": ""} + ) + +From dd239d061003b7e9d9a0c22836204acd6df46320 Mon Sep 17 00:00:00 2001 +From: David Murphy < dmurphy@saltstack.com> +Date: Wed, 19 Jul 2023 18:29:51 -0600 +Subject: [PATCH 02/11] Added changelog entry + +--- + changelog/64532.added.md | 1 + + 1 file changed, 1 insertion(+) + create mode 100644 changelog/64532.added.md + +diff --git a/changelog/64532.added.md b/changelog/64532.added.md +new file mode 100644 +index 000000000000..53595d69280d +--- /dev/null ++++ b/changelog/64532.added.md +@@ -0,0 +1 @@ ++Added support for dnf5 and its new command syntax + +From 0349df1f2cdfe396a648eda86639c76efabefc0e Mon Sep 17 00:00:00 2001 +From: David Murphy +Date: Thu, 20 Jul 2023 09:39:11 -0600 +Subject: [PATCH 06/11] Update salt/modules/yumpkg.py + +Co-authored-by: Pedro Algarvio +--- + salt/modules/yumpkg.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py +index 3ab033361c02..6d4ab469165d 100644 +--- a/salt/modules/yumpkg.py ++++ b/salt/modules/yumpkg.py +@@ -1061,7 +1061,7 @@ def list_upgrades(refresh=True, **kwargs): + cmd = ["--quiet"] + cmd.extend(options) + cmd.extend( +- ["list", "upgrades" if (_yum() == "dnf" or _yum() == "dnf5") else "updates"] ++ ["list", "upgrades" if _yum() in ("dnf", "dnf5") else "updates"] + ) + out = _call_yum(cmd, ignore_retcode=True) + if out["retcode"] != 0 and "Error:" in out: + +From 3a5c478fa455fe8bba198728de304a09a76bb1db Mon Sep 17 00:00:00 2001 +From: David Murphy +Date: Thu, 20 Jul 2023 09:39:23 -0600 +Subject: [PATCH 07/11] Update salt/modules/yumpkg.py + +Co-authored-by: Pedro Algarvio +--- + salt/modules/yumpkg.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py +index 6d4ab469165d..6ebd9ce4acfb 100644 +--- a/salt/modules/yumpkg.py ++++ b/salt/modules/yumpkg.py +@@ -2014,7 +2014,7 @@ def upgrade( + + salt '*' pkg.upgrade security=True exclude='kernel*' + """ +- if (_yum() == "dnf" or _yum() == "dnf5") and not obsoletes: ++ if _yum() in ("dnf", "dnf5") and not obsoletes: + # for dnf we can just disable obsoletes + _setopt = [ + opt + +From 085e39acac36b839185fcef13d07ebcf9985ba6a Mon Sep 17 00:00:00 2001 +From: David Murphy +Date: Thu, 20 Jul 2023 09:39:41 -0600 +Subject: [PATCH 08/11] Update salt/modules/yumpkg.py + +Co-authored-by: Pedro Algarvio +--- + salt/modules/yumpkg.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py +index 6ebd9ce4acfb..c67c18d5b848 100644 +--- a/salt/modules/yumpkg.py ++++ b/salt/modules/yumpkg.py +@@ -2052,7 +2052,7 @@ def upgrade( + cmd.append("upgrade" if not minimal else "upgrade-minimal") + else: + # do not force the removal of obsolete packages +- if _yum() == "dnf" or _yum() == "dnf5": ++ if _yum() in ("dnf", "dnf5"): + cmd.append("upgrade" if not minimal else "upgrade-minimal") + else: + # for yum we have to use update instead of upgrade + +From 90162b872d25e31bc3cecc2c6f4c65d38de57481 Mon Sep 17 00:00:00 2001 +From: David Murphy +Date: Thu, 20 Jul 2023 09:39:48 -0600 +Subject: [PATCH 09/11] Update salt/modules/yumpkg.py + +Co-authored-by: Pedro Algarvio +--- + salt/modules/yumpkg.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py +index c67c18d5b848..c5725cdc8c4d 100644 +--- a/salt/modules/yumpkg.py ++++ b/salt/modules/yumpkg.py +@@ -2408,7 +2408,7 @@ def unhold(name=None, pkgs=None, sources=None, **kwargs): # pylint: disable=W06 + + ret[target] = {"name": target, "changes": {}, "result": False, "comment": ""} + +- if _yum() == "dnf" or _yum() == "dnf5": ++ if _yum() in ("dnf", "dnf5"): + search_locks = [x for x in current_locks if x == target] + else: + # To accommodate yum versionlock's lack of support for removing + +From 1a89a642208fb4d59fd1fdfde9aa67ba737fa5ab Mon Sep 17 00:00:00 2001 +From: David Murphy +Date: Thu, 20 Jul 2023 09:39:59 -0600 +Subject: [PATCH 10/11] Update salt/modules/yumpkg.py + +Co-authored-by: Pedro Algarvio +--- + salt/modules/yumpkg.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py +index c5725cdc8c4d..a3688c8c57de 100644 +--- a/salt/modules/yumpkg.py ++++ b/salt/modules/yumpkg.py +@@ -3044,7 +3044,7 @@ def mod_repo(repo, basedir=None, **kwargs): + if use_copr: + # Is copr plugin installed? + copr_plugin_name = "" +- if _yum() == "dnf" or _yum() == "dnf5": ++ if _yum() in ("dnf", "dnf5"): + copr_plugin_name = "dnf-plugins-core" + else: + copr_plugin_name = "yum-plugin-copr" + +From 9d4f211b01cada23c66d714d5e58662fa382a9da Mon Sep 17 00:00:00 2001 +From: David Murphy < dmurphy@saltstack.com> +Date: Thu, 20 Jul 2023 09:46:20 -0600 +Subject: [PATCH 11/11] Updates due to reviewer suggestions + +--- + salt/modules/yumpkg.py | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py +index a3688c8c57de..31129855fc7a 100644 +--- a/salt/modules/yumpkg.py ++++ b/salt/modules/yumpkg.py +@@ -1060,9 +1060,7 @@ def list_upgrades(refresh=True, **kwargs): + + cmd = ["--quiet"] + cmd.extend(options) +- cmd.extend( +- ["list", "upgrades" if _yum() in ("dnf", "dnf5") else "updates"] +- ) ++ cmd.extend(["list", "upgrades" if _yum() in ("dnf", "dnf5") else "updates"]) + out = _call_yum(cmd, ignore_retcode=True) + if out["retcode"] != 0 and "Error:" in out: + return {} +@@ -3505,7 +3503,7 @@ def services_need_restart(**kwargs): + + salt '*' pkg.services_need_restart + """ +- if _yum() == "dnf": ++ if _yum() != "dnf": + raise CommandExecutionError("dnf is required to list outdated services.") + if not salt.utils.systemd.booted(__context__): + raise CommandExecutionError("systemd is required to list outdated services.") +--- salt-3006.1/salt/modules/yumpkg.py~ 2023-07-21 11:04:34.563699567 -0500 ++++ salt-3006.1/salt/modules/yumpkg.py 2023-07-21 11:15:32.708768955 -0500 +@@ -124,12 +124,12 @@ + dnf ==> vim-enhanced-2:7.4.827-1.fc22.* + """ + if full: +- if _yum() == "dnf": ++ if _yum() in ("dnf", "dnf5"): + lock_re = r"({}-\S+)".format(pattern) + else: + lock_re = r"(\d+:{}-\S+)".format(pattern) + else: +- if _yum() == "dnf": ++ if _yum() in ("dnf", "dnf5"): + lock_re = r"({}-\S+)".format(pattern) + else: + lock_re = r"\d+:({}-\S+)".format(pattern) diff --git a/SOURCES/README.fedora b/SOURCES/README.fedora new file mode 100644 index 0000000..276a232 --- /dev/null +++ b/SOURCES/README.fedora @@ -0,0 +1,11 @@ +These packages are *optional* dependencies for salt. By default, they are not included in the salt RPMs. +Install any of these packages to enable the functionality within salt. + +MySQL-python +libvirt-python +python-mako +pymongo +python-redis / redis + +A semi-canonical list of the optional salt modules can be found at +https://github.com/saltstack/salt/blob/develop/doc/conf.py#L30 diff --git a/SOURCES/contextvars.patch b/SOURCES/contextvars.patch new file mode 100644 index 0000000..4807d25 --- /dev/null +++ b/SOURCES/contextvars.patch @@ -0,0 +1,15 @@ +--- salt-3006.1/requirements/base.txt~ 2023-05-05 12:53:34.000000000 -0500 ++++ salt-3006.1/requirements/base.txt 2023-05-24 09:59:08.874838801 -0500 +@@ -9,4 +9,3 @@ + packaging>=21.3 + looseversion + # We need contextvars for salt-ssh +-contextvars +--- a/requirements/zeromq.txt~ 2024-02-20 16:04:07.000000000 -0600 ++++ b/requirements/zeromq.txt 2024-02-22 14:27:46.531045353 -0600 +@@ -2,5 +2,3 @@ + -r crypto.txt + + pyzmq>=20.0.0 +-pyzmq==25.0.2 ; sys_platform == "win32" +-pyzmq==25.1.2 ; sys_platform == "darwin" diff --git a/SOURCES/match_hostname.patch b/SOURCES/match_hostname.patch new file mode 100644 index 0000000..3bda7ec --- /dev/null +++ b/SOURCES/match_hostname.patch @@ -0,0 +1,24 @@ +--- a/salt/ext/tornado/netutil.py~ 2023-05-05 12:53:34.000000000 -0500 ++++ b/salt/ext/tornado/netutil.py 2023-07-24 11:27:02.376824349 -0500 +@@ -54,8 +54,8 @@ + elif ssl is None: + ssl_match_hostname = SSLCertificateError = None # type: ignore + else: +- import backports.ssl_match_hostname +- ssl_match_hostname = backports.ssl_match_hostname.match_hostname ++ import urllib3.util.ssl_match_hostname ++ ssl_match_hostname = urllib3.util.ssl_match_hostname + SSLCertificateError = backports.ssl_match_hostname.CertificateError # type: ignore + + if hasattr(ssl, 'SSLContext'): +--- a/salt/ext/tornado/netutil.py~ 2023-07-24 11:50:02.836988664 -0500 ++++ b/salt/ext/tornado/netutil.py 2023-07-24 11:50:52.217539638 -0500 +@@ -56,7 +56,7 @@ + else: + import urllib3.util.ssl_match_hostname + ssl_match_hostname = urllib3.util.ssl_match_hostname +- SSLCertificateError = backports.ssl_match_hostname.CertificateError # type: ignore ++ SSLCertificateError = urllib3.util.ssl_match_hostname.CertificateError # type: ignore + + if hasattr(ssl, 'SSLContext'): + if hasattr(ssl, 'create_default_context'): diff --git a/SOURCES/salt-api b/SOURCES/salt-api new file mode 100755 index 0000000..cd06569 --- /dev/null +++ b/SOURCES/salt-api @@ -0,0 +1,154 @@ +#!/bin/sh +# +# Salt API +################################### + +# LSB header + +### BEGIN INIT INFO +# Provides: salt-api +# Required-Start: $local_fs $remote_fs $network $named $time +# Should-Start: $time ypbind smtp +# Required-Stop: $local_fs $remote_fs $network $named $time +# Should-Stop: ypbind smtp +# Default-Start: 3 5 +# Default-Stop: 0 1 2 6 +# Short-Description: Salt API control daemon +# Description: This is a daemon that controls the Salt API. +### END INIT INFO + + +# chkconfig header + +# chkconfig: 345 99 99 +# description: This is a daemon that controls the Salt API. +# +# processname: /usr/bin/salt-api + + +if [ -f /etc/default/salt ]; then + . /etc/default/salt +else + SALTAPI=/usr/bin/salt-api + PYTHON=/usr/bin/python +fi + +# Sanity checks. +[ -x $SALTAPI ] || exit 0 + +DEBIAN_VERSION=/etc/debian_version +SUSE_RELEASE=/etc/SuSE-release +# Source function library. +if [ -f $DEBIAN_VERSION ]; then + break +elif [ -f $SUSE_RELEASE -a -r /etc/rc.status ]; then + . /etc/rc.status +else + . /etc/rc.d/init.d/functions +fi + +SERVICE=salt-api +PROCESS=salt-api +CONFIG_ARGS="-d" +PID_FILE="/var/run/salt-api.pid" + +RETVAL=0 + +start() { + echo -n $"Starting salt-api daemon: " + if [ -f $SUSE_RELEASE ]; then + startproc -f -p /var/run/$SERVICE.pid $SALTAPI $CONFIG_ARGS + rc_status -v + elif [ -e $DEBIAN_VERSION ]; then + if [ -f $LOCKFILE ]; then + echo -n "already started, lock file found" + RETVAL=1 + elif $PYTHON $SALTAPI; then + echo -n "OK" + RETVAL=0 + fi + else + if status $PROCESS &> /dev/null; then + failure "Already running." + RETVAL=1 + else + daemon --pidfile=$PID_FILE --check $SERVICE $SALTAPI $CONFIG_ARGS + RETVAL=$? + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$SERVICE + echo + return $RETVAL + fi + fi + RETVAL=$? + echo + return $RETVAL +} + +stop() { + echo -n $"Stopping salt-api daemon: " + if [ -f $SUSE_RELEASE ]; then + killproc -TERM $SALTAPI + rc_status -v + elif [ -f $DEBIAN_VERSION ]; then + # Added this since Debian's start-stop-daemon doesn't support spawned processes + if ps -ef | grep "$PYTHON $SALTAPI" | grep -v grep | awk '{print $2}' | xargs kill &> /dev/null; then + echo -n "OK" + RETVAL=0 + else + echo -n "Daemon is not started" + RETVAL=1 + fi + else + killproc -d 10 $PROCESS + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$SERVICE + return $RETVAL + fi + RETVAL=$? + echo + return $RETVAL +} + +restart() { + stop + start +} + +# See how we were called. +case "$1" in + start|stop|restart) + $1 + ;; + status) + if [ -f $SUSE_RELEASE ]; then + echo -n "Checking for service salt-api " + checkproc $SALTAPI + rc_status -v + RETVAL=$? + elif [ -f $DEBIAN_VERSION ]; then + if [ -f $LOCKFILE ]; then + RETVAL=0 + echo "salt-api is running." + else + RETVAL=1 + echo "salt-api is stopped." + fi + else + status $PROCESS + RETVAL=$? + fi + ;; + condrestart|try-restart) + [ -f $LOCKFILE ] && restart || : + ;; + reload) + echo "can't reload configuration, you have to restart it" + RETVAL=1 + ;; + *) + echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload}" + exit 1 + ;; +esac +exit $RETVAL diff --git a/SOURCES/salt-api.service b/SOURCES/salt-api.service new file mode 100644 index 0000000..d0b6d74 --- /dev/null +++ b/SOURCES/salt-api.service @@ -0,0 +1,14 @@ +[Unit] +Description=The Salt API +Documentation=man:salt-api(1) file:///usr/share/doc/salt/html/contents.html https://docs.saltproject.io/en/latest/contents.html +After=network.target + +[Service] +Type=notify +NotifyAccess=all +LimitNOFILE=8192 +ExecStart=/usr/bin/salt-api +TimeoutStopSec=3 + +[Install] +WantedBy=multi-user.target diff --git a/SOURCES/salt-call.fish b/SOURCES/salt-call.fish new file mode 100644 index 0000000..e8300c7 --- /dev/null +++ b/SOURCES/salt-call.fish @@ -0,0 +1,23 @@ +# salt-call completion for fish shell +# See salt_common.fish in the same folder for the information + +# hack to load functions from salt_common completion +complete --do-complete='salt_common --' >/dev/null + +# salt-call general options (from --help) +complete -c salt-call -r -l file-root -d "Set this directory as the base file root." +complete -c salt-call -f -s g -l grains -d "Return the information generated by the salt grains " +complete -c salt-call -f -l id -d "Specify the minion id to use. If this option is omitted, the id option from the minion config will be used." +complete -c salt-call -f -l local -d "Run salt-call locally, as if there was no master running." +complete -c salt-call -x -l master -d "Specify the master to use. The minion must be authenticated with the master. If this option is omitted, the master options from the minion config will be used. If multi masters are set up the first listed master that responds will be used." +complete -c salt-call -r -s m -l module-dirs -d "Specify an additional directory to pull modules from. Multiple directories can be provided by passing `-m /--module-dirs` multiple times." +complete -c salt-call -r -l pillar-root -d "Set this directory as the base pillar root." +complete -c salt-call -f -l refresh-grains-cache -d "Force a refresh of the grains cache" +complete -c salt-call -f -l retcode-passthrough -d "Exit with the salt call retcode and not the salt binary retcode" +complete -c salt-call -f -l skip-grains -d "Do not load grains." + +# functions +complete -c salt-call -f -a '(__fish_salt_list_function)' +# complete -c salt -f -n 'not __fish_salt_extract_function' -a '(__fish_salt_list_function)' +# arguments and name values +complete -c salt-call -f -n '__fish_salt_extract_function' -a '(__fish_salt_list_arg_name) (__fish_salt_list_arg_value)' diff --git a/SOURCES/salt-common.logrotate b/SOURCES/salt-common.logrotate new file mode 100644 index 0000000..a0306ff --- /dev/null +++ b/SOURCES/salt-common.logrotate @@ -0,0 +1,47 @@ +/var/log/salt/master { + weekly + missingok + rotate 7 + compress + notifempty +} + +/var/log/salt/minion { + weekly + missingok + rotate 7 + compress + notifempty +} + +/var/log/salt/key { + weekly + missingok + rotate 7 + compress + notifempty +} + +/var/log/salt/api { + weekly + missingok + rotate 7 + compress + notifempty +} + +/var/log/salt/syndic { + weekly + missingok + rotate 7 + compress + notifempty +} + +/var/log/salt/proxy { + weekly + missingok + rotate 7 + compress + notifempty +} diff --git a/SOURCES/salt-cp.fish b/SOURCES/salt-cp.fish new file mode 100644 index 0000000..41beb53 --- /dev/null +++ b/SOURCES/salt-cp.fish @@ -0,0 +1,5 @@ +# salt-cp completion for fish shell +# See salt_common.fish in the same folder for the information + +# hack to load functions from salt_common.fish completion +complete --do-complete='salt_common --' >/dev/null diff --git a/SOURCES/salt-key.fish b/SOURCES/salt-key.fish new file mode 100644 index 0000000..dbdab5a --- /dev/null +++ b/SOURCES/salt-key.fish @@ -0,0 +1,36 @@ +# salt-key completion for fish shell +# See salt_common.fish in the same folder for the information + +# hack to load functions from salt_common completion +complete --do-complete='salt_common --' >/dev/null + + +# salt-key general options (from --help) +complete -c salt-key -f -s A -l accept-all -d "Accept all pending keys" +complete -c salt-key -f -s a -l accept -d "Accept the specified public key (use --include-all to match rejected keys in addition to pending keys). Globs are supported." +complete -c salt-key -f -l auto-create -d "Auto-create a signing key-pair if it does not yet exist" +complete -c salt-key -f -s D -l delete-all -d "Delete all keys" +complete -c salt-key -f -s d -l delete -d "Delete the specified key. Globs are supported." +complete -c salt-key -f -s F -l finger-all -d "Print all keys' fingerprints" +complete -c salt-key -f -s f -l finger -d "Print the specified key's fingerprint" +complete -c salt-key -r -l gen-keys-dir -d "Set the directory to save the generated keypair, only works with \"gen_keys_dir\" option; default=." +complete -c salt-key -f -l gen-keys -d "Set a name to generate a keypair for use with salt" +complete -c salt-key -f -l gen-signature -d "Create a signature file of the masters public-key named master_pubkey_signature. The signature can be send to a minion in the masters auth-reply and enables the minion to verify the masters public-key cryptographically. This requires a new signing-key- pair which can be auto-created with the --auto-create parameter" +complete -c salt-key -f -l include-all -d "Include non-pending keys when accepting/rejecting" +complete -c salt-key -x -l keysize -d "Set the keysize for the generated key, only works with the \"--gen-keys\" option, the key size must be 2048 or higher, otherwise it will be rounded up to 2048; ; default=2048" +complete -c salt-key -f -s L -l list-all -d "List all public keys. (Deprecated: use \"--list all\")" +complete -c salt-key -x -s l -l list -d "List the public keys" -a "pre un unaccepted acc accepted rej rejected all" +complete -c salt-key -f -s P -l print-all -d "Print all public keys" +complete -c salt-key -f -s p -l print -d "Print the specified public key" +complete -c salt-key -r -l priv -d "The private-key file to create a signature with" +complete -c salt-key -r -l pub -d "The public-key file to create a signature for" +complete -c salt-key -f -s R -l reject-all -d "Reject all pending keys" +complete -c salt-key -f -s r -l reject -d "Reject the specified public key (use --include-all to match accepted keys in addition to pending keys). Globs are supported." +complete -c salt-key -r -l signature-path -d "The path where the signature file should be written" + +# minions +complete -c salt-key -f -n '__fish_contains_opt -s a accept; and not __fish_salt_extract_minion' -a '(__fish_salt_list_minion unaccepted) (__fish_salt_list_minion rejected)' +complete -c salt-key -f -n '__fish_contains_opt -s d delete; and not __fish_salt_extract_minion' -a '(__fish_salt_list_minion all)' +complete -c salt-key -f -n '__fish_contains_opt -s f finger; and not __fish_salt_extract_minion' -a '(__fish_salt_list_minion all)' +complete -c salt-key -f -n '__fish_contains_opt -s p print; and not __fish_salt_extract_minion' -a '(__fish_salt_list_minion all)' +complete -c salt-key -f -n '__fish_contains_opt -s r reject; and not __fish_salt_extract_minion' -a '(__fish_salt_list_minion unaccepted) (__fish_salt_list_minion accepted)' diff --git a/SOURCES/salt-master b/SOURCES/salt-master new file mode 100755 index 0000000..aef6923 --- /dev/null +++ b/SOURCES/salt-master @@ -0,0 +1,142 @@ +#!/bin/sh +# +# Salt master +################################### + +# LSB header + +### BEGIN INIT INFO +# Provides: salt-master +# Required-Start: $all +# Required-Stop: +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Salt master control daemon +# Description: This is a daemon that controls the Salt minions. +### END INIT INFO + + +# chkconfig header + +# chkconfig: 345 96 05 +# description: This is a daemon that controls the Salt minions +# +# processname: /usr/bin/salt-master + + +DEBIAN_VERSION=/etc/debian_version +SUSE_RELEASE=/etc/SuSE-release +# Source function library. +if [ -f $DEBIAN_VERSION ]; then + break +elif [ -f $SUSE_RELEASE -a -r /etc/rc.status ]; then + . /etc/rc.status +else + . /etc/rc.d/init.d/functions +fi + +# Default values (can be overridden below) +SALTMASTER=/usr/bin/salt-master +PYTHON=/usr/bin/python +MASTER_ARGS="" + +if [ -f /etc/default/salt ]; then + . /etc/default/salt +fi + +SERVICE=salt-master +PROCESS=salt-master + +RETVAL=0 + +start() { + echo -n $"Starting salt-master daemon: " + if [ -f $SUSE_RELEASE ]; then + startproc -f -p /var/run/$SERVICE.pid $SALTMASTER -d $MASTER_ARGS + rc_status -v + elif [ -e $DEBIAN_VERSION ]; then + if [ -f $LOCKFILE ]; then + echo -n "already started, lock file found" + RETVAL=1 + elif $PYTHON $SALTMASTER -d $MASTER_ARGS >& /dev/null; then + echo -n "OK" + RETVAL=0 + fi + else + daemon --check $SERVICE $SALTMASTER -d $MASTER_ARGS + RETVAL=$? + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$SERVICE + echo + return $RETVAL + fi + RETVAL=$? + echo + return $RETVAL +} + +stop() { + echo -n $"Stopping salt-master daemon: " + if [ -f $SUSE_RELEASE ]; then + killproc -TERM $SALTMASTER + rc_status -v + elif [ -f $DEBIAN_VERSION ]; then + # Added this since Debian's start-stop-daemon doesn't support spawned processes + if ps -ef | grep "$PYTHON $SALTMASTER" | grep -v grep | awk '{print $2}' | xargs kill &> /dev/null; then + echo -n "OK" + RETVAL=0 + else + echo -n "Daemon is not started" + RETVAL=1 + fi + else + killproc -d 10 $PROCESS + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$SERVICE + return $RETVAL + fi + RETVAL=$? + echo +} + +restart() { + stop + start +} + +# See how we were called. +case "$1" in + start|stop|restart) + $1 + ;; + status) + if [ -f $SUSE_RELEASE ]; then + echo -n "Checking for service salt-master " + checkproc $SALTMASTER + rc_status -v + elif [ -f $DEBIAN_VERSION ]; then + if [ -f $LOCKFILE ]; then + RETVAL=0 + echo "salt-master is running." + else + RETVAL=1 + echo "salt-master is stopped." + fi + else + status $PROCESS + RETVAL=$? + fi + ;; + condrestart) + [ -f $LOCKFILE ] && restart || : + ;; + reload) + echo "can't reload configuration, you have to restart it" + RETVAL=1 + ;; + *) + echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}" + exit 1 + ;; +esac +exit $RETVAL diff --git a/SOURCES/salt-master.fish b/SOURCES/salt-master.fish new file mode 100644 index 0000000..895b1ee --- /dev/null +++ b/SOURCES/salt-master.fish @@ -0,0 +1,6 @@ +# salt-master completion for fish shell +# See salt_common.fish in the same folder for the information + +# hack to load functions from salt_common completion +complete --do-complete='salt_common --' >/dev/null + diff --git a/SOURCES/salt-master.service b/SOURCES/salt-master.service new file mode 100644 index 0000000..377c87a --- /dev/null +++ b/SOURCES/salt-master.service @@ -0,0 +1,13 @@ +[Unit] +Description=The Salt Master Server +Documentation=man:salt-master(1) file:///usr/share/doc/salt/html/contents.html https://docs.saltproject.io/en/latest/contents.html +After=network.target + +[Service] +LimitNOFILE=100000 +Type=notify +NotifyAccess=all +ExecStart=/usr/bin/salt-master + +[Install] +WantedBy=multi-user.target diff --git a/SOURCES/salt-minion b/SOURCES/salt-minion new file mode 100755 index 0000000..1bff798 --- /dev/null +++ b/SOURCES/salt-minion @@ -0,0 +1,323 @@ +#!/bin/sh +# +# Salt minion +################################### + +# LSB header + +### BEGIN INIT INFO +# Provides: salt-minion +# Required-Start: $all +# Required-Stop: +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Salt minion daemon +# Description: This is the Salt minion daemon that can be controlled by the +# Salt master. +### END INIT INFO + + +# chkconfig header + +# chkconfig: 345 97 04 +# description: This is the Salt minion daemon that can be controlled by the Salt master. +# +# processname: /usr/bin/salt-minion + +# Allow these to be overridden for tests +: "${SALTMINION_BINDIR:=/usr/bin}" +: "${SALTMINION_SYSCONFDIR:=/etc}" + +# Default values (can be overridden in settings file) +: "${USER:=$(id -nu)}" +SALTMINION="${SALTMINION_BINDIR}/salt-minion" +SALTCALL="${SALTMINION_BINDIR}/salt-call" +# SALTMINION_CONFIGS are newline-separated entries of: MINION_USER CONFIG_DIR +: "${SALTMINION_CONFIGS:=" +$USER ${SALTMINION_SYSCONFDIR}/salt +"}" +SALTMINION_ARGS="" +SALTMINION_TIMEOUT=30 +SALTMINION_TICK=1 + +SERVICE="salt-minion" + +# Read in settings file +if [ -f "${SALTMINION_SYSCONFDIR}/default/salt" ]; then + . "${SALTMINION_SYSCONFDIR}/default/salt" +elif [ -f "${SALTMINION_SYSCONFDIR}/sysconfig/salt" ]; then + . "${SALTMINION_SYSCONFDIR}/sysconfig/salt" +fi + +RETVAL=0 +NS_NOTRIM="--notrim" +ERROR_TO_DEVNULL="/dev/null" + + +_su_cmd() { + local user="$1" + shift + + if [ "X$USER" = "X$user" ]; then + eval $1 + else + su -l -c "$1" "$user" + fi +} + + +_get_pid() { + cat $PID_FILE 2>/dev/null +} + + +_is_running() { + [ -n "$(_get_pid)" ] && ps wwwaxu | grep '[s]alt-minion' | awk '{print $2}' | grep -qi "\b$(_get_pid)\b" +} + + +_get_salt_config_value() { + _su_cmd \ + "$MINION_USER" \ + "\ + \"$SALTCALL\" \ + -c \"$CONFIG_DIR\" \ + --no-color \ + --skip-grains \ + --local config.get \ + \"$1\" \ + " \ + 2>$ERROR_TO_DEVNULL \ + | sed -r -e '2!d; s/^\s*//;' +} + + +_make_id_hash() { + # $1 - minion_id + local hasher='' + + case "$(_get_salt_config_value hash_type)" in + (md5) hasher="md5sum";; + (sha1) hasher="sha1sum";; + (sha224) hasher="sha224sum";; + (sha256) hasher="sha256sum";; + (sha384) hasher="sha384sum";; + (sha512) hasher="sha512sum";; + (*) echo "ERROR: No salt hash_type specified";; + esac + + if [ -n "$hasher" ]; then + printf "$1" | "$hasher" | cut -c 1-10 + fi +} + + +start() { + # $1 - config dir + local retval=0 + + if _is_running; then + echo "Service $SERVICE:$MINION_USER:$MINION_ID already running" + return 0 + fi + + echo -n "Starting $SERVICE:$MINION_USER:$MINION_ID daemon: " + + _su_cmd \ + "$MINION_USER" \ + "\ + \"$SALTMINION\" \ + -c \"$CONFIG_DIR\" \ + -d $SALTMINION_ARGS \ + ${SALTMINION_DEBUG:+-l debug} \ + " \ + 2>$ERROR_TO_DEVNULL \ + || retval=$? + + if [ 0 -eq "$retval" ]; then + local endtime=$(($(date '+%s')+$SALTMINION_TIMEOUT)) + while ! _is_running; do + if [ "$endtime" -lt "$(date '+%s')" ]; then + echo -n "TIMEOUT " + retval=1 + break + fi + sleep $SALTMINION_TICK + done + fi + + if [ 0 -eq "$retval" ]; then + echo -n "OK" + else + echo -n "FAIL" + if [ -n "$SALTMINION_DEBUG" ]; then + printf "\nPROCESSES:\n" >&2 + ps wwwaxu | grep '[s]alt-minion' >&2 + printf "\nSOCKETS:\n" >&2 + netstat -n $NS_NOTRIM -ap --protocol=unix | grep 'salt.*minion' >&2 + printf "\nLOG_FILE:\n" >&2 + tail -n 20 "$LOG_FILE" >&2 + printf "\nENVIRONMENT:\n" >&2 + env >&2 + fi + fi + echo + + return $retval +} + + +stop() { + # $1 - config dir + local retval=0 + + if ! _is_running; then + echo "Service $SERVICE:$MINION_USER:$MINION_ID is not running" + return 0 + fi + + echo -n "Stopping $SERVICE:$MINION_USER:$MINION_ID daemon: " + local pid="$(_get_pid)" + + # pid below is intentionally not quoted in case there are *multiple* + # minions running with the same configuration. + _su_cmd "$MINION_USER" "kill -TERM $pid 2>/dev/null" || retval=$? + if [ 0 -eq "$retval" ]; then + local endtime=$(($(date '+%s')+$SALTMINION_TIMEOUT)) + while _is_running; do + if [ "$endtime" -lt "$(date '+%s')" ]; then + # Try one more time with a big hammer + _su_cmd "$MINION_USER" "kill -KILL $pid 2>/dev/null" || : + sleep $SALTMINION_TICK + if _is_running; then + echo -n "TIMEOUT " + retval=1 + fi + break + fi + sleep 1 + done + + fi + + if [ 0 -eq "$retval" ]; then + rm -f "$PID_FILE" + echo -n "OK" + else + echo -n "FAIL" + fi + + echo + + return $retval +} + + +status() { + local retval=0 + local pid="$(_get_pid)" + + if _is_running; then + # Unquote $pid here to display multiple PIDs in one line + echo "$SERVICE:$MINION_USER:$MINION_ID is running:" $pid + else + retval=3 + echo "$SERVICE:$MINION_USER:$MINION_ID is stopped." + if [ -e "$PID_FILE" ]; then + echo "$SERVICE:$MINION_USER:$MINION_ID has orphaned pid file: $PID_FILE." + retval=1 + fi + fi + return $retval +} + +restart() { + # $1 - config dir + stop "$1" + start "$1" +} + + +main() { + if [ -n "$SALTMINION_DEBUG" ]; then + set -x + ERROR_TO_DEVNULL="&2" + fi + + # Check to see if --notrim is a valid netstat option + if ! ( netstat --help 2>&1 | grep -wq '\-\-notrim') ; then + NS_NOTRIM='' + fi + + # Pre-filter for unhandled commands + case "$1" in + (start|stop|status|restart|condrestart|try-restart) ;; + (reload) + echo "Can't reload $SERVICE - you must restart it" + exit 3 + ;; + (*) + echo "Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload}" + exit 2 + ;; + esac + + while read MINION_USER CONFIG_DIR; do + if [ -z "$CONFIG_DIR" ]; then + continue + fi + + if ! [ -d "$CONFIG_DIR" ]; then + echo "ERROR: non-existent $SERVICE config directory: $CONFIG_DIR" + RETVAL=1 + continue + fi + + SOCK_DIR="$(_get_salt_config_value sock_dir)" + PID_FILE="$(_get_salt_config_value pidfile)" + LOG_FILE="$(_get_salt_config_value log_file)" + MINION_ID="$(_get_salt_config_value id)" + MINION_ID_HASH="$(_make_id_hash "$MINION_ID")" + if [ \ + -z "$SOCK_DIR" \ + -o -z "$PID_FILE" \ + -o -z "$LOG_FILE" \ + -o -z "$MINION_ID" \ + -o -z "$MINION_ID_HASH" \ + ]; then + echo "ERROR: Unable to look-up config values for $CONFIG_DIR" + RETVAL=1 + continue + fi + + # See how we were called. + case "$1" in + (start|stop|restart|status) + "$1" || RETVAL=$? + ;; + (condrestart|try-restart) + if ! _is_running; then + RETVAL=7 + else + stop + start || RETVAL=$? + fi + ;; + (*) + echo "Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload}" + RETVAL=2 + ;; + esac + done </dev/null + diff --git a/SOURCES/salt-minion.service b/SOURCES/salt-minion.service new file mode 100644 index 0000000..69aff18 --- /dev/null +++ b/SOURCES/salt-minion.service @@ -0,0 +1,14 @@ +[Unit] +Description=The Salt Minion +Documentation=man:salt-minion(1) file:///usr/share/doc/salt/html/contents.html https://docs.saltproject.io/en/latest/contents.html +After=network.target salt-master.service + +[Service] +KillMode=process +Type=notify +NotifyAccess=all +LimitNOFILE=8192 +ExecStart=/usr/bin/salt-minion + +[Install] +WantedBy=multi-user.target diff --git a/SOURCES/salt-proxy@.service b/SOURCES/salt-proxy@.service new file mode 100644 index 0000000..1eebc88 --- /dev/null +++ b/SOURCES/salt-proxy@.service @@ -0,0 +1,13 @@ +[Unit] +Description=salt-proxy service for %i +Documentation=man:salt-proxy(1) file:///usr/share/doc/salt/html/contents.html https://docs.saltproject.io/en/latest/contents.html +After=network.target + +[Service] +ExecStart=/usr/bin/salt-proxy --proxyid=%i +Type=simple +Restart=on-failure +RestartSec=5s + +[Install] +WantedBy=multi-user.target diff --git a/SOURCES/salt-py3-2019.2.1-rpmsign.patch b/SOURCES/salt-py3-2019.2.1-rpmsign.patch new file mode 100644 index 0000000..ca5d524 --- /dev/null +++ b/SOURCES/salt-py3-2019.2.1-rpmsign.patch @@ -0,0 +1,214 @@ +diff -Naur a/salt/modules/rpmbuild_pkgbuild.py b/salt/modules/rpmbuild_pkgbuild.py +--- a/salt/modules/rpmbuild_pkgbuild.py 2019-07-02 10:15:07.035874718 -0600 ++++ b/salt/modules/rpmbuild_pkgbuild.py 2019-07-02 10:55:34.147934899 -0600 +@@ -140,7 +140,9 @@ + tgtattrs = tgt.split('-') + if tgtattrs[0] == 'amzn': + distset = '--define "dist .{0}1"'.format(tgtattrs[0]) +- elif tgtattrs[1] in ['6', '7']: ++ elif tgtattrs[0] == 'amzn2': ++ distset = '--define "dist .{0}"'.format(tgtattrs[0]) ++ elif tgtattrs[1] in ['6', '7', '8']: + distset = '--define "dist .el{0}"'.format(tgtattrs[1]) + else: + distset = '' +@@ -173,6 +175,19 @@ + return deps_list + + ++def _check_repo_gpg_phrase_utils(): ++ ''' ++ Check for /usr/libexec/gpg-preset-passphrase is installed ++ ''' ++ util_name = '/usr/libexec/gpg-preset-passphrase' ++ if __salt__['file.file_exists'](util_name): ++ return True ++ else: ++ raise CommandExecutionError( ++ 'utility \'{0}\' needs to be installed'.format(util_name) ++ ) ++ ++ + def make_src_pkg(dest_dir, spec, sources, env=None, template=None, saltenv='base', runas='root'): + ''' + Create a source rpm from the given spec file and sources +@@ -450,8 +465,14 @@ + + Use a passphrase with the signing key presented in ``keyid``. + Passphrase is received from Pillar data which could be passed on the +- command line with ``pillar`` parameter. For example: ++ command line with ``pillar`` parameter. + ++ .. versionadded:: 2018.2.1 ++ ++ RHEL 8 and above leverages gpg-agent and gpg-preset-passphrase for ++ caching keys, etc. ++ ++ For example: + .. code-block:: bash + + pillar='{ "gpg_passphrase" : "my_passphrase" }' +@@ -485,10 +506,27 @@ + ''' + SIGN_PROMPT_RE = re.compile(r'Enter pass phrase: ', re.M) + +- define_gpg_name = '' ++ local_keygrip_to_use = None ++ local_key_fingerprint = None + local_keyid = None + local_uids = None ++ define_gpg_name = '' + phrase = '' ++ retrc = 0 ++ use_gpg_agent = False ++ ++ res = { ++ 'retcode': 1, ++ 'stdout': '', ++ 'stderr': 'initialization value' ++ } ++ ++ if gnupghome and env is None: ++ env = {} ++ env['GNUPGHOME'] = gnupghome ++ ++ if __grains__.get('osmajorrelease') >= 7: ++ use_gpg_agent = True + + if keyid is not None: + # import_keys +@@ -517,8 +555,29 @@ + if keyid == gpg_key['keyid'][8:]: + local_uids = gpg_key['uids'] + local_keyid = gpg_key['keyid'] ++ if use_gpg_agent: ++ local_keygrip_to_use = gpg_key['fingerprint'] ++ local_key_fingerprint = gpg_key['fingerprint'] + break + ++ if use_gpg_agent: ++ cmd = 'gpg --with-keygrip --list-secret-keys' ++ local_keys2_keygrip = __salt__['cmd.run'](cmd, runas=runas, env=env) ++ local_keys2 = iter(local_keys2_keygrip.splitlines()) ++ try: ++ for line in local_keys2: ++ if line.startswith('sec'): ++ line_fingerprint = next(local_keys2).lstrip().rstrip() ++ if local_key_fingerprint == line_fingerprint: ++ lkeygrip = next(local_keys2).split('=') ++ local_keygrip_to_use = lkeygrip[1].lstrip().rstrip() ++ break ++ except StopIteration: ++ raise SaltInvocationError( ++ 'unable to find keygrip associated with fingerprint \'{0}\' for keyid \'{1}\'' ++ .format(local_key_fingerprint, local_keyid) ++ ) ++ + if local_keyid is None: + raise SaltInvocationError( + 'The key ID \'{0}\' was not found in GnuPG keyring at \'{1}\'' +@@ -527,6 +586,15 @@ + + if use_passphrase: + phrase = __salt__['pillar.get']('gpg_passphrase') ++ if use_gpg_agent: ++ _check_repo_gpg_phrase_utils() ++ cmd = '/usr/libexec/gpg-preset-passphrase --verbose --preset --passphrase "{0}" {1}'.format(phrase, local_keygrip_to_use) ++ retrc = __salt__['cmd.retcode'](cmd, runas=runas, env=env) ++ if retrc != 0: ++ raise SaltInvocationError( ++ 'Failed to preset passphrase, error {1}, ' ++ 'check logs for further details'.format(retrc) ++ ) + + if local_uids: + define_gpg_name = '--define=\'%_signature gpg\' --define=\'%_gpg_name {0}\''.format( +@@ -553,43 +621,54 @@ + number_retries = timeout / interval + times_looped = 0 + error_msg = 'Failed to sign file {0}'.format(abs_file) +- cmd = 'rpm {0} --addsign {1}'.format(define_gpg_name, abs_file) +- preexec_fn = functools.partial(salt.utils.user.chugid_and_umask, runas, None) +- try: +- stdout, stderr = None, None +- proc = salt.utils.vt.Terminal( +- cmd, +- shell=True, +- preexec_fn=preexec_fn, +- stream_stdout=True, +- stream_stderr=True +- ) +- while proc.has_unread_data: +- stdout, stderr = proc.recv() +- if stdout and SIGN_PROMPT_RE.search(stdout): +- # have the prompt for inputting the passphrase +- proc.sendline(phrase) +- else: +- times_looped += 1 ++ if use_gpg_agent: ++ cmd = 'rpmsign --verbose --key-id={0} --addsign {1}'.format(local_keyid, abs_file) ++ retrc |= __salt__['cmd.retcode'](cmd, runas=runas, cwd=repodir, use_vt=True, env=env) ++ if retrc != 0: ++ raise SaltInvocationError( ++ 'Signing encountered errors for command \'{0}\', ' ++ 'return error {1}, check logs for further details'.format( ++ cmd, ++ retrc) ++ ) ++ else: ++ cmd = 'rpm {0} --addsign {1}'.format(define_gpg_name, abs_file) ++ preexec_fn = functools.partial(salt.utils.user.chugid_and_umask, runas, None) ++ try: ++ stdout, stderr = None, None ++ proc = salt.utils.vt.Terminal( ++ cmd, ++ shell=True, ++ preexec_fn=preexec_fn, ++ stream_stdout=True, ++ stream_stderr=True ++ ) ++ while proc.has_unread_data: ++ stdout, stderr = proc.recv() ++ if stdout and SIGN_PROMPT_RE.search(stdout): ++ # have the prompt for inputting the passphrase ++ proc.sendline(phrase) ++ else: ++ times_looped += 1 ++ ++ if times_looped > number_retries: ++ raise SaltInvocationError( ++ 'Attemping to sign file {0} failed, timed out after {1} seconds' ++ .format(abs_file, int(times_looped * interval)) ++ ) ++ time.sleep(interval) + +- if times_looped > number_retries: ++ proc_exitstatus = proc.exitstatus ++ if proc_exitstatus != 0: + raise SaltInvocationError( +- 'Attemping to sign file {0} failed, timed out after {1} seconds' +- .format(abs_file, int(times_looped * interval)) ++ 'Signing file {0} failed with proc.status {1}' ++ .format(abs_file, proc_exitstatus) + ) +- time.sleep(interval) +- +- proc_exitstatus = proc.exitstatus +- if proc_exitstatus != 0: +- raise SaltInvocationError( +- 'Signing file {0} failed with proc.status {1}' +- .format(abs_file, proc_exitstatus) +- ) +- except salt.utils.vt.TerminalException as err: +- trace = traceback.format_exc() +- log.error(error_msg, err, trace) +- finally: +- proc.close(terminate=True, kill=True) ++ except salt.utils.vt.TerminalException as err: ++ trace = traceback.format_exc() ++ log.error(error_msg, err, trace) ++ finally: ++ proc.close(terminate=True, kill=True) + + cmd = 'createrepo --update {0}'.format(repodir) + return __salt__['cmd.run_all'](cmd, runas=runas) diff --git a/SOURCES/salt-run.fish b/SOURCES/salt-run.fish new file mode 100644 index 0000000..f0e79a2 --- /dev/null +++ b/SOURCES/salt-run.fish @@ -0,0 +1,6 @@ +# salt-run completion for fish shell +# See salt_common.fish in the same folder for the information + +# hack to load functions from salt_common completion +complete --do-complete='salt_common --' >/dev/null + diff --git a/SOURCES/salt-syndic b/SOURCES/salt-syndic new file mode 100755 index 0000000..cb991e0 --- /dev/null +++ b/SOURCES/salt-syndic @@ -0,0 +1,136 @@ +#!/bin/sh +# +# Salt syndic +################################### + +# LSB header + +### BEGIN INIT INFO +# Provides: salt-syndic +# Required-Start: $all +# Required-Stop: +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Salt syndic master-minion passthrough daemon +# Description: This is a the Salt syndic daemon that enables Salt master-minion +# remote control passthrough. +### END INIT INFO + + +# chkconfig header + +# chkconfig: - 99 99 +# description: This is a the Salt syndic daemon that enables Salt master-minion remote control passthrough. +# +# processname: /usr/bin/salt-syndic + + +DEBIAN_VERSION=/etc/debian_version +SUSE_RELEASE=/etc/SuSE-release +# Source function library. +if [ -f $DEBIAN_VERSION ]; then + break +elif [ -f $SUSE_RELEASE -a -r /etc/rc.status ]; then + . /etc/rc.status +else + . /etc/rc.d/init.d/functions +fi + +# Default values (can be overridden below) +SALTSYNDIC=/usr/bin/salt-syndic +PYTHON=/usr/bin/python +SYNDIC_ARGS="" + +if [ -f /etc/default/salt ]; then + . /etc/default/salt +fi + +SERVICE=salt-syndic +PROCESS=salt-syndic + +RETVAL=0 + +start() { + echo -n $"Starting salt-syndic daemon: " + if [ -f $SUSE_RELEASE ]; then + startproc -f -p /var/run/$SERVICE.pid $SALTSYNDIC -d $SYNDIC_ARGS + rc_status -v + elif [ -e $DEBIAN_VERSION ]; then + if [ -f $LOCKFILE ]; then + echo -n "already started, lock file found" + RETVAL=1 + elif $PYTHON $SALTSYNDIC -d $SYNDIC_ARGS >& /dev/null; then + echo -n "OK" + RETVAL=0 + fi + else + daemon --check $SERVICE $SALTSYNDIC -d $SYNDIC_ARGS + RETVAL=$? + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$SERVICE + echo + return $RETVAL + fi + RETVAL=$? + echo + return $RETVAL +} + +stop() { + echo -n $"Stopping salt-syndic daemon: " + if [ -f $SUSE_RELEASE ]; then + killproc -TERM $SALTSYNDIC + rc_status -v + elif [ -f $DEBIAN_VERSION ]; then + # Added this since Debian's start-stop-daemon doesn't support spawned processes + if ps -ef | grep "$PYTHON $SALTSYNDIC" | grep -v grep | awk '{print $2}' | xargs kill &> /dev/null; then + echo -n "OK" + RETVAL=0 + else + echo -n "Daemon is not started" + RETVAL=1 + fi + else + killproc -d 10 $PROCESS + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$SERVICE + return $RETVAL + fi + RETVAL=$? + echo +} + +restart() { + stop + start +} + +# See how we were called. +case "$1" in + start|stop|restart) + $1 + ;; + status) + if [ -f $SUSE_RELEASE ]; then + echo -n "Checking for service salt-syndic " + checkproc $SALTSYNDIC + rc_status -v + elif [ -f $DEBIAN_VERSION ]; then + if [ -f $LOCKFILE ]; then + RETVAL=0 + echo "salt-syndic is running." + else + RETVAL=1 + echo "salt-syndic is stopped." + fi + else + status $PROCESS + RETVAL=$? + fi + ;; + *) + echo $"Usage: $0 {start|stop|status|restart}" + exit 1 + ;; +esac +exit $RETVAL diff --git a/SOURCES/salt-syndic.fish b/SOURCES/salt-syndic.fish new file mode 100644 index 0000000..1698778 --- /dev/null +++ b/SOURCES/salt-syndic.fish @@ -0,0 +1,6 @@ +# salt completion for fish shell +# See salt_common.fish in the same folder for the information + +# hack to load functions from salt_common completion +complete --do-complete='salt_common --' >/dev/null + diff --git a/SOURCES/salt-syndic.service b/SOURCES/salt-syndic.service new file mode 100644 index 0000000..ed403d5 --- /dev/null +++ b/SOURCES/salt-syndic.service @@ -0,0 +1,14 @@ +[Unit] +Description=The Salt Master Server +Documentation=man:salt-syndic(1) file:///usr/share/doc/salt/html/contents.html https://docs.saltproject.io/en/latest/contents.html +After=network.target +PartOf=salt-master.service + +[Service] +Type=notify +NotifyAccess=all +LimitNOFILE=8192 +ExecStart=/usr/bin/salt-syndic + +[Install] +WantedBy=multi-user.target diff --git a/SOURCES/salt.bash b/SOURCES/salt.bash new file mode 100644 index 0000000..35fe069 --- /dev/null +++ b/SOURCES/salt.bash @@ -0,0 +1,375 @@ +# written by David Pravec +# - feel free to /msg alekibango on IRC if you want to talk about this file + +# TODO: check if --config|-c was used and use configured config file for queries +# TODO: solve somehow completion for salt -G pythonversion:[tab] +# (not sure what to do with lists) +# TODO: --range[tab] -- how? +# TODO: --compound[tab] -- how? +# TODO: use history to extract some words, esp. if ${cur} is empty +# TODO: TEST EVERYTHING a lot +# TODO: is it ok to use '--timeout 2' ? + + +_salt_get_grains(){ + if [ "$1" = 'local' ] ; then + salt-call --log-level=error --out=txt -- grains.ls | sed 's/^.*\[//' | tr -d ",']" |sed 's:\([a-z0-9]\) :\1\: :g' + else + salt '*' --timeout 2 --hide-timeout --log-level=error --out=txt -- grains.ls | sed 's/^.*\[//' | tr -d ",']" |sed 's:\([a-z0-9]\) :\1\: :g' + fi +} + +_salt_get_grain_values(){ + if [ "$1" = 'local' ] ; then + salt-call --log-level=error --out=txt -- grains.item $1 |sed 's/^\S*:\s//' |grep -v '^\s*$' + else + salt '*' --timeout 2 --hide-timeout --log-level=error --out=txt -- grains.item $1 |sed 's/^\S*:\s//' |grep -v '^\s*$' + fi +} + +_salt_get_keys(){ + for type in $*; do + # remove header from data: + salt-key --no-color -l $type | tail -n+2 + done +} + +_salt_list_functions(){ + # salt-call: get all functions on this minion + # salt: get all functions on all minions + # sed: remove all array overhead and convert to newline separated list + # sort: chop out doubled entries, so overhead is minimal later during actual completion + if [ "$1" = 'local' ] ; then + salt-call --log-level=quiet --out=txt -- sys.list_functions \ + | sed "s/^.*\[//;s/[],']//g;s/ /\n/g" \ + | sort -u + else + salt '*' --timeout 2 --hide-timeout --log-level=quiet --out=txt -- sys.list_functions \ + | sed "s/^.*\[//;s/[],']//g;s/ /\n/g" \ + | sort -u + fi +} + +_salt_get_coms() { + CACHE_DIR="$HOME/.cache/salt-${1}-comp-cache_functions" + local _salt_cache_functions=${SALT_COMP_CACHE_FUNCTIONS:=$CACHE_DIR} + local _salt_cache_timeout=${SALT_COMP_CACHE_TIMEOUT:='last hour'} + + if [ ! -d "$(dirname ${_salt_cache_functions})" ]; then + mkdir -p "$(dirname ${_salt_cache_functions})" + fi + + # Regenerate cache if timed out + if [[ "$(stat --format=%Z ${_salt_cache_functions} 2>/dev/null)" -lt "$(date --date="${_salt_cache_timeout}" +%s)" ]]; then + _salt_list_functions $1 > "${_salt_cache_functions}" + fi + + # filter results, to only print the part to next dot (or end of function) + sed 's/^\('${cur}'\(\.\|[^.]*\)\)\?.*/\1/' "${_salt_cache_functions}" | sort -u +} + +_salt(){ + + local cur prev opts _salt_grains _salt_coms pprev ppprev + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + if [ ${COMP_CWORD} -gt 2 ]; then + pprev="${COMP_WORDS[COMP_CWORD-2]}" + fi + if [ ${COMP_CWORD} -gt 3 ]; then + ppprev="${COMP_WORDS[COMP_CWORD-3]}" + fi + + opts="-h --help -d --doc --documentation --version --versions-report -c \ + --config-dir= -v --verbose -t --timeout= -s --static -b --batch= \ + --batch-size= -E --pcre -L --list -G --grain --grain-pcre -N \ + --nodegroup -R --range -C --compound -I --pillar \ + --return= -a --auth= --eauth= --extended-auth= -T --make-token -S \ + --ipcidr --out=pprint --out=yaml --out=overstatestage --out=json \ + --out=raw --out=highstate --out=key --out=txt --no-color --out-indent= " + + if [[ "${cur}" == -* ]] ; then + COMPREPLY=($(compgen -W "${opts}" -- ${cur})) + return 0 + fi + + # 2 special cases for filling up grain values + case "${pprev}" in + -G|--grain|--grain-pcre) + if [ "${cur}" = ":" ]; then + COMPREPLY=($(compgen -W "`_salt_get_grain_values ${prev}`")) + return 0 + fi + ;; + esac + case "${ppprev}" in + -G|--grain|--grain-pcre) + if [ "${prev}" = ":" ]; then + COMPREPLY=( $(compgen -W "`_salt_get_grain_values ${pprev}`" -- ${cur}) ) + return 0 + fi + ;; + esac + + if [ "${cur}" = "=" ] && [[ "${prev}" == --* ]]; then + cur="" + fi + if [ "${prev}" = "=" ] && [[ "${pprev}" == --* ]]; then + prev="${pprev}" + fi + + case "${prev}" in + + -c|--config) + COMPREPLY=($(compgen -f -- ${cur})) + return 0 + ;; + salt) + COMPREPLY=($(compgen -W "\'*\' ${opts} $(_salt_get_keys acc)" -- ${cur})) + return 0 + ;; + -E|--pcre) + COMPREPLY=($(compgen -W "$(_salt_get_keys acc)" -- ${cur})) + return 0 + ;; + -G|--grain|--grain-pcre) + COMPREPLY=($(compgen -W "$(_salt_get_grains)" -- ${cur})) + return 0 + ;; + -C|--compound) + COMPREPLY=() # TODO: finish this one? how? + return 0 + ;; + -t|--timeout) + COMPREPLY=($( compgen -W "1 2 3 4 5 6 7 8 9 10 15 20 30 40 60 90 120 180" -- ${cur})) + return 0 + ;; + -b|--batch|--batch-size) + COMPREPLY=($(compgen -W "1 2 3 4 5 6 7 8 9 10 15 20 30 40 50 60 70 80 90 100 120 150 200")) + return 0 + ;; + -N|--nodegroup) + MASTER_CONFIG='/etc/salt/master' + COMPREPLY=($(compgen -W "`awk -F ':' 'BEGIN {print_line = 0}; /^nodegroups/ {print_line = 1;getline } print_line && /^ */ {print $1} /^[^ ]/ {print_line = 0}' <${MASTER_CONFIG}`" -- ${cur})) + return 0 + ;; + esac + + _salt_coms=$(_salt_get_coms remote) + + # If there are still dots in the suggestion, do not append space + grep "^${cur}.*\." "${_salt_coms}" &>/dev/null && compopt -o nospace + + all="${opts} ${_salt_coms}" + COMPREPLY=( $(compgen -W "${all}" -- ${cur}) ) + + return 0 +} + +complete -F _salt salt + + +_saltkey(){ + local cur prev opts prev pprev + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + opts="-c --config-dir= -h --help --version --versions-report -q --quiet \ + -y --yes --gen-keys= --gen-keys-dir= --keysize= --key-logfile= \ + -l --list= -L --list-all -a --accept= -A --accept-all \ + -r --reject= -R --reject-all -p --print= -P --print-all \ + -d --delete= -D --delete-all -f --finger= -F --finger-all \ + --out=pprint --out=yaml --out=overstatestage --out=json --out=raw \ + --out=highstate --out=key --out=txt --no-color --out-indent= " + if [ ${COMP_CWORD} -gt 2 ]; then + pprev="${COMP_WORDS[COMP_CWORD-2]}" + fi + if [ ${COMP_CWORD} -gt 3 ]; then + ppprev="${COMP_WORDS[COMP_CWORD-3]}" + fi + if [[ "${cur}" == -* ]] ; then + COMPREPLY=($(compgen -W "${opts}" -- ${cur})) + return 0 + fi + + if [ "${cur}" = "=" ] && [[ "${prev}" == --* ]]; then + cur="" + fi + if [ "${prev}" = "=" ] && [[ "${pprev}" == --* ]]; then + prev="${pprev}" + fi + + case "${prev}" in + -a|--accept) + COMPREPLY=($(compgen -W "$(_salt_get_keys un rej)" -- ${cur})) + return 0 + ;; + -r|--reject) + COMPREPLY=($(compgen -W "$(_salt_get_keys acc)" -- ${cur})) + return 0 + ;; + -d|--delete) + COMPREPLY=($(compgen -W "$(_salt_get_keys acc un rej)" -- ${cur})) + return 0 + ;; + -c|--config) + COMPREPLY=($(compgen -f -- ${cur})) + return 0 + ;; + --keysize) + COMPREPLY=($(compgen -W "2048 3072 4096 5120 6144" -- ${cur})) + return 0 + ;; + --gen-keys) + return 0 + ;; + --gen-keys-dir) + COMPREPLY=($(compgen -d -- ${cur})) + return 0 + ;; + -p|--print) + COMPREPLY=($(compgen -W "$(_salt_get_keys acc un rej)" -- ${cur})) + return 0 + ;; + -l|--list) + COMPREPLY=($(compgen -W "pre un acc accepted unaccepted rej rejected all" -- ${cur})) + return 0 + ;; + --accept-all) + return 0 + ;; + esac + COMPREPLY=($(compgen -W "${opts} " -- ${cur})) + return 0 +} + +complete -F _saltkey salt-key + +_saltcall(){ + local cur prev opts _salt_coms pprev ppprev + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + opts="-h --help -d --doc --documentation --version --versions-report \ + -m --module-dirs= -g --grains --return= --local -c --config-dir= -l --log-level= \ + --out=pprint --out=yaml --out=overstatestage --out=json --out=raw \ + --out=highstate --out=key --out=txt --no-color --out-indent= " + if [ ${COMP_CWORD} -gt 2 ]; then + pprev="${COMP_WORDS[COMP_CWORD-2]}" + fi + if [ ${COMP_CWORD} -gt 3 ]; then + ppprev="${COMP_WORDS[COMP_CWORD-3]}" + fi + if [[ "${cur}" == -* ]] ; then + COMPREPLY=($(compgen -W "${opts}" -- ${cur})) + return 0 + fi + + if [ "${cur}" = "=" ] && [[ ${prev} == --* ]]; then + cur="" + fi + if [ "${prev}" = "=" ] && [[ ${pprev} == --* ]]; then + prev="${pprev}" + fi + + case ${prev} in + -m|--module-dirs) + COMPREPLY=( $(compgen -d ${cur} )) + return 0 + ;; + -l|--log-level) + COMPREPLY=( $(compgen -W "info none garbage trace warning error debug" -- ${cur})) + return 0 + ;; + -g|grains) + return 0 + ;; + salt-call) + COMPREPLY=($(compgen -W "${opts}" -- ${cur})) + return 0 + ;; + esac + + _salt_coms=$(_salt_get_coms local) + + # If there are still dots in the suggestion, do not append space + grep "^${cur}.*\." "${_salt_coms}" &>/dev/null && compopt -o nospace + + COMPREPLY=( $(compgen -W "${opts} ${_salt_coms}" -- ${cur} )) + return 0 +} + +complete -F _saltcall salt-call + + +_saltcp(){ + local cur prev opts target prefpart postpart helper filt pprev ppprev + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + opts="-t --timeout= -s --static -b --batch= --batch-size= \ + -h --help --version --versions-report -c --config-dir= \ + -E --pcre -L --list -G --grain --grain-pcre -N --nodegroup \ + -R --range -C --compound -I --pillar \ + --out=pprint --out=yaml --out=overstatestage --out=json --out=raw \ + --out=highstate --out=key --out=txt --no-color --out-indent= " + if [[ "${cur}" == -* ]] ; then + COMPREPLY=($(compgen -W "${opts}" -- ${cur})) + return 0 + fi + + if [ "${cur}" = "=" ] && [[ "${prev}" == --* ]]; then + cur="" + fi + if [ "${prev}" = "=" ] && [[ "${pprev}" == --* ]]; then + prev=${pprev} + fi + + case ${prev} in + salt-cp) + COMPREPLY=($(compgen -W "${opts} $(_salt_get_keys acc)" -- ${cur})) + return 0 + ;; + -t|--timeout) + # those numbers are just a hint + COMPREPLY=($(compgen -W "2 3 4 8 10 15 20 25 30 40 60 90 120 180 240 300" -- ${cur} )) + return 0 + ;; + -E|--pcre) + COMPREPLY=($(compgen -W "$(_salt_get_keys acc)" -- ${cur})) + return 0 + ;; + -L|--list) + # IMPROVEMENTS ARE WELCOME + prefpart="${cur%,*}," + postpart=${cur##*,} + filt="^\($(echo ${cur}| sed 's:,:\\|:g')\)$" + helper=($(_salt_get_keys acc | grep -v "${filt}" | sed "s/^/${prefpart}/")) + COMPREPLY=($(compgen -W "${helper[*]}" -- ${cur})) + return 0 + ;; + -G|--grain|--grain-pcre) + COMPREPLY=($(compgen -W "$(_salt_get_grains)" -- ${cur})) + return 0 + ;; + # FIXME + -R|--range) + # FIXME ?? + return 0 + ;; + -C|--compound) + # FIXME ?? + return 0 + ;; + -c|--config) + COMPREPLY=($(compgen -f -- ${cur})) + return 0 + ;; + esac + + # default is using opts: + COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) +} + +complete -F _saltcp salt-cp diff --git a/SOURCES/salt.fish b/SOURCES/salt.fish new file mode 100644 index 0000000..035f587 --- /dev/null +++ b/SOURCES/salt.fish @@ -0,0 +1,38 @@ +# salt completion for fish shell +# See salt_common.fish in the same folder for the information + +# hack to load functions from salt_common completion +complete --do-complete='salt_common --' >/dev/null + +# salt general options (from --help) +for auth in auth eauth external-auth + complete -c salt -f -s a -l $auth -d "Specify an external authentication system to use." +end +for batch in batch batch-size + complete -c salt -f -s b -l $batch -d "Execute the salt job in batch mode, pass either the number of minions to batch at a time, or the percentage of minions to have runnin" +end +complete -c salt -x -l args-separator -d "Set the special argument used as a delimiter between command arguments of compound commands. This is useful when one wants to pass commas as arguments to some of the commands in a compound command." +complete -c salt -f -l async -d "Run the salt command but don't wait for a reply" +complete -c salt -f -s C -l compound -d "The compound target option allows for multiple target types to be evaluated, allowing for greater granularity in target matching. The compound target is space delimited, targets other than globs are preceded with an identifier matching the specific targets argument type: salt \"G@os:RedHat and webser* or E@database.*\"" +complete -c salt -f -s S -l ipcidr -d "Match based on Subnet (CIDR notation) or IPv4 address." +complete -c salt -f -s T -l make-token -d "Generate and save an authentication token for re-use. The token is generated and made available for the period defined in the Salt Master." +complete -c salt -x -l password -d "Password for external authentication" +complete -c salt -f -s I -l pillar -d "Instead of using shell globs to evaluate the target use a pillar value to identify targets, the syntax for the target is the pillar key followed by a globexpression: \"role:production*\"" +complete -c salt -f -l show-timeout -d "Display minions that timeout without the additional output of --verbose" +complete -c salt -f -l show-jid -d "Display jid without the additional output of --verbose" +complete -c salt -x -l state-output -d "Override the configured state_output value for minion output. Default: full" +complete -c salt -f -s s -l static -d "Return the data from minions as a group after they all return." +complete -c salt -x -l subset -d "Execute the routine on a random subset of the targeted minions. The minions will be verified that they have the named function before executing" +complete -c salt -f -l summary -d "Display summary information about a salt command" +complete -c salt -x -l username -d "Username for external authentication" +complete -c salt -f -s v -l verbose -d "Turn on command verbosity, display jid and active job queries" + +# salt arguments +# minions +complete -c salt -f -n 'not __fish_salt_extract_minion' -a '(__fish_salt_list_minion accepted)' -d 'Minion' +# functions +complete -c salt -f -n '__fish_salt_extract_minion; and not __fish_salt_extract_function' -a '(__fish_salt_list_function)' -d 'Function' +# arguments names +complete -c salt -f -n '__fish_salt_extract_function' -a '(__fish_salt_list_arg_name)' -d 'Argument' +# arguments values +complete -c salt -f -n '__fish_salt_extract_function' -a '(__fish_salt_list_arg_value | __fish_salt_prefix_with_arg_name)' diff --git a/SOURCES/salt.sysusers b/SOURCES/salt.sysusers new file mode 100644 index 0000000..20eec3c --- /dev/null +++ b/SOURCES/salt.sysusers @@ -0,0 +1,3 @@ +#Type Name ID GECOS Home directory Shell +u salt - "Salt" /etc/salt /bin/bash +g salt - diff --git a/SOURCES/salt_common.fish b/SOURCES/salt_common.fish new file mode 100644 index 0000000..80d5da7 --- /dev/null +++ b/SOURCES/salt_common.fish @@ -0,0 +1,439 @@ +# salt-call completion for fish shell +# This file contains common options and helper functions. + +# README: +# Completion lines are structured as a table to make it easier edit them with +# vim or similar editors. Long lines (that are longer than the completion line +# until "-d 'help message'") are splitted. Descriptions are not splitted. +# TAB width is set to 4 chars! +# Completion lines are sorted by groups, in groups they are sorted by long +# option name (by alphabet). +# If you want to add some completions for arguments value you probably want to +# add line into __fish_salt_args_types variable. First column is the name of +# argument (_ is for unnamed arguments), second is the name of the function, +# last one is the type of the completion (you can use any types that have +# corresponding function __fish_salt_list_TYPE). +# +# VERSION: +# Generated from the help of salt programs on commit ad89a752f807d5ea00d3a9b3257d283ef6b69c10 +# +# ISSUES: +# TODO: #1 add: salt-api salt-cloud salt-ssh +# TODO: #2 write tests (use https://github.com/terlar/fish-tank) +# TODO: #3 add completion for builtin states +# TODO: #4 use caching (see https://github.com/saltstack/salt/issues/15321) +# TODO: #5 add help to the positional arguments (like '(Minion)', '(Grain)') +# using __fish_salt_list function everythere) +# TODO: #6 add minion selection by grains (call "salt '*' grains.ls", use #4) +# BUG: #7 salt-call autocompletion and salt packages not works; it hangs. Ask +# fish devs? +# TODO: #8 sort with `sort` or leave as is? + +# common general options (from --help) +set -l salt_programs \ +salt salt-call salt-cp salt-key salt-master salt-minion \ +salt-run salt-syndic +for program in $salt_programs + complete -c $program -f -l version -d "show program's version number and exit" + complete -c $program -f -l versions-report -d "show program's dependencies version number and exit" + complete -c $program -f -s h -l help -d "show help message and exit" + complete -c $program -r -s c -l config-dir -d "Pass in an alternative configuration directory. Default: /etc/salt" + # BUG: (log file is different for different programs) + complete -c $program -r -l log-file -d "Log file path. Default: /var/log/salt/master." + complete -c $program -x -l log-file-level -d "Logfile logging log level. Default: \"warning\"." -a "all garbage trace debug info warning error critical quiet" + complete -c $program -x -s l -l log-level -d "logging log level. Default: \"warning\"." -a "all garbage trace debug info warning error critical quiet" +end +set -l salt_programs_crash salt salt-call salt-cp \ + salt-key salt-run +for program in $salt_programs_crash + complete -c $program -f -l hard-crash -d "Raise any original exception rather than exiting gracefully. Default: False" +end +set -l salt_programs_output_color salt salt-call \ + salt-key salt-run +for program in $salt_programs_output_color + for color in color colour + complete -c $program -f -l force-$color -d "Force colored output" + complete -c $program -f -l no-$color -d "Disable all colored output" + end +end +set -l salt_programs_output salt salt-call salt-key +for program in $salt_programs_output + for out in out output + complete -c $program -x -l $out -d "Print the output from the \"$program\" command using the specified outputter" -a "raw compact no_return grains overstatestage pprint json nested yaml highstate quiet key txt virt_query newline_values_only" + complete -c $program -r -l $out-file -d "Write the output to the specified file" + complete -c $program -x -l $out-file-append -d "Append the output to the specified file" + complete -c $program -x -l $out-indent -d "Print the output indented by the provided value in spaces. Negative values disables indentation. Only applicable in outputters that support indentation." + end +end +set -l salt_programs_doc salt salt-call salt-run +for program in $salt_programs_doc + for doc in doc documentation + complete -c $program -f -s d -l $doc -d "Display documentation for runners, pass a runner or runner.function to see documentation on only that runner or function." + end +end +set -l salt_programs_select salt salt-cp +for program in $salt_programs_select + complete -c $program -f -s G -l grain -d "Instead of using shell globs to evaluate the target use a grain value to identify targets, the syntax for the target is the grain key followed by a globexpression: \"os:Arch*\"" + complete -c $program -f -l grain-pcre -d "Instead of using shell globs to evaluate the target use a grain value to identify targets, the syntax for the target is the grain key followed by a pcre regular expression: \"os:Arch.*\"" + complete -c $program -f -s L -l list -d "Instead of using shell globs to evaluate the target servers, take a comma or whitespace delimited list of servers." + complete -c $program -f -s N -l nodegroup -d "Instead of using shell globs to evaluate the target use one of the predefined nodegroups to identify a list of targets." + complete -c $program -f -s E -l pcre -d "Instead of using shell globs to evaluate the target servers, use pcre regular expressions" + complete -c $program -f -s R -l range -d "Instead of using shell globs to evaluate the target use a range expression to identify targets. Range expressions look like %cluster" +end +set -l salt_programs_user_daemon_pidfile \ +salt-master salt-minion salt-syndic +for program in $salt_programs_user_daemon_pidfile + complete -c $program -x -s u -l user -d "Specify user to run $program" + complete -c $program -f -s d -l daemon -d "Run the $program as a daemon" + complete -c $program -l pid-file -d "Specify the location of the pidfile. Default: /var/run/$program.pid." +end +function __fish_salt_default_timeout + echo (echo $argv[1] | sed ' + s/^salt$/5/g; + s/^salt-call$/60/g; + s/^salt-cp$/5/g; + s/^salt-run$/1/g + ') +end +set -l salt_programs_timeout salt salt-call salt-cp \ + salt-run +for program in $salt_programs_timeout + complete -c $program -x -s t -l timeout -d "Change the timeout, if applicable, for the running command; default="(__fish_salt_default_timeout $program) +end +set -l salt_programs_return salt salt-cp +for program in $salt_programs_return + complete -c $program -x -l return -d "Set an alternative return method. By default salt will send the return data from the command back to the master, but the return data can be redirected into any number of systems, databases or applications." +end + +# convinience functions +function __fish_salt_log + echo $argv >&2 +end + +function __fish_salt_join + # remove empty elements + set a (echo $argv[2..-1] | sed 's/ /\n/g' | grep -Ev '^$') + set delimiter $argv[1] + printf "$delimiter%s" $a | cut -c 2- +end + +function __fish_salt_clean_prefix + set prefix '^'$argv[1] + grep -E $prefix | sed "s/$prefix//g" +end + +function __fish_salt_clean + if [ $argv[1] = yaml ] + __fish_salt_clean_prefix ' *- ' + else if [ $argv[1] = nested ] + __fish_salt_clean_prefix ' *' + end +end + +set -g __fish_salt_max_line_count_in_yaml_block 1024 + +function __fish_salt_lines_between + set max $__fish_salt_max_line_count_in_yaml_block + grep -A$max $argv[1] | grep -B$max $argv[2] +end + +function __fish_salt_extract_first_yaml_block + set max $__fish_salt_max_line_count_in_yaml_block + sed '1d' | sed '$a\ stop' | grep -m 1 -B$max '^ \w' | sed '$d' +end + +function __fish_salt_add_help + sed "s/\$/\t$argv/" +end + +function __fish_salt_underscore_to_space + sed 's/^\w/\u&/g; s/_/ /g' +end + +# information extraction from commandline + +set -g __fish_salt_default_program 'salt' + +# BUG: Completion doesn't work with correct commandline like +# salt --out raw server test.ping +# Consider rewriting using __fish_complete_subcommand +function __fish_salt_program + if status --is-interactive + set result (commandline -pco) + if test -n "$result" + if [ $result[1] = 'salt-call' ]; and contains -- '--local' $result + set options '--local' + end + set result $result[1] $options + end + end + set result $__fish_salt_default_program + echo $result +end + +function __fish_salt_save_first_commandline_token_not_matching_args_to + if status --is-interactive + set -l cli (commandline -pco) + for i in $cli + if echo "$i" | grep -Ev (__fish_salt_join '|' $argv) + set -g $argv[1] $i + return 0 + end + end + end + return 1 +end + +function __fish_salt_commandline_tokens_not_matching_args + if status --is-interactive + set tokens (commandline -pco) + set result 1 + for token in $tokens + if echo "$token" | grep -Ev (__fish_salt_join '|' $argv) + set result 0 + end + end + end + return $result +end + +set __fish_salt_base_ignores (__fish_salt_join '|' $salt_programs '^-.*') + +function __fish_salt_ignores_minion + echo $__fish_salt_base_ignores +end + +function __fish_salt_extract_minion + __fish_salt_save_first_commandline_token_not_matching_args_to __fish_salt_extracted_minion (__fish_salt_ignores_minion) +end + +function __fish_salt_minion + __fish_salt_extract_minion > /dev/null + echo $__fish_salt_extracted_minion +end + +function __fish_salt_ignores_function + __fish_salt_join '|' $__fish_salt_base_ignores (__fish_salt_minion) +end + +function __fish_salt_extract_function + __fish_salt_save_first_commandline_token_not_matching_args_to __fish_salt_extracted_function (__fish_salt_ignores_function) +end + +function __fish_salt_function + __fish_salt_extract_function > /dev/null + echo $__fish_salt_extracted_function +end + +function __fish_salt_ignores_args + __fish_salt_join '|' (__fish_salt_ignores_function) (__fish_salt_function) +end + +function __fish_salt_args + __fish_salt_commandline_tokens_not_matching_args (__fish_salt_ignores_args) +end + +set __fish_salt_arg_name_re '\w*=' + +function __fish_salt_arg_name + set result (commandline -ct | grep -E --only-matching $__fish_salt_arg_name_re) + if test -z $result + set result '_=' + end + echo $result | sed 's/=$//g' +end + +function __fish_salt_arg_value + commandline -ct | sed "s/$__fish_salt_arg_name_re//g" +end + +function __fish_salt_arg_value_by_name + set arg_name "$argv=" + __fish_salt_args | __fish_salt_clean_prefix $arg_name +end + +# getting info from salt +set -g __fish_salt_format_options --no-color --log-level=quiet + +function __fish_salt_exec + set -l program (__fish_salt_program) + set -l exe $program $__fish_salt_format_options $__fish_salt_format_options_temp + if [ $program = salt ] + set exe $exe (__fish_salt_minion) + end + eval $exe $argv +end + +function __fish_salt_exec_output + set -g __fish_salt_format_options_temp "--output=$argv[1]" + __fish_salt_exec $argv[2..-1] + set -e __fish_salt_format_options_temp +end + +function __fish_salt_exec_and_clean + __fish_salt_exec_output $argv | __fish_salt_clean $argv[1] +end + +function __fish_salt_list + begin + for arg_type in $argv + set f_list '__fish_salt_list_'$arg_type + eval $f_list | __fish_salt_add_help (echo $arg_type | __fish_salt_underscore_to_space) + end + end +end + +set -g __fish_salt_args_types ' +_ cmd.retcode : minion_cmd +cmd cmd.retcode : minion_cmd +shell cmd.retcode : minion_file +_ cmd.run : minion_cmd +cmd cmd.run : minion_cmd +shell cmd.run : minion_file +_ cmd.run_all : minion_cmd +cmd cmd.run_all : minion_cmd +shell cmd.run_all : minion_file +_ cmd.run_stderr : minion_cmd +cmd cmd.run_stderr : minion_cmd +shell cmd.run_stderr : minion_file +_ cmd.run_stdout : minion_cmd +cmd cmd.run_stdout : minion_cmd +shell cmd.run_stdout : minion_file +shell cmd.script : minion_file +shell cmd.script_retcode : minion_file +_ cmd.which : minion_cmd +cmd cmd.which : minion_cmd +_ cp.get_dir : master_file +_ cp.get_dir : minion_file +path cp.get_dir : master_file +dest cp.get_dir : minion_file +_ cp.get_file : master_file +_ cp.get_file : minion_file +path cp.get_file : master_file +dest cp.get_file : minion_file +_ file.copy : minion_file +src file.copy : minion_file +dst file.copy : minion_file +_ grains.append : grain +key grains.append : grain +_ grains.delval : grain +key grains.delval : grain +_ grains.get : grain +key grains.get : grain +_ grains.get_or_set_hash : grain +name grains.get_or_set_hash : grain +_ grains.has_value : grain +key grains.has_value : grain +_ grains.item : grain +_ grains.items : grain +_ grains.remove : grain +key grains.remove : grain +_ grains.setval : grain +key grains.setval : grain +exclude state.highstate : state +_ state.sls : state +_ state.show_sls : state +_ state.sls : state +exclude state.sls : state +_ sys.argspec : function +_ sys.argspec : module +module sys.argspec : module +_ sys.doc : function +_ sys.doc : module +' +#_ pkg.remove : package + +function __fish_salt_argspec_function + set function_line '^\s*'$argv[1]: + set max $__fish_salt_max_line_count_in_yaml_block + grep -A$max $function_line | __fish_salt_extract_first_yaml_block +end + +function __fish_salt_argspec_args + __fish_salt_lines_between '^\s*args:' '^\s*defaults:' | grep -v ':' +end + +function __fish_salt_list_arg_name + __fish_salt_exec_output yaml sys.argspec (__fish_salt_function) | __fish_salt_argspec_function (__fish_salt_function) | __fish_salt_argspec_args | __fish_salt_clean yaml | sed 's/$/=/g' +end + +function __fish_salt_list_arg_value + set arg_path_re (__fish_salt_arg_name)'\s*'(__fish_salt_function)'\s*:\s*' + set arg_types (echo $__fish_salt_args_types | __fish_salt_clean_prefix $arg_path_re) + __fish_salt_list $arg_types +end + +function __fish_salt_list_function + __fish_salt_exec_and_clean yaml sys.list_functions $argv +end + +function __fish_salt_list_grain + __fish_salt_exec_and_clean yaml grains.ls $argv +end + +function __fish_salt_list_master_file_abs + __fish_salt_exec_and_clean yaml cp.list_master +end + +function __fish_salt_list_master_file + __fish_salt_list_master_file_abs | sed 's/^/salt:\/\//g' +end + +function __fish_salt_list_minion + salt-key --no-color --list=$argv[1] | grep -Ev '^(Accepted|Unaccepted|Rejected) Keys:$' +end + +function __fish_salt_list_minion_cmd + set cmd (__fish_salt_arg_value | sed 's/^[\'"]//') + set complete_cmd_exe '"complete --do-complete=\''$cmd'\'"' + set cmd_without_last_word (echo $cmd | sed -E 's/\S*$//') + # BUG: Static paths. Do we need to use which? + set bash_shell '/bin/bash' + set fish_shell '/usr/bin/fish' + set sh_shell '/bin/sh' + set zsh_shell '/usr/bin/zsh' + set shell (__fish_salt_arg_value_by_name shell); and test -z $shell; and set shell $sh_shell + switch $shell + case $fish_shell + __fish_salt_exec_and_clean nested cmd.run shell=$fish_shell cmd=$complete_cmd_exe | awk -v prefix="$cmd_without_last_word" '{print prefix $0}' + case $bash_shell $zsh_shell + # Not implemented; See + # https://github.com/fish-shell/fish-shell/issues/1679#issuecomment-55487388 + case $sh_shell + # sh doesn't have completions + end +end + +function __fish_salt_list_minion_file + if [ (count $argv) -eq 0 ] + set file (__fish_salt_arg_value) + else + set file $argv[1] + end + set exe '"ls --directory --file-type '$file'* 2> /dev/null"' + __fish_salt_exec_output nested cmd.run $exe | __fish_salt_clean nested +end + +function __fish_salt_list_module + __fish_salt_exec_and_clean yaml sys.list_modules $argv +end + +function __fish_salt_list_package + __fish_salt_exec_and_clean yaml pkg.list_pkgs $argv | sed 's/:.*//g' +end + +function __fish_salt_list_state + __fish_salt_list_master_file_abs | grep '.sls' | sed 's/\//./g;s/\.init\.sls/.sls/g;s/\.sls//g' +end + +function __fish_salt_prefix_with_arg_name + set arg_name (__fish_salt_arg_name) + if [ $arg_name != '_' ] + sed "p;s/^/$arg_name=/g" + else + # leave stdout as is; don't remove this line, because if construction + # clears stdout if condition fails + tee + end +end + diff --git a/SPECS/salt.spec b/SPECS/salt.spec new file mode 100644 index 0000000..064c39a --- /dev/null +++ b/SPECS/salt.spec @@ -0,0 +1,955 @@ +## For Python 3 only + +# Release Candidate +%global __rc_ver %{nil} + +%global fish_dir %{_datadir}/fish/vendor_functions.d +%global zsh_dir %{_datadir}/zsh/site-functions + +# py3_shbang_flags is '-s' and causing issues with pip install. +%global py3_shebang_flags %(echo %py3_shebang_flags | sed s/s//) + +Name: salt +Version: 3006.8 +Release: 1%{?dist} +Summary: A parallel remote execution system +Group: System Environment/Daemons +License: Apache-2.0 +URL: https://saltproject.io/ +Source0: %{pypi_source} +Source1: %{name}-proxy@.service +Source2: %{name}-master +Source3: %{name}-syndic +Source4: %{name}-minion +Source5: %{name}-api +Source6: %{name}-master.service +Source7: %{name}-syndic.service +Source8: %{name}-minion.service +Source9: %{name}-api.service +Source10: README.fedora +Source11: %{name}-common.logrotate +Source12: %{name}.bash +Source13: %{name}.fish +Source14: %{name}_common.fish +Source15: %{name}-call.fish +Source16: %{name}-cp.fish +Source17: %{name}-key.fish +Source18: %{name}-master.fish +Source19: %{name}-minion.fish +Source20: %{name}-run.fish +Source21: %{name}-syndic.fish +Source22: %{name}.sysusers + +Patch0: contextvars.patch +Patch1: match_hostname.patch +BuildArch: noarch + +%ifarch %{ix86} x86_64 +Requires: dmidecode +%endif + +Requires: pciutils +Requires: which +Requires: dnf-utils +Requires: logrotate +Requires: python3-tornado + +BuildRequires: systemd-rpm-macros +BuildRequires: python3-devel +%{?sysusers_requires_compat} + +%description +Salt is a distributed remote execution system used to execute commands and +query data. It was developed in order to bring the best solutions found in +the world of remote execution together and make them better, faster and more +malleable. Salt accomplishes this via its ability to handle larger loads of +information, and not just dozens, but hundreds or even thousands of individual +servers, handle them quickly and through a simple and manageable interface. + + +%package master +Summary: Management component for salt, a parallel remote execution system +Group: System Environment/Daemons +Requires: %{name} = %{version}-%{release} +Requires: python3-systemd + +%description master +The Salt master is the central server to which all minions connect. +Supports Python 3. + + +%package minion +Summary: Client component for Salt, a parallel remote execution system +Group: System Environment/Daemons +Requires: %{name} = %{version}-%{release} + +%description minion +The Salt minion is the agent component of Salt. It listens for instructions +from the master, runs jobs, and returns results back to the master. +Supports Python 3. + + +%package syndic +Summary: Master-of-master component for Salt, a parallel remote execution system +Group: System Environment/Daemons +Requires: %{name}-master = %{version}-%{release} + +%description syndic +The Salt syndic is a master daemon which can receive instruction from a +higher-level master, allowing for tiered organization of your Salt +infrastructure. +Supports Python 3. + + +%package api +Summary: REST API for Salt, a parallel remote execution system +Group: Applications/System +Requires: %{name}-master = %{version}-%{release} +Requires: python3-cherrypy >= 3.2.2 + +%description api +salt-api provides a REST interface to the Salt master. +Supports Python 3. + + +%package cloud +Summary: Cloud provisioner for Salt, a parallel remote execution system +Group: Applications/System +Requires: %{name}-master = %{version}-%{release} +Requires: python3-libcloud + +%description cloud +The salt-cloud tool provisions new cloud VMs, installs salt-minion on them, and +adds them to the master's collection of controllable minions. +Supports Python 3. + + +%package ssh +Summary: Agentless SSH-based version of Salt, a parallel remote execution system +Group: Applications/System +Requires: %{name} = %{version}-%{release} + +%description ssh +The salt-ssh tool can run remote execution functions and states without the use +of an agent (salt-minion) service. +Supports Python 3. + + +%prep +%autosetup -p1 +%generate_buildrequires +%pyproject_buildrequires + + +%build +%pyproject_wheel + + +%install +%pyproject_install +%pyproject_save_files salt + +# Add some directories +install -d -m 0755 %{buildroot}%{_var}/log/%{name} +touch %{buildroot}%{_var}/log/%{name}/minion +touch %{buildroot}%{_var}/log/%{name}/master +install -d -m 0755 %{buildroot}%{_var}/cache/%{name} +install -d -m 0755 %{buildroot}%{_sysconfdir}/%{name} +install -d -m 0755 %{buildroot}%{_sysconfdir}/%{name}/master.d +install -d -m 0755 %{buildroot}%{_sysconfdir}/%{name}/minion.d +install -d -m 0755 %{buildroot}%{_sysconfdir}/%{name}/pki +install -d -m 0755 %{buildroot}%{_sysconfdir}/%{name}/pki/master +install -d -m 0755 %{buildroot}%{_sysconfdir}/%{name}/pki/minion +install -d -m 0700 %{buildroot}%{_sysconfdir}/%{name}/cloud.conf.d +install -d -m 0700 %{buildroot}%{_sysconfdir}/%{name}/cloud.deploy.d +install -d -m 0700 %{buildroot}%{_sysconfdir}/%{name}/cloud.maps.d +install -d -m 0700 %{buildroot}%{_sysconfdir}/%{name}/cloud.profiles.d +install -d -m 0700 %{buildroot}%{_sysconfdir}/%{name}/cloud.providers.d +install -d -m 0755 %{buildroot}%{_sysconfdir}/%{name}/proxy.d + +# Add the config files +install -p -m 0640 conf/minion %{buildroot}%{_sysconfdir}/%{name}/minion +install -p -m 0640 conf/master %{buildroot}%{_sysconfdir}/%{name}/master +# Use salt user on nre master installations +sed -i 's/#user: root/user: salt/g' %{buildroot}%{_sysconfdir}/%{name}/master +install -p -m 0600 conf/cloud %{buildroot}%{_sysconfdir}/%{name}/cloud +install -p -m 0640 conf/roster %{buildroot}%{_sysconfdir}/%{name}/roster +install -p -m 0640 conf/proxy %{buildroot}%{_sysconfdir}/%{name}/proxy + +# Add the unit files +mkdir -p %{buildroot}%{_unitdir} +install -p -m 0644 %{SOURCE6} %{buildroot}%{_unitdir}/ +install -p -m 0644 %{SOURCE7} %{buildroot}%{_unitdir}/ +install -p -m 0644 %{SOURCE8} %{buildroot}%{_unitdir}/ +install -p -m 0644 %{SOURCE9} %{buildroot}%{_unitdir}/ +install -p -m 0644 %{SOURCE1} %{buildroot}%{_unitdir}/ + +# Logrotate +install -p %{SOURCE10} . +mkdir -p %{buildroot}%{_sysconfdir}/logrotate.d/ +install -p -m 0644 %{SOURCE11} %{buildroot}%{_sysconfdir}/logrotate.d/%{name} + +# Bash completion +mkdir -p %{buildroot}%{_sysconfdir}/bash_completion.d/ +install -p -m 0644 %{SOURCE12} %{buildroot}%{_sysconfdir}/bash_completion.d/%{name}.bash + +# Fish completion (TBD remove -v) +mkdir -p %{buildroot}%{fish_dir} +install -p -m 0644 %{SOURCE13} %{buildroot}%{fish_dir}/%{name}.fish +install -p -m 0644 %{SOURCE14} %{buildroot}%{fish_dir}/%{name}_common.fish +install -p -m 0644 %{SOURCE15} %{buildroot}%{fish_dir}/%{name}-call.fish +install -p -m 0644 %{SOURCE16} %{buildroot}%{fish_dir}/%{name}-cp.fish +install -p -m 0644 %{SOURCE17} %{buildroot}%{fish_dir}/%{name}-key.fish +install -p -m 0644 %{SOURCE18} %{buildroot}%{fish_dir}/%{name}-master.fish +install -p -m 0644 %{SOURCE19} %{buildroot}%{fish_dir}/%{name}-minion.fish +install -p -m 0644 %{SOURCE20} %{buildroot}%{fish_dir}/%{name}-run.fish +install -p -m 0644 %{SOURCE21} %{buildroot}%{fish_dir}/%{name}-syndic.fish + +# ZSH completion +mkdir -p %{buildroot}%{zsh_dir} +install -p -m 0644 pkg/common/%{name}.zsh %{buildroot}%{zsh_dir}/_%{name} + +# Salt user and group +install -p -D -m 0644 %{SOURCE22} %{buildroot}%{_sysusersdir}/salt.conf +mkdir -p %{buildroot}%{_sysconfdir}/%{name}/gpgkeys + +%check +%pyproject_check_import -t + + +%files -f %{pyproject_files} +%license LICENSE +%doc README.fedora +%config(noreplace) %{_sysconfdir}/logrotate.d/%{name} +%config(noreplace) %{_sysconfdir}/bash_completion.d/%{name}.bash +%dir %{_var}/cache/%{name}/ +%{_var}/log/%{name} +%{_bindir}/spm +%doc %{_mandir}/man1/spm.1* +%dir %{zsh_dir} +%dir %{_sysconfdir}/%{name}/ +%dir %{_sysconfdir}/%{name}/pki/ +%{fish_dir}/%{name}*.fish +%{zsh_dir}/_%{name} +%{_bindir}/salt-pip + +%files master +%doc %{_mandir}/man7/%{name}.7* +%doc %{_mandir}/man1/%{name}.1* +%doc %{_mandir}/man1/%{name}-cp.1* +%doc %{_mandir}/man1/%{name}-key.1* +%doc %{_mandir}/man1/%{name}-master.1* +%doc %{_mandir}/man1/%{name}-run.1* +%{_bindir}/%{name} +%{_bindir}/%{name}-cp +%{_bindir}/%{name}-key +%{_bindir}/%{name}-master +%{_bindir}/%{name}-run +%{_unitdir}/%{name}-master.service +%{_sysusersdir}/salt.conf +%config(noreplace) %attr(0750, salt, salt) %{_sysconfdir}/%{name}/master +%config(noreplace) %attr(0750, salt, salt) %{_sysconfdir}/%{name}/master.d +%config(noreplace) %attr(0750, salt, salt) %{_sysconfdir}/%{name}/pki/master +%config(noreplace) %attr(0750, salt, salt) %{_sysconfdir}/%{name}/gpgkeys + +%files minion +%doc %{_mandir}/man1/%{name}-call.1* +%doc %{_mandir}/man1/%{name}-minion.1* +%doc %{_mandir}/man1/%{name}-proxy.1* +%{_bindir}/%{name}-minion +%{_bindir}/%{name}-call +%{_bindir}/%{name}-proxy +%{_unitdir}/%{name}-minion.service +%{_unitdir}/%{name}-proxy@.service +%config(noreplace) %{_sysconfdir}/%{name}/minion +%config(noreplace) %{_sysconfdir}/%{name}/proxy +%config(noreplace) %{_sysconfdir}/%{name}/minion.d +%config(noreplace) %{_sysconfdir}/%{name}/pki/minion + +%files syndic +%doc %{_mandir}/man1/%{name}-syndic.1* +%{_bindir}/%{name}-syndic +%{_unitdir}/%{name}-syndic.service + +%files api +%doc %{_mandir}/man1/%{name}-api.1* +%{_bindir}/%{name}-api +%{_unitdir}/%{name}-api.service + +%files cloud +%doc %{_mandir}/man1/%{name}-cloud.1* +%{_bindir}/%{name}-cloud +%{_sysconfdir}/%{name}/cloud.conf.d +%{_sysconfdir}/%{name}/cloud.deploy.d +%{_sysconfdir}/%{name}/cloud.maps.d +%{_sysconfdir}/%{name}/cloud.profiles.d +%{_sysconfdir}/%{name}/cloud.providers.d +%config(noreplace) %{_sysconfdir}/%{name}/cloud + +%files ssh +%doc %{_mandir}/man1/%{name}-ssh.1* +%{_bindir}/%{name}-ssh +%config(noreplace) %{_sysconfdir}/%{name}/roster + + +# assumes systemd for RHEL 7 & 8 +%preun master +%systemd_preun %{name}-syndic.service + +%preun minion +%systemd_preun %{name}-minion.service + +%preun api +%systemd_preun %{name}-api.service + +%pre master +%sysusers_create_compat %{SOURCE22} + +%post master +chown salt:salt %{_sysconfdir}/%{name}/gpgkeys -R +%systemd_post %{name}-master.service + +%post syndic +%systemd_post %{name}-syndic.service + +%post minion +%systemd_post %{name}-minion.service + +%post api +%systemd_post %{name}-api.service + +%postun master +%systemd_postun_with_restart %{name}-master.service + +%postun syndic +%systemd_postun_with_restart %{name}-syndic.service + +%postun minion +%systemd_postun_with_restart %{name}-minion.service + +%postun api +%systemd_postun_with_restart %{name}-api.service + + +%changelog +* Wed Sep 04 2024 MSVSphere Packaging Team - 3006.8-1 +- Rebuilt for MSVSphere 8.10 + +* Thu May 02 2024 Gwyn Ciesla - 3006.8-1 +- 3006.8 + +* Thu Feb 22 2024 Gwyn Ciesla - 3006.7-1 +- 3006.7 + +* Sat Jan 27 2024 Fedora Release Engineering - 3006.5-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + +* Thu Dec 14 2023 Gwyn Ciesla - 3006.5-1 +- 3006.5 + +* Mon Oct 30 2023 Gwyn Ciesla - 3006.4-1 +- 3006.4 + +* Wed Sep 20 2023 Gwyn Ciesla - 3006.3-2 +- Patch correction. + +* Mon Sep 11 2023 Gwyn Ciesla - 3006.3-1 +- 3006.3 + +* Fri Aug 11 2023 Gwyn Ciesla - 3006.2-1 +- 3006.2 + +* Mon Jul 24 2023 Salman Butt - 3006.1-6 +- SPDX license update. + +* Mon Jul 24 2023 Gwyn Ciesla - 3006.1-5 +- Patch for dnf5 support from upstream. +- Fix Python 3.12 issue. + +* Sat Jul 22 2023 Fedora Release Engineering - 3006.1-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + +* Wed Jun 28 2023 Python Maint - 3006.1-3 +- Rebuilt for Python 3.12 + +* Wed May 24 2023 Gwyn Ciesla - 3006.1-2 +- Add salt user for master per upstream. + +* Wed May 24 2023 Gwyn Ciesla - 3006.1-1 +- 3006.1 + +* Mon May 22 2023 Jonathan Steffan - 3005.1-4 +- Add patch for py3.10 support (RHBZ#2189782) + +* Sat Jan 21 2023 Fedora Release Engineering - 3005.1-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + +* Mon Oct 10 2022 Robby Callicotte - 3005.1-2 +- Removed macros from changelog + +* Tue Oct 04 2022 Salt Project Packaging - 3005.1-1 +- Update to feature release 3005.1-1 for Python 3 + +* Thu Aug 25 2022 Salt Project Packaging - 3005-1 +- Update to feature release 3005-1 for Python 3 + +* Thu Jul 28 2022 Robby Callicotte - 3004.2-3 +- Cleaned up specfile + +* Sat Jul 23 2022 Fedora Release Engineering - 3004.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + +* Tue Jun 21 2022 Salt Project Packaging - 3004.2-1 +- Update to CVE release 3004.2-1 for Python 3 + +* Mon Jun 13 2022 Python Maint - 3004.1-2 +- Rebuilt for Python 3.11 + +* Mon Mar 28 2022 Salt Project Packaging - 3004.1-1 +- Update to CVE release 3004.1-1 for Python 3 + +* Sat Jan 22 2022 Fedora Release Engineering - 3004-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + +* Tue Oct 19 2021 Salt Project Packaging - 3004-1 +- Update to feature release 3004-1 for Python 3 + +* Wed Sep 08 2021 SaltStack Packaging Team - 3003.3-1 +- Update to CVE release 3003.3-1 https://saltproject.io/security_announcements/salt-security-advisory-2021-sep-02/ + +* Thu Aug 12 2021 SaltStack Packaging Team - 3003.2-1 +- Update to bugfix release 3003.2-1 for Python 3 + +* Fri Jul 23 2021 Fedora Release Engineering - 3003.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + +* Thu Jul 01 2021 SaltStack Packaging Team - 3003.1-1 +- Update to bugfix release 3003.1-1 for Python 3 + +* Fri Jun 04 2021 Python Maint - 3003-2 +- Rebuilt for Python 3.10 + +* Mon Apr 26 2021 SaltStack Packaging Team - 3003-1 +- Update to feature release 3003-1 for Python 3 + +* Fri Mar 26 2021 SaltStack Packaging Team - 3002.6-1 +- Update to bugfix release 3002.6-1 for Python 3 + +* Tue Mar 02 2021 Zbigniew Jędrzejewski-Szmek - 3002.5-2 +- Rebuilt for updated systemd-rpm-macros + See https://pagure.io/fesco/issue/2583. + +* Fri Feb 26 2021 SaltStack Packaging Team - 3002.5-1 +- Update to CVE release 3002.5-1 for Python 3 + +* Wed Jan 27 2021 Fedora Release Engineering - 3002.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Wed Nov 18 2020 SaltStack Packaging Team - 3002.2-1 +- Update to bugfix release 3002.2-1 for Python3 +- Revert _scope_id patch since it's been fixed upstream + +* Wed Nov 04 2020 SaltStack Packaging Team - 3002.1-1 +- Update to CVE release 3002.1-1 for Python3 + +* Sun Oct 25 2020 Gwyn Ciesla - 3002-1 +- 3002 +- Patch for _scope_id 3.9 error. + +* Mon Jul 27 2020 SaltStack Packaging Team - 3001.1-1 +- Update to feature release 3001.1-1 for Python 3 + +* Thu Jun 18 2020 SaltStack Packaging Team - 30001-1 +- Update to feature release 30001-1 for Python 3 + +* Wed Jun 03 2020 SaltStack Packaging Team - 3001rc1-2 +- Altered msgpack and python-zmq versions limitation + +* Tue Jun 02 2020 SaltStack Packaging Team - 3001rc1-1 +- Update to Release Candidate rc1 for point release 3001 + +* Fri May 15 2020 SaltStack Packaging Team - 3000.3-1 +- Update to feature release 3000.3-1 for Python 3 + +* Wed Apr 29 2020 SaltStack Packaging Team - 3000.2-1 +- Update to feature release 3000.2-1 for Python 3 + +* Wed Apr 01 2020 SaltStack Packaging Team - 3000.1-1 +- Update to feature release 3000.1-1 for Python 3 + +* Tue Feb 25 2020 SaltStack Packaging Team - 3000-5 +- Fix lint clean up issues + +* Tue Feb 25 2020 SaltStack Packaging Team - 3000-4 +- Removed cherrypy < 18.0.0 check since python 3.5 no longer used on Fedora + +* Mon Feb 24 2020 SaltStack Packaging Team - 3000-3 +- Added distro as a build and requires dependency for Fedora >= 31 + +* Mon Feb 24 2020 SaltStack Packaging Team - 3000-2 +- Changed dependency for crypto to pycryptodomex + +* Mon Feb 03 2020 SaltStack Packaging Team - 3000-1 +- Update to feature release 3000-1 for Python 3 +- Removed Torando since salt.ext.tornado, add dependencies for Tornado + +* Wed Jan 22 2020 SaltStack Packaging Team - 3000.0.0rc2-1 +- Update to Neon Release Candidate 2 for Python 3 +- Updated spec file to not use py3_build due to '-s' preventing pip installs +- Updated patch file to support Tornado4 + +* Wed Jan 08 2020 SaltStack Packaging Team - 2019.2.3-1 +- Update to feature release 2019.2.3-1 for Python 3 + +* Tue Oct 15 2019 SaltStack Packaging Team - 2019.2.2-1 +- Update to feature release 2019.2.2-1 for Python 3 + +* Thu Sep 12 2019 SaltStack Packaging Team - 2019.2.1-1 +- Update to feature release 2019.2.1-1 for Python 3 + +* Tue Sep 10 2019 SaltStack Packaging Team - 2019.2.0-10 +- Support for point release, added distro as a requirement + +* Tue Jul 02 2019 SaltStack Packaging Team - 2019.2.0-9 +- Support for point release, only rpmsign and tornado4 patches + +* Thu Jun 06 2019 SaltStack Packaging Team - 2019.2.0-8 +- Support for Redhat 7 need for PyYAML and tornado 4 patch since Tornado < v5.x + +* Thu May 23 2019 SaltStack Packaging Team - 2019.2.0-7 +- Patching in support for gpg-agent and passphrase preset + +* Wed May 22 2019 SaltStack Packaging Team - 2019.2.0-6 +- Patching in fix for rpmsign + +* Thu May 16 2019 SaltStack Packaging Team - 2019.2.0-5 +- Patching in fix for gpg str/bytes to to_unicode/to_bytes + +* Tue May 14 2019 SaltStack Packaging Team - 2019.2.0-4 +- Patching in support for Tornado 4 + +* Mon May 13 2019 SaltStack Packaging Team - 2019.2.0-3 +- Added support for Redhat 8, and removed support for Python 2 packages + +* Mon Apr 08 2019 SaltStack Packaging Team - 2019.2.0-2 +- Update to support Python 3.6 + +* Mon Apr 08 2019 SaltStack Packaging Team - 2018.3.4-2 +- Update to allow for Python 3.6 + +* Mon Mar 04 2019 Fedora Release Engineering - 2019.2.0-1 +- Update to feature release 2019.2.0-1 for Python 2 + +* Sat Feb 16 2019 SaltStack Packaging Team - 2019.2.0-1 +- Update to feature release 2019.2.0-1 for Python 3 + +* Sat Feb 16 2019 SaltStack Packaging Team - 2018.3.4-1 +- Update to feature release 2018.3.4-1 for Python 3 + +* Sat Feb 02 2019 Fedora Release Engineering - 2018.3.3-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Wed Jan 09 2019 SaltStack Packaging Team - 2019.2.0-0 +- Update to feature release branch 2019.2.0-0 for Python 2 +- Revised acceptable versions of cherrypy, futures + +* Thu Nov 29 2018 SaltStack Packaging Team - 2018.3.3-2 +- Revised BuildRequires and Requires to use python2 versions of packages +- Cleaned up spec file to apply to Fedora 28 and above + +* Mon Oct 15 2018 SaltStack Packaging Team - 2018.3.3-1 +- Update to feature release 2018.3.3-1 for Python 2 +- Revised versions of cherrypy acceptable + +* Tue Oct 09 2018 SaltStack Packaging Team - 2018.3.3-1 +- Update to feature release 2018.3.3-1 for Python 3 +- Revised versions of cherrypy acceptable + +* Tue Jul 24 2018 SaltStack Packaging Team - 2018.3.2-5 +- Fix version of python used, multiple addition of 2.7 + +* Sat Jul 14 2018 Fedora Release Engineering - 2018.3.2-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Mon Jul 09 2018 SaltStack Packaging Team - 2018.3.2-3 +- Allow for removal of /usr/bin/python + +* Mon Jul 09 2018 SaltStack Packaging Team - 2018.3.2-2 +- Correct tornado version check + +* Thu Jun 21 2018 SaltStack Packaging Team - 2018.3.2-1 +- Update to feature release 2018.3.2-1 for Python 2 + +* Mon Jun 11 2018 SaltStack Packaging Team - 2018.3.1-1 +- Update to feature release 2018.3.1-1 for Python 3 +- Revised minimum msgpack version >= 0.4 + +* Fri Jun 08 2018 SaltStack Packaging Team - 2018.3.1-1 +- Update to feature release 2018.3.1-1 for Python 2 +- Revised minimum msgpack version >= 0.4 + +* Mon Apr 02 2018 SaltStack Packaging Team - 2018.3.0-1 +- Development build for Python 3 support + +* Fri Mar 30 2018 SaltStack Packaging Team - 2018.3.0-1 +- Update to feature release 2018.3.0-1 + +* Tue Mar 27 2018 SaltStack Packaging Team - 2017.7.5-1 +- Update to feature release 2017.7.5-1 + +* Fri Feb 16 2018 SaltStack Packaging Team - 2017.7.4-1 +- Update to feature release 2017.7.4-1 +- Limit to Tornado use to between versions 4.2.1 and less than 5.0 + +* Tue Jan 30 2018 SaltStack Packaging Team - 2017.7.3-1 +- Update to feature release 2017.7.3-1 + +* Mon Sep 18 2017 SaltStack Packaging Team - 2017.7.2-1 +- Update to feature release 2017.7.2 + +* Tue Aug 15 2017 SaltStack Packaging Team - 2017.7.1-1 +- Update to feature release 2017.7.1 +- Altered dependency for dnf-utils instead of yum-utils if Fedora 26 or greater + +* Wed Jul 12 2017 SaltStack Packaging Team - 2017.7.0-1 +- Update to feature release 2017.7.0 +- Added python-psutil as a requirement, disabled auto enable for Redhat 6 + +* Thu Jun 22 2017 SaltStack Packaging Team - 2016.11.6-1 +- Update to feature release 2016.11.6 + +* Thu Apr 27 2017 SaltStack Packaging Team - 2016.11.5-1 +- Update to feature release 2016.11.5 +- Altered to use pycryptodomex if 64 bit and Redhat 6 and greater otherwise pycrypto +- Addition of salt-proxy@.service + +* Wed Apr 19 2017 SaltStack Packaging Team - 2016.11.4-1 +- Update to feature release 2016.11.4 and use of pycryptodomex + +* Mon Mar 20 2017 SaltStack Packaging Team - 2016.11.3-2 +- Updated to allow for pre and post processing for salt-syndic and salt-api + +* Wed Feb 22 2017 SaltStack Packaging Team - 2016.11.3-1 +- Update to feature release 2016.11.3 + +* Tue Jan 17 2017 SaltStack Packaging Team - 2016.11.2-1 +- Update to feature release 2016.11.2 + +* Tue Dec 13 2016 SaltStack Packaging Team - 2016.11.1-1 +- Update to feature release 2016.11.1 + +* Wed Nov 30 2016 SaltStack Packaging Team - 2016.11.0-2 +- Adjust for single spec for Redhat family and fish-completions + +* Tue Nov 22 2016 SaltStack Packaging Team - 2016.11.0-1 +- Update to feature release 2016.11.0 + +* Wed Nov 2 2016 SaltStack Packaging Team - 2016.11.0-0.rc2 +- Update to feature release 2016.11.0 Release Candidate 2 + +* Wed Oct 26 2016 SaltStack Packaging Team - 2016.11.0-0.rc1 +- Update to feature release 2016.11.0 Release Candidate 1 + +* Fri Oct 14 2016 SaltStack Packaging Team - 2016.3.3-4 +- Ported to build on Amazon Linux 2016.09 natively + +* Mon Sep 12 2016 SaltStack Packaging Team - 2016.3.3-3 +- Adjust spec file for Fedora 24 support + +* Tue Aug 30 2016 SaltStack Packaging Team - 2016.3.3-2 +- Fix systemd update of existing installation + +* Fri Aug 26 2016 SaltStack Packaging Team - 2016.3.3-1 +- Update to feature release 2016.3.3 + +* Fri Jul 29 2016 SaltStack Packaging Team - 2016.3.2-1 +- Update to feature release 2016.3.2 + +* Fri Jun 10 2016 SaltStack Packaging Team - 2016.3.1-1 +- Update to feature release 2016.3.1 + +* Mon May 23 2016 SaltStack Packaging Team - 2016.3.0-1 +- Update to feature release 2016.3.0 + +* Wed Apr 6 2016 SaltStack Packaging Team - 2016.3.0-rc2 +- Update to bugfix release 2016.3.0 Release Candidate 2 + +* Fri Mar 25 2016 SaltStack Packaging Team - 2015.8.8-2 +- Patched fixes 32129, 32023, 32117 + +* Wed Mar 16 2016 SaltStack Packaging Team - 2015.8.8-1 +- Update to bugfix release 2015.8.8 + +* Tue Feb 16 2016 SaltStack Packaging Team - 2015.8.7-1 +- Update to bugfix release 2015.8.7 + +* Mon Jan 25 2016 SaltStack Packaging Team - 2015.8.4-1 +- Update to bugfix release 2015.8.4 + +* Thu Jan 14 2016 SaltStack Packaging Team - 2015.8.3-3 +- Add systemd environment files + +* Mon Dec 7 2015 SaltStack Packaging Team - 2015.8.3-2 +- Additional salt configuration directories on install + +* Tue Dec 1 2015 SaltStack Packaging Team - 2015.8.3-1 +- Update to bugfix release 2015.8.3 + +* Fri Nov 13 2015 SaltStack Packaging Team - 2015.8.2-1 +- Update to bugfix release 2015.8.2 + +* Fri Oct 30 2015 SaltStack Packaging Team - 2015.8.1-2 +- Update for pre-install direcories + +* Wed Oct 7 2015 SaltStack Packaging Team - 2015.8.1-1 +- Update to feature release 2015.8.1 + +* Wed Sep 30 2015 SaltStack Packaging Team - 2015.8.0-3 +- Update include python-uinttest2 + +* Wed Sep 9 2015 SaltStack Packaging Team - 2015.8.0-2 +- Update include testing + +* Fri Sep 4 2015 SaltStack Packaging Team - 2015.8.0-1 +- Update to feature release 2015.8.0 + +* Fri Jul 10 2015 Erik Johnson - 2015.5.3-4 +- Patch tests + +* Fri Jul 10 2015 Erik Johnson - 2015.5.3-3 +- Patch init grain + +* Fri Jul 10 2015 Erik Johnson - 2015.5.3-2 +- Update to bugfix release 2015.5.3, add bash completion + +* Thu Jun 4 2015 Erik Johnson - 2015.5.2-3 +- Mark salt-ssh roster as a config file to prevent replacement + +* Thu Jun 4 2015 Erik Johnson - 2015.5.2-2 +- Update skipped tests + +* Thu Jun 4 2015 Erik Johnson - 2015.5.2-1 +- Update to bugfix release 2015.5.2 + +* Mon Jun 1 2015 Erik Johnson - 2015.5.1-2 +- Add missing dependency on which (RH #1226636) + +* Wed May 27 2015 Erik Johnson - 2015.5.1-1 +- Update to bugfix release 2015.5.1 + +* Mon May 11 2015 Erik Johnson - 2015.5.0-1 +- Update to feature release 2015.5.0 + +* Fri Apr 17 2015 Erik Johnson - 2014.7.5-1 +- Update to bugfix release 2014.7.5 + +* Tue Apr 7 2015 Erik Johnson - 2014.7.4-4 +- Fix RH bug #1210316 and Salt bug #22003 + +* Tue Apr 7 2015 Erik Johnson - 2014.7.4-2 +- Update to bugfix release 2014.7.4 + +* Tue Feb 17 2015 Erik Johnson - 2014.7.2-1 +- Update to bugfix release 2014.7.2 + +* Mon Jan 19 2015 Erik Johnson - 2014.7.1-1 +- Update to bugfix release 2014.7.1 + +* Fri Nov 7 2014 Erik Johnson - 2014.7.0-3 +- Make salt-api its own package + +* Thu Nov 6 2014 Erik Johnson - 2014.7.0-2 +- Fix changelog + +* Thu Nov 6 2014 Erik Johnson - 2014.7.0-1 +- Update to feature release 2014.7.0 + +* Fri Oct 17 2014 Erik Johnson - 2014.1.13-1 +- Update to bugfix release 2014.1.13 + +* Mon Sep 29 2014 Erik Johnson - 2014.1.11-1 +- Update to bugfix release 2014.1.11 + +* Sun Aug 10 2014 Erik Johnson - 2014.1.10-4 +- Fix incorrect conditional + +* Tue Aug 5 2014 Erik Johnson - 2014.1.10-2 +- Deploy cachedir with package + +* Mon Aug 4 2014 Erik Johnson - 2014.1.10-1 +- Update to bugfix release 2014.1.10 + +* Thu Jul 10 2014 Erik Johnson - 2014.1.7-3 +- Add logrotate script + +* Thu Jul 10 2014 Erik Johnson - 2014.1.7-1 +- Update to bugfix release 2014.1.7 + +* Wed Jun 11 2014 Erik Johnson - 2014.1.5-1 +- Update to bugfix release 2014.1.5 + +* Tue May 6 2014 Erik Johnson - 2014.1.4-1 +- Update to bugfix release 2014.1.4 + +* Thu Feb 20 2014 Erik Johnson - 2014.1.0-1 +- Update to feature release 2014.1.0 + +* Mon Jan 27 2014 Erik Johnson - 0.17.5-1 +- Update to bugfix release 0.17.5 + +* Thu Dec 19 2013 Erik Johnson - 0.17.4-1 +- Update to bugfix release 0.17.4 + +* Tue Nov 19 2013 Erik Johnson - 0.17.2-2 +- Patched to fix pkgrepo.managed regression + +* Mon Nov 18 2013 Erik Johnson - 0.17.2-1 +- Update to bugfix release 0.17.2 + +* Thu Oct 17 2013 Erik Johnson - 0.17.1-1 +- Update to bugfix release 0.17.1 + +* Thu Sep 26 2013 Erik Johnson - 0.17.0-1 +- Update to feature release 0.17.0 + +* Wed Sep 11 2013 David Anderson +- Change sourcing order of init functions and salt default file + +* Sat Sep 07 2013 Erik Johnson - 0.16.4-1 +- Update to patch release 0.16.4 + +* Sun Aug 25 2013 Florian La Roche +- fixed preun/postun scripts for salt-minion + +* Thu Aug 15 2013 Andrew Niemantsverdriet - 0.16.3-1 +- Update to patch release 0.16.3 + +* Thu Aug 8 2013 Clint Savage - 0.16.2-1 +- Update to patch release 0.16.2 + +* Sun Aug 04 2013 Fedora Release Engineering - 0.16.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Tue Jul 9 2013 Clint Savage - 0.16.0-1 +- Update to feature release 0.16.0 + +* Sat Jun 1 2013 Clint Savage - 0.15.3-1 +- Update to patch release 0.15.3 +- Removed OrderedDict patch + +* Fri May 31 2013 Clint Savage - 0.15.2-1 +- Update to patch release 0.15.2 +- Patch OrderedDict for failed tests (SaltStack#4912) + +* Wed May 8 2013 Clint Savage - 0.15.1-1 +- Update to patch release 0.15.1 + +* Sat May 4 2013 Clint Savage - 0.15.0-1 +- Update to upstream feature release 0.15.0 + +* Fri Apr 19 2013 Clint Savage - 0.14.1-1 +- Update to upstream patch release 0.14.1 + +* Sat Mar 23 2013 Clint Savage - 0.14.0-1 +- Update to upstream feature release 0.14.0 + +* Fri Mar 22 2013 Clint Savage - 0.13.3-1 +- Update to upstream patch release 0.13.3 + +* Wed Mar 13 2013 Clint Savage - 0.13.2-1 +- Update to upstream patch release 0.13.2 + +* Fri Feb 15 2013 Clint Savage - 0.13.1-1 +- Update to upstream patch release 0.13.1 +- Add unittest support + +* Sat Feb 02 2013 Clint Savage - 0.12.1-1 +- Remove patches and update to upstream patch release 0.12.1 + +* Thu Jan 17 2013 Wendall Cada - 0.12.0-2 +- Added unittest support + +* Wed Jan 16 2013 Clint Savage - 0.12.0-1 +- Upstream release 0.12.0 + +* Fri Dec 14 2012 Clint Savage - 0.11.1-1 +- Upstream patch release 0.11.1 +- Fixes security vulnerability (https://github.com/saltstack/salt/issues/2916) + +* Fri Dec 14 2012 Clint Savage - 0.11.0-1 +- Moved to upstream release 0.11.0 + +* Wed Dec 05 2012 Mike Chesnut - 0.10.5-2 +- moved to upstream release 0.10.5 +- removing references to minion.template and master.template, as those files + have been removed from the repo + +* Sun Nov 18 2012 Clint Savage - 0.10.5-1 +- Moved to upstream release 0.10.5 +- Added pciutils as Requires + +* Wed Oct 24 2012 Clint Savage - 0.10.4-1 +- Moved to upstream release 0.10.4 +- Patched jcollie/systemd-service-status (SALT@GH#2335) (RHBZ#869669) + +* Tue Oct 2 2012 Clint Savage - 0.10.3-1 +- Moved to upstream release 0.10.3 +- Added systemd scriplets (RHBZ#850408) + +* Thu Aug 2 2012 Clint Savage - 0.10.2-2 +- Fix upstream bug #1730 per RHBZ#845295 + +* Tue Jul 31 2012 Clint Savage - 0.10.2-1 +- Moved to upstream release 0.10.2 +- Removed PyXML as a dependency + +* Sat Jun 16 2012 Clint Savage - 0.10.1-1 +- Moved to upstream release 0.10.1 + +* Sat Apr 28 2012 Clint Savage - 0.9.9.1-1 +- Moved to upstream release 0.9.9.1 + +* Tue Apr 17 2012 Peter Robinson - 0.9.8-2 +- dmidecode is x86 only + +* Wed Mar 21 2012 Clint Savage - 0.9.8-1 +- Moved to upstream release 0.9.8 + +* Thu Mar 8 2012 Clint Savage - 0.9.7-2 +- Added dmidecode as a Requires + +* Thu Feb 16 2012 Clint Savage - 0.9.7-1 +- Moved to upstream release 0.9.7 + +* Tue Jan 24 2012 Clint Savage - 0.9.6-2 +- Added README.fedora and removed deps for optional modules + +* Sat Jan 21 2012 Clint Savage - 0.9.6-1 +- New upstream release + +* Sun Jan 8 2012 Clint Savage - 0.9.4-6 +- Missed some critical elements for SysV and rpmlint cleanup + +* Sun Jan 8 2012 Clint Savage - 0.9.4-5 +- SysV clean up in post + +* Sat Jan 7 2012 Clint Savage - 0.9.4-4 +- Cleaning up perms, group and descriptions, adding post scripts for systemd + +* Thu Jan 5 2012 Clint Savage - 0.9.4-3 +- Updating for systemd on Fedora 15+ + +* Thu Dec 1 2011 Clint Savage - 0.9.4-2 +- Removing requirement for Cython. Optional only for salt-minion + +* Wed Nov 30 2011 Clint Savage - 0.9.4-1 +- New upstream release with new features and bugfixes + +* Thu Nov 17 2011 Clint Savage - 0.9.3-1 +- New upstream release with new features and bugfixes + +* Sat Sep 17 2011 Clint Savage - 0.9.2-1 +- Bugfix release from upstream to fix python2.6 issues + +* Fri Sep 09 2011 Clint Savage - 0.9.1-1 +- Initial packages