Server IP : 192.64.112.168 / Your IP : 18.118.252.215 Web Server : Apache System : Linux nc-ph-2300-85.bluforrest.com 4.18.0-513.9.1.el8_9.x86_64 #1 SMP Sat Dec 2 05:23:44 EST 2023 x86_64 User : expressoneac ( 1128) PHP Version : 8.0.30 Disable Function : exec,passthru,shell_exec,system MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /lib/python3.6/site-packages/sos/report/plugins/ |
Upload File : |
# 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. import re from datetime import datetime, timedelta from sos.report.plugins import (Plugin, RedHatPlugin, DebianPlugin, UbuntuPlugin, PluginOpt) from sos.utilities import sos_parse_version class Pacemaker(Plugin): short_desc = 'Pacemaker high-availability cluster resource manager' plugin_name = "pacemaker" profiles = ("cluster", ) packages = ( "pacemaker", "pacemaker-remote", ) option_list = [ PluginOpt('crm-from', default='', val_type=str, desc='specfiy the start time for crm_report'), PluginOpt('crm-scrub', default=True, desc='enable crm_report password scrubbing') ] envfile = "" def setup_crm_mon(self): """ Get cluster summary """ self.add_cmd_output("crm_mon -1 -A -n -r -t") def setup_crm_shell(self): """ Get cluster status and configuration """ self.add_cmd_output([ "crm status", "crm configure show", ]) def setup_pcs(self): """ Get pacemaker/corosync configuration """ pcs_pkg = self.policy.package_manager.pkg_by_name('pcs') if pcs_pkg is None: return self.add_copy_spec("/var/log/pcsd/pcsd.log") self.add_cmd_output([ "pcs stonith sbd status --full", "pcs stonith sbd watchdog list", "pcs stonith history show", ]) pcs_version = '.'.join(pcs_pkg['version']) if sos_parse_version(pcs_version) > sos_parse_version('0.10.8'): self.add_cmd_output("pcs property config --all") else: self.add_cmd_output("pcs property list --all") self.add_cmd_output("pcs config", tags="pcs_config") self.add_cmd_output("pcs quorum status", tags="pcs_quorum_status") self.add_cmd_output("pcs status --full", tags="pcs_status") def postproc_crm_shell(self): """ Clear password """ self.do_cmd_output_sub( "crm configure show", r"passw([^\s=]*)=\S+", r"passw\1=********" ) def postproc_pcs(self): """ Clear password """ self.do_cmd_output_sub( "pcs config", r"passw([^\s=]*)=\S+", r"passw\1=********" ) def setup(self): self.add_copy_spec([ # Pacemaker 2.x default log locations "/var/log/pacemaker/pacemaker.log*", "/var/log/pacemaker/bundles/*/", "/var/log/pacemaker/pengine*", # Pacemaker 1.x default log locations "/var/log/pacemaker.log", "/var/log/pacemaker/bundles/*/", # Common user-specified locations "/var/log/cluster/pacemaker.log*", "/var/log/cluster/bundles/*/", ]) self.setup_crm_mon() # crm_report needs to be given a --from "YYYY-MM-DD HH:MM:SS" start # time in order to collect data. crm_from = (datetime.today() - timedelta(hours=72)).strftime("%Y-%m-%d %H:%m:%S") if self.get_option("crm-from"): if re.match(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}', str(self.get_option("crm-from"))): crm_from = self.get_option("crm-from") else: self._log_error( f"crm_from parameter '{self.get_option('crm-from')}' is " "not a valid date: using default") crm_dest = self.get_cmd_output_path(name="crm_report", make=False) if self.get_option("crm-scrub"): crm_scrub = '-p "passw.*"' else: crm_scrub = "" self._log_warn("scrubbing of crm passwords has been disabled:") self._log_warn("data collected by crm_report may contain" " sensitive values.") self.add_cmd_output(f'crm_report --sos-mode {crm_scrub} -S -d ' f' --dest {crm_dest} --from "{crm_from}"', chroot=self.tmp_in_sysroot()) # collect user-defined logfiles, matching a shell-style syntax: # PCMK_logfile=filename # specified in the pacemaker start-up environment file. pattern = r'^\s*PCMK_logfile=[\'\"]?(\S+)[\'\"]?\s*(\s#.*)?$' if self.path_isfile(self.envfile): self.add_copy_spec(self.envfile) with open(self.envfile, 'r', encoding='UTF-8') as file: for line in file: if re.match(pattern, line): # remove trailing and leading quote marks, in case the # line is e.g. PCMK_logfile="/var/log/pacemaker.log" logfile = re.search(pattern, line).group(1) for regexp in [r'^"', r'"$', r'^\'', r'\'$']: logfile = re.sub(regexp, '', logfile) self.add_copy_spec(logfile) class DebianPacemaker(Pacemaker, DebianPlugin, UbuntuPlugin): def setup(self): self.envfile = self.path_join("/etc/default/pacemaker") self.setup_crm_shell() self.setup_pcs() super().setup() def postproc(self): self.postproc_crm_shell() self.postproc_pcs() class RedHatPacemaker(Pacemaker, RedHatPlugin): def setup(self): self.envfile = self.path_join("/etc/sysconfig/pacemaker") self.setup_pcs() self.add_copy_spec("/etc/sysconfig/sbd") super().setup() def postproc(self): self.postproc_pcs() # vim: et ts=4 sw=4