#!/usr/bin/python import time import random import mmap import sys, getopt from struct import pack from collections import deque from os.path import dirname, realpath path.append(dirname(realpath(__file__)) + '/lib') from Server import Server from Event.EventHandler import EventHandler from Event.EventDispatcher import EventDispatcher from Communication.EndPoint import CommunicationEndPoint from Protocol.Http.Http import Http from Protocol.Websocket.Websocket import Websocket from jinja2 import Environment, FileSystemLoader from LdapTree import LdapTree class Application(EventHandler): def __init__(self, ip, port, hosturi, binddn, basedn, password): super(Application, self).__init__() self._event_methods = { EventDispatcher.eventId('heartbeat') : self._heartbeat, CommunicationEndPoint.eventId('new_msg') : self._handle_data, CommunicationEndPoint.eventId('close') : self._handle_close, CommunicationEndPoint.eventId('upgrade') : self._upgrade } self._websockets = [] env = Environment(loader=FileSystemLoader( dirname(realpath(__file__)) + '/templates')) template = env.get_template('websocket.html.j2') # TODO get ip and port or better our complete base uri here. self._page = template.render(ip=ip, port=port) random.seed() self.ldaptree = LdapTree(hosturi, binddn, basedn, password, False) def _upgrade(self, event): self._websockets.append(event.subject) # let other also handle the upgrade .. no return True def _heartbeat(self, event): now = pack('!d', time.time()) for event.subject in self._websockets: self.issueEvent(event.subject, 'send_msg', now) return True def _handle_data(self, event): protocol = event.subject.getProtocol() if event.subject.hasProtocol(Http): if event.data.isRequest(): if event.data.getUri() == '/': resp = protocol.createResponse(event.data, 200, 'OK') resp.setBody(self._page) elif event.data.getUri() == '/ldap': resp = protocol.createResponse(event.data, 200, 'OK') resp.setHeader('Content-Type', 'image/svg+xml') resp.setBody(self.ldaptree.graph()) else: resp = protocol.createResponse( event.data, 404, 'Not Found') resp.setBody('