author | Tero Marttila <terom@paivola.fi> |
Sun, 07 Sep 2014 14:21:56 +0300 | |
changeset 424 | e77e967d59b0 |
parent 244 | fc9fb80e4ebd |
permissions | -rwxr-xr-x |
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)) |