summaryrefslogtreecommitdiff
path: root/src/openwrt_logger.py
blob: 4d3b310a6f5c3dcc45f56e03a273d1f3f5a7e660 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/env python3
import os

from datetime import datetime
from home.config import config
from home.database import SimpleState
from home.api import WebAPIClient

log_file = '/var/log/openwrt.log'

f"""
This script is supposed to be run by cron every 5 minutes or so.
It looks for new lines in {log_file} and sends them to remote server.

OpenWRT must have remote logging enabled (UDP; IP of host this script is launched on; port 514)

/etc/rsyslog.conf contains following (assuming 192.168.1.1 is the router IP):

$ModLoad imudp  
$UDPServerRun 514  
:fromhost-ip, isequal, "192.168.1.1" /var/log/openwrt.log  
& ~
 
"""


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__':
    config.load('openwrt_logger')

    state = SimpleState(file=config['simple_state']['file'],
                        default={'seek': 0, 'size': 0})

    fsize = os.path.getsize(log_file)
    if fsize < state['size']:
        state['seek'] = 0

    with open(log_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)