Source code for insights.parsers.samba_logs

"""
samba logs - files matching ``/var/log/samba/*.log``
====================================================
"""

from insights import parser, LogFileOutput
from datetime import datetime
from insights.specs import Specs


def strip_surrounds(s):
    start = 0
    end = len(s) - 1
    while (s[start] == '[' and s[end] == ']') or \
      (s[start] == '[' and s[end] == ',') or \
      (s[start] == '(' and s[end] == ')'):
        start += 1
        end -= 1
    if s[end] == ',':
        end -= 1
    return s[start:(end + 1)]


[docs] @parser(Specs.samba_logs) class SAMBALog(LogFileOutput): """ Parser class for reading samba log files. The main work is done by the LogFileOutput super-class. .. note: Please refer to its super-class :class:`insights.core.LogFileOutput` Sample input: [2018/12/07 07:09:44.812154, 5, pid=6434, effective(0, 0), real(0, 0)] ../source3/param/loadparm.c:1344(free_param_opts) Freeing parametrics: [2018/12/07 07:09:44.812281, 3, pid=6434, effective(0, 0), real(0, 0)] ../source3/param/loadparm.c:547(init_globals) Initialising global parameters [2018/12/07 07:09:44.812356, 2, pid=6434, effective(0, 0), real(0, 0)] ../source3/param/loadparm.c:319(max_open_files) rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384) [2019/45/899 11:11:04.911891, 3, pid=15822, effective(0, 0), real(0, 0)] ../source3/printing/queue_process.c:236 (bq_sig_hup_handler) Reloading pcap cache after SIGHUP. Each line is parsed into a dictionary with the following keys: * **timestamp** - the date of the log line (as a string) * **datetime** - the date as a datetime object (if conversion is possible) * **pid** - process id of samba process being run * **function** - the function within the module * **message** - the body of the message * **raw_message** - the raw message before being split. Examples: >>> 'Fake' in samba_logs True >>> 'pid=15822, effective(0, 0), real(0, 0)]' in samba_logs True >>> len(samba_logs.get('Fake line')) == 1 True """ time_format = '%b %d %H:%M:%S %Y' def _parse_line(self, line): fields = line.split() try: parsed_line = { 'timestamp': strip_surrounds(' '.join(fields[0:2])), 'pid': strip_surrounds(fields[3]), 'function': strip_surrounds(fields[8]), 'message': ' '.join(fields[8:]), 'raw_message': line } parsed_line['datetime'] = datetime.strptime( parsed_line['timestamp'], '%a %b %d %H:%M:%S %Y' ) except: pass return parsed_line