From 04938e4f48242f917486384bcdb9cd3f898073ff Mon Sep 17 00:00:00 2001
From: thl-cmk <thl-cmk@outlook.com>
Date: Mon, 1 Mar 2021 22:23:03 +0100
Subject: [PATCH] update project

---
 agent_based/checkpoint_asg_diag.py |  53 ++++++++++++++++++++++-------
 checkpoint_asg_diag.mkp            | Bin 3122 -> 3339 bytes
 2 files changed, 41 insertions(+), 12 deletions(-)

diff --git a/agent_based/checkpoint_asg_diag.py b/agent_based/checkpoint_asg_diag.py
index 0f64892..545a005 100644
--- a/agent_based/checkpoint_asg_diag.py
+++ b/agent_based/checkpoint_asg_diag.py
@@ -88,9 +88,15 @@ from .agent_based_api.v1 import (
     any_of,
 )
 
+class CheckPointASGDiagSummary(NamedTuple):
+    date: str
+    time: str
+    passed: int
+    maxtest: int
+    failed: list
 
 class CheckPointASGDiag(NamedTuple):
-    summary: str
+    summary: CheckPointASGDiagSummary
     tests: List
 
 
@@ -100,8 +106,16 @@ def parse_checkpoint_asg_diag(string_table: List[StringTable]) -> CheckPointASGD
     if len(asgSummary) == 0:
         return None
 
+    asgSummary = asgSummary[0][0]
+
     parsed = CheckPointASGDiag
-    parsed.summary = asgSummary[0][0]
+    parsed.summary = CheckPointASGDiagSummary
+    # todo: change date to real date string, and add warn/crit if last run to old
+    parsed.summary.date = asgSummary[0][0][3:13]
+    parsed.summary.time = asgSummary[0][0][18:26]
+    parsed.summary.passed = int(asgSummary[28:].split(".")[0].split(' ')[1].split('/')[0])
+    parsed.summary.maxtest = int(asgSummary[28:].split(".")[0].split(' ')[1].split('/')[1])
+    parsed.summary.failed = list(map(int, asgSummary.split(':')[-1].strip(' ').split(',')))
     parsed.tests = asgTests
 
     return parsed
@@ -119,8 +133,23 @@ def check_checkpoint_asg_diag(params, section: CheckPointASGDiag):
         result: str
         comment: str
 
-    summary = 'Last run ' + section.summary
+    summary = ''
+    summary += 'Last run on: %s at: %s' % (section.summary.date, section.summary.time)
+    summary += ' Passed %d/%d tests' % (section.summary.passed, section.summary.maxtest)
+    if len(section.summary.failed) > 0:
+        summary += ' Failed: %s' % ','.join(map(str, section.summary.failed))
+
     details = '\n\nTo verify this output use the "asg diag verify" command on the Check Point SMO cli,\n'
+
+    for test in section.tests:
+        test = CheckPointASGDiagTest(*test)
+        if test.comment == '':
+            details += '\nIndex: %s, Name: %s, LastRun: %s, Restult: %s' % (
+                test.index, test.name, test.lastrun, test.result)
+        else:
+            details += '\nIndex: %s, Name: %s, LastRun: %s, Restult: %s, Comment: %s' % (
+                test.index, test.name, test.result, test.result, test.comment)
+
     state = State.OK
 
     asg_diag_ignore = []
@@ -129,9 +158,10 @@ def check_checkpoint_asg_diag(params, section: CheckPointASGDiag):
     if params:
         asg_diag_ignore = params.get('asg_diag_ignore', [])
         asg_diag_warning = params.get('asg_diag_warning', [])
+    asg_diag_ignore.sort()
 
     if len(asg_diag_ignore) > 0:
-        summary += ', Ignored tests: %s' % str(asg_diag_ignore).strip('[').strip(']').replace(' ', '')
+        summary += ', Ignored tests: %s' % ','.join(map(str, asg_diag_ignore))
 
     for test in section.tests:
         test = CheckPointASGDiagTest(*test)
@@ -142,14 +172,13 @@ def check_checkpoint_asg_diag(params, section: CheckPointASGDiag):
             details += '\nIndex: %s, Name: %s, LastRun: %s, Restult: %s, Comment: %s' % (
                 test.index, test.name, test.result, test.result, test.comment)
 
-        asgTestIndex = int(test.index)
-        if not asgTestIndex in asg_diag_ignore:
-            if test.result.lower() == 'failed (!)':
-                if asgTestIndex in asg_diag_warning:
-                    if state == State.OK:
-                        state = State.WARN
-                else:
-                    state = State.CRIT
+    for test in section.summary.failed:
+        if not test in asg_diag_ignore:
+            if test in asg_diag_warning:
+                if state == State.OK:
+                    state = State.WARN
+            else:
+                state = State.CRIT
 
     yield Result(state=state, summary=summary, details=details)
 
diff --git a/checkpoint_asg_diag.mkp b/checkpoint_asg_diag.mkp
index 2d910cc08f018ff4fbb37abed82d3b8a4b3b0902..9c6f26220ba522ef5d15aad526044b16c7e3ff88 100644
GIT binary patch
delta 3330
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
CMP0D~

delta 3112
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
CK^h4F

-- 
GitLab