TeamspeakStats/tsstats/log.py

56 lines
2.0 KiB
Python
Raw Permalink Normal View History

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
2016-05-11 14:45:42 -04:00
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)
2016-05-08 15:54:58 -04:00
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)
2016-05-11 14:45:42 -04:00
logger.debug('Finished parsing of %s', log_file.name)
return clients