File 0001-high-history-Parse-log-lines-without-timestamp-bsc-9.patch of Package crmsh.1619

From 029b21ed11f75bc4b6d1ed1bdc2928c7b5902555 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kristoffer=20Gr=C3=B6nlund?= <krig@koru.se>
Date: Wed, 20 Jan 2016 11:51:20 +0100
Subject: [PATCH 1/3] high: history: Parse log lines without timestamp
 (bsc#955581)

If there are lines in the log that don't have a recognizable
timestamp or node name, fall back to using the same timestamp
and node name as the last log line that did parse correctly.
---
 modules/history.py | 52 +++++++++++++++++++++++++++++++++++++---------------
 modules/utils.py   |  2 +-
 2 files changed, 38 insertions(+), 16 deletions(-)

diff --git a/modules/history.py b/modules/history.py
index f7cd0a0..db7d0c5 100644
--- a/modules/history.py
+++ b/modules/history.py
@@ -73,29 +73,42 @@ def make_time(t):
 
 
 _syslog2node_formats = (re.compile(r'^[a-zA-Z]{2,4} \d{1,2} \d{2}:\d{2}:\d{2}\s+(?:\[\d+\])?\s*([\S]+)'),
-                        re.compile(r'^\d{4}-\d{2}-\d{2}T\S+\s+(?:\[\d+\])?\s*([\S]+)'))
+                        re.compile(r'^\d{4}-\d{2}-\d{2}T\S+\s+(?:\[\d+\])?\s*([\S]+)'),
+                        re.compile(r'^\d{4}\/\d{2}\/\d{2}_\d{2}:\d{2}:\d{2}'))
 
+_syslog_ts_prev = None
 
 def syslog_ts(s):
     """
     Finds the timestamp in the given line
     Returns as floating point, seconds
     """
-    fmt1, fmt2 = _syslog2node_formats
+    global _syslog_ts_prev
+    fmt1, fmt2, fmt3 = _syslog2node_formats
     m = fmt1.match(s)
     if m:
         if YEAR is None:
             set_year()
         tstr = ' '.join([YEAR] + s.split()[0:3])
-        return datetime_to_timestamp(parse_time(tstr))
+        _syslog_ts_prev = datetime_to_timestamp(parse_time(tstr))
+        return _syslog_ts_prev
 
     m = fmt2.match(s)
     if m:
         tstr = s.split()[0]
-        return datetime_to_timestamp(parse_time(tstr))
+        _syslog_ts_prev = datetime_to_timestamp(parse_time(tstr))
+        return _syslog_ts_prev
+
+    m = fmt3.match(s)
+    if m:
+        tstr = s.split()[0].replace('_', ' ')
+        _syslog_ts_prev = datetime_to_timestamp(parse_time(tstr))
+        return _syslog_ts_prev
 
     common_debug("malformed line: %s" % s)
-    return None
+    return _syslog_ts_prev
+
+_syslog_node_prev = None
 
 
 def syslog2node(s):
@@ -111,27 +124,36 @@ def syslog2node(s):
     RFC5424 (2):
     <TS> [<PID>] <node> ...
     '''
+    global _syslog_node_prev
 
-    fmt1, fmt2 = _syslog2node_formats
+    fmt1, fmt2, _ = _syslog2node_formats
     m = fmt1.search(s)
     if m:
-        return m.group(1)
+        _syslog_node_prev = m.group(1)
+        return _syslog_node_prev
 
     m = fmt2.search(s)
     if m:
-        return m.group(1)
+        _syslog_node_prev = m.group(1)
+        return _syslog_node_prev
 
     try:
         # strptime defaults year to 1900 (sigh)
         time.strptime(' '.join(s.split()[0:3]),
                       "%b %d %H:%M:%S")
-        return s.split()[3]
-    except:  # try the rfc5424
-        try:
-            parse_time(s.split()[0])
-            return s.split()[1]
-        except Exception:
-            return None
+        _syslog_node_prev = s.split()[3]
+        return _syslog_node_prev
+    except Exception:  # try the rfc5424
+        rfc5424 = s.split()[0]
+        if 'T' in rfc5424:
+            try:
+                parse_time(rfc5424)
+                _syslog_node_prev = s.split()[1]
+                return _syslog_node_prev
+            except Exception:
+                return _syslog_node_prev
+        else:
+            return _syslog_node_prev
 
 
 def seek_to_edge(f, ts, to_end):
diff --git a/modules/utils.py b/modules/utils.py
index a72aa19..e958c8a 100644
--- a/modules/utils.py
+++ b/modules/utils.py
@@ -1082,7 +1082,7 @@ def parse_time(t):
             # convert to UTC from local time
             dt = make_datetime_naive(dt.replace(tzinfo=dateutil.tz.tzlocal()))
     except ValueError, msg:
-        common_err("%s: %s" % (t, msg))
+        common_err("parse_time %s: %s" % (t, msg))
         return None
     except ImportError, msg:
         try:
-- 
2.7.0

openSUSE Build Service is sponsored by