summaryrefslogtreecommitdiff
path: root/bin/openwrt_logger.py
diff options
context:
space:
mode:
authorEvgeny Zinoviev <me@ch1p.io>2024-02-17 03:08:25 +0300
committerEvgeny Zinoviev <me@ch1p.io>2024-02-17 03:08:25 +0300
commit0ce2e41a2bad790c5232fafb4b6ed631ca8cd957 (patch)
treefd401495b87cae8c95a4c4edf2c851c8177b6069 /bin/openwrt_logger.py
parente9fc2c1835f7ac8e072919df81a6661c6308dea9 (diff)
parentb7f1d55c9b4de4d21b11e5615a5dc8be0d4e883c (diff)
merge with master
Diffstat (limited to 'bin/openwrt_logger.py')
-rwxr-xr-xbin/openwrt_logger.py73
1 files changed, 73 insertions, 0 deletions
diff --git a/bin/openwrt_logger.py b/bin/openwrt_logger.py
new file mode 100755
index 0000000..ec67542
--- /dev/null
+++ b/bin/openwrt_logger.py
@@ -0,0 +1,73 @@
+#!/usr/bin/env python3
+import os
+import __py_include
+
+from datetime import datetime
+from typing import Tuple, List, Optional
+from argparse import ArgumentParser
+from homekit.config import config, AppConfigUnit
+from homekit.database import SimpleState
+from homekit.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)