pvl/verkko/hosts.py
author Tero Marttila <terom@paivola.fi>
Thu, 11 Oct 2012 01:40:08 +0300
changeset 12 7ffb92a57092
parent 11 d1e17bd498e7
child 14 02c21749cb4f
permissions -rw-r--r--
tfoot
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
from pvl.verkko import db, web
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
from pvl.html import tags as html
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
     5
import re
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
import socket # dns
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
import logging; log = logging.getLogger('pvl.verkko.hosts')
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
1
731d2df704f0 fixup index + non-chunked response (?) + hosts + evil hardcoded db url
Tero Marttila <terom@paivola.fi>
parents: 0
diff changeset
    10
# XXX: this should actually be DHCPHost
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
class Host (object) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
    DATE_FMT = '%Y%m%d'
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    13
    
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    14
    MAC_HEX = r'([A-Za-z0-9]{2})'
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    15
    MAC_SEP = r'[-:.]?'
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    16
    MAC_RE = re.compile(MAC_SEP.join([MAC_HEX] * 6))
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    17
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    18
    @classmethod
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    19
    def normalize_mac (cls, mac) :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    20
        match = cls.MAC_RE.search(mac)
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    21
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    22
        if not match :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    23
            raise ValueError(mac)
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    24
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    25
        else :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    26
            return ':'.join(hh.lower() for hh in match.groups())
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
    def __init__ (self, ip, mac, name=None) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
        self.ip = ip
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
        self.mac = mac
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
        self.name = name
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
   
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
    def render_mac (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    34
        if not self.mac :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
            return None
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
        elif len(self.mac) > (6 * 2 + 5) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
            return u'???'
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
        else :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
            return unicode(self.mac)
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
    def render_name (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
        if self.name :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
            return self.name.decode('ascii', 'replace')
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
        else :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
            return None
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
    def when (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
        return '{frm} - {to}'.format(
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
                frm = self.first_seen.strftime(self.DATE_FMT),
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
                to  = self.last_seen.strftime(self.DATE_FMT),
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
        )
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
    def dns (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
        """
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
            Reverse-DNS lookup.
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
        """
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
        if not self.ip :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
            return None
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
        
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
        sockaddrs = set(sockaddr for family, socktype, proto, canonname, sockaddr in socket.getaddrinfo(self.ip, 0, 0, 0, 0, socket.AI_NUMERICHOST))
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
        for sockaddr in sockaddrs :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
            try :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
                host, port = socket.getnameinfo(sockaddr, socket.NI_NAMEREQD)
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
            except socket.gaierror :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
                continue
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
            return host
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
    def __unicode__ (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
        return u"{host.ip} ({host.mac})".format(host=self)
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
db.mapper(Host, db.dhcp_hosts, properties=dict(
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
    id      = db.dhcp_hosts.c.rowid,
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
    #_mac    = db.dhcp_hosts.c.mac,
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
    #_name   = db.dhcp_hosts.c.name,
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
))
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    82
class BaseHandler (web.Handler) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    83
    HOST_ATTRS = {
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    84
        'id':   Host.id,
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    85
        'ip':   Host.ip,
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    86
        'mac':  Host.mac,
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    87
        'name': Host.name,
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    88
        'seen': Host.last_seen,
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    89
    }
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    91
    HOST_SORT = Host.last_seen.desc()
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
    93
    def query (self) :
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    94
        hosts = self.db.query(Host)
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
    96
        # sort ?
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
    97
        self.sort = self.request.args.get('sort')
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
    99
        if self.sort :
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   100
            sort = self.HOST_ATTRS[self.sort]
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   101
        else :
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   102
            sort = self.HOST_SORT
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   104
        log.debug("sort: %s", sort)
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   105
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   106
        hosts = hosts.order_by(sort)
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   107
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   108
        # k
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   109
        return hosts
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   110
    
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   111
    def render_hosts (self, hosts, title=None, filters=False) :
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   112
        COLS = (
10
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   113
            #title          sort        filter      class
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   114
            ('IP',          'ip',       'ip',       'ip'    ),
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   115
            ('MAC',         'mac',      'mac',      'mac'   ),
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   116
            ('Hostname',    'name',     False,      False   ),
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   117
            ('Seen',        'seen',     False,      False   ),
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   118
        )
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
   119
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   120
        def url (**opts) :
11
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   121
            args = dict()
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   122
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   123
            if filters :
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   124
                args.update(filters)
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   125
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   126
            args.update(opts)
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   127
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   128
            return self.url(**args)
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   129
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   130
        table = html.table(
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   131
            html.caption(title) if title else None,
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   132
            html.thead(
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   133
                html.tr(
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   134
                    html.th('#'),
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   135
                    (
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   136
                        html.th(
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   137
                            html.a(href=url(sort=sort))(title) if sort else (title)
10
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   138
                        ) for title, sort, filter, class_ in COLS
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   139
                    )
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   140
                ),
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   141
                html.tr(class_='filter')(
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   142
                    html.td(
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   143
                        html.input(type='submit', value=u'\u00BF'),
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   144
                    ),
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   145
                    (
10
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   146
                        html.td(class_=class_)(
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   147
                            html.input(type='text', name=filter, value=filters.get(filter)) if filter else None
10
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   148
                        ) for title, sort, filter, class_ in COLS
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   149
                    )
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   150
                ) if filters is not False else None
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   151
            ),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   152
            html.tbody(
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   153
                html.tr(class_=('alternate' if i % 2 else None), id=host.id)(
11
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   154
                    html.th(
6
0f243c59d5d1 build urls
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
   155
                        html.a(href=self.url(ItemHandler, id=host.id))(
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   156
                            '#' #host['rowid'])
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   157
                        )
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   158
                    ),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   159
                    html.td(class_='ip')(
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   160
                        html.a(href=self.url(ListHandler, ip=host.ip))(
6
0f243c59d5d1 build urls
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
   161
                            host.ip
0f243c59d5d1 build urls
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
   162
                        )
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   163
                    ),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   164
                    html.td(class_='mac')(
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   165
                        html.a(href=self.url(ListHandler, mac=host.mac))(
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   166
                            host.render_mac()
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   167
                        )
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   168
                    ),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   169
                    html.td(host.render_name()),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   170
                    html.td(host.when()),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   171
                ) for i, host in enumerate(hosts)
12
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   172
            ),
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   173
            html.tfoot(
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   174
                html.tr(
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   175
                    html.td(colspan=(1 + len(COLS)))(
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   176
                        # XXX: does separate SELECT count()
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   177
                        "{count} hosts".format(count=hosts.count())
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   178
                    )
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   179
                )
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   180
            )
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   181
        )
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   182
        
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   183
        if filters is False :
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   184
            return table
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   185
        else :
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   186
            return html.form(method='get', action=self.url())(
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   187
                html.input(type='hidden', name='sort', value=self.sort),
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   188
                table,
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   189
            )
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
   190
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   191
    def render_host (self, host, hosts) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   192
        attrs = (
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   193
                ('IP',          host.ip),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   194
                ('MAC',         host.mac),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   195
                ('Hostname',    host.name),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   196
                ('DNS',         host.dns()),
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   197
                ('First seen',  host.first_seen),
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   198
                ('Last seen',   host.last_seen),
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   199
        )
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
   200
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   201
        return (
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   202
            html.h2('Host'),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   203
            html.dl(
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   204
                (html.dt(title), html.dd(value)) for title, value in attrs
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   205
            ),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   206
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   207
            html.h2('Related'),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   208
            self.render_hosts(hosts),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   209
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   210
            html.a(href=self.url(ListHandler))(html('&laquo;'), 'Back'),
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   211
        )
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   212
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   213
class ItemHandler (BaseHandler) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   214
    def process (self, id) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   215
        self.hosts = self.query()
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   216
        self.host = self.hosts.get(id)
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   217
        
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   218
        if not self.host :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   219
            raise web.NotFound("No such host: {id}".format(id=id))
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   220
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   221
        self.hosts = self.hosts.filter((Host.ip == self.host.ip) | (Host.mac == self.host.mac))
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   222
    
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   223
    def title (self) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   224
        return u"DHCP Host: {self.host}".format(self=self)
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   225
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   226
    def render (self) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   227
        return self.render_host(self.host, self.hosts)
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   228
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   229
class ListHandler (BaseHandler) :
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   230
    def process (self) :
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   231
        self.hosts = self.query()
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   232
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   233
        # filter?
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   234
        self.filters = {}
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   235
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   236
        for attr in self.HOST_ATTRS :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   237
            value = self.request.args.get(attr)
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   238
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   239
            if not value :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   240
                continue
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   241
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   242
            # preprocess
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   243
            like = False
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   244
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   245
            if value.endswith('*') :
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   246
                like = value.replace('*', '%')
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   247
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   248
            elif attr == 'mac' :
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   249
                value = Host.normalize_mac(value)
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   250
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   251
            # filter
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   252
            col = self.HOST_ATTRS[attr]
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   253
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   254
            if like :
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   255
                filter = (col.like(like))
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   256
            else :
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   257
                filter = (col == value)
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   258
            
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   259
            self.hosts = self.hosts.filter(filter)
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   260
            self.filters[attr] = value
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   261
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   262
    def title (self) :
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   263
        if self.filters :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   264
            return "DHCP Hosts: {filters}".format(filters=', '.join(self.filters.itervalues()))
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   265
        else :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   266
            return "DHCP Hosts"
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   267
    
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   268
    def render (self) :
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   269
        return (
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   270
            self.render_hosts(self.hosts, filters=self.filters),
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   271
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   272
            html.a(href=self.url())(html('&laquo;'), 'Back') if self.filters else None,
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   273
        )