diff --git a/.gitignore b/.gitignore index 8766018..ae69df5 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/sos-collector-1.7.tar.gz +SOURCES/sos-collector-1.8.tar.gz diff --git a/.sos-collector.metadata b/.sos-collector.metadata index 76bf747..7053a52 100644 --- a/.sos-collector.metadata +++ b/.sos-collector.metadata @@ -1 +1 @@ -5a4f3d843e90ac35af70c2da2e1b18a62df036c3 SOURCES/sos-collector-1.7.tar.gz +32b09cbab87d66d8b19f95db977c29f0fb828202 SOURCES/sos-collector-1.8.tar.gz diff --git a/SOURCES/sos-collector-nested-container-fix.patch b/SOURCES/sos-collector-nested-container-fix.patch deleted file mode 100644 index 0c33ae7..0000000 --- a/SOURCES/sos-collector-nested-container-fix.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 0bc831a07be6ae837cb9029943c57255c47b647f Mon Sep 17 00:00:00 2001 -From: Jake Hunsaker -Date: Tue, 9 Apr 2019 12:59:03 -0400 -Subject: [PATCH] [sosnode] Don't create a container if we're in a container - -If sos-collector is being launched from a container on a containerized -host, we could potentially attempt to create a nested container. - -This change means we treat a sos-collector run that is already in a -container as a "normal" host and don't attempt the containerized bits. - -Signed-off-by: Jake Hunsaker ---- - soscollector/sosnode.py | 19 ++++++++++++++++++- - 1 file changed, 18 insertions(+), 1 deletion(-) - -diff --git a/soscollector/sosnode.py b/soscollector/sosnode.py -index a040244..405d05d 100644 ---- a/soscollector/sosnode.py -+++ b/soscollector/sosnode.py -@@ -68,10 +68,14 @@ class SosNode(): - self.connected = False - self.close_ssh_session() - return None -+ if self.local: -+ if self.check_in_container(): -+ self.host.containerized = False - self.log_debug("Host facts found to be %s" % - self.host.report_facts()) - self.get_hostname() -- self.create_sos_container() -+ if self.host.containerized: -+ self.create_sos_container() - self._load_sos_info() - - def _create_ssh_command(self): -@@ -84,6 +88,19 @@ class SosNode(): - return '{:<{}} : {}'.format(self._hostname, self.config['hostlen'] + 1, - msg) - -+ def check_in_container(self): -+ ''' -+ Tries to identify if we are currently running in a container or not. -+ ''' -+ if os.path.exists('/run/.containerenv'): -+ self.log_debug('Found /run/.containerenv. Running in container.') -+ return True -+ if os.environ.get('container') is not None: -+ self.log_debug("Found env var 'container'. Running in container") -+ return True -+ return False -+ -+ - def create_sos_container(self): - '''If the host is containerized, create the container we'll be using - ''' --- -2.17.2 - diff --git a/SOURCES/sos-collector-none-cluster-fix.patch b/SOURCES/sos-collector-none-cluster-fix.patch deleted file mode 100644 index 8b7725e..0000000 --- a/SOURCES/sos-collector-none-cluster-fix.patch +++ /dev/null @@ -1,30 +0,0 @@ -From a614ed8e5621f931d8ee76f1f59747a46144cb2d Mon Sep 17 00:00:00 2001 -From: Jake Hunsaker -Date: Thu, 4 Apr 2019 14:19:13 -0400 -Subject: [PATCH] [jbon] Fix typo in check_enabled() - -Fixes a typo in the check_enabled() method that could potentially -prevent sos-collector from correctly determining the cluster type on -python3 under certain circumstances. - -Signed-off-by: Jake Hunsaker ---- - soscollector/clusters/jbon.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/soscollector/clusters/jbon.py b/soscollector/clusters/jbon.py -index 28552ff..ea85ddf 100644 ---- a/soscollector/clusters/jbon.py -+++ b/soscollector/clusters/jbon.py -@@ -28,7 +28,7 @@ class jbon(Cluster): - def get_nodes(self): - return [] - -- def checK_enabled(self): -+ def check_enabled(self): - # This should never be called, but as insurance explicitly never - # allow this to be enabled via the determine_cluster() path - return False --- -2.17.2 - diff --git a/SOURCES/sos-collector-old-pexpect.patch b/SOURCES/sos-collector-old-pexpect.patch index 93f5d92..97bf47d 100644 --- a/SOURCES/sos-collector-old-pexpect.patch +++ b/SOURCES/sos-collector-old-pexpect.patch @@ -2,18 +2,16 @@ diff --git a/soscollector/sosnode.py b/soscollector/sosnode.py index 3aba0bf..ff130ba 100644 --- a/soscollector/sosnode.py +++ b/soscollector/sosnode.py -@@ -364,7 +364,9 @@ class SosNode(): - get_pty = True - if not self.local and not force_local: - cmd = "%s %s" % (self.ssh_cmd, quote(cmd)) +@@ -370,7 +370,7 @@ + else: + if get_pty: + cmd = "/bin/bash -c %s" % quote(cmd) - res = pexpect.spawn(cmd, encoding='utf-8') -+ else: -+ cmd = "%s %s" % ('/bin/bash -c', quote(cmd)) + res = pexpect.spawn(cmd) if need_root: if self.config['need_sudo']: res.sendline(self.config['sudo_pw']) -@@ -432,7 +434,7 @@ class SosNode(): +@@ -438,7 +438,7 @@ self.control_path, self.config['ssh_user'], self.address)) @@ -22,3 +20,4 @@ index 3aba0bf..ff130ba 100644 connect_expects = [ u'Connected', + diff --git a/SOURCES/sos-collector-rhcos-image.patch b/SOURCES/sos-collector-rhcos-image.patch deleted file mode 100644 index 2640115..0000000 --- a/SOURCES/sos-collector-rhcos-image.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 6dafb42064b06a80720c6017e2576aea9a7211de Mon Sep 17 00:00:00 2001 -From: Jake Hunsaker -Date: Tue, 9 Apr 2019 13:00:44 -0400 -Subject: [PATCH] [redhat] Update RHCOS image - -Updates the image used by RHCOS nodes to be the rhel8 image instead -of rhel7. - -Signed-off-by: Jake Hunsaker ---- - soscollector/hosts/redhat.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/soscollector/hosts/redhat.py b/soscollector/hosts/redhat.py -index 33cec1f..774ecec 100644 ---- a/soscollector/hosts/redhat.py -+++ b/soscollector/hosts/redhat.py -@@ -66,7 +66,7 @@ class RedHatCoreOSHost(RedHatHost): - - containerized = True - container_runtime = 'podman' -- container_image = 'registry.redhat.io/rhel7/support-tools' -+ container_image = 'registry.redhat.io/rhel8/support-tools' - sos_path_strip = '/host' - - def check_enabled(self, rel_string): --- -2.17.2 - diff --git a/SOURCES/sos-collector-rhhiv-profile.patch b/SOURCES/sos-collector-rhhiv-profile.patch deleted file mode 100644 index 8a65aa9..0000000 --- a/SOURCES/sos-collector-rhhiv-profile.patch +++ /dev/null @@ -1,234 +0,0 @@ -From fb8c2af36672b5868f504bae0704392f9e9b44a5 Mon Sep 17 00:00:00 2001 -From: Jake Hunsaker -Date: Fri, 12 Apr 2019 14:45:01 -0400 -Subject: [PATCH 1/3] [clusters] Add a cluster_name class member for better - identification - -Adds a cluster_name class member to Cluster() so that clusters may -specify a well-defined name beyond the name/acronym used to enable the -cluster manually. - -Signed-off-by: Jake Hunsaker ---- - soscollector/clusters/__init__.py | 9 +++++++++ - soscollector/sos_collector.py | 3 +-- - soscollector/sosnode.py | 1 - - 3 files changed, 10 insertions(+), 3 deletions(-) - -diff --git a/soscollector/clusters/__init__.py b/soscollector/clusters/__init__.py -index b9d2418..c1bd360 100644 ---- a/soscollector/clusters/__init__.py -+++ b/soscollector/clusters/__init__.py -@@ -26,6 +26,7 @@ class Cluster(object): - sos_plugins = [] - sos_plugin_options = {} - sos_preset = '' -+ cluster_name = None - - def __init__(self, config): - '''This is the class that cluster profile should subclass in order to -@@ -50,6 +51,14 @@ class Cluster(object): - self.options = [] - self._get_options() - -+ @classmethod -+ def name(cls): -+ '''Returns the cluster's name as a string. -+ ''' -+ if cls.cluster_name: -+ return cls.cluster_name -+ return cls.__name__.lower() -+ - def _get_options(self): - '''Loads the options defined by a cluster and sets the default value''' - for opt in self.option_list: -diff --git a/soscollector/sos_collector.py b/soscollector/sos_collector.py -index fee48ab..54410a2 100644 ---- a/soscollector/sos_collector.py -+++ b/soscollector/sos_collector.py -@@ -554,8 +554,7 @@ this utility or remote systems that it connects to. - break - - self.config['cluster'] = cluster -- name = str(cluster.__class__.__name__).lower() -- self.config['cluster_type'] = name -+ self.config['cluster_type'] = cluster.name() - self.log_info( - 'Cluster type set to %s' % self.config['cluster_type']) - break -diff --git a/soscollector/sosnode.py b/soscollector/sosnode.py -index 405d05d..3aba0bf 100644 ---- a/soscollector/sosnode.py -+++ b/soscollector/sosnode.py -@@ -100,7 +100,6 @@ class SosNode(): - return True - return False - -- - def create_sos_container(self): - '''If the host is containerized, create the container we'll be using - ''' --- -2.17.2 - - -From 8d94e9ee9162c1b7676822958a94dfcd727d6dc8 Mon Sep 17 00:00:00 2001 -From: Jake Hunsaker -Date: Fri, 12 Apr 2019 14:47:31 -0400 -Subject: [PATCH 2/3] [clusters] Add cluster_name where appropriate - -Adds a cluster_name to a few of the existing cluster profiles. - -Signed-off-by: Jake Hunsaker ---- - soscollector/clusters/kubernetes.py | 1 + - soscollector/clusters/ovirt.py | 2 ++ - 2 files changed, 3 insertions(+) - -diff --git a/soscollector/clusters/kubernetes.py b/soscollector/clusters/kubernetes.py -index c5c2094..e18ee71 100644 ---- a/soscollector/clusters/kubernetes.py -+++ b/soscollector/clusters/kubernetes.py -@@ -52,6 +52,7 @@ class kubernetes(Cluster): - - class openshift(kubernetes): - -+ cluster_name = 'OpenShift Container Platform' - packages = ('atomic-openshift',) - sos_preset = 'ocp' - cmd = 'oc' -diff --git a/soscollector/clusters/ovirt.py b/soscollector/clusters/ovirt.py -index 0a074ca..18cbf2e 100644 ---- a/soscollector/clusters/ovirt.py -+++ b/soscollector/clusters/ovirt.py -@@ -23,6 +23,7 @@ from getpass import getpass - - class ovirt(Cluster): - -+ cluster_name = 'oVirt' - packages = ('ovirt-engine',) - - option_list = [ -@@ -122,6 +123,7 @@ class ovirt(Cluster): - - class rhv(ovirt): - -+ cluster_name = 'Red Hat Virtualization' - packages = ('rhevm', 'rhvm') - sos_preset = 'rhv' - --- -2.17.2 - - -From 4606699e9a460ebd6345444ae915ff8384619ed3 Mon Sep 17 00:00:00 2001 -From: Jake Hunsaker -Date: Tue, 16 Apr 2019 15:41:33 -0400 -Subject: [PATCH 3/3] [ovirt] Add RHHI-V support - -Adds support for RHHI-V environments which are RHV environments that -also use the hypervisors as gluster nodes. The new 'rhhi_virt' cluster -profile will be enabled when sos-collector is run against an environment -that is _both_ RHV and has nodes listed in the 'gluster_server' table in -the RHV database. Note that this means if community oVirt is in use, the -gluster bits enabled by 'rhhi_virt' will not be enabled for the oVirt -cluster type. - -Included with this change is making DB queries more programmatic, and -making minor stylistic changes to the main query used by get_nodes() to -allow easier reading of the SQL query being built. - -Finally, remove an unused import of getpass. - -Resolves: #21 - -Signed-off-by: Jake Hunsaker ---- - soscollector/clusters/ovirt.py | 44 ++++++++++++++++++++++++++-------- - 1 file changed, 34 insertions(+), 10 deletions(-) - -diff --git a/soscollector/clusters/ovirt.py b/soscollector/clusters/ovirt.py -index 18cbf2e..8697d2e 100644 ---- a/soscollector/clusters/ovirt.py -+++ b/soscollector/clusters/ovirt.py -@@ -18,13 +18,13 @@ import fnmatch - - from pipes import quote - from soscollector.clusters import Cluster --from getpass import getpass - - - class ovirt(Cluster): - -- cluster_name = 'oVirt' -+ cluster_name = 'Community oVirt' - packages = ('ovirt-engine',) -+ db_exec = '/usr/share/ovirt-engine/dbscripts/engine-psql.sh -c' - - option_list = [ - ('no-database', False, 'Do not collect a database dump'), -@@ -33,6 +33,14 @@ class ovirt(Cluster): - ('no-hypervisors', False, 'Do not collect from hypervisors') - ] - -+ def _run_db_query(self, query): -+ ''' -+ Wrapper for running DB queries on the master. Any scrubbing of the -+ query should be done _before_ passing the query to this method. -+ ''' -+ cmd = "%s %s" % (self.db_exec, quote(query)) -+ return self.exec_master_cmd(cmd, need_root=True) -+ - def _sql_scrub(self, val): - ''' - Manually sanitize SQL queries since we can't leave this up to the -@@ -58,18 +66,16 @@ class ovirt(Cluster): - def format_db_cmd(self): - cluster = self._sql_scrub(self.get_option('cluster')) - datacenter = self._sql_scrub(self.get_option('datacenter')) -- query = ("select host_name from vds_static where cluster_id in " -- "(select cluster_id from cluster where name like '%s'" -- " and storage_pool_id in (select id from storage_pool " -- "where name like '%s'))" % (cluster, datacenter)) -- self.dbcmd = ('/usr/share/ovirt-engine/dbscripts/engine-psql.sh ' -- '-c {}'.format(quote(query))) -- self.log_debug('Query command for ovirt DB set to: %s' % self.dbcmd) -+ self.dbquery = ("SELECT host_name from vds_static where cluster_id in " -+ "(select cluster_id FROM cluster WHERE name like '%s'" -+ " and storage_pool_id in (SELECT id FROM storage_pool " -+ "WHERE name like '%s'))" % (cluster, datacenter)) -+ self.log_debug('Query command for ovirt DB set to: %s' % self.dbquery) - - def get_nodes(self): - if self.get_option('no-hypervisors'): - return [] -- res = self.exec_master_cmd(self.dbcmd, need_root=True) -+ res = self._run_db_query(self.dbquery) - if res['status'] == 0: - nodes = res['stdout'].splitlines()[2:-1] - return [n.split('(')[0].strip() for n in nodes] -@@ -134,3 +140,21 @@ class rhv(ovirt): - return 'rhvh' - else: - return 'rhelh' -+ -+ -+class rhhi_virt(rhv): -+ -+ cluster_name = 'Red Hat Hyperconverged Infrastructure - Virtualization' -+ sos_plugins = ('gluster',) -+ sos_plugin_options = {'gluster.dump': 'on'} -+ sos_preset = 'rhv' -+ -+ def check_enabled(self): -+ return (self.master.is_installed('rhvm') and self._check_for_rhhiv()) -+ -+ def _check_for_rhhiv(self): -+ ret = self._run_db_query('SELECT count(server_id) FROM gluster_server') -+ if ret['status'] == 0: -+ # if there are any entries in this table, RHHI-V is in use -+ return ret['stdout'].splitlines()[2].strip() != '0' -+ return False --- -2.17.2 - diff --git a/SOURCES/sos-collector-setuptools-fix.patch b/SOURCES/sos-collector-setuptools-fix.patch new file mode 100644 index 0000000..cd5a890 --- /dev/null +++ b/SOURCES/sos-collector-setuptools-fix.patch @@ -0,0 +1,12 @@ +diff --git a/setup.py b/setup.py +index 407ff65..b4679c0 100644 +--- a/setup.py ++++ b/setup.py +@@ -23,6 +23,5 @@ setup( + packages=find_packages(), + scripts=['sos-collector'], + data_files=[ +- ('share/licenses/sos-collector', ['LICENSE']), + ('share/man/man1/', ['man/en/sos-collector.1']) + ]) + diff --git a/SOURCES/sos-collector-setuptools.patch b/SOURCES/sos-collector-setuptools.patch deleted file mode 100644 index f661895..0000000 --- a/SOURCES/sos-collector-setuptools.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/setup.py b/setup.py -index 407ff65..9399865 100644 ---- a/setup.py -+++ b/setup.py -@@ -23,6 +23,7 @@ setup( - packages=find_packages(), - scripts=['sos-collector'], - data_files=[ -- ('share/licenses/sos-collector', ['LICENSE']), -+ # Workaround setuptools difference between upstream & RHEL -+ # ('share/licenses/sos-collector', ['LICENSE']), - ('share/man/man1/', ['man/en/sos-collector.1']) - ]) diff --git a/SOURCES/sos-collector-temp-location.patch b/SOURCES/sos-collector-temp-location.patch new file mode 100644 index 0000000..01b7a5c --- /dev/null +++ b/SOURCES/sos-collector-temp-location.patch @@ -0,0 +1,76 @@ +From ac9a24c90cdbaca79951854da1f37d8a10ac8cb9 Mon Sep 17 00:00:00 2001 +From: Jake Hunsaker +Date: Thu, 3 Oct 2019 11:58:04 -0400 +Subject: [PATCH 1/2] [soscollector] Enable --all-logs option + +The --all-logs option, while exposed via sos-collector, was not actually +being passed to sosreport on the remote nodes. + +Now --all-logs is properly passed to sosreport as intended. + +Signed-off-by: Jake Hunsaker +--- + soscollector/sos_collector.py | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/soscollector/sos_collector.py b/soscollector/sos_collector.py +index 19dc368..55cd0ae 100644 +--- a/soscollector/sos_collector.py ++++ b/soscollector/sos_collector.py +@@ -502,6 +502,8 @@ this utility or remote systems that it connects to. + quote(self.config['case_id'])) + if self.config['alloptions']: + self.config['sos_cmd'] += ' --alloptions' ++ if self.config['all_logs']: ++ self.config['sos_cmd'] += ' --all-logs' + if self.config['verify']: + self.config['sos_cmd'] += ' --verify' + if self.config['log_size']: +-- +2.21.0 + + +From 0f599189909a6f07e148e68aeee7048c12808e37 Mon Sep 17 00:00:00 2001 +From: Jake Hunsaker +Date: Thu, 3 Oct 2019 11:54:18 -0400 +Subject: [PATCH 2/2] [soscollector] Revert temp directory to /var/tmp + +A previous commit inadvertantly changed the default temp directory to be +created under /tmp instead of /var/tmp. This commit fixes that and +returns the default location to /var/tmp. + +Signed-off-by: Jake Hunsaker +--- + soscollector/configuration.py | 2 +- + soscollector/sos_collector.py | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/soscollector/configuration.py b/soscollector/configuration.py +index 1c8baa1..c6f1ce3 100644 +--- a/soscollector/configuration.py ++++ b/soscollector/configuration.py +@@ -45,7 +45,7 @@ class Configuration(dict): + self['ssh_key'] = None + self['sos_cmd'] = 'sosreport --batch' + self['no_local'] = False +- self['tmp_dir'] = None ++ self['tmp_dir'] = '/var/tmp' + self['out_dir'] = '/var/tmp/' + self['nodes'] = [] + self['debug'] = False +diff --git a/soscollector/sos_collector.py b/soscollector/sos_collector.py +index 55cd0ae..93048d9 100644 +--- a/soscollector/sos_collector.py ++++ b/soscollector/sos_collector.py +@@ -209,7 +209,7 @@ class SosCollector(): + if self.config['verbose']: + self.console.debug(msg) + +- def create_tmp_dir(self, location='/tmp'): ++ def create_tmp_dir(self, location='/var/tmp'): + '''Creates a temp directory to transfer sosreports to''' + tmpdir = tempfile.mkdtemp(prefix='sos-collector-', dir=location) + self.config['tmp_dir'] = tmpdir +-- +2.21.0 + diff --git a/SPECS/sos-collector.spec b/SPECS/sos-collector.spec index 4e4434c..cb15c3e 100644 --- a/SPECS/sos-collector.spec +++ b/SPECS/sos-collector.spec @@ -1,7 +1,7 @@ Summary: Capture sosreports from multiple nodes simultaneously Name: sos-collector -Version: 1.7 -Release: 5%{?dist} +Version: 1.8 +Release: 2%{?dist} Source0: http://people.redhat.com/jhunsake/sos-collector/%{name}-%{version}.tar.gz License: GPLv2 BuildArch: noarch @@ -10,12 +10,9 @@ Requires: sos >= 3.0 Obsoletes: clustersos < 1.2.2-2 Provides: clustersos = %{version}-%{release} -Patch0: sos-collector-setuptools.patch +Patch0: sos-collector-setuptools-fix.patch Patch1: sos-collector-old-pexpect.patch -Patch2: sos-collector-none-cluster-fix.patch -Patch3: sos-collector-nested-container-fix.patch -Patch4: sos-collector-rhcos-image.patch -Patch5: sos-collector-rhhiv-profile.patch +Patch2: sos-collector-temp-location.patch %if 0%{?rhel} == 7 BuildRequires: python-devel @@ -41,9 +38,6 @@ is run on the nodes. %patch0 -p1 %patch1 -p1 %patch2 -p1 -%patch3 -p1 -%patch4 -p1 -%patch5 -p1 %build %if 0%{?rhel} == 7 @@ -82,6 +76,10 @@ install -p -m644 man/en/sos-collector.1 ${RPM_BUILD_ROOT}%{_mandir}/man1/ %doc LICENSE %changelog +* Tue Apr 21 2020 Jake Hunsaker - 1.8-2 +- Rebase to upstream 1.8 +- Resolves RHBZ#1747351 + * Wed May 15 2019 Jake Hunsaker - 1.7-5 - Add missing local fixes for older pexpect versions