mirror of
https://git.yoctoproject.org/meta-security
synced 2026-07-16 15:57:21 +00:00
62059c7e36
Release notes: https://sssd.io/release-notes/sssd-2.9.6.html https://sssd.io/release-notes/sssd-2.9.7.html Signed-off-by: Scott Murray <scott.murray@konsulko.com>
323 lines
10 KiB
Diff
323 lines
10 KiB
Diff
From 56bcfecda72dc56c1bb8b8eb2721033f54dba9f8 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
|
|
|
|
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>
|
|
|
|
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 b40043d..7692af8 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 0000000..7117367
|
|
--- /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 d661ddd..e4d5f06 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 @@ class RequestAnalyzer:
|
|
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 @@ class RequestAnalyzer:
|
|
|
|
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 @@ class RequestAnalyzer:
|
|
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 @@ class RequestAnalyzer:
|
|
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 @@ class RequestAnalyzer:
|
|
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 @@ class RequestAnalyzer:
|
|
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 @@ class RequestAnalyzer:
|
|
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 @@ class RequestAnalyzer:
|
|
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 3f1beaf..6d4b5b3 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 18b998f..dafc84f 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 @@ class Analyzer:
|
|
"""
|
|
# 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 0000000..2a8d153
|
|
--- /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
|