bin/pvl.wlan-syslog
author Tero Marttila <terom@paivola.fi>
Fri, 05 Jul 2013 01:17:51 +0300
changeset 240 8b55ca43e076
parent 239 198dc3a19f54
child 243 787c5f93f434
permissions -rwxr-xr-x
pvl.wlan-syslog: split out separate KeyTimestampDatabase
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
#!/usr/bin/python
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
"""
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
    Analyze WLAN STA logs.
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
        Jul  3 23:05:04 buffalo-g300n-647682 daemon.info hostapd: wlan0-1: STA aa:bb:cc:dd:ee:ff WPA: group key handshake completed (RSN)
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
"""
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
__version__ = '0.1'
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
import pvl.args
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
import pvl.syslog.args
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
import pvl.rrd.hosts
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
import optparse
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
import logging; log = logging.getLogger('main')
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
WLAN_STA_PROG = 'hostapd'
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
def parse_argv (argv, doc = __doc__) :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    22
    """
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
        Parse command-line argv, returning (options, args).
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
    """
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
    prog = argv.pop(0)
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
    args = argv
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
    # optparse
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
    parser = optparse.OptionParser(
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
        prog        = prog,
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
        usage       = '%prog: [options] [<input.txt> [...]]',
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
        version     = __version__,
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
        description = doc,
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
    )
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
    # common
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
    parser.add_option_group(pvl.args.parser(parser))
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
    parser.add_option_group(pvl.syslog.args.parser(parser, prog=WLAN_STA_PROG))
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    40
    parser.add_option_group(pvl.verkko.db.parser(parser, table=db.wlan_sta))
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
    parser.add_option('--interfaces', metavar='PATH',
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
            help="Load interface/node names from mapping file")
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
    # parse
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
    options, args = parser.parse_args(args)
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
    # apply
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
    pvl.args.apply(options)
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
    return options, args
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
import re
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    54
from pvl.verkko import db
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    56
class KeyTimestampDatabase (object) :
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    57
    """
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    58
        A pvl.verkko.db table that tracks events by key/timestamp.
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    59
    """
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    60
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    61
    DB_TABLE = None
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    62
    DB_LAST_SEEN = None
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    63
    DB_COUNT = None
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    64
    DB_DISTINCT = None
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    65
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    66
    def __init__ (self, db) :
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
        """
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    68
            db      - pvl.verkko.db.Database
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    69
        """
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    70
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    71
        self.db = db
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    73
    def select (self, interval=None) :
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    74
        """
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    75
            SELECT unique gw/ip hosts, for given interval.
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    76
        """
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    77
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    78
        query = db.select(self.DB_DISTINCT, distinct=True)
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    79
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    80
        if interval :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    81
            # timedelta
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    82
            query = query.where(db.func.now() - self.DB_LAST_SEEN < interval)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    83
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    84
        return self.db.select(query)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    85
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    86
    def insert (self, key, timestamp, update) :
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    87
        """
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    88
            INSERT new row.
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    89
        """
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    90
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    91
        query = self.DB_TABLE.insert().values(**key).values(**update).values(
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    92
                first_seen  = timestamp,
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    93
                last_seen   = timestamp,
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    94
        )
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    95
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    96
        if self.DB_COUNT :
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    97
            query = query.values(count=1)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    98
        
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    99
        # -> id
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   100
        return self.db.insert(query)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   101
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   102
    def update (self, key, timestamp, update) :
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   103
        """
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   104
            UPDATE existing row, or return False if not found.
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   105
        """
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   106
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   107
        table = self.DB_TABLE
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   108
        query = table.update()
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   109
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   110
        for col, value in key.iteritems() :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   111
            query = query.where(table.c[col] == value)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   112
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   113
        query = query.values(last_seen=timestamp)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   114
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   115
        if self.DB_COUNT is not None :
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   116
            query = query.values(count=db.func.coalesce(self.DB_COUNT, 0) + 1)
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   117
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   118
        query = query.values(**update)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   119
        
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   120
        # -> any matched rows?
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   121
        return self.db.update(query)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   122
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   123
    def touch (self, key, timestamp, update, **opts) :
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   124
        # update existing?
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   125
        if self.update(key, timestamp, update, **opts) :
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   126
            log.info("Update: %s: %s: %s", key, timestamp, update)
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   127
        else :
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   128
            log.info("Insert: %s: %s: %s", key, timestamp, update)
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   129
            self.insert(key, timestamp, update, **opts)
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   130
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   131
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   132
class WlanStaDatabase (KeyTimestampDatabase) :
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   133
    HOSTAPD_STA_RE = re.compile(r'(?P<wlan>.+?): STA (?P<sta>.+?) (?P<msg>.+)')
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   134
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   135
    DB_TABLE = db.wlan_sta
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   136
    DB_LAST_SEEN = db.wlan_sta.c.last_seen
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   137
    DB_COUNT = db.wlan_sta.c.count
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   138
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   139
    DB_DISTINCT = (db.wlan_sta.c.sta, )
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   140
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   141
    def __init__ (self, db, interface_map=None) :
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   142
        """
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   143
            interface_map       - {(hostname, interface): (nodename, wlan)}
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   144
        """
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   145
        KeyTimestampDatabase.__init__(self, db)
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   146
        self.interface_map = interface_map
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   147
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   148
    def parse (self, item) :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   149
        """
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
            Parse fields from a hostapd syslog message.
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
        """
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
        
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   153
        match = self.HOSTAPD_STA_RE.match(item['msg'])
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
        if not match :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   156
            return None
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   157
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   158
        return match.groupdict()
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   160
    def lookup_wlan (self, host, iface) :
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   161
        """
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   162
            Lookup ap/ssid by host/iface.
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   163
        """
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   164
        mapping = None
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   165
        if self.interface_map :
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   166
            mapping = self.interface_map.get((host, iface))
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   167
        
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   168
        if mapping :
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   169
            return mapping
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   170
        else :
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   171
            # as-is
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   172
            log.warning("Unknown host/iface: %s/%s", host, iface)
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   173
            return host, iface
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   174
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   175
    def __call__ (self, item) :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   176
        match = self.parse(item)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   177
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   178
        if not match :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   179
            return
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   180
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   181
        # lookup?
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   182
        ap, ssid = self.lookup_wlan(item['host'], match['wlan'])
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
        
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   184
        # update/insert
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   185
        self.touch(
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   186
            dict(ap=ap, wlan=ssid, sta=match['sta']),
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   187
            item['timestamp'],
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   188
            dict(msg=match['msg']),
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
        )
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   191
def main (argv) :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
    options, args = parse_argv(argv)
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   193
    
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   194
    # database
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   195
    db = pvl.verkko.db.apply(options)
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   196
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   197
    if options.interfaces :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   198
        interfaces = dict(pvl.rrd.hosts.map_interfaces(options, open(options.interfaces)))
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
    else :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
        interfaces = None
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   202
    # syslog
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   203
    log.info("Open up syslog...")
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204
    syslog = pvl.syslog.args.apply(options)
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   205
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   206
    # handler
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   207
    handler = WlanStaDatabase(db, interface_map=interfaces)
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   208
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   209
    log.info("Enter mainloop...")
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   210
    for source in syslog.main() :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   211
        for item in source:
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   212
            handler(item)
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   213
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   214
    return 0
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   215
    
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   216
if __name__ == '__main__':
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   217
    import sys
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   218
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   219
    sys.exit(main(sys.argv))