#!/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 from sys import argv, path 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 LdapTree import LdapTree class Application(EventHandler): def __init__(self, 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 = [] self._wstest = open('websocket.html', 'r+b') self._wstestmm = mmap.mmap(self._wstest.fileno(), 0) random.seed() self.ldaptree = LdapTree(hosturi, binddn, basedn, password, False) def __del__(self): self._wstestmm.close() self._wstest.close() 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._wstestmm[0:]) 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('