| Backport patch to fix interpreter of sss_analyze. |
| |
| Upstream-Status: Backport [https://github.com/SSSD/sssd/commit/ed3726c] |
| |
| Signed-off-by: Kai Kang <kai.kang@windriver.com> |
| |
| From ed3726c37fe07aab788404bfa2f9003db15f4210 Mon Sep 17 00:00:00 2001 |
| From: roy214 <abroy@redhat.com> |
| Date: Tue, 25 Apr 2023 20:01:24 +0530 |
| Subject: [PATCH] sssctl: add error analyzer |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| Also removing unused variable and import. |
| |
| Reviewed-by: Justin Stephenson <jstephen@redhat.com> |
| Reviewed-by: Tomรกลก Halman <thalman@redhat.com> |
| --- |
| src/tools/analyzer/Makefile.am | 2 + |
| src/tools/analyzer/modules/error.py | 61 +++++++++++++++++++++++++++ |
| src/tools/analyzer/modules/request.py | 54 +++++------------------- |
| src/tools/analyzer/sss_analyze | 2 +- |
| src/tools/analyzer/sss_analyze.py | 3 ++ |
| src/tools/analyzer/util.py | 44 +++++++++++++++++++ |
| 6 files changed, 121 insertions(+), 45 deletions(-) |
| create mode 100644 src/tools/analyzer/modules/error.py |
| create mode 100644 src/tools/analyzer/util.py |
| |
| diff --git a/src/tools/analyzer/Makefile.am b/src/tools/analyzer/Makefile.am |
| index b40043d043..7692af8528 100644 |
| --- a/src/tools/analyzer/Makefile.am |
| +++ b/src/tools/analyzer/Makefile.am |
| @@ -13,10 +13,12 @@ dist_pkgpython_DATA = \ |
| source_reader.py \ |
| parser.py \ |
| sss_analyze.py \ |
| + util.py \ |
| $(NULL) |
| |
| modulesdir = $(pkgpythondir)/modules |
| dist_modules_DATA = \ |
| modules/__init__.py \ |
| modules/request.py \ |
| + modules/error.py \ |
| $(NULL) |
| diff --git a/src/tools/analyzer/modules/error.py b/src/tools/analyzer/modules/error.py |
| new file mode 100644 |
| index 0000000000..71173670c5 |
| --- /dev/null |
| +++ b/src/tools/analyzer/modules/error.py |
| @@ -0,0 +1,61 @@ |
| +from sssd import util |
| +from sssd.parser import SubparsersAction |
| +from sssd import sss_analyze |
| + |
| +class ErrorAnalyzer: |
| + """ |
| + An error analyzer module, list if there is any error reported by sssd_be |
| + """ |
| + module_parser = None |
| + print_opts = [] |
| + |
| + def print_module_help(self, args): |
| + """ |
| + Print the module parser help output |
| + |
| + Args: |
| + args (Namespace): argparse parsed arguments |
| + """ |
| + self.module_parser.print_help() |
| + |
| + def setup_args(self, parser_grp, cli): |
| + """ |
| + Setup module parser, subcommands, and options |
| + |
| + Args: |
| + parser_grp (argparse.Action): Parser group to nest |
| + module and subcommands under |
| + """ |
| + desc = "Analyze error check module" |
| + self.module_parser = parser_grp.add_parser('error', |
| + description=desc, |
| + help='Error checker') |
| + |
| + subparser = self.module_parser.add_subparsers(title=None, |
| + dest='subparser', |
| + action=SubparsersAction, |
| + metavar='COMMANDS') |
| + |
| + subcmd_grp = subparser.add_parser_group('Operation Modes') |
| + cli.add_subcommand(subcmd_grp, 'list', 'Print error messages found in backend', |
| + self.print_error, self.print_opts) |
| + |
| + self.module_parser.set_defaults(func=self.print_module_help) |
| + |
| + return self.module_parser |
| + |
| + def print_error(self, args): |
| + err = 0 |
| + utl = util.Utils() |
| + source = utl.load(args) |
| + component = source.Component.BE |
| + source.set_component(component, False) |
| + patterns = ['sdap_async_sys_connect request failed', 'terminated by own WATCHDOG', |
| + 'ldap_sasl_interactive_bind_s failed', 'Communication with KDC timed out', 'SSSD is offline', 'Backend is offline', |
| + 'tsig verify failure', 'ldap_install_tls failed', 's2n exop request failed'] |
| + for line in utl.matched_line(source, patterns): |
| + err +=1 |
| + print(line) |
| + if err > 0: |
| + print("For possible solutions please refer to https://sssd.io/troubleshooting/errors.html") |
| + return |
| diff --git a/src/tools/analyzer/modules/request.py b/src/tools/analyzer/modules/request.py |
| index d661dddb84..e4d5f060c7 100644 |
| --- a/src/tools/analyzer/modules/request.py |
| +++ b/src/tools/analyzer/modules/request.py |
| @@ -1,6 +1,6 @@ |
| import re |
| import logging |
| - |
| +from sssd import util |
| from sssd.parser import SubparsersAction |
| from sssd.parser import Option |
| |
| @@ -38,7 +38,6 @@ def print_module_help(self, args): |
| def setup_args(self, parser_grp, cli): |
| """ |
| Setup module parser, subcommands, and options |
| - |
| Args: |
| parser_grp (argparse.Action): Parser group to nest |
| module and subcommands under |
| @@ -63,42 +62,6 @@ def setup_args(self, parser_grp, cli): |
| |
| return self.module_parser |
| |
| - def load(self, args): |
| - """ |
| - Load the appropriate source reader. |
| - |
| - Args: |
| - args (Namespace): argparse parsed arguments |
| - |
| - Returns: |
| - Instantiated source object |
| - """ |
| - if args.source == "journald": |
| - from sssd.source_journald import Journald |
| - source = Journald() |
| - else: |
| - from sssd.source_files import Files |
| - source = Files(args.logdir) |
| - return source |
| - |
| - def matched_line(self, source, patterns): |
| - """ |
| - Yield lines which match any number of patterns (OR) in |
| - provided patterns list. |
| - |
| - Args: |
| - source (Reader): source Reader object |
| - Yields: |
| - lines matching the provided pattern(s) |
| - """ |
| - for line in source: |
| - for pattern in patterns: |
| - re_obj = re.compile(pattern) |
| - if re_obj.search(line): |
| - if line.startswith(' * '): |
| - continue |
| - yield line |
| - |
| def get_linked_ids(self, source, pattern, regex): |
| """ |
| Retrieve list of associated REQ_TRACE ids. Filter |
| @@ -114,8 +77,9 @@ def get_linked_ids(self, source, pattern, regex): |
| Returns: |
| List of linked ids discovered |
| """ |
| + utl = util.Utils() |
| linked_ids = [] |
| - for match in self.matched_line(source, pattern): |
| + for match in utl.matched_line(source, pattern): |
| id_re = re.compile(regex) |
| match = id_re.search(match) |
| if match: |
| @@ -250,7 +214,8 @@ def list_requests(self, args): |
| Args: |
| args (Namespace): populated argparse namespace |
| """ |
| - source = self.load(args) |
| + utl = util.Utils() |
| + source = utl.load(args) |
| component = source.Component.NSS |
| resp = "nss" |
| # Log messages matching the following regex patterns contain |
| @@ -266,7 +231,7 @@ def list_requests(self, args): |
| if args.verbose: |
| self.print_formatted_verbose(source) |
| else: |
| - for line in self.matched_line(source, patterns): |
| + for line in utl.matched_line(source, patterns): |
| if type(source).__name__ == 'Journald': |
| print(line) |
| else: |
| @@ -279,7 +244,8 @@ def track_request(self, args): |
| Args: |
| args (Namespace): populated argparse namespace |
| """ |
| - source = self.load(args) |
| + utl = util.Utils() |
| + source = utl.load(args) |
| cid = args.cid |
| resp_results = False |
| be_results = False |
| @@ -294,7 +260,7 @@ def track_request(self, args): |
| logger.info(f"******** Checking {resp} responder for Client ID" |
| f" {cid} *******") |
| source.set_component(component, args.child) |
| - for match in self.matched_line(source, pattern): |
| + for match in utl.matched_line(source, pattern): |
| resp_results = self.consume_line(match, source, args.merge) |
| |
| logger.info(f"********* Checking Backend for Client ID {cid} ********") |
| @@ -307,7 +273,7 @@ def track_request(self, args): |
| pattern.clear() |
| [pattern.append(f'\\{id}') for id in be_ids] |
| |
| - for match in self.matched_line(source, pattern): |
| + for match in utl.matched_line(source, pattern): |
| be_results = self.consume_line(match, source, args.merge) |
| |
| if args.merge: |
| diff --git a/src/tools/analyzer/sss_analyze b/src/tools/analyzer/sss_analyze |
| index 3f1beaf38b..6d4b5b30c6 100755 |
| --- a/src/tools/analyzer/sss_analyze |
| +++ b/src/tools/analyzer/sss_analyze |
| @@ -1,4 +1,4 @@ |
| -#!/usr/bin/env python |
| +#!/usr/bin/env python3 |
| |
| from sssd import sss_analyze |
| |
| diff --git a/src/tools/analyzer/sss_analyze.py b/src/tools/analyzer/sss_analyze.py |
| index 18b998f380..dafc84fc03 100644 |
| --- a/src/tools/analyzer/sss_analyze.py |
| +++ b/src/tools/analyzer/sss_analyze.py |
| @@ -1,6 +1,7 @@ |
| import argparse |
| |
| from sssd.modules import request |
| +from sssd.modules import error |
| from sssd.parser import SubparsersAction |
| |
| |
| @@ -55,9 +56,11 @@ def load_modules(self, parser, parser_grp): |
| """ |
| # Currently only the 'request' module exists |
| req = request.RequestAnalyzer() |
| + err = error.ErrorAnalyzer() |
| cli = Analyzer() |
| |
| req.setup_args(parser_grp, cli) |
| + err.setup_args(parser_grp, cli) |
| |
| def setup_args(self): |
| """ |
| diff --git a/src/tools/analyzer/util.py b/src/tools/analyzer/util.py |
| new file mode 100644 |
| index 0000000000..2a8d153a71 |
| --- /dev/null |
| +++ b/src/tools/analyzer/util.py |
| @@ -0,0 +1,44 @@ |
| +import re |
| +import logging |
| + |
| +from sssd.source_files import Files |
| +from sssd.source_journald import Journald |
| + |
| +logger = logging.getLogger() |
| + |
| + |
| +class Utils: |
| + |
| + def load(self, args): |
| + """ |
| + Load the appropriate source reader. |
| + |
| + Args: |
| + args (Namespace): argparse parsed arguments |
| + |
| + Returns: |
| + Instantiated source object |
| + """ |
| + if args.source == "journald": |
| + source = Journald() |
| + else: |
| + source = Files(args.logdir) |
| + return source |
| + |
| + def matched_line(self, source, patterns): |
| + """ |
| + Yield lines which match any number of patterns (OR) in |
| + provided patterns list. |
| + |
| + Args: |
| + source (Reader): source Reader object |
| + Yields: |
| + lines matching the provided pattern(s) |
| + """ |
| + for line in source: |
| + for pattern in patterns: |
| + re_obj = re.compile(pattern) |
| + if re_obj.search(line): |
| + if line.startswith(' * '): |
| + continue |
| + yield line |