import logging import re from datetime import datetime from glob import glob from tsstats.client import Clients re_dis_connect = re.compile(r"'(.*)'\(id:(\d*)\)") re_disconnect_invoker = re.compile( r'invokername=(.*)\ invokeruid=(.*)\ reasonmsg' ) logger = logging.getLogger('tsstats') def parse_logs(log_path, ident_map={}): clients = Clients(ident_map) # find all log-files and open them TODO: move this into main file_paths = sorted([file_path for file_path in glob(log_path)]) for file_path in file_paths: log_file = open(file_path) # process lines logger.debug('Started parsing of %s', log_file.name) for line in log_file: parts = line.split('|') log_format = '%Y-%m-%d %H:%M:%S.%f' stripped_time = datetime.strptime(parts[0], log_format) logdatetime = int((stripped_time - datetime(1970, 1, 1)) .total_seconds()) data = '|'.join(parts[4:]).strip() if data.startswith('client'): nick, clid = re_dis_connect.findall(data)[0] if data.startswith('client connected'): client = clients[clid] client.nick = nick client.connect(logdatetime) elif data.startswith('client disconnected'): client = clients[clid] client.nick = nick client.disconnect(logdatetime) if 'invokeruid' in data: re_disconnect_data = re_disconnect_invoker.findall( data) invokernick, invokeruid = re_disconnect_data[0] invoker = clients[invokeruid] invoker.nick = invokernick if 'bantime' in data: invoker.ban(client) else: invoker.kick(client) logger.debug('Finished parsing of %s', log_file.name) return clients