pvl/verkko/hosts.py
author Tero Marttila <terom@paivola.fi>
Sun, 22 Dec 2013 19:03:57 +0200
changeset 336 edaa5d0aa57d
parent 205 f7658198c224
permissions -rw-r--r--
version 0.6.1: pvl.hosts forward/reverse delegation, and include= support
180
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
     1
from pvl.verkko import web, db, table
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
199
ccc34415d6a9 pvl.verkko.hosts: fix RealtimeHandler response.json
Tero Marttila <terom@paivola.fi>
parents: 186
diff changeset
     4
from pvl.web import html, response
0
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
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
import logging; log = logging.getLogger('pvl.verkko.hosts')
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    11
178
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    12
## Model
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    13
import json
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    14
import time
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    15
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    16
def dt2ts (dt) :
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    17
    return int(time.mktime(dt.timetuple()))
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    18
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    19
def ts2dt (ts) :
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    20
    return datetime.datetime.fromtimestamp(ts)
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    21
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
    22
# TODO: this should be DHCPHost
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    23
class Host (object) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    24
    DATE_FMT = '%Y%m%d'
27
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    25
    TIME_FMT = '%H:%M:%S'
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    26
    
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    27
    MAC_HEX = r'([A-Za-z0-9]{2})'
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    28
    MAC_SEP = r'[-:.]?'
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    29
    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
    30
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    31
    @classmethod
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    32
    def normalize_mac (cls, mac) :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    33
        match = cls.MAC_RE.search(mac)
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    34
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    35
        if not match :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    36
            raise ValueError(mac)
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    37
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    38
        else :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    39
            return ':'.join(hh.lower() for hh in match.groups())
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    40
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
    def __init__ (self, ip, mac, name=None) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
        self.ip = ip
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
        self.mac = mac
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
        self.name = name
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
   
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
    def render_mac (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
        if not self.mac :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
            return None
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
        elif len(self.mac) > (6 * 2 + 5) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
            return u'???'
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
        else :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
            return unicode(self.mac)
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
    56
    def network (self) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
    57
        return self.gw
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
    58
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
    def render_name (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
        if self.name :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
            return self.name.decode('ascii', 'replace')
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
        else :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
            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
    64
    
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
    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
    66
        '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
    67
        '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
    68
        '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
    69
        '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
    70
        '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
    71
        '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
    72
    }
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
    73
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
    74
    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
    75
        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
    76
            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
    77
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
    78
        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
    79
            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
    80
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
    81
        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
    82
            return None
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
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
    84
    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
    85
        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
    86
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
    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
    88
        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
    89
            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
    90
        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
    91
            return self.state
27
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    92
    
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    93
    @classmethod
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    94
    def format_datetime (cls, dt) :
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    95
        if (datetime.datetime.now() - dt).days :
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    96
            return dt.strftime(cls.DATE_FMT)
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    97
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    98
        else :
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
    99
            return dt.strftime(cls.TIME_FMT)
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   100
    
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   101
    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
   102
        return (
27
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
   103
                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
   104
                '-',
27
38d050c657da hosts: better seen formatting, fix word wrapping
Tero Marttila <terom@paivola.fi>
parents: 26
diff changeset
   105
                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
   106
        )
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
    def dns (self) :
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
            Reverse-DNS lookup.
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
        """
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
        if not self.ip :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
            return None
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
        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
   117
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
        for sockaddr in sockaddrs :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
            try :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
                host, port = socket.getnameinfo(sockaddr, socket.NI_NAMEREQD)
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
            except socket.gaierror :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
                continue
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
            return host
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
    def __unicode__ (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
        return u"{host.ip} ({host.mac})".format(host=self)
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
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
   130
    #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
   131
    #state   = db.dhcp_hosts.c.,
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
))
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
178
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   134
## Controller 
180
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   135
class HostsTable (table.Table) :
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   136
    """
186
0bfb34281141 pvl.verkko.hosts/leases: docfix
Tero Marttila <terom@paivola.fi>
parents: 183
diff changeset
   137
        <table> of hosts.
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   138
    """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   139
183
8fbaaf0564dc pvl.verkko.tables: fixfix
Tero Marttila <terom@paivola.fi>
parents: 180
diff changeset
   140
    ITEMS   = "Hosts"
180
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   141
    COLUMNS = (
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   142
        table.Column('ip',    "IP",       Host.ip,        
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   143
            rowfilter   = True,
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   144
        ),
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   145
        table.Column('mac',   "MAC",      Host.mac,       Host.render_mac,
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   146
            rowfilter   = True,
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   147
        ),
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   148
        table.Column('name',  "Hostname", Host.name,      Host.render_name, ),
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   149
        table.Column('gw',    "Network",  Host.gw,        Host.network,  ),
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   150
        table.Column('seen',  "Seen",     Host.last_seen, Host.seen, ),
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   151
        table.Column('state', "State",    Host.count,     
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   152
            rowtitle    = Host.state_title,
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   153
            rowcss      = Host.state_class,
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   154
        ),
178
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   155
    )
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   156
    
180
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   157
    # XXX: have to set again
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   158
    ATTRS = dict((col.attr, col) for col in COLUMNS)
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   159
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   160
    # default
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   161
    SORT = Host.last_seen.desc()
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   162
    PAGE = 10
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   163
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   164
class HostsHandler (table.TableHandler, web.DatabaseHandler) :
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   165
    """
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   166
        Combined database + <table>
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   167
    """
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   168
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   169
    CSS = web.DatabaseHandler.CSS + table.TableHandler.CSS + (
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   170
        "/static/dhcp/hosts.css", 
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   171
    )
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   172
    
186
0bfb34281141 pvl.verkko.hosts/leases: docfix
Tero Marttila <terom@paivola.fi>
parents: 183
diff changeset
   173
    # view
180
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   174
    TABLE = HostsTable
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   175
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   176
    def query (self) :
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   177
        """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   178
            Database SELECT query.
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   179
        """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   180
180
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   181
        return self.db.query(Host)
36
90af93caef84 hosts: two-way sorting
Tero Marttila <terom@paivola.fi>
parents: 31
diff changeset
   182
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   183
    def filter_seen (self, value) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   184
        """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   185
            Return filter expression for given attr == value
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   186
        """
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   187
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   188
        column = Host.last_seen
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   189
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   190
        if value.isdigit() :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   191
            # specific date
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   192
            date = datetime.datetime.strptime(value, Host.DATE_FMT).date()
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   193
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   194
            return db.between(date.strftime(Host.DATE_FMT), 
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   195
                    db.func.strftime(Host.DATE_FMT, Host.first_seen),
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   196
                    db.func.strftime(Host.DATE_FMT, Host.last_seen)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   197
            )
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   198
        else :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   199
            # recent
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   200
            timedelta = parse_timedelta(value)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   201
            
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   202
            return ((db.func.now() - Host.last_seen) < timedelta)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   203
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   204
            # XXX: for sqlite, pgsql should handle this natively?
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   205
            # to seconds
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   206
            #timeout = timedelta.days * (24 * 60 * 60) + timedelta.seconds
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   207
            
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   208
            # WHERE strftime('%s', 'now') - strftime('%s', last_seen) < :timeout
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   209
            #filter = (db.func.strftime('%s', 'now') - db.func.strftime('%s', Host.last_seen) < timeout)
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   210
        
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   211
    def filter_ip (self, value) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   212
        column = Host.ip
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   213
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   214
        # column is IPv4 string literal format...
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   215
        if '/' in value :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   216
            return (db.func.inet(Host.ip).op('<<')(db.func.cidr(value)))
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   217
        else :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   218
            return (db.func.inet(Host.ip) == db.func.inet(value))
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   219
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   220
    def filter_mac (self, value) :
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   221
        return self.filter_attr('mac', Host.normalize_mac(value))
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   222
180
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   223
class ItemHandler (HostsHandler) :
178
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   224
    """
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   225
        A specific DHCP host, along with a list of related hosts.
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   226
    """
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   227
    
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   228
    def process (self, id) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   229
        self.hosts = self.query()
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   230
        self.host = self.hosts.get(id)
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   231
        
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   232
        if not self.host :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   233
            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
   234
        
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
        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
   236
    
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   237
    def title (self) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   238
        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
   239
20
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   240
    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
   241
        """
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   242
            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
   243
        """
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   244
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   245
        attrs = (
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   246
                ('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
   247
                ('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
   248
                ('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
   249
                ('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
   250
                ('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
   251
                ('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
   252
                ('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
   253
                ('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
   254
                ('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
   255
        )
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   256
        
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   257
        return (
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   258
            html.dl(
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   259
                (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
   260
            )
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   261
        )
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   262
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   263
    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
   264
        return (
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   265
            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
   266
            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
   267
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   268
            html.h2('Related'),
179
706972d09f05 pvl.verkko.dhcp: refactor table rendering
Tero Marttila <terom@paivola.fi>
parents: 178
diff changeset
   269
            self.render_table(self.hosts, sort=self.sorts, 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
   270
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   271
            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
   272
        )
790e78bed63e hosts: mac/ip filtering keeps current filter; move render_host into ItemHandler
Tero Marttila <terom@paivola.fi>
parents: 19
diff changeset
   273
180
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   274
class ListHandler (HostsHandler) :
178
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   275
    """
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   276
        List of DHCP hosts for given filter.
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   277
    """
f9f5e669bace pvl.verkko: refactor into dhcp -> hosts -> web+db modules, reworking index page
Tero Marttila <terom@paivola.fi>
parents: 158
diff changeset
   278
180
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   279
    TABLE_ITEM_URL = ItemHandler
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
   280
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   281
    def process (self) :
180
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   282
        # super
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   283
        table.TableHandler.process(self)
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   284
 
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   285
    def title (self) :
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   286
        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
   287
            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
   288
        else :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   289
            return "DHCP Hosts"
180
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   290
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   291
    def render (self) :
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   292
        return (
180
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   293
            self.render_table(self.query, filters=self.filters, sort=self.sorts, page=self.page),
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   294
180
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   295
            #html.a(href=self.url())(html('&laquo;'), 'Back') if self.filters else None,
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   296
        )
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   297
180
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   298
class RealtimeHandler (HostsHandler) :
199
ccc34415d6a9 pvl.verkko.hosts: fix RealtimeHandler response.json
Tero Marttila <terom@paivola.fi>
parents: 186
diff changeset
   299
    TITLE = "DHCP Hosts: Pseudo-Realtime.."
180
e6bca452ce72 pvl.verkko: split table from hosts
Tero Marttila <terom@paivola.fi>
parents: 179
diff changeset
   300
    CSS = HostsHandler.CSS + (
28
9940bc6c0a34 hosts: use jquery ui background color animation instead of position
Tero Marttila <terom@paivola.fi>
parents: 27
diff changeset
   301
        '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
   302
    )
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   303
    JS = (
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   304
        #"/static/jquery/jquery.js",
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   305
        '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
   306
        'http://code.jquery.com/ui/1.9.0/jquery-ui.js',
158
3ff66d4f401c split up static into rrd/dhcp
Tero Marttila <terom@paivola.fi>
parents: 151
diff changeset
   307
        '/static/dhcp/spin.js',
205
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   308
        '/static/dhcp/table.js',
158
3ff66d4f401c split up static into rrd/dhcp
Tero Marttila <terom@paivola.fi>
parents: 151
diff changeset
   309
        '/static/dhcp/hosts.js',
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   310
    )
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   311
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   312
    COLUMNS = (
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   313
        ( 'ip',     'IP',           lambda host: host.ip    ),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   314
        ( 'mac',    'MAC',          lambda host: host.mac   ),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   315
        ( 'name',   'Hostname',     lambda host: host.name  ),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   316
        ( 'gw',     'Network',      lambda host: host.gw    ),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   317
        ( 'seen',   'Seen',         Host.seen,              ),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   318
        ( 'state',  'State',        lambda host: host.state ),
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   319
    )
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   320
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   321
    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
   322
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   323
            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
   324
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   325
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   326
        t = self.request.args.get('t')
205
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   327
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   328
        if t :
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   329
            # return json
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   330
            t = ts2dt(int(t))
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   331
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   332
        # query
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   333
        hosts = self.query()
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
   334
        
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   335
        # 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
   336
        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
   337
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   338
        # 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
   339
        self.filters, hosts = self.filter(hosts)
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   340
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   341
        if t :
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   342
            # return json
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   343
            hosts = hosts.filter(Host.last_seen > t)
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   344
            hosts = list(hosts)
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   345
            hosts.reverse()
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   346
            
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   347
            if hosts :
205
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   348
                # update timestamp to most recent
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   349
                t = hosts[-1].last_seen
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   350
205
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   351
            # json
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   352
            data = dict(
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   353
                t       = dt2ts(t),
205
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   354
                hosts   = [dict(self.table.json(host)) for host in hosts],
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   355
            )
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   356
199
ccc34415d6a9 pvl.verkko.hosts: fix RealtimeHandler response.json
Tero Marttila <terom@paivola.fi>
parents: 186
diff changeset
   357
            return response.json(data)
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   358
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   359
        else :
29
38265b7d8f62 hosts.RealtimeHandler: refactor COLUMNS handling
Tero Marttila <terom@paivola.fi>
parents: 28
diff changeset
   360
            # render html
205
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   361
            hosts = hosts.limit(self.table.PAGE)
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   362
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   363
            # XXX: testing
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   364
            hosts = hosts.offset(1)
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   365
205
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   366
            # extract timestamp
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   367
            for host in hosts :
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   368
                self.t = host.last_seen
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   369
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   370
                break
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   371
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   372
            else :
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   373
                # no hosts :<
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   374
                self.t = datetime.datetime.now()
31
3e6d0feb115c pvl.syslog: import from pvl-collectd
Tero Marttila <terom@paivola.fi>
parents: 30
diff changeset
   375
            
205
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   376
            # store
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   377
            self.hosts = hosts
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   378
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
   379
    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
   380
        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
   381
            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
   382
        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
   383
            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
   384
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   385
    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
   386
        """
841d856293a1 hosts: refactor ListHandler filter support up into BaseHandler, adding support for filters in RealtimeHandler
Tero Marttila <terom@paivola.fi>
parents: 29
diff changeset
   387
            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
   388
        """
205
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   389
    
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   390
        return html.div(id='wrapper')(
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   391
            html.input(type='submit', id='refresh', value="Refresh"),
37
9039238f8885 hosts realtime: pause button
Tero Marttila <terom@paivola.fi>
parents: 36
diff changeset
   392
            html.input(type='reset', id='pause', value="Pause"),
205
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   393
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   394
            self.table.render(self.hosts)(id='hosts-realtime'),
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   395
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   396
            html.script(type='text/javascript')(
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   397
                """
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   398
$(document).ready(HostsRealtime(Table($('#hosts-realtime'), {table_params}), {params}));
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   399
                """.format(
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   400
                    table_params = json.dumps(dict(
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   401
                        item_url        = self.url(ItemHandler, id='0'),
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   402
                        columns         = [column.attr for column in self.table.columns],
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   403
                    )),
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   404
                    params = json.dumps(dict(
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   405
                        url     = self.url(),
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   406
                        filters = self.filters,
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   407
                        t       = dt2ts(self.t),
f7658198c224 pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
Tero Marttila <terom@paivola.fi>
parents: 199
diff changeset
   408
                    )),
26
589249097230 hosts: convert realtime list into table; breaks animations :(
Tero Marttila <terom@paivola.fi>
parents: 25
diff changeset
   409
                )
25
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   410
            )
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   411
        )
47faf2ac32d0 hosts: pseudo-realtime list
Tero Marttila <terom@paivola.fi>
parents: 22
diff changeset
   412