bin/pvl.wlan-syslog
author Tero Marttila <terom@paivola.fi>
Sun, 07 Sep 2014 14:21:56 +0300
changeset 424 e77e967d59b0
parent 244 fc9fb80e4ebd
permissions -rwxr-xr-x
hgignore: use glob; ignore snmp mibs
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
243
787c5f93f434 pvl.verkko.wlan: basic Table view
Tero Marttila <terom@paivola.fi>
parents: 240
diff changeset
    14
import pvl.web.args
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
import pvl.rrd.hosts
243
787c5f93f434 pvl.verkko.wlan: basic Table view
Tero Marttila <terom@paivola.fi>
parents: 240
diff changeset
    16
import pvl.verkko.wlan
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    17
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
import optparse
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    19
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
    20
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    21
WLAN_STA_PROG = 'hostapd'
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
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
    24
    """
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    25
        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
    26
    """
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
    prog = argv.pop(0)
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
    args = argv
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
    # optparse
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
    parser = optparse.OptionParser(
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
        prog        = prog,
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
        usage       = '%prog: [options] [<input.txt> [...]]',
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
        version     = __version__,
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
        description = doc,
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
    )
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
    # common
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
    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
    41
    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
    42
    parser.add_option_group(pvl.verkko.db.parser(parser, table=db.wlan_sta))
243
787c5f93f434 pvl.verkko.wlan: basic Table view
Tero Marttila <terom@paivola.fi>
parents: 240
diff changeset
    43
    parser.add_option_group(pvl.web.args.parser(parser))
236
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
    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
    46
            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
    47
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
    # parse
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
    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
    50
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
    # apply
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
    pvl.args.apply(options)
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
    return options, args
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
import re
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    57
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
    58
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    59
class KeyTimestampDatabase (object) :
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    60
    """
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    61
        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
    62
    """
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    63
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    64
    DB_TABLE = None
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    65
    DB_LAST_SEEN = None
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    66
    DB_COUNT = None
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    67
    DB_DISTINCT = None
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    68
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    69
    def __init__ (self, db) :
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
        """
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    71
            db      - pvl.verkko.db.Database
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    72
        """
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    73
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    74
        self.db = db
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    76
    def select (self, interval=None) :
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    77
        """
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    78
            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
    79
        """
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    80
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    81
        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
    82
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    83
        if interval :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    84
            # timedelta
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    85
            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
    86
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    87
        return self.db.select(query)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    88
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    89
    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
    90
        """
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
    91
            INSERT new row.
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    92
        """
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    93
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    94
        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
    95
                first_seen  = timestamp,
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    96
                last_seen   = timestamp,
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    97
        )
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    98
244
fc9fb80e4ebd pvl.wlan-syslog: fix INSERT
Tero Marttila <terom@paivola.fi>
parents: 243
diff changeset
    99
        if self.DB_COUNT is not None :
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   100
            query = query.values(count=1)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   101
        
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   102
        # -> id
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   103
        return self.db.insert(query)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   104
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   105
    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
   106
        """
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   107
            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
   108
        """
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
        table = self.DB_TABLE
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   111
        query = table.update()
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
        for col, value in key.iteritems() :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   114
            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
   115
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   116
        query = query.values(last_seen=timestamp)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   117
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   118
        if self.DB_COUNT is not None :
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   119
            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
   120
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   121
        query = query.values(**update)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   122
        
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   123
        # -> any matched rows?
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   124
        return self.db.update(query)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   125
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   126
    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
   127
        # update existing?
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   128
        if self.update(key, timestamp, update, **opts) :
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   129
            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
   130
        else :
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   131
            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
   132
            self.insert(key, timestamp, update, **opts)
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   133
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
class WlanStaDatabase (KeyTimestampDatabase) :
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   136
    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
   137
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   138
    DB_TABLE = db.wlan_sta
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   139
    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
   140
    DB_COUNT = db.wlan_sta.c.count
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   141
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   142
    DB_DISTINCT = (db.wlan_sta.c.sta, )
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   143
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   144
    def __init__ (self, db, interface_map=None) :
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   145
        """
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   146
            interface_map       - {(hostname, interface): (nodename, wlan)}
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   147
        """
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   148
        KeyTimestampDatabase.__init__(self, db)
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   149
        self.interface_map = interface_map
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   150
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
    def parse (self, item) :
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
            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
   154
        """
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
        
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   156
        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
   157
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   158
        if not match :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
            return None
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   161
        return match.groupdict()
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   162
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   163
    def lookup_wlan (self, host, iface) :
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   164
        """
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   165
            Lookup ap/ssid by host/iface.
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   166
        """
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   167
        mapping = None
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   168
        if self.interface_map :
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   169
            mapping = self.interface_map.get((host, iface))
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   170
        
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   171
        if mapping :
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   172
            return mapping
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   173
        else :
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   174
            # as-is
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   175
            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
   176
            return host, iface
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   177
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   178
    def __call__ (self, item) :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   179
        match = self.parse(item)
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
        if not match :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   182
            return
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   183
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   184
        # lookup?
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   185
        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
   186
        
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   187
        # update/insert
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   188
        self.touch(
240
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   189
            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
   190
            item['timestamp'],
8b55ca43e076 pvl.wlan-syslog: split out separate KeyTimestampDatabase
Tero Marttila <terom@paivola.fi>
parents: 239
diff changeset
   191
            dict(msg=match['msg']),
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
        )
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   193
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   194
def main (argv) :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   195
    options, args = parse_argv(argv)
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   196
    
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   197
    # database
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   198
    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
   199
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
    if options.interfaces :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
        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
   202
    else :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   203
        interfaces = None
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   205
    # syslog
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   206
    log.info("Open up syslog...")
243
787c5f93f434 pvl.verkko.wlan: basic Table view
Tero Marttila <terom@paivola.fi>
parents: 240
diff changeset
   207
    syslog = pvl.syslog.args.apply(options, optional=True)
787c5f93f434 pvl.verkko.wlan: basic Table view
Tero Marttila <terom@paivola.fi>
parents: 240
diff changeset
   208
        
787c5f93f434 pvl.verkko.wlan: basic Table view
Tero Marttila <terom@paivola.fi>
parents: 240
diff changeset
   209
    if syslog :
787c5f93f434 pvl.verkko.wlan: basic Table view
Tero Marttila <terom@paivola.fi>
parents: 240
diff changeset
   210
        # handler
787c5f93f434 pvl.verkko.wlan: basic Table view
Tero Marttila <terom@paivola.fi>
parents: 240
diff changeset
   211
        handler = WlanStaDatabase(db, interface_map=interfaces)
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   212
243
787c5f93f434 pvl.verkko.wlan: basic Table view
Tero Marttila <terom@paivola.fi>
parents: 240
diff changeset
   213
        log.info("Enter mainloop...")
787c5f93f434 pvl.verkko.wlan: basic Table view
Tero Marttila <terom@paivola.fi>
parents: 240
diff changeset
   214
        for source in syslog.main() :
787c5f93f434 pvl.verkko.wlan: basic Table view
Tero Marttila <terom@paivola.fi>
parents: 240
diff changeset
   215
            for item in source:
787c5f93f434 pvl.verkko.wlan: basic Table view
Tero Marttila <terom@paivola.fi>
parents: 240
diff changeset
   216
                handler(item)
787c5f93f434 pvl.verkko.wlan: basic Table view
Tero Marttila <terom@paivola.fi>
parents: 240
diff changeset
   217
    else :
787c5f93f434 pvl.verkko.wlan: basic Table view
Tero Marttila <terom@paivola.fi>
parents: 240
diff changeset
   218
        # run web
787c5f93f434 pvl.verkko.wlan: basic Table view
Tero Marttila <terom@paivola.fi>
parents: 240
diff changeset
   219
        application = pvl.web.args.apply(options, pvl.verkko.wlan.Application, db)
787c5f93f434 pvl.verkko.wlan: basic Table view
Tero Marttila <terom@paivola.fi>
parents: 240
diff changeset
   220
        return pvl.web.args.main(options, application)
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   221
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   222
    return 0
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   223
    
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   224
if __name__ == '__main__':
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   225
    import sys
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   226
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   227
    sys.exit(main(sys.argv))