diff --git a/.gitignore b/.gitignore
index ef784c7..0964ff6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,2 @@
-SOURCES/sos-3.7.tar.gz
+SOURCES/sos-3.8.tar.gz
 SOURCES/sos-audit-0.3.tgz
diff --git a/.sos.metadata b/.sos.metadata
index 9abd7a0..0c29651 100644
--- a/.sos.metadata
+++ b/.sos.metadata
@@ -1,2 +1,2 @@
-38aa7609e7545eddf709db60fa1523432b268e13 SOURCES/sos-3.7.tar.gz
+99c94319c6208edef8d852b9e84cbb045c01df5f SOURCES/sos-3.8.tar.gz
 9d478b9f0085da9178af103078bbf2fd77b0175a SOURCES/sos-audit-0.3.tgz
diff --git a/README.debrand b/README.debrand
deleted file mode 100644
index 01c46d2..0000000
--- a/README.debrand
+++ /dev/null
@@ -1,2 +0,0 @@
-Warning: This package was configured for automatic debranding, but the changes
-failed to apply.
diff --git a/SOURCES/sos-3.6-centos-branding.patch b/SOURCES/sos-3.6-centos-branding.patch
deleted file mode 100644
index f88d36e..0000000
--- a/SOURCES/sos-3.6-centos-branding.patch
+++ /dev/null
@@ -1,105 +0,0 @@
-diff -uNrp sos-3.6.orig/sos/policies/redhat.py sos-3.6/sos/policies/redhat.py
---- sos-3.6.orig/sos/policies/redhat.py	2018-11-04 17:44:59.513116585 +0000
-+++ sos-3.6/sos/policies/redhat.py	2018-11-04 17:53:28.333731059 +0000
-@@ -32,9 +32,9 @@ OS_RELEASE = "/etc/os-release"
- 
- 
- class RedHatPolicy(LinuxPolicy):
--    distro = "Red Hat"
--    vendor = "Red Hat"
--    vendor_url = "http://www.redhat.com/"
-+    distro = "CentOS"
-+    vendor = "CentOS"
-+    vendor_url = "http://www,centos.org/"
-     _redhat_release = '/etc/redhat-release'
-     _tmp_dir = "/var/tmp"
-     _rpmq_cmd = 'rpm -qa --queryformat "%{NAME}|%{VERSION}|%{RELEASE}\\n"'
-@@ -92,9 +92,9 @@ class RedHatPolicy(LinuxPolicy):
- 
-     @classmethod
-     def check(cls):
--        """This method checks to see if we are running on Red Hat. It must be
-+        """This method checks to see if we are running on CentOS. It must be
-         overriden by concrete subclasses to return True when running on a
--        Fedora, RHEL or other Red Hat distribution or False otherwise."""
-+        Fedora, RHEL or CentOS distribution or False otherwise."""
-         return False
- 
-     def check_usrmove(self, pkgs):
-@@ -185,7 +185,7 @@ class RedHatPolicy(LinuxPolicy):
-         return self.host_name()
- 
- 
--# Container environment variables on Red Hat systems.
-+# Container environment variables on CentOS systems.
- ENV_CONTAINER = 'container'
- ENV_HOST_SYSROOT = 'HOST'
- 
-@@ -195,22 +195,22 @@ _opts_all_logs_verify = SoSOptions(all_l
- _opts_all_logs_no_lsof = SoSOptions(all_logs=True,
-                                     plugopts=['process.lsof=off'])
- 
--RHEL_RELEASE_STR = "Red Hat Enterprise Linux"
-+RHEL_RELEASE_STR = "CentOS Linux"
- 
- RHV = "rhv"
--RHV_DESC = "Red Hat Virtualization"
-+RHV_DESC = "CentOS Virtualization"
- 
- RHEL = "rhel"
- RHEL_DESC = RHEL_RELEASE_STR
- 
- RHOSP = "rhosp"
--RHOSP_DESC = "Red Hat OpenStack Platform"
-+RHOSP_DESC = "RDO"
- 
- RHOCP = "ocp"
--RHOCP_DESC = "OpenShift Container Platform by Red Hat"
-+RHOCP_DESC = "OpenShift"
- 
- RH_SATELLITE = "satellite"
--RH_SATELLITE_DESC = "Red Hat Satellite"
-+RH_SATELLITE_DESC = "Satellite"
- 
- NOTE_SIZE = "This preset may increase report size"
- NOTE_TIME = "This preset may increase report run time"
-@@ -230,9 +230,9 @@ rhel_presets = {
- 
- 
- class RHELPolicy(RedHatPolicy):
--    distro = RHEL_RELEASE_STR
--    vendor = "Red Hat"
--    vendor_url = "https://access.redhat.com/support/"
-+    distro = "CentOS Linux"
-+    vendor = "CentOS"
-+    vendor_url = "https://wiki.centos.org/"
-     msg = _("""\
- This command will collect diagnostic and configuration \
- information from this %(distro)s system and installed \
-@@ -262,7 +262,7 @@ No changes will be made to system config
-     def check(cls):
-         """Test to see if the running host is a RHEL installation.
- 
--            Checks for the presence of the "Red Hat Enterprise Linux"
-+            Checks for the presence of the "CentOS Linux"
-             release string at the beginning of the NAME field in the
-             `/etc/os-release` file and returns ``True`` if it is
-             found, and ``False`` otherwise.
-@@ -324,7 +324,7 @@ No changes will be made to system config
- 
- ATOMIC = "atomic"
- ATOMIC_RELEASE_STR = "Atomic"
--ATOMIC_DESC = "Red Hat Enterprise Linux Atomic Host"
-+ATOMIC_DESC = "CentOS Linux Atomic Host"
- 
- atomic_presets = {
-     ATOMIC: PresetDefaults(name=ATOMIC, desc=ATOMIC_DESC, note=NOTE_TIME,
-@@ -333,7 +333,7 @@ atomic_presets = {
- 
- 
- class RedHatAtomicPolicy(RHELPolicy):
--    distro = "Red Hat Atomic Host"
-+    distro = "CentOS Atomic Host"
-     msg = _("""\
- This command will collect diagnostic and configuration \
- information from this %(distro)s system.
diff --git a/SOURCES/sos-bz1665929-nvme-config.patch b/SOURCES/sos-bz1665929-nvme-config.patch
deleted file mode 100644
index a370d24..0000000
--- a/SOURCES/sos-bz1665929-nvme-config.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 8eff8f82604cb83a4c43f4a3ba0308940863c1b5 Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Mon, 29 Jul 2019 11:34:06 +0200
-Subject: [PATCH] [nvme] collect config file everytime
-
-Collect /etc/nvme/discovery.conf every time, outside any for-loop block.
-
-Resolves: #1740
-
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/plugins/nvme.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/sos/plugins/nvme.py b/sos/plugins/nvme.py
-index 6e2cda73..bd9d2df0 100644
---- a/sos/plugins/nvme.py
-+++ b/sos/plugins/nvme.py
-@@ -21,6 +21,7 @@ class Nvme(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
-         return [dev for dev in sys_block if dev.startswith('nvme')]
- 
-     def setup(self):
-+        self.add_copy_spec("/etc/nvme/discovery.conf")
-         self.add_cmd_output([
-             "nvme list",
-             "nvme list-subsys",
-@@ -39,6 +40,5 @@ class Nvme(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
-                 "nvme show-regs /dev/%s" % dev,
-                 "nvme get-ns-id /dev/%s" % dev
-             ])
--            self.add_copy_spec("/etc/nvme/discovery.conf")
- 
- # vim: set et ts=4 sw=4 :
--- 
-2.21.0
-
diff --git a/SOURCES/sos-bz1665981-peripety-config.patch b/SOURCES/sos-bz1665981-peripety-config.patch
deleted file mode 100644
index a06f27f..0000000
--- a/SOURCES/sos-bz1665981-peripety-config.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 34219ce0e15de5423baaaa1054a98cf1b58f0eae Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Thu, 25 Jul 2019 15:03:50 +0200
-Subject: [PATCH] [peripety] collect proper config file
-
-The config file is /etc/peripetyd.conf .
-
-Resolves: #1737
-
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/plugins/peripety.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/sos/plugins/peripety.py b/sos/plugins/peripety.py
-index 7567731d..42877c66 100644
---- a/sos/plugins/peripety.py
-+++ b/sos/plugins/peripety.py
-@@ -20,7 +20,7 @@ class Peripety(Plugin, RedHatPlugin):
-     services = ('peripetyd',)
- 
-     def setup(self):
--        self.add_copy_spec('/etc/peripety.conf')
-+        self.add_copy_spec('/etc/peripetyd.conf')
- 
-         forbid_reg = [
-             'vd.*',
--- 
-2.21.0
-
diff --git a/SOURCES/sos-bz1687954-buildah-index-out-of-range.patch b/SOURCES/sos-bz1687954-buildah-index-out-of-range.patch
deleted file mode 100644
index 5491201..0000000
--- a/SOURCES/sos-bz1687954-buildah-index-out-of-range.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-From 0100bd129e8fc809cc5b0258f6c0c7c64ad084ab Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Mon, 15 Apr 2019 11:50:55 +0200
-Subject: [PATCH] [buildah] parse container list properly even for scratch ones
-
-Scratch containers dont have id, therefore we shall get container name
-as the latest string on each line instead of 5th.
-
-Resolves: #1647
-
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/plugins/buildah.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/sos/plugins/buildah.py b/sos/plugins/buildah.py
-index c6c57553..fd8653eb 100644
---- a/sos/plugins/buildah.py
-+++ b/sos/plugins/buildah.py
-@@ -47,7 +47,7 @@ class Buildah(Plugin, RedHatPlugin):
-         if containahs['is_wicked_pissah']:
-             for containah in containahs['auutput'].splitlines():
-                 # obligatory Tom Brady
--                goat = containah.split()[4]
-+                goat = containah.split()[-1]
-                 self.add_cmd_output('buildah inspect -t container %s' % goat)
- 
-         pitchez = make_chowdah('buildah images -n')
--- 
-2.17.2
-
diff --git a/SOURCES/sos-bz1688764-ipa-new-logs.patch b/SOURCES/sos-bz1688764-ipa-new-logs.patch
new file mode 100644
index 0000000..a120ae5
--- /dev/null
+++ b/SOURCES/sos-bz1688764-ipa-new-logs.patch
@@ -0,0 +1,84 @@
+From f2350aece8a6980f80cfa0036382055239fd8a6b Mon Sep 17 00:00:00 2001
+From: Thorsten Scherf <tscherf@redhat.com>
+Date: Mon, 1 Jul 2019 11:37:47 +0200
+Subject: [PATCH] [ipa] copy httpd cert from new location
+
+With the FreeIPA 4.7.0 release, httpd moved from mod_nss to mod_ssl. As a
+result the httpd X.509 certificate is now no longer stored in NSS DB but as
+plain PEM text file: /var/lib/ipa/certs/httpd.crt. The plugin needs to copy
+this file into the sos archive.
+
+Closes: #1715
+Resolves: #1716
+
+Signed-off-by: Thorsten Scherf <tscherf@redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/ipa.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/sos/plugins/ipa.py b/sos/plugins/ipa.py
+index 50f42f259..310c0fa31 100644
+--- a/sos/plugins/ipa.py
++++ b/sos/plugins/ipa.py
+@@ -115,6 +115,7 @@ def setup(self):
+             "/var/lib/certmonger/requests/[0-9]*",
+             "/var/lib/certmonger/cas/[0-9]*",
+             "/var/lib/ipa/ra-agent.pem",
++            "/var/lib/ipa/certs/httpd.crt",
+             "/var/kerberos/krb5kdc/kdc.crt",
+             "/var/lib/ipa/sysrestore/sysrestore.state"
+         ])
+From 5c0b2d56313b6fa58b46802317c98b89e5a68508 Mon Sep 17 00:00:00 2001
+From: Rob Crittenden <rcritten@redhat.com>
+Date: Thu, 12 Sep 2019 12:02:34 -0400
+Subject: [PATCH] [ipa] collect ipa-healthcheck logs
+
+Resolves: #1782
+
+Signed-off-by: Rob Crittenden <rcritten@redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/ipa.py | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/sos/plugins/ipa.py b/sos/plugins/ipa.py
+index 310c0fa31..750cb6fae 100644
+--- a/sos/plugins/ipa.py
++++ b/sos/plugins/ipa.py
+@@ -117,7 +117,8 @@ def setup(self):
+             "/var/lib/ipa/ra-agent.pem",
+             "/var/lib/ipa/certs/httpd.crt",
+             "/var/kerberos/krb5kdc/kdc.crt",
+-            "/var/lib/ipa/sysrestore/sysrestore.state"
++            "/var/lib/ipa/sysrestore/sysrestore.state",
++            "/var/log/ipa/healthcheck/healthcheck.log*"
+         ])
+ 
+         #  Make sure to use the right PKI config and NSS DB folders
+From 823dbabde82ee941c421482a71be572984607ad4 Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Tue, 1 Oct 2019 08:26:24 +0200
+Subject: [PATCH] [ipa] collect kdcproxy configs
+
+Resolves: #1806
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+---
+ sos/plugins/ipa.py | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/sos/plugins/ipa.py b/sos/plugins/ipa.py
+index 750cb6fae..d3454de98 100644
+--- a/sos/plugins/ipa.py
++++ b/sos/plugins/ipa.py
+@@ -111,6 +111,9 @@ def setup(self):
+             "/etc/named.*",
+             "/etc/ipa/ca.crt",
+             "/etc/ipa/default.conf",
++            "/etc/ipa/kdcproxy/kdcproxy.conf",
++            "/etc/ipa/kdcproxy/ipa-kdc-proxy.conf",
++            "/etc/ipa/kdcproxy.conf",
+             "/root/.ipa/log/cli.log",
+             "/var/lib/certmonger/requests/[0-9]*",
+             "/var/lib/certmonger/cas/[0-9]*",
diff --git a/SOURCES/sos-bz1695583-postgres-mysql-incorrect-defaults.patch b/SOURCES/sos-bz1695583-postgres-mysql-incorrect-defaults.patch
deleted file mode 100644
index a5d1036..0000000
--- a/SOURCES/sos-bz1695583-postgres-mysql-incorrect-defaults.patch
+++ /dev/null
@@ -1,122 +0,0 @@
-From c71b41547442d23daf5c3bf88450151d13903214 Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Thu, 4 Apr 2019 13:54:18 +0200
-Subject: [PATCH] [maas,mysql,npm,pacemaker,postgresql] fix plugopts data types
-
-With new enforcement of implicit data type for plugin options, the
-plugopts must have proper data types of default values and plugins must work
-with them accordingly (in tests or so).
-
-Resolves: #1635
-
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/plugins/maas.py       | 6 +++---
- sos/plugins/mysql.py      | 2 +-
- sos/plugins/npm.py        | 4 ++--
- sos/plugins/pacemaker.py  | 4 ++--
- sos/plugins/postgresql.py | 6 +++---
- 5 files changed, 11 insertions(+), 11 deletions(-)
-
-diff --git a/sos/plugins/maas.py b/sos/plugins/maas.py
-index f8305406..ea038e86 100644
---- a/sos/plugins/maas.py
-+++ b/sos/plugins/maas.py
-@@ -21,10 +21,10 @@ class Maas(Plugin, UbuntuPlugin):
- 
-     option_list = [
-         ('profile-name',
--         'The name with which you will later refer to this remote', '', False),
--        ('url', 'The URL of the remote API', '', False),
-+         'The name with which you will later refer to this remote', '', ''),
-+        ('url', 'The URL of the remote API', '', ''),
-         ('credentials',
--         'The credentials, also known as the API key', '', False)
-+         'The credentials, also known as the API key', '', '')
-     ]
- 
-     def _has_login_options(self):
-diff --git a/sos/plugins/mysql.py b/sos/plugins/mysql.py
-index 49bc4168..411d90b8 100644
---- a/sos/plugins/mysql.py
-+++ b/sos/plugins/mysql.py
-@@ -22,7 +22,7 @@ class Mysql(Plugin):
- 
-     option_list = [
-         ("dbuser", "username for database dumps", "", "mysql"),
--        ("dbpass", "password for database dumps" + pw_warn_text, "", False),
-+        ("dbpass", "password for database dumps" + pw_warn_text, "", ""),
-         ("dbdump", "collect a database dump", "", False)
-     ]
- 
-diff --git a/sos/plugins/npm.py b/sos/plugins/npm.py
-index 0fc95801..ca00d0c0 100644
---- a/sos/plugins/npm.py
-+++ b/sos/plugins/npm.py
-@@ -25,7 +25,7 @@ class Npm(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin, SuSEPlugin):
-     option_list = [("project_path",
-                     'List npm modules of a project specified by path',
-                     'fast',
--                    0)]
-+                    '')]
- 
-     # in Fedora, Debian, Ubuntu and Suse the package is called npm
-     packages = ('npm',)
-@@ -79,7 +79,7 @@ class Npm(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin, SuSEPlugin):
-         self.add_string_as_file(json.dumps(output), outfn)
- 
-     def setup(self):
--        if self.get_option("project_path") != 0:
-+        if self.get_option("project_path"):
-             project_path = os.path.abspath(os.path.expanduser(
-                 self.get_option("project_path")))
-             self._get_npm_output("npm ls --json", "npm_ls_project",
-diff --git a/sos/plugins/pacemaker.py b/sos/plugins/pacemaker.py
-index a1b64ea5..940389ee 100644
---- a/sos/plugins/pacemaker.py
-+++ b/sos/plugins/pacemaker.py
-@@ -25,7 +25,7 @@ class Pacemaker(Plugin):
-     )
- 
-     option_list = [
--        ("crm_from", "specify the start time for crm_report", "fast", False),
-+        ("crm_from", "specify the start time for crm_report", "fast", ''),
-         ("crm_scrub", "enable password scrubbing for crm_report", "", True),
-     ]
- 
-@@ -87,7 +87,7 @@ class Pacemaker(Plugin):
-         # time in order to collect data.
-         crm_from = (datetime.today() -
-                     timedelta(hours=72)).strftime("%Y-%m-%d %H:%m:%S")
--        if self.get_option("crm_from") is not False:
-+        if self.get_option("crm_from"):
-             if re.match(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}',
-                         str(self.get_option("crm_from"))):
-                 crm_from = self.get_option("crm_from")
-diff --git a/sos/plugins/postgresql.py b/sos/plugins/postgresql.py
-index 1698b62f..a04dca8f 100644
---- a/sos/plugins/postgresql.py
-+++ b/sos/plugins/postgresql.py
-@@ -31,7 +31,7 @@ class PostgreSQL(Plugin):
-     option_list = [
-         ('pghome', 'PostgreSQL server home directory.', '', '/var/lib/pgsql'),
-         ('username', 'username for pg_dump', '', 'postgres'),
--        ('password', 'password for pg_dump' + password_warn_text, '', False),
-+        ('password', 'password for pg_dump' + password_warn_text, '', ''),
-         ('dbname', 'database name to dump for pg_dump', '', ''),
-         ('dbhost', 'database hostname/IP (do not use unix socket)', '', ''),
-         ('dbport', 'database server port number', '', '5432')
-@@ -43,8 +43,8 @@ class PostgreSQL(Plugin):
-                 # We're only modifying this for ourself and our children so
-                 # there is no need to save and restore environment variables if
-                 # the user decided to pass the password on the command line.
--                if self.get_option("password") is not False:
--                    os.environ["PGPASSWORD"] = str(self.get_option("password"))
-+                if self.get_option("password"):
-+                    os.environ["PGPASSWORD"] = self.get_option("password")
- 
-                 if self.get_option("dbhost"):
-                     cmd = "pg_dump -U %s -h %s -p %s -w -F t %s" % (
--- 
-2.17.2
-
diff --git a/SOURCES/sos-bz1700780-vdsm-plugin.patch b/SOURCES/sos-bz1700780-vdsm-plugin.patch
deleted file mode 100644
index 2ae0c5a..0000000
--- a/SOURCES/sos-bz1700780-vdsm-plugin.patch
+++ /dev/null
@@ -1,335 +0,0 @@
-From 1b4f8dfb8ac85708441faa3b2c2b9c2624dfa155 Mon Sep 17 00:00:00 2001
-From: "irit.go" <igoihman@redhat.com>
-Date: Tue, 24 Jul 2018 11:01:55 +0300
-Subject: [PATCH 1/2] [Plugin] add get_process_pids() to return PIDs by process
- name
-
-Signed-off-by: Irit Goihman igoihman@redhat.com
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/__init__.py | 16 ++++++++++++++++
- 1 file changed, 16 insertions(+)
-
-diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
-index 4c8822b7..cdeda77a 100644
---- a/sos/plugins/__init__.py
-+++ b/sos/plugins/__init__.py
-@@ -1389,6 +1389,22 @@ class Plugin(object):
-             return False
-         return status
- 
-+    def get_process_pids(self, process):
-+        """Returns PIDs of all processes with process name.
-+        If the process doesn't exist, returns an empty list"""
-+        pids = []
-+        cmd_line_glob = "/proc/[0-9]*/cmdline"
-+        cmd_line_paths = glob.glob(cmd_line_glob)
-+        for path in cmd_line_paths:
-+            try:
-+                with open(path, 'r') as f:
-+                    cmd_line = f.read().strip()
-+                    if process in cmd_line:
-+                        pids.append(path.split("/")[2])
-+            except IOError as e:
-+                continue
-+        return pids
-+
- 
- class RedHatPlugin(object):
-     """Tagging class for Red Hat's Linux distributions"""
--- 
-2.17.2
-
-
-From 0618db904dadb05fde70c181a5940989ac127fe2 Mon Sep 17 00:00:00 2001
-From: Irit Goihman <igoihman@redhat.com>
-Date: Thu, 1 Feb 2018 16:44:32 +0200
-Subject: [PATCH 2/2] [plugins] add vdsm plugin
-
-Add a plugin for vdsm
-
-Resolves: #1205
-
-Signed-off-by: Irit Goihman <igoihman@redhat.com>
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/vdsm.py | 146 ++++++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 146 insertions(+)
- create mode 100644 sos/plugins/vdsm.py
-
-diff --git a/sos/plugins/vdsm.py b/sos/plugins/vdsm.py
-new file mode 100644
-index 00000000..c648abbf
---- /dev/null
-+++ b/sos/plugins/vdsm.py
-@@ -0,0 +1,146 @@
-+# Copyright (C) 2018 Red Hat, Inc.
-+
-+# This file is part of the sos project: https://github.com/sosreport/sos
-+#
-+# This copyrighted material is made available to anyone wishing to use,
-+# modify, copy, or redistribute it subject to the terms and conditions of
-+# version 2 of the GNU General Public License.
-+#
-+# See the LICENSE file in the source distribution for further information.
-+
-+from sos.plugins import Plugin, RedHatPlugin
-+
-+import glob
-+import json
-+import re
-+
-+
-+# This configuration is based on vdsm.storage.lvm.LVM_CONF_TEMPLATE.
-+#
-+# locking_type is set to 0 in order to match lvm sos commands. With this
-+# configuration we don't take any locks, so we will never block because
-+# there is a stuck lvm command.
-+# locking_type=0
-+#
-+# use_lvmetad is set to 0 in order not to show cached, old lvm metadata.
-+# use_lvmetad=0
-+#
-+# preferred_names and filter config values are set to capture Vdsm devices.
-+# preferred_names=[ '^/dev/mapper/' ]
-+# filter=[ 'a|^/dev/mapper/.*|', 'r|.*|' ]
-+LVM_CONFIG = """
-+global {
-+    locking_type=0
-+    use_lvmetad=0
-+}
-+devices {
-+    preferred_names=["^/dev/mapper/"]
-+    ignore_suspended_devices=1
-+    write_cache_state=0
-+    disable_after_error_count=3
-+    filter=["a|^/dev/mapper/.*|", "r|.*|"]
-+}
-+"""
-+LVM_CONFIG = re.sub(r"\s+", " ", LVM_CONFIG).strip()
-+
-+
-+class Vdsm(Plugin, RedHatPlugin):
-+    """vdsm Plugin"""
-+
-+    packages = (
-+        'vdsm',
-+        'vdsm-client',
-+    )
-+
-+    plugin_name = 'vdsm'
-+
-+    def setup(self):
-+        self.add_forbidden_path('/etc/pki/vdsm/keys/*')
-+        self.add_forbidden_path('/etc/pki/vdsm/libvirt-spice/*-key.*')
-+        self.add_forbidden_path('/etc/pki/libvirt/private/*')
-+
-+        self.add_cmd_output('service vdsmd status')
-+
-+        self.add_copy_spec([
-+            '/tmp/vds_installer*',
-+            '/tmp/vds_bootstrap*',
-+            '/etc/vdsm/*'
-+        ])
-+
-+        limit = self.get_option('log_size')
-+
-+        self.add_copy_spec('/var/log/vdsm/*', sizelimit=limit)
-+
-+        self._add_vdsm_forbidden_paths()
-+        self.add_copy_spec([
-+            '/var/run/vdsm/*',
-+            '/usr/libexec/vdsm/hooks',
-+            '/var/lib/vdsm'
-+        ])
-+
-+        qemu_pids = self.get_process_pids('qemu-kvm')
-+        if qemu_pids:
-+            files = ["cmdline", "status", "mountstats"]
-+            self.add_copy_spec([
-+                "/proc/%s/%s" % (pid, name)
-+                for pid in qemu_pids
-+                for name in files
-+            ])
-+        self.add_cmd_output([
-+            "ls -ldZ /etc/vdsm",
-+            "su vdsm -s sh -c 'tree -l /rhev/data-center'",
-+            "su vdsm -s sh -c 'ls -lR /rhev/data-center'"
-+        ])
-+        self.add_cmd_output([
-+            "lvm vgs -v -o +tags --config \'%s\'" % LVM_CONFIG,
-+            "lvm lvs -v -o +tags --config \'%s\'" % LVM_CONFIG,
-+            "lvm pvs -v -o +all --config \'%s\'" % LVM_CONFIG
-+        ])
-+
-+        self.add_cmd_output([
-+            'vdsm-client Host getCapabilities',
-+            'vdsm-client Host getStats',
-+            'vdsm-client Host getAllVmStats',
-+            'vdsm-client Host getVMFullList',
-+            'vdsm-client Host getDeviceList',
-+            'vdsm-client Host hostdevListByCaps',
-+            'vdsm-client Host getAllTasksInfo',
-+            'vdsm-client Host getAllTasksStatuses'
-+        ])
-+
-+        try:
-+            res = self.call_ext_prog(
-+                'vdsm-client Host getConnectedStoragePools'
-+            )
-+            if res['status'] == 0:
-+                pools = json.loads(res['output'])
-+                for pool in pools:
-+                    self.add_cmd_output(
-+                        'vdsm-client StoragePool getSpmStatus'
-+                        ' storagepoolID={}'.format(pool)
-+                    )
-+        except ValueError as e:
-+            self._log_error(
-+                'vdsm-client Host getConnectedStoragePools: %s' % (e)
-+            )
-+
-+        try:
-+            res = self.call_ext_prog('vdsm-client Host getStorageDomains')
-+            if res['status'] == 0:
-+                sd_uuids = json.loads(res['output'])
-+                dump_volume_chains_cmd = 'vdsm-tool dump-volume-chains %s'
-+                self.add_cmd_output([
-+                    dump_volume_chains_cmd % uuid for uuid in sd_uuids
-+                ])
-+        except ValueError as e:
-+            self._log_error(
-+                'vdsm-client Host getStorageDomains: %s' % (e)
-+            )
-+
-+    def _add_vdsm_forbidden_paths(self):
-+        """Add confidential sysprep vfds under /var/run/vdsm to
-+         forbidden paths """
-+
-+        for file_path in glob.glob("/var/run/vdsm/*"):
-+            if file_path.endswith(('.vfd', '/isoUploader', '/storage')):
-+                self.add_forbidden_path(file_path)
--- 
-2.17.2
-
-From 7141ebf3b2071c84286ced29154c33502c4da934 Mon Sep 17 00:00:00 2001
-From: Irit goihman <igoihman@redhat.com>
-Date: Sun, 7 Apr 2019 14:03:55 +0300
-Subject: [PATCH] [vdsm] fix plugin docstring capitalisation
-
----
- sos/plugins/vdsm.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/sos/plugins/vdsm.py b/sos/plugins/vdsm.py
-index c648abbf9..4549c372e 100644
---- a/sos/plugins/vdsm.py
-+++ b/sos/plugins/vdsm.py
-@@ -45,7 +45,7 @@
- 
- 
- class Vdsm(Plugin, RedHatPlugin):
--    """vdsm Plugin"""
-+    """vdsm plugin"""
- 
-     packages = (
-         'vdsm',
-From 208a1d9622dfa13d923882793cd19e9e6cf1e488 Mon Sep 17 00:00:00 2001
-From: Irit goihman <igoihman@redhat.com>
-Date: Sun, 7 Apr 2019 14:04:48 +0300
-Subject: [PATCH] [vdsm] use metadata_read_only=1 for LVM2 commands
-
----
- sos/plugins/vdsm.py | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/sos/plugins/vdsm.py b/sos/plugins/vdsm.py
-index 4549c372e..913d49a53 100644
---- a/sos/plugins/vdsm.py
-+++ b/sos/plugins/vdsm.py
-@@ -22,6 +22,10 @@
- # there is a stuck lvm command.
- # locking_type=0
- #
-+# To prevent modifications to volume group metadata (for e.g. due to a
-+# automatically detected inconsistency), metadata_read_only is set to 1.
-+# metadata_read_only=1
-+#
- # use_lvmetad is set to 0 in order not to show cached, old lvm metadata.
- # use_lvmetad=0
- #
-@@ -31,6 +35,7 @@
- LVM_CONFIG = """
- global {
-     locking_type=0
-+    metadata_read_only=1
-     use_lvmetad=0
- }
- devices {
-From 97c21901ddb6f7d5e3169d1777983f784b103bc4 Mon Sep 17 00:00:00 2001
-From: Irit goihman <igoihman@redhat.com>
-Date: Sun, 7 Apr 2019 14:05:30 +0300
-Subject: [PATCH] [vdsm] drop explicit size limiting
-
----
- sos/plugins/vdsm.py | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
-
-diff --git a/sos/plugins/vdsm.py b/sos/plugins/vdsm.py
-index 913d49a53..2dc4b6bea 100644
---- a/sos/plugins/vdsm.py
-+++ b/sos/plugins/vdsm.py
-@@ -72,9 +72,7 @@ def setup(self):
-             '/etc/vdsm/*'
-         ])
- 
--        limit = self.get_option('log_size')
--
--        self.add_copy_spec('/var/log/vdsm/*', sizelimit=limit)
-+        self.add_copy_spec('/var/log/vdsm/*')
- 
-         self._add_vdsm_forbidden_paths()
-         self.add_copy_spec([
-From cfaf930e58f4996919d0da6c356135cfce26dacb Mon Sep 17 00:00:00 2001
-From: Irit goihman <igoihman@redhat.com>
-Date: Sun, 7 Apr 2019 14:13:59 +0300
-Subject: [PATCH] [vdsm] change filter
-
----
- sos/plugins/vdsm.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/sos/plugins/vdsm.py b/sos/plugins/vdsm.py
-index 2dc4b6bea..ab5c6130b 100644
---- a/sos/plugins/vdsm.py
-+++ b/sos/plugins/vdsm.py
-@@ -43,7 +43,7 @@
-     ignore_suspended_devices=1
-     write_cache_state=0
-     disable_after_error_count=3
--    filter=["a|^/dev/mapper/.*|", "r|.*|"]
-+    filter=["a|^/dev/disk/by-id/dm-uuid-mpath-|", "r|.+|"]
- }
- """
- LVM_CONFIG = re.sub(r"\s+", " ", LVM_CONFIG).strip()
-From 2ebc04da53dc871c8dd5243567afa4f8592dca29 Mon Sep 17 00:00:00 2001
-From: Irit goihman <igoihman@redhat.com>
-Date: Sun, 7 Apr 2019 14:14:32 +0300
-Subject: [PATCH] [vdsm] capture supervdsmd status
-
----
- sos/plugins/vdsm.py | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/sos/plugins/vdsm.py b/sos/plugins/vdsm.py
-index ab5c6130b..ae9c17c96 100644
---- a/sos/plugins/vdsm.py
-+++ b/sos/plugins/vdsm.py
-@@ -65,6 +65,7 @@ def setup(self):
-         self.add_forbidden_path('/etc/pki/libvirt/private/*')
- 
-         self.add_cmd_output('service vdsmd status')
-+        self.add_cmd_output('service supervdsmd status')
- 
-         self.add_copy_spec([
-             '/tmp/vds_installer*',
diff --git a/SOURCES/sos-bz1702806-openstack_instack-ansible-log.patch b/SOURCES/sos-bz1702806-openstack_instack-ansible-log.patch
deleted file mode 100644
index 938273b..0000000
--- a/SOURCES/sos-bz1702806-openstack_instack-ansible-log.patch
+++ /dev/null
@@ -1,75 +0,0 @@
-From 1b9c2032149488a2372d188a8ed3251e364f41cf Mon Sep 17 00:00:00 2001
-From: Emilien Macchi <emilien@redhat.com>
-Date: Wed, 24 Apr 2019 20:54:05 -0400
-Subject: [PATCH] [openstack_instack] add ansible.log
-
-Collect /var/lib/mistral/config-download-latest/ansible.log which is an
-important log to be able to debug issues with Ansible playbooks.
-
-/var/lib/mistral/config-download-latest is a directory that exists
-anyway on the undercloud and is the place where the ansible logs is
-stored.
-
-Note: we don't want to collect the whole /var/lib/mistral because it
-contains sensitive informations like username/passwords/endpoints.
-
-rhbz#1702806
-rhbz#1702802
-
-Resolves: #1661
-
-Signed-off-by: Emilien Macchi <emilien@redhat.com>
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/openstack_instack.py | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/sos/plugins/openstack_instack.py b/sos/plugins/openstack_instack.py
-index e3470f5a..15e6c384 100644
---- a/sos/plugins/openstack_instack.py
-+++ b/sos/plugins/openstack_instack.py
-@@ -22,7 +22,8 @@ NON_CONTAINERIZED_DEPLOY = [
- CONTAINERIZED_DEPLOY = [
-         '/var/log/heat-launcher/',
-         '/home/stack/install-undercloud.log',
--        '/home/stack/undercloud-install-*.tar.bzip2'
-+        '/home/stack/undercloud-install-*.tar.bzip2',
-+        '/var/lib/mistral/config-download-latest/ansible.log'
- ]
- 
- 
--- 
-2.17.2
-
-From ba77701624dccf3ba98fee6e9cdb9b9d804068c2 Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Tue, 9 Jul 2019 13:23:37 +0200
-Subject: [PATCH] [archive] convert absolute symlink targets to relative
-
-Calling _make_leading_paths for a symlink with absolute symlink target
-must create the symlink relative to the source. This will prevent
-creating symlinks outside sosreport build dir.
-
-Resolves: #1710
-
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/archive.py | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/sos/archive.py b/sos/archive.py
-index 9e19426c5..dcd6908d1 100644
---- a/sos/archive.py
-+++ b/sos/archive.py
-@@ -232,6 +232,11 @@ def in_archive(path):
-                     dest = self._make_leading_paths(target_src, mode=mode)
-                     dest = os.path.normpath(dest)
- 
-+                    # In case symlink target is an absolute path, make it
-+                    # relative to the directory with symlink source
-+                    if os.path.isabs(target):
-+                        target = os.path.relpath(target, target_dir)
-+
-                     self.log_debug("Making symlink '%s' -> '%s'" %
-                                    (abs_path, target))
-                     os.symlink(target, abs_path)
diff --git a/SOURCES/sos-bz1709682-grub2-mkconfig-dont-remove-kernel-opts.patch b/SOURCES/sos-bz1709682-grub2-mkconfig-dont-remove-kernel-opts.patch
new file mode 100644
index 0000000..3f20a54
--- /dev/null
+++ b/SOURCES/sos-bz1709682-grub2-mkconfig-dont-remove-kernel-opts.patch
@@ -0,0 +1,180 @@
+From 7097f737339f0cde6da923a4ce16a008d229cda7 Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Mon, 16 Sep 2019 17:13:27 +0200
+Subject: [PATCH 1/2] [plugins] extend SoSPredicate by command output inclusion
+ test
+
+Add a predicate type in form
+
+cmd_outputs={'cmd': 'foo --help', 'output': 'bar'}
+
+that checks whether output of given command contains given string.
+
+Multiple commands/outputs can be provided in a list.
+
+Related to: #1682
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+---
+ sos/plugins/__init__.py | 57 +++++++++++++++++++++++++++++++++++------
+ 1 file changed, 49 insertions(+), 8 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index a0b291bea..516a61109 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -115,6 +115,9 @@ class SoSPredicate(object):
+     #: Services enablement list
+     services = []
+ 
++    # Command output inclusion pairs {'cmd': 'foo --help', 'output': 'bar'}
++    cmd_outputs = []
++
+     def __str(self, quote=False, prefix="", suffix=""):
+         """Return a string representation of this SoSPredicate with
+             optional prefix, suffix and value quoting.
+@@ -128,14 +131,23 @@ class SoSPredicate(object):
+ 
+         services = self.services
+         services = [quotes % s for s in services] if quote else services
+-        pstr += "services=[%s]" % (",".join(services))
++        pstr += "services=[%s], " % (",".join(services))
++
++        cmdoutputs = [
++            "{ %s: %s, %s: %s }" % (quotes % "cmd",
++                                    quotes % cmdoutput['cmd'],
++                                    quotes % "output",
++                                    quotes % cmdoutput['output'])
++            for cmdoutput in self.cmd_outputs
++        ]
++        pstr += "cmdoutputs=[%s]" % (",".join(cmdoutputs))
+ 
+         return prefix + pstr + suffix
+ 
+     def __str__(self):
+         """Return a string representation of this SoSPredicate.
+ 
+-            "dry_run=False, kmods=[], services=[]"
++            "dry_run=False, kmods=[], services=[], cmdoutputs=[]"
+         """
+         return self.__str()
+ 
+@@ -143,7 +155,7 @@ class SoSPredicate(object):
+         """Return a machine readable string representation of this
+             SoSPredicate.
+ 
+-            "SoSPredicate(dry_run=False, kmods=[], services=[])"
++            "SoSPredicate(dry_run=False, kmods=[], services=[], cmdoutputs=[])"
+         """
+         return self.__str(quote=True, prefix="SoSPredicate(", suffix=")")
+ 
+@@ -170,15 +182,39 @@ class SoSPredicate(object):
+         else:
+             return all(_svcs)
+ 
++    def _eval_cmd_output(self, cmd_output):
++        '''Does 'cmd' output contain string 'output'?'''
++        if 'cmd' not in cmd_output or 'output' not in cmd_output:
++            return False
++        result = sos_get_command_output(cmd_output['cmd'])
++        if result['status'] != 0:
++            return False
++        for line in result['output'].splitlines():
++            if cmd_output['output'] in line:
++                return True
++        return False
++
++    def _eval_cmd_outputs(self):
++        if not self.cmd_outputs:
++            return True
++
++        _cmds = [self._eval_cmd_output(c) for c in self.cmd_outputs]
++
++        if self.required['commands'] == 'any':
++            return any(_cmds)
++        else:
++            return all(_cmds)
++
+     def __nonzero__(self):
+         """Predicate evaluation hook.
+         """
+ 
+         # Null predicate?
+-        if not any([self.kmods, self.services, self.dry_run]):
++        if not any([self.kmods, self.services, self.cmd_outputs, self.dry_run]):
+             return True
+ 
+-        return ((self._eval_kmods() and self._eval_services()) and not
++        return ((self._eval_kmods() and self._eval_services() and
++                 self._eval_cmd_outputs()) and not
+                 self.dry_run)
+ 
+     def __bool__(self):
+@@ -187,14 +223,17 @@ class SoSPredicate(object):
+         return self.__nonzero__()
+ 
+     def __init__(self, owner, dry_run=False, kmods=[], services=[],
+-                 required={}):
++                 cmd_outputs=[], required={}):
+         """Initialise a new SoSPredicate object.
+         """
+         self._owner = owner
+         self.kmods = list(kmods)
+         self.services = list(services)
++        if not isinstance(cmd_outputs, list):
++            cmd_outputs = [cmd_outputs]
++        self.cmd_outputs = cmd_outputs
+         self.dry_run = dry_run | self._owner.commons['cmdlineopts'].dry_run
+-        self.required = {'kmods': 'any', 'services': 'any'}
++        self.required = {'kmods': 'any', 'services': 'any', 'commands': 'any'}
+         self.required.update({
+             k: v for k, v in required.items() if
+             required[k] != self.required[k]
+
+From 47e434c50e63f80e4b620e74d81c636c8c8a8d97 Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Mon, 16 Sep 2019 17:15:40 +0200
+Subject: [PATCH 2/2] [grub2] call grub2-config with --no-grubenv-update when
+ appropriate
+
+On some newer grub2 versions, grub2-config removes extra args in
+$kernel_opts until --no-grubenv-update option is used.
+
+Test if the option is present in "grub2-config --help" and if so, use it.
+
+Resolves: #1682
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+---
+diff --git a/sos/plugins/grub2.py b/sos/plugins/grub2.py
+index 9786de44d..0ca6fe096 100644
+--- a/sos/plugins/grub2.py
++++ b/sos/plugins/grub2.py
+@@ -6,7 +6,8 @@
+ #
+ # See the LICENSE file in the source distribution for further information.
+ 
+-from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin
++from sos.plugins import (Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin,
++                         SoSPredicate)
+ 
+ 
+ class Grub2(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+@@ -32,9 +33,16 @@ def setup(self):
+         self.add_cmd_output("ls -lanR /boot")
+         # call grub2-mkconfig with GRUB_DISABLE_OS_PROBER=true to prevent
+         # possible unwanted loading of some kernel modules
++        # further, check if the command supports --no-grubenv-update option
++        # to prevent removing of extra args in $kernel_opts, and (only) if so,
++        # call the command with this argument
+         env = {}
+         env['GRUB_DISABLE_OS_PROBER'] = 'true'
+-        self.add_cmd_output("grub2-mkconfig", env=env)
++        grub_cmd = 'grub2-mkconfig'
++        co = {'cmd': 'grub2-mkconfig --help', 'output': '--no-grubenv-update'}
++        if self.test_predicate(self, pred=SoSPredicate(self, cmd_outputs=co)):
++            grub_cmd += ' --no-grubenv-update'
++        self.add_cmd_output(grub_cmd, env=env)
+ 
+     def postproc(self):
+         # the trailing space is required; python treats '_' as whitespace
diff --git a/SOURCES/sos-bz1709906-frr-plugin.patch b/SOURCES/sos-bz1709906-frr-plugin.patch
deleted file mode 100644
index dc43402..0000000
--- a/SOURCES/sos-bz1709906-frr-plugin.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From 5969fe8ca4dcfd315c3df714c03c7e7344fa8047 Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Tue, 9 Jul 2019 13:38:34 +0200
-Subject: [PATCH] [frr] FRR plugin
-
-A plugin for FRR alternative to Quagga. Path to conf is /etc/frr/.
-
-Resolves: #1666
-
-Signed-off-by: Filip Krska <fkrska@redhat.com>
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/plugins/frr.py | 25 +++++++++++++++++++++++++
- 1 file changed, 25 insertions(+)
- create mode 100644 sos/plugins/frr.py
-
-diff --git a/sos/plugins/frr.py b/sos/plugins/frr.py
-new file mode 100644
-index 000000000..031b2d935
---- /dev/null
-+++ b/sos/plugins/frr.py
-@@ -0,0 +1,25 @@
-+# This file is part of the sos project: https://github.com/sosreport/sos
-+#
-+# This copyrighted material is made available to anyone wishing to use,
-+# modify, copy, or redistribute it subject to the terms and conditions of
-+# version 2 of the GNU General Public License.
-+#
-+# See the LICENSE file in the source distribution for further information.
-+
-+from sos.plugins import Plugin, RedHatPlugin
-+
-+
-+class Frr(Plugin, RedHatPlugin):
-+    """Frr routing service
-+    """
-+
-+    plugin_name = 'frr'
-+    profiles = ('network',)
-+
-+    files = ('/etc/frr/zebra.conf',)
-+    packages = ('frr',)
-+
-+    def setup(self):
-+        self.add_copy_spec("/etc/frr/")
-+
-+# vim: set et ts=4 sw=4 :
diff --git a/SOURCES/sos-bz1714243-sar-collect-older-data.patch b/SOURCES/sos-bz1714243-sar-collect-older-data.patch
deleted file mode 100644
index 5984608..0000000
--- a/SOURCES/sos-bz1714243-sar-collect-older-data.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From b3d9fdf568e25997eb006e575d26fb301b91414b Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Tue, 9 Jul 2019 13:15:48 +0200
-Subject: [PATCH] [sar] collect whole sar log dir
-
-Currently, sosreport does not collect files in saYYYYMMDD or
-similar format. Assuming sar log dir contains only sar related data
-it is safe to collect whole dir (up to size limit, from newest to
-oldest files).
-
-Resolves: #1700
-
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/plugins/sar.py | 19 ++-----------------
- 1 file changed, 2 insertions(+), 17 deletions(-)
-
-diff --git a/sos/plugins/sar.py b/sos/plugins/sar.py
-index 492c38a21..5a1b9f30a 100644
---- a/sos/plugins/sar.py
-+++ b/sos/plugins/sar.py
-@@ -22,24 +22,9 @@ class Sar(Plugin,):
-     option_list = [("all_sar", "gather all system activity records",
-                     "", False)]
- 
--    # size-limit SAR data collected by default (MB)
--    sa_size = 20
--
-     def setup(self):
--        if self.get_option("all_sar"):
--            self.sa_size = 0
--
--        # Copy all sa??, sar??, sa??.* and sar??.* files, which will net
--        # compressed and uncompressed versions, typically.
--        for suffix in ('', '.*'):
--            self.add_copy_spec(
--                os.path.join(self.sa_path, "sa[0-3][0-9]" + suffix),
--                sizelimit=self.sa_size, tailit=False
--            )
--            self.add_copy_spec(
--                os.path.join(self.sa_path, "sar[0-3][0-9]" + suffix),
--                sizelimit=self.sa_size, tailit=False
--            )
-+        self.add_copy_spec(self.sa_path,
-+                           sizelimit=0 if self.get_option("all_sar") else None)
- 
-         try:
-             dir_list = os.listdir(self.sa_path)
diff --git a/SOURCES/sos-bz1717882-openstack-placement.patch b/SOURCES/sos-bz1717882-openstack-placement.patch
deleted file mode 100644
index 931c9f9..0000000
--- a/SOURCES/sos-bz1717882-openstack-placement.patch
+++ /dev/null
@@ -1,145 +0,0 @@
-From b5d72bd91c8685e3551d6e796ca8559304b45785 Mon Sep 17 00:00:00 2001
-From: Lee Yarwood <lyarwood@redhat.com>
-Date: Mon, 24 Dec 2018 10:03:59 +0000
-Subject: [PATCH] [openstack] Extract Placement plugin from Nova
-
-The OpenStack Placement service is being extracted from Nova [1]
-duringthe Stein development cycle [2]. This change extracts the
-required plugin logic from the original Nova plugin into a new
-Placement plugin ahead of this extraction.
-
-[1] https://docs.openstack.org/placement/latest/
-[2] https://releases.openstack.org/stein/schedule.html
-
-Co-Authored-by: Piotr Kopec <pkopec@redhat.com>
-
-Resolves: #1676
-
-Signed-off-by: Lee Yarwood <lyarwood@redhat.com>
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/openstack_placement.py | 112 +++++++++++++++++++++++++++++
- 1 file changed, 112 insertions(+)
- create mode 100644 sos/plugins/openstack_placement.py
-
-diff --git a/sos/plugins/openstack_placement.py b/sos/plugins/openstack_placement.py
-new file mode 100644
-index 00000000..26b1a520
---- /dev/null
-+++ b/sos/plugins/openstack_placement.py
-@@ -0,0 +1,112 @@
-+# Copyright (C) 2019 Red Hat, Inc., Lee Yarwood <lyarwood@redhat.com>
-+
-+# This file is part of the sos project: https://github.com/sosreport/sos
-+#
-+# This copyrighted material is made available to anyone wishing to use,
-+# modify, copy, or redistribute it subject to the terms and conditions of
-+# version 2 of the GNU General Public License.
-+#
-+# See the LICENSE file in the source distribution for further information.
-+
-+from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin
-+
-+
-+class OpenStackPlacement(Plugin):
-+    """OpenStack Placement
-+    """
-+    plugin_name = "openstack_placement"
-+    profiles = ('openstack', 'openstack_controller')
-+
-+    var_puppet_gen = "/var/lib/config-data/puppet-generated/placement"
-+
-+    def setup(self):
-+
-+        # collect commands output only if the openstack-placement-api service
-+        # is running
-+
-+        in_container = self.running_in_container()
-+
-+        if self.service_is_running('openstack-placement-api') or in_container:
-+            placement_config = ""
-+            # if containerized we need to pass the config to the cont.
-+            if in_container:
-+                placement_config = "--config-dir " + self.var_puppet_gen + \
-+                                "/etc/placement/"
-+            self.add_cmd_output(
-+                "placement-manage " + placement_config + " db version",
-+                suggest_filename="placement-manage_db_version"
-+            )
-+
-+        if self.get_option("all_logs"):
-+            self.add_copy_spec([
-+                "/var/log/placement/",
-+                "/var/log/containers/placement/",
-+                "/var/log/containers/httpd/placement-api/"
-+            ])
-+        else:
-+            self.add_copy_spec([
-+                "/var/log/placement/*.log",
-+                "/var/log/containers/placement/*.log",
-+                "/var/log/containers/httpd/placement-api/*log",
-+            ])
-+
-+        self.add_copy_spec([
-+            "/etc/placement/",
-+            self.var_puppet_gen + "/etc/placement/",
-+            self.var_puppet_gen + "/etc/my.cnf.d/tripleo.cnf",
-+            self.var_puppet_gen + "/etc/httpd/conf/",
-+            self.var_puppet_gen + "/etc/httpd/conf.d/",
-+            self.var_puppet_gen + "/etc/httpd/conf.modules.d/*.conf",
-+        ])
-+
-+    def running_in_container(self):
-+        for runtime in ["docker", "podman"]:
-+            container_status = self.get_command_output(runtime + " ps")
-+            if container_status['status'] == 0:
-+                for line in container_status['output'].splitlines():
-+                    if line.endswith("placement_api"):
-+                        return True
-+        return False
-+
-+    def apply_regex_sub(self, regexp, subst):
-+        self.do_path_regex_sub("/etc/placement/*", regexp, subst)
-+        self.do_path_regex_sub(
-+            self.var_puppet_gen + "/etc/placement/*",
-+            regexp, subst
-+        )
-+
-+    def postproc(self):
-+        protect_keys = ["password"]
-+        connection_keys = ["database_connection", "slave_connection"]
-+
-+        self.apply_regex_sub(
-+            r"((?m)^\s*(%s)\s*=\s*)(.*)" % "|".join(protect_keys),
-+            r"\1*********"
-+        )
-+        self.apply_regex_sub(
-+            r"((?m)^\s*(%s)\s*=\s*(.*)://(\w*):)(.*)(@(.*))" %
-+            "|".join(connection_keys),
-+            r"\1*********\6"
-+        )
-+
-+
-+class DebianPlacement(OpenStackPlacement, DebianPlugin, UbuntuPlugin):
-+
-+    packages = ('placement')
-+
-+    def setup(self):
-+        super(DebianPlacement, self).setup()
-+
-+
-+class RedHatPlacement(OpenStackPlacement, RedHatPlugin):
-+
-+    packages = ('openstack-selinux')
-+
-+    def setup(self):
-+        super(RedHatPlacement, self).setup()
-+        if self.get_option("all_logs"):
-+            self.add_copy_spec("/var/log/httpd/placement*")
-+        else:
-+            self.add_copy_spec("/var/log/httpd/placement*.log")
-+
-+# vim: set et ts=4 sw=4 :
--- 
-2.21.0
-
diff --git a/SOURCES/sos-bz1718087-redhat-local-name-not-rhn.patch b/SOURCES/sos-bz1718087-redhat-local-name-not-rhn.patch
deleted file mode 100644
index b3177c1..0000000
--- a/SOURCES/sos-bz1718087-redhat-local-name-not-rhn.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-From 4aa7e6e383fd9a36931b1125a8e8cd8e3ebcf1de Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Thu, 13 Jun 2019 16:39:54 +0200
-Subject: [PATCH] [policies] redhat policy to use hostname instead of rhn id
- for local name
-
-As rhn is getting obsoleted and each host has its hostname, even redhat policy
-should use host name as the local name.
-
-Resolves: #1702
-
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/policies/redhat.py | 23 -----------------------
- 1 file changed, 23 deletions(-)
-
-diff --git a/sos/policies/redhat.py b/sos/policies/redhat.py
-index 28d48d2d8..5fa1695c5 100644
---- a/sos/policies/redhat.py
-+++ b/sos/policies/redhat.py
-@@ -19,14 +19,6 @@
- from sos import _sos as _
- from sos import SoSOptions
- 
--sys.path.insert(0, "/usr/share/rhn/")
--try:
--    from up2date_client import up2dateAuth
--    from rhn import rpclib
--except ImportError:
--    # might fail if non-RHEL
--    pass
--
- OS_RELEASE = "/etc/os-release"
- 
- 
-@@ -174,9 +166,6 @@ def get_tmp_dir(self, opt_tmp_dir):
-             return self._tmp_dir
-         return opt_tmp_dir
- 
--    def get_local_name(self):
--        return self.host_name()
--
- 
- # Container environment variables on Red Hat systems.
- ENV_CONTAINER = 'container'
-@@ -305,18 +294,6 @@ def dist_version(self):
-             pass
-         return False
- 
--    def rhn_username(self):
--        try:
--            rhn_username = rpclib.xmlrpclib.loads(
--                up2dateAuth.getSystemId())[0][0]['username']
--            return rhn_username.encode('utf-8', 'ignore')
--        except Exception:
--            # ignore any exception and return an empty username
--            return ""
--
--    def get_local_name(self):
--        return self.rhn_username() or self.host_name()
--
-     def probe_preset(self):
-         # Package based checks
-         if self.pkg_by_name("satellite-common") is not None:
diff --git a/SOURCES/sos-bz1719884-pcp-pmlogger-no-limit.patch b/SOURCES/sos-bz1719884-pcp-pmlogger-no-limit.patch
deleted file mode 100644
index 8c12a1b..0000000
--- a/SOURCES/sos-bz1719884-pcp-pmlogger-no-limit.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 380737d0bf4021434db4d5e479f0b8a2aece6ec9 Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Thu, 4 Apr 2019 10:43:24 +0200
-Subject: [PATCH] [pcp] collect pmlogger without a sizelimit
-
-sizelimit=None defaults to --log-size, use sizelimit=0 instead
-
-Resolves: #1632
-
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/plugins/pcp.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/sos/plugins/pcp.py b/sos/plugins/pcp.py
-index da7158a6..da2a6611 100644
---- a/sos/plugins/pcp.py
-+++ b/sos/plugins/pcp.py
-@@ -130,7 +130,7 @@ class Pcp(Plugin, RedHatPlugin, DebianPlugin):
-             pmlogger_ls = self.get_cmd_output_now("ls -t1 %s" % path)
-             if pmlogger_ls:
-                 for line in open(pmlogger_ls).read().splitlines():
--                    self.add_copy_spec(line, sizelimit=None)
-+                    self.add_copy_spec(line, sizelimit=0)
-                     files_collected = files_collected + 1
-                     if self.countlimit and files_collected == self.countlimit:
-                         break
--- 
-2.17.2
-
diff --git a/SOURCES/sos-bz1719885-plugin-vs-command-timeouts.patch b/SOURCES/sos-bz1719885-plugin-vs-command-timeouts.patch
deleted file mode 100644
index 00e896e..0000000
--- a/SOURCES/sos-bz1719885-plugin-vs-command-timeouts.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From 7c8c45dad3481cfaae3d3af9c188218aa14a3a6a Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Tue, 9 Apr 2019 09:50:34 +0200
-Subject: [PATCH] [foreman,satellite] increase plugin default timeouts
-
-Those two plugins call commands with bigger timeouts than the default
-plugin timeout is. That can unexpectedly kill the plugin execution when
-the commands execution took longer than the plugin timeout (but within
-cmd timeout).
-
-Resolves: #1642
-
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/plugins/foreman.py   | 1 +
- sos/plugins/satellite.py | 1 +
- 2 files changed, 2 insertions(+)
-
-diff --git a/sos/plugins/foreman.py b/sos/plugins/foreman.py
-index a1e937f3..8bcd26bd 100644
---- a/sos/plugins/foreman.py
-+++ b/sos/plugins/foreman.py
-@@ -19,6 +19,7 @@ class Foreman(Plugin):
-     """
- 
-     plugin_name = 'foreman'
-+    plugin_timeout = 1800
-     profiles = ('sysmgmt',)
-     packages = ('foreman', 'foreman-proxy')
-     option_list = [
-diff --git a/sos/plugins/satellite.py b/sos/plugins/satellite.py
-index c50c2ec7..83733076 100644
---- a/sos/plugins/satellite.py
-+++ b/sos/plugins/satellite.py
-@@ -14,6 +14,7 @@ class Satellite(Plugin, RedHatPlugin):
-     """
- 
-     plugin_name = 'satellite'
-+    plugin_timeout = 1200
-     profiles = ('sysmgmt',)
-     verify_packages = ('spacewalk.*',)
-     satellite = False
--- 
-2.17.2
-
diff --git a/SOURCES/sos-bz1719886-sos-conf-disabled-plugins-manpages.patch b/SOURCES/sos-bz1719886-sos-conf-disabled-plugins-manpages.patch
deleted file mode 100644
index bed3bde..0000000
--- a/SOURCES/sos-bz1719886-sos-conf-disabled-plugins-manpages.patch
+++ /dev/null
@@ -1,110 +0,0 @@
-From 4cb21e2c16b55e7506a3cefd9148ba4bf49dbce1 Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Wed, 17 Apr 2019 13:17:24 +0200
-Subject: [PATCH] [sosreport] update sos.conf manpages by [general] section
- description
-
-Since PR #1530, sosreport supports all command line options. Man pages
-should document the enhancement.
-
-Resolves: #1652
-
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- man/en/sos.conf.5 | 38 ++++++++++++++++++++++++++++++++++----
- 1 file changed, 34 insertions(+), 4 deletions(-)
-
-diff --git a/man/en/sos.conf.5 b/man/en/sos.conf.5
-index b40a48e1..ad18d5f2 100644
---- a/man/en/sos.conf.5
-+++ b/man/en/sos.conf.5
-@@ -6,19 +6,49 @@ sos.conf \- sosreport configuration
- sosreport uses a configuration file at /etc/sos.conf.
- .SH PARAMETERS
- .sp
--There are two sections in the sosreport configuration file:
--plugins, and tunables. Options are set using 'ini'-style
--\fBname = value\fP pairs.
-+There are three sections in the sosreport configuration file:
-+general, plugins and tunables. Options are set using 'ini'-style
-+\fBname = value\fP pairs. Disabling/enabling a boolean option
-+is done the same way like on command line (e.g. process.lsof=off).
- 
- Some options accept a comma separated list of values.
- 
-+Using options that dont expect a value (like all-logs or no-report)
-+will result in enabling those options, regardless of value set.
-+
-+Sections are parsed in the ordering:
-+.br
-+- \fB[general]\fP
-+.br
-+- \fB[plugins]\fP (disable)
-+.br
-+- \fB[plugins]\fP (enable)
-+.br
-+- \fB[tunables]\fP
-+
-+.TP
-+\fB[general]\fP
-+<option>      Sets (long) option value. Short options (i.e. z=auto)
-+              are not supported.
- .TP
- \fB[plugins]\fP
--disable Comma separated list of plugins to disable.
-+disable       Comma separated list of plugins to disable.
-+.br
-+enable        Comma separated list of plugins to enable.
- .TP
- \fB[tunables]\fP
- plugin.option Alter available options for defined plugin.
- .SH EXAMPLES
-+To use quiet and batch mode with 10 threads:
-+.LP
-+[general]
-+.br
-+batch=yes
-+.br
-+build=true
-+.br
-+threads=10
-+.sp
- To disable the 'general' and 'filesys' plugins:
- .LP
- [plugins]
--- 
-2.17.2
-
-From 84822ff1bbe2d5543daa8059b0a2270c88e473d6 Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Wed, 17 Apr 2019 11:51:09 +0200
-Subject: [PATCH] [sosreport] initialize disabled plugins properly when parsing
- sos.conf
-
-opts.noplugins is referred when parsing "tunables" section, so
-the variable must be set to empty list every time.
-
-Resolves: #1651
-
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/__init__.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/sos/__init__.py b/sos/__init__.py
-index dfc7ed5f..ed59025a 100644
---- a/sos/__init__.py
-+++ b/sos/__init__.py
-@@ -250,8 +250,8 @@ class SoSOptions(object):
-                 optlist.extend(SoSOptions._opt_to_args(opt, val))
-             opts._merge_opts(argparser.parse_args(optlist), is_default)
- 
-+        opts.noplugins = []
-         if config.has_option("plugins", "disable"):
--            opts.noplugins = []
-             opts.noplugins.extend([plugin.strip() for plugin in
-                                   config.get("plugins", "disable").split(',')])
- 
--- 
-2.17.2
-
diff --git a/SOURCES/sos-bz1719887-katello-qpid-certificate.patch b/SOURCES/sos-bz1719887-katello-qpid-certificate.patch
deleted file mode 100644
index 3ca559a..0000000
--- a/SOURCES/sos-bz1719887-katello-qpid-certificate.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 166f712eb447f54f0e2c5396ea25f5bc11e3f519 Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Fri, 17 May 2019 15:55:05 +0200
-Subject: [PATCH] [katello] support both locations of qpid SSL certs
-
-Newer katello versions deploy certs for qpid to
-/etc/pki/pulp/qpid/client.crt certs instead of
-/etc/pki/katello/qpid_client_striped.crt .
-
-Sosreport should use either of the location that exists, to successfully
-run few qpid-stat commands.
-
-Resolves: #1680
-
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/plugins/katello.py | 8 +++++++-
- 1 file changed, 7 insertions(+), 1 deletion(-)
-
-diff --git a/sos/plugins/katello.py b/sos/plugins/katello.py
-index 0794fb4c..1ea52da8 100644
---- a/sos/plugins/katello.py
-+++ b/sos/plugins/katello.py
-@@ -10,6 +10,7 @@
- 
- from sos.plugins import Plugin, RedHatPlugin
- from pipes import quote
-+import os.path
- 
- 
- class Katello(Plugin, RedHatPlugin):
-@@ -24,7 +25,12 @@ class Katello(Plugin, RedHatPlugin):
-             "/var/log/httpd/katello-reverse-proxy_error_ssl.log*"
-         ])
- 
--        cert = "/etc/pki/katello/qpid_client_striped.crt"
-+        # certificate file location relies on katello version, it can be either
-+        # /etc/pki/katello/qpid_client_striped.crt (for older versions) or
-+        # /etc/pki/pulp/qpid/client.crt (for newer versions)
-+        cert = "/etc/pki/pulp/qpid/client.crt"
-+        if not os.path.isfile(cert):
-+            cert = "/etc/pki/katello/qpid_client_striped.crt"
-         self.add_cmd_output([
-             "qpid-stat -%s --ssl-certificate=%s -b amqps://localhost:5671" %
-             (opt, cert) for opt in "quc"
--- 
-2.17.2
-
diff --git a/SOURCES/sos-bz1721779-ebpf-net-list.patch b/SOURCES/sos-bz1721779-ebpf-net-list.patch
new file mode 100644
index 0000000..a1858a0
--- /dev/null
+++ b/SOURCES/sos-bz1721779-ebpf-net-list.patch
@@ -0,0 +1,29 @@
+From 62b77dcd78dc271879d01f0132acea1952ef226d Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Thu, 27 Jun 2019 13:44:40 +0200
+Subject: [PATCH] [kernel] collect "bpftool net list"
+
+List bpf program attachments in the kernel networking subsystem.
+
+Resolves: #1712
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+---
+ sos/plugins/kernel.py | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sos/plugins/kernel.py b/sos/plugins/kernel.py
+index 558e71438..bf3c3deaa 100644
+--- a/sos/plugins/kernel.py
++++ b/sos/plugins/kernel.py
+@@ -142,6 +142,10 @@ class Kernel(Plugin, RedHatPlugin, Debia
+         if not self.get_option("trace"):
+             self.add_forbidden_path("/sys/kernel/debug/tracing/trace")
+ 
++        # collect list of bpf program attachments in the kernel
++        # networking subsystem
++        self.add_cmd_output("bpftool net list")
++
+         # collect list of eBPF programs and maps and their dumps
+         prog_file = self.get_cmd_output_now("bpftool -j prog list")
+         for prog_id in self.get_bpftool_prog_ids(prog_file):
diff --git a/SOURCES/sos-bz1728214-symlink-dirs-in-container.patch b/SOURCES/sos-bz1728214-symlink-dirs-in-container.patch
deleted file mode 100644
index b53b9f4..0000000
--- a/SOURCES/sos-bz1728214-symlink-dirs-in-container.patch
+++ /dev/null
@@ -1,119 +0,0 @@
-From 3006f467e6e3908193d28d76bddcc372c4b98875 Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Tue, 9 Jul 2019 13:35:28 +0200
-Subject: [PATCH] [archive] Handle checking container sysroot in
- _make_leading_paths
-
-Previously, in _make_leading_paths(), checking host file paths did not
-account for non / sysroots, for situations where sos is run in a
-container and the host's / is actually mounted under /host for example.
-This would lead to copy errors when trying to copy symlinks.
-
-This method now will use sysroot if one is set, thus avoiding copy
-errors.
-
-Resolves: #1705
-
-Signed-off-by: Jake Hunsaker <jhunsake@redhat.com>
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/archive.py         | 17 +++++++++++++----
- sos/sosreport.py       |  4 ++--
- tests/archive_tests.py |  3 ++-
- 3 files changed, 17 insertions(+), 7 deletions(-)
-
-diff --git a/sos/archive.py b/sos/archive.py
-index dcd6908d1..7ab36ce45 100644
---- a/sos/archive.py
-+++ b/sos/archive.py
-@@ -139,12 +139,13 @@ class FileCacheArchive(Archive):
-     _archive_root = ""
-     _archive_name = ""
- 
--    def __init__(self, name, tmpdir, policy, threads, enc_opts):
-+    def __init__(self, name, tmpdir, policy, threads, enc_opts, sysroot):
-         self._name = name
-         self._tmp_dir = tmpdir
-         self._policy = policy
-         self._threads = threads
-         self.enc_opts = enc_opts
-+        self.sysroot = sysroot
-         self._archive_root = os.path.join(tmpdir, name)
-         with self._path_lock:
-             os.makedirs(self._archive_root, 0o700)
-@@ -156,6 +157,13 @@ def dest_path(self, name):
-             name = name.lstrip(os.sep)
-         return (os.path.join(self._archive_root, name))
- 
-+    def join_sysroot(self, path):
-+        if path.startswith(self.sysroot):
-+            return path
-+        if path[0] == os.sep:
-+            path = path[1:]
-+        return os.path.join(self.sysroot, path)
-+
-     def _make_leading_paths(self, src, mode=0o700):
-         """Create leading path components
- 
-@@ -191,7 +199,8 @@ def in_archive(path):
-             src_dir = src
-         else:
-             # Host file path
--            src_dir = src if os.path.isdir(src) else os.path.split(src)[0]
-+            src_dir = (src if os.path.isdir(self.join_sysroot(src))
-+                       else os.path.split(src)[0])
- 
-         # Build a list of path components in root-to-leaf order.
-         path = src_dir
-@@ -675,9 +684,9 @@ class TarFileArchive(FileCacheArchive):
-     method = None
-     _with_selinux_context = False
- 
--    def __init__(self, name, tmpdir, policy, threads, enc_opts):
-+    def __init__(self, name, tmpdir, policy, threads, enc_opts, sysroot):
-         super(TarFileArchive, self).__init__(name, tmpdir, policy, threads,
--                                             enc_opts)
-+                                             enc_opts, sysroot)
-         self._suffix = "tar"
-         self._archive_name = os.path.join(tmpdir, self.name())
- 
-diff --git a/sos/sosreport.py b/sos/sosreport.py
-index cd61b6257..04cb86155 100644
---- a/sos/sosreport.py
-+++ b/sos/sosreport.py
-@@ -379,12 +379,12 @@ def _set_archive(self):
-             auto_archive = self.policy.get_preferred_archive()
-             self.archive = auto_archive(archive_name, self.tmpdir,
-                                         self.policy, self.opts.threads,
--                                        enc_opts)
-+                                        enc_opts, self.sysroot)
- 
-         else:
-             self.archive = TarFileArchive(archive_name, self.tmpdir,
-                                           self.policy, self.opts.threads,
--                                          enc_opts)
-+                                          enc_opts, self.sysroot)
- 
-         self.archive.set_debug(True if self.opts.debug else False)
- 
-diff --git a/tests/archive_tests.py b/tests/archive_tests.py
-index e5b329b5f..350220b92 100644
---- a/tests/archive_tests.py
-+++ b/tests/archive_tests.py
-@@ -20,7 +20,7 @@ class TarFileArchiveTest(unittest.TestCase):
-     def setUp(self):
-         self.tmpdir = tempfile.mkdtemp()
-         enc = {'encrypt': False}
--        self.tf = TarFileArchive('test', self.tmpdir, Policy(), 1, enc)
-+        self.tf = TarFileArchive('test', self.tmpdir, Policy(), 1, enc, '/')
- 
-     def tearDown(self):
-         shutil.rmtree(self.tmpdir)
-@@ -113,6 +113,7 @@ def test_make_link(self):
-     def test_compress(self):
-         self.tf.finalize("auto")
- 
-+
- if __name__ == "__main__":
-     unittest.main()
- 
diff --git a/SOURCES/sos-bz1733352-cmd-poll-performance.patch b/SOURCES/sos-bz1733352-cmd-poll-performance.patch
deleted file mode 100644
index 7ab2e4c..0000000
--- a/SOURCES/sos-bz1733352-cmd-poll-performance.patch
+++ /dev/null
@@ -1,55 +0,0 @@
-From 3253179b207c2616ce238e2bb765635fe59e6dd2 Mon Sep 17 00:00:00 2001
-From: Kazuhito Hagio <k-hagio@ab.jp.nec.com>
-Date: Thu, 18 Jul 2019 09:58:56 -0400
-Subject: [PATCH] [utilities] Fix high CPU usage and slow command collection
-
-commit fc6721ac83c2 ("[Plugin] Terminate running commands when a plugin
-exceeds timeout") introduced a polling method to sos_get_command_output()
-but it is busy wait, and seems to increase the CPU usage and slow down
-AsyncReader significantly.
-
-As a result, a command that outputs much data like journalctl takes
-longer time, and the plugin times out.
-
-Inserting a sleep is a possible fix for this.
-
-Resolves: #1732
-
-Signed-off-by: Kazuhito Hagio <k-hagio@ab.jp.nec.com>
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/utilities.py | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/sos/utilities.py b/sos/utilities.py
-index 1737478f..c3d6ac20 100644
---- a/sos/utilities.py
-+++ b/sos/utilities.py
-@@ -18,6 +18,7 @@ import errno
- import shlex
- import glob
- import threading
-+import time
- 
- from contextlib import closing
- from collections import deque
-@@ -158,6 +159,7 @@ def sos_get_command_output(command, timeout=300, stderr=False,
-                 if poller():
-                     p.terminate()
-                     raise SoSTimeoutError
-+                time.sleep(0.01)
-         stdout = reader.get_contents()
-         while p.poll() is None:
-             pass
-@@ -248,7 +250,7 @@ class AsyncReader(threading.Thread):
-         # block until command completes or timesout (separate from the plugin
-         # hitting a timeout)
-         while self.running:
--            pass
-+            time.sleep(0.01)
-         if not self.binary:
-             return ''.join(ln.decode('utf-8', 'ignore') for ln in self.deque)
-         else:
--- 
-2.21.0
-
diff --git a/SOURCES/sos-bz1733469-timeouted-plugin-stop-further-collection.patch b/SOURCES/sos-bz1733469-timeouted-plugin-stop-further-collection.patch
deleted file mode 100644
index 19da03a..0000000
--- a/SOURCES/sos-bz1733469-timeouted-plugin-stop-further-collection.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From 8ad1f5977adfa11880aae4144d554ad1cc99ad63 Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Fri, 26 Jul 2019 11:44:53 +0200
-Subject: [PATCH] [plugins] Stop plugin execution after timeout hit
-
-When a plugin timeouts, it must stop collecting further data. Otherwise
-a race issues with archive.finalize() can happen.
-
-So any data collection must be skipped if _timeout_hit is True.
-
-Resolves: #1736
-
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/plugins/__init__.py | 11 +++++++++++
- 1 file changed, 11 insertions(+)
-
-diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
-index e5bb39ee..aa268d84 100644
---- a/sos/plugins/__init__.py
-+++ b/sos/plugins/__init__.py
-@@ -652,6 +652,9 @@ class Plugin(object):
-         everything below it is recursively copied. A list of copied files are
-         saved for use later in preparing a report.
-         '''
-+        if self._timeout_hit:
-+            return
-+
-         if self._is_forbidden_path(srcpath):
-             self._log_debug("skipping forbidden path '%s'" % srcpath)
-             return ''
-@@ -852,6 +855,9 @@ class Plugin(object):
-     def get_command_output(self, prog, timeout=300, stderr=True,
-                            chroot=True, runat=None, env=None,
-                            binary=False, sizelimit=None):
-+        if self._timeout_hit:
-+            return
-+
-         if chroot or self.commons['cmdlineopts'].chroot == 'always':
-             root = self.sysroot
-         else:
-@@ -1012,6 +1018,9 @@ class Plugin(object):
-         """Execute a command and save the output to a file for inclusion in the
-         report.
-         """
-+        if self._timeout_hit:
-+            return
-+
-         start = time()
- 
-         result = self.get_command_output(exe, timeout=timeout, stderr=stderr,
-@@ -1201,6 +1210,8 @@ class Plugin(object):
- 
-     def _collect_strings(self):
-         for string, file_name in self.copy_strings:
-+            if self._timeout_hit:
-+                return
-             content = ''
-             if string:
-                 content = string.splitlines()[0]
--- 
-2.21.0
-
diff --git a/SOURCES/sos-bz1738391-kernel-no-trace-by-default.patch b/SOURCES/sos-bz1738391-kernel-no-trace-by-default.patch
new file mode 100644
index 0000000..5aec064
--- /dev/null
+++ b/SOURCES/sos-bz1738391-kernel-no-trace-by-default.patch
@@ -0,0 +1,79 @@
+From 55949fb88c492eec542c69157a8763ddb3555345 Mon Sep 17 00:00:00 2001
+From: MIZUTA Takeshi <mizuta.takeshi@fujitsu.com>
+Date: Thu, 6 Jun 2019 18:42:40 +0900
+Subject: [PATCH] [plugins] Change forbidden_path from partial-match to
+ exact-match
+
+forbidden_path is evaluated on partial-match.
+However, it will be correct to evaluate on exact-match.
+
+Closes: #1692
+Resolves: #1695
+
+Signed-off-by: MIZUTA Takeshi <mizuta.takeshi@fujitsu.com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/__init__.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 56af847a..41f4f58c 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -64,7 +64,7 @@ def _mangle_command(command, name_max):
+ 
+ 
+ def _path_in_path_list(path, path_list):
+-    return any(p in path for p in path_list)
++    return any(p == path for p in path_list)
+ 
+ 
+ def _node_type(st):
+-- 
+2.21.0
+
+From d2d5b9da6d4af7ead8a47468db0bbfcc8fb2b5bf Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Thu, 26 Sep 2019 10:50:18 +0200
+Subject: [PATCH] [kernel] Don't collect trace file by default
+
+Updates the plugin to don't collect trace file by default. Collecting
+trace file may take a lot of time, so trace file is not collected
+by default, and use the new plug-in option when collecting.
+
+Original author: MIZUTA Takeshi <mizuta.takeshi@fujitsu.com>
+
+Closes: #1688
+Resolves: #1800
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/kernel.py | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/sos/plugins/kernel.py b/sos/plugins/kernel.py
+index bf3c3dea..b498f55e 100644
+--- a/sos/plugins/kernel.py
++++ b/sos/plugins/kernel.py
+@@ -23,7 +23,8 @@ class Kernel(Plugin, RedHatPlugin, Debia
+     sys_module = '/sys/module'
+ 
+     option_list = [
+-        ("with-timer", "gather /proc/timer* statistics", "slow", False)
++        ("with-timer", "gather /proc/timer* statistics", "slow", False),
++        ("trace", "gather /sys/kernel/debug/tracing/trace file", "slow", False)
+     ]
+ 
+     def get_bpftool_prog_ids(self, prog_file):
+@@ -138,6 +139,9 @@ class Kernel(Plugin, RedHatPlugin, Debia
+             # and may also cause softlockups
+             self.add_copy_spec("/proc/timer*")
+ 
++        if not self.get_option("trace"):
++            self.add_forbidden_path("/sys/kernel/debug/tracing/trace")
++
+         # collect list of eBPF programs and maps and their dumps
+         prog_file = self.get_cmd_output_now("bpftool -j prog list")
+         for prog_id in self.get_bpftool_prog_ids(prog_file):
+2.21.0
diff --git a/SOURCES/sos-bz1741330-openswan-to-libreswan.patch b/SOURCES/sos-bz1741330-openswan-to-libreswan.patch
new file mode 100644
index 0000000..db247d2
--- /dev/null
+++ b/SOURCES/sos-bz1741330-openswan-to-libreswan.patch
@@ -0,0 +1,104 @@
+From b061168bdae759c88e9ef93f3620edae404e69fe Mon Sep 17 00:00:00 2001
+From: Stepan Broz <sbroz@redhat.com>
+Date: Thu, 26 Sep 2019 12:56:00 +0200
+Subject: [PATCH] [libreswan] New plugin for "libreswan" IPsec
+
+The "libreswan" package is replacing "openswan" in many distributions.
+This plugin is replacing the original "openswan" plugin that it is
+based on.
+
+This plugin will now run for both "libreswan" and "openswan" packages,
+or when the configuration file "/etc/ipsec.conf" is present.
+
+Data collected now include configuration, current status, XFRM policy
+and state, XFRM statistics, basic information about certificates and
+the NSS database.
+
+No private data (keys, certificates, secrets) are collected, authenti-
+cation and encryption keys are removed from the output of
+"ip xfrm state", and also from "ipsec barf" when running with the
+"ipsec-barf" option set.
+
+Signed-off-by: Stepan Broz <sbroz@redhat.com>
+---
+ sos/plugins/{openswan.py => libreswan.py} | 37 ++++++++++++++++++-----
+ 1 file changed, 30 insertions(+), 7 deletions(-)
+ rename sos/plugins/{openswan.py => libreswan.py} (50%)
+
+diff --git a/sos/plugins/openswan.py b/sos/plugins/libreswan.py
+similarity index 50%
+rename from sos/plugins/openswan.py
+rename to sos/plugins/libreswan.py
+index ce5581320..717329b87 100644
+--- a/sos/plugins/openswan.py
++++ b/sos/plugins/libreswan.py
+@@ -1,4 +1,5 @@
+ # Copyright (C) 2007 Sadique Puthen <sputhenp@redhat.com>
++# Copyright (C) 2019 Red Hat Inc., Stepan Broz <sbroz@redhat.com>
+ 
+ # This file is part of the sos project: https://github.com/sosreport/sos
+ #
+@@ -11,29 +12,38 @@
+ from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin
+ 
+ 
+-class Openswan(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+-    """Openswan IPsec
++class Libreswan(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
++    """Libreswan IPsec
+     """
+ 
+-    plugin_name = 'openswan'
+-    profiles = ('network', 'security')
++    plugin_name = 'libreswan'
++    profiles = ('network', 'security', 'openshift')
+     option_list = [
+         ("ipsec-barf", "collect the output of the ipsec barf command",
+          "slow", False)
+     ]
+ 
+     files = ('/etc/ipsec.conf',)
+-    packages = ('openswan', 'libreswan')
++    packages = ('libreswan', 'openswan')
+ 
+     def setup(self):
+         self.add_copy_spec([
+             "/etc/ipsec.conf",
+-            "/etc/ipsec.d"
++            "/etc/ipsec.d",
++            "/proc/net/xfrm_stat"
+         ])
+ 
+         # although this is 'verification' it's normally a very quick
+         # operation so is not conditional on --verify
+-        self.add_cmd_output("ipsec verify")
++        self.add_cmd_output([
++            'ipsec verify',
++            'ipsec whack --status',
++            'ipsec whack --listall',
++            'certutil -L -d sql:/etc/ipsec.d',
++            'ip xfrm policy',
++            'ip xfrm state'
++        ])
++
+         if self.get_option("ipsec-barf"):
+             self.add_cmd_output("ipsec barf")
+ 
+@@ -44,4 +54,17 @@ def setup(self):
+             '/etc/ipsec.d/*.secrets'
+         ])
+ 
++    def postproc(self):
++        # Remove any sensitive data.
++        # "ip xfrm state" output contains encryption or authentication private
++        # keys:
++        xfrm_state_regexp = r'(aead|auth|auth-trunc|enc)' \
++                            r'(\s.*\s)(0x[0-9a-f]+)'
++        self.do_cmd_output_sub("state", xfrm_state_regexp,
++                               r"\1\2********")
++
++        if self.get_option("ipsec-barf"):
++            self.do_cmd_output_sub("barf", xfrm_state_regexp,
++                                   r"\1\2********")
++
+ # vim: set et ts=4 sw=4 :
diff --git a/SOURCES/sos-bz1744553-ovn-plugins-containerized-env.patch b/SOURCES/sos-bz1744553-ovn-plugins-containerized-env.patch
new file mode 100644
index 0000000..9a97377
--- /dev/null
+++ b/SOURCES/sos-bz1744553-ovn-plugins-containerized-env.patch
@@ -0,0 +1,326 @@
+From cc6374914a47eb3777c5b8306506df43522a31e0 Mon Sep 17 00:00:00 2001
+From: Daniel Alvarez <dalvarez@redhat.com>
+Date: Thu, 18 Jul 2019 14:08:27 +0200
+Subject: [PATCH] [ovn_central] add additional show commands
+
+This patch is adding 'show' commands for both OVN
+NorthBound and SouthBound databases.
+
+Signed-off-by: Daniel Alvarez <dalvarez@redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/ovn_central.py | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sos/plugins/ovn_central.py b/sos/plugins/ovn_central.py
+index e05856872..2d2526253 100644
+--- a/sos/plugins/ovn_central.py
++++ b/sos/plugins/ovn_central.py
+@@ -57,6 +57,8 @@ def setup(self):
+ 
+         # Some user-friendly versions of DB output
+         cmds = [
++            'ovn-nbctl show',
++            'ovn-sbctl show',
+             'ovn-sbctl lflow-list',
+             'ovn-nbctl get-ssl',
+             'ovn-nbctl get-connection',
+From 5fd4e850ad9a6636d0fb206954e8ab016584974d Mon Sep 17 00:00:00 2001
+From: Daniel Alvarez <dalvarez@redhat.com>
+Date: Wed, 11 Sep 2019 16:19:15 +0100
+Subject: [PATCH] [ovn_host] fix Open_vSwitch table name
+
+Signed-off-by: Daniel Alvarez <dalvarez@redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/ovn_host.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/ovn_host.py b/sos/plugins/ovn_host.py
+index 542516279..ba35d87e7 100644
+--- a/sos/plugins/ovn_host.py
++++ b/sos/plugins/ovn_host.py
+@@ -35,7 +35,7 @@ def setup(self):
+         self.add_cmd_output([
+             'ovs-ofctl -O OpenFlow13 dump-flows br-int',
+             'ovs-vsctl list-br',
+-            'ovs-vsctl list OpenVswitch',
++            'ovs-vsctl list Open_vSwitch',
+         ])
+ 
+         self.add_journal(units="ovn-controller")
+From 3c842046e9c4c5b371566347f51e5e242daf4f8d Mon Sep 17 00:00:00 2001
+From: Daniel Alvarez <dalvarez@redhat.com>
+Date: Tue, 23 Jul 2019 12:44:07 +0200
+Subject: [PATCH] [ovn_central] Add support to containerized setups
+
+This patch is adding support in ovn_central plugin to containerized
+setups.
+
+Now it's detecting if the OVN central services are running in
+container and execute the relevant commands inside it. The support
+covers both podman and docker runtimes.
+
+Signed-off-by: Daniel Alvarez <dalvarez@redhat.com>
+---
+ sos/plugins/ovn_central.py | 94 ++++++++++++++++++++++++++++----------
+ 1 file changed, 69 insertions(+), 25 deletions(-)
+
+diff --git a/sos/plugins/ovn_central.py b/sos/plugins/ovn_central.py
+index 2d2526253..a9fcdf33e 100644
+--- a/sos/plugins/ovn_central.py
++++ b/sos/plugins/ovn_central.py
+@@ -19,30 +19,64 @@ class OVNCentral(Plugin):
+     """
+     plugin_name = "ovn_central"
+     profiles = ('network', 'virt')
+-
+-    def add_database_output(self, filename, cmds, ovn_cmd, skip=[]):
++    _container_runtime = None
++    _container_name = None
++
++    def get_tables_from_schema(self, filename, skip=[]):
++        if self._container_name:
++            cmd = "%s exec %s cat %s" % (
++                self._container_runtime, self._container_name, filename)
++            res = self.get_command_output(cmd)
++            if res['status'] != 0:
++                self._log_error("Could not retrieve DB schema file from "
++                                "container %s" % self._container_name)
++                return
++            try:
++                db = json.loads(res['output'])
++            except Exception:
++                self._log_error("Cannot parse JSON file %s" % filename)
++                return
++        else:
++            try:
++                with open(filename, 'r') as f:
++                    try:
++                        db = json.load(f)
++                    except Exception:
++                        self._log_error(
++                            "Cannot parse JSON file %s" % filename)
++                        return
++            except IOError as ex:
++                self._log_error(
++                    "Could not open DB schema file %s: %s" % (filename, ex))
++                return
+         try:
+-            with open(filename, 'r') as f:
+-                try:
+-                    db = json.load(f)
+-                except Exception:
+-                    # If json can't be parsed, then exit early
+-                    self._log_error("Cannot parse JSON file %s" % filename)
+-                    return
+-                try:
+-                    for table in six.iterkeys(db['tables']):
+-                        if table not in skip:
+-                            cmds.append('%s list %s' % (ovn_cmd, table))
+-                except AttributeError:
+-                    self._log_error("DB schema %s has no 'tables' key" %
+-                                    filename)
+-                    return
+-        except IOError as ex:
+-            self._log_error("Could not open DB schema file %s: %s" % (filename,
+-                                                                      ex))
+-            return
++            return [table for table in six.iterkeys(
++                db['tables']) if table not in skip]
++        except AttributeError:
++            self._log_error("DB schema %s has no 'tables' key" % filename)
++
++    def add_database_output(self, tables, cmds, ovn_cmd):
++        for table in tables:
++            cmds.append('%s list %s' % (ovn_cmd, table))
++
++    def running_in_container(self):
++        for runtime in ["podman", "docker"]:
++            container_status = self.get_command_output(runtime + " ps")
++            if container_status['status'] == 0:
++                for line in container_status['output'].splitlines():
++                    if "ovn-dbs-bundle" in line:
++                        self._container_name = line.split()[-1]
++                        self._container_runtime = runtime
++                        return True
++        return False
++
++    def check_enabled(self):
++        return (self.running_in_container() or
++                super(OVNCentral, self).check_enabled())
+ 
+     def setup(self):
++        containerized = self.running_in_container()
++
+         ovs_rundir = os.environ.get('OVS_RUNDIR')
+         for pidfile in ['ovnnb_db.pid', 'ovnsb_db.pid', 'ovn-northd.pid']:
+             self.add_copy_spec([
+@@ -68,10 +102,20 @@ def setup(self):
+ 
+         schema_dir = '/usr/share/openvswitch'
+ 
+-        self.add_database_output(os.path.join(schema_dir, 'ovn-nb.ovsschema'),
+-                                 cmds, 'ovn-nbctl')
+-        self.add_database_output(os.path.join(schema_dir, 'ovn-sb.ovsschema'),
+-                                 cmds, 'ovn-sbctl', ['Logical_Flow'])
++        nb_tables = self.get_tables_from_schema(os.path.join(
++            schema_dir, 'ovn-nb.ovsschema'))
++        sb_tables = self.get_tables_from_schema(os.path.join(
++            schema_dir, 'ovn-sb.ovsschema'), ['Logical_Flow'])
++
++        self.add_database_output(nb_tables, cmds, 'ovn-nbctl')
++        self.add_database_output(sb_tables, cmds, 'ovn-sbctl')
++
++        # If OVN is containerized, we need to run the above commands inside
++        # the container.
++        if containerized:
++            cmds = ['%s exec %s %s' % (self._container_runtime,
++                                       self._container_name,
++                                       cmd) for cmd in cmds]
+ 
+         self.add_cmd_output(cmds)
+ 
+From a895bf4096f1dbd71c9dbd4defb47783f4ef9840 Mon Sep 17 00:00:00 2001
+From: Daniel Alvarez <dalvarez@redhat.com>
+Date: Thu, 25 Jul 2019 11:42:16 +0200
+Subject: [PATCH] [ovn_host] Add support for containerized setups
+
+Prior to this patch, ovn_host was disabled on containerized
+setups due to the fact that ovn-controller package is not
+installed in the host.
+
+This patch fixes it by checking if the ovn-controller process
+is running.
+
+Resolves: #1767
+
+Signed-off-by: Daniel Alvarez <dalvarez@redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/ovn_host.py | 21 ++++++++++++++-------
+ 1 file changed, 14 insertions(+), 7 deletions(-)
+
+diff --git a/sos/plugins/ovn_host.py b/sos/plugins/ovn_host.py
+index ba35d87e7..5225f010e 100644
+--- a/sos/plugins/ovn_host.py
++++ b/sos/plugins/ovn_host.py
+@@ -12,6 +12,15 @@
+ from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin
+ 
+ 
++pidfile = 'ovn-controller.pid'
++pid_paths = [
++        '/var/lib/openvswitch/ovn',
++        '/usr/local/var/run/openvswitch',
++        '/var/run/openvswitch',
++        '/run/openvswitch'
++]
++
++
+ class OVNHost(Plugin):
+     """ OVN Controller
+     """
+@@ -19,13 +28,6 @@ class OVNHost(Plugin):
+     profiles = ('network', 'virt')
+ 
+     def setup(self):
+-        pidfile = 'ovn-controller.pid'
+-        pid_paths = [
+-                '/var/lib/openvswitch/ovn',
+-                '/usr/local/var/run/openvswitch',
+-                '/var/run/openvswitch',
+-                '/run/openvswitch'
+-        ]
+         if os.environ.get('OVS_RUNDIR'):
+             pid_paths.append(os.environ.get('OVS_RUNDIR'))
+         self.add_copy_spec([os.path.join(pp, pidfile) for pp in pid_paths])
+@@ -40,6 +42,11 @@ def setup(self):
+ 
+         self.add_journal(units="ovn-controller")
+ 
++    def check_enabled(self):
++        return (any([os.path.isfile(
++            os.path.join(pp, pidfile)) for pp in pid_paths]) or
++            super(OVNHost, self).check_enabled())
++
+ 
+ class RedHatOVNHost(OVNHost, RedHatPlugin):
+ 
+From 6d623ceb2bc973a603c2abb1c8c64f2980667a0d Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Wed, 2 Oct 2019 12:19:19 +0200
+Subject: [PATCH] [ovn_central] dont add db outputs when no table is found in
+ schema
+
+When get_tables_from_schema method returns None (i.e. due to a
+parsing error or missing config file), add_database_output tries
+to iterate over None object, what raises an exception.
+
+Resolves: #1808
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+---
+ sos/plugins/ovn_central.py | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sos/plugins/ovn_central.py b/sos/plugins/ovn_central.py
+index a9fcdf33e..b5ff96f66 100644
+--- a/sos/plugins/ovn_central.py
++++ b/sos/plugins/ovn_central.py
+@@ -56,6 +56,8 @@ def get_tables_from_schema(self, filename, skip=[]):
+             self._log_error("DB schema %s has no 'tables' key" % filename)
+ 
+     def add_database_output(self, tables, cmds, ovn_cmd):
++        if not tables:
++            return
+         for table in tables:
+             cmds.append('%s list %s' % (ovn_cmd, table))
+ 
+From 0c9a1f0cb98c5256a0ec1dec83b7c94d3bb39170 Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Wed, 4 Dec 2019 15:53:16 +0100
+Subject: [PATCH] [ovn_central] call podman exec without a timeout
+
+This is a workaround fix of a podman bug (see rhbz1732525) where
+"podman ps" can hang when "podman exec .." is invoked in detached
+mode under "timeout".
+
+Calling it without timeout works fine.
+
+This commit can be reverted once the podman bug is fixed.
+
+Resolves: #1875
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+---
+ sos/plugins/ovn_central.py | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/sos/plugins/ovn_central.py b/sos/plugins/ovn_central.py
+index c74bf403..32a5e1cb 100644
+--- a/sos/plugins/ovn_central.py
++++ b/sos/plugins/ovn_central.py
+@@ -26,7 +26,8 @@ class OVNCentral(Plugin):
+         if self._container_name:
+             cmd = "%s exec %s cat %s" % (
+                 self._container_runtime, self._container_name, filename)
+-            res = self.get_command_output(cmd)
++            # the timeout=None is just a workaround for "podman ps" hung bug
++            res = self.get_command_output(cmd, timeout=None)
+             if res['status'] != 0:
+                 self._log_error("Could not retrieve DB schema file from "
+                                 "container %s" % self._container_name)
+@@ -118,7 +119,8 @@ class OVNCentral(Plugin):
+                                        self._container_name,
+                                        cmd) for cmd in cmds]
+ 
+-        self.add_cmd_output(cmds)
++        # the timeout=None is just a workaround for "podman ps" hung bug
++        self.add_cmd_output(cmds, timeout=None)
+ 
+         self.add_copy_spec("/etc/sysconfig/ovn-northd")
+ 
+-- 
+2.21.0
+
diff --git a/SOURCES/sos-bz1745017-openvswitch-enable-by-openvswitch2.patch b/SOURCES/sos-bz1745017-openvswitch-enable-by-openvswitch2.patch
deleted file mode 100644
index 8a22aaf..0000000
--- a/SOURCES/sos-bz1745017-openvswitch-enable-by-openvswitch2.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From 255c0b08321e9d81f69798d3df16c7548bd3c0db Mon Sep 17 00:00:00 2001
-From: David Marchand <david.marchand@redhat.com>
-Date: Fri, 23 Aug 2019 14:14:11 +0200
-Subject: [PATCH] [openvswitch] catch all openvswitch2.* packages
-
-Since the release of openvswitch 2.10, the Red Hat Fast Datapath channel
-maintains multiple versions of openvswitch.
-
-Update the list of packages using a wildcard to catch all openvswitch2.*
-packages.
-
-Resolves: #1768
-
-Signed-off-by: David Marchand <david.marchand@redhat.com>
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/plugins/openvswitch.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/sos/plugins/openvswitch.py b/sos/plugins/openvswitch.py
-index 968efe09d..6fc0a7945 100644
---- a/sos/plugins/openvswitch.py
-+++ b/sos/plugins/openvswitch.py
-@@ -158,7 +158,7 @@ def setup(self):
- 
- class RedHatOpenVSwitch(OpenVSwitch, RedHatPlugin):
- 
--    packages = ('openvswitch', 'openvswitch-dpdk')
-+    packages = ('openvswitch', 'openvswitch2.*', 'openvswitch-dpdk')
- 
- 
- class DebianOpenVSwitch(OpenVSwitch, DebianPlugin, UbuntuPlugin):
diff --git a/SOURCES/sos-bz1751171-vdsm-bin-sh.patch b/SOURCES/sos-bz1751171-vdsm-bin-sh.patch
deleted file mode 100644
index c0949fa..0000000
--- a/SOURCES/sos-bz1751171-vdsm-bin-sh.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 0c83c8245ffab2ff3f568078651553f59ef475bb Mon Sep 17 00:00:00 2001
-From: Martin Perina <mperina@redhat.com>
-Date: Wed, 21 Aug 2019 11:17:44 +0200
-Subject: [PATCH] [vdsm]: Fix executing shell commands
-
-During review process of [1] it was suggested to replace '/bin/sh' with
-just 'sh', but unfortunately this change caused an error to not include
-information about VDSM mount points as described in [2]. This fix
-restores previous state and add full path to shell executions.
-
-[1] https://github.com/sosreport/sos/pull/1205
-[2] https://bugzilla.redhat.com/1743304
-
-Resolves: #1761
-
-Signed-off-by: Martin Perina <mperina@redhat.com>
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/plugins/vdsm.py | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/sos/plugins/vdsm.py b/sos/plugins/vdsm.py
-index 35eec5093..c4e2af5f6 100644
---- a/sos/plugins/vdsm.py
-+++ b/sos/plugins/vdsm.py
-@@ -93,8 +93,8 @@ def setup(self):
-             ])
-         self.add_cmd_output([
-             "ls -ldZ /etc/vdsm",
--            "su vdsm -s sh -c 'tree -l /rhev/data-center'",
--            "su vdsm -s sh -c 'ls -lR /rhev/data-center'"
-+            "su vdsm -s /bin/sh -c 'tree -l /rhev/data-center'",
-+            "su vdsm -s /bin/sh -c 'ls -lR /rhev/data-center'"
-         ])
-         self.add_cmd_output([
-             "lvm vgs -v -o +tags --config \'%s\'" % LVM_CONFIG,
diff --git a/SOURCES/sos-bz1756094-kernel-no-trace-by-default.patch b/SOURCES/sos-bz1756094-kernel-no-trace-by-default.patch
deleted file mode 100644
index 5aec064..0000000
--- a/SOURCES/sos-bz1756094-kernel-no-trace-by-default.patch
+++ /dev/null
@@ -1,79 +0,0 @@
-From 55949fb88c492eec542c69157a8763ddb3555345 Mon Sep 17 00:00:00 2001
-From: MIZUTA Takeshi <mizuta.takeshi@fujitsu.com>
-Date: Thu, 6 Jun 2019 18:42:40 +0900
-Subject: [PATCH] [plugins] Change forbidden_path from partial-match to
- exact-match
-
-forbidden_path is evaluated on partial-match.
-However, it will be correct to evaluate on exact-match.
-
-Closes: #1692
-Resolves: #1695
-
-Signed-off-by: MIZUTA Takeshi <mizuta.takeshi@fujitsu.com>
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/__init__.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
-index 56af847a..41f4f58c 100644
---- a/sos/plugins/__init__.py
-+++ b/sos/plugins/__init__.py
-@@ -64,7 +64,7 @@ def _mangle_command(command, name_max):
- 
- 
- def _path_in_path_list(path, path_list):
--    return any(p in path for p in path_list)
-+    return any(p == path for p in path_list)
- 
- 
- def _node_type(st):
--- 
-2.21.0
-
-From d2d5b9da6d4af7ead8a47468db0bbfcc8fb2b5bf Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Thu, 26 Sep 2019 10:50:18 +0200
-Subject: [PATCH] [kernel] Don't collect trace file by default
-
-Updates the plugin to don't collect trace file by default. Collecting
-trace file may take a lot of time, so trace file is not collected
-by default, and use the new plug-in option when collecting.
-
-Original author: MIZUTA Takeshi <mizuta.takeshi@fujitsu.com>
-
-Closes: #1688
-Resolves: #1800
-
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/kernel.py | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
-diff --git a/sos/plugins/kernel.py b/sos/plugins/kernel.py
-index bf3c3dea..b498f55e 100644
---- a/sos/plugins/kernel.py
-+++ b/sos/plugins/kernel.py
-@@ -23,7 +23,8 @@ class Kernel(Plugin, RedHatPlugin, Debia
-     sys_module = '/sys/module'
- 
-     option_list = [
--        ("with-timer", "gather /proc/timer* statistics", "slow", False)
-+        ("with-timer", "gather /proc/timer* statistics", "slow", False),
-+        ("trace", "gather /sys/kernel/debug/tracing/trace file", "slow", False)
-     ]
- 
-     def get_bpftool_prog_ids(self, prog_file):
-@@ -138,6 +139,9 @@ class Kernel(Plugin, RedHatPlugin, Debia
-             # and may also cause softlockups
-             self.add_copy_spec("/proc/timer*")
- 
-+        if not self.get_option("trace"):
-+            self.add_forbidden_path("/sys/kernel/debug/tracing/trace")
-+
-         # collect list of eBPF programs and maps and their dumps
-         prog_file = self.get_cmd_output_now("bpftool -j prog list")
-         for prog_id in self.get_bpftool_prog_ids(prog_file):
-2.21.0
diff --git a/SOURCES/sos-bz1766915-interim-sysroot-forbidden-paths.patch b/SOURCES/sos-bz1766915-interim-sysroot-forbidden-paths.patch
new file mode 100644
index 0000000..5a0fd80
--- /dev/null
+++ b/SOURCES/sos-bz1766915-interim-sysroot-forbidden-paths.patch
@@ -0,0 +1,354 @@
+From 9a0ab16793a8388b2c3d3909fd3a087c5b6296d4 Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Fri, 1 Nov 2019 12:13:23 -0400
+Subject: [PATCH 01/10] [Plugin] remove invalid {strip/join}_sysroot()
+
+Do not strip the sysroot path prefix when calling _do_copy_path()
+for a symlink target and do not add the sysroot prefix when
+testing for a forbidden path.
+
+Related: #1842
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/__init__.py | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index e75ec82e..4f1b73ce 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -731,7 +731,7 @@ class Plugin(object):
+ 
+         # skip recursive copying of symlink pointing to itself.
+         if (absdest != srcpath):
+-            self._do_copy_path(self.strip_sysroot(absdest))
++            self._do_copy_path(absdest)
+         else:
+             self._log_debug("link '%s' points to itself, skipping target..."
+                             % linkdest)
+@@ -758,8 +758,6 @@ class Plugin(object):
+         return None
+ 
+     def _is_forbidden_path(self, path):
+-        if self.use_sysroot():
+-            path = self.join_sysroot(path)
+         return _path_in_path_list(path, self.forbidden_paths)
+ 
+     def _copy_node(self, path, st):
+-- 
+2.21.0
+
+
+From aeeebf126fc9fdb0fd8c3b01418bef742bce78c3 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Fri, 1 Nov 2019 12:22:51 -0400
+Subject: [PATCH 02/10] [Plugin] fix destination paths in _do_copy_path()
+
+The path used to copy special device nodes and directories in
+_do_copy_path() should be the destination path in the archive
+(without sysroot prefix), and not the source path in the host
+file system that includes this prefix.
+
+Related: #1842
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/__init__.py | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 4f1b73ce..60fbeaf7 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -651,9 +651,13 @@ class Plugin(object):
+             self._copy_symlink(srcpath)
+             return
+         else:
+-            if stat.S_ISDIR(st.st_mode) and os.access(srcpath, os.R_OK):
+-                self._copy_dir(srcpath)
+-                return
++             if stat.S_ISDIR(st.st_mode) and os.access(srcpath, os.R_OK):
++                 # copy empty directory
++                 if not os.listdir(srcpath):
++                     self.archive.add_dir(dest)
++                     return
++                 self._copy_dir(dest)
++                 return
+ 
+         # handle special nodes (block, char, fifo, socket)
+         if not (stat.S_ISREG(st.st_mode) or stat.S_ISDIR(st.st_mode)):
+@@ -808,7 +808,7 @@ class Plugin(object):
+             ntype = _node_type(st)
+             self._log_debug("creating %s node at archive:'%s'"
+                             % (ntype, dest))
+-            self._copy_node(srcpath, st)
++            self._copy_node(dest, st)
+             return
+ 
+         # if we get here, it's definitely a regular file (not a symlink or dir)
+-- 
+2.21.0
+
+
+From 05f3d5bda8f548459fabcd38f2d087d6ecef98a2 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Fri, 1 Nov 2019 12:25:09 -0400
+Subject: [PATCH 03/10] [kernel] remove trailing directory globs in forbidden
+ paths
+
+Since the forbidden path test now uses an exact match the trailing
+globs ("/some/directory/path/to/exclude/*") used to exclude trace
+related directories from collection lead to a failure to properly
+blacklist these files:
+
+The glob is expanded, for e.g.:
+
+  "/sys/kernel/debug/tracing/per_cpu/*"
+
+Expands to unclude a 'cpuN' sub-directory for each CPU present on
+the machine. These expanded paths are then added to the forbidden
+paths list for the plugin:
+
+  /sys/kernel/debug/tracing/per_cpu/cpu0
+  /sys/kernel/debug/tracing/per_cpu/cpu1
+  ...
+
+When an attempt is made to collect the entire "per_cpu" directory
+a check is made for the full "/sys/kernel/debug/tracing/per_cpu"
+path against each entry in the forbidden paths list. Since this is
+a prefix of the actual paths stored no match is returned and the
+collection is permitted.
+
+Remove the trailing globs from these directory paths and prevent
+any collection of the directories they reference by the plugin.
+
+Related: #1842
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/kernel.py | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/sos/plugins/kernel.py b/sos/plugins/kernel.py
+index 88b14689..5c852143 100644
+--- a/sos/plugins/kernel.py
++++ b/sos/plugins/kernel.py
+@@ -89,9 +89,9 @@ class Kernel(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+         self.add_forbidden_path([
+             '/sys/kernel/debug/tracing/trace_pipe',
+             '/sys/kernel/debug/tracing/README',
+-            '/sys/kernel/debug/tracing/trace_stat/*',
+-            '/sys/kernel/debug/tracing/per_cpu/*',
+-            '/sys/kernel/debug/tracing/events/*',
++            '/sys/kernel/debug/tracing/trace_stat',
++            '/sys/kernel/debug/tracing/per_cpu',
++            '/sys/kernel/debug/tracing/events',
+             '/sys/kernel/debug/tracing/free_buffer',
+             '/sys/kernel/debug/tracing/trace_marker',
+             '/sys/kernel/debug/tracing/trace_marker_raw',
+-- 
+2.21.0
+
+
+From 801c71b33dcfeaa980baa9f377b721bdd26aa5e8 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Fri, 1 Nov 2019 16:53:29 +0000
+Subject: [PATCH 04/10] [tests] fix test_copy_dir_forbidden_path
+
+Rather than call just Plugin.setup() and Plugin._do_copy_path(),
+add an add_copy_spec() call to the mock plugin setup() method,
+and invoke copying by calling the Plugin.collect() method.
+
+Related: #1845
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ tests/plugin_tests.py | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/tests/plugin_tests.py b/tests/plugin_tests.py
+index b8760429..6522fe14 100644
+--- a/tests/plugin_tests.py
++++ b/tests/plugin_tests.py
+@@ -81,6 +81,7 @@ class ForbiddenMockPlugin(Plugin):
+     plugin_name = "forbidden"
+ 
+     def setup(self):
++        self.add_copy_spec("tests")
+         self.add_forbidden_path("tests")
+ 
+ 
+@@ -235,7 +236,7 @@ class PluginTests(unittest.TestCase):
+         })
+         p.archive = MockArchive()
+         p.setup()
+-        p._do_copy_path("tests")
++        p.collect()
+         self.assertEquals(p.archive.m, {})
+ 
+ 
+-- 
+2.21.0
+
+
+From c4182ebd52af523261d2e7ef75affbb88eaf31fb Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 4 Nov 2019 10:45:15 +0000
+Subject: [PATCH 05/10] [Plugin] use correct source path when copying
+ directories
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/__init__.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 60fbeaf7..240fe9f1 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -656,7 +656,7 @@ class Plugin(object):
+                  if not os.listdir(srcpath):
+                      self.archive.add_dir(dest)
+                      return
+-                 self._copy_dir(dest)
++                 self._copy_dir(srcpath)
+                  return
+ 
+         # handle special nodes (block, char, fifo, socket)
+-- 
+2.21.0
+
+
+From 68f4d7cc7adde00171af842b5bc808f41d888a87 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 4 Nov 2019 10:48:01 +0000
+Subject: [PATCH 06/10] [Plugin] improve _copy_dir() variable naming
+
+Directory entries found in _copy_dir() may be either files or
+sub-directories: reflect this in the names of local variables.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/__init__.py | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index 240fe9f1..1a1464c1 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -738,10 +738,11 @@ class Plugin(object):
+ 
+     def _copy_dir(self, srcpath):
+         try:
+-            for afile in os.listdir(srcpath):
++            for name in os.listdir(srcpath):
+                 self._log_debug("recursively adding '%s' from '%s'"
+-                                % (afile, srcpath))
+-                self._do_copy_path(os.path.join(srcpath, afile), dest=None)
++                                % (name, srcpath))
++                path = os.path.join(srcpath, name)
++                self._do_copy_path(path)
+         except OSError as e:
+             if e.errno == errno.ELOOP:
+                 msg = "Too many levels of symbolic links copying"
+-- 
+2.21.0
+
+
+From ad3adef07c32aee5bdd438706c6c1d4590ff8297 Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 4 Nov 2019 14:13:00 +0000
+Subject: [PATCH 07/10] [ceph] fix directory blacklist style
+
+Plugins must use 'path/to/exclude' rather than 'path/to/exclude/*'
+in order to omit a directory and all its content from the report.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/ceph.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/sos/plugins/ceph.py b/sos/plugins/ceph.py
+index 6e340c69..43284bc8 100644
+--- a/sos/plugins/ceph.py
++++ b/sos/plugins/ceph.py
+@@ -103,8 +103,8 @@ class Ceph(Plugin, RedHatPlugin, UbuntuPlugin):
+             "/var/lib/ceph/*keyring*",
+             "/var/lib/ceph/*/*keyring*",
+             "/var/lib/ceph/*/*/*keyring*",
+-            "/var/lib/ceph/osd/*",
+-            "/var/lib/ceph/mon/*",
++            "/var/lib/ceph/osd",
++            "/var/lib/ceph/mon",
+             # Excludes temporary ceph-osd mount location like
+             # /var/lib/ceph/tmp/mnt.XXXX from sos collection.
+             "/var/lib/ceph/tmp/*mnt*",
+-- 
+2.21.0
+
+
+From 4d1576b04d35902ce44d26d6a5b2219e6f9c175a Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 4 Nov 2019 14:15:55 +0000
+Subject: [PATCH 09/10] [openstack_octavia] fix directory blacklist style
+
+Plugins must use 'path/to/exclude' rather than 'path/to/exclude/*'
+in order to omit a directory and all its content from the report.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/openstack_octavia.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/openstack_octavia.py b/sos/plugins/openstack_octavia.py
+index b97c83fa..ccdcd4c9 100644
+--- a/sos/plugins/openstack_octavia.py
++++ b/sos/plugins/openstack_octavia.py
+@@ -30,7 +30,7 @@ class OpenStackOctavia(Plugin):
+         ])
+ 
+         # don't collect certificates
+-        self.add_forbidden_path("/etc/octavia/certs/")
++        self.add_forbidden_path("/etc/octavia/certs")
+ 
+         # logs
+         if self.get_option("all_logs"):
+-- 
+2.21.0
+
+
+From 1fd194191a56c51052f0c24ddeb3bbf9088ae0ca Mon Sep 17 00:00:00 2001
+From: "Bryn M. Reeves" <bmr@redhat.com>
+Date: Mon, 4 Nov 2019 14:16:13 +0000
+Subject: [PATCH 10/10] [vdsm] fix directory blacklist style
+
+Plugins must use 'path/to/exclude' rather than 'path/to/exclude/*'
+in order to omit a directory and all its content from the report.
+
+Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
+---
+ sos/plugins/vdsm.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/sos/plugins/vdsm.py b/sos/plugins/vdsm.py
+index b2a1ca58..69672643 100644
+--- a/sos/plugins/vdsm.py
++++ b/sos/plugins/vdsm.py
+@@ -60,9 +60,9 @@ class Vdsm(Plugin, RedHatPlugin):
+     plugin_name = 'vdsm'
+ 
+     def setup(self):
+-        self.add_forbidden_path('/etc/pki/vdsm/keys/*')
++        self.add_forbidden_path('/etc/pki/vdsm/keys')
+         self.add_forbidden_path('/etc/pki/vdsm/libvirt-spice/*-key.*')
+-        self.add_forbidden_path('/etc/pki/libvirt/private/*')
++        self.add_forbidden_path('/etc/pki/libvirt/private')
+ 
+         self.add_cmd_output('service vdsmd status')
+         self.add_cmd_output('service supervdsmd status')
+
+-- 
+2.21.0
+
diff --git a/SOURCES/sos-bz1767356-interim-sysroot-forbidden-paths.patch b/SOURCES/sos-bz1767356-interim-sysroot-forbidden-paths.patch
deleted file mode 100644
index 5a0fd80..0000000
--- a/SOURCES/sos-bz1767356-interim-sysroot-forbidden-paths.patch
+++ /dev/null
@@ -1,354 +0,0 @@
-From 9a0ab16793a8388b2c3d3909fd3a087c5b6296d4 Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Fri, 1 Nov 2019 12:13:23 -0400
-Subject: [PATCH 01/10] [Plugin] remove invalid {strip/join}_sysroot()
-
-Do not strip the sysroot path prefix when calling _do_copy_path()
-for a symlink target and do not add the sysroot prefix when
-testing for a forbidden path.
-
-Related: #1842
-
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/__init__.py | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
-
-diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
-index e75ec82e..4f1b73ce 100644
---- a/sos/plugins/__init__.py
-+++ b/sos/plugins/__init__.py
-@@ -731,7 +731,7 @@ class Plugin(object):
- 
-         # skip recursive copying of symlink pointing to itself.
-         if (absdest != srcpath):
--            self._do_copy_path(self.strip_sysroot(absdest))
-+            self._do_copy_path(absdest)
-         else:
-             self._log_debug("link '%s' points to itself, skipping target..."
-                             % linkdest)
-@@ -758,8 +758,6 @@ class Plugin(object):
-         return None
- 
-     def _is_forbidden_path(self, path):
--        if self.use_sysroot():
--            path = self.join_sysroot(path)
-         return _path_in_path_list(path, self.forbidden_paths)
- 
-     def _copy_node(self, path, st):
--- 
-2.21.0
-
-
-From aeeebf126fc9fdb0fd8c3b01418bef742bce78c3 Mon Sep 17 00:00:00 2001
-From: "Bryn M. Reeves" <bmr@redhat.com>
-Date: Fri, 1 Nov 2019 12:22:51 -0400
-Subject: [PATCH 02/10] [Plugin] fix destination paths in _do_copy_path()
-
-The path used to copy special device nodes and directories in
-_do_copy_path() should be the destination path in the archive
-(without sysroot prefix), and not the source path in the host
-file system that includes this prefix.
-
-Related: #1842
-
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/__init__.py | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
-index 4f1b73ce..60fbeaf7 100644
---- a/sos/plugins/__init__.py
-+++ b/sos/plugins/__init__.py
-@@ -651,9 +651,13 @@ class Plugin(object):
-             self._copy_symlink(srcpath)
-             return
-         else:
--            if stat.S_ISDIR(st.st_mode) and os.access(srcpath, os.R_OK):
--                self._copy_dir(srcpath)
--                return
-+             if stat.S_ISDIR(st.st_mode) and os.access(srcpath, os.R_OK):
-+                 # copy empty directory
-+                 if not os.listdir(srcpath):
-+                     self.archive.add_dir(dest)
-+                     return
-+                 self._copy_dir(dest)
-+                 return
- 
-         # handle special nodes (block, char, fifo, socket)
-         if not (stat.S_ISREG(st.st_mode) or stat.S_ISDIR(st.st_mode)):
-@@ -808,7 +808,7 @@ class Plugin(object):
-             ntype = _node_type(st)
-             self._log_debug("creating %s node at archive:'%s'"
-                             % (ntype, dest))
--            self._copy_node(srcpath, st)
-+            self._copy_node(dest, st)
-             return
- 
-         # if we get here, it's definitely a regular file (not a symlink or dir)
--- 
-2.21.0
-
-
-From 05f3d5bda8f548459fabcd38f2d087d6ecef98a2 Mon Sep 17 00:00:00 2001
-From: "Bryn M. Reeves" <bmr@redhat.com>
-Date: Fri, 1 Nov 2019 12:25:09 -0400
-Subject: [PATCH 03/10] [kernel] remove trailing directory globs in forbidden
- paths
-
-Since the forbidden path test now uses an exact match the trailing
-globs ("/some/directory/path/to/exclude/*") used to exclude trace
-related directories from collection lead to a failure to properly
-blacklist these files:
-
-The glob is expanded, for e.g.:
-
-  "/sys/kernel/debug/tracing/per_cpu/*"
-
-Expands to unclude a 'cpuN' sub-directory for each CPU present on
-the machine. These expanded paths are then added to the forbidden
-paths list for the plugin:
-
-  /sys/kernel/debug/tracing/per_cpu/cpu0
-  /sys/kernel/debug/tracing/per_cpu/cpu1
-  ...
-
-When an attempt is made to collect the entire "per_cpu" directory
-a check is made for the full "/sys/kernel/debug/tracing/per_cpu"
-path against each entry in the forbidden paths list. Since this is
-a prefix of the actual paths stored no match is returned and the
-collection is permitted.
-
-Remove the trailing globs from these directory paths and prevent
-any collection of the directories they reference by the plugin.
-
-Related: #1842
-
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/kernel.py | 6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/sos/plugins/kernel.py b/sos/plugins/kernel.py
-index 88b14689..5c852143 100644
---- a/sos/plugins/kernel.py
-+++ b/sos/plugins/kernel.py
-@@ -89,9 +89,9 @@ class Kernel(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
-         self.add_forbidden_path([
-             '/sys/kernel/debug/tracing/trace_pipe',
-             '/sys/kernel/debug/tracing/README',
--            '/sys/kernel/debug/tracing/trace_stat/*',
--            '/sys/kernel/debug/tracing/per_cpu/*',
--            '/sys/kernel/debug/tracing/events/*',
-+            '/sys/kernel/debug/tracing/trace_stat',
-+            '/sys/kernel/debug/tracing/per_cpu',
-+            '/sys/kernel/debug/tracing/events',
-             '/sys/kernel/debug/tracing/free_buffer',
-             '/sys/kernel/debug/tracing/trace_marker',
-             '/sys/kernel/debug/tracing/trace_marker_raw',
--- 
-2.21.0
-
-
-From 801c71b33dcfeaa980baa9f377b721bdd26aa5e8 Mon Sep 17 00:00:00 2001
-From: "Bryn M. Reeves" <bmr@redhat.com>
-Date: Fri, 1 Nov 2019 16:53:29 +0000
-Subject: [PATCH 04/10] [tests] fix test_copy_dir_forbidden_path
-
-Rather than call just Plugin.setup() and Plugin._do_copy_path(),
-add an add_copy_spec() call to the mock plugin setup() method,
-and invoke copying by calling the Plugin.collect() method.
-
-Related: #1845
-
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- tests/plugin_tests.py | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/tests/plugin_tests.py b/tests/plugin_tests.py
-index b8760429..6522fe14 100644
---- a/tests/plugin_tests.py
-+++ b/tests/plugin_tests.py
-@@ -81,6 +81,7 @@ class ForbiddenMockPlugin(Plugin):
-     plugin_name = "forbidden"
- 
-     def setup(self):
-+        self.add_copy_spec("tests")
-         self.add_forbidden_path("tests")
- 
- 
-@@ -235,7 +236,7 @@ class PluginTests(unittest.TestCase):
-         })
-         p.archive = MockArchive()
-         p.setup()
--        p._do_copy_path("tests")
-+        p.collect()
-         self.assertEquals(p.archive.m, {})
- 
- 
--- 
-2.21.0
-
-
-From c4182ebd52af523261d2e7ef75affbb88eaf31fb Mon Sep 17 00:00:00 2001
-From: "Bryn M. Reeves" <bmr@redhat.com>
-Date: Mon, 4 Nov 2019 10:45:15 +0000
-Subject: [PATCH 05/10] [Plugin] use correct source path when copying
- directories
-
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/__init__.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
-index 60fbeaf7..240fe9f1 100644
---- a/sos/plugins/__init__.py
-+++ b/sos/plugins/__init__.py
-@@ -656,7 +656,7 @@ class Plugin(object):
-                  if not os.listdir(srcpath):
-                      self.archive.add_dir(dest)
-                      return
--                 self._copy_dir(dest)
-+                 self._copy_dir(srcpath)
-                  return
- 
-         # handle special nodes (block, char, fifo, socket)
--- 
-2.21.0
-
-
-From 68f4d7cc7adde00171af842b5bc808f41d888a87 Mon Sep 17 00:00:00 2001
-From: "Bryn M. Reeves" <bmr@redhat.com>
-Date: Mon, 4 Nov 2019 10:48:01 +0000
-Subject: [PATCH 06/10] [Plugin] improve _copy_dir() variable naming
-
-Directory entries found in _copy_dir() may be either files or
-sub-directories: reflect this in the names of local variables.
-
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/__init__.py | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
-
-diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
-index 240fe9f1..1a1464c1 100644
---- a/sos/plugins/__init__.py
-+++ b/sos/plugins/__init__.py
-@@ -738,10 +738,11 @@ class Plugin(object):
- 
-     def _copy_dir(self, srcpath):
-         try:
--            for afile in os.listdir(srcpath):
-+            for name in os.listdir(srcpath):
-                 self._log_debug("recursively adding '%s' from '%s'"
--                                % (afile, srcpath))
--                self._do_copy_path(os.path.join(srcpath, afile), dest=None)
-+                                % (name, srcpath))
-+                path = os.path.join(srcpath, name)
-+                self._do_copy_path(path)
-         except OSError as e:
-             if e.errno == errno.ELOOP:
-                 msg = "Too many levels of symbolic links copying"
--- 
-2.21.0
-
-
-From ad3adef07c32aee5bdd438706c6c1d4590ff8297 Mon Sep 17 00:00:00 2001
-From: "Bryn M. Reeves" <bmr@redhat.com>
-Date: Mon, 4 Nov 2019 14:13:00 +0000
-Subject: [PATCH 07/10] [ceph] fix directory blacklist style
-
-Plugins must use 'path/to/exclude' rather than 'path/to/exclude/*'
-in order to omit a directory and all its content from the report.
-
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/ceph.py | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/sos/plugins/ceph.py b/sos/plugins/ceph.py
-index 6e340c69..43284bc8 100644
---- a/sos/plugins/ceph.py
-+++ b/sos/plugins/ceph.py
-@@ -103,8 +103,8 @@ class Ceph(Plugin, RedHatPlugin, UbuntuPlugin):
-             "/var/lib/ceph/*keyring*",
-             "/var/lib/ceph/*/*keyring*",
-             "/var/lib/ceph/*/*/*keyring*",
--            "/var/lib/ceph/osd/*",
--            "/var/lib/ceph/mon/*",
-+            "/var/lib/ceph/osd",
-+            "/var/lib/ceph/mon",
-             # Excludes temporary ceph-osd mount location like
-             # /var/lib/ceph/tmp/mnt.XXXX from sos collection.
-             "/var/lib/ceph/tmp/*mnt*",
--- 
-2.21.0
-
-
-From 4d1576b04d35902ce44d26d6a5b2219e6f9c175a Mon Sep 17 00:00:00 2001
-From: "Bryn M. Reeves" <bmr@redhat.com>
-Date: Mon, 4 Nov 2019 14:15:55 +0000
-Subject: [PATCH 09/10] [openstack_octavia] fix directory blacklist style
-
-Plugins must use 'path/to/exclude' rather than 'path/to/exclude/*'
-in order to omit a directory and all its content from the report.
-
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/openstack_octavia.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/sos/plugins/openstack_octavia.py b/sos/plugins/openstack_octavia.py
-index b97c83fa..ccdcd4c9 100644
---- a/sos/plugins/openstack_octavia.py
-+++ b/sos/plugins/openstack_octavia.py
-@@ -30,7 +30,7 @@ class OpenStackOctavia(Plugin):
-         ])
- 
-         # don't collect certificates
--        self.add_forbidden_path("/etc/octavia/certs/")
-+        self.add_forbidden_path("/etc/octavia/certs")
- 
-         # logs
-         if self.get_option("all_logs"):
--- 
-2.21.0
-
-
-From 1fd194191a56c51052f0c24ddeb3bbf9088ae0ca Mon Sep 17 00:00:00 2001
-From: "Bryn M. Reeves" <bmr@redhat.com>
-Date: Mon, 4 Nov 2019 14:16:13 +0000
-Subject: [PATCH 10/10] [vdsm] fix directory blacklist style
-
-Plugins must use 'path/to/exclude' rather than 'path/to/exclude/*'
-in order to omit a directory and all its content from the report.
-
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/vdsm.py | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/sos/plugins/vdsm.py b/sos/plugins/vdsm.py
-index b2a1ca58..69672643 100644
---- a/sos/plugins/vdsm.py
-+++ b/sos/plugins/vdsm.py
-@@ -60,9 +60,9 @@ class Vdsm(Plugin, RedHatPlugin):
-     plugin_name = 'vdsm'
- 
-     def setup(self):
--        self.add_forbidden_path('/etc/pki/vdsm/keys/*')
-+        self.add_forbidden_path('/etc/pki/vdsm/keys')
-         self.add_forbidden_path('/etc/pki/vdsm/libvirt-spice/*-key.*')
--        self.add_forbidden_path('/etc/pki/libvirt/private/*')
-+        self.add_forbidden_path('/etc/pki/libvirt/private')
- 
-         self.add_cmd_output('service vdsmd status')
-         self.add_cmd_output('service supervdsmd status')
-
--- 
-2.21.0
-
diff --git a/SOURCES/sos-bz1767359-ovn-plugins-containerized-env.patch b/SOURCES/sos-bz1767359-ovn-plugins-containerized-env.patch
deleted file mode 100644
index 9a97377..0000000
--- a/SOURCES/sos-bz1767359-ovn-plugins-containerized-env.patch
+++ /dev/null
@@ -1,326 +0,0 @@
-From cc6374914a47eb3777c5b8306506df43522a31e0 Mon Sep 17 00:00:00 2001
-From: Daniel Alvarez <dalvarez@redhat.com>
-Date: Thu, 18 Jul 2019 14:08:27 +0200
-Subject: [PATCH] [ovn_central] add additional show commands
-
-This patch is adding 'show' commands for both OVN
-NorthBound and SouthBound databases.
-
-Signed-off-by: Daniel Alvarez <dalvarez@redhat.com>
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/ovn_central.py | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/sos/plugins/ovn_central.py b/sos/plugins/ovn_central.py
-index e05856872..2d2526253 100644
---- a/sos/plugins/ovn_central.py
-+++ b/sos/plugins/ovn_central.py
-@@ -57,6 +57,8 @@ def setup(self):
- 
-         # Some user-friendly versions of DB output
-         cmds = [
-+            'ovn-nbctl show',
-+            'ovn-sbctl show',
-             'ovn-sbctl lflow-list',
-             'ovn-nbctl get-ssl',
-             'ovn-nbctl get-connection',
-From 5fd4e850ad9a6636d0fb206954e8ab016584974d Mon Sep 17 00:00:00 2001
-From: Daniel Alvarez <dalvarez@redhat.com>
-Date: Wed, 11 Sep 2019 16:19:15 +0100
-Subject: [PATCH] [ovn_host] fix Open_vSwitch table name
-
-Signed-off-by: Daniel Alvarez <dalvarez@redhat.com>
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/ovn_host.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/sos/plugins/ovn_host.py b/sos/plugins/ovn_host.py
-index 542516279..ba35d87e7 100644
---- a/sos/plugins/ovn_host.py
-+++ b/sos/plugins/ovn_host.py
-@@ -35,7 +35,7 @@ def setup(self):
-         self.add_cmd_output([
-             'ovs-ofctl -O OpenFlow13 dump-flows br-int',
-             'ovs-vsctl list-br',
--            'ovs-vsctl list OpenVswitch',
-+            'ovs-vsctl list Open_vSwitch',
-         ])
- 
-         self.add_journal(units="ovn-controller")
-From 3c842046e9c4c5b371566347f51e5e242daf4f8d Mon Sep 17 00:00:00 2001
-From: Daniel Alvarez <dalvarez@redhat.com>
-Date: Tue, 23 Jul 2019 12:44:07 +0200
-Subject: [PATCH] [ovn_central] Add support to containerized setups
-
-This patch is adding support in ovn_central plugin to containerized
-setups.
-
-Now it's detecting if the OVN central services are running in
-container and execute the relevant commands inside it. The support
-covers both podman and docker runtimes.
-
-Signed-off-by: Daniel Alvarez <dalvarez@redhat.com>
----
- sos/plugins/ovn_central.py | 94 ++++++++++++++++++++++++++++----------
- 1 file changed, 69 insertions(+), 25 deletions(-)
-
-diff --git a/sos/plugins/ovn_central.py b/sos/plugins/ovn_central.py
-index 2d2526253..a9fcdf33e 100644
---- a/sos/plugins/ovn_central.py
-+++ b/sos/plugins/ovn_central.py
-@@ -19,30 +19,64 @@ class OVNCentral(Plugin):
-     """
-     plugin_name = "ovn_central"
-     profiles = ('network', 'virt')
--
--    def add_database_output(self, filename, cmds, ovn_cmd, skip=[]):
-+    _container_runtime = None
-+    _container_name = None
-+
-+    def get_tables_from_schema(self, filename, skip=[]):
-+        if self._container_name:
-+            cmd = "%s exec %s cat %s" % (
-+                self._container_runtime, self._container_name, filename)
-+            res = self.get_command_output(cmd)
-+            if res['status'] != 0:
-+                self._log_error("Could not retrieve DB schema file from "
-+                                "container %s" % self._container_name)
-+                return
-+            try:
-+                db = json.loads(res['output'])
-+            except Exception:
-+                self._log_error("Cannot parse JSON file %s" % filename)
-+                return
-+        else:
-+            try:
-+                with open(filename, 'r') as f:
-+                    try:
-+                        db = json.load(f)
-+                    except Exception:
-+                        self._log_error(
-+                            "Cannot parse JSON file %s" % filename)
-+                        return
-+            except IOError as ex:
-+                self._log_error(
-+                    "Could not open DB schema file %s: %s" % (filename, ex))
-+                return
-         try:
--            with open(filename, 'r') as f:
--                try:
--                    db = json.load(f)
--                except Exception:
--                    # If json can't be parsed, then exit early
--                    self._log_error("Cannot parse JSON file %s" % filename)
--                    return
--                try:
--                    for table in six.iterkeys(db['tables']):
--                        if table not in skip:
--                            cmds.append('%s list %s' % (ovn_cmd, table))
--                except AttributeError:
--                    self._log_error("DB schema %s has no 'tables' key" %
--                                    filename)
--                    return
--        except IOError as ex:
--            self._log_error("Could not open DB schema file %s: %s" % (filename,
--                                                                      ex))
--            return
-+            return [table for table in six.iterkeys(
-+                db['tables']) if table not in skip]
-+        except AttributeError:
-+            self._log_error("DB schema %s has no 'tables' key" % filename)
-+
-+    def add_database_output(self, tables, cmds, ovn_cmd):
-+        for table in tables:
-+            cmds.append('%s list %s' % (ovn_cmd, table))
-+
-+    def running_in_container(self):
-+        for runtime in ["podman", "docker"]:
-+            container_status = self.get_command_output(runtime + " ps")
-+            if container_status['status'] == 0:
-+                for line in container_status['output'].splitlines():
-+                    if "ovn-dbs-bundle" in line:
-+                        self._container_name = line.split()[-1]
-+                        self._container_runtime = runtime
-+                        return True
-+        return False
-+
-+    def check_enabled(self):
-+        return (self.running_in_container() or
-+                super(OVNCentral, self).check_enabled())
- 
-     def setup(self):
-+        containerized = self.running_in_container()
-+
-         ovs_rundir = os.environ.get('OVS_RUNDIR')
-         for pidfile in ['ovnnb_db.pid', 'ovnsb_db.pid', 'ovn-northd.pid']:
-             self.add_copy_spec([
-@@ -68,10 +102,20 @@ def setup(self):
- 
-         schema_dir = '/usr/share/openvswitch'
- 
--        self.add_database_output(os.path.join(schema_dir, 'ovn-nb.ovsschema'),
--                                 cmds, 'ovn-nbctl')
--        self.add_database_output(os.path.join(schema_dir, 'ovn-sb.ovsschema'),
--                                 cmds, 'ovn-sbctl', ['Logical_Flow'])
-+        nb_tables = self.get_tables_from_schema(os.path.join(
-+            schema_dir, 'ovn-nb.ovsschema'))
-+        sb_tables = self.get_tables_from_schema(os.path.join(
-+            schema_dir, 'ovn-sb.ovsschema'), ['Logical_Flow'])
-+
-+        self.add_database_output(nb_tables, cmds, 'ovn-nbctl')
-+        self.add_database_output(sb_tables, cmds, 'ovn-sbctl')
-+
-+        # If OVN is containerized, we need to run the above commands inside
-+        # the container.
-+        if containerized:
-+            cmds = ['%s exec %s %s' % (self._container_runtime,
-+                                       self._container_name,
-+                                       cmd) for cmd in cmds]
- 
-         self.add_cmd_output(cmds)
- 
-From a895bf4096f1dbd71c9dbd4defb47783f4ef9840 Mon Sep 17 00:00:00 2001
-From: Daniel Alvarez <dalvarez@redhat.com>
-Date: Thu, 25 Jul 2019 11:42:16 +0200
-Subject: [PATCH] [ovn_host] Add support for containerized setups
-
-Prior to this patch, ovn_host was disabled on containerized
-setups due to the fact that ovn-controller package is not
-installed in the host.
-
-This patch fixes it by checking if the ovn-controller process
-is running.
-
-Resolves: #1767
-
-Signed-off-by: Daniel Alvarez <dalvarez@redhat.com>
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/ovn_host.py | 21 ++++++++++++++-------
- 1 file changed, 14 insertions(+), 7 deletions(-)
-
-diff --git a/sos/plugins/ovn_host.py b/sos/plugins/ovn_host.py
-index ba35d87e7..5225f010e 100644
---- a/sos/plugins/ovn_host.py
-+++ b/sos/plugins/ovn_host.py
-@@ -12,6 +12,15 @@
- from sos.plugins import Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin
- 
- 
-+pidfile = 'ovn-controller.pid'
-+pid_paths = [
-+        '/var/lib/openvswitch/ovn',
-+        '/usr/local/var/run/openvswitch',
-+        '/var/run/openvswitch',
-+        '/run/openvswitch'
-+]
-+
-+
- class OVNHost(Plugin):
-     """ OVN Controller
-     """
-@@ -19,13 +28,6 @@ class OVNHost(Plugin):
-     profiles = ('network', 'virt')
- 
-     def setup(self):
--        pidfile = 'ovn-controller.pid'
--        pid_paths = [
--                '/var/lib/openvswitch/ovn',
--                '/usr/local/var/run/openvswitch',
--                '/var/run/openvswitch',
--                '/run/openvswitch'
--        ]
-         if os.environ.get('OVS_RUNDIR'):
-             pid_paths.append(os.environ.get('OVS_RUNDIR'))
-         self.add_copy_spec([os.path.join(pp, pidfile) for pp in pid_paths])
-@@ -40,6 +42,11 @@ def setup(self):
- 
-         self.add_journal(units="ovn-controller")
- 
-+    def check_enabled(self):
-+        return (any([os.path.isfile(
-+            os.path.join(pp, pidfile)) for pp in pid_paths]) or
-+            super(OVNHost, self).check_enabled())
-+
- 
- class RedHatOVNHost(OVNHost, RedHatPlugin):
- 
-From 6d623ceb2bc973a603c2abb1c8c64f2980667a0d Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Wed, 2 Oct 2019 12:19:19 +0200
-Subject: [PATCH] [ovn_central] dont add db outputs when no table is found in
- schema
-
-When get_tables_from_schema method returns None (i.e. due to a
-parsing error or missing config file), add_database_output tries
-to iterate over None object, what raises an exception.
-
-Resolves: #1808
-
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/plugins/ovn_central.py | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/sos/plugins/ovn_central.py b/sos/plugins/ovn_central.py
-index a9fcdf33e..b5ff96f66 100644
---- a/sos/plugins/ovn_central.py
-+++ b/sos/plugins/ovn_central.py
-@@ -56,6 +56,8 @@ def get_tables_from_schema(self, filename, skip=[]):
-             self._log_error("DB schema %s has no 'tables' key" % filename)
- 
-     def add_database_output(self, tables, cmds, ovn_cmd):
-+        if not tables:
-+            return
-         for table in tables:
-             cmds.append('%s list %s' % (ovn_cmd, table))
- 
-From 0c9a1f0cb98c5256a0ec1dec83b7c94d3bb39170 Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Wed, 4 Dec 2019 15:53:16 +0100
-Subject: [PATCH] [ovn_central] call podman exec without a timeout
-
-This is a workaround fix of a podman bug (see rhbz1732525) where
-"podman ps" can hang when "podman exec .." is invoked in detached
-mode under "timeout".
-
-Calling it without timeout works fine.
-
-This commit can be reverted once the podman bug is fixed.
-
-Resolves: #1875
-
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/plugins/ovn_central.py | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
-
-diff --git a/sos/plugins/ovn_central.py b/sos/plugins/ovn_central.py
-index c74bf403..32a5e1cb 100644
---- a/sos/plugins/ovn_central.py
-+++ b/sos/plugins/ovn_central.py
-@@ -26,7 +26,8 @@ class OVNCentral(Plugin):
-         if self._container_name:
-             cmd = "%s exec %s cat %s" % (
-                 self._container_runtime, self._container_name, filename)
--            res = self.get_command_output(cmd)
-+            # the timeout=None is just a workaround for "podman ps" hung bug
-+            res = self.get_command_output(cmd, timeout=None)
-             if res['status'] != 0:
-                 self._log_error("Could not retrieve DB schema file from "
-                                 "container %s" % self._container_name)
-@@ -118,7 +119,8 @@ class OVNCentral(Plugin):
-                                        self._container_name,
-                                        cmd) for cmd in cmds]
- 
--        self.add_cmd_output(cmds)
-+        # the timeout=None is just a workaround for "podman ps" hung bug
-+        self.add_cmd_output(cmds, timeout=None)
- 
-         self.add_copy_spec("/etc/sysconfig/ovn-northd")
- 
--- 
-2.21.0
-
diff --git a/SOURCES/sos-bz1767360-ipa-new-logs.patch b/SOURCES/sos-bz1767360-ipa-new-logs.patch
deleted file mode 100644
index a120ae5..0000000
--- a/SOURCES/sos-bz1767360-ipa-new-logs.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From f2350aece8a6980f80cfa0036382055239fd8a6b Mon Sep 17 00:00:00 2001
-From: Thorsten Scherf <tscherf@redhat.com>
-Date: Mon, 1 Jul 2019 11:37:47 +0200
-Subject: [PATCH] [ipa] copy httpd cert from new location
-
-With the FreeIPA 4.7.0 release, httpd moved from mod_nss to mod_ssl. As a
-result the httpd X.509 certificate is now no longer stored in NSS DB but as
-plain PEM text file: /var/lib/ipa/certs/httpd.crt. The plugin needs to copy
-this file into the sos archive.
-
-Closes: #1715
-Resolves: #1716
-
-Signed-off-by: Thorsten Scherf <tscherf@redhat.com>
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/ipa.py | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/sos/plugins/ipa.py b/sos/plugins/ipa.py
-index 50f42f259..310c0fa31 100644
---- a/sos/plugins/ipa.py
-+++ b/sos/plugins/ipa.py
-@@ -115,6 +115,7 @@ def setup(self):
-             "/var/lib/certmonger/requests/[0-9]*",
-             "/var/lib/certmonger/cas/[0-9]*",
-             "/var/lib/ipa/ra-agent.pem",
-+            "/var/lib/ipa/certs/httpd.crt",
-             "/var/kerberos/krb5kdc/kdc.crt",
-             "/var/lib/ipa/sysrestore/sysrestore.state"
-         ])
-From 5c0b2d56313b6fa58b46802317c98b89e5a68508 Mon Sep 17 00:00:00 2001
-From: Rob Crittenden <rcritten@redhat.com>
-Date: Thu, 12 Sep 2019 12:02:34 -0400
-Subject: [PATCH] [ipa] collect ipa-healthcheck logs
-
-Resolves: #1782
-
-Signed-off-by: Rob Crittenden <rcritten@redhat.com>
-Signed-off-by: Bryn M. Reeves <bmr@redhat.com>
----
- sos/plugins/ipa.py | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/sos/plugins/ipa.py b/sos/plugins/ipa.py
-index 310c0fa31..750cb6fae 100644
---- a/sos/plugins/ipa.py
-+++ b/sos/plugins/ipa.py
-@@ -117,7 +117,8 @@ def setup(self):
-             "/var/lib/ipa/ra-agent.pem",
-             "/var/lib/ipa/certs/httpd.crt",
-             "/var/kerberos/krb5kdc/kdc.crt",
--            "/var/lib/ipa/sysrestore/sysrestore.state"
-+            "/var/lib/ipa/sysrestore/sysrestore.state",
-+            "/var/log/ipa/healthcheck/healthcheck.log*"
-         ])
- 
-         #  Make sure to use the right PKI config and NSS DB folders
-From 823dbabde82ee941c421482a71be572984607ad4 Mon Sep 17 00:00:00 2001
-From: Pavel Moravec <pmoravec@redhat.com>
-Date: Tue, 1 Oct 2019 08:26:24 +0200
-Subject: [PATCH] [ipa] collect kdcproxy configs
-
-Resolves: #1806
-
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/plugins/ipa.py | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/sos/plugins/ipa.py b/sos/plugins/ipa.py
-index 750cb6fae..d3454de98 100644
---- a/sos/plugins/ipa.py
-+++ b/sos/plugins/ipa.py
-@@ -111,6 +111,9 @@ def setup(self):
-             "/etc/named.*",
-             "/etc/ipa/ca.crt",
-             "/etc/ipa/default.conf",
-+            "/etc/ipa/kdcproxy/kdcproxy.conf",
-+            "/etc/ipa/kdcproxy/ipa-kdc-proxy.conf",
-+            "/etc/ipa/kdcproxy.conf",
-             "/root/.ipa/log/cli.log",
-             "/var/lib/certmonger/requests/[0-9]*",
-             "/var/lib/certmonger/cas/[0-9]*",
diff --git a/SOURCES/sos-bz1767361-ovirt-hosted-cockpit-logs.patch b/SOURCES/sos-bz1767361-ovirt-hosted-cockpit-logs.patch
deleted file mode 100644
index e0337b2..0000000
--- a/SOURCES/sos-bz1767361-ovirt-hosted-cockpit-logs.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-From 8203bdeb77ac0d3f32f1a88304b9a34de66ae7b6 Mon Sep 17 00:00:00 2001
-From: Gobinda Das <godas@redhat.com>
-Date: Sat, 10 Aug 2019 13:36:36 +0530
-Subject: [PATCH] [ovirt_hosted_engine] Add gluster deployment and cleanup log
-
-Resolves: #1748
-
-Signed-off-by: Gobinda Das <godas@redhat.com>
-Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
----
- sos/plugins/ovirt_hosted_engine.py | 6 ++++++
- 1 file changed, 6 insertions(+)
-
-diff --git a/sos/plugins/ovirt_hosted_engine.py b/sos/plugins/ovirt_hosted_engine.py
-index 3d1bfe36c..fefc02947 100644
---- a/sos/plugins/ovirt_hosted_engine.py
-+++ b/sos/plugins/ovirt_hosted_engine.py
-@@ -48,6 +48,12 @@ def setup(self):
-             '/var/log/ovirt-hosted-engine-ha/agent.log',
-             '/var/log/ovirt-hosted-engine-ha/broker.log',
-         ])
-+
-+        # Add gluster deployment and cleanup log
-+        self.add_copy_spec([
-+            '/var/log/cockpit/ovirt-dashboard'
-+        ])
-+
-         # Add older ovirt-hosted-engine-ha log files only if requested
-         if self.get_option('all_logs'):
-             self.add_copy_spec(self.HA_LOG_GLOB)
diff --git a/SOURCES/sos-bz1768956-ebpf-per-namespace.patch b/SOURCES/sos-bz1768956-ebpf-per-namespace.patch
new file mode 100644
index 0000000..7f52847
--- /dev/null
+++ b/SOURCES/sos-bz1768956-ebpf-per-namespace.patch
@@ -0,0 +1,58 @@
+From 93ba31695ad532ce96c93dc511f966e7a3e9ae94 Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Tue, 3 Dec 2019 22:03:10 +0100
+Subject: [PATCH] [kernel,networking] collect bpftool net list for each
+ namespace
+
+- move "bpftool net list" command execution from kernel to networking
+plugin as it belongs rather to networking.
+- collect that output per each net name space as well
+
+Resolves: #1874
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+---
+ sos/plugins/kernel.py     | 4 ----
+ sos/plugins/networking.py | 7 ++++++-
+ 2 files changed, 6 insertions(+), 5 deletions(-)
+
+diff --git a/sos/plugins/kernel.py b/sos/plugins/kernel.py
+index 5c8521433..8224e5c05 100644
+--- a/sos/plugins/kernel.py
++++ b/sos/plugins/kernel.py
+@@ -142,10 +142,6 @@ class Kernel(Plugin, RedHatPlugin, Debia
+         if not self.get_option("trace"):
+             self.add_forbidden_path("/sys/kernel/debug/tracing/trace")
+ 
+-        # collect list of bpf program attachments in the kernel
+-        # networking subsystem
+-        self.add_cmd_output("bpftool net list")
+-
+         # collect list of eBPF programs and maps and their dumps
+         prog_file = self.get_cmd_output_now("bpftool -j prog list")
+         for prog_id in self.get_bpftool_prog_ids(prog_file):
+diff --git a/sos/plugins/networking.py b/sos/plugins/networking.py
+index 2f655042a..0026cda9d 100644
+--- a/sos/plugins/networking.py
++++ b/sos/plugins/networking.py
+@@ -205,6 +205,10 @@ class Networking(Plugin):
+         if self.get_option("traceroute"):
+             self.add_cmd_output("/bin/traceroute -n %s" % self.trace_host)
+ 
++        # collect list of bpf program attachments in the kernel
++        # networking subsystem
++        self.add_cmd_output("bpftool net list")
++
+         # Capture additional data from namespaces; each command is run
+         # per-namespace.
+         ip_netns_file = self.get_cmd_output_now("ip netns")
+@@ -212,7 +216,8 @@ def setup(self):
+                     ns_cmd_prefix + "iptables-save",
+                     ns_cmd_prefix + "netstat %s -neopa" % self.ns_wide,
+                     ns_cmd_prefix + "netstat -s",
+-                    ns_cmd_prefix + "netstat %s -agn" % self.ns_wide
++                    ns_cmd_prefix + "netstat %s -agn" % self.ns_wide,
++                    ns_cmd_prefix + "bpftool net list",
+                 ])
+ 
+                 ss_cmd = ns_cmd_prefix + "ss -peaonmi"
diff --git a/SOURCES/sos-bz1781819-dnf-module-list.patch b/SOURCES/sos-bz1781819-dnf-module-list.patch
new file mode 100644
index 0000000..6a36f80
--- /dev/null
+++ b/SOURCES/sos-bz1781819-dnf-module-list.patch
@@ -0,0 +1,29 @@
+From ba546077c0e4835b8087eacc75da0c4d475bade2 Mon Sep 17 00:00:00 2001
+From: Jake Hunsaker <jhunsake@redhat.com>
+Date: Tue, 10 Dec 2019 11:06:03 -0500
+Subject: [PATCH 2/2] [dnf] Collect dnf module list
+
+Adds collection of `dnf module list` to the plugin, to show a list of
+all modules available to the system, instead of just those that are
+currently installed.
+
+Related: RHBZ#1781819
+Resolves: #1887
+
+Signed-off-by: Jake Hunsaker <jhunsake@redhat.com>
+---
+ sos/plugins/dnf.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/sos/plugins/dnf.py b/sos/plugins/dnf.py
+index 754ca26ab..1bc01a985 100644
+--- a/sos/plugins/dnf.py
++++ b/sos/plugins/dnf.py
+@@ -49,6 +49,7 @@ def setup(self):
+             "dnf --version",
+             "dnf list installed *dnf*",
+             "dnf list extras",
++            "dnf module list",
+             "package-cleanup --dupes",
+             "package-cleanup --problems"
+         ])
diff --git a/SOURCES/sos-bz1783034-ceph-insights.patch b/SOURCES/sos-bz1783034-ceph-insights.patch
new file mode 100644
index 0000000..4fd7fd7
--- /dev/null
+++ b/SOURCES/sos-bz1783034-ceph-insights.patch
@@ -0,0 +1,27 @@
+From f205f3aebeff8041fae6357727f9514f7e85157b Mon Sep 17 00:00:00 2001
+From: Brad Hubbard <bhubbard@redhat.com>
+Date: Tue, 10 Dec 2019 08:22:55 +1000
+Subject: [PATCH] [ceph] Add 'ceph insights' command output
+
+This change adds the output of the recently added 'ceph insights'
+command.
+
+Resolves: #1888
+
+Signed-off-by: Brad Hubbard <bhubbard@redhat.com>
+---
+ sos/plugins/ceph.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/sos/plugins/ceph.py b/sos/plugins/ceph.py
+index 43284bc82..2936aaa96 100644
+--- a/sos/plugins/ceph.py
++++ b/sos/plugins/ceph.py
+@@ -69,6 +69,7 @@ class Ceph(Plugin, RedHatPlugin, UbuntuP
+             "ceph osd crush show-tunables",
+             "ceph-disk list",
+             "ceph versions",
++            "ceph insights",
+             "ceph osd crush dump"
+         ])
+ 
diff --git a/SOURCES/sos-bz1789018-allow-system-changes.patch b/SOURCES/sos-bz1789018-allow-system-changes.patch
new file mode 100644
index 0000000..021368e
--- /dev/null
+++ b/SOURCES/sos-bz1789018-allow-system-changes.patch
@@ -0,0 +1,78 @@
+From 903958306830ea00ac47e3ea353eaa5d8abbacb6 Mon Sep 17 00:00:00 2001
+From: Jake Hunsaker <jhunsake@redhat.com>
+Date: Wed, 23 Oct 2019 14:24:59 -0400
+Subject: [PATCH] [Predicate] Override __bool__ to allow py3 evaluation
+
+The check in `Plugin.test_predicate()` relies on a 'is not None' test,
+which on py2 invokes a call to `SoSPredicate.__nonzero__()` which in
+turns runs our evaluation of the predicate. On py3 however, this test is
+an explicit check to see if the object is `NoneType`. As such,
+`__nonzero__()` never runs and the predicate defaults to always
+evaluating ad `True`. This effectively removed any gating for command
+execution on py3.
+
+By overriding `SoSPredicate.__bool__()` to wrap `__nonzero__()` we can
+ensure that predicate evaluation is performed properly on both py2 and
+py3 runtimes.
+
+Closes: #1839
+Resolves: #1840
+
+Signed-off-by: Jake Hunsaker <jhunsake@redhat.com>
+---
+ sos/plugins/__init__.py | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index ed55ea382..7ed75a5cc 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -181,6 +181,11 @@ class SoSPredicate(object):
+         return ((self._eval_kmods() and self._eval_services()) and not
+                 self.dry_run)
+ 
++    def __bool__(self):
++        # Py3 evaluation ends in a __bool__() call where py2 ends in a call
++        # to __nonzero__(). Wrap the latter here, to support both versions
++        return self.__nonzero__()
++
+     def __init__(self, owner, dry_run=False, kmods=[], services=[],
+                  required={}):
+         """Initialise a new SoSPredicate object.
+From 4c02a77a1c0403c903c835d85739a6213c1a2287 Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Tue, 5 Nov 2019 17:29:57 +0100
+Subject: [PATCH] [man] describe --allow-system-changes
+
+In #1435, --allow-system-changes option was added that is documented
+in sosreport --help but not in manpages.
+
+Resolves: #1850
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+---
+ man/en/sosreport.1 | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/man/en/sosreport.1 b/man/en/sosreport.1
+index 649cba04d..a885d5630 100644
+--- a/man/en/sosreport.1
++++ b/man/en/sosreport.1
+@@ -25,6 +25,7 @@ sosreport \- Collect and package diagnostic and support data
+           [--log-size]\fR
+           [--all-logs]\fR
+           [--since YYYYMMDD[HHMMSS]]\fR
++          [--allow-system-changes]\fR
+           [-z|--compression-type method]\fR
+           [--encrypt-key KEY]\fR
+           [--encrypt-pass PASS]\fR
+@@ -160,6 +161,9 @@ increase the size of reports.
+ Limits the collection to logs newer than this date.
+ This also affects \--all-logs. Will pad with 0s if HHMMSS isn't specified.
+ .TP
++.B \--allow-system-changes
++Run commands even if they can change the system (e.g. load kernel modules).
++.TP
+ .B \-z, \--compression-type METHOD
+ Override the default compression type specified by the active policy.
+ .TP
diff --git a/SOURCES/sos-bz1789049-since-option-improved.patch b/SOURCES/sos-bz1789049-since-option-improved.patch
new file mode 100644
index 0000000..6bd51fe
--- /dev/null
+++ b/SOURCES/sos-bz1789049-since-option-improved.patch
@@ -0,0 +1,60 @@
+From 71cdbde72f81d586da37a9e108868d6aa1b4ef69 Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Thu, 5 Dec 2019 14:26:03 +0100
+Subject: [PATCH] [plugins] improve heuristic for applying --since to
+ logarchives
+
+logarchive_pattern treats some configs (e.g. /etc/dbus-1) as log
+archives, causing --since option will skip collecting them.
+
+This patch just improves the heuristic by claiming nothing under /etc
+is a logarchive, and adds a warning to sosreport help.
+
+Improves: #1847
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+---
+ man/en/sosreport.1      | 5 ++++-
+ sos/plugins/__init__.py | 5 ++++-
+ 2 files changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/man/en/sosreport.1 b/man/en/sosreport.1
+index a885d5630..f63b8deab 100644
+--- a/man/en/sosreport.1
++++ b/man/en/sosreport.1
+@@ -158,8 +158,11 @@ and including logs in non-default locations. This option may significantly
+ increase the size of reports.
+ .TP
+ .B \--since YYYYMMDD[HHMMSS]
+-Limits the collection to logs newer than this date.
++Limits the collection of log archives(*) to those newer than this date.
+ This also affects \--all-logs. Will pad with 0s if HHMMSS isn't specified.
++(*) Sos interprets as a log archive any file not found in /etc, that has
++either a numeric or compression-type extension for example '.zip'. '.1', '.gz'
++ etc.)
+ .TP
+ .B \--allow-system-changes
+ Run commands even if they can change the system (e.g. load kernel modules).
+diff --git a/sos/plugins/__init__.py b/sos/plugins/__init__.py
+index b7a47b6a4..44ae413d0 100644
+--- a/sos/plugins/__init__.py
++++ b/sos/plugins/__init__.py
+@@ -917,6 +917,7 @@ def add_copy_spec(self, copyspecs, sizelimit=None, maxage=None,
+             since = self.get_option('since')
+ 
+         logarchive_pattern = re.compile(r'.*((\.(zip|gz|bz2|xz))|[-.][\d]+)$')
++        configfile_pattern = re.compile(r"^%s/*" % self.join_sysroot("etc"))
+ 
+         if not self.test_predicate(pred=pred):
+             self._log_info("skipped copy spec '%s' due to predicate (%s)" %
+@@ -962,7 +963,9 @@ def time_filter(path):
+                 """ When --since is passed, or maxage is coming from the
+                 plugin, we need to filter out older files """
+ 
+-                if logarchive_pattern.search(path) is None:
++                # skip config files or not-logarchive files from the filter
++                if ((logarchive_pattern.search(path) is None) or
++                   (configfile_pattern.search(path) is not None)):
+                     return True
+                 filetime = datetime.fromtimestamp(getmtime(path))
+                 if ((since and filetime < since) or
diff --git a/SPECS/sos.spec b/SPECS/sos.spec
index 0507871..8ba1149 100644
--- a/SPECS/sos.spec
+++ b/SPECS/sos.spec
@@ -4,8 +4,8 @@
 
 Summary: A set of tools to gather troubleshooting information from a system
 Name: sos
-Version: 3.7
-Release: 8%{?dist}
+Version: 3.8
+Release: 2%{?dist}
 Group: Applications/System
 Source0: https://github.com/sosreport/sos/archive/%{version}/sos-%{version}.tar.gz
 Source1: sos-audit-%{auditversion}.tgz
@@ -20,30 +20,18 @@ Requires: bzip2
 Requires: xz
 Requires: python3-six
 Conflicts: vdsm < 4.40
-Patch1: sos-bz1687954-buildah-index-out-of-range.patch
-Patch2: sos-bz1695583-postgres-mysql-incorrect-defaults.patch
-Patch3: sos-bz1700780-vdsm-plugin.patch
-Patch4: sos-bz1702806-openstack_instack-ansible-log.patch
-Patch5: sos-bz1719884-pcp-pmlogger-no-limit.patch
-Patch6: sos-bz1719885-plugin-vs-command-timeouts.patch
-Patch7: sos-bz1719886-sos-conf-disabled-plugins-manpages.patch
-Patch8: sos-bz1719887-katello-qpid-certificate.patch
-Patch9: sos-bz1714243-sar-collect-older-data.patch
-Patch10: sos-bz1718087-redhat-local-name-not-rhn.patch
-Patch11: sos-bz1728214-symlink-dirs-in-container.patch
-Patch12: sos-bz1709906-frr-plugin.patch
-Patch13: sos-bz1717882-openstack-placement.patch
-Patch14: sos-bz1733352-cmd-poll-performance.patch
-Patch15: sos-bz1665981-peripety-config.patch
-Patch16: sos-bz1733469-timeouted-plugin-stop-further-collection.patch
-Patch17: sos-bz1665929-nvme-config.patch
-Patch18: sos-bz1745017-openvswitch-enable-by-openvswitch2.patch
-Patch19: sos-bz1756094-kernel-no-trace-by-default.patch
-Patch20: sos-bz1767356-interim-sysroot-forbidden-paths.patch
-Patch21: sos-bz1767361-ovirt-hosted-cockpit-logs.patch
-Patch22: sos-bz1751171-vdsm-bin-sh.patch
-Patch23: sos-bz1767359-ovn-plugins-containerized-env.patch
-Patch24: sos-bz1767360-ipa-new-logs.patch
+Patch1: sos-bz1688764-ipa-new-logs.patch
+Patch2: sos-bz1738391-kernel-no-trace-by-default.patch
+Patch3: sos-bz1744553-ovn-plugins-containerized-env.patch
+Patch4: sos-bz1766915-interim-sysroot-forbidden-paths.patch
+Patch5: sos-bz1789018-allow-system-changes.patch
+Patch6: sos-bz1789049-since-option-improved.patch
+Patch7: sos-bz1783034-ceph-insights.patch
+Patch8: sos-bz1781819-dnf-module-list.patch
+Patch9: sos-bz1721779-ebpf-net-list.patch
+Patch10: sos-bz1768956-ebpf-per-namespace.patch
+Patch11: sos-bz1741330-openswan-to-libreswan.patch
+Patch12: sos-bz1709682-grub2-mkconfig-dont-remove-kernel-opts.patch
 
 %description
 Sos is a set of tools that gathers information about system
@@ -65,18 +53,6 @@ support technicians and developers.
 %patch10 -p1
 %patch11 -p1
 %patch12 -p1
-%patch13 -p1
-%patch14 -p1
-%patch15 -p1
-%patch16 -p1
-%patch17 -p1
-%patch18 -p1
-%patch19 -p1
-%patch20 -p1
-%patch21 -p1
-%patch22 -p1
-%patch23 -p1
-%patch24 -p1
 %setup -T -D -a1 -q
 
 %build
@@ -129,30 +105,45 @@ of the system.  Currently storage and filesystem commands are audited.
 %ghost /etc/audit/rules.d/40-sos-storage.rules
 
 %changelog
-* Tue Dec 17 2019 CentOS Sources <bugs@centos.org> - 3.7-8.el8.centos
-- Apply debranding changes
-
-* Thu Dec 05 2019 Pavel Moravec <pmoravec@redhat.com> = 3.7-8
-- [ovn_central] call podman exec without a timeout
-  Resolves: bz1767359
+* Fri Jan 10 2020 Pavel Moravec <pmoravec@redhat.com> = 3.8-2
+- [plugins] improve heuristic for applying --since
+  Resolves: bz1789049
+- [Predicate] Override __bool__ to allow py3 evaluation
+  Resolves: bz1789018
+- [ceph] Add 'ceph insights' command output
+  Resolves: bz1783034
+- [dnf] Collect dnf module list
+  Resolves: bz1781819
+- [kernel,networking] collect bpftool net list for each
+  Resolves: bz1768956
+- [libreswan] New plugin for "libreswan" IPsec
+  Resolves: bz1741330
+- [kernel] collect "bpftool net list"
+  Resolves: bz1721779
+- [grub2] call grub2-config with --no-grubenv-update
+  Resolves: bz1709682
+
+* Wed Dec 11 2019 Pavel Moravec <pmoravec@redhat.com> = 3.8-1
+- Rebase on upstream 3.8
+  Resolves: bz1779387
+
+* Mon Nov 04 2019 Pavel Moravec <pmoravec@redhat.com> = 3.7-7
+- [Plugin, kernel] interim sysroot fixes
+  Resolves: bz1766915
 
-* Thu Nov 07 2019 Pavel Moravec <pmoravec@redhat.com> = 3.7-7
+* Wed Oct 30 2019 Pavel Moravec <pmoravec@redhat.com> = 3.7-6
 - [ovirt_hosted_engine] Add gluster deployment and cleanup log
-  Resolves: bz1767361
+  Resolves: bz1744086
 - [vdsm]: Fix executing shell commands
-  Resolves: bz1751171
+  Resolves: bz1744110
 - [ovn_*] Add support to containerized setups
-  Resolves: bz1767359
+  Resolves: bz1744553
 - [ipa] collect ipa-healthcheck logs, kdcproxy configs, httpd cert
-  Resolves: bz1767360
-
-* Mon Nov 04 2019 Pavel Moravec <pmoravec@redhat.com> = 3.7-6
-- [Plugin, kernel] interim sysroot fixes
-  Resolves: bz1767356
+  Resolves: bz1688764
 
 * Wed Oct 02 2019 Pavel Moravec <pmoravec@redhat.com> = 3.7-5
 - [kernel] Don't collect trace file by default
-  Resolves: bz1756094
+  Resolves: bz1738391
 
 * Thu Sep 12 2019 Pavel Moravec <pmoravec@redhat.com> = 3.7-4
 - [openvswitch] catch all openvswitch2.* packages