Hello community,

here is the log from the commit of package salt for openSUSE:Factory checked in 
at 2018-08-02 14:55:36
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/salt (Old)
 and      /work/SRC/openSUSE:Factory/.salt.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "salt"

Thu Aug  2 14:55:36 2018 rev:79 rq:626474 version:2018.3.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/salt/salt.changes        2018-05-17 
18:07:15.487843746 +0200
+++ /work/SRC/openSUSE:Factory/.salt.new/salt.changes   2018-08-02 
14:55:43.928034731 +0200
@@ -1,0 +2,55 @@
+Mon Jul 30 10:42:01 UTC 2018 - [email protected]
+
+- Update to 2018.3.2
+  See https://docs.saltstack.com/en/latest/topics/releases/2018.3.2.html
+  for full changelog
+
+- Added:
+  * accounting-for-when-files-in-an-archive-contain-non-.patch
+  * add-all_versions-parameter-to-include-all-installed-.patch
+  * add-custom-suse-capabilities-as-grains.patch
+  * add-engine-relaying-libvirt-events.patch
+  * add-environment-variable-to-know-if-yum-is-invoked-f.patch
+  * add-other-attribute-to-gecos-fields-to-avoid-inconsi.patch
+  * align-suse-salt-master.service-limitnofiles-limit-wi.patch
+  * avoid-incomprehensive-message-if-crashes.patch
+  * fix-deprecation-warning-bsc-1095507.patch
+  * fix-diffing-binary-files-in-file.get_diff-bsc-109839.patch
+  * fix-unboundlocalerror-in-file.get_diff.patch
+  * fix-zypper.list_pkgs-to-be-aligned-with-pkg-state.patch
+  * prevent-zypper-from-parsing-repo-configuration-from-.patch
+  * remove-old-hack-when-reporting-multiversion-packages.patch
+  * show-recommendations-for-salt-ssh-cross-version-pyth.patch
+
+- Modified:
+  * activate-all-beacons-sources-config-pillar-grains.patch
+  * add-saltssh-multi-version-support-across-python-inte.patch
+  * avoid-excessive-syslogging-by-watchdog-cronjob-58.patch
+  * do-not-override-jid-on-returners-only-sending-back-t.patch
+  * enable-passing-a-unix_socket-for-mysql-returners-bsc.patch
+  * fall-back-to-pymysql.patch
+  * feat-add-grain-for-all-fqdns.patch
+  * fix-bsc-1065792.patch
+  * fix-decrease-loglevel-when-unable-to-resolve-addr.patch
+  * fix-for-ec2-rate-limit-failures.patch
+  * fix-for-errno-0-resolver-error-0-no-error-bsc-108758.patch
+  * fixed-usage-of-ipaddress.patch
+  * option-to-merge-current-pillar-with-opts-pillar-duri.patch
+  * run-salt-api-as-user-salt-bsc-1064520.patch
+  * run-salt-master-as-dedicated-salt-user.patch
+  * strip-trailing-commas-on-linux-user-gecos-fields.patch
+
+- Deleted:
+  * explore-module.run-response-to-catch-the-result-in-d.patch
+  * extra-filerefs-include-files-even-if-no-refs-in-stat.patch
+  * fix-cp.push-empty-file.patch
+  * fix-for-sorting-of-multi-version-packages-bsc-109717.patch
+  * fix-openscap-push.patch
+  * initialize-__context__-retcode-for-functions-handled.patch
+  * make-it-possible-to-use-login-pull-and-push-from-mod.patch
+  * move-log_file-option-to-changeable-defaults.patch
+  * provide-kwargs-to-pkg_resource.parse_targets-require.patch
+  * remove-obsolete-unicode-handling-in-pkg.info_install.patch
+
+
+-------------------------------------------------------------------

Old:
----
  explore-module.run-response-to-catch-the-result-in-d.patch
  extra-filerefs-include-files-even-if-no-refs-in-stat.patch
  fix-cp.push-empty-file.patch
  fix-openscap-push.patch
  initialize-__context__-retcode-for-functions-handled.patch
  make-it-possible-to-use-login-pull-and-push-from-mod.patch
  move-log_file-option-to-changeable-defaults.patch
  provide-kwargs-to-pkg_resource.parse_targets-require.patch
  remove-obsolete-unicode-handling-in-pkg.info_install.patch
  v2018.3.0.tar.gz

New:
----
  accounting-for-when-files-in-an-archive-contain-non-.patch
  add-all_versions-parameter-to-include-all-installed-.patch
  add-custom-suse-capabilities-as-grains.patch
  add-engine-relaying-libvirt-events.patch
  add-environment-variable-to-know-if-yum-is-invoked-f.patch
  add-other-attribute-to-gecos-fields-to-avoid-inconsi.patch
  align-suse-salt-master.service-limitnofiles-limit-wi.patch
  avoid-incomprehensive-message-if-crashes.patch
  fix-deprecation-warning-bsc-1095507.patch
  fix-diffing-binary-files-in-file.get_diff-bsc-109839.patch
  fix-unboundlocalerror-in-file.get_diff.patch
  fix-zypper.list_pkgs-to-be-aligned-with-pkg-state.patch
  prevent-zypper-from-parsing-repo-configuration-from-.patch
  remove-old-hack-when-reporting-multiversion-packages.patch
  show-recommendations-for-salt-ssh-cross-version-pyth.patch
  v2018.3.2.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ salt.spec ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.124036732 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.128036738 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package salt
 #
-# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -15,6 +15,7 @@
 # Please submit bugfixes or comments via http://bugs.opensuse.org/
 #
 
+
 %if 0%{?suse_version} >= 1320
 # SLE15
 %global build_py3   1
@@ -52,7 +53,7 @@
 %bcond_with    builddocs
 
 Name:           salt
-Version:        2018.3.0
+Version:        2018.3.2
 Release:        0
 Summary:        A parallel remote execution system
 License:        Apache-2.0
@@ -71,43 +72,60 @@
 Patch4:        avoid-excessive-syslogging-by-watchdog-cronjob-58.patch
 Patch5:        feat-add-grain-for-all-fqdns.patch
 Patch6:        fix-bsc-1065792.patch
-# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/46006
-Patch7:        remove-obsolete-unicode-handling-in-pkg.info_install.patch
-Patch8:        fix-openscap-push.patch
-# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/45972
-Patch9:        move-log_file-option-to-changeable-defaults.patch
-# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/46416
-Patch10:       fix-cp.push-empty-file.patch
 # PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/46575
-Patch11:       fix-decrease-loglevel-when-unable-to-resolve-addr.patch
-# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/46643
-Patch12:       make-it-possible-to-use-login-pull-and-push-from-mod.patch
-# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/46413
-Patch13:       explore-module.run-response-to-catch-the-result-in-d.patch
+Patch7:         fix-decrease-loglevel-when-unable-to-resolve-addr.patch
 # PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/46684
-Patch14:       add-saltssh-multi-version-support-across-python-inte.patch
+Patch8:         add-saltssh-multi-version-support-across-python-inte.patch
 # PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/46635
-Patch15:       fix-for-errno-0-resolver-error-0-no-error-bsc-108758.patch
+Patch9:         fix-for-errno-0-resolver-error-0-no-error-bsc-108758.patch
 # PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/46890
-Patch16:       fall-back-to-pymysql.patch
+Patch10:        fall-back-to-pymysql.patch
 # PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/47149
-Patch17:       strip-trailing-commas-on-linux-user-gecos-fields.patch
-# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/47155
-Patch18:       provide-kwargs-to-pkg_resource.parse_targets-require.patch
-# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/47270
-Patch19:       initialize-__context__-retcode-for-functions-handled.patch
+Patch11:        strip-trailing-commas-on-linux-user-gecos-fields.patch
 # PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/47232
-Patch20:       fixed-usage-of-ipaddress.patch
-# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/47497
-Patch21:       extra-filerefs-include-files-even-if-no-refs-in-stat.patch
+Patch12:        fixed-usage-of-ipaddress.patch
 # PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/47504
-Patch22:       option-to-merge-current-pillar-with-opts-pillar-duri.patch
+Patch13:        option-to-merge-current-pillar-with-opts-pillar-duri.patch
 # PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/47471
-Patch23:       do-not-override-jid-on-returners-only-sending-back-t.patch
+Patch14:        do-not-override-jid-on-returners-only-sending-back-t.patch
 # PATCH-FIX_OPENSUSE bsc#1091371
-Patch24:       enable-passing-a-unix_socket-for-mysql-returners-bsc.patch
+Patch15:        enable-passing-a-unix_socket-for-mysql-returners-bsc.patch
 # PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/47211
-Patch25:       fix-for-ec2-rate-limit-failures.patch
+Patch16:        fix-for-ec2-rate-limit-failures.patch
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/47638
+Patch17:        add-all_versions-parameter-to-include-all-installed-.patch
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/47765
+Patch18:        prevent-zypper-from-parsing-repo-configuration-from-.patch
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/47149
+Patch19:        add-other-attribute-to-gecos-fields-to-avoid-inconsi.patch
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/47908
+Patch20:        align-suse-salt-master.service-limitnofiles-limit-wi.patch
+# PATCH-FIX_OPENSUSE bsc#1095507
+Patch21:        fix-deprecation-warning-bsc-1095507.patch
+# PATCH-FIX_OPENSUSE bsc#1057635
+Patch22:        add-environment-variable-to-know-if-yum-is-invoked-f.patch
+# PATCH-FIX_OPENSUSE
+Patch23:        add-custom-suse-capabilities-as-grains.patch
+# PATCH-FIX_OPENSUSE bsc#1098394 https://github.com/saltstack/salt/pull/47061
+Patch24:        fix-diffing-binary-files-in-file.get_diff-bsc-109839.patch
+# PATCH-FIX_OPENSUSE bsc#1072599
+Patch25:        show-recommendations-for-salt-ssh-cross-version-pyth.patch
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/47405
+Patch26:        fix-unboundlocalerror-in-file.get_diff.patch
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/48294
+Patch27:        fix-zypper.list_pkgs-to-be-aligned-with-pkg-state.patch
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/47572
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/48015
+Patch28:        accounting-for-when-files-in-an-archive-contain-non-.patch
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/48712
+Patch29:        remove-old-hack-when-reporting-multiversion-packages.patch
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/46461
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/46928
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/46957
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/47243
+Patch30:        add-engine-relaying-libvirt-events.patch
+# PATCH-FIX_UPSTREAM https://github.com/saltstack/salt/pull/48781
+Patch31:        avoid-incomprehensive-message-if-crashes.patch
 
 # BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
@@ -193,12 +211,12 @@
 # requirements/base.txt
 %if 0%{?rhel}
 BuildRequires:  python-jinja2
-BuildRequires:  python-yaml
 BuildRequires:  python-markupsafe
+BuildRequires:  python-yaml
 %else
 BuildRequires:  python-Jinja2
-BuildRequires:  python-PyYAML
 BuildRequires:  python-MarkupSafe
+BuildRequires:  python-PyYAML
 %endif
 
 BuildRequires:  python-futures >= 2.0
@@ -231,16 +249,16 @@
 # requirements/base.txt
 %if 0%{?rhel}
 Requires:       python-jinja2
-Requires:       python-yaml
 Requires:       python-markupsafe
+Requires:       python-yaml
 Requires:       yum
 %if 0%{?rhel} == 6
 Requires:       yum-plugin-security
 %endif
 %else
 Requires:       python-Jinja2
-Requires:       python-PyYAML
 Requires:       python-MarkupSafe
+Requires:       python-PyYAML
 %endif
 
 Requires:       python-futures >= 2.0
@@ -280,7 +298,7 @@
 Group:          System/Management
 Requires:       %{name} = %{version}-%{release}
 BuildRequires:  python-rpm-macros
-BuildRequires:  python3
+BuildRequires:  python3 < 3.7
 BuildRequires:  python3-devel
 # requirements/base.txt
 %if 0%{?rhel}
@@ -311,7 +329,7 @@
 %if %{with builddocs}
 BuildRequires:  python3-sphinx
 %endif
-Requires:       python3
+Requires:       python3 < 3.7
 #
 %if ! 0%{?suse_version} > 1110
 Requires:       python3-certifi
@@ -591,6 +609,12 @@
 %patch23 -p1
 %patch24 -p1
 %patch25 -p1
+%patch26 -p1
+%patch27 -p1
+%patch28 -p1
+%patch29 -p1
+%patch30 -p1
+%patch31 -p1
 
 %build
 %if 0%{?build_py2}
@@ -1232,7 +1256,8 @@
 %{_mandir}/man1/salt-call.1.gz
 %{_mandir}/man1/spm.1.gz
 %config(noreplace) %{_sysconfdir}/logrotate.d/salt
-%doc LICENSE AUTHORS README.rst HACKING.rst README.SUSE
+%license LICENSE
+%doc AUTHORS README.rst HACKING.rst README.SUSE
 #
 %dir        %attr(0750, root, salt) %{_sysconfdir}/salt
 %dir        %attr(0750, root, salt) %{_sysconfdir}/salt/pki

++++++ _lastrevision ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.164036798 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.164036798 +0200
@@ -1 +1 @@
-d20075a576c1c9931e083798899099cde1a4109e
\ No newline at end of file
+eb0ca38e07c96eb021ac7490ac1f61a54dc9d904

++++++ _service ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.180036826 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.180036826 +0200
@@ -3,7 +3,7 @@
     <param name="url">https://github.com/openSUSE/salt-packaging.git</param>
     <param name="subdir">salt</param>
     <param name="filename">package</param>
-    <param name="revision">2018.3.0</param>
+    <param name="revision">2018.3.2</param>
     <param name="scm">git</param>
   </service>
   <service name="extract_file" mode="disabled">
@@ -12,8 +12,8 @@
   </service>
   <service name="download_url" mode="disabled">
     <param name="host">codeload.github.com</param>
-    <param name="path">saltstack/salt/tar.gz/v2018.3.0</param>
-    <param name="filename">v2018.3.0.tar.gz</param>
+    <param name="path">saltstack/salt/tar.gz/v2018.3.2</param>
+    <param name="filename">v2018.3.2.tar.gz</param>
   </service>
   <service name="update_changelog" mode="disabled"></service>
 </services>

++++++ accounting-for-when-files-in-an-archive-contain-non-.patch ++++++
>From 5305ee8bf07e40dc54aefcbb92016ff868135749 Mon Sep 17 00:00:00 2001
From: "Gareth J. Greenaway" <[email protected]>
Date: Wed, 9 May 2018 09:33:58 -0700
Subject: [PATCH] Accounting for when files in an archive contain
 non-ascii characters

Updating integration/modules/test_archive to include filenames with unicode 
characters.

only convert to bytes when using Python2

Updating with requested changes.

Ensure member names are decoded before adding to various lists.

Adding a test to ensure archive.list returns the right results when a tar file 
contains a file with unicode in it's name.
---
 salt/modules/archive.py                   | 13 +++---
 salt/states/archive.py                    |  4 +-
 tests/integration/modules/test_archive.py | 52 ++++++++++++++++++++++-
 3 files changed, 59 insertions(+), 10 deletions(-)

diff --git a/salt/modules/archive.py b/salt/modules/archive.py
index 48f0efa18e..76cd3eeb97 100644
--- a/salt/modules/archive.py
+++ b/salt/modules/archive.py
@@ -186,12 +186,13 @@ def list_(name,
                 else {'fileobj': cached.stdout, 'mode': 'r|'}
             with contextlib.closing(tarfile.open(**open_kwargs)) as 
tar_archive:
                 for member in tar_archive.getmembers():
+                    _member = salt.utils.data.decode(member.name)
                     if member.issym():
-                        links.append(member.name)
+                        links.append(_member)
                     elif member.isdir():
-                        dirs.append(member.name + '/')
+                        dirs.append(_member + '/')
                     else:
-                        files.append(member.name)
+                        files.append(_member)
             return dirs, files, links
 
         except tarfile.ReadError:
@@ -410,9 +411,9 @@ def list_(name,
                 item.sort()
 
         if verbose:
-            ret = {'dirs': sorted(dirs),
-                   'files': sorted(files),
-                   'links': sorted(links)}
+            ret = {'dirs': sorted(salt.utils.data.decode_list(dirs)),
+                   'files': sorted(salt.utils.data.decode_list(files)),
+                   'links': sorted(salt.utils.data.decode_list(links))}
             ret['top_level_dirs'] = [x for x in ret['dirs']
                                      if x.count('/') == 1]
             ret['top_level_files'] = [x for x in ret['files']
diff --git a/salt/states/archive.py b/salt/states/archive.py
index 847c5e9914..6838b2202d 100644
--- a/salt/states/archive.py
+++ b/salt/states/archive.py
@@ -1090,7 +1090,7 @@ def extracted(name,
                                          and not stat.S_ISDIR(x)),
                      (contents['links'], stat.S_ISLNK)):
                 for path in path_list:
-                    full_path = os.path.join(name, path)
+                    full_path = salt.utils.path.join(name, path)
                     try:
                         path_mode = os.lstat(full_path.rstrip(os.sep)).st_mode
                         if not func(path_mode):
@@ -1259,7 +1259,7 @@ def extracted(name,
                 if options is None:
                     try:
                         with closing(tarfile.open(cached, 'r')) as tar:
-                            tar.extractall(name)
+                            tar.extractall(salt.utils.stringutils.to_str(name))
                             files = tar.getnames()
                             if trim_output:
                                 files = files[:trim_output]
diff --git a/tests/integration/modules/test_archive.py 
b/tests/integration/modules/test_archive.py
index 59fe2f5f61..4301b9e3b0 100644
--- a/tests/integration/modules/test_archive.py
+++ b/tests/integration/modules/test_archive.py
@@ -47,7 +47,7 @@ class ArchiveTest(ModuleCase):
         self.arch = os.path.join(self.base_path, 
'archive.{0}'.format(arch_fmt))
         self.dst = os.path.join(self.base_path, '{0}_dst_dir'.format(arch_fmt))
 
-    def _set_up(self, arch_fmt):
+    def _set_up(self, arch_fmt, unicode_filename=False):
         '''
         Create source file tree and destination directory
 
@@ -62,7 +62,11 @@ class ArchiveTest(ModuleCase):
 
         # Create source
         os.makedirs(self.src)
-        with salt.utils.files.fopen(os.path.join(self.src, 'file'), 'w') as 
theorem:
+        if unicode_filename:
+            filename = 'file®'
+        else:
+            filename = 'file'
+        with salt.utils.files.fopen(os.path.join(self.src, filename), 'w') as 
theorem:
             theorem.write(textwrap.dedent(salt.utils.stringutils.to_str(r'''\
                 Compression theorem of computational complexity theory:
 
@@ -150,6 +154,50 @@ class ArchiveTest(ModuleCase):
 
         self._tear_down()
 
+    @skipIf(not salt.utils.path.which('tar'), 'Cannot find tar executable')
+    def test_tar_pack_unicode(self):
+        '''
+        Validate using the tar function to create archives
+        '''
+        self._set_up(arch_fmt='tar', unicode_filename=True)
+
+        # Test create archive
+        ret = self.run_function('archive.tar', ['-cvf', self.arch], 
sources=self.src)
+        self.assertTrue(isinstance(ret, list), six.text_type(ret))
+        self._assert_artifacts_in_ret(ret)
+
+        self._tear_down()
+
+    @skipIf(not salt.utils.path.which('tar'), 'Cannot find tar executable')
+    def test_tar_unpack_unicode(self):
+        '''
+        Validate using the tar function to extract archives
+        '''
+        self._set_up(arch_fmt='tar', unicode_filename=True)
+        self.run_function('archive.tar', ['-cvf', self.arch], sources=self.src)
+
+        # Test extract archive
+        ret = self.run_function('archive.tar', ['-xvf', self.arch], 
dest=self.dst)
+        self.assertTrue(isinstance(ret, list), six.text_type(ret))
+        self._assert_artifacts_in_ret(ret)
+
+        self._tear_down()
+
+    @skipIf(not salt.utils.path.which('tar'), 'Cannot find tar executable')
+    def test_tar_list_unicode(self):
+        '''
+        Validate using the tar function to extract archives
+        '''
+        self._set_up(arch_fmt='tar', unicode_filename=True)
+        self.run_function('archive.tar', ['-cvf', self.arch], sources=self.src)
+
+        # Test list archive
+        ret = self.run_function('archive.list', name=self.arch)
+        self.assertTrue(isinstance(ret, list), six.text_type(ret))
+        self._assert_artifacts_in_ret(ret)
+
+        self._tear_down()
+
     @skipIf(not salt.utils.path.which('gzip'), 'Cannot find gzip executable')
     def test_gzip(self):
         '''
-- 
2.17.1


++++++ activate-all-beacons-sources-config-pillar-grains.patch ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.204036866 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.204036866 +0200
@@ -1,4 +1,4 @@
-From 957ac8fe161db2c4b3b8fe8b84027bc15e144a49 Mon Sep 17 00:00:00 2001
+From 5b48dee2f1b9a8203490e97620581b3a04d42632 Mon Sep 17 00:00:00 2001
 From: Bo Maryniuk <[email protected]>
 Date: Tue, 17 Oct 2017 16:52:33 +0200
 Subject: [PATCH] Activate all beacons sources: config/pillar/grains
@@ -8,7 +8,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/salt/minion.py b/salt/minion.py
-index df69d3c7bd..4a30e70be5 100644
+index 9468695880..0a6771dccd 100644
 --- a/salt/minion.py
 +++ b/salt/minion.py
 @@ -439,7 +439,7 @@ class MinionBase(object):
@@ -21,6 +21,6 @@
                  return self.beacons.process(b_conf, self.opts['grains'])  # 
pylint: disable=no-member
          return []
 -- 
-2.16.2
+2.13.7
 
 

++++++ add-all_versions-parameter-to-include-all-installed-.patch ++++++
>From 9de54cf6f7d8d6da4212842fef8c4c658a2a9b9c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?=
 <[email protected]>
Date: Mon, 14 May 2018 11:33:13 +0100
Subject: [PATCH] Add "all_versions" parameter to include all installed
 version on rpm.info

Enable "all_versions" parameter for zypper.info_installed

Enable "all_versions" parameter for yumpkg.info_installed

Prevent adding failed packages when pkg name contains the arch (on SUSE)

Add 'all_versions' documentation for info_installed on yum/zypper modules

Add unit tests for info_installed with all_versions

Refactor: use dict.setdefault instead if-else statement

Allow removing only specific package versions with zypper and yum
---
 salt/modules/rpm.py               | 18 ++++++++---
 salt/modules/yumpkg.py            | 49 ++++++++++++++++++++++--------
 salt/modules/zypper.py            | 64 ++++++++++++++++++++++++++++++++-------
 salt/states/pkg.py                | 33 +++++++++++++++++++-
 tests/unit/modules/test_yumpkg.py | 50 ++++++++++++++++++++++++++++++
 tests/unit/modules/test_zypper.py | 50 ++++++++++++++++++++++++++++++
 6 files changed, 236 insertions(+), 28 deletions(-)

diff --git a/salt/modules/rpm.py b/salt/modules/rpm.py
index d065f1e2d9..3683234f59 100644
--- a/salt/modules/rpm.py
+++ b/salt/modules/rpm.py
@@ -453,7 +453,7 @@ def diff(package, path):
     return res
 
 
-def info(*packages, **attr):
+def info(*packages, **kwargs):
     '''
     Return a detailed package(s) summary information.
     If no packages specified, all packages will be returned.
@@ -467,6 +467,9 @@ def info(*packages, **attr):
             version, vendor, release, build_date, build_date_time_t, 
install_date, install_date_time_t,
             build_host, group, source_rpm, arch, epoch, size, license, 
signature, packager, url, summary, description.
 
+    :param all_versions:
+        Return information for all installed versions of the packages
+
     :return:
 
     CLI example:
@@ -476,7 +479,9 @@ def info(*packages, **attr):
         salt '*' lowpkg.info apache2 bash
         salt '*' lowpkg.info apache2 bash attr=version
         salt '*' lowpkg.info apache2 bash attr=version,build_date_iso,size
+        salt '*' lowpkg.info apache2 bash attr=version,build_date_iso,size 
all_versions=True
     '''
+    all_versions = kwargs.get('all_versions', False)
     # LONGSIZE is not a valid tag for all versions of rpm. If LONGSIZE isn't
     # available, then we can just use SIZE for older versions. See Issue 
#31366.
     rpm_tags = __salt__['cmd.run_stdout'](
@@ -516,7 +521,7 @@ def info(*packages, **attr):
         "edition": "edition: %|EPOCH?{%{EPOCH}:}|%{VERSION}-%{RELEASE}\\n",
     }
 
-    attr = attr.get('attr', None) and attr['attr'].split(",") or None
+    attr = kwargs.get('attr', None) and kwargs['attr'].split(",") or None
     query = list()
     if attr:
         for attr_k in attr:
@@ -610,8 +615,13 @@ def info(*packages, **attr):
         if pkg_name.startswith('gpg-pubkey'):
             continue
         if pkg_name not in ret:
-            ret[pkg_name] = pkg_data.copy()
-            del ret[pkg_name]['edition']
+            if all_versions:
+                ret[pkg_name] = [pkg_data.copy()]
+            else:
+                ret[pkg_name] = pkg_data.copy()
+                del ret[pkg_name]['edition']
+        elif all_versions:
+            ret[pkg_name].append(pkg_data.copy())
 
     return ret
 
diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py
index 747142264d..9ce4926790 100644
--- a/salt/modules/yumpkg.py
+++ b/salt/modules/yumpkg.py
@@ -994,31 +994,39 @@ def list_downloaded():
     return ret
 
 
-def info_installed(*names):
+def info_installed(*names, **kwargs):
     '''
     .. versionadded:: 2015.8.1
 
     Return the information of the named package(s), installed on the system.
 
+    :param all_versions:
+        Include information for all versions of the packages installed on the 
minion.
+
     CLI example:
 
     .. code-block:: bash
 
         salt '*' pkg.info_installed <package1>
         salt '*' pkg.info_installed <package1> <package2> <package3> ...
+        salt '*' pkg.info_installed <package1> <package2> <package3> 
all_versions=True
     '''
+    all_versions = kwargs.get('all_versions', False)
     ret = dict()
-    for pkg_name, pkg_nfo in __salt__['lowpkg.info'](*names).items():
-        t_nfo = dict()
-        # Translate dpkg-specific keys to a common structure
-        for key, value in pkg_nfo.items():
-            if key == 'source_rpm':
-                t_nfo['source'] = value
+    for pkg_name, pkgs_nfo in __salt__['lowpkg.info'](*names, 
**kwargs).items():
+        pkg_nfo = pkgs_nfo if all_versions else [pkgs_nfo]
+        for _nfo in pkg_nfo:
+            t_nfo = dict()
+            # Translate dpkg-specific keys to a common structure
+            for key, value in _nfo.items():
+                if key == 'source_rpm':
+                    t_nfo['source'] = value
+                else:
+                    t_nfo[key] = value
+            if not all_versions:
+                ret[pkg_name] = t_nfo
             else:
-                t_nfo[key] = value
-
-        ret[pkg_name] = t_nfo
-
+                ret.setdefault(pkg_name, []).append(t_nfo)
     return ret
 
 
@@ -1919,7 +1927,24 @@ def remove(name=None, pkgs=None, **kwargs):  # pylint: 
disable=W0613
         raise CommandExecutionError(exc)
 
     old = list_pkgs()
-    targets = [x for x in pkg_params if x in old]
+    targets = []
+    for target in pkg_params:
+        # Check if package version set to be removed is actually installed:
+        # old[target] contains a comma-separated list of installed versions
+        if target in old and not pkg_params[target]:
+            targets.append(target)
+        elif target in old and pkg_params[target] in old[target].split(','):
+            arch = ''
+            pkgname = target
+            try:
+                namepart, archpart = target.rsplit('.', 1)
+            except ValueError:
+                pass
+            else:
+                if archpart in salt.utils.pkg.rpm.ARCHES:
+                    arch = '.' + archpart
+                    pkgname = namepart
+            targets.append('{0}-{1}{2}'.format(pkgname, pkg_params[target], 
arch))
     if not targets:
         return {}
 
diff --git a/salt/modules/zypper.py b/salt/modules/zypper.py
index 668143bdd9..06f8335c18 100644
--- a/salt/modules/zypper.py
+++ b/salt/modules/zypper.py
@@ -470,28 +470,37 @@ def info_installed(*names, **kwargs):
         Valid attributes are:
             ignore, report
 
+    :param all_versions:
+        Include information for all versions of the packages installed on the 
minion.
+
     CLI example:
 
     .. code-block:: bash
 
         salt '*' pkg.info_installed <package1>
         salt '*' pkg.info_installed <package1> <package2> <package3> ...
-        salt '*' pkg.info_installed <package1> attr=version,vendor
+        salt '*' pkg.info_installed <package1> <package2> <package3> 
all_versions=True
+        salt '*' pkg.info_installed <package1> attr=version,vendor 
all_versions=True
         salt '*' pkg.info_installed <package1> <package2> <package3> ... 
attr=version,vendor
         salt '*' pkg.info_installed <package1> <package2> <package3> ... 
attr=version,vendor errors=ignore
         salt '*' pkg.info_installed <package1> <package2> <package3> ... 
attr=version,vendor errors=report
     '''
+    all_versions = kwargs.get('all_versions', False)
     ret = dict()
-    for pkg_name, pkg_nfo in __salt__['lowpkg.info'](*names, **kwargs).items():
-        t_nfo = dict()
-        # Translate dpkg-specific keys to a common structure
-        for key, value in six.iteritems(pkg_nfo):
-            if key == 'source_rpm':
-                t_nfo['source'] = value
+    for pkg_name, pkgs_nfo in __salt__['lowpkg.info'](*names, 
**kwargs).items():
+        pkg_nfo = pkgs_nfo if all_versions else [pkgs_nfo]
+        for _nfo in pkg_nfo:
+            t_nfo = dict()
+            # Translate dpkg-specific keys to a common structure
+            for key, value in six.iteritems(_nfo):
+                if key == 'source_rpm':
+                    t_nfo['source'] = value
+                else:
+                    t_nfo[key] = value
+            if not all_versions:
+                ret[pkg_name] = t_nfo
             else:
-                t_nfo[key] = value
-        ret[pkg_name] = t_nfo
-
+                ret.setdefault(pkg_name, []).append(t_nfo)
     return ret
 
 
@@ -1494,7 +1503,14 @@ def _uninstall(name=None, pkgs=None):
         raise CommandExecutionError(exc)
 
     old = list_pkgs()
-    targets = [target for target in pkg_params if target in old]
+    targets = []
+    for target in pkg_params:
+        # Check if package version set to be removed is actually installed:
+        # old[target] contains a comma-separated list of installed versions
+        if target in old and pkg_params[target] in old[target].split(','):
+            targets.append(target + "-" + pkg_params[target])
+        elif target in old and not pkg_params[target]:
+            targets.append(target)
     if not targets:
         return {}
 
@@ -1517,6 +1533,32 @@ def _uninstall(name=None, pkgs=None):
     return ret
 
 
+def normalize_name(name):
+    '''
+    Strips the architecture from the specified package name, if necessary.
+    Circumstances where this would be done include:
+
+    * If the arch is 32 bit and the package name ends in a 32-bit arch.
+    * If the arch matches the OS arch, or is ``noarch``.
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' pkg.normalize_name zsh.x86_64
+    '''
+    try:
+        arch = name.rsplit('.', 1)[-1]
+        if arch not in salt.utils.pkg.rpm.ARCHES + ('noarch',):
+            return name
+    except ValueError:
+        return name
+    if arch in (__grains__['osarch'], 'noarch') \
+            or salt.utils.pkg.rpm.check_32(arch, osarch=__grains__['osarch']):
+        return name[:-(len(arch) + 1)]
+    return name
+
+
 def remove(name=None, pkgs=None, **kwargs):  # pylint: disable=unused-argument
     '''
     .. versionchanged:: 2015.8.12,2016.3.3,2016.11.0
diff --git a/salt/states/pkg.py b/salt/states/pkg.py
index 2682ee17f9..ed405cb6b5 100644
--- a/salt/states/pkg.py
+++ b/salt/states/pkg.py
@@ -415,6 +415,16 @@ def _find_remove_targets(name=None,
 
         if __grains__['os'] == 'FreeBSD' and origin:
             cver = [k for k, v in six.iteritems(cur_pkgs) if v['origin'] == 
pkgname]
+        elif __grains__['os_family'] == 'Suse':
+            # On SUSE systems. Zypper returns packages without "arch" in name
+            try:
+                namepart, archpart = pkgname.rsplit('.', 1)
+            except ValueError:
+                cver = cur_pkgs.get(pkgname, [])
+            else:
+                if archpart in salt.utils.pkg.rpm.ARCHES + ("noarch",):
+                    pkgname = namepart
+                cver = cur_pkgs.get(pkgname, [])
         else:
             cver = cur_pkgs.get(pkgname, [])
 
@@ -844,6 +854,17 @@ def _verify_install(desired, new_pkgs, ignore_epoch=False, 
new_caps=None):
             cver = new_pkgs.get(pkgname.split('%')[0])
         elif __grains__['os_family'] == 'Debian':
             cver = new_pkgs.get(pkgname.split('=')[0])
+        elif __grains__['os_family'] == 'Suse':
+            # On SUSE systems. Zypper returns packages without "arch" in name
+            try:
+                namepart, archpart = pkgname.rsplit('.', 1)
+            except ValueError:
+                cver = new_pkgs.get(pkgname)
+            else:
+                if archpart in salt.utils.pkg.rpm.ARCHES + ("noarch",):
+                    cver = new_pkgs.get(namepart)
+                else:
+                    cver = new_pkgs.get(pkgname)
         else:
             cver = new_pkgs.get(pkgname)
             if not cver and pkgname in new_caps:
@@ -2674,7 +2695,17 @@ def _uninstall(
 
     changes = __salt__['pkg.{0}'.format(action)](name, pkgs=pkgs, 
version=version, **kwargs)
     new = __salt__['pkg.list_pkgs'](versions_as_list=True, **kwargs)
-    failed = [x for x in pkg_params if x in new]
+    failed = []
+    for x in pkg_params:
+        if __grains__['os_family'] in ['Suse', 'RedHat']:
+            # Check if the package version set to be removed is actually 
removed:
+            if x in new and not pkg_params[x]:
+                failed.append(x)
+            elif x in new and pkg_params[x] in new[x]:
+                failed.append(x + "-" + pkg_params[x])
+        elif x in new:
+            failed.append(x)
+
     if action == 'purge':
         new_removed = __salt__['pkg.list_pkgs'](versions_as_list=True,
                                                 removed=True,
diff --git a/tests/unit/modules/test_yumpkg.py 
b/tests/unit/modules/test_yumpkg.py
index 28b6e1294c..c73f2582b9 100644
--- a/tests/unit/modules/test_yumpkg.py
+++ b/tests/unit/modules/test_yumpkg.py
@@ -601,3 +601,53 @@ class YumTestCase(TestCase, LoaderModuleMockMixin):
                      '--branch=foo', '--exclude=kernel*', 'upgrade'],
                     output_loglevel='trace',
                     python_shell=False)
+
+    def test_info_installed_with_all_versions(self):
+        '''
+        Test the return information of all versions for the named package(s), 
installed on the system.
+
+        :return:
+        '''
+        run_out = {
+            'virgo-dummy': [
+                {'build_date': '2015-07-09T10:55:19Z',
+                 'vendor': 'openSUSE Build Service',
+                 'description': 'This is the Virgo dummy package used for 
testing SUSE Manager',
+                 'license': 'GPL-2.0', 'build_host': 'sheep05', 'url': 
'http://www.suse.com',
+                 'build_date_time_t': 1436432119, 'relocations': '(not 
relocatable)',
+                 'source_rpm': 'virgo-dummy-1.0-1.1.src.rpm', 'install_date': 
'2016-02-23T16:31:57Z',
+                 'install_date_time_t': 1456241517, 'summary': 'Virgo dummy 
package', 'version': '1.0',
+                 'signature': 'DSA/SHA1, Thu Jul  9 08:55:33 2015, Key ID 
27fa41bd8a7c64f9',
+                 'release': '1.1', 'group': 'Applications/System', 'arch': 
'i686', 'size': '17992'},
+                {'build_date': '2015-07-09T10:15:19Z',
+                 'vendor': 'openSUSE Build Service',
+                 'description': 'This is the Virgo dummy package used for 
testing SUSE Manager',
+                 'license': 'GPL-2.0', 'build_host': 'sheep05', 'url': 
'http://www.suse.com',
+                 'build_date_time_t': 1436432119, 'relocations': '(not 
relocatable)',
+                 'source_rpm': 'virgo-dummy-1.0-1.1.src.rpm', 'install_date': 
'2016-02-23T16:31:57Z',
+                 'install_date_time_t': 14562415127, 'summary': 'Virgo dummy 
package', 'version': '1.0',
+                 'signature': 'DSA/SHA1, Thu Jul  9 08:55:33 2015, Key ID 
27fa41bd8a7c64f9',
+                 'release': '1.1', 'group': 'Applications/System', 'arch': 
'x86_64', 'size': '13124'}
+            ],
+            'libopenssl1_0_0': [
+                {'build_date': '2015-11-04T23:20:34Z', 'vendor': 'SUSE LLC 
<https://www.suse.com/>',
+                 'description': 'The OpenSSL Project is a collaborative 
effort.',
+                 'license': 'OpenSSL', 'build_host': 'sheep11', 'url': 
'https://www.openssl.org/',
+                 'build_date_time_t': 1446675634, 'relocations': '(not 
relocatable)',
+                 'source_rpm': 'openssl-1.0.1i-34.1.src.rpm', 'install_date': 
'2016-02-23T16:31:35Z',
+                 'install_date_time_t': 1456241495, 'summary': 'Secure Sockets 
and Transport Layer Security',
+                 'version': '1.0.1i', 'signature': 'RSA/SHA256, Wed Nov  4 
22:21:34 2015, Key ID 70af9e8139db7c82',
+                 'release': '34.1', 'group': 
'Productivity/Networking/Security', 'packager': 'https://www.suse.com/',
+                 'arch': 'x86_64', 'size': '2576912'}
+            ]
+        }
+        with patch.dict(yumpkg.__salt__, {'lowpkg.info': 
MagicMock(return_value=run_out)}):
+            installed = yumpkg.info_installed(all_versions=True)
+            # Test overall products length
+            self.assertEqual(len(installed), 2)
+
+            # Test multiple versions for the same package
+            for pkg_name, pkg_info_list in installed.items():
+                self.assertEqual(len(pkg_info_list), 2 if pkg_name == 
"virgo-dummy" else 1)
+                for info in pkg_info_list:
+                    self.assertTrue(info['arch'] in ('x86_64', 'i686'))
diff --git a/tests/unit/modules/test_zypper.py 
b/tests/unit/modules/test_zypper.py
index 539a950252..6eccee568b 100644
--- a/tests/unit/modules/test_zypper.py
+++ b/tests/unit/modules/test_zypper.py
@@ -327,6 +327,56 @@ class ZypperTestCase(TestCase, LoaderModuleMockMixin):
             installed = zypper.info_installed()
             self.assertEqual(installed['vīrgô']['description'], 'vīrgô 
d€šçripţiǫñ')
 
+    def test_info_installed_with_all_versions(self):
+        '''
+        Test the return information of all versions for the named package(s), 
installed on the system.
+
+        :return:
+        '''
+        run_out = {
+            'virgo-dummy': [
+                {'build_date': '2015-07-09T10:55:19Z',
+                 'vendor': 'openSUSE Build Service',
+                 'description': 'This is the Virgo dummy package used for 
testing SUSE Manager',
+                 'license': 'GPL-2.0', 'build_host': 'sheep05', 'url': 
'http://www.suse.com',
+                 'build_date_time_t': 1436432119, 'relocations': '(not 
relocatable)',
+                 'source_rpm': 'virgo-dummy-1.0-1.1.src.rpm', 'install_date': 
'2016-02-23T16:31:57Z',
+                 'install_date_time_t': 1456241517, 'summary': 'Virgo dummy 
package', 'version': '1.0',
+                 'signature': 'DSA/SHA1, Thu Jul  9 08:55:33 2015, Key ID 
27fa41bd8a7c64f9',
+                 'release': '1.1', 'group': 'Applications/System', 'arch': 
'i686', 'size': '17992'},
+                {'build_date': '2015-07-09T10:15:19Z',
+                 'vendor': 'openSUSE Build Service',
+                 'description': 'This is the Virgo dummy package used for 
testing SUSE Manager',
+                 'license': 'GPL-2.0', 'build_host': 'sheep05', 'url': 
'http://www.suse.com',
+                 'build_date_time_t': 1436432119, 'relocations': '(not 
relocatable)',
+                 'source_rpm': 'virgo-dummy-1.0-1.1.src.rpm', 'install_date': 
'2016-02-23T16:31:57Z',
+                 'install_date_time_t': 14562415127, 'summary': 'Virgo dummy 
package', 'version': '1.0',
+                 'signature': 'DSA/SHA1, Thu Jul  9 08:55:33 2015, Key ID 
27fa41bd8a7c64f9',
+                 'release': '1.1', 'group': 'Applications/System', 'arch': 
'x86_64', 'size': '13124'}
+            ],
+            'libopenssl1_0_0': [
+                {'build_date': '2015-11-04T23:20:34Z', 'vendor': 'SUSE LLC 
<https://www.suse.com/>',
+                 'description': 'The OpenSSL Project is a collaborative 
effort.',
+                 'license': 'OpenSSL', 'build_host': 'sheep11', 'url': 
'https://www.openssl.org/',
+                 'build_date_time_t': 1446675634, 'relocations': '(not 
relocatable)',
+                 'source_rpm': 'openssl-1.0.1i-34.1.src.rpm', 'install_date': 
'2016-02-23T16:31:35Z',
+                 'install_date_time_t': 1456241495, 'summary': 'Secure Sockets 
and Transport Layer Security',
+                 'version': '1.0.1i', 'signature': 'RSA/SHA256, Wed Nov  4 
22:21:34 2015, Key ID 70af9e8139db7c82',
+                 'release': '34.1', 'group': 
'Productivity/Networking/Security', 'packager': 'https://www.suse.com/',
+                 'arch': 'x86_64', 'size': '2576912'}
+            ]
+        }
+        with patch.dict(zypper.__salt__, {'lowpkg.info': 
MagicMock(return_value=run_out)}):
+            installed = zypper.info_installed(all_versions=True)
+            # Test overall products length
+            self.assertEqual(len(installed), 2)
+
+            # Test multiple versions for the same package
+            for pkg_name, pkg_info_list in installed.items():
+                self.assertEqual(len(pkg_info_list), 2 if pkg_name == 
"virgo-dummy" else 1)
+                for info in pkg_info_list:
+                    self.assertTrue(info['arch'] in ('x86_64', 'i686'))
+
     def test_info_available(self):
         '''
         Test return the information of the named package available for the 
system.
-- 
2.13.7


++++++ add-custom-suse-capabilities-as-grains.patch ++++++
>From b02aee33a3aa1676cbfdf3a0ed936eef8a40adfe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?=
 <[email protected]>
Date: Thu, 21 Jun 2018 11:57:57 +0100
Subject: [PATCH] Add custom SUSE capabilities as Grains

---
 salt/grains/extra.py | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/salt/grains/extra.py b/salt/grains/extra.py
index fff70e9f5b..4fb58674bf 100644
--- a/salt/grains/extra.py
+++ b/salt/grains/extra.py
@@ -75,3 +75,10 @@ def config():
                 log.warning("Bad syntax in grains file! Skipping.")
                 return {}
     return {}
+
+
+def suse_backported_capabilities():
+    return {
+        '__suse_reserved_pkg_all_versions_support': True,
+        '__suse_reserved_pkg_patches_support': True
+    }
-- 
2.13.7


++++++ add-engine-relaying-libvirt-events.patch ++++++
++++ 894 lines (skipped)

++++++ add-environment-variable-to-know-if-yum-is-invoked-f.patch ++++++
>From 39d9d9fb26f9aff83fce4ce67d5b2a6bd4f60b95 Mon Sep 17 00:00:00 2001
From: Marcelo Chiaradia <[email protected]>
Date: Thu, 7 Jun 2018 10:29:41 +0200
Subject: [PATCH] Add environment variable to know if yum is invoked from
 Salt(bsc#1057635)

---
 salt/modules/yumpkg.py | 59 +++++++++++++++++++++++++++++++++-----------------
 1 file changed, 39 insertions(+), 20 deletions(-)

diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py
index 9ce4926790..51832bf883 100644
--- a/salt/modules/yumpkg.py
+++ b/salt/modules/yumpkg.py
@@ -452,7 +452,8 @@ def latest_version(*names, **kwargs):
     out = __salt__['cmd.run_all'](cmd,
                                   output_loglevel='trace',
                                   ignore_retcode=True,
-                                  python_shell=False)
+                                  python_shell=False,
+                                  env={"SALT_RUNNING": '1'})
     if out['retcode'] != 0:
         if out['stderr']:
             # Check first if this is just a matter of the packages being
@@ -850,7 +851,8 @@ def list_repo_pkgs(*args, **kwargs):
     yum_version = None if _yum() != 'yum' else _LooseVersion(
                 __salt__['cmd.run'](
                     ['yum', '--version'],
-                    python_shell=False
+                    python_shell=False,
+                    env={"SALT_RUNNING": '1'}
                 ).splitlines()[0].strip()
             )
     # Really old version of yum; does not even have --showduplicates option
@@ -865,7 +867,8 @@ def list_repo_pkgs(*args, **kwargs):
                 cmd_prefix + [pkg_src],
                 output_loglevel='trace',
                 ignore_retcode=True,
-                python_shell=False
+                python_shell=False,
+                env={"SALT_RUNNING": '1'}
             )
             if out['retcode'] == 0:
                 _parse_output(out['stdout'], strict=True)
@@ -882,7 +885,8 @@ def list_repo_pkgs(*args, **kwargs):
                 cmd_prefix + [pkg_src],
                 output_loglevel='trace',
                 ignore_retcode=True,
-                python_shell=False
+                python_shell=False,
+                env={"SALT_RUNNING": '1'}
             )
             if out['retcode'] == 0:
                 _parse_output(out['stdout'], strict=True)
@@ -898,7 +902,8 @@ def list_repo_pkgs(*args, **kwargs):
             out = __salt__['cmd.run_all'](cmd,
                                           output_loglevel='trace',
                                           ignore_retcode=True,
-                                          python_shell=False)
+                                          python_shell=False,
+                                          env={"SALT_RUNNING": '1'})
             if out['retcode'] != 0 and 'Error:' in out['stdout']:
                 continue
             _parse_output(out['stdout'])
@@ -955,7 +960,8 @@ def list_upgrades(refresh=True, **kwargs):
     out = __salt__['cmd.run_all'](cmd,
                                   output_loglevel='trace',
                                   ignore_retcode=True,
-                                  python_shell=False)
+                                  python_shell=False,
+                                  env={"SALT_RUNNING": '1'})
     if out['retcode'] != 0 and 'Error:' in out:
         return {}
 
@@ -1090,12 +1096,13 @@ def refresh_db(**kwargs):
     clean_cmd.extend(options)
     update_cmd.extend(options)
 
-    __salt__['cmd.run'](clean_cmd, python_shell=False)
+    __salt__['cmd.run'](clean_cmd, python_shell=False, env={"SALT_RUNNING": 
'1'})
     if check_update_:
         result = __salt__['cmd.retcode'](update_cmd,
                                          output_loglevel='trace',
                                          ignore_retcode=True,
-                                         python_shell=False)
+                                         python_shell=False,
+                                         env={"SALT_RUNNING": '1'})
         return retcodes.get(result, False)
     return True
 
@@ -1634,7 +1641,8 @@ def install(name=None,
                 cmd,
                 output_loglevel='trace',
                 python_shell=False,
-                redirect_stderr=True
+                redirect_stderr=True,
+                env={"SALT_RUNNING": '1'}
             )
             if out['retcode'] != 0:
                 errors.append(out['stdout'])
@@ -1654,7 +1662,8 @@ def install(name=None,
                 cmd,
                 output_loglevel='trace',
                 python_shell=False,
-                redirect_stderr=True
+                redirect_stderr=True,
+                env={"SALT_RUNNING": '1'}
             )
             if out['retcode'] != 0:
                 errors.append(out['stdout'])
@@ -1674,7 +1683,8 @@ def install(name=None,
                 cmd,
                 output_loglevel='trace',
                 python_shell=False,
-                redirect_stderr=True
+                redirect_stderr=True,
+                env={"SALT_RUNNING": '1'}
             )
             if out['retcode'] != 0:
                 errors.append(out['stdout'])
@@ -1866,7 +1876,8 @@ def upgrade(name=None,
 
     result = __salt__['cmd.run_all'](cmd,
                                      output_loglevel='trace',
-                                     python_shell=False)
+                                     python_shell=False,
+                                     env={"SALT_RUNNING": '1'})
     __context__.pop('pkg.list_pkgs', None)
     new = list_pkgs()
     ret = salt.utils.data.compare_dicts(old, new)
@@ -1957,7 +1968,8 @@ def remove(name=None, pkgs=None, **kwargs):  # pylint: 
disable=W0613
     out = __salt__['cmd.run_all'](
         [_yum(), '-y', 'remove'] + targets,
         output_loglevel='trace',
-        python_shell=False
+        python_shell=False,
+        env={"SALT_RUNNING": '1'}
     )
 
     if out['retcode'] != 0 and out['stderr']:
@@ -2094,7 +2106,8 @@ def hold(name=None, pkgs=None, sources=None, 
normalize=True, **kwargs):  # pylin
             else:
                 out = __salt__['cmd.run_all'](
                     [_yum(), 'versionlock', target],
-                    python_shell=False
+                    python_shell=False,
+                    env={"SALT_RUNNING": '1'}
                 )
 
                 if out['retcode'] == 0:
@@ -2203,7 +2216,8 @@ def unhold(name=None, pkgs=None, sources=None, **kwargs): 
 # pylint: disable=W06
             else:
                 out = __salt__['cmd.run_all'](
                     [_yum(), 'versionlock', 'delete'] + search_locks,
-                    python_shell=False
+                    python_shell=False,
+                    env={"SALT_RUNNING": '1'}
                 )
 
                 if out['retcode'] == 0:
@@ -2254,7 +2268,8 @@ def list_holds(pattern=__HOLD_PATTERN, full=True):
     _check_versionlock()
 
     out = __salt__['cmd.run']([_yum(), 'versionlock', 'list'],
-                              python_shell=False)
+                              python_shell=False,
+                              env={"SALT_RUNNING": '1'})
     ret = []
     for line in salt.utils.itertools.split(out, '\n'):
         match = _get_hold(line, pattern=pattern, full=full)
@@ -2319,7 +2334,8 @@ def group_list():
     out = __salt__['cmd.run_stdout'](
         [_yum(), 'grouplist', 'hidden'],
         output_loglevel='trace',
-        python_shell=False
+        python_shell=False,
+        env={"SALT_RUNNING": '1'}
     )
     key = None
     for line in salt.utils.itertools.split(out, '\n'):
@@ -2386,7 +2402,8 @@ def group_info(name, expand=False):
     out = __salt__['cmd.run_stdout'](
         cmd,
         output_loglevel='trace',
-        python_shell=False
+        python_shell=False,
+        env={"SALT_RUNNING": '1'}
     )
 
     g_info = {}
@@ -3055,7 +3072,8 @@ def download(*packages):
     __salt__['cmd.run'](
         cmd,
         output_loglevel='trace',
-        python_shell=False
+        python_shell=False,
+        env={"SALT_RUNNING": '1'}
     )
     ret = {}
     for dld_result in os.listdir(CACHE_DIR):
@@ -3130,7 +3148,8 @@ def _get_patches(installed_only=False):
     cmd = [_yum(), '--quiet', 'updateinfo', 'list', 'all']
     ret = __salt__['cmd.run_stdout'](
         cmd,
-        python_shell=False
+        python_shell=False,
+        env={"SALT_RUNNING": '1'}
     )
     for line in salt.utils.itertools.split(ret, os.linesep):
         inst, advisory_id, sev, pkg = re.match(r'([i|\s]) ([^\s]+) +([^\s]+) 
+([^\s]+)',
-- 
2.13.7


++++++ add-other-attribute-to-gecos-fields-to-avoid-inconsi.patch ++++++
>From cc8d6eaddf59973a94512779853558789b56ca3e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?=
 <[email protected]>
Date: Wed, 25 Apr 2018 12:55:36 +0100
Subject: [PATCH] Add 'other' attribute to GECOS fields to avoid
 inconsistencies with chfn

Fix unsupported chars checking on GECOS fields

Add unit test for new method 'user.chother'

Do make comparisons in a single line

Add 'other' as valid kwargs for 'user.add' method
---
 salt/modules/useradd.py            | 41 ++++++++++++++++++++++++++++----------
 salt/states/user.py                | 28 ++++++++++++++++++--------
 tests/unit/modules/test_useradd.py | 36 +++++++++++++++++++++++++++++++--
 3 files changed, 84 insertions(+), 21 deletions(-)

diff --git a/salt/modules/useradd.py b/salt/modules/useradd.py
index a61ba0e960..fc3c82a8bc 100644
--- a/salt/modules/useradd.py
+++ b/salt/modules/useradd.py
@@ -60,17 +60,18 @@ def _get_gecos(name):
     Retrieve GECOS field info and return it in dictionary form
     '''
     gecos_field = salt.utils.stringutils.to_unicode(
-        pwd.getpwnam(_quote_username(name)).pw_gecos).split(',', 3)
+        pwd.getpwnam(_quote_username(name)).pw_gecos).split(',', 4)
     if not gecos_field:
         return {}
     else:
         # Assign empty strings for any unspecified trailing GECOS fields
-        while len(gecos_field) < 4:
+        while len(gecos_field) < 5:
             gecos_field.append('')
         return {'fullname': salt.utils.locales.sdecode(gecos_field[0]),
                 'roomnumber': salt.utils.locales.sdecode(gecos_field[1]),
                 'workphone': salt.utils.locales.sdecode(gecos_field[2]),
-                'homephone': salt.utils.locales.sdecode(gecos_field[3])}
+                'homephone': salt.utils.locales.sdecode(gecos_field[3]),
+                'other': salt.utils.locales.sdecode(gecos_field[4])}
 
 
 def _build_gecos(gecos_dict):
@@ -78,10 +79,11 @@ def _build_gecos(gecos_dict):
     Accepts a dictionary entry containing GECOS field names and their values,
     and returns a full GECOS comment string, to be used with usermod.
     '''
-    return '{0},{1},{2},{3}'.format(gecos_dict.get('fullname', ''),
-                                    gecos_dict.get('roomnumber', ''),
-                                    gecos_dict.get('workphone', ''),
-                                    gecos_dict.get('homephone', 
'')).rstrip(',')
+    return '{0},{1},{2},{3},{4}'.format(gecos_dict.get('fullname', ''),
+                                        gecos_dict.get('roomnumber', ''),
+                                        gecos_dict.get('workphone', ''),
+                                        gecos_dict.get('homephone', ''),
+                                        gecos_dict.get('other', 
''),).rstrip(',')
 
 
 def _update_gecos(name, key, value, root=None):
@@ -124,6 +126,7 @@ def add(name,
         roomnumber='',
         workphone='',
         homephone='',
+        other='',
         createhome=True,
         loginclass=None,
         root=None,
@@ -237,6 +240,8 @@ def add(name,
         chworkphone(name, workphone)
     if homephone:
         chhomephone(name, homephone)
+    if other:
+        chother(name, other)
     return True
 
 
@@ -507,6 +512,19 @@ def chhomephone(name, homephone):
     return _update_gecos(name, 'homephone', homephone)
 
 
+def chother(name, other):
+    '''
+    Change the user's other GECOS attribute
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt '*' user.chother foobar
+    '''
+    return _update_gecos(name, 'other', other)
+
+
 def chloginclass(name, loginclass, root=None):
     '''
     Change the default login class of the user
@@ -588,9 +606,9 @@ def _format_info(data):
     Return user information in a pretty way
     '''
     # Put GECOS info into a list
-    gecos_field = salt.utils.stringutils.to_unicode(data.pw_gecos).split(',', 
3)
-    # Make sure our list has at least four elements
-    while len(gecos_field) < 4:
+    gecos_field = salt.utils.stringutils.to_unicode(data.pw_gecos).split(',', 
4)
+    # Make sure our list has at least five elements
+    while len(gecos_field) < 5:
         gecos_field.append('')
 
     return {'gid': data.pw_gid,
@@ -603,7 +621,8 @@ def _format_info(data):
             'fullname': gecos_field[0],
             'roomnumber': gecos_field[1],
             'workphone': gecos_field[2],
-            'homephone': gecos_field[3]}
+            'homephone': gecos_field[3],
+            'other': gecos_field[4]}
 
 
 @salt.utils.decorators.path.which('id')
diff --git a/salt/states/user.py b/salt/states/user.py
index f4ae81dd31..34f5a9d541 100644
--- a/salt/states/user.py
+++ b/salt/states/user.py
@@ -68,6 +68,7 @@ def _changes(name,
              roomnumber='',
              workphone='',
              homephone='',
+             other='',
              loginclass=None,
              date=None,
              mindays=0,
@@ -170,24 +171,26 @@ def _changes(name,
 
     # MacOS doesn't have full GECOS support, so check for the "ch" functions
     # and ignore these parameters if these functions do not exist.
-    if 'user.chroomnumber' in __salt__ \
-            and roomnumber is not None:
+    if 'user.chroomnumber' in __salt__ and roomnumber is not None:
         roomnumber = sdecode_if_string(roomnumber)
         lusr['roomnumber'] = sdecode_if_string(lusr['roomnumber'])
         if lusr['roomnumber'] != roomnumber:
             change['roomnumber'] = roomnumber
-    if 'user.chworkphone' in __salt__ \
-            and workphone is not None:
+    if 'user.chworkphone' in __salt__ and workphone is not None:
         workphone = sdecode_if_string(workphone)
         lusr['workphone'] = sdecode_if_string(lusr['workphone'])
         if lusr['workphone'] != workphone:
             change['workphone'] = workphone
-    if 'user.chhomephone' in __salt__ \
-            and homephone is not None:
+    if 'user.chhomephone' in __salt__ and homephone is not None:
         homephone = sdecode_if_string(homephone)
         lusr['homephone'] = sdecode_if_string(lusr['homephone'])
         if lusr['homephone'] != homephone:
             change['homephone'] = homephone
+    if 'user.chother' in __salt__ and other is not None:
+        other = sdecode_if_string(other)
+        lusr['other'] = sdecode_if_string(lusr['other'])
+        if lusr['other'] != other:
+            change['other'] = other
     # OpenBSD/FreeBSD login class
     if __grains__['kernel'] in ('OpenBSD', 'FreeBSD'):
         if loginclass:
@@ -236,6 +239,7 @@ def present(name,
             roomnumber=None,
             workphone=None,
             homephone=None,
+            other=None,
             loginclass=None,
             date=None,
             mindays=None,
@@ -377,7 +381,10 @@ def present(name,
 
     homephone
         The user's home phone number (not supported in MacOS)
-        If GECOS field contains more than 3 commas, this field will have the 
rest of 'em
+
+    other
+        The user's other attribute (not supported in MacOS)
+        If GECOS field contains more than 4 commas, this field will have the 
rest of 'em
 
     .. versionchanged:: 2014.7.0
        Shadow attribute support added.
@@ -448,6 +455,8 @@ def present(name,
         workphone = sdecode(workphone)
     if homephone is not None:
         homephone = sdecode(homephone)
+    if other is not None:
+        other = sdecode(other)
 
     # createhome not supported on Windows or Mac
     if __grains__['kernel'] in ('Darwin', 'Windows'):
@@ -460,7 +469,7 @@ def present(name,
 
     # the comma is used to separate field in GECOS, thus resulting into
     # salt adding the end of fullname each time this function is called
-    for gecos_field in ['fullname', 'roomnumber', 'workphone']:
+    for gecos_field in [fullname, roomnumber, workphone]:
         if isinstance(gecos_field, string_types) and ',' in gecos_field:
             ret['comment'] = "Unsupported char ',' in {0}".format(gecos_field)
             ret['result'] = False
@@ -519,6 +528,7 @@ def present(name,
                            roomnumber,
                            workphone,
                            homephone,
+                           other,
                            loginclass,
                            date,
                            mindays,
@@ -654,6 +664,7 @@ def present(name,
                            roomnumber,
                            workphone,
                            homephone,
+                           other,
                            loginclass,
                            date,
                            mindays,
@@ -705,6 +716,7 @@ def present(name,
                       'roomnumber': roomnumber,
                       'workphone': workphone,
                       'homephone': homephone,
+                      'other': other,
                       'createhome': createhome,
                       'nologinit': nologinit,
                       'loginclass': loginclass}
diff --git a/tests/unit/modules/test_useradd.py 
b/tests/unit/modules/test_useradd.py
index fa30a0df71..e79c78c663 100644
--- a/tests/unit/modules/test_useradd.py
+++ b/tests/unit/modules/test_useradd.py
@@ -46,7 +46,8 @@ class UserAddTestCase(TestCase, LoaderModuleMockMixin):
                           'fullname': 'root',
                           'roomnumber': '',
                           'workphone': '',
-                          'homephone': ''}
+                          'homephone': '',
+                          'other': ''}
 
     @classmethod
     def tearDownClass(cls):
@@ -96,7 +97,8 @@ class UserAddTestCase(TestCase, LoaderModuleMockMixin):
                     'fullname': 'root',
                     'roomnumber': '',
                     'workphone': '',
-                    'homephone': ''}]
+                    'homephone': '',
+                    'other': ''}]
             with patch('salt.modules.useradd._format_info', 
MagicMock(return_value=self.mock_pwall)):
                 self.assertEqual(useradd.getent(), ret)
 
@@ -330,6 +332,36 @@ class UserAddTestCase(TestCase, LoaderModuleMockMixin):
                 with patch.object(useradd, 'info', mock):
                     self.assertFalse(useradd.chhomephone('salt', 1))
 
+    # 'chother' function tests: 1
+
+    def test_chother(self):
+        '''
+        Test if the user's other GECOS attribute is changed
+        '''
+        mock = MagicMock(return_value=False)
+        with patch.object(useradd, '_get_gecos', mock):
+            self.assertFalse(useradd.chother('salt', 1))
+
+        mock = MagicMock(return_value={'other': 'foobar'})
+        with patch.object(useradd, '_get_gecos', mock):
+            self.assertTrue(useradd.chother('salt', 'foobar'))
+
+        mock = MagicMock(return_value={'other': 'foobar2'})
+        with patch.object(useradd, '_get_gecos', mock):
+            mock = MagicMock(return_value=None)
+            with patch.dict(useradd.__salt__, {'cmd.run': mock}):
+                mock = MagicMock(return_value={'other': 'foobar3'})
+                with patch.object(useradd, 'info', mock):
+                    self.assertFalse(useradd.chother('salt', 'foobar'))
+
+        mock = MagicMock(return_value={'other': 'foobar3'})
+        with patch.object(useradd, '_get_gecos', mock):
+            mock = MagicMock(return_value=None)
+            with patch.dict(useradd.__salt__, {'cmd.run': mock}):
+                mock = MagicMock(return_value={'other': 'foobar3'})
+                with patch.object(useradd, 'info', mock):
+                    self.assertFalse(useradd.chother('salt', 'foobar'))
+
     # 'info' function tests: 1
 
     @skipIf(HAS_PWD is False, 'The pwd module is not available')
-- 
2.13.7


++++++ add-saltssh-multi-version-support-across-python-inte.patch ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.248036939 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.252036946 +0200
@@ -1,4 +1,4 @@
-From 36bc22560e050b7afe3d872aed99c0cdb9fde282 Mon Sep 17 00:00:00 2001
+From 23aba97ccbdf9952f6a8107a8d90b40d0d2c41ee Mon Sep 17 00:00:00 2001
 From: Bo Maryniuk <[email protected]>
 Date: Mon, 12 Mar 2018 12:01:39 +0100
 Subject: [PATCH] Add SaltSSH multi-version support across Python
@@ -255,17 +255,15 @@
 Set master_top_first to False by default
 ---
  doc/topics/releases/fluorine.rst    | 178 +++++++++++
- salt/client/ssh/__init__.py         |  66 ++--
- salt/client/ssh/ssh_py_shim.py      |  95 ++++--
+ salt/client/ssh/__init__.py         |  60 ++--
+ salt/client/ssh/ssh_py_shim.py      |  93 ++++--
  salt/client/ssh/wrapper/__init__.py |   2 +-
  salt/config/__init__.py             |   1 +
- salt/modules/zfs.py                 |   4 +-
- salt/modules/zpool.py               |   4 +-
  salt/state.py                       |   2 +-
  salt/utils/hashutils.py             |  37 +++
  salt/utils/thin.py                  | 450 +++++++++++++++++++-------
  tests/unit/utils/test_thin.py       | 612 ++++++++++++++++++++++++++++++++++++
- 11 files changed, 1265 insertions(+), 186 deletions(-)
+ 9 files changed, 1258 insertions(+), 177 deletions(-)
  create mode 100644 doc/topics/releases/fluorine.rst
  create mode 100644 tests/unit/utils/test_thin.py
 
@@ -454,10 +452,10 @@
 +Salt version is also available on the Master machine, although does not need 
to be directly
 +installed together with the older Python interpreter.
 diff --git a/salt/client/ssh/__init__.py b/salt/client/ssh/__init__.py
-index f1c1ad9a22..399facf5c8 100644
+index 141e1c6850..f1300b5698 100644
 --- a/salt/client/ssh/__init__.py
 +++ b/salt/client/ssh/__init__.py
-@@ -150,14 +150,10 @@ EX_PYTHON_INVALID={EX_THIN_PYTHON_INVALID}
+@@ -150,9 +150,7 @@ EX_PYTHON_INVALID={EX_THIN_PYTHON_INVALID}
  PYTHON_CMDS="python3 python27 python2.7 python26 python2.6 python2 python"
  for py_cmd in $PYTHON_CMDS
  do
@@ -466,16 +464,9 @@
 -                              and sys.version_info[0] == {{HOST_PY_MAJOR}}));"
 +    if command -v "$py_cmd" >/dev/null 2>&1 && "$py_cmd" -c "import sys; 
sys.exit(not (sys.version_info >= (2, 6)));"
      then
--        py_cmd_path=`"$py_cmd" -c \
--                   'from __future__ import print_function;
--                   import sys; print(sys.executable);'`
--        cmdpath=$(command -v $py_cmd 2>/dev/null || which $py_cmd 2>/dev/null)
-+        py_cmd_path=`"$py_cmd" -c 'from __future__ import 
print_function;import sys; print(sys.executable);'`
-+        cmdpath=`command -v $py_cmd 2>/dev/null || which $py_cmd 2>/dev/null`
-         if file $cmdpath | grep "shell script" > /dev/null
-         then
-             ex_vars="'PATH', 'LD_LIBRARY_PATH', 'MANPATH', \
-@@ -323,7 +319,8 @@ class SSH(object):
+         py_cmd_path=`"$py_cmd" -c \
+                    'from __future__ import print_function;
+@@ -323,7 +321,8 @@ class SSH(object):
                                               
extra_mods=self.opts.get('thin_extra_mods'),
                                               
overwrite=self.opts['regen_thin'],
                                               
python2_bin=self.opts['python2_bin'],
@@ -485,7 +476,7 @@
          self.mods = mod_data(self.fsclient)
  
      def _get_roster(self):
-@@ -834,10 +831,10 @@ class Single(object):
+@@ -850,10 +849,10 @@ class Single(object):
  
          self.opts = opts
          self.tty = tty
@@ -499,7 +490,7 @@
          if kwargs.get('thin_dir'):
              self.thin_dir = kwargs['thin_dir']
          elif self.winrm:
-@@ -1161,38 +1158,39 @@ class Single(object):
+@@ -1178,38 +1177,39 @@ class Single(object):
              cachedir = self.opts['_caller_cachedir']
          else:
              cachedir = self.opts['cachedir']
@@ -563,7 +554,7 @@
          if six.PY2:
              py_code_enc = py_code.encode('base64')
 diff --git a/salt/client/ssh/ssh_py_shim.py b/salt/client/ssh/ssh_py_shim.py
-index e46220fc80..21d03343b9 100644
+index 5e5dbdc55e..92ede14930 100644
 --- a/salt/client/ssh/ssh_py_shim.py
 +++ b/salt/client/ssh/ssh_py_shim.py
 @@ -16,11 +16,13 @@ import sys
@@ -597,7 +588,7 @@
  ARGS = None
  # The below line is where OPTIONS can be redefined with internal options
  # (rather than cli arguments) when the shim is bundled by
-@@ -128,7 +129,7 @@ def need_deployment():
+@@ -130,7 +131,7 @@ def need_deployment():
                  os.chmod(OPTIONS.saltdir, stt.st_mode | stat.S_IWGRP | 
stat.S_IRGRP | stat.S_IXGRP)
              except OSError:
                  sys.stdout.write('\n\nUnable to set permissions on thin 
directory.\nIf sudo_user is set '
@@ -606,15 +597,14 @@
                  sys.exit(1)
  
      # Delimiter emitted on stdout *only* to indicate shim message to master.
-@@ -161,11 +162,15 @@ def unpack_thin(thin_path):
-     old_umask = os.umask(0o077)
+@@ -163,11 +164,15 @@ def unpack_thin(thin_path):
+     old_umask = os.umask(0o077)  # pylint: disable=blacklisted-function
      tfile.extractall(path=OPTIONS.saltdir)
      tfile.close()
--    os.umask(old_umask)
 +    checksum_path = os.path.normpath(os.path.join(OPTIONS.saltdir, 
"thin_checksum"))
 +    with open(checksum_path, 'w') as chk:
 +        chk.write(OPTIONS.checksum + '\n')
-+    os.umask(old_umask)  # pylint: disable=blacklisted-function
+     os.umask(old_umask)  # pylint: disable=blacklisted-function
      try:
          os.unlink(thin_path)
      except OSError:
@@ -623,7 +613,7 @@
  
  
  def need_ext():
-@@ -199,6 +204,47 @@ def unpack_ext(ext_path):
+@@ -201,6 +206,47 @@ def unpack_ext(ext_path):
      shutil.move(ver_path, ver_dst)
  
  
@@ -671,7 +661,7 @@
  def main(argv):  # pylint: disable=W0613
      '''
      Main program body
-@@ -215,32 +261,25 @@ def main(argv):  # pylint: disable=W0613
+@@ -217,32 +263,25 @@ def main(argv):  # pylint: disable=W0613
              if scpstat != 0:
                  sys.exit(EX_SCP_NOT_FOUND)
  
@@ -716,7 +706,7 @@
              need_deployment()
          # Salt thin exists and is up-to-date - fall through and use it
  
-@@ -270,7 +309,7 @@ def main(argv):  # pylint: disable=W0613
+@@ -272,7 +311,7 @@ def main(argv):  # pylint: disable=W0613
          argv_prepared = ARGS
  
      salt_argv = [
@@ -725,7 +715,7 @@
          salt_call_path,
          '--retcode-passthrough',
          '--local',
-@@ -303,7 +342,10 @@ def main(argv):  # pylint: disable=W0613
+@@ -305,7 +344,10 @@ def main(argv):  # pylint: disable=W0613
      if OPTIONS.tty:
          # Returns bytes instead of string on python 3
          stdout, _ = subprocess.Popen(salt_argv, stdout=subprocess.PIPE, 
stderr=subprocess.PIPE).communicate()
@@ -737,9 +727,9 @@
          sys.stdout.flush()
          if OPTIONS.wipe:
              shutil.rmtree(OPTIONS.saltdir)
-@@ -315,5 +357,6 @@ def main(argv):  # pylint: disable=W0613
+@@ -317,5 +359,6 @@ def main(argv):  # pylint: disable=W0613
      if OPTIONS.cmd_umask is not None:
-         os.umask(old_umask)
+         os.umask(old_umask)  # pylint: disable=blacklisted-function
  
 +
  if __name__ == '__main__':
@@ -758,10 +748,10 @@
                      minion_opts=self.minion_opts,
                      **self.kwargs
 diff --git a/salt/config/__init__.py b/salt/config/__init__.py
-index df0e1388b7..b3de3820b0 100644
+index 289991771d..432364b201 100644
 --- a/salt/config/__init__.py
 +++ b/salt/config/__init__.py
-@@ -1652,6 +1652,7 @@ DEFAULT_MASTER_OPTS = {
+@@ -1663,6 +1663,7 @@ DEFAULT_MASTER_OPTS = {
      'state_top': 'top.sls',
      'state_top_saltenv': None,
      'master_tops': {},
@@ -769,45 +759,11 @@
      'order_masters': False,
      'job_cache': True,
      'ext_job_cache': '',
-diff --git a/salt/modules/zfs.py b/salt/modules/zfs.py
-index bc54044b5c..d8fbfc76be 100644
---- a/salt/modules/zfs.py
-+++ b/salt/modules/zfs.py
-@@ -37,10 +37,10 @@ def __virtual__():
-     '''
-     Only load when the platform has zfs support
-     '''
--    if __grains__['zfs_support']:
-+    if __grains__.get('zfs_support'):
-         return __virtualname__
-     else:
--        return (False, "The zfs module cannot be loaded: zfs not supported")
-+        return False, "The zfs module cannot be loaded: zfs not supported"
- 
- 
- @decorators.memoize
-diff --git a/salt/modules/zpool.py b/salt/modules/zpool.py
-index f955175664..5e03418919 100644
---- a/salt/modules/zpool.py
-+++ b/salt/modules/zpool.py
-@@ -31,10 +31,10 @@ def __virtual__():
-     '''
-     Only load when the platform has zfs support
-     '''
--    if __grains__['zfs_support']:
-+    if __grains__.get('zfs_support'):
-         return __virtualname__
-     else:
--        return (False, "The zpool module cannot be loaded: zfs not supported")
-+        return False, "The zpool module cannot be loaded: zfs not supported"
- 
- 
- @salt.utils.decorators.memoize
 diff --git a/salt/state.py b/salt/state.py
-index 49d68d2edf..8c0b90545c 100644
+index 09709347b1..e7288bce2e 100644
 --- a/salt/state.py
 +++ b/salt/state.py
-@@ -3332,7 +3332,7 @@ class BaseHighState(object):
+@@ -3383,7 +3383,7 @@ class BaseHighState(object):
          ext_matches = self._master_tops()
          for saltenv in ext_matches:
              top_file_matches = matches.get(saltenv, [])
@@ -817,7 +773,7 @@
                  second = top_file_matches
              else:
 diff --git a/salt/utils/hashutils.py b/salt/utils/hashutils.py
-index 4c9cb4a50c..18f7459d3c 100644
+index b42a60d222..ee01be7377 100644
 --- a/salt/utils/hashutils.py
 +++ b/salt/utils/hashutils.py
 @@ -9,6 +9,7 @@ import base64
@@ -828,7 +784,7 @@
  
  # Import Salt libs
  from salt.ext import six
-@@ -163,3 +164,39 @@ def get_hash(path, form='sha256', chunk_size=65536):
+@@ -150,3 +151,39 @@ def get_hash(path, form='sha256', chunk_size=65536):
          for chunk in iter(lambda: ifile.read(chunk_size), b''):
              hash_obj.update(chunk)
          return hash_obj.hexdigest()
@@ -2137,6 +2093,6 @@
 +        for t_line in ['second-system-effect:2:7', 'solar-interference:2:6']:
 +            assert t_line in out
 -- 
-2.15.1
+2.13.7
 
 

++++++ align-suse-salt-master.service-limitnofiles-limit-wi.patch ++++++
>From 816c7ec3b72510346deef17deb2990a09ddab03a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?=
 <[email protected]>
Date: Thu, 31 May 2018 10:58:16 +0100
Subject: [PATCH] Align SUSE salt-master.service 'LimitNOFILES' limit
 with upstream Salt

---
 pkg/suse/salt-master.service | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pkg/suse/salt-master.service b/pkg/suse/salt-master.service
index c0ea4606d8..b31c1a1373 100644
--- a/pkg/suse/salt-master.service
+++ b/pkg/suse/salt-master.service
@@ -4,7 +4,7 @@ Documentation=man:salt-master(1) 
file:///usr/share/doc/salt/html/contents.html h
 After=network.target
 
 [Service]
-LimitNOFILE=16384
+LimitNOFILE=100000
 Type=simple
 ExecStart=/usr/bin/salt-master
 TasksMax=infinity
-- 
2.13.7


++++++ avoid-excessive-syslogging-by-watchdog-cronjob-58.patch ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.268036972 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.268036972 +0200
@@ -1,4 +1,4 @@
-From edb1c95fa06b8bb1d7e6d91beaaddec6d22c966b Mon Sep 17 00:00:00 2001
+From 310f8eb22db6010ba48ab371a7223c1345cfbcf0 Mon Sep 17 00:00:00 2001
 From: Hubert Mantel <[email protected]>
 Date: Mon, 27 Nov 2017 13:55:13 +0100
 Subject: [PATCH] avoid excessive syslogging by watchdog cronjob (#58)
@@ -21,6 +21,6 @@
          /usr/bin/salt-daemon-watcher --with-init & disown
      fi
 -- 
-2.16.2
+2.13.7
 
 

++++++ avoid-incomprehensive-message-if-crashes.patch ++++++
>From c4d9227b6da4407348e181f092445f17e3c14b51 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?=
 <[email protected]>
Date: Thu, 26 Jul 2018 16:42:10 +0100
Subject: [PATCH] Avoid incomprehensive message if crashes

Check dmidecoder executable on each call to avoid crashing

Fix pylint issues
---
 salt/modules/smbios.py | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/salt/modules/smbios.py b/salt/modules/smbios.py
index c8a0e54a5c..c0b94c2a65 100644
--- a/salt/modules/smbios.py
+++ b/salt/modules/smbios.py
@@ -19,6 +19,7 @@ import re
 
 # Import salt libs
 import salt.utils.path
+from salt.exceptions import CommandExecutionError
 
 # Solve the Chicken and egg problem where grains need to run before any
 # of the modules are loaded and are generally available for any usage.
@@ -32,10 +33,16 @@ log = logging.getLogger(__name__)
 DMIDECODER = salt.utils.path.which_bin(['dmidecode', 'smbios'])
 
 
+def _refresh_dmidecoder():
+    global DMIDECODER
+    DMIDECODER = salt.utils.path.which_bin(['dmidecode', 'smbios'])
+
+
 def __virtual__():
     '''
     Only work when dmidecode is installed.
     '''
+    _refresh_dmidecoder()
     if DMIDECODER is None:
         log.debug('SMBIOS: neither dmidecode nor smbios found!')
         return (False, 'The smbios execution module failed to load: neither 
dmidecode nor smbios in the path.')
@@ -327,6 +334,10 @@ def _dmidecoder(args=None):
     '''
     Call DMIdecode
     '''
+    _refresh_dmidecoder()
+    if DMIDECODER is None:
+        raise CommandExecutionError('SMBIOS: neither dmidecode nor smbios 
found!')
+
     if args is None:
         return salt.modules.cmdmod._run_quiet(DMIDECODER)
     else:
-- 
2.17.1


++++++ do-not-override-jid-on-returners-only-sending-back-t.patch ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.284036999 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.284036999 +0200
@@ -1,4 +1,4 @@
-From c49a9aca3519d1baef2f9d82963a6e80eabb26d4 Mon Sep 17 00:00:00 2001
+From 911d61d1479d89ed31b23b038874505b731c6d86 Mon Sep 17 00:00:00 2001
 From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?=
  <[email protected]>
 Date: Fri, 4 May 2018 09:34:13 +0100
@@ -10,10 +10,10 @@
  1 file changed, 7 insertions(+), 5 deletions(-)
 
 diff --git a/salt/utils/schedule.py b/salt/utils/schedule.py
-index 6cb3ce0ef8..e81ae143bd 100644
+index 65c2e3fbda..32fdae9786 100644
 --- a/salt/utils/schedule.py
 +++ b/salt/utils/schedule.py
-@@ -753,11 +753,13 @@ class Schedule(object):
+@@ -755,11 +755,13 @@ class Schedule(object):
                  else:
                      # Send back to master so the job is included in the job 
list
                      mret = ret.copy()
@@ -33,6 +33,6 @@
                      for key, value in six.iteritems(mret):
                          load[key] = value
 -- 
-2.15.1
+2.13.7
 
 

++++++ enable-passing-a-unix_socket-for-mysql-returners-bsc.patch ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.292037013 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.292037013 +0200
@@ -1,4 +1,4 @@
-From cdfb19b6c2801a7d5a883492a0ccc57c803dcd7f Mon Sep 17 00:00:00 2001
+From d937d1edb837bc084c1eaa320e8433382135e2d9 Mon Sep 17 00:00:00 2001
 From: Maximilian Meister <[email protected]>
 Date: Thu, 3 May 2018 15:52:23 +0200
 Subject: [PATCH] enable passing a unix_socket for mysql returners
@@ -69,6 +69,6 @@
              try:
                  __context__['mysql_returner_conn'] = conn
 -- 
-2.13.6
+2.13.7
 
 

++++++ fall-back-to-pymysql.patch ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.304037033 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.304037033 +0200
@@ -1,4 +1,4 @@
-From f7ba683153e11be401a5971ba029d0a3964b1ecb Mon Sep 17 00:00:00 2001
+From 9e0c0bbc1b48fa7065a9d0f50bd7111789712e2d Mon Sep 17 00:00:00 2001
 From: Maximilian Meister <[email protected]>
 Date: Thu, 5 Apr 2018 13:23:23 +0200
 Subject: [PATCH] fall back to PyMySQL
@@ -123,7 +123,7 @@
              raise
          # reconnect creating new client
 diff --git a/salt/modules/mysql.py b/salt/modules/mysql.py
-index 0625b02a96..8b17e461ea 100644
+index 833a766a97..a5965f3a25 100644
 --- a/salt/modules/mysql.py
 +++ b/salt/modules/mysql.py
 @@ -51,13 +51,14 @@ import salt.utils.stringutils
@@ -299,7 +299,7 @@
  
      cursor = conn.cursor()
 diff --git a/tests/unit/pillar/test_mysql.py b/tests/unit/pillar/test_mysql.py
-index 8d49ac24e2..b72988673d 100644
+index a242eac1a1..f6a2d0a44b 100644
 --- a/tests/unit/pillar/test_mysql.py
 +++ b/tests/unit/pillar/test_mysql.py
 @@ -12,7 +12,7 @@ import salt.pillar.mysql as mysql
@@ -312,6 +312,6 @@
      maxDiff = None
  
 -- 
-2.13.6
+2.13.7
 
 

++++++ feat-add-grain-for-all-fqdns.patch ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.312037046 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.312037046 +0200
@@ -1,4 +1,4 @@
-From 0449bead92ff763d186f5e524556f82c618d652c Mon Sep 17 00:00:00 2001
+From 6e5f0fbbe3c232c7d5212d4fddfe52b5a5a71597 Mon Sep 17 00:00:00 2001
 From: Michele Bologna <[email protected]>
 Date: Thu, 14 Dec 2017 18:20:02 +0100
 Subject: [PATCH] Feat: add grain for all FQDNs
@@ -21,10 +21,10 @@
  3 files changed, 29 insertions(+)
 
 diff --git a/salt/grains/core.py b/salt/grains/core.py
-index b7d446676e..96b7ce2cf2 100644
+index 8545d4368c..24de3cff6b 100644
 --- a/salt/grains/core.py
 +++ b/salt/grains/core.py
-@@ -1888,6 +1888,33 @@ def append_domain():
+@@ -1886,6 +1886,33 @@ def append_domain():
      return grain
  
  
@@ -59,7 +59,7 @@
      '''
      Return ip address and FQDN grains
 diff --git a/tests/integration/modules/test_grains.py 
b/tests/integration/modules/test_grains.py
-index 709f882b45..aa7bd44202 100644
+index 616e07d455..dfa70afa03 100644
 --- a/tests/integration/modules/test_grains.py
 +++ b/tests/integration/modules/test_grains.py
 @@ -51,6 +51,7 @@ class TestModulesGrains(ModuleCase):
@@ -71,7 +71,7 @@
              'groupname',
              'host',
 diff --git a/tests/unit/grains/test_core.py b/tests/unit/grains/test_core.py
-index 50babe3ed3..47c9cdd35b 100644
+index 54c8293dcf..616c62e658 100644
 --- a/tests/unit/grains/test_core.py
 +++ b/tests/unit/grains/test_core.py
 @@ -7,6 +7,7 @@
@@ -83,6 +83,6 @@
  # Import Salt Testing Libs
  try:
 -- 
-2.16.2
+2.13.7
 
 

++++++ fix-bsc-1065792.patch ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.320037060 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.320037060 +0200
@@ -1,4 +1,4 @@
-From 27d0e8b7e7c1eae68ef6dc972ea0f091d18cd92e Mon Sep 17 00:00:00 2001
+From 30a4053231cf67f486ca1f430dce563f7247d963 Mon Sep 17 00:00:00 2001
 From: Bo Maryniuk <[email protected]>
 Date: Thu, 14 Dec 2017 16:21:40 +0100
 Subject: [PATCH] Fix bsc#1065792
@@ -20,6 +20,6 @@
          return __virtualname__
      else:
 -- 
-2.16.2
+2.13.7
 
 

++++++ fix-decrease-loglevel-when-unable-to-resolve-addr.patch ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.324037066 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.328037073 +0200
@@ -1,4 +1,4 @@
-From 14128fc65bf007bbb5b27b3eedec30b7f729bfbd Mon Sep 17 00:00:00 2001
+From 5d12b612b1f7b05a13e7b8da02e50ec471a72187 Mon Sep 17 00:00:00 2001
 From: Michele Bologna <[email protected]>
 Date: Tue, 20 Mar 2018 19:27:36 +0100
 Subject: [PATCH] Fix: decrease loglevel when unable to resolve addr
@@ -54,10 +54,10 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/salt/grains/core.py b/salt/grains/core.py
-index 96b7ce2cf2..17a7d9819a 100644
+index 24de3cff6b..c166a43d7c 100644
 --- a/salt/grains/core.py
 +++ b/salt/grains/core.py
-@@ -1909,7 +1909,7 @@ def fqdns():
+@@ -1907,7 +1907,7 @@ def fqdns():
              fqdns.add(socket.gethostbyaddr(ip)[0])
          except (socket.error, socket.herror,
              socket.gaierror, socket.timeout) as e:
@@ -67,6 +67,6 @@
      grains['fqdns'] = list(fqdns)
      return grains
 -- 
-2.16.2
+2.13.7
 
 

++++++ fix-deprecation-warning-bsc-1095507.patch ++++++
>From 9289e1607ebf6f397c027d4a6edcf35c59bd600c Mon Sep 17 00:00:00 2001
From: Mihai Dinca <[email protected]>
Date: Wed, 6 Jun 2018 15:47:45 +0200
Subject: [PATCH] Fix deprecation warning (bsc#1095507)

---
 salt/utils/thin.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/salt/utils/thin.py b/salt/utils/thin.py
index e4b878eb19..b99e407583 100644
--- a/salt/utils/thin.py
+++ b/salt/utils/thin.py
@@ -546,7 +546,7 @@ def thin_sum(cachedir, form='sha1'):
     thintar = gen_thin(cachedir)
     code_checksum_path = os.path.join(cachedir, 'thin', 'code-checksum')
     if os.path.isfile(code_checksum_path):
-        with salt.utils.fopen(code_checksum_path, 'r') as fh:
+        with salt.utils.files.fopen(code_checksum_path, 'r') as fh:
             code_checksum = "'{0}'".format(fh.read().strip())
     else:
         code_checksum = "'0'"
-- 
2.13.7


++++++ fix-diffing-binary-files-in-file.get_diff-bsc-109839.patch ++++++
>From 7bda1dcd4f14da55abe38b1739b1e46ad0f5213c Mon Sep 17 00:00:00 2001
From: Erik Johnson <[email protected]>
Date: Fri, 13 Apr 2018 11:25:24 -0500
Subject: [PATCH] Fix diffing binary files in file.get_diff (bsc#1098394)

---
 salt/modules/file.py | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/salt/modules/file.py b/salt/modules/file.py
index 1b4b7e0e46..95bca7fb1b 100644
--- a/salt/modules/file.py
+++ b/salt/modules/file.py
@@ -5008,8 +5008,7 @@ def get_diff(file1,
                         *salt.utils.data.decode(args)
                     )
                 )
-        return ret
-    return ''
+    return ret
 
 
 def manage_file(name,
-- 
2.13.7


++++++ fix-for-ec2-rate-limit-failures.patch ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.348037106 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.348037106 +0200
@@ -1,4 +1,4 @@
-From b0273e150b29fb44d72246918792117b485441de Mon Sep 17 00:00:00 2001
+From 88a99b5beeaa51eaf646eb92d8f546f65f654008 Mon Sep 17 00:00:00 2001
 From: Daniel Wallace <[email protected]>
 Date: Wed, 25 Apr 2018 11:13:15 -0500
 Subject: [PATCH] Fix for EC2 Rate Limit Failures
@@ -61,6 +61,6 @@
  
              log.error(
 -- 
-2.13.6
+2.13.7
 
 

++++++ fix-for-errno-0-resolver-error-0-no-error-bsc-108758.patch ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.356037120 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.356037120 +0200
@@ -1,4 +1,4 @@
-From b9cc71639d4e918ef14635124f6991917150de46 Mon Sep 17 00:00:00 2001
+From 826194be2a036fee80d3ca546822023416ac3a7d Mon Sep 17 00:00:00 2001
 From: Bo Maryniuk <[email protected]>
 Date: Wed, 21 Mar 2018 11:10:23 +0100
 Subject: [PATCH] Fix for [Errno 0] Resolver Error 0 (no error)
@@ -9,14 +9,14 @@
   * Fix unit test for reversed fqdns return data
 ---
  salt/grains/core.py            | 19 ++++++++++++-------
- tests/unit/grains/test_core.py | 32 ++++++++++++++++++++++++++++++++
- 2 files changed, 44 insertions(+), 7 deletions(-)
+ tests/unit/grains/test_core.py | 22 ++++++++++++++++++++++
+ 2 files changed, 34 insertions(+), 7 deletions(-)
 
 diff --git a/salt/grains/core.py b/salt/grains/core.py
-index 17a7d9819a..cd9ba1f29c 100644
+index c166a43d7c..dc472a6c0a 100644
 --- a/salt/grains/core.py
 +++ b/salt/grains/core.py
-@@ -1900,16 +1900,21 @@ def fqdns():
+@@ -1898,16 +1898,21 @@ def fqdns():
      fqdns = set()
  
      addresses = salt.utils.network.ip_addrs(include_loopback=False,
@@ -46,22 +46,13 @@
      grains['fqdns'] = list(fqdns)
      return grains
 diff --git a/tests/unit/grains/test_core.py b/tests/unit/grains/test_core.py
-index 47c9cdd35b..c604df6c57 100644
+index 616c62e658..dd7d5b06f8 100644
 --- a/tests/unit/grains/test_core.py
 +++ b/tests/unit/grains/test_core.py
-@@ -784,3 +784,35 @@ SwapTotal:       4789244 kB'''
-                        []}}
-         with patch.object(salt.utils.dns, 'parse_resolv', 
MagicMock(return_value=resolv_mock)):
-             assert core.dns() == ret
-+
-+    def _run_dns_test(self, resolv_mock, ret):
-+        with patch.object(salt.utils, 'is_windows',
-+                          MagicMock(return_value=False)):
-+            with patch.dict(core.__opts__, {'ipv6': False}):
-+                with patch.object(salt.utils.dns, 'parse_resolv',
-+                                  MagicMock(return_value=resolv_mock)):
-+                    get_dns = core.dns()
-+                    self.assertEqual(get_dns, ret)
+@@ -877,3 +877,25 @@ SwapTotal:       4789244 kB'''
+                     osdata = {'kernel': 'test', }
+                     ret = core._virtual(osdata)
+                     self.assertEqual(ret['virtual'], virt)
 +
 +    @skipIf(not salt.utils.platform.is_linux(), 'System is not Linux')
 +    @patch.object(salt.utils, 'is_windows', MagicMock(return_value=False))
@@ -84,8 +75,7 @@
 +            self.assertIn('fqdns', fqdns)
 +            self.assertEqual(len(fqdns['fqdns']), len(ret['fqdns']))
 +            self.assertEqual(set(fqdns['fqdns']), set(ret['fqdns']))
-+
 -- 
-2.13.6
+2.13.7
 
 

++++++ fix-unboundlocalerror-in-file.get_diff.patch ++++++
>From 854ffed98894b8aa8b51973c0ba13fb75093e715 Mon Sep 17 00:00:00 2001
From: Erik Johnson <[email protected]>
Date: Mon, 30 Apr 2018 10:25:40 -0500
Subject: [PATCH] Fix UnboundLocalError in file.get_diff

This was only in 2018.3 head and not part of a release

Add unit test for file.get_diff

Use a lambda instead of defining a one-line function
---
 salt/modules/file.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/salt/modules/file.py b/salt/modules/file.py
index 95bca7fb1b..1b4b7e0e46 100644
--- a/salt/modules/file.py
+++ b/salt/modules/file.py
@@ -5008,7 +5008,8 @@ def get_diff(file1,
                         *salt.utils.data.decode(args)
                     )
                 )
-    return ret
+        return ret
+    return ''
 
 
 def manage_file(name,
-- 
2.13.7


++++++ fix-zypper.list_pkgs-to-be-aligned-with-pkg-state.patch ++++++
>From 997edb18b81d73933324b299da36474c24630b42 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?=
 <[email protected]>
Date: Mon, 25 Jun 2018 13:06:40 +0100
Subject: [PATCH] Fix zypper.list_pkgs to be aligned with pkg state

Handle packages with multiple version properly with zypper

Add unit test coverage for multiple version packages on Zypper

Fix '_find_remove_targets' after aligning Zypper with pkg state
---
 salt/modules/zypper.py            |  57 +++++++++++++---------
 salt/states/pkg.py                |  21 --------
 tests/unit/modules/test_zypper.py | 100 +++++++++++++++++++++++++-------------
 3 files changed, 102 insertions(+), 76 deletions(-)

diff --git a/salt/modules/zypper.py b/salt/modules/zypper.py
index 05ba3d86c9..4689f84926 100644
--- a/salt/modules/zypper.py
+++ b/salt/modules/zypper.py
@@ -38,6 +38,7 @@ import salt.utils.files
 import salt.utils.functools
 import salt.utils.path
 import salt.utils.pkg
+import salt.utils.pkg.rpm
 import salt.utils.stringutils
 import salt.utils.systemd
 from salt.utils.versions import LooseVersion
@@ -714,24 +715,44 @@ def list_pkgs(versions_as_list=False, **kwargs):
     contextkey = 'pkg.list_pkgs'
 
     if contextkey not in __context__:
-
-        cmd = ['rpm', '-qa', '--queryformat', (
-            "%{NAME}_|-%{VERSION}_|-%{RELEASE}_|-%{ARCH}_|-"
-            "%|EPOCH?{%{EPOCH}}:{}|_|-%{INSTALLTIME}\\n")]
         ret = {}
-        for line in __salt__['cmd.run'](cmd, output_loglevel='trace', 
python_shell=False).splitlines():
-            name, pkgver, rel, arch, epoch, install_time = line.split('_|-')
-            install_date = 
datetime.datetime.utcfromtimestamp(int(install_time)).isoformat() + "Z"
-            install_date_time_t = int(install_time)
-
-            all_attr = {'epoch': epoch, 'version': pkgver, 'release': rel, 
'arch': arch,
-                        'install_date': install_date, 'install_date_time_t': 
install_date_time_t}
-            __salt__['pkg_resource.add_pkg'](ret, name, all_attr)
+        cmd = ['rpm', '-qa', '--queryformat',
+               salt.utils.pkg.rpm.QUERYFORMAT.replace('%{REPOID}', '(none)') + 
'\n']
+        output = __salt__['cmd.run'](cmd,
+                                     python_shell=False,
+                                     output_loglevel='trace')
+        for line in output.splitlines():
+            pkginfo = salt.utils.pkg.rpm.parse_pkginfo(
+                line,
+                osarch=__grains__['osarch']
+            )
+            if pkginfo is not None:
+                # see rpm version string rules available at 
https://goo.gl/UGKPNd
+                pkgver = pkginfo.version
+                epoch = ''
+                release = ''
+                if ':' in pkgver:
+                    epoch, pkgver = pkgver.split(":", 1)
+                if '-' in pkgver:
+                    pkgver, release = pkgver.split("-", 1)
+                all_attr = {
+                    'epoch': epoch,
+                    'version': pkgver,
+                    'release': release,
+                    'arch': pkginfo.arch,
+                    'install_date': pkginfo.install_date,
+                    'install_date_time_t': pkginfo.install_date_time_t
+                }
+                __salt__['pkg_resource.add_pkg'](ret, pkginfo.name, all_attr)
 
+        _ret = {}
         for pkgname in ret:
-            ret[pkgname] = sorted(ret[pkgname], key=lambda d: d['version'])
+            # Filter out GPG public keys packages
+            if pkgname.startswith('gpg-pubkey'):
+                continue
+            _ret[pkgname] = sorted(ret[pkgname], key=lambda d: d['version'])
 
-        __context__[contextkey] = ret
+        __context__[contextkey] = _ret
 
     return __salt__['pkg_resource.format_pkg_list'](
         __context__[contextkey],
@@ -1350,14 +1371,6 @@ def install(name=None,
 
     _clean_cache()
     new = list_pkgs(attr=diff_attr) if not downloadonly else list_downloaded()
-
-    # Handle packages which report multiple new versions
-    # (affects only kernel packages at this point)
-    for pkg_name in new:
-        pkg_data = new[pkg_name]
-        if isinstance(pkg_data, six.string_types):
-            new[pkg_name] = pkg_data.split(',')[-1]
-
     ret = salt.utils.data.compare_dicts(old, new)
 
     if errors:
diff --git a/salt/states/pkg.py b/salt/states/pkg.py
index ed405cb6b5..aad87e3278 100644
--- a/salt/states/pkg.py
+++ b/salt/states/pkg.py
@@ -415,16 +415,6 @@ def _find_remove_targets(name=None,
 
         if __grains__['os'] == 'FreeBSD' and origin:
             cver = [k for k, v in six.iteritems(cur_pkgs) if v['origin'] == 
pkgname]
-        elif __grains__['os_family'] == 'Suse':
-            # On SUSE systems. Zypper returns packages without "arch" in name
-            try:
-                namepart, archpart = pkgname.rsplit('.', 1)
-            except ValueError:
-                cver = cur_pkgs.get(pkgname, [])
-            else:
-                if archpart in salt.utils.pkg.rpm.ARCHES + ("noarch",):
-                    pkgname = namepart
-                cver = cur_pkgs.get(pkgname, [])
         else:
             cver = cur_pkgs.get(pkgname, [])
 
@@ -854,17 +844,6 @@ def _verify_install(desired, new_pkgs, ignore_epoch=False, 
new_caps=None):
             cver = new_pkgs.get(pkgname.split('%')[0])
         elif __grains__['os_family'] == 'Debian':
             cver = new_pkgs.get(pkgname.split('=')[0])
-        elif __grains__['os_family'] == 'Suse':
-            # On SUSE systems. Zypper returns packages without "arch" in name
-            try:
-                namepart, archpart = pkgname.rsplit('.', 1)
-            except ValueError:
-                cver = new_pkgs.get(pkgname)
-            else:
-                if archpart in salt.utils.pkg.rpm.ARCHES + ("noarch",):
-                    cver = new_pkgs.get(namepart)
-                else:
-                    cver = new_pkgs.get(pkgname)
         else:
             cver = new_pkgs.get(pkgname)
             if not cver and pkgname in new_caps:
diff --git a/tests/unit/modules/test_zypper.py 
b/tests/unit/modules/test_zypper.py
index 6eccee568b..bb15aca11a 100644
--- a/tests/unit/modules/test_zypper.py
+++ b/tests/unit/modules/test_zypper.py
@@ -475,7 +475,7 @@ class ZypperTestCase(TestCase, LoaderModuleMockMixin):
                     with patch('salt.modules.zypper.list_pkgs', 
MagicMock(side_effect=[
                         {"kernel-default": "3.12.49-11.1"}, {"kernel-default": 
"3.12.49-11.1,3.12.51-60.20.2"}])):
                         ret = zypper.install('kernel-default', 
'--auto-agree-with-licenses')
-                        self.assertDictEqual(ret, {"kernel-default": {"old": 
"3.12.49-11.1", "new": "3.12.51-60.20.2"}})
+                        self.assertDictEqual(ret, {"kernel-default": {"old": 
"3.12.49-11.1", "new": "3.12.49-11.1,3.12.51-60.20.2"}})
 
     def test_upgrade_failure(self):
         '''
@@ -540,27 +540,36 @@ Repository 'DUMMY' not found by its alias, number, or URI.
             data.setdefault(key, []).append(value)
 
         rpm_out = [
-            'protobuf-java_|-2.6.1_|-3.1.develHead_|-noarch_|-_|-1499257756',
-            'yast2-ftp-server_|-3.1.8_|-8.1_|-x86_64_|-_|-1499257798',
-            'jose4j_|-0.4.4_|-2.1.develHead_|-noarch_|-_|-1499257756',
-            'apache-commons-cli_|-1.2_|-1.233_|-noarch_|-_|-1498636510',
-            
'jakarta-commons-discovery_|-0.4_|-129.686_|-noarch_|-_|-1498636511',
-            
'susemanager-build-keys-web_|-12.0_|-5.1.develHead_|-noarch_|-_|-1498636510',
+            
'protobuf-java_|-(none)_|-2.6.1_|-3.1.develHead_|-noarch_|-(none)_|-1499257756',
+            
'yast2-ftp-server_|-(none)_|-3.1.8_|-8.1_|-x86_64_|-(none)_|-1499257798',
+            
'jose4j_|-(none)_|-0.4.4_|-2.1.develHead_|-noarch_|-(none)_|-1499257756',
+            
'apache-commons-cli_|-(none)_|-1.2_|-1.233_|-noarch_|-(none)_|-1498636510',
+            
'jakarta-commons-discovery_|-(none)_|-0.4_|-129.686_|-noarch_|-(none)_|-1498636511',
+            
'susemanager-build-keys-web_|-(none)_|-12.0_|-5.1.develHead_|-noarch_|-(none)_|-1498636510',
+            
'gpg-pubkey_|-(none)_|-39db7c82_|-5847eb1f_|-(none)_|-(none)_|-1519203802',
+            
'gpg-pubkey_|-(none)_|-8a7c64f9_|-5aaa93ca_|-(none)_|-(none)_|-1529925595',
+            
'kernel-default_|-(none)_|-4.4.138_|-94.39.1_|-x86_64_|-(none)_|-1529936067',
+            
'kernel-default_|-(none)_|-4.4.73_|-5.1_|-x86_64_|-(none)_|-1503572639',
+            'perseus-dummy_|-(none)_|-1.1_|-1.1_|-i586_|-(none)_|-1529936062',
         ]
-        with patch.dict(zypper.__salt__, {'cmd.run': 
MagicMock(return_value=os.linesep.join(rpm_out))}), \
+        with patch.dict(zypper.__grains__, {'osarch': 'x86_64'}), \
+             patch.dict(zypper.__salt__, {'cmd.run': 
MagicMock(return_value=os.linesep.join(rpm_out))}), \
              patch.dict(zypper.__salt__, {'pkg_resource.add_pkg': _add_data}), 
\
              patch.dict(zypper.__salt__, {'pkg_resource.format_pkg_list': 
pkg_resource.format_pkg_list}), \
              patch.dict(zypper.__salt__, {'pkg_resource.stringify': 
MagicMock()}):
             pkgs = zypper.list_pkgs(versions_as_list=True)
+            self.assertFalse(pkgs.get('gpg-pubkey', False))
             for pkg_name, pkg_version in {
-                'jakarta-commons-discovery': '0.4-129.686',
-                'yast2-ftp-server': '3.1.8-8.1',
-                'protobuf-java': '2.6.1-3.1.develHead',
-                'susemanager-build-keys-web': '12.0-5.1.develHead',
-                'apache-commons-cli': '1.2-1.233',
-                'jose4j': '0.4.4-2.1.develHead'}.items():
+                'jakarta-commons-discovery': ['0.4-129.686'],
+                'yast2-ftp-server': ['3.1.8-8.1'],
+                'protobuf-java': ['2.6.1-3.1.develHead'],
+                'susemanager-build-keys-web': ['12.0-5.1.develHead'],
+                'apache-commons-cli': ['1.2-1.233'],
+                'kernel-default': ['4.4.138-94.39.1', '4.4.73-5.1'],
+                'perseus-dummy.i586': ['1.1-1.1'],
+                'jose4j': ['0.4.4-2.1.develHead']}.items():
                 self.assertTrue(pkgs.get(pkg_name))
-                self.assertEqual(pkgs[pkg_name], [pkg_version])
+                self.assertEqual(pkgs[pkg_name], pkg_version)
 
     def test_list_pkgs_with_attr(self):
         '''
@@ -572,57 +581,82 @@ Repository 'DUMMY' not found by its alias, number, or URI.
             data.setdefault(key, []).append(value)
 
         rpm_out = [
-            'protobuf-java_|-2.6.1_|-3.1.develHead_|-noarch_|-_|-1499257756',
-            'yast2-ftp-server_|-3.1.8_|-8.1_|-x86_64_|-_|-1499257798',
-            'jose4j_|-0.4.4_|-2.1.develHead_|-noarch_|-_|-1499257756',
-            'apache-commons-cli_|-1.2_|-1.233_|-noarch_|-_|-1498636510',
-            
'jakarta-commons-discovery_|-0.4_|-129.686_|-noarch_|-_|-1498636511',
-            
'susemanager-build-keys-web_|-12.0_|-5.1.develHead_|-noarch_|-_|-1498636510',
+            
'protobuf-java_|-(none)_|-2.6.1_|-3.1.develHead_|-noarch_|-(none)_|-1499257756',
+            
'yast2-ftp-server_|-(none)_|-3.1.8_|-8.1_|-x86_64_|-(none)_|-1499257798',
+            
'jose4j_|-(none)_|-0.4.4_|-2.1.develHead_|-noarch_|-(none)_|-1499257756',
+            
'apache-commons-cli_|-(none)_|-1.2_|-1.233_|-noarch_|-(none)_|-1498636510',
+            
'jakarta-commons-discovery_|-(none)_|-0.4_|-129.686_|-noarch_|-(none)_|-1498636511',
+            
'susemanager-build-keys-web_|-(none)_|-12.0_|-5.1.develHead_|-noarch_|-(none)_|-1498636510',
+            
'gpg-pubkey_|-(none)_|-39db7c82_|-5847eb1f_|-(none)_|-(none)_|-1519203802',
+            
'gpg-pubkey_|-(none)_|-8a7c64f9_|-5aaa93ca_|-(none)_|-(none)_|-1529925595',
+            
'kernel-default_|-(none)_|-4.4.138_|-94.39.1_|-x86_64_|-(none)_|-1529936067',
+            
'kernel-default_|-(none)_|-4.4.73_|-5.1_|-x86_64_|-(none)_|-1503572639',
+            'perseus-dummy_|-(none)_|-1.1_|-1.1_|-i586_|-(none)_|-1529936062',
         ]
         with patch.dict(zypper.__salt__, {'cmd.run': 
MagicMock(return_value=os.linesep.join(rpm_out))}), \
+             patch.dict(zypper.__grains__, {'osarch': 'x86_64'}), \
              patch.dict(zypper.__salt__, {'pkg_resource.add_pkg': _add_data}), 
\
              patch.dict(zypper.__salt__, {'pkg_resource.format_pkg_list': 
pkg_resource.format_pkg_list}), \
              patch.dict(zypper.__salt__, {'pkg_resource.stringify': 
MagicMock()}):
             pkgs = zypper.list_pkgs(attr=['epoch', 'release', 'arch', 
'install_date_time_t'])
+            self.assertFalse(pkgs.get('gpg-pubkey', False))
             for pkg_name, pkg_attr in {
-                'jakarta-commons-discovery': {
+                'jakarta-commons-discovery': [{
                     'version': '0.4',
                     'release': '129.686',
                     'arch': 'noarch',
                     'install_date_time_t': 1498636511,
-                },
-                'yast2-ftp-server': {
+                }],
+                'yast2-ftp-server': [{
                     'version': '3.1.8',
                     'release': '8.1',
                     'arch': 'x86_64',
                     'install_date_time_t': 1499257798,
-                },
-                'protobuf-java': {
+                }],
+                'protobuf-java': [{
                     'version': '2.6.1',
                     'release': '3.1.develHead',
                     'install_date_time_t': 1499257756,
                     'arch': 'noarch',
-                },
-                'susemanager-build-keys-web': {
+                }],
+                'susemanager-build-keys-web': [{
                     'version': '12.0',
                     'release': '5.1.develHead',
                     'arch': 'noarch',
                     'install_date_time_t': 1498636510,
-                },
-                'apache-commons-cli': {
+                }],
+                'apache-commons-cli': [{
                     'version': '1.2',
                     'release': '1.233',
                     'arch': 'noarch',
                     'install_date_time_t': 1498636510,
+                }],
+                'kernel-default': [{
+                    'version': '4.4.138',
+                    'release': '94.39.1',
+                    'arch': 'x86_64',
+                    'install_date_time_t': 1529936067
                 },
-                'jose4j': {
+                {
+                    'version': '4.4.73',
+                    'release': '5.1',
+                    'arch': 'x86_64',
+                    'install_date_time_t': 1503572639,
+                }],
+                'perseus-dummy.i586': [{
+                    'version': '1.1',
+                    'release': '1.1',
+                    'arch': 'i586',
+                    'install_date_time_t': 1529936062,
+                }],
+                'jose4j': [{
                     'arch': 'noarch',
                     'version': '0.4.4',
                     'release': '2.1.develHead',
                     'install_date_time_t': 1499257756,
-                }}.items():
+                }]}.items():
                 self.assertTrue(pkgs.get(pkg_name))
-                self.assertEqual(pkgs[pkg_name], [pkg_attr])
+                self.assertEqual(pkgs[pkg_name], pkg_attr)
 
     def test_list_patches(self):
         '''
-- 
2.13.7


++++++ fixed-usage-of-ipaddress.patch ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.380037160 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.380037160 +0200
@@ -1,4 +1,4 @@
-From 205e031f6e5552ac860120f7ac852e24c5da73e5 Mon Sep 17 00:00:00 2001
+From 8ae052fbb07d7506492b430579308e4611e51754 Mon Sep 17 00:00:00 2001
 From: Jochen Breuer <[email protected]>
 Date: Sun, 22 Apr 2018 23:11:11 +0200
 Subject: [PATCH] Fixed usage of ipaddress
@@ -23,6 +23,6 @@
      ret['netmask'] = six.text_type(network_info.netmask)
      return ret
 -- 
-2.13.6
+2.13.7
 
 

++++++ option-to-merge-current-pillar-with-opts-pillar-duri.patch ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.424037234 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.424037234 +0200
@@ -1,4 +1,4 @@
-From 0cfa4f2a1cf559f87286069691a2766cb24f6076 Mon Sep 17 00:00:00 2001
+From e8c1b2c5a8af5cc6f4551918f695d1463a6eb584 Mon Sep 17 00:00:00 2001
 From: Matei Albu <[email protected]>
 Date: Sun, 6 May 2018 21:15:58 +0200
 Subject: [PATCH] Option to merge current pillar with opts['pillar']
@@ -13,7 +13,7 @@
  3 files changed, 38 insertions(+), 1 deletion(-)
 
 diff --git a/doc/ref/configuration/minion.rst 
b/doc/ref/configuration/minion.rst
-index 9683a0a20a..75ad26c723 100644
+index c9010a702b..d9823b78d8 100644
 --- a/doc/ref/configuration/minion.rst
 +++ b/doc/ref/configuration/minion.rst
 @@ -3219,3 +3219,31 @@ URL of the repository:
@@ -49,10 +49,10 @@
 +If set to ``False`` only the overriding pillar data will be available
 +to the ``showpillar`` state.
 diff --git a/salt/config/__init__.py b/salt/config/__init__.py
-index b3de3820b0..82d3dfa07f 100644
+index 432364b201..feda0abac1 100644
 --- a/salt/config/__init__.py
 +++ b/salt/config/__init__.py
-@@ -983,6 +983,7 @@ VALID_OPTS = {
+@@ -989,6 +989,7 @@ VALID_OPTS = {
      'ssh_identities_only': bool,
      'ssh_log_file': six.string_types,
      'ssh_config_file': six.string_types,
@@ -60,7 +60,7 @@
  
      # Enable ioflo verbose logging. Warning! Very verbose!
      'ioflo_verbose': int,
-@@ -1476,6 +1477,7 @@ DEFAULT_MINION_OPTS = {
+@@ -1485,6 +1486,7 @@ DEFAULT_MINION_OPTS = {
      },
      'discovery': False,
      'schedule': {},
@@ -68,7 +68,7 @@
  }
  
  DEFAULT_MASTER_OPTS = {
-@@ -2078,7 +2080,7 @@ def _validate_ssh_minion_opts(opts):
+@@ -2089,7 +2091,7 @@ def _validate_ssh_minion_opts(opts):
  
      for opt_name in list(ssh_minion_opts):
          if re.match('^[a-z0-9]+fs_', opt_name, flags=re.IGNORECASE) \
@@ -78,10 +78,10 @@
              log.warning(
                  '\'%s\' is not a valid ssh_minion_opts parameter, ignoring',
 diff --git a/salt/pillar/__init__.py b/salt/pillar/__init__.py
-index 388b774434..5940b7c105 100644
+index fc1e34f75d..fc3ce0a5c0 100644
 --- a/salt/pillar/__init__.py
 +++ b/salt/pillar/__init__.py
-@@ -993,6 +993,13 @@ class Pillar(object):
+@@ -1014,6 +1014,13 @@ class Pillar(object):
              mopts['file_roots'] = self.actual_file_roots
              mopts['saltversion'] = __version__
              pillar['master'] = mopts
@@ -96,6 +96,6 @@
              for error in errors:
                  log.critical('Pillar render error: %s', error)
 -- 
-2.13.6
+2.13.7
 
 

++++++ prevent-zypper-from-parsing-repo-configuration-from-.patch ++++++
>From d282de5c59e27c17bd5afb207c4eeaa754993368 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?=
 <[email protected]>
Date: Tue, 22 May 2018 12:04:48 +0100
Subject: [PATCH] Prevent zypper from parsing repo configuration from not
 .repo files

---
 salt/modules/zypper.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/salt/modules/zypper.py b/salt/modules/zypper.py
index 06f8335c18..05ba3d86c9 100644
--- a/salt/modules/zypper.py
+++ b/salt/modules/zypper.py
@@ -862,7 +862,7 @@ def _get_configured_repos():
     '''
 
     repos_cfg = configparser.ConfigParser()
-    repos_cfg.read([REPOS + '/' + fname for fname in os.listdir(REPOS)])
+    repos_cfg.read([REPOS + '/' + fname for fname in os.listdir(REPOS) if 
fname.endswith(".repo")])
 
     return repos_cfg
 
-- 
2.13.7


++++++ remove-old-hack-when-reporting-multiversion-packages.patch ++++++
>From 11186ce52ae42967c49a6e238659a566e488a6b4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?=
 <[email protected]>
Date: Mon, 23 Jul 2018 16:32:26 +0100
Subject: [PATCH] Remove old hack when reporting multiversion packages

Fix unit tests for zypper pkg.upgrade
---
 salt/modules/zypper.py            | 5 -----
 tests/unit/modules/test_zypper.py | 8 +++++++-
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/salt/modules/zypper.py b/salt/modules/zypper.py
index 4689f84926..695bce4f4e 100644
--- a/salt/modules/zypper.py
+++ b/salt/modules/zypper.py
@@ -1480,11 +1480,6 @@ def upgrade(refresh=True,
     __zypper__(systemd_scope=_systemd_scope()).noraise.call(*cmd_update)
     _clean_cache()
     new = list_pkgs()
-
-    # Handle packages which report multiple new versions
-    # (affects only kernel packages at this point)
-    for pkg in new:
-        new[pkg] = new[pkg].split(',')[-1]
     ret = salt.utils.data.compare_dicts(old, new)
 
     if __zypper__.exit_code not in __zypper__.SUCCESS_EXIT_CODES:
diff --git a/tests/unit/modules/test_zypper.py 
b/tests/unit/modules/test_zypper.py
index bb15aca11a..424438c8bf 100644
--- a/tests/unit/modules/test_zypper.py
+++ b/tests/unit/modules/test_zypper.py
@@ -429,7 +429,13 @@ class ZypperTestCase(TestCase, LoaderModuleMockMixin):
                     zypper_mock.assert_any_call('update', 
'--auto-agree-with-licenses')
 
                 with patch('salt.modules.zypper.list_pkgs',
-                           MagicMock(side_effect=[{"vim": "1.1"}, {"vim": 
"1.1,1.2"}])):
+                           MagicMock(side_effect=[{"kernel-default": "1.1"}, 
{"kernel-default": "1.1,1.2"}])):
+                    ret = zypper.upgrade()
+                    self.assertDictEqual(ret, {"kernel-default": {"old": 
"1.1", "new": "1.1,1.2"}})
+                    zypper_mock.assert_any_call('update', 
'--auto-agree-with-licenses')
+
+                with patch('salt.modules.zypper.list_pkgs',
+                           MagicMock(side_effect=[{"vim": "1.1"}, {"vim": 
"1.2"}])):
                     ret = zypper.upgrade()
                     self.assertDictEqual(ret, {"vim": {"old": "1.1", "new": 
"1.2"}})
                     zypper_mock.assert_any_call('update', 
'--auto-agree-with-licenses')
-- 
2.17.1


++++++ run-salt-api-as-user-salt-bsc-1064520.patch ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.460037294 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.460037294 +0200
@@ -1,4 +1,4 @@
-From 92f41027bc08be3e14a47bbf7f43205a60606643 Mon Sep 17 00:00:00 2001
+From e9b5c0ae02552eb9a76488da32217a0e339d86a2 Mon Sep 17 00:00:00 2001
 From: Christian Lanig <[email protected]>
 Date: Mon, 27 Nov 2017 13:10:26 +0100
 Subject: [PATCH] Run salt-api as user salt (bsc#1064520)
@@ -20,6 +20,6 @@
  ExecStart=/usr/bin/salt-api
  TimeoutStopSec=3
 -- 
-2.16.2
+2.13.7
 
 

++++++ run-salt-master-as-dedicated-salt-user.patch ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.472037314 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.472037314 +0200
@@ -1,4 +1,4 @@
-From 04906c9a9c1b9fdbc6854a017e92525acd167bc7 Mon Sep 17 00:00:00 2001
+From 3d4be53c265dffdbfaf1d7d4764c361a640fd5ff Mon Sep 17 00:00:00 2001
 From: =?UTF-8?q?Klaus=20K=C3=A4mpf?= <[email protected]>
 Date: Wed, 20 Jan 2016 11:01:06 +0100
 Subject: [PATCH] Run salt master as dedicated salt user
@@ -10,7 +10,7 @@
  2 files changed, 4 insertions(+), 1 deletion(-)
 
 diff --git a/conf/master b/conf/master
-index 986898436a..8461101210 100644
+index 149fe8812f..d492aef6df 100644
 --- a/conf/master
 +++ b/conf/master
 @@ -25,7 +25,8 @@
@@ -42,6 +42,6 @@
        missingok
        rotate 7
 -- 
-2.16.2
+2.13.7
 
 

++++++ show-recommendations-for-salt-ssh-cross-version-pyth.patch ++++++
>From 15e97fd2916176fe850850fe90983ac95a1f8e7b Mon Sep 17 00:00:00 2001
From: Erik Johnson <[email protected]>
Date: Mon, 11 Jun 2018 14:46:58 -0500
Subject: [PATCH] Show recommendations for salt-ssh cross-version python
 errors

This shows more accurate information on how to resolve version issues
(e.g. master only has Salt deps installed for Python 3 but remote host
has no Python 3 installed).

Use parenthesis for line continuation
---
 salt/client/ssh/__init__.py | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/salt/client/ssh/__init__.py b/salt/client/ssh/__init__.py
index f1300b5698..8a85cc2480 100644
--- a/salt/client/ssh/__init__.py
+++ b/salt/client/ssh/__init__.py
@@ -1387,6 +1387,30 @@ ARGS = {arguments}\n'''.format(config=self.minion_config,
         perm_error_fmt = 'Permissions problem, target user may need '\
                          'to be root or use sudo:\n {0}'
 
+        def _version_mismatch_error():
+            messages = {
+                2: {
+                    6: 'Install Python 2.7 / Python 3 Salt dependencies on the 
Salt SSH master \n'
+                       'to interact with Python 2.7 / Python 3 targets',
+                    7: 'Install Python 2.6 / Python 3 Salt dependencies on the 
Salt SSH master \n'
+                       'to interact with Python 2.6 / Python 3 targets',
+                },
+                3: {
+                    'default': '- Install Python 2.6/2.7 Salt dependencies on 
the Salt SSH \n'
+                               '  master to interact with Python 2.6/2.7 
targets\n'
+                               '- Install Python 3 on the target machine(s)',
+                },
+                'default': 'Matching major/minor Python release (>=2.6) needed 
both on the Salt SSH \n'
+                           'master and target machine',
+            }
+            major, minor = sys.version_info[:2]
+            help_msg = (
+                messages.get(major, {}).get(minor)
+                or messages.get(major, {}).get('default')
+                or messages['default']
+            )
+            return 'Python version error. Recommendation(s) follow:\n' + 
help_msg
+
         errors = [
             (
                 (),
@@ -1396,7 +1420,7 @@ ARGS = {arguments}\n'''.format(config=self.minion_config,
             (
                 (salt.defaults.exitcodes.EX_THIN_PYTHON_INVALID,),
                 'Python interpreter is too old',
-                'salt requires python 2.6 or newer on target hosts, must have 
same major version as origin host'
+                _version_mismatch_error()
             ),
             (
                 (salt.defaults.exitcodes.EX_THIN_CHECKSUM,),
-- 
2.13.7


++++++ strip-trailing-commas-on-linux-user-gecos-fields.patch ++++++
--- /var/tmp/diff_new_pack.Vk4x2R/_old  2018-08-02 14:55:45.516037388 +0200
+++ /var/tmp/diff_new_pack.Vk4x2R/_new  2018-08-02 14:55:45.516037388 +0200
@@ -1,4 +1,4 @@
-From f9fb3639bb3c44babd92d9499bdde83a0a81d6ab Mon Sep 17 00:00:00 2001
+From f515f99ee42ffaba30cee2e1941a7e9af9db7453 Mon Sep 17 00:00:00 2001
 From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?=
  <[email protected]>
 Date: Wed, 18 Apr 2018 12:05:35 +0100
@@ -50,6 +50,6 @@
 +        expected_gecos_fields = 'Testing'
 +        self.assertEqual(useradd._build_gecos(test_gecos), 
expected_gecos_fields)
 -- 
-2.15.1
+2.13.7
 
 

++++++ v2018.3.0.tar.gz -> v2018.3.2.tar.gz ++++++
/work/SRC/openSUSE:Factory/salt/v2018.3.0.tar.gz 
/work/SRC/openSUSE:Factory/.salt.new/v2018.3.2.tar.gz differ: char 13, line 1


Reply via email to