bin/pvl.wlan-sta
author Tero Marttila <terom@paivola.fi>
Fri, 05 Jul 2013 00:59:56 +0300
changeset 238 9702bfb124f6
parent 236 7b37f84b17cc
permissions -rwxr-xr-x
pvl.wlan-sta: update database wlan_sta table
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
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    56
class WlanStaDatabase (object) :
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
    HOSTAPD_STA_RE = re.compile(r'(?P<wlan>.+?): STA (?P<sta>.+?) (?P<msg>.+)')
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    59
    DB_TABLE = db.wlan_sta
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    60
    DB_LAST_SEEN = db.wlan_sta.c.last_seen
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    61
    DB_SELECT = (db.dhcp_hosts.c.gw, db.dhcp_hosts.c.ip)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    62
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    63
    def __init__ (self, db, interface_map=None) :
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
        """
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
            interface_map       - {(hostname, interface): (nodename, wlan)}
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
        """
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    67
        self.db = db
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
        self.interface_map = interface_map
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    70
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    71
    def select (self, distinct=DB_SELECT, interval=None) :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    72
        """
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    73
            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
    74
        """
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    75
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    76
        query = db.select(distinct, distinct=True)
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
        if interval :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    79
            # timedelta
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    80
            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
    81
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    82
        return self.db.select(query)
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
    def insert (self, key, update, timestamp, count=True) :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    85
        """
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    86
            INSERT new host
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    87
        """
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    88
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    89
        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
    90
                first_seen  = timestamp,
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    91
                last_seen   = timestamp,
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
        if count :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    95
            query = query.values(count=1)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    96
        
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    97
        # -> id
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    98
        return self.db.insert(query)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
    99
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   100
    def update (self, key, update, timestamp, count=True) :
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
            UPDATE existing host, or return False if not found.
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   103
        """
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   104
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   105
        table = self.DB_TABLE
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   106
        query = table.update()
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   107
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   108
        for col, value in key.iteritems() :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   109
            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
   110
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   111
        query = query.values(last_seen=timestamp)
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
        if count :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   114
            query = query.values(count=db.func.coalesce(table.c.count, 0) + 1)
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(**update)
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
        # -> any matched rows?
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   119
        return self.db.update(query)
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
    def touch (self, key, update, timestamp, **opts) :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   122
        # update existing?
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   123
        if self.update(key, update, timestamp, **opts) :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   124
            log.info("Update: %s: %s: %s", key, update, timestamp)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   125
        else :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   126
            log.info("Insert: %s: %s: %s", key, update, timestamp)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   127
            self.insert(key, update, timestamp, **opts)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   128
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
    def parse (self, item) :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
        """
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
            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
   132
        """
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
        
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
        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
   135
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   136
        if not match :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   137
            return None
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   138
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   139
        return match.groupdict()
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   140
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   141
    def __call__ (self, item) :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   142
        match = self.parse(item)
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   143
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   144
        if not match :
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   145
            return
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   146
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   147
        # lookup?
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   148
        ap, 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
   149
        
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
        if self.interface_map :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
            mapping = self.interface_map.get((ap, wlan))
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
            if mapping :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
                ap, wlan = mapping
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
        
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   156
        # update/insert
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   157
        self.touch(
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   158
            dict(
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
                ap              = ap,
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
                wlan            = wlan,
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   161
                sta             = match['sta'],
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   162
            ), dict(
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   163
                msg             = match['msg'],
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   164
            ), item['timestamp']
236
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   165
        )
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   166
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
def main (argv) :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   168
    options, args = parse_argv(argv)
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   169
    
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   170
    # database
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   171
    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
   172
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   173
    if options.interfaces :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   174
        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
   175
    else :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   176
        interfaces = None
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   177
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   178
    # syslog
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   179
    log.info("Open up syslog...")
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   180
    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
   181
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   182
    # handler
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   183
    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
   184
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   185
    log.info("Enter mainloop...")
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   186
    for source in syslog.main() :
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
        for item in source:
238
9702bfb124f6 pvl.wlan-sta: update database wlan_sta table
Tero Marttila <terom@paivola.fi>
parents: 236
diff changeset
   188
            handler(item)
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
    return 0
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   191
    
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
if __name__ == '__main__':
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   193
    import sys
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   194
7b37f84b17cc pvl.wlan-sta: track openwrt hostapd syslog wlan sta activity
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   195
    sys.exit(main(sys.argv))