Merge pull request #35702 from rallytime/merge-develop

[develop] Merge forward from 2016.3 to develop
This commit is contained in:
Nicole Thomas 2016-08-23 13:40:50 -06:00 committed by GitHub
commit f3f068be72
24 changed files with 1109 additions and 131 deletions

View File

@ -355,8 +355,8 @@ Set the default outputter used by the salt command.
Default: None
# Set the default output file used by the salt command. Default is to output
# to the CLI and not to a file. Functions the same way as the "--out-file"
Set the default output file used by the salt command. Default is to output
to the CLI and not to a file. Functions the same way as the "--out-file"
CLI option, only sets this to a single file for all salt commands.
.. code-block:: yaml

View File

@ -673,23 +673,6 @@ parameter. The wait-time will be a random number of seconds between
random_reauth_delay: 60
.. conf_minion:: auth_tries
``auth_tries``
--------------
.. versionadded:: 2014.7.0
Default: ``7``
The number of attempts to authenticate to a master before giving up. Or, more
technically, the number of consecutive SaltReqTimeoutErrors that are acceptable
when trying to authenticate to the master.
.. code-block:: yaml
auth_tries: 7
.. conf_minion:: master_tries
``master_tries``

View File

@ -4,3 +4,267 @@ Salt 2015.8.12 Release Notes
Version 2015.8.12 is a bugfix release for :doc:`2015.8.0
</topics/releases/2015.8.0>`.
Changes for v2015.8.11..v2015.8.12
----------------------------------
Extended changelog courtesy of Todd Stansell (https://github.com/tjstansell/salt-changelogs):
*Generated at: 2016-08-19T16:06:27Z*
Total Merges: **57**
Changes:
- **PR** `#35611`_: (rallytime*) Everything in the sample master config file should be commented out
- **PR** `#35569`_: (*rallytime) Write test for multiple unless commands where 1st cmd passes and 2nd fails
- **PR** `#35600`_: (*rallytime) Update release notes for 2015.8.12
- **PR** `#35599`_: (*rallytime*) Update release notes for 2015.8.12
- **PR** `#35584`_: (*terminalmage*) Update linux_sysctl tests to reflect new context key
- **PR** `#35575`_: (*terminalmage*) Add warning about AWS flagging of nmap usage
- **PR** `#35577`_: (*terminalmage*) Unit file changes for 2015.8.12, 2016.3.3
- **PR** `#35566`_: (*rallytime*) Back-port `#35545`_ to 2015.8
- **PR** `#35545`_: (*hu-dabao*) `fix-35384`_, fix cmd.run unless
- **PR** `#35492`_: (*terminalmage*) Clarify config.get docstring
- **PR** `#35483`_: (*gtmanfred*) use __utils__ in salt.cloud
- **PR** `#35546`_: (*whiteinge*) Salt api eauth fail gracefully
- **PR** `#35525`_: (*UtahDave*) add missing glob import
- **PR** `#35540`_: (*rallytime*) Whitespace fix for 2015.8
- **PR** `#35510`_: (*terminalmage*) Better systemd integration
- **PR** `#35513`_: (*cachedout*) Might be a good idea to be able to download the software we make
- **PR** `#35302`_: (*Ch3LL*) Add job cache test
- **PR** `#35512`_: (*cachedout*) Fixup 35419
- **PR** `#35497`_: (*deepakhj*) Fixes spacing in requirements files
- **PR** `#35508`_: (*terminalmage*) Add Carbon to versionadded for git.diff
- **PR** `#35486`_: (*rallytime*) Update bootstrap script to latest stable (2016.08.16)
- **PR** `#35413`_: (*cachedout*) Resolve path issues with cp.push
- **PR** `#35476`_: (*cachedout*) Fixup SSH bug where sudo without sudo user would break
- **PR** `#35471`_: (*terminalmage*) win_pkg: Fix traceback when package is not installed
- **PR** `#35448`_: (*isbm*) Add ignore_repo_failure option to suppress zypper's exit code 106 on …
- **PR** `#35451`_: (*isbm*) Bugfix: zypper mod repo unchanged
- **PR** `#35453`_: (*theothergraham*) fixes `#34279`_ - disk cache ttl expiry
- **PR** `#35459`_: (*thatch45*) Ensure that output for salt-ssh gets back
- **PR** `#35460`_: (*rallytime*) [2015.8] Update bootstrap script to latest stable (2016.08.15)
- **PR** `#35442`_: (*cachedout*) Fix cp.push_dir pushing empty dirs
- **PR** `#35436`_: (*cachedout*) Minor doc fixup
- **PR** `#35132`_: (*sjorge*) fixes , causing lots of mayham (onchange) with 2016.3.2 for me
- **PR** `#35394`_: (*rallytime*) Back-port `#34573`_ to 2015.8
- **PR** `#34573`_: (*cedwards*) Update freebsd.rst
- **PR** `#35359`_: (*terminalmage*) Clean up open filehandles
- **PR** `#35339`_: (*isbm*) Bugfix: Prevent continuous restart, if a dependency wasn't installed
- **PR** `#35357`_: (*twangboy*) Fix file.recurse with clean: True on Windows (2015.8)
- **PR** `#35323`_: (*thatch45*) Fix issue with bad error check in salt-vt
- **PR** `#35325`_: (*kev009*) Fix freebsd netstat route on fbsd 10+
- **PR** `#35301`_: (*bobrik*) Pass port to ssh.check_known_host, closes `#35264`_
- **PR** `#35309`_: (*terminalmage*) file.recurse: Do not convert octal mode string to int
- **PR** `#35290`_: (*terminalmage*) Resolve a couple bugs in orchestration output
- **PR** `#35211`_: (*cachedout*) Alternative sudo users for salt-ssh
- **PR** `#35271`_: (*bobrik*) Default state_output_profile to True everywhere, closes `#35166`_
- **PR** `#35233`_: (*terminalmage*) Do not attempt to get fqdn_ip{4,6} grains when ipv{4,6} grains are empty
- **PR** `#35202`_: (*multani*) doc: fix broken links in the test documentation page
- **PR** `#35236`_: (*rallytime*) Back-port `#35119`_ to 2015.8
- **PR** `#35119`_: (*derekmaciel*) Assume two EVRs are equal if E and V are equal but one R is missing.
- **PR** `#35240`_: (*derekmaciel*) Backport `#35225`_ to 2015.8
- **PR** `#35225`_: (*derekmaciel*) Add missing documentation for pkg.installed
- **PR** `#35241`_: (*terminalmage*) Ensure max recursion in gitfs results in no blob object being returned.
- **PR** `#35245`_: (*rallytime*) Back-port `#35039`_ to 2015.8
- **PR** `#35039`_: (*whiteinge*) Add saltenv support to module.run
- **PR** `#35249`_: (*terminalmage*) Fix regression in git.latest
- **PR** `#35174`_: (*rallytime*) Back-port `#35146`_ to 2015.8
- **PR** `#35146`_: (*cachedout*) Don't discard running beacons config when listing becaons
- **PR** `#34827`_: (*thatch45*) fix beacon list to include all beacons being processed
- **PR** `#35173`_: (*rallytime*) Back-port `#35135`_ to 2015.8
- **PR** `#35135`_: (*rallytime*) Add missing CLI Examples to aws_sqs module funcs
- **PR** `#35145`_: (*jacobhammons*) doc version update to 2015.8.11, updates to release notes
- **PR** `#35114`_: (*terminalmage*) Add clarification docs on a common git_pillar misconfiguration
- **PR** `#34768`_: (*hrumph*) Fixes `#34767`_
- **PR** `#35043`_: (*rallytime*) Start release notes file for 2015.8.12
- **PR** `#35050`_: (*terminalmage*) [orchestration] Properly handle runner/wheel funcs which accept a 'saltdev' argument
- **PR** `#35066`_: (*jfindlay*) returners.postgres_local_cache: do not log in __virtual__
- **PR** `#35024`_: (*bobrik*) Cache systemd unit update check per unit, closes `#34927`_
- **PR** `#35026`_: (*cachedout*) Expressly deny a minion if a key cannot be found
- **PR** `#35000`_: (*rallytime*) Back-port `#33875`_ and `#34999`_ to 2015.8
- **PR** `#33875`_: (*jmesquita*) Fix naive fileserver map diff algorithm
- **PR** `#34994`_: (*rallytime*) Back-port `#34835`_ to 2015.8
- **PR** `#34835`_: (*thatch45*) Make the mine and publish combine minion and master opts in salt-ssh
- **PR** `#34991`_: (*cachedout*) SSH timeout
- **PR** `#34976`_: (*cachedout*) Refine errors in client
- **PR** `#34831`_: (*thatch45*) If the thin does not match, then redeploy, don't error
- **PR** `#34916`_: (*cachedout*) Master performance improvement
- **PR** `#34911`_: (*cachedout*) Backport `#34906`_
- **PR** `#34906`_: (*cachedout*) Set timeout for run_salt in test suite
- **PR** `#34898`_: (*hrumph*) Stop multiple refreshes during call to pkg.list_upgrades
- **PR** `#34606`_: (*isbm*) Bugfix: Exit on configuration read (backport)
- **PR** `#34862`_: (*thatch45*) Fix salt-ssh cacheing issue
- **PR** `#34869`_: (*terminalmage*) Fail git.latest states with uncommitted changes when force_reset=False
- **PR** `#34859`_: (*cachedout*) Fix wheel test
- **PR** `#34822`_: (*thatch45*) Fix salt-ssh state.high and state.low
- **PR** `#34847`_: (*cachedout*) Add an option to skip the verification of client_acl users
- **PR** `#34827`_: (*thatch45*) fix beacon list to include all beacons being processed
- **PR** `#34833`_: (*rallytime*) Back-port `#28521`_ to 2015.8
- **PR** `#28521`_: (*gongled*) SPM: packaging doesn't work in Python 2.6. Fixed.
- **PR** `#34823`_: (*rallytime*) Back-port `#25276`_ to 2015.8
- **PR** `#25276`_: (*jacobhammons*) copy spm.1 man page during setup
- **PR** `#34828`_: (*thatch45*) Fix `#34648`_
- **PR** `#34818`_: (*jtand*) Skip mysql state test if mysqladmin is not available
- **PR** `#34642`_: (*jtand*) Check that mysqladmin exists before running mysql integration tests
- **PR** `#34803`_: (*junovitch*) salt/state.py: set `chunk['order'] = 0' with `order: first'; fixes `#24744`_
- **PR** `#34773`_: (*randomed*) Bugfix: Startup states on minions are not being written to mysql returner
- **PR** `#34751`_: (*cachedout*) Remove unnedeed config test
- **PR** `#34606`_: (*isbm*) Bugfix: Exit on configuration read (backport)
- **PR** `#34754`_: (*cachedout*) Disable test
- **PR** `#34741`_: (*rallytime*) Back-port `#34726`_ to 2015.8
- **PR** `#34726`_: (*martinhoefling*) Always loop over updated keys in non recursive update
- **PR** `#34721`_: (*rallytime*) Add output_file option to master config docs
- **PR** `#34689`_: (*Azidburn*) fix second run problems with pkg.installed using sources
- **PR** `#34695`_: (*isbm*) Bugfix: Zypper `pkg.list_products` returns False on some empty values (2015.8)
.. _`#18419`: https://github.com/saltstack/salt/issues/18419
.. _`#24744`: https://github.com/saltstack/salt/issues/24744
.. _`#25213`: https://github.com/saltstack/salt/issues/25213
.. _`#25276`: https://github.com/saltstack/salt/pull/25276
.. _`#26278`: https://github.com/saltstack/salt/issues/26278
.. _`#27783`: https://github.com/saltstack/salt/issues/27783
.. _`#28521`: https://github.com/saltstack/salt/pull/28521
.. _`#29785`: https://github.com/saltstack/salt/issues/29785
.. _`#31074`: https://github.com/saltstack/salt/issues/31074
.. _`#32276`: https://github.com/saltstack/salt/issues/32276
.. _`#32719`: https://github.com/saltstack/salt/issues/32719
.. _`#33516`: https://github.com/saltstack/salt/issues/33516
.. _`#33620`: https://github.com/saltstack/salt/issues/33620
.. _`#33803`: https://github.com/saltstack/salt/issues/33803
.. _`#33875`: https://github.com/saltstack/salt/pull/33875
.. _`#34279`: https://github.com/saltstack/salt/issues/34279
.. _`#34509`: https://github.com/saltstack/salt/issues/34509
.. _`#34526`: https://github.com/saltstack/salt/issues/34526
.. _`#34573`: https://github.com/saltstack/salt/pull/34573
.. _`#34606`: https://github.com/saltstack/salt/pull/34606
.. _`#34642`: https://github.com/saltstack/salt/pull/34642
.. _`#34648`: https://github.com/saltstack/salt/issues/34648
.. _`#34678`: https://github.com/saltstack/salt/issues/34678
.. _`#34689`: https://github.com/saltstack/salt/pull/34689
.. _`#34691`: https://github.com/saltstack/salt/issues/34691
.. _`#34695`: https://github.com/saltstack/salt/pull/34695
.. _`#34703`: https://github.com/saltstack/salt/issues/34703
.. _`#34721`: https://github.com/saltstack/salt/pull/34721
.. _`#34725`: https://github.com/saltstack/salt/issues/34725
.. _`#34726`: https://github.com/saltstack/salt/pull/34726
.. _`#34741`: https://github.com/saltstack/salt/pull/34741
.. _`#34751`: https://github.com/saltstack/salt/pull/34751
.. _`#34754`: https://github.com/saltstack/salt/pull/34754
.. _`#34767`: https://github.com/saltstack/salt/issues/34767
.. _`#34768`: https://github.com/saltstack/salt/pull/34768
.. _`#34773`: https://github.com/saltstack/salt/pull/34773
.. _`#34796`: https://github.com/saltstack/salt/issues/34796
.. _`#34798`: https://github.com/saltstack/salt/issues/34798
.. _`#34803`: https://github.com/saltstack/salt/pull/34803
.. _`#34806`: https://github.com/saltstack/salt/issues/34806
.. _`#34818`: https://github.com/saltstack/salt/pull/34818
.. _`#34822`: https://github.com/saltstack/salt/pull/34822
.. _`#34823`: https://github.com/saltstack/salt/pull/34823
.. _`#34827`: https://github.com/saltstack/salt/pull/34827
.. _`#34828`: https://github.com/saltstack/salt/pull/34828
.. _`#34831`: https://github.com/saltstack/salt/pull/34831
.. _`#34833`: https://github.com/saltstack/salt/pull/34833
.. _`#34835`: https://github.com/saltstack/salt/pull/34835
.. _`#34847`: https://github.com/saltstack/salt/pull/34847
.. _`#34859`: https://github.com/saltstack/salt/pull/34859
.. _`#34861`: https://github.com/saltstack/salt/issues/34861
.. _`#34862`: https://github.com/saltstack/salt/pull/34862
.. _`#34869`: https://github.com/saltstack/salt/pull/34869
.. _`#34898`: https://github.com/saltstack/salt/pull/34898
.. _`#34906`: https://github.com/saltstack/salt/pull/34906
.. _`#34911`: https://github.com/saltstack/salt/pull/34911
.. _`#34916`: https://github.com/saltstack/salt/pull/34916
.. _`#34927`: https://github.com/saltstack/salt/issues/34927
.. _`#34945`: https://github.com/saltstack/salt/issues/34945
.. _`#34976`: https://github.com/saltstack/salt/pull/34976
.. _`#34991`: https://github.com/saltstack/salt/pull/34991
.. _`#34994`: https://github.com/saltstack/salt/pull/34994
.. _`#34999`: https://github.com/saltstack/salt/issues/34999
.. _`#35000`: https://github.com/saltstack/salt/pull/35000
.. _`#35010`: https://github.com/saltstack/salt/issues/35010
.. _`#35024`: https://github.com/saltstack/salt/pull/35024
.. _`#35026`: https://github.com/saltstack/salt/pull/35026
.. _`#35039`: https://github.com/saltstack/salt/pull/35039
.. _`#35043`: https://github.com/saltstack/salt/pull/35043
.. _`#35050`: https://github.com/saltstack/salt/pull/35050
.. _`#35051`: https://github.com/saltstack/salt/issues/35051
.. _`#35066`: https://github.com/saltstack/salt/pull/35066
.. _`#35114`: https://github.com/saltstack/salt/pull/35114
.. _`#35119`: https://github.com/saltstack/salt/pull/35119
.. _`#35121`: https://github.com/saltstack/salt/issues/35121
.. _`#35132`: https://github.com/saltstack/salt/pull/35132
.. _`#35135`: https://github.com/saltstack/salt/pull/35135
.. _`#35145`: https://github.com/saltstack/salt/pull/35145
.. _`#35146`: https://github.com/saltstack/salt/pull/35146
.. _`#35166`: https://github.com/saltstack/salt/issues/35166
.. _`#35173`: https://github.com/saltstack/salt/pull/35173
.. _`#35174`: https://github.com/saltstack/salt/pull/35174
.. _`#35202`: https://github.com/saltstack/salt/pull/35202
.. _`#35211`: https://github.com/saltstack/salt/pull/35211
.. _`#35214`: https://github.com/saltstack/salt/issues/35214
.. _`#35225`: https://github.com/saltstack/salt/pull/35225
.. _`#35233`: https://github.com/saltstack/salt/pull/35233
.. _`#35236`: https://github.com/saltstack/salt/pull/35236
.. _`#35240`: https://github.com/saltstack/salt/pull/35240
.. _`#35241`: https://github.com/saltstack/salt/pull/35241
.. _`#35245`: https://github.com/saltstack/salt/pull/35245
.. _`#35249`: https://github.com/saltstack/salt/pull/35249
.. _`#35264`: https://github.com/saltstack/salt/issues/35264
.. _`#35271`: https://github.com/saltstack/salt/pull/35271
.. _`#35290`: https://github.com/saltstack/salt/pull/35290
.. _`#35296`: https://github.com/saltstack/salt/issues/35296
.. _`#35301`: https://github.com/saltstack/salt/pull/35301
.. _`#35302`: https://github.com/saltstack/salt/pull/35302
.. _`#35309`: https://github.com/saltstack/salt/pull/35309
.. _`#35323`: https://github.com/saltstack/salt/pull/35323
.. _`#35325`: https://github.com/saltstack/salt/pull/35325
.. _`#35339`: https://github.com/saltstack/salt/pull/35339
.. _`#35357`: https://github.com/saltstack/salt/pull/35357
.. _`#35359`: https://github.com/saltstack/salt/pull/35359
.. _`#35380`: https://github.com/saltstack/salt/issues/35380
.. _`#35384`: https://github.com/saltstack/salt/issues/35384
.. _`#35387`: https://github.com/saltstack/salt/issues/35387
.. _`#35394`: https://github.com/saltstack/salt/pull/35394
.. _`#35413`: https://github.com/saltstack/salt/pull/35413
.. _`#35436`: https://github.com/saltstack/salt/pull/35436
.. _`#35442`: https://github.com/saltstack/salt/pull/35442
.. _`#35448`: https://github.com/saltstack/salt/pull/35448
.. _`#35451`: https://github.com/saltstack/salt/pull/35451
.. _`#35453`: https://github.com/saltstack/salt/pull/35453
.. _`#35459`: https://github.com/saltstack/salt/pull/35459
.. _`#35460`: https://github.com/saltstack/salt/pull/35460
.. _`#35471`: https://github.com/saltstack/salt/pull/35471
.. _`#35476`: https://github.com/saltstack/salt/pull/35476
.. _`#35483`: https://github.com/saltstack/salt/pull/35483
.. _`#35486`: https://github.com/saltstack/salt/pull/35486
.. _`#35492`: https://github.com/saltstack/salt/pull/35492
.. _`#35497`: https://github.com/saltstack/salt/pull/35497
.. _`#35508`: https://github.com/saltstack/salt/pull/35508
.. _`#35510`: https://github.com/saltstack/salt/pull/35510
.. _`#35512`: https://github.com/saltstack/salt/pull/35512
.. _`#35513`: https://github.com/saltstack/salt/pull/35513
.. _`#35525`: https://github.com/saltstack/salt/pull/35525
.. _`#35540`: https://github.com/saltstack/salt/pull/35540
.. _`#35545`: https://github.com/saltstack/salt/pull/35545
.. _`#35546`: https://github.com/saltstack/salt/pull/35546
.. _`#35566`: https://github.com/saltstack/salt/pull/35566
.. _`#35569`: https://github.com/saltstack/salt/pull/35569
.. _`#35575`: https://github.com/saltstack/salt/pull/35575
.. _`#35577`: https://github.com/saltstack/salt/pull/35577
.. _`#35584`: https://github.com/saltstack/salt/pull/35584
.. _`#35599`: https://github.com/saltstack/salt/pull/35599
.. _`#35600`: https://github.com/saltstack/salt/pull/35600
.. _`#35611`: https://github.com/saltstack/salt/pull/35611
.. _`bp-25276`: https://github.com/saltstack/salt/pull/25276
.. _`bp-28521`: https://github.com/saltstack/salt/pull/28521
.. _`bp-33875`: https://github.com/saltstack/salt/pull/33875
.. _`bp-34726`: https://github.com/saltstack/salt/pull/34726
.. _`bp-34835`: https://github.com/saltstack/salt/pull/34835
.. _`bp-35039`: https://github.com/saltstack/salt/pull/35039
.. _`bp-35119`: https://github.com/saltstack/salt/pull/35119
.. _`bp-35225`: https://github.com/saltstack/salt/pull/35225
.. _`fix-34703`: https://github.com/saltstack/salt/issues/34703
.. _`fix-35384`: https://github.com/saltstack/salt/issues/35384

View File

@ -4,3 +4,523 @@ Salt 2016.3.3 Release Notes
Version 2016.3.3 is a bugfix release for :doc:`2016.3.0
</topics/releases/2016.3.0>`.
Changes for v2016.3.2..2016.3.3
-------------------------------
Extended changelog courtesy of Todd Stansell (https://github.com/tjstansell/salt-changelogs):
*Generated at: 2016-08-19T16:17:34Z*
Total Merges: **134**
Changes:
- **PR** `#35580`_: (*twangboy*) Fix mac_service attempts to parse non-plist files
- **PR** `#35586`_: (*hu-dabao*) Fix 35420, add run_on_start in build_schedule_item
- **PR** `#35583`_: (*terminalmage*) Fix localemod tests
- **PR** `#35579`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3
- **PR** `#35577`_: (*terminalmage*) Unit file changes for 2015.8.12, 2016.3.3
- **PR** `#35571`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3
- **PR** `#35566`_: (*rallytime*) Back-port `#35545`_ to 2015.8
- **PR** `#35546`_: (*whiteinge*) Salt api eauth fail gracefully
- **PR** `#35545`_: (*hu-dabao*) `fix-35384`_, fix cmd.run unless
- **PR** `#35540`_: (*rallytime*) Whitespace fix for 2015.8
- **PR** `#35525`_: (*UtahDave*) add missing glob import
- **PR** `#35510`_: (*terminalmage*) Better systemd integration
- **PR** `#35492`_: (*terminalmage*) Clarify config.get docstring
- **PR** `#35483`_: (*gtmanfred*) use __utils__ in salt.cloud
- **PR** `#35573`_: (*rallytime*) Back-port `#33337`_ to 2016.3
- **PR** `#33337`_: (*mzupan*) adding the () to make changes work
- **PR** `#35572`_: (*terminalmage*) Fix poor formatting in pkg state docs
- **PR** `#35545`_: (*hu-dabao*) `fix-35384`_, fix cmd.run unless
- **PR** `#35489`_: (*rallytime*) Back-port `#35463`_ to 2016.3
- **PR** `#35463`_: (*skizunov*) Make `auth_timeout` user configurable again
- **PR** `#35538`_: (*thatch45*) Treat python XML as an optdep
- **PR** `#35526`_: (*thatch45*) Always deploy the thin to /var/tmp
- **PR** `#35522`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3
- **PR** `#35513`_: (*cachedout*) Might be a good idea to be able to download the software we make
- **PR** `#35512`_: (*cachedout*) Fixup 35419
- **PR** `#35508`_: (*terminalmage*) Add Carbon to versionadded for git.diff
- **PR** `#35497`_: (*deepakhj*) Fixes spacing in requirements files
- **PR** `#35302`_: (*Ch3LL*) Add job cache test
- **PR** `#35516`_: (*rallytime*) Back-port `#34441`_ to 2016.3
- **PR** `#34441`_: (*markuskramerIgitt*) Copy and delete silently, do not list each file
- **PR** `#35517`_: (*rallytime*) Back-port `#34502`_ to 2016.3
- **PR** `#34502`_: (*markuskramerIgitt*) Windows installer build scripts will exit on error
- **PR** `#35429`_: (*tankywoo*) Fix iptables target options with no arguments
- **PR** `#35495`_: (*rallytime*) Use correct deprecated notation instead of a warning for apache_module.enable state function.
- **PR** `#35498`_: (*rallytime*) Add supported templates list to all template doc references in file state
- **PR** `#35406`_: (*rallytime*) Provide links to the renderers in the template docs
- **PR** `#35360`_: (*rallytime*) Add all template registery templates to file.managed docs
- **PR** `#35487`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3
- **PR** `#35486`_: (*rallytime*) Update bootstrap script to latest stable (2016.08.16)
- **PR** `#35476`_: (*cachedout*) Fixup SSH bug where sudo without sudo user would break
- **PR** `#35471`_: (*terminalmage*) win_pkg: Fix traceback when package is not installed
- **PR** `#35460`_: (*rallytime*) [2015.8] Update bootstrap script to latest stable (2016.08.15)
- **PR** `#35459`_: (*thatch45*) Ensure that output for salt-ssh gets back
- **PR** `#35453`_: (*theothergraham*) fixes `#34279`_ - disk cache ttl expiry
- **PR** `#35451`_: (*isbm*) Bugfix: zypper mod repo unchanged
- **PR** `#35448`_: (*isbm*) Add ignore_repo_failure option to suppress zypper's exit code 106 on …
- **PR** `#35413`_: (*cachedout*) Resolve path issues with cp.push
- **PR** `#35446`_: (*cachedout*) Make salt-client aware of edge-case where saltutil might be broken
- **PR** `#35449`_: (*dkruger*) aptpkg will specify --install-recommends if enabled by the SLS
- **PR** `#35467`_: (*rallytime*) Back-port `#33518`_ to 2016.3
- **PR** `#35235`_: (*rallytime*) Back-port `#33518`_ to 2016.3
- **PR** `#33518`_: (*tonybaloney*) Fix libcloud bug `#33367`_
- **PR** `#35461`_: (*rallytime*) [2016.3] Update bootstrap script to latest stable (2016.08.15)
- **PR** `#35456`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3
- **PR** `#35442`_: (*cachedout*) Fix cp.push_dir pushing empty dirs
- **PR** `#35436`_: (*cachedout*) Minor doc fixup
- **PR** `#35132`_: (*sjorge*) fixes , causing lots of mayham (onchange) with 2016.3.2 for me
- **PR** `#35447`_: (*ticosax*) [dockerng] RepoTags can be also be None with docker 1.12
- **PR** `#35308`_: (*farcaller*) Actually fixed dockerng.list_tags
- **PR** `#34702`_: (*farcaller*) Fixed dockerng.list_tags
- **PR** `#35427`_: (*cachedout*) Correct errant call to argspec from master. Fix ext_job_cache.
- **PR** `#35428`_: (*cachedout*) Resolve stacktrace logged by highstate outputter if sls cannot be found
- **PR** `#35412`_: (*s0undt3ch*) Only allow one sync read to happen at a time.
- **PR** `#35406`_: (*rallytime*) Provide links to the renderers in the template docs
- **PR** `#35360`_: (*rallytime*) Add all template registery templates to file.managed docs
- **PR** `#35393`_: (*deniszh*) No need to run ddns update every time
- **PR** `#35407`_: (*hu-dabao*) [Fix-35094] None will not be added to grains which generate [none]
- **PR** `#35411`_: (*eliasp*) modules.event.send(): Prevent backtrace for masterless Minions
- **PR** `#35395`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3
- **PR** `#35394`_: (*rallytime*) Back-port `#34573`_ to 2015.8
- **PR** `#35359`_: (*terminalmage*) Clean up open filehandles
- **PR** `#35357`_: (*twangboy*) Fix file.recurse with clean: True on Windows (2015.8)
- **PR** `#35339`_: (*isbm*) Bugfix: Prevent continuous restart, if a dependency wasn't installed
- **PR** `#34573`_: (*cedwards*) Update freebsd.rst
- **PR** `#35373`_: (*cachedout*) Raise SaltRenderError on bad requisite
- **PR** `#35352`_: (*twangboy*) Fix file.recurse with clean: True on Windows (2016.3)
- **PR** `#35356`_: (*jfindlay*) document log levels and warn on all logging below info
- **PR** `#35358`_: (*twangboy*) Update libsodium deps
- **PR** `#35360`_: (*rallytime*) Add all template registery templates to file.managed docs
- **PR** `#35362`_: (*rallytime*) Correct deprecation version tags
- **PR** `#35361`_: (*rallytime*) Blockdev deprecations
- **PR** `#25267`_: (*jfindlay*) Disk module improvements
- **PR** `#24893`_: (*The-Loeki*) Contribution: Disk module improvements
- **PR** `#35347`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3
- **PR** `#35325`_: (*kev009*) Fix freebsd netstat route on fbsd 10+
- **PR** `#35323`_: (*thatch45*) Fix issue with bad error check in salt-vt
- **PR** `#35309`_: (*terminalmage*) file.recurse: Do not convert octal mode string to int
- **PR** `#35301`_: (*bobrik*) Pass port to ssh.check_known_host, closes `#35264`_
- **PR** `#35334`_: (*cachedout*) Restore random_master functionality
- **PR** `#35331`_: (*hu-dabao*) fix 35165, salt-run jobs.exit_success jid is broken
- **PR** `#35318`_: (*rallytime*) Remove legacy compat docs in mysql pillar since the code was removed already
- **PR** `#30913`_: (*jtand*) Deprecated code removed.
- **PR** `#35329`_: (*hu-dabao*) sys.doc will skip all not connected minions
- **PR** `#35306`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3
- **PR** `#35290`_: (*terminalmage*) Resolve a couple bugs in orchestration output
- **PR** `#35229`_: (*lubyou*) Ignore import error for pwd module in mac_shadow
- **PR** `#35227`_: (*isbm*) Isbm osfinger ubuntu fix
- **PR** `#35286`_: (*hu-dabao*) fix 34425, a bug that sys.doc cannot output format
- **PR** `#35275`_: (*rallytime*) Back-port `#35213`_ to 2016.3
- **PR** `#35213`_: (*gtmanfred*) add identity v3 support to openstack driver
- **PR** `#35278`_: (*dmurphy18*) Increase timeout for siging to 10 seconds when signing rpm packages
- **PR** `#35276`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3
- **PR** `#35271`_: (*bobrik*) Default state_output_profile to True everywhere, closes `#35166`_
- **PR** `#35249`_: (*terminalmage*) Fix regression in git.latest
- **PR** `#35245`_: (*rallytime*) Back-port `#35039`_ to 2015.8
- **PR** `#35241`_: (*terminalmage*) Ensure max recursion in gitfs results in no blob object being returned.
- **PR** `#35240`_: (*derekmaciel*) Backport `#35225`_ to 2015.8
- **PR** `#35236`_: (*rallytime*) Back-port `#35119`_ to 2015.8
- **PR** `#35233`_: (*terminalmage*) Do not attempt to get fqdn_ip{4,6} grains when ipv{4,6} grains are empty
- **PR** `#35225`_: (*derekmaciel*) Add missing documentation for pkg.installed
- **PR** `#35211`_: (*cachedout*) Alternative sudo users for salt-ssh
- **PR** `#35202`_: (*multani*) doc: fix broken links in the test documentation page
- **PR** `#35119`_: (*derekmaciel*) Assume two EVRs are equal if E and V are equal but one R is missing.
- **PR** `#35039`_: (*whiteinge*) Add saltenv support to module.run
- **PR** `#35274`_: (*rallytime*) Lint fixes for 2016.3 branch
- **PR** `#35232`_: (*theredcat*) fix rabbitmq version detection using a package-agnostic version
- **PR** `#35269`_: (*meaksh*) Checksum validation for zypper pkg.download in 2016.3 and develop
- **PR** `#35197`_: (*vutny*) Make `pkgbuild.repo` state recognize `createrepo` command return code
- **PR** `#35178`_: (*cro*) Add append_minionid_config_dirs option
- **PR** `#35259`_: (*cachedout*) Fixup 35253
- **PR** `#35253`_: (*abednarik*) Fix disk.wipe missing option.
- **PR** `#35253`_: (*abednarik*) Fix disk.wipe missing option.
- **PR** `#35206`_: (*hu-dabao*) Make the log level back to warning for unclassified exc
- **PR** `#35196`_: (*isbm*) Deprecate status.uptime one version later
- **PR** `#35207`_: (*eliasp*) Handle exceptions in `_get_virtual()` and in `_get_virtual()` consumers
- **PR** `#35232`_: (*theredcat*) fix rabbitmq version detection using a package-agnostic version
- **PR** `#35244`_: (*rallytime*) Back-port `#31677`_ to 2016.3
- **PR** `#31677`_: (*miihael*) Return correct value for services that must be enabled in Systemd
- **PR** `#35182`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3
- **PR** `#35174`_: (*rallytime*) Back-port `#35146`_ to 2015.8
- **PR** `#35173`_: (*rallytime*) Back-port `#35135`_ to 2015.8
- **PR** `#35146`_: (*cachedout*) Don't discard running beacons config when listing becaons
- **PR** `#35145`_: (*jacobhammons*) doc version update to 2015.8.11, updates to release notes
- **PR** `#35135`_: (*rallytime*) Add missing CLI Examples to aws_sqs module funcs
- **PR** `#34827`_: (*thatch45*) fix beacon list to include all beacons being processed
- **PR** `#35150`_: (*rallytime*) Start release notes for 2016.3.3
- **PR** `#35157`_: (*hu-dabao*) master returned from func should be a string as designed so far
- **PR** `#35147`_: (*jacobhammons*) doc version updated to 2016.3.2
- **PR** `#35136`_: (*s0undt3ch*) Don't restart processes if the manager is not set to restart them
- **PR** `#35133`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3
- **PR** `#35114`_: (*terminalmage*) Add clarification docs on a common git_pillar misconfiguration
- **PR** `#35043`_: (*rallytime*) Start release notes file for 2015.8.12
- **PR** `#34768`_: (*hrumph*) Fixes `#34767`_
- **PR** `#35120`_: (*kstreee*) The '_handle_event_socket_recv' function in Salt Api is missing first data of stream.
- **PR** `#35131`_: (*rallytime*) Back-port `#35011`_ to 2016.3
- **PR** `#35011`_: (*nishigori*) Fix docstring for code-block of rst
- **PR** `#35110`_: (*hu-dabao*) Do not return job status back to master for master_alive and master_failback schedules
- **PR** `#35104`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3
- **PR** `#35066`_: (*jfindlay*) returners.postgres_local_cache: do not log in __virtual__
- **PR** `#35050`_: (*terminalmage*) [orchestration] Properly handle runner/wheel funcs which accept a 'saltdev' argument
- **PR** `#35026`_: (*cachedout*) Expressly deny a minion if a key cannot be found
- **PR** `#35024`_: (*bobrik*) Cache systemd unit update check per unit, closes `#34927`_
- **PR** `#35105`_: (*rallytime*) Update 2016.3.0 release notes with repo.saltstack.com Xenial pkg availability
- **PR** `#33870`_: (*rallytime*) Add note about Xenial packages to 2016.3.0 release notes
- **PR** `#35059`_: (*vutny*) Add `fun_args` field to events generated by execution of Master modules
- **PR** `#34955`_: (*lubyou*) force dism to always output english text
- **PR** `#35078`_: (*jacobweinstock*) added missing non-keyword argument skip_verify to __get_artifact func…
- **PR** `#35008`_: (*hu-dabao*) Fix multimaster failover on more than two masters and failback behaviour
- **PR** `#35055`_: (*galet*) `#33536`_ pkgrepo.managed does not disable a yum repo with "disabled: True"
- **PR** `#35039`_: (*whiteinge*) Add saltenv support to module.run
- **PR** `#35046`_: (*eliasp*) Prevent backtrace in `salt.states.network`
- **PR** `#35054`_: (*lubyou*) Only fail user lookup is the user parameter is required
- **PR** `#35029`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3
- **PR** `#35000`_: (*rallytime*) Back-port `#33875`_ and `#34999`_ to 2015.8
- **PR** `#34994`_: (*rallytime*) Back-port `#34835`_ to 2015.8
- **PR** `#34835`_: (*thatch45*) Make the mine and publish combine minion and master opts in salt-ssh
- **PR** `#33875`_: (*jmesquita*) Fix naive fileserver map diff algorithm
- **PR** `#35021`_: (*terminalmage*) Don't add '.' to strerror when passed string ends in ? or !
- **PR** `#34983`_: (*eliasp*) modules.slack.post_message: Allow sending messages to direct-message …
- **PR** `#34996`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3
- **PR** `#34991`_: (*cachedout*) SSH timeout
- **PR** `#34976`_: (*cachedout*) Refine errors in client
- **PR** `#34831`_: (*thatch45*) If the thin does not match, then redeploy, don't error
- **PR** `#34987`_: (*eliasp*) salt.states.slack: check correct result attribute
- **PR** `#34835`_: (*thatch45*) Make the mine and publish combine minion and master opts in salt-ssh
- **PR** `#34988`_: (*rallytime*) Update release notes with new changes
- **PR** `#34946`_: (*anlutro*) Fix virtualenv behavior when requirements files are in subdirectories
- **PR** `#34957`_: (*sjmh*) Don't fall through to checking auth entries
- **PR** `#34971`_: (*cachedout*) Increase timeout for grains test
- **PR** `#34951`_: (*vutny*) Fix `#34873`_
- **PR** `#34935`_: (*rallytime*) Avoid UnboundLocalError in beacons module
- **PR** `#34894`_: (*rallytime*) [develop] Merge forward from 2016.3 to develop
- **PR** `#34956`_: (*cachedout*) Increase all run_script timeouts to 30s
- **PR** `#34933`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3
- **PR** `#34916`_: (*cachedout*) Master performance improvement
- **PR** `#34911`_: (*cachedout*) Backport `#34906`_
- **PR** `#34906`_: (*cachedout*) Set timeout for run_salt in test suite
- **PR** `#34898`_: (*hrumph*) Stop multiple refreshes during call to pkg.list_upgrades
- **PR** `#34606`_: (*isbm*) Bugfix: Exit on configuration read (backport)
- **PR** `#34915`_: (*abednarik*) Update service_rh provider to exclude XenServer >= 7.
- **PR** `#34926`_: (*rallytime*) Lint `#34923`_
- **PR** `#34923`_: (*eliasp*) Handle exception when no Slack API key was provided
- **PR** `#34910`_: (*cachedout*) Fix grains error on proxy minions
- **PR** `#34864`_: (*jmacfar*) Check for version in list of installed versions
- **PR** `#34902`_: (*rallytime*) Back-port `#34878`_ to 2016.3
- **PR** `#34878`_: (*abednarik*) Add VirtuozzoLinux is yumpkg enable list.
- **PR** `#34901`_: (*rallytime*) Add VirtuozzoLinux to the list of enabled distros for rpm.py
- **PR** `#34900`_: (*rallytime*) Add VirtuozzoLinux to enabled platforms list in rh_service.py
- **PR** `#34887`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3
- **PR** `#34869`_: (*terminalmage*) Fail git.latest states with uncommitted changes when force_reset=False
- **PR** `#34862`_: (*thatch45*) Fix salt-ssh cacheing issue
- **PR** `#34859`_: (*cachedout*) Fix wheel test
- **PR** `#34632`_: (*eliasp*) Try to create the log directory when not present yet
- **PR** `#34854`_: (*rallytime*) Remove string_types import from state compiler
- **PR** `#34865`_: (*thatch45*) This needs discussion, since this breaks SUSE
- **PR** `#34858`_: (*rallytime*) [2016.3] Merge forward from 2015.8 to 2016.3
- **PR** `#34847`_: (*cachedout*) Add an option to skip the verification of client_acl users
- **PR** `#34833`_: (*rallytime*) Back-port `#28521`_ to 2015.8
- **PR** `#34828`_: (*thatch45*) Fix `#34648`_
- **PR** `#34827`_: (*thatch45*) fix beacon list to include all beacons being processed
- **PR** `#34823`_: (*rallytime*) Back-port `#25276`_ to 2015.8
- **PR** `#34822`_: (*thatch45*) Fix salt-ssh state.high and state.low
- **PR** `#28521`_: (*gongled*) SPM: packaging doesn't work in Python 2.6. Fixed.
- **PR** `#25276`_: (*jacobhammons*) copy spm.1 man page during setup
- **PR** `#34852`_: (*rallytime*) Skip GCE unit tests - causes test suite to hang
.. _`#18419`: https://github.com/saltstack/salt/issues/18419
.. _`#24745`: https://github.com/saltstack/salt/issues/24745
.. _`#24893`: https://github.com/saltstack/salt/pull/24893
.. _`#25213`: https://github.com/saltstack/salt/issues/25213
.. _`#25267`: https://github.com/saltstack/salt/pull/25267
.. _`#25276`: https://github.com/saltstack/salt/pull/25276
.. _`#26171`: https://github.com/saltstack/salt/issues/26171
.. _`#27294`: https://github.com/saltstack/salt/issues/27294
.. _`#27783`: https://github.com/saltstack/salt/issues/27783
.. _`#28521`: https://github.com/saltstack/salt/pull/28521
.. _`#29785`: https://github.com/saltstack/salt/issues/29785
.. _`#30913`: https://github.com/saltstack/salt/pull/30913
.. _`#31074`: https://github.com/saltstack/salt/issues/31074
.. _`#31677`: https://github.com/saltstack/salt/pull/31677
.. _`#32719`: https://github.com/saltstack/salt/issues/32719
.. _`#32761`: https://github.com/saltstack/salt/issues/32761
.. _`#33337`: https://github.com/saltstack/salt/pull/33337
.. _`#33367`: https://github.com/saltstack/salt/issues/33367
.. _`#33516`: https://github.com/saltstack/salt/issues/33516
.. _`#33518`: https://github.com/saltstack/salt/pull/33518
.. _`#33536`: https://github.com/saltstack/salt/issues/33536
.. _`#33588`: https://github.com/saltstack/salt/issues/33588
.. _`#33620`: https://github.com/saltstack/salt/issues/33620
.. _`#33803`: https://github.com/saltstack/salt/issues/33803
.. _`#33870`: https://github.com/saltstack/salt/pull/33870
.. _`#33875`: https://github.com/saltstack/salt/pull/33875
.. _`#34161`: https://github.com/saltstack/salt/issues/34161
.. _`#34279`: https://github.com/saltstack/salt/issues/34279
.. _`#34425`: https://github.com/saltstack/salt/issues/34425
.. _`#34441`: https://github.com/saltstack/salt/pull/34441
.. _`#34446`: https://github.com/saltstack/salt/issues/34446
.. _`#34481`: https://github.com/saltstack/salt/issues/34481
.. _`#34502`: https://github.com/saltstack/salt/pull/34502
.. _`#34509`: https://github.com/saltstack/salt/issues/34509
.. _`#34526`: https://github.com/saltstack/salt/issues/34526
.. _`#34573`: https://github.com/saltstack/salt/pull/34573
.. _`#34606`: https://github.com/saltstack/salt/pull/34606
.. _`#34632`: https://github.com/saltstack/salt/pull/34632
.. _`#34648`: https://github.com/saltstack/salt/issues/34648
.. _`#34691`: https://github.com/saltstack/salt/issues/34691
.. _`#34702`: https://github.com/saltstack/salt/pull/34702
.. _`#34725`: https://github.com/saltstack/salt/issues/34725
.. _`#34760`: https://github.com/saltstack/salt/issues/34760
.. _`#34767`: https://github.com/saltstack/salt/issues/34767
.. _`#34768`: https://github.com/saltstack/salt/pull/34768
.. _`#34796`: https://github.com/saltstack/salt/issues/34796
.. _`#34798`: https://github.com/saltstack/salt/issues/34798
.. _`#34806`: https://github.com/saltstack/salt/issues/34806
.. _`#34816`: https://github.com/saltstack/salt/issues/34816
.. _`#34822`: https://github.com/saltstack/salt/pull/34822
.. _`#34823`: https://github.com/saltstack/salt/pull/34823
.. _`#34827`: https://github.com/saltstack/salt/pull/34827
.. _`#34828`: https://github.com/saltstack/salt/pull/34828
.. _`#34831`: https://github.com/saltstack/salt/pull/34831
.. _`#34833`: https://github.com/saltstack/salt/pull/34833
.. _`#34835`: https://github.com/saltstack/salt/pull/34835
.. _`#34847`: https://github.com/saltstack/salt/pull/34847
.. _`#34852`: https://github.com/saltstack/salt/pull/34852
.. _`#34854`: https://github.com/saltstack/salt/pull/34854
.. _`#34858`: https://github.com/saltstack/salt/pull/34858
.. _`#34859`: https://github.com/saltstack/salt/pull/34859
.. _`#34861`: https://github.com/saltstack/salt/issues/34861
.. _`#34862`: https://github.com/saltstack/salt/pull/34862
.. _`#34864`: https://github.com/saltstack/salt/pull/34864
.. _`#34865`: https://github.com/saltstack/salt/pull/34865
.. _`#34869`: https://github.com/saltstack/salt/pull/34869
.. _`#34873`: https://github.com/saltstack/salt/issues/34873
.. _`#34878`: https://github.com/saltstack/salt/pull/34878
.. _`#34887`: https://github.com/saltstack/salt/pull/34887
.. _`#34890`: https://github.com/saltstack/salt/issues/34890
.. _`#34893`: https://github.com/saltstack/salt/issues/34893
.. _`#34894`: https://github.com/saltstack/salt/pull/34894
.. _`#34898`: https://github.com/saltstack/salt/pull/34898
.. _`#34900`: https://github.com/saltstack/salt/pull/34900
.. _`#34901`: https://github.com/saltstack/salt/pull/34901
.. _`#34902`: https://github.com/saltstack/salt/pull/34902
.. _`#34906`: https://github.com/saltstack/salt/pull/34906
.. _`#34908`: https://github.com/saltstack/salt/issues/34908
.. _`#34910`: https://github.com/saltstack/salt/pull/34910
.. _`#34911`: https://github.com/saltstack/salt/pull/34911
.. _`#34915`: https://github.com/saltstack/salt/pull/34915
.. _`#34916`: https://github.com/saltstack/salt/pull/34916
.. _`#34923`: https://github.com/saltstack/salt/pull/34923
.. _`#34926`: https://github.com/saltstack/salt/pull/34926
.. _`#34927`: https://github.com/saltstack/salt/issues/34927
.. _`#34933`: https://github.com/saltstack/salt/pull/34933
.. _`#34935`: https://github.com/saltstack/salt/pull/34935
.. _`#34945`: https://github.com/saltstack/salt/issues/34945
.. _`#34946`: https://github.com/saltstack/salt/pull/34946
.. _`#34951`: https://github.com/saltstack/salt/pull/34951
.. _`#34955`: https://github.com/saltstack/salt/pull/34955
.. _`#34956`: https://github.com/saltstack/salt/pull/34956
.. _`#34957`: https://github.com/saltstack/salt/pull/34957
.. _`#34971`: https://github.com/saltstack/salt/pull/34971
.. _`#34976`: https://github.com/saltstack/salt/pull/34976
.. _`#34983`: https://github.com/saltstack/salt/pull/34983
.. _`#34987`: https://github.com/saltstack/salt/pull/34987
.. _`#34988`: https://github.com/saltstack/salt/pull/34988
.. _`#34991`: https://github.com/saltstack/salt/pull/34991
.. _`#34994`: https://github.com/saltstack/salt/pull/34994
.. _`#34996`: https://github.com/saltstack/salt/pull/34996
.. _`#34999`: https://github.com/saltstack/salt/issues/34999
.. _`#35000`: https://github.com/saltstack/salt/pull/35000
.. _`#35003`: https://github.com/saltstack/salt/issues/35003
.. _`#35008`: https://github.com/saltstack/salt/pull/35008
.. _`#35010`: https://github.com/saltstack/salt/issues/35010
.. _`#35011`: https://github.com/saltstack/salt/pull/35011
.. _`#35021`: https://github.com/saltstack/salt/pull/35021
.. _`#35024`: https://github.com/saltstack/salt/pull/35024
.. _`#35026`: https://github.com/saltstack/salt/pull/35026
.. _`#35029`: https://github.com/saltstack/salt/pull/35029
.. _`#35039`: https://github.com/saltstack/salt/pull/35039
.. _`#35043`: https://github.com/saltstack/salt/pull/35043
.. _`#35046`: https://github.com/saltstack/salt/pull/35046
.. _`#35050`: https://github.com/saltstack/salt/pull/35050
.. _`#35051`: https://github.com/saltstack/salt/issues/35051
.. _`#35054`: https://github.com/saltstack/salt/pull/35054
.. _`#35055`: https://github.com/saltstack/salt/pull/35055
.. _`#35059`: https://github.com/saltstack/salt/pull/35059
.. _`#35066`: https://github.com/saltstack/salt/pull/35066
.. _`#35078`: https://github.com/saltstack/salt/pull/35078
.. _`#35094`: https://github.com/saltstack/salt/issues/35094
.. _`#35102`: https://github.com/saltstack/salt/issues/35102
.. _`#35104`: https://github.com/saltstack/salt/pull/35104
.. _`#35105`: https://github.com/saltstack/salt/pull/35105
.. _`#35110`: https://github.com/saltstack/salt/pull/35110
.. _`#35114`: https://github.com/saltstack/salt/pull/35114
.. _`#35119`: https://github.com/saltstack/salt/pull/35119
.. _`#35120`: https://github.com/saltstack/salt/pull/35120
.. _`#35121`: https://github.com/saltstack/salt/issues/35121
.. _`#35131`: https://github.com/saltstack/salt/pull/35131
.. _`#35132`: https://github.com/saltstack/salt/pull/35132
.. _`#35133`: https://github.com/saltstack/salt/pull/35133
.. _`#35135`: https://github.com/saltstack/salt/pull/35135
.. _`#35136`: https://github.com/saltstack/salt/pull/35136
.. _`#35145`: https://github.com/saltstack/salt/pull/35145
.. _`#35146`: https://github.com/saltstack/salt/pull/35146
.. _`#35147`: https://github.com/saltstack/salt/pull/35147
.. _`#35150`: https://github.com/saltstack/salt/pull/35150
.. _`#35157`: https://github.com/saltstack/salt/pull/35157
.. _`#35165`: https://github.com/saltstack/salt/issues/35165
.. _`#35166`: https://github.com/saltstack/salt/issues/35166
.. _`#35173`: https://github.com/saltstack/salt/pull/35173
.. _`#35174`: https://github.com/saltstack/salt/pull/35174
.. _`#35178`: https://github.com/saltstack/salt/pull/35178
.. _`#35182`: https://github.com/saltstack/salt/pull/35182
.. _`#35196`: https://github.com/saltstack/salt/pull/35196
.. _`#35197`: https://github.com/saltstack/salt/pull/35197
.. _`#35202`: https://github.com/saltstack/salt/pull/35202
.. _`#35206`: https://github.com/saltstack/salt/pull/35206
.. _`#35207`: https://github.com/saltstack/salt/pull/35207
.. _`#35211`: https://github.com/saltstack/salt/pull/35211
.. _`#35213`: https://github.com/saltstack/salt/pull/35213
.. _`#35214`: https://github.com/saltstack/salt/issues/35214
.. _`#35225`: https://github.com/saltstack/salt/pull/35225
.. _`#35226`: https://github.com/saltstack/salt/issues/35226
.. _`#35227`: https://github.com/saltstack/salt/pull/35227
.. _`#35229`: https://github.com/saltstack/salt/pull/35229
.. _`#35232`: https://github.com/saltstack/salt/pull/35232
.. _`#35233`: https://github.com/saltstack/salt/pull/35233
.. _`#35234`: https://github.com/saltstack/salt/issues/35234
.. _`#35235`: https://github.com/saltstack/salt/pull/35235
.. _`#35236`: https://github.com/saltstack/salt/pull/35236
.. _`#35240`: https://github.com/saltstack/salt/pull/35240
.. _`#35241`: https://github.com/saltstack/salt/pull/35241
.. _`#35244`: https://github.com/saltstack/salt/pull/35244
.. _`#35245`: https://github.com/saltstack/salt/pull/35245
.. _`#35249`: https://github.com/saltstack/salt/pull/35249
.. _`#35253`: https://github.com/saltstack/salt/pull/35253
.. _`#35259`: https://github.com/saltstack/salt/pull/35259
.. _`#35264`: https://github.com/saltstack/salt/issues/35264
.. _`#35269`: https://github.com/saltstack/salt/pull/35269
.. _`#35271`: https://github.com/saltstack/salt/pull/35271
.. _`#35274`: https://github.com/saltstack/salt/pull/35274
.. _`#35275`: https://github.com/saltstack/salt/pull/35275
.. _`#35276`: https://github.com/saltstack/salt/pull/35276
.. _`#35278`: https://github.com/saltstack/salt/pull/35278
.. _`#35286`: https://github.com/saltstack/salt/pull/35286
.. _`#35290`: https://github.com/saltstack/salt/pull/35290
.. _`#35296`: https://github.com/saltstack/salt/issues/35296
.. _`#35301`: https://github.com/saltstack/salt/pull/35301
.. _`#35302`: https://github.com/saltstack/salt/pull/35302
.. _`#35306`: https://github.com/saltstack/salt/pull/35306
.. _`#35308`: https://github.com/saltstack/salt/pull/35308
.. _`#35309`: https://github.com/saltstack/salt/pull/35309
.. _`#35318`: https://github.com/saltstack/salt/pull/35318
.. _`#35323`: https://github.com/saltstack/salt/pull/35323
.. _`#35325`: https://github.com/saltstack/salt/pull/35325
.. _`#35329`: https://github.com/saltstack/salt/pull/35329
.. _`#35331`: https://github.com/saltstack/salt/pull/35331
.. _`#35334`: https://github.com/saltstack/salt/pull/35334
.. _`#35336`: https://github.com/saltstack/salt/issues/35336
.. _`#35339`: https://github.com/saltstack/salt/pull/35339
.. _`#35347`: https://github.com/saltstack/salt/pull/35347
.. _`#35352`: https://github.com/saltstack/salt/pull/35352
.. _`#35356`: https://github.com/saltstack/salt/pull/35356
.. _`#35357`: https://github.com/saltstack/salt/pull/35357
.. _`#35358`: https://github.com/saltstack/salt/pull/35358
.. _`#35359`: https://github.com/saltstack/salt/pull/35359
.. _`#35360`: https://github.com/saltstack/salt/pull/35360
.. _`#35361`: https://github.com/saltstack/salt/pull/35361
.. _`#35362`: https://github.com/saltstack/salt/pull/35362
.. _`#35373`: https://github.com/saltstack/salt/pull/35373
.. _`#35380`: https://github.com/saltstack/salt/issues/35380
.. _`#35384`: https://github.com/saltstack/salt/issues/35384
.. _`#35387`: https://github.com/saltstack/salt/issues/35387
.. _`#35393`: https://github.com/saltstack/salt/pull/35393
.. _`#35394`: https://github.com/saltstack/salt/pull/35394
.. _`#35395`: https://github.com/saltstack/salt/pull/35395
.. _`#35403`: https://github.com/saltstack/salt/issues/35403
.. _`#35406`: https://github.com/saltstack/salt/pull/35406
.. _`#35407`: https://github.com/saltstack/salt/pull/35407
.. _`#35411`: https://github.com/saltstack/salt/pull/35411
.. _`#35412`: https://github.com/saltstack/salt/pull/35412
.. _`#35413`: https://github.com/saltstack/salt/pull/35413
.. _`#35420`: https://github.com/saltstack/salt/issues/35420
.. _`#35422`: https://github.com/saltstack/salt/issues/35422
.. _`#35423`: https://github.com/saltstack/salt/issues/35423
.. _`#35427`: https://github.com/saltstack/salt/pull/35427
.. _`#35428`: https://github.com/saltstack/salt/pull/35428
.. _`#35429`: https://github.com/saltstack/salt/pull/35429
.. _`#35436`: https://github.com/saltstack/salt/pull/35436
.. _`#35442`: https://github.com/saltstack/salt/pull/35442
.. _`#35446`: https://github.com/saltstack/salt/pull/35446
.. _`#35447`: https://github.com/saltstack/salt/pull/35447
.. _`#35448`: https://github.com/saltstack/salt/pull/35448
.. _`#35449`: https://github.com/saltstack/salt/pull/35449
.. _`#35451`: https://github.com/saltstack/salt/pull/35451
.. _`#35453`: https://github.com/saltstack/salt/pull/35453
.. _`#35456`: https://github.com/saltstack/salt/pull/35456
.. _`#35458`: https://github.com/saltstack/salt/issues/35458
.. _`#35459`: https://github.com/saltstack/salt/pull/35459
.. _`#35460`: https://github.com/saltstack/salt/pull/35460
.. _`#35461`: https://github.com/saltstack/salt/pull/35461
.. _`#35463`: https://github.com/saltstack/salt/pull/35463
.. _`#35467`: https://github.com/saltstack/salt/pull/35467
.. _`#35471`: https://github.com/saltstack/salt/pull/35471
.. _`#35476`: https://github.com/saltstack/salt/pull/35476
.. _`#35483`: https://github.com/saltstack/salt/pull/35483
.. _`#35486`: https://github.com/saltstack/salt/pull/35486
.. _`#35487`: https://github.com/saltstack/salt/pull/35487
.. _`#35489`: https://github.com/saltstack/salt/pull/35489
.. _`#35492`: https://github.com/saltstack/salt/pull/35492
.. _`#35495`: https://github.com/saltstack/salt/pull/35495
.. _`#35497`: https://github.com/saltstack/salt/pull/35497
.. _`#35498`: https://github.com/saltstack/salt/pull/35498
.. _`#35508`: https://github.com/saltstack/salt/pull/35508
.. _`#35510`: https://github.com/saltstack/salt/pull/35510
.. _`#35512`: https://github.com/saltstack/salt/pull/35512
.. _`#35513`: https://github.com/saltstack/salt/pull/35513
.. _`#35516`: https://github.com/saltstack/salt/pull/35516
.. _`#35517`: https://github.com/saltstack/salt/pull/35517
.. _`#35522`: https://github.com/saltstack/salt/pull/35522
.. _`#35525`: https://github.com/saltstack/salt/pull/35525
.. _`#35526`: https://github.com/saltstack/salt/pull/35526
.. _`#35538`: https://github.com/saltstack/salt/pull/35538
.. _`#35540`: https://github.com/saltstack/salt/pull/35540
.. _`#35545`: https://github.com/saltstack/salt/pull/35545
.. _`#35546`: https://github.com/saltstack/salt/pull/35546
.. _`#35566`: https://github.com/saltstack/salt/pull/35566
.. _`#35571`: https://github.com/saltstack/salt/pull/35571
.. _`#35572`: https://github.com/saltstack/salt/pull/35572
.. _`#35573`: https://github.com/saltstack/salt/pull/35573
.. _`#35577`: https://github.com/saltstack/salt/pull/35577
.. _`#35579`: https://github.com/saltstack/salt/pull/35579
.. _`#35580`: https://github.com/saltstack/salt/pull/35580
.. _`#35583`: https://github.com/saltstack/salt/pull/35583
.. _`#35586`: https://github.com/saltstack/salt/pull/35586
.. _`bp-25276`: https://github.com/saltstack/salt/pull/25276
.. _`bp-28521`: https://github.com/saltstack/salt/pull/28521
.. _`bp-31677`: https://github.com/saltstack/salt/pull/31677
.. _`bp-33518`: https://github.com/saltstack/salt/pull/33518
.. _`bp-33875`: https://github.com/saltstack/salt/pull/33875
.. _`bp-34441`: https://github.com/saltstack/salt/pull/34441
.. _`bp-34502`: https://github.com/saltstack/salt/pull/34502
.. _`bp-34835`: https://github.com/saltstack/salt/pull/34835
.. _`bp-35039`: https://github.com/saltstack/salt/pull/35039
.. _`bp-35119`: https://github.com/saltstack/salt/pull/35119
.. _`bp-35213`: https://github.com/saltstack/salt/pull/35213
.. _`bp-35225`: https://github.com/saltstack/salt/pull/35225
.. _`bp-35463`: https://github.com/saltstack/salt/pull/35463
.. _`fix-34425`: https://github.com/saltstack/salt/issues/34425
.. _`fix-34890`: https://github.com/saltstack/salt/issues/34890
.. _`fix-34893`: https://github.com/saltstack/salt/issues/34893
.. _`fix-35094`: https://github.com/saltstack/salt/issues/35094
.. _`fix-35165`: https://github.com/saltstack/salt/issues/35165
.. _`fix-35336`: https://github.com/saltstack/salt/issues/35336
.. _`fix-35384`: https://github.com/saltstack/salt/issues/35384
.. _`fix-35420`: https://github.com/saltstack/salt/issues/35420
.. _`fix-35422`: https://github.com/saltstack/salt/issues/35422
.. _`fix-35458`: https://github.com/saltstack/salt/issues/35458

View File

@ -798,7 +798,7 @@ server via SSH:
.. code-block:: bash
$ su
$ su -
Password:
# ssh github.com
The authenticity of host 'github.com (192.30.252.128)' can't be established.
@ -814,11 +814,11 @@ Verifying the Fingerprint
~~~~~~~~~~~~~~~~~~~~~~~~~
To verify that the correct fingerprint was added, it is a good idea to look it
up. One way to do this is to use nmap:
up. One way to do this is to use ``nmap``:
.. code-block:: bash
$ nmap github.com --script ssh-hostkey
$ nmap -p 22 github.com --script ssh-hostkey
Starting Nmap 5.51 ( http://nmap.org ) at 2014-08-18 17:47 CDT
Nmap scan report for github.com (192.30.252.129)
@ -834,13 +834,24 @@ up. One way to do this is to use nmap:
Nmap done: 1 IP address (1 host up) scanned in 28.78 seconds
Another way is to check one's own known_hosts file, using this one-liner:
Another way is to check one's own ``known_hosts`` file, using this one-liner:
.. code-block:: bash
$ ssh-keygen -l -f /dev/stdin <<<`ssh-keyscan -t rsa github.com 2>/dev/null` | awk '{print $2}'
$ ssh-keygen -l -f /dev/stdin <<<`ssh-keyscan github.com 2>/dev/null` | awk '{print $2}'
16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48
.. warning::
AWS tracks usage of nmap and may flag it as abuse. On AWS hosts, the
``ssh-keygen`` method is recommended for host key verification.
.. note::
As of `OpenSSH 6.8`_ the SSH fingerprint is now shown as a base64-encoded
SHA256 checksum of the host key. So, instead of the fingerprint looking
like ``16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48``, it would look
like ``SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8``.
.. _`OpenSSH 6.8`: http://www.openssh.com/txt/release-6.8
Refreshing gitfs Upon Push
==========================

View File

@ -3,7 +3,7 @@ Description=The Salt API
After=network.target
[Service]
Type=simple
Type=notify
LimitNOFILE=8192
ExecStart=/usr/bin/salt-api
TimeoutStopSec=3

View File

@ -3,10 +3,9 @@ Description=The Salt Minion
After=network.target
[Service]
Type=simple
Type=notify
LimitNOFILE=8192
ExecStart=/usr/bin/salt-minion
KillMode=process
[Install]
WantedBy=multi-user.target

View File

@ -3,7 +3,7 @@ Description=The Salt Master Server
After=network.target
[Service]
Type=simple
Type=notify
LimitNOFILE=8192
ExecStart=/usr/bin/salt-syndic

View File

@ -55,6 +55,7 @@ class Batch(object):
self.pub_kwargs['yield_pub_data'] = True
ping_gen = self.local.cmd_iter(*args, **self.pub_kwargs)
# Broadcast to targets
fret = set()
nret = set()
try:
@ -69,7 +70,9 @@ class Batch(object):
fret.add(m)
return (list(fret), ping_gen, nret.difference(fret))
except StopIteration:
raise salt.exceptions.SaltClientError('No minions matched the target.')
if not self.quiet:
print_cli('No minions matched the target.')
return list(fret), ping_gen
def get_bnum(self):
'''
@ -109,6 +112,9 @@ class Batch(object):
'list',
]
bnum = self.get_bnum()
# No targets to run
if not self.minions:
return
to_run = copy.deepcopy(self.minions)
active = []
ret = {}

View File

@ -1418,8 +1418,8 @@ class AESFuncs(object):
# Format individual return loads
for key, item in six.iteritems(load['return']):
ret = {'jid': load['jid'],
'id': key,
'return': item}
'id': key}
ret.update(item)
if 'master_id' in load:
ret['master_id'] = load['master_id']
if 'fun' in load:

View File

@ -2510,34 +2510,33 @@ class SyndicManager(MinionBase):
def _process_event(self, raw):
# TODO: cleanup: Move down into event class
mtag, data = self.local.event.unpack(raw, self.local.event.serial)
event = {'data': data, 'tag': mtag}
log.trace('Got event {0}'.format(event['tag'])) # pylint: disable=no-member
log.trace('Got event {0}'.format(mtag)) # pylint: disable=no-member
tag_parts = event['tag'].split('/')
tag_parts = mtag.split('/')
if len(tag_parts) >= 4 and tag_parts[1] == 'job' and \
salt.utils.jid.is_jid(tag_parts[2]) and tag_parts[3] == 'ret' and \
'return' in event['data']:
if 'jid' not in event['data']:
'return' in data:
if 'jid' not in data:
# Not a job return
return
if self.syndic_mode == 'cluster' and event['data'].get('master_id', 0) == self.opts.get('master_id', 1):
if self.syndic_mode == 'cluster' and data.get('master_id', 0) == self.opts.get('master_id', 1):
log.debug('Return received with matching master_id, not forwarding')
return
master = event['data'].get('master_id')
jdict = self.job_rets.setdefault(master, {}).setdefault(event['tag'], {})
master = data.get('master_id')
jdict = self.job_rets.setdefault(master, {}).setdefault(mtag, {})
if not jdict:
jdict['__fun__'] = event['data'].get('fun')
jdict['__jid__'] = event['data']['jid']
jdict['__fun__'] = data.get('fun')
jdict['__jid__'] = data['jid']
jdict['__load__'] = {}
fstr = '{0}.get_load'.format(self.opts['master_job_cache'])
# Only need to forward each load once. Don't hit the disk
# for every minion return!
if event['data']['jid'] not in self.jid_forward_cache:
if data['jid'] not in self.jid_forward_cache:
jdict['__load__'].update(
self.mminion.returners[fstr](event['data']['jid'])
self.mminion.returners[fstr](data['jid'])
)
self.jid_forward_cache.add(event['data']['jid'])
self.jid_forward_cache.add(data['jid'])
if len(self.jid_forward_cache) > self.opts['syndic_jid_forward_cache_hwm']:
# Pop the oldest jid from the cache
tmp = sorted(list(self.jid_forward_cache))
@ -2546,15 +2545,19 @@ class SyndicManager(MinionBase):
if master is not None:
# __'s to make sure it doesn't print out on the master cli
jdict['__master_id__'] = master
jdict[event['data']['id']] = event['data']['return']
ret = {}
for key in 'return', 'retcode', 'success':
if key in data:
ret[key] = data[key]
jdict[data['id']] = ret
else:
# TODO: config to forward these? If so we'll have to keep track of who
# has seen them
# if we are the top level masters-- don't forward all the minion events
if self.syndic_mode == 'sync':
# Add generic event aggregation here
if 'retcode' not in event['data']:
self.raw_events.append(event)
if 'retcode' not in data:
self.raw_events.append({'data': data, 'tag': mtag})
def _forward_events(self):
log.trace('Forwarding events') # pylint: disable=no-member

View File

@ -84,7 +84,10 @@ import ssl
# Import Salt Libs
from salt.exceptions import CommandExecutionError
from salt.ext import six
import salt.ext.six as six
from salt.ext.six.moves import range
SSL_VERSION = 'ssl_version'
SSL_VERSION = 'ssl_version'
@ -97,7 +100,8 @@ try:
# pylint: disable=import-error,no-name-in-module
from cassandra.cluster import Cluster
from cassandra.cluster import NoHostAvailable
from cassandra.connection import ConnectionException, ConnectionShutdown
from cassandra.connection import ConnectionException, \
ConnectionShutdown, OperationTimedOut
from cassandra.auth import PlainTextAuthProvider
from cassandra.query import dict_factory
# pylint: enable=import-error,no-name-in-module
@ -118,6 +122,10 @@ def __virtual__():
return (False, 'Cannot load cassandra_cql module: python driver not found')
def _async_log_errors(errors):
log.error('Cassandra_cql async call returned: {0}'.format(errors))
def _load_properties(property_name, config_option, set_default=False, default=None):
'''
Load properties for the cassandra module from config or pillar.
@ -220,6 +228,7 @@ def _connect(contact_points=None, port=None, cql_user=None, cql_pass=None,
and 'cassandra_cql_returner_session' in __context__):
return __context__['cassandra_cql_returner_cluster'], __context__['cassandra_cql_returner_session']
else:
contact_points = _load_properties(property_name=contact_points, config_option='cluster')
contact_points = contact_points if isinstance(contact_points, list) else contact_points.split(',')
port = _load_properties(property_name=port, config_option='port', set_default=True, default=9042)
@ -233,18 +242,31 @@ def _connect(contact_points=None, port=None, cql_user=None, cql_pass=None,
auth_provider = PlainTextAuthProvider(username=cql_user, password=cql_pass)
ssl_opts = _get_ssl_opts()
if ssl_opts:
cluster = Cluster(contact_points, port=port,
cluster = Cluster(contact_points,
port=port,
auth_provider=auth_provider,
ssl_options=ssl_opts,
protocol_version=protocol_version)
protocol_version=protocol_version,
compression=True)
else:
cluster = Cluster(contact_points, port=port,
auth_provider=auth_provider,
protocol_version=protocol_version)
session = cluster.connect()
protocol_version=protocol_version,
compression=True)
for recontimes in range(1, 4):
try:
session = cluster.connect()
break
except OperationTimedOut:
log.warning('Cassandra cluster.connect timed out, try {0}'.format(recontimes))
if recontimes >= 3:
raise
# TODO: Call cluster.shutdown() when the module is unloaded on shutdown.
__context__['cassandra_cql_returner_cluster'] = cluster
__context__['cassandra_cql_returner_session'] = session
__context__['cassandra_cql_prepared'] = {}
log.debug('Successfully connected to Cassandra cluster at {0}'.format(contact_points))
return cluster, session
except TypeError:
@ -308,6 +330,92 @@ def cql_query(query, contact_points=None, port=None, cql_user=None, cql_pass=Non
return ret
def cql_query_with_prepare(query, statement_name, statement_arguments, async=False,
callback_errors=None,
contact_points=None, port=None, cql_user=None, cql_pass=None):
'''
Run a query on a Cassandra cluster and return a dictionary.
This function should not be used asynchronously for SELECTs -- it will not
return anything and we don't currently have a mechanism for handling a future
that will return results.
:param query: The query to execute.
:type query: str
:param statement_name: Name to assign the prepared statement in the __context__ dictionary
:type statement_name: str
:param statement_arguments: Bind parameters for the SQL statement
:type statement_arguments: list[str]
:param async: Run this query in asynchronous mode
:type async: bool
:param callback_errors: Function to call after query runs if there is an error
:type callback_errors: Function callable
:param contact_points: The Cassandra cluster addresses, can either be a string or a list of IPs.
:type contact_points: str | list[str]
:param cql_user: The Cassandra user if authentication is turned on.
:type cql_user: str
:param cql_pass: The Cassandra user password if authentication is turned on.
:type cql_pass: str
:param port: The Cassandra cluster port, defaults to None.
:type port: int
:param params: The parameters for the query, optional.
:type params: str
:return: A dictionary from the return values of the query
:rtype: list[dict]
'''
try:
cluster, session = _connect(contact_points=contact_points, port=port,
cql_user=cql_user, cql_pass=cql_pass)
except CommandExecutionError:
log.critical('Could not get Cassandra cluster session.')
raise
except BaseException as e:
log.critical('Unexpected error while getting Cassandra cluster session: {0}'.format(str(e)))
raise
if statement_name not in __context__['cassandra_cql_prepared']:
try:
bound_statement = session.prepare(query)
__context__['cassandra_cql_prepared'][statement_name] = bound_statement
except BaseException as e:
log.critical('Unexpected error while preparing SQL statement: {0}'.format(str(e)))
raise
else:
bound_statement = __context__['cassandra_cql_prepared'][statement_name]
session.row_factory = dict_factory
ret = []
try:
if async:
future_results = session.execute_async(bound_statement.bind(statement_arguments))
# future_results.add_callbacks(_async_log_errors)
else:
results = session.execute(bound_statement.bind(statement_arguments))
except BaseException as e:
log.error('Failed to execute query: {0}\n reason: {1}'.format(query, str(e)))
msg = "ERROR: Cassandra query failed: {0} reason: {1}".format(query, str(e))
raise CommandExecutionError(msg)
if not async and results:
for result in results:
values = {}
for key, value in six.iteritems(result):
# Salt won't return dictionaries with odd types like uuid.UUID
if not isinstance(value, six.text_type):
# Must support Cassandra collection types.
# Namely, Cassandras set, list, and map collections.
if not isinstance(value, (set, list, dict)):
value = str(value)
values[key] = value
ret.append(values)
# If this was a synchronous call, then we either have a empty list
# because there was no return, or we have a return
# If this was an async call we only return the empty list
return ret
def version(contact_points=None, port=None, cql_user=None, cql_pass=None):
'''
Show the Cassandra version.

View File

@ -71,9 +71,15 @@ def _available_services():
for launch_dir in _launchd_paths():
for root, dirs, files in os.walk(launch_dir):
for file_name in files:
file_path = os.path.join(root, file_name)
# Must be a plist file
if not file_name.endswith('.plist'):
continue
# Follow symbolic links of files in _launchd_paths
file_path = os.path.join(root, file_name)
true_path = os.path.realpath(file_path)
# ignore broken symlinks
if not os.path.exists(true_path):
continue
@ -89,19 +95,24 @@ def _available_services():
# the system provided plutil program to do the conversion
cmd = '/usr/bin/plutil -convert xml1 -o - -- "{0}"'.format(
true_path)
plist_xml = __salt__['cmd.run'](
cmd, python_shell=False, output_loglevel='trace')
plist_xml = __salt__['cmd.run'](cmd, output_loglevel='quiet')
if six.PY2:
plist = plistlib.readPlistFromString(plist_xml)
else:
plist = plistlib.readPlistFromBytes(
salt.utils.to_bytes(plist_xml))
available_services[plist.Label.lower()] = {
'file_name': file_name,
'file_path': true_path,
'plist': plist,
}
try:
available_services[plist.Label.lower()] = {
'file_name': file_name,
'file_path': true_path,
'plist': plist}
except AttributeError:
# Handle malformed plist files
available_services[os.path.basename(file_name).lower()] = {
'file_name': file_name,
'file_path': true_path,
'plist': plist}
return available_services

View File

@ -359,15 +359,10 @@ def build_schedule_item(name, **kwargs):
schedule[name]['splay'] = kwargs['splay']
for item in ['range', 'when', 'once', 'once_fmt', 'cron', 'returner',
'return_config', 'return_kwargs', 'until', 'enabled']:
'return_config', 'return_kwargs', 'until', 'run_on_start']:
if item in kwargs:
schedule[name][item] = kwargs[item]
# if enabled is not included in the job,
# assume job is enabled.
if 'enabled' not in kwargs:
schedule[name]['enabled'] = True
return schedule[name]

View File

@ -141,12 +141,15 @@ def output(data):
if 'data' in data:
data = data.pop('data')
for host, hostdata in six.iteritems(data):
if not isinstance(hostdata, dict):
# Highstate return data must be a dict, if this is not the case
# then this value is likely a retcode.
continue
return _format_host(host, hostdata)[0]
ret = [
_format_host(host, hostdata)[0]
for host, hostdata in six.iteritems(data)
# Highstate return data must be a dict, if this is not the case
# then this value is likely a retcode.
if isinstance(hostdata, dict)
]
if ret:
return "\n".join(ret)
log.error(
'Data passed to highstate outputter is not a valid highstate return: %s',
data

View File

@ -88,6 +88,33 @@ To use the cassandra returner, append '--return cassandra_cql' to the salt comma
.. code-block:: bash
salt '*' test.ping --return_cql cassandra
Note: if your Cassandra instance has not been tuned much you may benefit from
altering some timeouts in `cassandra.yaml` like so:
.. code-block:: bash
# How long the coordinator should wait for read operations to complete
read_request_timeout_in_ms: 5000
# How long the coordinator should wait for seq or index scans to complete
range_request_timeout_in_ms: 20000
# How long the coordinator should wait for writes to complete
write_request_timeout_in_ms: 20000
# How long the coordinator should wait for counter writes to complete
counter_write_request_timeout_in_ms: 10000
# How long a coordinator should continue to retry a CAS operation
# that contends with other proposals for the same row
cas_contention_timeout_in_ms: 5000
# How long the coordinator should wait for truncates to complete
# (This can be much longer, because unless auto_snapshot is disabled
# we need to flush first so we can snapshot before removing the data.)
truncate_request_timeout_in_ms: 60000
# The default timeout for other, miscellaneous operations
request_timeout_in_ms: 20000
As always, your mileage may vary and your Cassandra cluster may have different
needs. SaltStack has seen situations where these timeouts can resolve
some stacktraces that appear to come from the Datastax Python driver.
'''
from __future__ import absolute_import
# Let's not allow PyLint complain about string substitution
@ -159,21 +186,24 @@ def returner(ret):
'''
query = '''INSERT INTO salt.salt_returns (
jid, minion_id, fun, alter_time, full_ret, return, success
) VALUES (
'{0}', '{1}', '{2}', '{3}', '{4}', '{5}', {6}
);'''.format(
ret['jid'],
ret['id'],
ret['fun'],
int(time.time() * 1000),
json.dumps(ret).replace("'", "''"),
json.dumps(ret['return']).replace("'", "''"),
ret.get('success', False)
)
) VALUES (?, ?, ?, ?, ?, ?, ?)'''
statement_arguments = []
statement_arguments.append('{0}'.format(ret['jid']))
statement_arguments.append('{0}'.format(ret['id']))
statement_arguments.append('{0}'.format(ret['fun']))
statement_arguments.append(int(time.time() * 1000))
statement_arguments.append('{0}'.format(json.dumps(ret).replace("'", "''")))
statement_arguments.append('{0}'.format(json.dumps(ret['return']).replace("'", "''")))
statement_arguments.append(ret.get('success', False))
# cassandra_cql.cql_query may raise a CommandExecutionError
try:
__salt__['cassandra_cql.cql_query'](query)
__salt__['cassandra_cql.cql_query_with_prepare'](query,
'returner_return',
tuple(statement_arguments),
async=True)
except CommandExecutionError:
log.critical('Could not insert into salt_returns with Cassandra returner.')
raise
@ -185,13 +215,19 @@ def returner(ret):
# The data in salt.minions will be used by get_fun and get_minions
query = '''INSERT INTO salt.minions (
minion_id, last_fun
) VALUES (
'{0}', '{1}'
);'''.format(ret['id'], ret['fun'])
) VALUES (?, ?)'''
statement_arguments = []
statement_arguments.append('{0}'.format(ret['id']))
statement_arguments.append('{0}'.format(ret['fun']))
# cassandra_cql.cql_query may raise a CommandExecutionError
try:
__salt__['cassandra_cql.cql_query'](query)
__salt__['cassandra_cql.cql_query_with_prepare'](query,
'returner_minion',
tuple(statement_arguments),
async=True)
except CommandExecutionError:
log.critical('Could not store minion ID with Cassandra returner.')
raise
@ -218,16 +254,19 @@ def event_return(events):
query = '''INSERT INTO salt.salt_events (
id, alter_time, data, master_id, tag
) VALUES (
{0}, {1}, '{2}', '{3}', '{4}'
);'''.format(str(uuid.uuid1()),
int(time.time() * 1000),
json.dumps(data).replace("'", "''"),
__opts__['id'],
tag)
?, ?, ?, ?, ?)
'''
statement_arguments = [str(uuid.uuid1()),
int(time.time() * 1000),
json.dumps(data).replace("'", "''"),
__opts__['id'],
tag]
# cassandra_cql.cql_query may raise a CommandExecutionError
try:
__salt__['cassandra_cql.cql_query'](query)
__salt__['cassandra_cql.cql_query_with_prepare'](query, 'salt_events',
statement_arguments,
async=True)
except CommandExecutionError:
log.critical('Could not store events with Cassandra returner.')
raise
@ -245,13 +284,18 @@ def save_load(jid, load, minions=None):
# json.dumps(load) must be escaped Cassandra style.
query = '''INSERT INTO salt.jids (
jid, load
) VALUES (
'{0}', '{1}'
);'''.format(jid, json.dumps(load).replace("'", "''"))
) VALUES (?, ?)'''
statement_arguments = [
jid,
json.dumps(load).replace("'", "''")
]
# cassandra_cql.cql_query may raise a CommandExecutionError
try:
__salt__['cassandra_cql.cql_query'](query)
__salt__['cassandra_cql.cql_query_with_prepare'](query, 'save_load',
statement_arguments,
async=True)
except CommandExecutionError:
log.critical('Could not save load in jids table.')
raise
@ -272,13 +316,13 @@ def get_load(jid):
'''
Return the load data that marks a specified jid
'''
query = '''SELECT load FROM salt.jids WHERE jid = '{0}';'''.format(jid)
query = '''SELECT load FROM salt.jids WHERE jid = ?;'''
ret = {}
# cassandra_cql.cql_query may raise a CommandExecutionError
try:
data = __salt__['cassandra_cql.cql_query'](query)
data = __salt__['cassandra_cql.cql_query_with_prepare'](query, 'get_load', [jid])
if data:
load = data[0].get('load')
if load:
@ -298,13 +342,13 @@ def get_jid(jid):
'''
Return the information returned when the specified job id was executed
'''
query = '''SELECT minion_id, full_ret FROM salt.salt_returns WHERE jid = '{0}';'''.format(jid)
query = '''SELECT minion_id, full_ret FROM salt.salt_returns WHERE jid = ?;'''
ret = {}
# cassandra_cql.cql_query may raise a CommandExecutionError
try:
data = __salt__['cassandra_cql.cql_query'](query)
data = __salt__['cassandra_cql.cql_query_with_prepare'](query, 'get_jid', [jid])
if data:
for row in data:
minion = row.get('minion_id')
@ -326,13 +370,13 @@ def get_fun(fun):
'''
Return a dict of the last function called for all minions
'''
query = '''SELECT minion_id, last_fun FROM salt.minions where last_fun = '{0}';'''.format(fun)
query = '''SELECT minion_id, last_fun FROM salt.minions where last_fun = ?;'''
ret = {}
# cassandra_cql.cql_query may raise a CommandExecutionError
try:
data = __salt__['cassandra_cql.cql_query'](query)
data = __salt__['cassandra_cql.cql_query'](query, 'get_fun', [fun])
if data:
for row in data:
minion = row.get('minion_id')

View File

@ -28,6 +28,9 @@ Ensure a Linux ACL does not exist
# Import Python libs
from __future__ import absolute_import
# Import python libs
import os
# Import salt libs
import salt.utils
@ -58,6 +61,11 @@ def present(name, acl_type, acl_name='', perms='', recurse=False):
_octal = {'r': 4, 'w': 2, 'x': 1, '-': 0}
if not os.path.exists(name):
ret['comment'] = '{0} does not exist'.format(name)
ret['result'] = False
return ret
__current_perms = __salt__['acl.getfacl'](name)
if acl_type.startswith(('d:', 'default:')):
@ -97,10 +105,7 @@ def present(name, acl_type, acl_name='', perms='', recurse=False):
ret['result'] = None
return ret
if recurse:
__salt__['acl.modfacl'](acl_type, acl_name, perms, name, recursive=True)
else:
__salt__['acl.modfacl'](acl_type, acl_name, perms, name)
__salt__['acl.modfacl'](acl_type, acl_name, perms, name, recursive=recurse)
else:
ret['comment'] = 'Permissions will be applied'
@ -108,10 +113,7 @@ def present(name, acl_type, acl_name='', perms='', recurse=False):
ret['result'] = None
return ret
if recurse:
__salt__['acl.modfacl'](acl_type, acl_name, perms, name, recursive=True)
else:
__salt__['acl.modfacl'](acl_type, acl_name, perms, name)
__salt__['acl.modfacl'](acl_type, acl_name, perms, name, recursive=recurse)
else:
ret['comment'] = 'ACL Type does not exist'
ret['result'] = False
@ -128,6 +130,11 @@ def absent(name, acl_type, acl_name='', perms='', recurse=False):
'changes': {},
'comment': ''}
if not os.path.exists(name):
ret['comment'] = '{0} does not exist'.format(name)
ret['result'] = False
return ret
__current_perms = __salt__['acl.getfacl'](name)
if acl_type.startswith(('d:', 'default:')):
@ -164,10 +171,7 @@ def absent(name, acl_type, acl_name='', perms='', recurse=False):
ret['result'] = None
return ret
if recurse:
__salt__['acl.delfacl'](acl_type, acl_name, perms, name, recursive=True)
else:
__salt__['acl.delfacl'](acl_type, acl_name, perms, name)
__salt__['acl.delfacl'](acl_type, acl_name, perms, name, recursive=recurse)
else:
ret['comment'] = 'Permissions are in the desired state'

View File

@ -117,6 +117,10 @@ def present(name,
using the crontab format.
Requires python-croniter.
run_on_start
Whether the job will run when Salt minion start. Value should be
a boolean.
function
The function that should be executed by the scheduled job.

View File

@ -83,7 +83,7 @@ def capability_installed(name,
status = __salt__['dism.add_capability'](
name, source, limit_access, image, restart)
if status['retcode'] != 0:
if status['retcode'] not in [0, 1641, 3010]:
ret['comment'] = 'Failed to install {0}: {1}'\
.format(name, status['stdout'])
ret['result'] = False
@ -139,7 +139,7 @@ def capability_removed(name, image=None, restart=False):
# Remove the capability
status = __salt__['dism.remove_capability'](name, image, restart)
if status['retcode'] != 0:
if status['retcode'] not in [0, 1641, 3010]:
ret['comment'] = 'Failed to remove {0}: {1}' \
.format(name, status['stdout'])
ret['result'] = False
@ -210,7 +210,7 @@ def feature_installed(name,
status = __salt__['dism.add_feature'](
name, package, source, limit_access, enable_parent, image, restart)
if status['retcode'] != 0:
if status['retcode'] not in [0, 1641, 3010]:
ret['comment'] = 'Failed to install {0}: {1}' \
.format(name, status['stdout'])
ret['result'] = False
@ -270,7 +270,7 @@ def feature_removed(name, remove_payload=False, image=None, restart=False):
status = __salt__['dism.remove_feature'](
name, remove_payload, image, restart)
if status['retcode'] != 0:
if status['retcode'] not in [0, 1641, 3010]:
ret['comment'] = 'Failed to remove {0}: {1}' \
.format(name, status['stdout'])
ret['result'] = False
@ -338,7 +338,7 @@ def package_installed(name,
status = __salt__['dism.add_package'](
name, ignore_check, prevent_pending, image, restart)
if status['retcode'] != 0:
if status['retcode'] not in [0, 1641, 3010]:
ret['comment'] = 'Failed to install {0}: {1}' \
.format(name, status['stdout'])
ret['result'] = False
@ -407,7 +407,7 @@ def package_removed(name, image=None, restart=False):
# Remove the package
status = __salt__['dism.remove_package'](name, image, restart)
if status['retcode'] != 0:
if status['retcode'] not in [0, 1641, 3010]:
ret['comment'] = 'Failed to remove {0}: {1}' \
.format(name, status['stdout'])
ret['result'] = False

View File

@ -17,9 +17,10 @@ log = logging.getLogger(__name__)
def booted(context=None):
'''
Return True if the system was booted with systemd, False otherwise.
Pass in the loader context "__context__", this function will set the
systemd.sd_booted key to represent if systemd is running
Return True if the system was booted with systemd, False otherwise. If the
loader context dict ``__context__`` is passed, this function will set the
``salt.utils.systemd.booted`` key to represent if systemd is running and
keep the logic below from needing to be run again during the same salt run.
'''
contextkey = 'salt.utils.systemd.booted'
if isinstance(context, dict):

View File

@ -0,0 +1,6 @@
cmd_run_unless_multiple:
cmd.run:
- name: echo "hello"
- unless:
- /bin/true
- /bin/false

View File

@ -73,6 +73,22 @@ class CMDRunRedirectTest(integration.ModuleCase,
ret = self.run_function('state.sls', [self.state_name])
self.assertTrue(ret[state_key]['result'])
def test_run_unless_multiple_cmds(self):
'''
test cmd.run using multiple unless options where the first cmd in the
list will pass, but the second will fail. This tests the fix for issue
#35384. (The fix is in PR #35545.)
'''
sls = self.run_function('state.sls', mods='issue-35384')
self.assertSaltTrueReturn(sls)
# We must assert against the comment here to make sure the comment reads that the
# command "echo "hello"" was run. This ensures that we made it to the last unless
# command in the state. If the comment reads "unless execution succeeded", or similar,
# then the unless state run bailed out after the first unless command succeeded,
# which is the bug we're regression testing for.
self.assertEqual(sls['cmd_|-cmd_run_unless_multiple_|-echo "hello"_|-run']['comment'],
'Command "echo "hello"" run')
def test_run_creates_exists(self):
'''
test cmd.run creates already there

View File

@ -119,7 +119,7 @@ class LinuxSysctlTestCase(TestCase):
{'cmd.run_stdout': mock_sys_cmd,
'cmd.run_all': mock_asn_cmd}):
with patch.dict(systemd.__context__,
{'systemd.sd_booted': True}):
{'salt.utils.systemd.booted': True}):
linux_sysctl.persist('net.ipv4.ip_forward', 1)
helper_open = m_open()
helper_open.write.assert_called_once_with(
@ -143,7 +143,7 @@ class LinuxSysctlTestCase(TestCase):
{'cmd.run_stdout': mock_sys_cmd,
'cmd.run_all': mock_asn_cmd}):
with patch.dict(systemd.__context__,
{'systemd.sd_booted': True}):
{'salt.utils.systemd.booted': True}):
self.assertEqual(linux_sysctl.persist(
'net.ipv4.ip_forward', 1), 'Updated')

View File

@ -58,7 +58,7 @@ class LocalemodTestCase(TestCase):
self.assertEqual('A', localemod.get_locale())
localemod._parse_localectl.assert_called_once_with()
with patch.dict(localemod.__context__, {'systemd.sd_booted': False}):
with patch.dict(localemod.__context__, {'salt.utils.systemd.booted': False}):
with patch.dict(localemod.__grains__, {'os_family': ['Gentoo']}):
with patch.dict(localemod.__salt__, {'cmd.run': MagicMock(return_value='A')}):
with patch.object(localemod,
@ -85,7 +85,7 @@ class LocalemodTestCase(TestCase):
with patch.object(localemod, '_localectl_set', return_value=True):
self.assertTrue(localemod.set_locale('l'))
with patch.dict(localemod.__context__, {'systemd.sd_booted': False}):
with patch.dict(localemod.__context__, {'salt.utils.systemd.booted': False}):
with patch.dict(localemod.__grains__, {'os_family': ['Gentoo']}):
with patch.dict(localemod.__salt__, {'cmd.retcode': MagicMock(return_value='A')}):
with patch.object(localemod,