#!/usr/bin/env python3 import os from datetime import datetime from typing import Tuple, List, Optional from argparse import ArgumentParser from home.config import config, AppConfigUnit from home.database import SimpleState from home.api import WebApiClient class OpenwrtLoggerConfig(AppConfigUnit): @classmethod def schema(cls) -> Optional[dict]: return dict( database_name_template=dict(type='string', required=True) ) def parse_line(line: str) -> Tuple[int, str]: space_pos = line.index(' ') date = line[:space_pos] rest = line[space_pos+1:] return ( int(datetime.strptime(date, "%Y-%m-%dT%H:%M:%S%z").timestamp()), rest ) if __name__ == '__main__': parser = ArgumentParser() parser.add_argument('--file', type=str, required=True, help='openwrt log file') parser.add_argument('--access-point', type=int, required=True, help='access point number') arg = config.load_app(OpenwrtLoggerConfig, parser=parser) state = SimpleState(name=config.app_config['database_name_template'].replace('{ap}', str(arg.access_point)), default=dict(seek=0, size=0)) fsize = os.path.getsize(arg.file) if fsize < state['size']: state['seek'] = 0 with open(arg.file, 'r') as f: if state['seek']: # jump to the latest read position f.seek(state['seek']) # read till the end of the file content = f.read() # save new position state['seek'] = f.tell() state['size'] = fsize lines: List[Tuple[int, str]] = [] if content != '': for line in content.strip().split('\n'): if not line: continue try: lines.append(parse_line(line)) except ValueError: lines.append((0, line)) api = WebApiClient() api.log_openwrt(lines, arg.access_point)