pvl/verkko/hosts.py
author Tero Marttila <terom@paivola.fi>
Thu, 18 Oct 2012 23:06:23 +0300
changeset 16 51509b5ce1c0
parent 14 02c21749cb4f
child 17 29f0cf9220e0
permissions -rw-r--r--
request per session, move to postgres, rename columns, fixup state/name/error handling in updates
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'
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    16
    
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    17
    MAC_HEX = r'([A-Za-z0-9]{2})'
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    18
    MAC_SEP = r'[-:.]?'
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    19
    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
    20
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
    21
    @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
    22
    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
    23
        """
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
            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
    25
        """
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
        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
    28
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
        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
    30
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
    @classmethod
8
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
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
    def render_name (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
        if self.name :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
            return self.name.decode('ascii', 'replace')
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
        else :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
            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
    61
    
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
    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
    63
        '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
    64
        '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
    65
        '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
    66
        '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
    67
        '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
    68
        '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
    69
    }
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
    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
    72
        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
    73
            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
    74
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
        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
    76
            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
    77
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
        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
    79
            return None
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
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
    81
    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
    82
        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
    83
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 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
    85
        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
    86
            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
    87
        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
    88
            return self.state
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
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
    def when (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
    91
        return (
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
    92
                html.span(title=self.first_seen)(self.first_seen.strftime(self.DATE_FMT)),
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
    93
                '-',
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
    94
                html.span(title=self.last_seen)(self.last_seen.strftime(self.DATE_FMT)),
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
        )
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
    def dns (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
        """
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
            Reverse-DNS lookup.
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
        """
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
        if not self.ip :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
            return None
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
        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
   106
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
        for sockaddr in sockaddrs :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
            try :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
                host, port = socket.getnameinfo(sockaddr, socket.NI_NAMEREQD)
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
            except socket.gaierror :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
                continue
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
            return host
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
    def __unicode__ (self) :
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
        return u"{host.ip} ({host.mac})".format(host=self)
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
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
   119
    #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
   120
    #state   = db.dhcp_hosts.c.,
0
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
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   123
class BaseHandler (web.Handler) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   124
    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
   125
        '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
   126
        '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
   127
        '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
   128
        '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
   129
        '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
   130
        '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
   131
        'state':    Host.state,
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   132
    }
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   134
    HOST_SORT = Host.last_seen.desc()
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   135
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   136
    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
   137
        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
   138
    
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
   139
    def sort (self, hosts, default=HOST_SORT) :
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   140
        self.sort = self.request.args.get('sort')
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   142
        if self.sort :
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   143
            sort = self.HOST_ATTRS[self.sort]
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   144
        else :
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
   145
            sort = default
0
91c739202f06 initial code for dhcp hosts
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   146
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   147
        log.debug("sort: %s", sort)
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
   148
        
3
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   149
        hosts = hosts.order_by(sort)
5990b188c54b web.Handler
Tero Marttila <terom@paivola.fi>
parents: 1
diff changeset
   150
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   151
        # k
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   152
        return hosts
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   153
    
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
   154
    def render_hosts (self, hosts, title=None, filters=False, page=None) :
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   155
        COLS = (
10
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   156
            #title          sort        filter      class
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   157
            ('IP',          'ip',       'ip',       'ip'    ),
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   158
            ('MAC',         'mac',      'mac',      'mac'   ),
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   159
            ('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
   160
            ('Network',     'net',      'net',      False   ),
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
   161
            ('Seen',        'seen',     'seen',     False   ),
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
   162
            ('State',       'state',    'state',    False   ), 
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   163
        )
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
   164
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   165
        def url (**opts) :
11
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   166
            args = dict()
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   167
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   168
            if filters :
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   169
                args.update(filters)
d1e17bd498e7 fix filters in ItemHandler, tweak id styling
Tero Marttila <terom@paivola.fi>
parents: 10
diff changeset
   170
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   171
            args.update(opts)
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   172
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   173
            return self.url(**args)
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   174
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
   175
        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
   176
            """
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
   177
                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
   178
            """
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
   179
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
   180
            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
   181
                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
   182
            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
   183
                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
   184
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
   185
            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
   186
                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
   187
                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
   188
            
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
   189
            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
   190
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
   191
            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
   192
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
   193
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   194
        table = html.table(
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   195
            html.caption(title) if title else None,
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   196
            html.thead(
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   197
                html.tr(
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   198
                    html.th('#'),
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   199
                    (
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   200
                        html.th(
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   201
                            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
   202
                        ) for title, sort, filter, class_ in COLS
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   203
                    )
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   204
                ),
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   205
                html.tr(class_='filter')(
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   206
                    html.td(
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   207
                        html.input(type='submit', value=u'\u00BF'),
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   208
                    ),
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   209
                    (
10
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   210
                        html.td(class_=class_)(
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   211
                            html.input(type='text', name=filter, value=filters.get(filter)) if filter else None
10
513eb70e54f2 tweak filter styles
Tero Marttila <terom@paivola.fi>
parents: 9
diff changeset
   212
                        ) for title, sort, filter, class_ in COLS
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   213
                    )
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   214
                ) if filters is not False else None
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   215
            ),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   216
            html.tbody(
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   217
                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
   218
                    html.th(
6
0f243c59d5d1 build urls
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
   219
                        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
   220
                            '#' #host.id
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   221
                        )
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   222
                    ),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   223
                    html.td(class_='ip')(
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   224
                        html.a(href=self.url(ListHandler, ip=host.ip))(
6
0f243c59d5d1 build urls
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
   225
                            host.ip
0f243c59d5d1 build urls
Tero Marttila <terom@paivola.fi>
parents: 5
diff changeset
   226
                        )
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   227
                    ),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   228
                    html.td(class_='mac')(
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   229
                        html.a(href=self.url(ListHandler, mac=host.mac))(
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   230
                            host.render_mac()
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
                    ),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   233
                    html.td(host.render_name()),
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
   234
                    html.td(
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
   235
                        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
   236
                    ),
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   237
                    html.td(host.when()),
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
   238
                    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
   239
                ) for i, host in enumerate(hosts)
12
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   240
            ),
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   241
            html.tfoot(
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   242
                html.tr(
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   243
                    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
   244
                        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
   245
                            # 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
   246
                            "{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
   247
                        )
12
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   248
                    )
Tero Marttila <terom@paivola.fi>
parents: 11
diff changeset
   249
                )
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   250
            )
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   251
        )
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   252
        
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   253
        if filters is False :
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   254
            return table
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   255
        else :
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   256
            return html.form(method='get', action=self.url())(
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   257
                html.input(type='hidden', name='sort', value=self.sort),
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   258
                table,
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   259
            )
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
   260
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   261
    def render_host (self, host, hosts) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   262
        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
   263
                ('Network',     host.gw),
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   264
                ('IP',          host.ip),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   265
                ('MAC',         host.mac),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   266
                ('Hostname',    host.name),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   267
                ('DNS',         host.dns()),
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   268
                ('First seen',  host.first_seen),
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   269
                ('Last seen',   host.last_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
   270
                ('Last state',  host.render_state()),
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   271
        )
4
Tero Marttila <terom@paivola.fi>
parents: 3
diff changeset
   272
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   273
        return (
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   274
            html.h2('Host'),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   275
            html.dl(
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   276
                (html.dt(title), html.dd(value)) for title, value in attrs
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   277
            ),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   278
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   279
            html.h2('Related'),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   280
            self.render_hosts(hosts),
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   281
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   282
            html.a(href=self.url(ListHandler))(html('&laquo;'), 'Back'),
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   283
        )
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   284
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   285
class ItemHandler (BaseHandler) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   286
    def process (self, id) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   287
        self.hosts = self.query()
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   288
        self.host = self.hosts.get(id)
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   289
        
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   290
        if not self.host :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   291
            raise web.NotFound("No such host: {id}".format(id=id))
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   292
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
   293
        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
   294
    
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   295
    def title (self) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   296
        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
   297
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   298
    def render (self) :
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   299
        return self.render_host(self.host, self.hosts)
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   300
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   301
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
   302
    # 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
   303
    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
   304
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   305
    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
   306
        hosts = self.query()
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   307
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   308
        # filter?
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
   309
        column = None
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   310
        self.filters = {}
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   311
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   312
        for attr in self.HOST_ATTRS :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   313
            value = self.request.args.get(attr)
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   314
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   315
            if not value :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   316
                continue
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   317
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
   318
            if attr == '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
   319
                column = Host.last_seen
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
   320
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
   321
                if value.isdigit() :
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
   322
                    # specific date
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
   323
                    date = datetime.datetime.strptime(value, Host.DATE_FMT).date()
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   324
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
   325
                    filter = db.between(date.strftime(Host.DATE_FMT), 
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
   326
                            db.func.strftime(Host.DATE_FMT, Host.first_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
   327
                            db.func.strftime(Host.DATE_FMT, 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
   328
                    )
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
   329
                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
   330
                    # recent
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
   331
                    timedelta = parse_timedelta(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
   332
                    
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
   333
                    filter = ((db.func.now() - Host.last_seen) < timedelta)
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   334
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
   335
                    # XXX: for sqlite, pgsql should handle this natively?
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
   336
                    # to seconds
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
   337
                    #timeout = timedelta.days * (24 * 60 * 60) + timedelta.seconds
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
   338
                    
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
   339
                    # WHERE strftime('%s', 'now') - strftime('%s', last_seen) < :timeout
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
   340
                    #filter = (db.func.strftime('%s', 'now') - db.func.strftime('%s', Host.last_seen) < timeout)
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
   341
            
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
   342
            elif attr == 'ip' :
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
   343
                column = Host.ip
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
   344
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
   345
                # column is IPv4 string literal format...
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
   346
                if '/' in value :
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
   347
                    filter = (db.func.inet(Host.ip).op('<<')(db.func.cidr(value)))
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
   348
                else :
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
   349
                    filter = (db.func.inet(Host.ip) == db.func.inet(value))
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
   350
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   351
            else :
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
   352
                # preprocess
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
   353
                like = False
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
   354
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
   355
                if value.endswith('*') :
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
   356
                    like = value.replace('*', '%')
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
   357
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
   358
                elif attr == '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
   359
                    value = Host.normalize_mac(value)
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
   360
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
   361
                # filter
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
   362
                column = self.HOST_ATTRS[attr]
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
   363
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
   364
                if like :
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
   365
                    filter = (column.like(like))
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
   366
                else :
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
   367
                    filter = (column == value)
9
3334d8ddf2f1 hosts: implement filtering in ListHandler
Tero Marttila <terom@paivola.fi>
parents: 8
diff changeset
   368
            
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
   369
            hosts = hosts.filter(filter)
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   370
            self.filters[attr] = 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
   371
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
   372
        # sort XXX: default per filter column
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
   373
        hosts = self.sort(hosts) #, column)
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
   374
        
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
   375
        # 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
   376
        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
   377
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
   378
        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
   379
            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
   380
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
   381
            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
   382
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
   383
        self.hosts = hosts
5
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   384
91970ce3fc6b pvl.verkko.hosts: split up Handlers
Tero Marttila <terom@paivola.fi>
parents: 4
diff changeset
   385
    def title (self) :
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   386
        if self.filters :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   387
            return "DHCP Hosts: {filters}".format(filters=', '.join(self.filters.itervalues()))
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   388
        else :
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   389
            return "DHCP Hosts"
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 render (self) :
8
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   392
        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
   393
            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
   394
f64c44640b15 hosts: change ListHandler to use filtering
Tero Marttila <terom@paivola.fi>
parents: 6
diff changeset
   395
            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
   396
        )