diff --git a/.gitignore b/.gitignore
index 0964ff6..9a59ac6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,2 @@
-SOURCES/sos-3.8.tar.gz
+SOURCES/sos-3.9.1.tar.gz
 SOURCES/sos-audit-0.3.tgz
diff --git a/.sos.metadata b/.sos.metadata
index 0c29651..26fd331 100644
--- a/.sos.metadata
+++ b/.sos.metadata
@@ -1,2 +1,2 @@
-99c94319c6208edef8d852b9e84cbb045c01df5f SOURCES/sos-3.8.tar.gz
+f96aaefb396a648be21f661b89f13cd9fc257b8a SOURCES/sos-3.9.1.tar.gz
 9d478b9f0085da9178af103078bbf2fd77b0175a SOURCES/sos-audit-0.3.tgz
diff --git a/SOURCES/sos-3.8-centos-branding.patch b/SOURCES/sos-3.8-centos-branding.patch
deleted file mode 100644
index 9f3bc52..0000000
--- a/SOURCES/sos-3.8-centos-branding.patch
+++ /dev/null
@@ -1,73 +0,0 @@
-diff -uNrp sos-3.8.orig/sos/policies/redhat.py sos-3.8/sos/policies/redhat.py
---- sos-3.8.orig/sos/policies/redhat.py	2019-08-27 03:17:45.000000000 -0500
-+++ sos-3.8/sos/policies/redhat.py	2020-04-25 20:55:00.586172166 -0500
-@@ -23,9 +23,9 @@ OS_RELEASE = "/etc/os-release"
- 
- 
- class RedHatPolicy(LinuxPolicy):
--    distro = "Red Hat"
--    vendor = "Red Hat"
--    vendor_url = "http://www.redhat.com/"
-+    distro = "CentOS Linux"
-+    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"'
-@@ -180,22 +180,22 @@ _cb_plugs = ['abrt', 'block', 'boot', 'd
-              'hardware', 'host', 'kernel', 'logs', 'lvm2', 'memory', 'rpm',
-              'process', 'systemd', 'yum', 'xfs']
- 
--RHEL_RELEASE_STR = "Red Hat Enterprise Linux"
-+RHEL_RELEASE_STR = "CentOS Linux"
- 
- RHV = "rhv"
--RHV_DESC = "Red Hat Virtualization"
-+RHV_DESC = "CentOS Linux 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"
- SAT_OPTS = SoSOptions(verify=True, plugopts=['apache.log=on'])
- 
- CB = "cantboot"
-@@ -236,8 +236,8 @@ No changes will be made to system config
- 
- class RHELPolicy(RedHatPolicy):
-     distro = RHEL_RELEASE_STR
--    vendor = "Red Hat"
--    vendor_url = "https://access.redhat.com/support/"
-+    vendor = "CentOS Linux"
-+    vendor_url = "https://wiki.centos.org/"
-     msg = _("""\
- This command will collect diagnostic and configuration \
- information from this %(distro)s system and installed \
-@@ -313,7 +313,7 @@ class CentOsPolicy(RHELPolicy):
- 
- 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,
-@@ -322,7 +322,7 @@ atomic_presets = {
- 
- 
- class RedHatAtomicPolicy(RHELPolicy):
--    distro = "Red Hat Atomic Host"
-+    distro = "CentOS Linux Atomic Host"
-     msg = _("""\
- This command will collect diagnostic and configuration \
- information from this %(distro)s system.
diff --git a/SOURCES/sos-bz1457191-navicli-noniteractively.patch b/SOURCES/sos-bz1457191-navicli-noniteractively.patch
new file mode 100644
index 0000000..70cf21b
--- /dev/null
+++ b/SOURCES/sos-bz1457191-navicli-noniteractively.patch
@@ -0,0 +1,67 @@
+From ca24d4602ce46312343f1f6c6f4b270fb6092e21 Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Wed, 15 Apr 2020 17:09:52 +0200
+Subject: [PATCH] [navicli] replace interactive prompt by plugin option
+
+List of ClariiOn IP addresses should be provided via
+-k navicli.ipaddrs plugopt, as a space separated list.
+
+Closes: #405
+Resolves: #2020
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+Signed-off-by: Bryan Quigley <bryan.quigley@canonical.com>
+---
+ sos/plugins/navicli.py | 30 +++++-------------------------
+ 1 file changed, 5 insertions(+), 25 deletions(-)
+
+diff --git a/sos/plugins/navicli.py b/sos/plugins/navicli.py
+index 8e5dee50..5b6d766d 100644
+--- a/sos/plugins/navicli.py
++++ b/sos/plugins/navicli.py
+@@ -19,6 +19,8 @@ class Navicli(Plugin, RedHatPlugin):
+ 
+     plugin_name = 'navicli'
+     profiles = ('storage', 'hardware')
++    option_list = [("ipaddrs", "list of space separated CLARiiON IP addresses",
++                    '', "")]
+ 
+     def check_enabled(self):
+         return is_executable("navicli")
+@@ -57,30 +59,8 @@ class Navicli(Plugin, RedHatPlugin):
+ 
+     def setup(self):
+         self.get_navicli_config()
+-        CLARiiON_IP_address_list = []
+-        CLARiiON_IP_loop = "stay_in"
+-        while CLARiiON_IP_loop == "stay_in":
+-            try:
+-                ans = input("CLARiiON SP IP Address or [Enter] to exit: ")
+-            except Exception:
+-                return
+-            if self.exec_cmd("navicli -h %s getsptime" % (ans,))['status']:
+-                CLARiiON_IP_address_list.append(ans)
+-            else:
+-                if ans != "":
+-                    print("The IP address you entered, %s, is not to an "
+-                          "active CLARiiON SP." % ans)
+-                if ans == "":
+-                    CLARiiON_IP_loop = "get_out"
+-        # Sort and dedup the list of CLARiiON IP Addresses
+-        CLARiiON_IP_address_list.sort()
+-        for SP_address in CLARiiON_IP_address_list:
+-            if CLARiiON_IP_address_list.count(SP_address) > 1:
+-                CLARiiON_IP_address_list.remove(SP_address)
+-        for SP_address in CLARiiON_IP_address_list:
+-            if SP_address != "":
+-                print(" Gathering NAVICLI information for %s..." %
+-                      SP_address)
+-                self.get_navicli_SP_info(SP_address)
++        for ip in set(self.get_option("ipaddrs").split()):
++            if self.exec_cmd("navicli -h %s getsptime" % (ip))['status'] == 0:
++                self.get_navicli_SP_info(ip)
+ 
+ # vim: set et ts=4 sw=4 :
+-- 
+2.21.3
+
diff --git a/SOURCES/sos-bz1633006-iptables-kmods.patch b/SOURCES/sos-bz1633006-iptables-kmods.patch
new file mode 100644
index 0000000..7ffaae8
--- /dev/null
+++ b/SOURCES/sos-bz1633006-iptables-kmods.patch
@@ -0,0 +1,78 @@
+From 31e0467885ef3986b476ea070941a786b426f298 Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Fri, 8 May 2020 14:06:41 +0200
+Subject: [PATCH] [networking] collect iptables when proper kernel modules
+ loaded
+
+Since kernel-4, iptables / ip6tables is newly provided by nf_tables
+kernel module. Therefore, collecting ip[,6]tables commands should
+be gated by presence of also this kernel module.
+
+Resolves: #2054
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+Signed-off-by: Bryan Quigley <bryan.quigley@canonical.com>
+---
+ sos/plugins/networking.py | 23 +++++++++++++----------
+ 1 file changed, 13 insertions(+), 10 deletions(-)
+
+diff --git a/sos/plugins/networking.py b/sos/plugins/networking.py
+index cac6ccca..5230303d 100644
+--- a/sos/plugins/networking.py
++++ b/sos/plugins/networking.py
+@@ -35,22 +35,24 @@ class Networking(Plugin):
+     ns_wide = "-W"
+ 
+     def collect_iptable(self, tablename):
+-        """ When running the iptables command, it unfortunately auto-loads
+-        the modules before trying to get output.  Some people explicitly
+-        don't want this, so check if the modules are loaded before running
+-        the command.  If they aren't loaded, there can't possibly be any
+-        relevant rules in that table """
++        """ Collecting iptables rules for a table loads either kernel module
++        of the table name (for kernel <= 3), or nf_tables (for kernel >= 4).
++        If neither module is present, the rules must be empty."""
+ 
+         modname = "iptable_" + tablename
+         cmd = "iptables -t " + tablename + " -nvL"
+-        self.add_cmd_output(cmd, pred=SoSPredicate(self, kmods=[modname]))
++        self.add_cmd_output(
++            cmd,
++            pred=SoSPredicate(self, kmods=[modname, 'nf_tables']))
+ 
+     def collect_ip6table(self, tablename):
+         """ Same as function above, but for ipv6 """
+ 
+         modname = "ip6table_" + tablename
+         cmd = "ip6tables -t " + tablename + " -nvL"
+-        self.add_cmd_output(cmd, pred=SoSPredicate(self, kmods=[modname]))
++        self.add_cmd_output(
++            cmd,
++            pred=SoSPredicate(self, kmods=[modname, 'nf_tables']))
+ 
+     def collect_nftables(self):
+         """ Collects nftables rulesets with 'nft' commands if the modules
+@@ -151,16 +153,17 @@ class Networking(Plugin):
+         self.add_cmd_output(ss_cmd, pred=ss_pred, changes=True)
+ 
+         # When iptables is called it will load the modules
+-        # iptables and iptables_filter if they are not loaded.
++        # iptables_filter (for kernel <= 3) or
++        # nf_tables (for kernel >= 4) if they are not loaded.
+         # The same goes for ipv6.
+         self.add_cmd_output(
+             "iptables -vnxL",
+-            pred=SoSPredicate(self, kmods=['iptable_filter'])
++            pred=SoSPredicate(self, kmods=['iptable_filter', 'nf_tables'])
+         )
+ 
+         self.add_cmd_output(
+             "ip6tables -vnxL",
+-            pred=SoSPredicate(self, kmods=['ip6table_filter'])
++            pred=SoSPredicate(self, kmods=['ip6table_filter', 'nf_tables'])
+         )
+ 
+         # Get ethtool output for every device that does not exist in a
+-- 
+2.21.3
+
diff --git a/SOURCES/sos-bz1688764-ipa-new-logs.patch b/SOURCES/sos-bz1688764-ipa-new-logs.patch
deleted file mode 100644
index a120ae5..0000000
--- a/SOURCES/sos-bz1688764-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-bz1709682-grub2-mkconfig-dont-remove-kernel-opts.patch b/SOURCES/sos-bz1709682-grub2-mkconfig-dont-remove-kernel-opts.patch
deleted file mode 100644
index 3f20a54..0000000
--- a/SOURCES/sos-bz1709682-grub2-mkconfig-dont-remove-kernel-opts.patch
+++ /dev/null
@@ -1,180 +0,0 @@
-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-bz1721779-ebpf-net-list.patch b/SOURCES/sos-bz1721779-ebpf-net-list.patch
deleted file mode 100644
index a1858a0..0000000
--- a/SOURCES/sos-bz1721779-ebpf-net-list.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-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-bz1738391-kernel-no-trace-by-default.patch b/SOURCES/sos-bz1738391-kernel-no-trace-by-default.patch
deleted file mode 100644
index 5aec064..0000000
--- a/SOURCES/sos-bz1738391-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-bz1741330-openswan-to-libreswan.patch b/SOURCES/sos-bz1741330-openswan-to-libreswan.patch
deleted file mode 100644
index db247d2..0000000
--- a/SOURCES/sos-bz1741330-openswan-to-libreswan.patch
+++ /dev/null
@@ -1,104 +0,0 @@
-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
deleted file mode 100644
index 9a97377..0000000
--- a/SOURCES/sos-bz1744553-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-bz1766915-interim-sysroot-forbidden-paths.patch b/SOURCES/sos-bz1766915-interim-sysroot-forbidden-paths.patch
deleted file mode 100644
index 5a0fd80..0000000
--- a/SOURCES/sos-bz1766915-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-bz1768956-ebpf-per-namespace.patch b/SOURCES/sos-bz1768956-ebpf-per-namespace.patch
deleted file mode 100644
index 7f52847..0000000
--- a/SOURCES/sos-bz1768956-ebpf-per-namespace.patch
+++ /dev/null
@@ -1,58 +0,0 @@
-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-bz1776549-podman-buildah-rootless.patch b/SOURCES/sos-bz1776549-podman-buildah-rootless.patch
new file mode 100644
index 0000000..8158b2b
--- /dev/null
+++ b/SOURCES/sos-bz1776549-podman-buildah-rootless.patch
@@ -0,0 +1,142 @@
+From 1875213788f4472cc11ce8e732cd4780e99ca477 Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Fri, 8 May 2020 15:38:36 +0200
+Subject: [PATCH] [containers_common] collect rootless containers info
+
+Add the ability to collect data/info about rootless podman/buildah
+containers, in particular:
+
+- containers_common plugopt 'rootlessusers' as a list of users to inspect
+- for each user, collect:
+  - its containers config
+  - [podman|buildah] info and [UID|GID] map
+- collect user-status and few user-related config files
+
+Resolves: #2055
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+Signed-off-by: Jake Hunsaker <jhunsake@redhat.com>
+---
+ sos/plugins/containers_common.py | 29 +++++++++++++++++++++++++
+ 1 file changed, 29 insertions(+)
+
+diff --git a/sos/plugins/containers_common.py b/sos/plugins/containers_common.py
+index 99ae88fe..9a878849 100644
+--- a/sos/plugins/containers_common.py
++++ b/sos/plugins/containers_common.py
+@@ -9,6 +9,7 @@
+ # See the LICENSE file in the source distribution for further information.
+ 
+ from sos.plugins import Plugin, RedHatPlugin, UbuntuPlugin
++import os
+ 
+ 
+ class ContainersCommon(Plugin, RedHatPlugin, UbuntuPlugin):
+@@ -17,11 +18,39 @@ class ContainersCommon(Plugin, RedHatPlugin, UbuntuPlugin):
+     plugin_name = 'containers_common'
+     profiles = ('container', )
+     packages = ('containers-common', )
++    option_list = [
++        ('rootlessusers', 'colon-separated list of users\' containers info',
++         '', ''),
++    ]
+ 
+     def setup(self):
+         self.add_copy_spec([
+             '/etc/containers/*',
+             '/usr/share/containers/*',
++            '/etc/subuid',
++            '/etc/subgid',
+         ])
++        self.add_cmd_output(['loginctl user-status'])
++
++        users_opt = self.get_option('rootlessusers')
++        users_list = []
++        if users_opt:
++            users_list = [x for x in users_opt.split(':') if x]
++
++        user_subcmds = [
++            'info',
++            'unshare cat /proc/self/uid_map',
++            'unshare cat /proc/self/gid_map'
++        ]
++        for user in users_list:
++            # collect user's containers' config
++            self.add_copy_spec(
++                '%s/.config/containers/' % (os.path.expanduser('~%s') % user))
++            # collect the user's podman/buildah info and uid/guid maps
++            for binary in ['/usr/bin/podman', '/usr/bin/buildah']:
++                for cmd in user_subcmds:
++                    self.add_cmd_output([
++                        'machinectl -q shell %s@ %s %s' % (user, binary, cmd)
++                    ])
+ 
+ # vim: set et ts=4 sw=4 :
+-- 
+2.21.3
+
+From c2d4c7d1f3ecf6ac59c665cb5138cb2ddda71b3d Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Fri, 22 May 2020 08:17:30 +0200
+Subject: [PATCH] [containers_common] fix user's home expansion
+
+Apply os.path.expanduser on ~[user], not ~%s .
+
+Relates to: #2082
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+Signed-off-by: Jake Hunsaker <jhunsake@redhat.com>
+---
+ sos/plugins/containers_common.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/containers_common.py b/sos/plugins/containers_common.py
+index 9a878849..da360c7e 100644
+--- a/sos/plugins/containers_common.py
++++ b/sos/plugins/containers_common.py
+@@ -45,7 +45,7 @@ class ContainersCommon(Plugin, RedHatPlugin, UbuntuPlugin):
+         for user in users_list:
+             # collect user's containers' config
+             self.add_copy_spec(
+-                '%s/.config/containers/' % (os.path.expanduser('~%s') % user))
++                '%s/.config/containers/' % (os.path.expanduser('~%s' % user)))
+             # collect the user's podman/buildah info and uid/guid maps
+             for binary in ['/usr/bin/podman', '/usr/bin/buildah']:
+                 for cmd in user_subcmds:
+-- 
+2.21.3
+
+From 569f261801d3a4da2852c0b40be78b701056edaa Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Fri, 22 May 2020 08:20:11 +0200
+Subject: [PATCH] [containers_common] Call machinectl on foreground
+
+Commands like:
+
+machinectl -q shell user1@ ..
+
+hang if not called on foreground / with terminal.
+
+Resolves: #2082
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+Signed-off-by: Jake Hunsaker <jhunsake@redhat.com>
+---
+ sos/plugins/containers_common.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/plugins/containers_common.py b/sos/plugins/containers_common.py
+index da360c7e..92c2e9e8 100644
+--- a/sos/plugins/containers_common.py
++++ b/sos/plugins/containers_common.py
+@@ -51,6 +51,6 @@ class ContainersCommon(Plugin, RedHatPlugin, UbuntuPlugin):
+                 for cmd in user_subcmds:
+                     self.add_cmd_output([
+                         'machinectl -q shell %s@ %s %s' % (user, binary, cmd)
+-                    ])
++                    ], foreground=True)
+ 
+ # vim: set et ts=4 sw=4 :
+-- 
+2.21.3
+
diff --git a/SOURCES/sos-bz1781819-dnf-module-list.patch b/SOURCES/sos-bz1781819-dnf-module-list.patch
deleted file mode 100644
index 6a36f80..0000000
--- a/SOURCES/sos-bz1781819-dnf-module-list.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-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
deleted file mode 100644
index 4fd7fd7..0000000
--- a/SOURCES/sos-bz1783034-ceph-insights.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-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-bz1785546-nvmetcli.patch b/SOURCES/sos-bz1785546-nvmetcli.patch
new file mode 100644
index 0000000..34bbc4d
--- /dev/null
+++ b/SOURCES/sos-bz1785546-nvmetcli.patch
@@ -0,0 +1,55 @@
+From 83d56e2b443edc733ffc5a5286ce8392de99586e Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Mon, 11 May 2020 14:22:18 +0200
+Subject: [PATCH] [nvmetcli] Add new plugin for NVMe Target CLI
+
+Resolves: #2056
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+Signed-off-by: Jake Hunsaker <jhunsake@redhat.com>
+---
+ sos/plugins/nvmetcli.py | 32 ++++++++++++++++++++++++++++++++
+ 1 file changed, 32 insertions(+)
+ create mode 100644 sos/plugins/nvmetcli.py
+
+diff --git a/sos/plugins/nvmetcli.py b/sos/plugins/nvmetcli.py
+new file mode 100644
+index 00000000..b66a3a13
+--- /dev/null
++++ b/sos/plugins/nvmetcli.py
+@@ -0,0 +1,32 @@
++# Copyright (C) 2020 Red Hat, Inc., Nitin Yewale <nyewale@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 NvmetCli(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
++
++    short_desc = 'Collect config and system information for nvmetcli'
++
++    packages = ('nvmetcli', )
++    profiles = ('storage', )
++    plugin_name = 'nvmetcli'
++
++    def setup(self):
++        self.add_cmd_output([
++            "nvmetcli ls"
++        ])
++        self.add_journal(units=["nvme", "nvmet", "nvmet_rdma"])
++        self.add_copy_spec([
++            "/sys/kernel/config/nvmet",
++            "/etc/nvmet/config.json",
++        ])
++
++# vim: set et ts=4 sw=4 :
+-- 
+2.21.3
+
diff --git a/SOURCES/sos-bz1789018-allow-system-changes.patch b/SOURCES/sos-bz1789018-allow-system-changes.patch
deleted file mode 100644
index 021368e..0000000
--- a/SOURCES/sos-bz1789018-allow-system-changes.patch
+++ /dev/null
@@ -1,78 +0,0 @@
-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
deleted file mode 100644
index 6bd51fe..0000000
--- a/SOURCES/sos-bz1789049-since-option-improved.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-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/SOURCES/sos-bz1814867-insights-archive.patch b/SOURCES/sos-bz1814867-insights-archive.patch
new file mode 100644
index 0000000..b36308d
--- /dev/null
+++ b/SOURCES/sos-bz1814867-insights-archive.patch
@@ -0,0 +1,78 @@
+From 0766cc739d424932e18c250c88f0227da06ecaed Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Sun, 19 Apr 2020 16:38:50 +0200
+Subject: [PATCH] [insights] collect insights-client dump
+
+Collect data of "insights-client --offline" into
+sos_commands/insights/insights-client-dump directory.
+
+Resolves: #2030
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+Signed-off-by: Jake Hunsaker <jhunsake@redhat.com>
+---
+ sos/plugins/insights.py | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/sos/plugins/insights.py b/sos/plugins/insights.py
+index a8fa4e5f..17b99980 100644
+--- a/sos/plugins/insights.py
++++ b/sos/plugins/insights.py
+@@ -31,6 +31,10 @@ class RedHatInsights(Plugin, RedHatPlugin):
+         else:
+             self.add_copy_spec("/var/log/insights-client/insights-client.log")
+ 
++        # Collect insights-client report data into given dump dir
++        path = self.get_cmd_output_path(name="insights-client-dump")
++        self.add_cmd_output("insights-client --offline --output-dir %s" % path)
++
+     def postproc(self):
+         for conf in self.config:
+             self.do_file_sub(
+-- 
+2.21.3
+
+From f41a12032d1b0caf962145ddd5026b3798931026 Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Tue, 12 May 2020 09:58:26 +0200
+Subject: [PATCH] [insights] collect insights dump output in deterministic
+ filename
+
+Currently, "insights-client --offline" stdout is stored in filename like
+insights-client_--offline_--output-dir_.var.tmp.sos.cbl0ox16. (and so on)
+
+Let make the filename unified and deterministic.
+
+Also add the trailing vim expand tabs comment.
+
+Resolves: #2058
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+Signed-off-by: Bryan Quigley <bryan.quigley@canonical.com>
+---
+ sos/plugins/insights.py | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/sos/plugins/insights.py b/sos/plugins/insights.py
+index 75d521bc..e50bc8fb 100644
+--- a/sos/plugins/insights.py
++++ b/sos/plugins/insights.py
+@@ -33,7 +33,8 @@ class RedHatInsights(Plugin, RedHatPlugin):
+ 
+         # Collect insights-client report data into given dump dir
+         path = self.get_cmd_output_path(name="insights-client-dump")
+-        self.add_cmd_output("insights-client --offline --output-dir %s" % path)
++        self.add_cmd_output("insights-client --offline --output-dir %s" % path,
++                            suggest_filename="insights-client-dump.log")
+ 
+     def postproc(self):
+         for conf in self.config:
+@@ -44,3 +45,5 @@ class RedHatInsights(Plugin, RedHatPlugin):
+             self.do_file_sub(
+                 conf, r'(proxy[\t\ ]*=.*)(:)(.*)(@.*)', r'\1\2********\4'
+             )
++
++# vim: set et ts=4 sw=4 :
+-- 
+2.21.3
+
diff --git a/SOURCES/sos-bz1819662-rabbitmqctl-on-foreground.patch b/SOURCES/sos-bz1819662-rabbitmqctl-on-foreground.patch
new file mode 100644
index 0000000..c8cb452
--- /dev/null
+++ b/SOURCES/sos-bz1819662-rabbitmqctl-on-foreground.patch
@@ -0,0 +1,34 @@
+From c805cd23b8bd73986f2546a711edd42150d855ba Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Fri, 22 May 2020 12:05:00 +0200
+Subject: [PATCH] [rabbitmq] emulate TTY via timeout foreground
+
+"docker exec -t" might hang without a terminal. Let emulate TTY via
+timeout --foreground instead.
+
+Resolves: #2083
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+Signed-off-by: Jake Hunsaker <jhunsake@redhat.com>
+---
+ sos/plugins/rabbitmq.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/sos/plugins/rabbitmq.py b/sos/plugins/rabbitmq.py
+index 9ebf6c0b..8d9a16ff 100644
+--- a/sos/plugins/rabbitmq.py
++++ b/sos/plugins/rabbitmq.py
+@@ -38,8 +38,8 @@ class RabbitMQ(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
+             for container in container_names:
+                 self.add_cmd_output('docker logs {0}'.format(container))
+                 self.add_cmd_output(
+-                    'docker exec -t {0} rabbitmqctl report'
+-                    .format(container)
++                    'docker exec {0} rabbitmqctl report'
++                    .format(container), foreground=True
+                 )
+         else:
+             self.add_cmd_output("rabbitmqctl report")
+-- 
+2.21.3
+
diff --git a/SOURCES/sos-bz1823488-containers-common.patch b/SOURCES/sos-bz1823488-containers-common.patch
new file mode 100644
index 0000000..581caea
--- /dev/null
+++ b/SOURCES/sos-bz1823488-containers-common.patch
@@ -0,0 +1,94 @@
+From 943b3c3cd096f8efaeb4f0f2008391abe4c9f7e2 Mon Sep 17 00:00:00 2001
+From: Pavel Moravec <pmoravec@redhat.com>
+Date: Sat, 2 May 2020 17:22:35 +0200
+Subject: [PATCH] [containers_common] Add plugin for common containers configs
+
+Move collection of whole /etc/containers and /usr/share/containers to
+one containers_common plugin enabled by the package of the same name.
+
+Since the package is a common dependency for buildah and podman, no regression
+in default data collection happens.
+
+Resolves: #2040
+
+Signed-off-by: Pavel Moravec <pmoravec@redhat.com>
+Signed-off-by: Jake Hunsaker <jhunsake@redhat.com>
+---
+ sos/plugins/buildah.py           |  7 -------
+ sos/plugins/containers_common.py | 27 +++++++++++++++++++++++++
+ sos/plugins/podman.py            |  7 -------
+ 3 files changed, 27 insertions(+), 14 deletions(-)
+ create mode 100644 sos/plugins/containers_common.py
+
+diff --git a/sos/plugins/buildah.py b/sos/plugins/buildah.py
+index 9d237a53..4b8b3b0a 100644
+--- a/sos/plugins/buildah.py
++++ b/sos/plugins/buildah.py
+@@ -20,13 +20,6 @@ class Buildah(Plugin, RedHatPlugin):
+     profiles = ('container',)
+ 
+     def setup(self):
+-        self.add_copy_spec([
+-            "/etc/containers/registries.conf",
+-            "/etc/containers/storage.conf",
+-            "/etc/containers/mounts.conf",
+-            "/etc/containers/policy.json",
+-        ])
+-
+         subcmds = [
+             'containers',
+             'containers --all',
+diff --git a/sos/plugins/containers_common.py b/sos/plugins/containers_common.py
+new file mode 100644
+index 00000000..99ae88fe
+--- /dev/null
++++ b/sos/plugins/containers_common.py
+@@ -0,0 +1,27 @@
++# Copyright (C) 2020 Red Hat, Inc., Pavel Moravec <pmoravec@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, UbuntuPlugin
++
++
++class ContainersCommon(Plugin, RedHatPlugin, UbuntuPlugin):
++
++    short_desc = 'Common container configs under {/etc,/usr/share}/containers'
++    plugin_name = 'containers_common'
++    profiles = ('container', )
++    packages = ('containers-common', )
++
++    def setup(self):
++        self.add_copy_spec([
++            '/etc/containers/*',
++            '/usr/share/containers/*',
++        ])
++
++# vim: set et ts=4 sw=4 :
+diff --git a/sos/plugins/podman.py b/sos/plugins/podman.py
+index f6875197..f6632776 100644
+--- a/sos/plugins/podman.py
++++ b/sos/plugins/podman.py
+@@ -27,13 +27,6 @@ class Podman(Plugin, RedHatPlugin, UbuntuPlugin):
+     ]
+ 
+     def setup(self):
+-        self.add_copy_spec([
+-            "/etc/containers/registries.conf",
+-            "/etc/containers/storage.conf",
+-            "/etc/containers/mounts.conf",
+-            "/etc/containers/policy.json",
+-        ])
+-
+         self.add_env_var([
+             'HTTP_PROXY',
+             'HTTPS_PROXY',
+-- 
+2.21.3
+
diff --git a/SOURCES/sos-bz1825283-env-host-in-container.patch b/SOURCES/sos-bz1825283-env-host-in-container.patch
new file mode 100644
index 0000000..4497123
--- /dev/null
+++ b/SOURCES/sos-bz1825283-env-host-in-container.patch
@@ -0,0 +1,33 @@
+From d9dd8ad790b6799491e4891ae19bb85124ab6794 Mon Sep 17 00:00:00 2001
+From: Robert Thomas Manes <robb.manes@gmail.com>
+Date: Fri, 17 Apr 2020 10:29:47 -0400
+Subject: [PATCH] [redhat] fix RH containers without sysroot Attempting to run
+ sosreport in a container currently will always traceback unless
+ ENV_HOST_SYSROOT is set to '/'.
+
+Allow default NoneType sysroot to function as well.
+
+Resolves: #2028
+
+Signed off by: Robb Manes <rmanes@redhat.com>
+Signed-off-by: Jake Hunsaker <jhunsake@redhat.com>
+---
+ sos/policies/redhat.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/sos/policies/redhat.py b/sos/policies/redhat.py
+index ba9bacf4..16cb23ec 100644
+--- a/sos/policies/redhat.py
++++ b/sos/policies/redhat.py
+@@ -144,7 +144,7 @@ class RedHatPolicy(LinuxPolicy):
+                 self._in_container = True
+         if ENV_HOST_SYSROOT in os.environ:
+             self._host_sysroot = os.environ[ENV_HOST_SYSROOT]
+-        use_sysroot = self._in_container and self._host_sysroot != '/'
++        use_sysroot = self._in_container and self._host_sysroot is not None
+         if use_sysroot:
+             host_tmp_dir = os.path.abspath(self._host_sysroot + self._tmp_dir)
+             self._tmp_dir = host_tmp_dir
+-- 
+2.21.3
+
diff --git a/SOURCES/sos-bz1838123-xdp-plugin.patch b/SOURCES/sos-bz1838123-xdp-plugin.patch
new file mode 100644
index 0000000..bd6b0a5
--- /dev/null
+++ b/SOURCES/sos-bz1838123-xdp-plugin.patch
@@ -0,0 +1,56 @@
+From af5597bfa41521e10f4ef5095f137b2ef5bcd661 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= <toke@redhat.com>
+Date: Wed, 20 May 2020 15:05:03 +0200
+Subject: [PATCH] [xdp] Add XDP plugin
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This adds a plugin for gathering information about the loaded XDP programs
+on a system, using the xdp-loader tool in the xdp-tools package. This is
+complementary with the existing eBPF plugin, because this plugin supports
+getting status for multiple XDP programs on each interface as supported by
+libxdp.
+
+For now, this just prints the output of 'xdp-loader status' which will list
+any XDP programs attached. We don't currently support structured
+output (such as JSON) from xdp-tools, but should we add that in the future
+we can of course update this plugin.
+
+Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
+Signed-off-by: Jake Hunsaker <jhunsake@redhat.com>
+---
+ sos/plugins/xdp.py | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+ create mode 100644 sos/plugins/xdp.py
+
+diff --git a/sos/plugins/xdp.py b/sos/plugins/xdp.py
+new file mode 100644
+index 00000000..2e18048b
+--- /dev/null
++++ b/sos/plugins/xdp.py
+@@ -0,0 +1,21 @@
++# 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 Xdp(Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin):
++
++    short_desc = 'XDP program information'
++    plugin_name = 'xdp'
++    profiles = ('system', 'kernel', 'network')
++    packages = ('xdp-tools',)
++
++    def setup(self):
++        self.add_cmd_output('xdp-loader status')
+-- 
+2.21.3
+
diff --git a/SPECS/sos.spec b/SPECS/sos.spec
index cf0b2c7..541081d 100644
--- a/SPECS/sos.spec
+++ b/SPECS/sos.spec
@@ -4,7 +4,7 @@
 
 Summary: A set of tools to gather troubleshooting information from a system
 Name: sos
-Version: 3.8
+Version: 3.9.1
 Release: 2%{?dist}
 Group: Applications/System
 Source0: https://github.com/sosreport/sos/archive/%{version}/sos-%{version}.tar.gz
@@ -20,19 +20,15 @@ Requires: bzip2
 Requires: xz
 Requires: python3-six
 Conflicts: vdsm < 4.40
-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
-Patch99: sos-3.8-centos-branding.patch
+Patch1: sos-bz1825283-env-host-in-container.patch
+Patch2: sos-bz1823488-containers-common.patch
+Patch3: sos-bz1819662-rabbitmqctl-on-foreground.patch
+Patch4: sos-bz1814867-insights-archive.patch
+Patch5: sos-bz1785546-nvmetcli.patch
+Patch6: sos-bz1776549-podman-buildah-rootless.patch
+Patch7: sos-bz1633006-iptables-kmods.patch
+Patch8: sos-bz1457191-navicli-noniteractively.patch
+Patch9: sos-bz1838123-xdp-plugin.patch
 
 %description
 Sos is a set of tools that gathers information about system
@@ -51,10 +47,6 @@ support technicians and developers.
 %patch7 -p1
 %patch8 -p1
 %patch9 -p1
-%patch10 -p1
-%patch11 -p1
-%patch12 -p1
-%patch99 -p1
 %setup -T -D -a1 -q
 
 %build
@@ -107,6 +99,36 @@ of the system.  Currently storage and filesystem commands are audited.
 %ghost /etc/audit/rules.d/40-sos-storage.rules
 
 %changelog
+* Wed May 27 2020 Pavel Moravec <pmoravec@redhat.com> = 3.9.1-2
+- Rebase on upstream 3.9
+  Resolves: bz1826656
+- [redhat] fix RH containers without sysroot Attempting to run
+  Resolves: bz1825283
+- [containers_common] Add plugin for common containers configs
+  Resolves: bz1823488
+- [rabbitmq] Call containerised rabbitmqctl report on
+  Resolves: bz1819662
+- [insights] collect insights-client dump
+  Resolves: bz1814867
+- [nvmetcli] Add new plugin for NVMe Target CLI
+  Resolves: bz1785546
+- [containers_common] collect rootless containers info
+  Resolves: bz1776549
+- [networking] collect iptables when proper kernel modules
+  Resolves: bz1633006
+- [navicli] replace interactive prompt by plugin option
+  Resolves: bz1457191
+- [xdp] Add XDP plugin
+  Resolves: bz1838123
+
+* Thu May 21 2020 Pavel Moravec <pmoravec@redhat.com> = 3.8-4
+- [container_log] fix unscoped 'logdir' variable
+  Resolves: bz1834421
+
+* Wed May 06 2020 Pavel Moravec <pmoravec@redhat.com> = 3.8-3
+- [containers_common] Add plugin for common containers configs
+  Resolves: bz1823488
+
 * Fri Jan 10 2020 Pavel Moravec <pmoravec@redhat.com> = 3.8-2
 - [plugins] improve heuristic for applying --since
   Resolves: bz1789049