pvl/verkko/hosts.py
author Tero Marttila <terom@paivola.fi>
Wed, 24 Oct 2012 21:02:33 +0300
changeset 31 3e6d0feb115c
parent 30 841d856293a1
child 36 90af93caef84
permissions -rw-r--r--
pvl.syslog: import from pvl-collectd
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
from pvl.verkko import db, web
14
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
     2
from pvl.verkko.utils import parse_timedelta, IPv4Network
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
from pvl.html import tags as html
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
     6
import re
14
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
     7
import datetime
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
import socket # dns
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
     9
import math
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
import logging; log = logging.getLogger('pvl.verkko.hosts')
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
1
731d2df704f0 fixup index + non-chunked response (?) + hosts + evil hardcoded db url
Tero Marttila <terom@paivola.fi>
parents: 0
diff changeset
    13
# XXX: this should actually be DHCPHost
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
class Host (object) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
    DATE_FMT = '%Y%m%d'
27
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    16
    TIME_FMT = '%H:%M:%S'
8
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
    MAC_HEX = r'([A-Za-z0-9]{2})'
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    19
    MAC_SEP = r'[-:.]?'
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    20
    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
    21
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    22
    @classmethod
14
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    23
    def query (cls, session, seen=None) :
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    24
        """
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    25
            seen        - select hosts seen during given timedelta period
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    26
        """
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    27
        
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    28
        query = session.query(cls)
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    29
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    30
        return query
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    31
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    32
    @classmethod
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    33
    def normalize_mac (cls, mac) :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    34
        match = cls.MAC_RE.search(mac)
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    35
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    36
        if not match :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    37
            raise ValueError(mac)
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    38
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    39
        else :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    40
            return ':'.join(hh.lower() for hh in match.groups())
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
    def __init__ (self, ip, mac, name=None) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
        self.ip = ip
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
        self.mac = mac
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
        self.name = name
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
   
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
    def render_mac (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
        if not self.mac :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
            return None
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
        elif len(self.mac) > (6 * 2 + 5) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
            return u'???'
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
        else :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
            return unicode(self.mac)
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
    def render_name (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
        if self.name :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
            return self.name.decode('ascii', 'replace')
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
        else :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
            return None
14
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    62
    
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    63
    STATES = {
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    64
        'DHCPACK':      'ack',
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    65
        'DHCPNAK':      'nak',
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    66
        'DHCPRELEASE':  'release',
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    67
        'DHCPDISCOVER': 'search',
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    68
        'DHCPREQUEST':  'search',
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    69
        'DHCPOFFER':    'search',
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    70
    }
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    71
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    72
    def state_class (self) :
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    73
        if self.error :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    74
            return 'dhcp-error'
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    75
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    76
        elif self.state in self.STATES :
14
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    77
            return 'dhcp-' + self.STATES[self.state]
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    78
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    79
        else :
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
    80
            return None
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    82
    def state_title (self) :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    83
        return self.error # or None
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    84
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    85
    def render_state (self) :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    86
        if self.error :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    87
            return "{self.state}: {self.error}".format(self=self)
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    88
        else :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    89
            return self.state
27
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    90
    
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    91
    @classmethod
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    92
    def format_datetime (cls, dt) :
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    93
        if (datetime.datetime.now() - dt).days :
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    94
            return dt.strftime(cls.DATE_FMT)
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    95
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    96
        else :
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    97
            return dt.strftime(cls.TIME_FMT)
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    98
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
    99
    def seen (self) :
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   100
        return (
27
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
   101
                html.span(title=self.first_seen)(self.format_datetime(self.first_seen)),
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   102
                '-',
27
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
   103
                html.span(title=self.last_seen)(self.format_datetime(self.last_seen))
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
        )
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
    def dns (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
        """
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
            Reverse-DNS lookup.
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
        """
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
        if not self.ip :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
            return None
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
        
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
        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
   115
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
        for sockaddr in sockaddrs :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
            try :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
                host, port = socket.getnameinfo(sockaddr, socket.NI_NAMEREQD)
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
            except socket.gaierror :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
                continue
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
            return host
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
    def __unicode__ (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
        return u"{host.ip} ({host.mac})".format(host=self)
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
db.mapper(Host, db.dhcp_hosts, properties=dict(
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   128
    #id      = db.dhcp_hosts.c.rowid,
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   129
    #state   = db.dhcp_hosts.c.,
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
))
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   132
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   133
   
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   134
 
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   135
class BaseHandler (web.Handler) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   136
    HOST_ATTRS = {
14
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   137
        'id':       Host.id,
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   138
        'net':      Host.gw,
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   139
        'ip':       Host.ip,
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   140
        'mac':      Host.mac,
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   141
        'name':     Host.name,
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   142
        'seen':     Host.last_seen,
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   143
        'state':    Host.state,
17
29f0cf9220e0 track dhcp leases, using pvl.verkko.dhcp.leases from pvl-collectd..
Tero Marttila <terom@paivola.fi>
parents: 16
diff changeset
   144
        'count':    Host.count,
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   145
    }
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   146
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   147
    HOST_SORT = Host.last_seen.desc()
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   148
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   149
    def query (self) :
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   150
        return self.db.query(Host)
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   151
    
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   152
    def sort (self, hosts, default=HOST_SORT) :
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   153
        sort = self.request.args.get('sort')
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   155
        if sort :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   156
            order_by = self.HOST_ATTRS[sort]
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   157
        else :
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   158
            order_by = default
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   160
        log.debug("sort: %s", order_by)
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   161
        
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   162
        hosts = hosts.order_by(order_by)
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   163
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   164
        # k
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   165
        return sort, hosts
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   166
    
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   167
    def filter_attr (self, attr, value) :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   168
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   169
            Return filter expression for given attr == value
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   170
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   171
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   172
        if attr == 'seen' :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   173
            column = Host.last_seen
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   174
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   175
            if value.isdigit() :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   176
                # specific date
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   177
                date = datetime.datetime.strptime(value, Host.DATE_FMT).date()
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   178
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   179
                return db.between(date.strftime(Host.DATE_FMT), 
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   180
                        db.func.strftime(Host.DATE_FMT, Host.first_seen),
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   181
                        db.func.strftime(Host.DATE_FMT, Host.last_seen)
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   182
                )
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   183
            else :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   184
                # recent
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   185
                timedelta = parse_timedelta(value)
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   186
                
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   187
                return ((db.func.now() - Host.last_seen) < timedelta)
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   188
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   189
                # XXX: for sqlite, pgsql should handle this natively?
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   190
                # to seconds
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   191
                #timeout = timedelta.days * (24 * 60 * 60) + timedelta.seconds
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   192
                
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   193
                # WHERE strftime('%s', 'now') - strftime('%s', last_seen) < :timeout
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   194
                #filter = (db.func.strftime('%s', 'now') - db.func.strftime('%s', Host.last_seen) < timeout)
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   195
        
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   196
        elif attr == 'ip' :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   197
            column = Host.ip
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   198
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   199
            # column is IPv4 string literal format...
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   200
            if '/' in value :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   201
                return (db.func.inet(Host.ip).op('<<')(db.func.cidr(value)))
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   202
            else :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   203
                return (db.func.inet(Host.ip) == db.func.inet(value))
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   204
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   205
        else :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   206
            # preprocess
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   207
            like = False
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   208
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   209
            if value.endswith('*') :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   210
                like = value.replace('*', '%')
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   211
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   212
            elif attr == 'mac' :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   213
                value = Host.normalize_mac(value)
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   214
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   215
            # filter
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   216
            column = self.HOST_ATTRS[attr]
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   217
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   218
            if like :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   219
                return (column.like(like))
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   220
            else :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   221
                return (column == value)
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   222
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   223
    def filter (self, hosts) :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   224
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   225
            Apply filters from request.args against given hosts.
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   226
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   227
            Returns (filters, hosts).
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   228
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   229
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   230
        # filter?
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   231
        filters = {}
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   232
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   233
        for attr in self.HOST_ATTRS :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   234
            values = self.request.args.getlist(attr)
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   235
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   236
            if not values :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   237
                continue
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   238
            
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   239
            filter = db.or_(*[self.filter_attr(attr, value) for value in values])
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   240
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   241
            log.debug("filter %s: %s", attr, filter)
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   242
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   243
            hosts = hosts.filter(filter)
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   244
            filters[attr] = values
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   245
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   246
        return filters, hosts
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   247
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   248
    def filters_title (self) :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   249
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   250
            Return a string representing the applied filters.
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   251
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   252
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   253
        return ', '.join(value for values in self.filters.itervalues() for value in values)
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   254
 
21
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   255
    def render_hosts (self, hosts, title=None, filters=False, page=None, hilight=None) :
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   256
        COLS = (
10
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   257
            #title          sort        filter      class
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   258
            ('IP',          'ip',       'ip',       'ip'    ),
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   259
            ('MAC',         'mac',      'mac',      'mac'   ),
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   260
            ('Hostname',    'name',     False,      False   ),
14
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   261
            ('Network',     'net',      'net',      False   ),
27
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
   262
            ('Seen',        'seen',     'seen',     'seen'  ),
14
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   263
            ('State',       'state',    'state',    False   ), 
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   264
        )
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
   265
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   266
        def url (**opts) :
11
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   267
            args = dict()
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   268
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   269
            if filters :
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   270
                args.update(filters)
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   271
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   272
            args.update(opts)
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   273
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   274
            return self.url(**args)
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   275
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   276
        def paginate (page, count=None) :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   277
            """
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   278
                Render pagination.
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   279
            """
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   280
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   281
            if count is not None :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   282
                pages = int(math.ceil(count / self.PAGE)) # XXX: bad self.PAGE
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   283
            else :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   284
                pages = None
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   285
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   286
            if page > 0 :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   287
                yield html.a(href=url(page=0))(html("&laquo;&laquo; First"))
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   288
                yield html.a(href=url(page=(page - 1)))(html("&laquo; Prev"))
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   289
            
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   290
            yield html.span("Page {page} of {pages}".format(page=(page + 1), pages=(pages or '???')))
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   291
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   292
            yield html.a(href=url(page=(page + 1)))(html("&raquo; Next"))
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   293
19
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   294
        def render_filter (filter) :
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   295
            value = filters.get(filter)
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   296
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   297
            if value :
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   298
                # XXX: multi-valued filters?
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   299
                value = value[0]
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   300
            else :
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   301
                value = None
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   302
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   303
            return html.input(type='text', name=filter, value=value)
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   304
21
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   305
        def render_cell (attr, value, cssclass=True, filter=None, htmlvalue=None) :
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   306
            if htmlvalue :
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   307
                cell = htmlvalue
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   308
            else :
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   309
                cell = value
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   310
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   311
            if filter :
27
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
   312
                cell = html.a(href=self.url(ListHandler, **{attr: value}))(cell)
21
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   313
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   314
            if cssclass is True :
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   315
                cssclass = attr
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   316
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   317
            css = (cssclass, 'hilight' if (hilight and attr in hilight and value in hilight[attr]) else None)
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   318
            css = ' '.join(cls for cls in css if cls)
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   319
            
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   320
            return html.td(class_=css)(cell)
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   321
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   322
        table = html.table(
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   323
            html.caption(title) if title else None,
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   324
            html.thead(
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   325
                html.tr(
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   326
                    html.th('#'),
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   327
                    (
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   328
                        html.th(
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   329
                            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
   330
                        ) for title, sort, filter, class_ in COLS
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   331
                    )
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   332
                ),
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   333
                html.tr(class_='filter')(
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   334
                    html.td(
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   335
                        html.input(type='submit', value=u'\u00BF'),
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   336
                    ),
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   337
                    (
10
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   338
                        html.td(class_=class_)(
19
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   339
                            render_filter(filter) if filter else None
10
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   340
                        ) for title, sort, filter, class_ in COLS
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   341
                    )
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   342
                ) if filters is not False else None
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   343
            ),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   344
            html.tbody(
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   345
                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
   346
                    html.th(
6
0f243c59d5d1 build urls
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
   347
                        html.a(href=self.url(ItemHandler, id=host.id))(
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   348
                            '#' #host.id
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   349
                        )
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   350
                    ),
21
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   351
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   352
                    render_cell('ip', host.ip, filter=True),
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   353
                    render_cell('mac', host.mac, filter=True, htmlvalue=host.render_mac()),
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   354
                    render_cell('name', host.name, htmlvalue=host.render_name()),
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   355
                    render_cell('gw', host.gw),
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   356
27
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
   357
                    render_cell('seen', host.seen()),
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   358
                    html.td(class_=host.state_class(), title=host.state_title())(host.state),
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   359
                ) for i, host in enumerate(hosts)
12
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   360
            ),
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   361
            html.tfoot(
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   362
                html.tr(
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   363
                    html.td(colspan=(1 + len(COLS)))(
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   364
                        paginate(page) if page is not None else (
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   365
                            # XXX: does separate SELECT count()
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   366
                            "{count} hosts".format(count=hosts.count())
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   367
                        )
12
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   368
                    )
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   369
                )
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   370
            )
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   371
        )
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   372
        
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   373
        if filters is False :
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   374
            return table
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   375
        else :
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   376
            return html.form(method='get', action=self.url())(
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   377
                html.input(type='hidden', name='sort', value=self.sorts),
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   378
                table,
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   379
            )
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
   380
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   381
class ItemHandler (BaseHandler) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   382
    def process (self, id) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   383
        self.hosts = self.query()
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   384
        self.host = self.hosts.get(id)
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   385
        
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   386
        if not self.host :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   387
            raise web.NotFound("No such host: {id}".format(id=id))
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   388
        
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   389
        self.sorts, self.hosts = self.sort(self.hosts.filter((Host.ip == self.host.ip) | (Host.mac == self.host.mac)))
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   390
    
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   391
    def title (self) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   392
        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
   393
20
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   394
    def render_host (self, host) :
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   395
        """
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   396
            Details for specific host.
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   397
        """
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   398
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   399
        attrs = (
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   400
                ('Network',     host.gw),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   401
                ('IP',          host.ip),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   402
                ('MAC',         host.mac),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   403
                ('Hostname',    host.name),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   404
                ('DNS',         host.dns()),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   405
                ('First seen',  host.first_seen),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   406
                ('Last seen',   host.last_seen),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   407
                ('Last state',  host.render_state()),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   408
                ('Total messages',      host.count),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   409
        )
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   410
        
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   411
        return (
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   412
            html.dl(
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   413
                (html.dt(title), html.dd(value)) for title, value in attrs
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   414
            )
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   415
        )
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   416
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   417
    def render (self) :
20
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   418
        return (
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   419
            html.h2('Host'),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   420
            self.render_host(self.host),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   421
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   422
            html.h2('Related'),
21
55ca67b5000d hosts.BaseHandler.render_hosts: hilight for ip/mac in host related list
Tero Marttila <terom@paivola.fi>
parents: 20
diff changeset
   423
            self.render_hosts(self.hosts, hilight=dict(ip=self.host.ip, mac=self.host.mac)),
20
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   424
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   425
            html.a(href=self.url(ListHandler))(html('&laquo;'), 'Back'),
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   426
        )
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   427
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   428
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   429
class ListHandler (BaseHandler) :
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   430
    # pagination
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   431
    PAGE = 10
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   432
19
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   433
    # views
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   434
    VIEWS = (
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   435
        ("Last hour",   dict(seen='1h')),
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   436
        ("Last day",    dict(seen='24h')),
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   437
        ("All",         dict()),
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   438
    ) + tuple(
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   439
        ("Network " + network,          dict(ip=network)) for network in (
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   440
            '194.197.235.0/24',
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   441
            '10.1.0.0/16',
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   442
            '10.4.0.0/16',
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   443
            '10.5.0.0/16',
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   444
            '10.6.0.0/16',
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   445
            '10.10.0.0/16',
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   446
        )
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   447
    ) + (
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   448
        ("Valid",       dict(state=('DHCPACK', 'DHCPRELEASE'))),
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   449
        ("Incomplete",  dict(state=('DHCPDISCOVER', 'DHCPOFFER', 'DHCPREQUEST'))),
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   450
        ("Invalid",     dict(state=('DHCPNAK', ))),
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   451
    )
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   452
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   453
    def process (self) :
14
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   454
        hosts = self.query()
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   455
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   456
        # filter
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   457
        self.filters, hosts = self.filter(hosts)
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   458
19
4e2e26f4d058 pvl.verkko.hosts: multi-value filters
Tero Marttila <terom@paivola.fi>
parents: 17
diff changeset
   459
        # sort XXX: default per filter column?
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   460
        self.sorts, hosts = self.sort(hosts)
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   461
        
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   462
        # page?
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   463
        self.page = self.request.args.get('page')
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   464
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   465
        if self.page :
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   466
            self.page = int(self.page)
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   467
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   468
            hosts = hosts.offset(self.page * self.PAGE).limit(self.PAGE)
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   469
14
02c21749cb4f pvl.verkko: re-add last_msg back to db, implement state, seen filtering in web frontend
Tero Marttila <terom@paivola.fi>
parents: 12
diff changeset
   470
        self.hosts = hosts
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   471
  
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   472
    def title (self) :
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   473
        if self.filters :
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   474
            return "DHCP Hosts: {filters}".format(filters=self.filters_title())
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   475
        else :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   476
            return "DHCP Hosts"
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   477
    
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   478
    def render (self) :
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   479
        return (
16
51509b5ce1c0 request per session, move to postgres, rename columns, fixup state/name/error handling in updates
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
   480
            self.render_hosts(self.hosts, filters=self.filters, page=self.page),
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   481
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   482
            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
   483
        )
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   484
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   485
import json
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   486
import time
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   487
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   488
def dt2ts (dt) :
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   489
    return int(time.mktime(dt.timetuple()))
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   490
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   491
def ts2dt (ts) :
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   492
    return datetime.datetime.fromtimestamp(ts)
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   493
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   494
class RealtimeHandler (BaseHandler) :
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   495
    TITLE = "Pseudo-Realtime hosts.."
28
9940bc6c0a34 hosts: use jquery ui background color animation instead of position
Tero Marttila <terom@paivola.fi>
parents: 27
diff changeset
   496
    CSS = web.Handler.CSS + (
9940bc6c0a34 hosts: use jquery ui background color animation instead of position
Tero Marttila <terom@paivola.fi>
parents: 27
diff changeset
   497
        'http://code.jquery.com/ui/1.9.0/themes/base/jquery-ui.css',
9940bc6c0a34 hosts: use jquery ui background color animation instead of position
Tero Marttila <terom@paivola.fi>
parents: 27
diff changeset
   498
    )
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   499
    JS = (
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   500
        #"/static/jquery/jquery.js",
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   501
        'http://code.jquery.com/jquery-1.8.2.js',
28
9940bc6c0a34 hosts: use jquery ui background color animation instead of position
Tero Marttila <terom@paivola.fi>
parents: 27
diff changeset
   502
        'http://code.jquery.com/ui/1.9.0/jquery-ui.js',
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   503
        '/static/js/spin.js',
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   504
        '/static/hosts.js',
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   505
    )
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   506
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   507
    COLUMNS = (
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   508
        ( 'ip',     'IP',           lambda host: host.ip    ),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   509
        ( 'mac',    'MAC',          lambda host: host.mac   ),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   510
        ( 'name',   'Hostname',     lambda host: host.name  ),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   511
        ( 'gw',     'Network',      lambda host: host.gw    ),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   512
        ( 'seen',   'Seen',         Host.seen,              ),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   513
        ( 'state',  'State',        lambda host: host.state ),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   514
    )
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   515
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   516
    def process (self) :
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   517
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   518
            Either return JSON (if ?t=...), or fetch hosts/t for rendering.
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   519
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   520
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   521
        hosts = self.db.query(Host)
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   522
        t = self.request.args.get('t')
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   523
        
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   524
        # always sorted by last_seen
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   525
        hosts = hosts.order_by(Host.last_seen.desc())
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   526
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   527
        # filter
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   528
        self.filters, hosts = self.filter(hosts)
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   529
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   530
        def host_params (host) :
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   531
            yield 'id', host.id
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   532
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   533
            for name, title, fvalue in self.COLUMNS :
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   534
                value = fvalue(host)
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   535
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   536
                if name == 'seen' :
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   537
                    # XXX: hackfix html() rendering
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   538
                    value = unicode(html.div(value))
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   539
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   540
                yield name, value
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   541
            
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   542
            # special
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   543
            yield 'state_class', host.state_class()
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   544
        
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   545
        if t :
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   546
            # return json
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   547
            t = ts2dt(int(t))
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   548
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   549
            hosts = hosts.filter(Host.last_seen > t)
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   550
            hosts = list(hosts)
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   551
            hosts.reverse()
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   552
            
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   553
            if hosts :
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   554
                t = hosts[-1].last_seen
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   555
                hosts = [dict(host_params(host)) for host in hosts]
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   556
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   557
            else :
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   558
                hosts = []
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   559
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   560
            data = dict(
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   561
                t       = dt2ts(t),
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   562
                hosts   = hosts,
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   563
            )
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   564
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   565
            return web.Response(json.dumps(data), mimetype='text/json')
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   566
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   567
        else :
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   568
            # render html
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   569
            hosts = hosts.limit(10)
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   570
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   571
            # XXX: testing
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   572
            hosts = hosts.offset(1)
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   573
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   574
            self.hosts = list(hosts)
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   575
            
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   576
            if self.hosts :
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   577
                self.t = self.hosts[0].last_seen
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   578
            else :
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   579
                self.t = datetime.datetime.now()
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   580
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   581
    def title (self) :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   582
        if self.filters :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   583
            return "{title}: {filters}".format(title=self.TITLE, filters=self.filters_title())
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   584
        else :
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   585
            return self.TITLE
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   586
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   587
    def render (self) :
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   588
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   589
            Render page HTML and initial <table>, along with bootstrap JS (t0, configuration).
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   590
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   591
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   592
        def column (name, title, fvalue, host) :
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   593
            cls = name
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   594
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   595
            if name == 'state' :
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   596
                cls = host.state_class()
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   597
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   598
            return html.td(class_=cls)(fvalue(host))
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   599
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   600
        params = dict(
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   601
            url     = self.url(),
30
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   602
            filters = self.filters,
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   603
            t       = dt2ts(self.t),
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   604
            host    = self.url(ItemHandler, id='0'),
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   605
            columns = [name for name, title, fvalue in self.COLUMNS]
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   606
        )
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   607
        params = json.dumps(params)
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   608
        
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   609
        return html.div(id='wrapper')(
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   610
            html.input(type='submit', id='refresh', value="Refresh"),
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   611
            html.table(id='hosts')(
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   612
                html.thead(
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   613
                    html.tr(
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   614
                        html.th('#'),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   615
                        (
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   616
                            html.th(class_=name)(title) for name, title, fvalue in self.COLUMNS
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   617
                        )
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   618
                    ),
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   619
                ),
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   620
                html.tbody(
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   621
                    html.tr(id=host.id)(
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   622
                        html.td(html.a(href=self.url(ItemHandler, id=host.id))('#')),
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   623
                        (
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   624
                            column(name, title, fvalue, host) for name, title, fvalue in self.COLUMNS
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   625
                        ),
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   626
                    ) for host in self.hosts
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   627
                )
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   628
            ),
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   629
            html.script(type='text/javascript')("""
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   630
$(document).ready(hosts_realtime({params}));
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   631
""".format(params=params)
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   632
            )
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   633
        )
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   634