# -*- coding: utf-8 -*-
#
# Module name: controller.py
# Version: 1.0
# Created: 29/04/2014 by Aurélien Wailly <aurelien.wailly@orange.com>
#
# Copyright (C) 2010-2014 Orange
#
# This file is part of VESPA.
#
# VESPA is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation version 2.1.
#
# VESPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with VESPA. If not, see <http://www.gnu.org/licenses/>.
"""
Controller
"""
from log_pipe import *
import signal
import time
import json
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from SocketServer import ThreadingMixIn
import threading
import urlparse
[docs]class HttpServerHandler(BaseHTTPRequestHandler):
[docs] def do_GET(self):
# content_length = int(self.headers.getheader("Content-Length"))
# request = self.rfile.read(content_length)
# BaseHTTPRequestHandler has a property called server and because
# we create MyHTTPServer, it has a handler property
request = urlparse.urlparse(self.path)
c = self.server.controller
response = self.server.handler(c, request.path)
debug_controller(request)
self.send_response(200)
self.send_header("Access-Control-Allow-Origin", "*")
self.end_headers()
self.wfile.write(json.dumps(response))
[docs] def log_message(self, format, *args):
return
[docs]class MyHTTPServer(HTTPServer):
"""this class is necessary to allow passing custom request handler into
the RequestHandlerClass"""
def __init__(self, server_address, RequestHandlerClass, handler, control):
HTTPServer.__init__(self, server_address, RequestHandlerClass)
self.handler = handler
self.controller = control
[docs]class HttpServer:
def __init__(self, name, host, port, handler, c):
self.name = name
self.host = host
self.port = port
self.handler = handler
self.server = None
self.controller = c
[docs] def start(self):
# we need use MyHttpServer here
self.server = MyHTTPServer((self.host, self.port), HttpServerHandler,
self.handler, self.controller)
self.server.serve_forever()
[docs] def stop(self):
if self.server:
self.server.shutdown()
[docs]def server_handler(c, request):
if request == "/archi":
vo = c.model.slaves[0]
vo_name, vo_host, vo_port = vo
a = {'name': vo_name, 'host': vo_host, 'port': vo_port, 'children': []}
vo_slaves_raw = c.model.sendRemote(vo, "list_slaves|")
vo_slaves = eval(vo_slaves_raw)
for ho in vo_slaves:
ho_name, ho_host, ho_port = ho
b = {'name': ho_name, 'host': ho_host, 'port': ho_port,
'children': []}
a['children'].append(b)
ho_slaves_raw = c.model.sendRemote(ho, "list_slaves|")
try:
ho_slaves = eval(ho_slaves_raw)
except SyntaxError:
ho_slaves = []
for agent_name, agent_host, agent_port in ho_slaves:
d = {'name': agent_name, 'host': agent_host,
'port': agent_port, 'children': []}
b['children'].append(d)
return a
elif request == "/trans_bytes":
vo = c.model.slaves[0]
return eval(c.model.sendRemote(vo, "get_trans_bytes|"))
elif request == "/recv_bytes":
vo = c.model.slaves[0]
return eval(c.model.sendRemote(vo, "get_recv_bytes|"))
elif request == "/get_configini":
return c.model.config
elif request == "/get_alerts":
vo = c.model.slaves[0]
return eval(c.model.sendRemote(vo, "get_alerts|"))
elif request == "/connect":
return "Ok"
elif request == "/next_recv_bytes":
vo = c.model.slaves[0]
return eval(c.model.sendRemote(vo, "get_next_recv_bytes|"))
elif request == "/next_trans_bytes":
vo = c.model.slaves[0]
return eval(c.model.sendRemote(vo, "get_next_trans_bytes|"))
elif request == "/get_ip_connections":
vo = c.model.slaves[0]
return eval(c.model.sendRemote(vo, "get_ip_connections|"))
elif request == "/get_topology":
vo = c.model.slaves[0]
return eval(c.model.sendRemote(vo, "get_topology|"))
elif request == "/get_link_stats":
vo = c.model.slaves[0]
return eval(c.model.sendRemote(vo, "get_link_stats|"))
else:
return request
[docs]class Controller(object):
def __init__(self, model, view, testmode=False):
self.model = model
self.view = view
self.testmode = testmode
[docs] def handler(self, signum, false):
if signum == 2:
debug_init("Controller received shutting down")
self._shutdown()
def _shutdown(self):
self.model.destroy()
if not self.testmode:
exit(0)
self.server.stop()
[docs] def start(self):
debug5("Started Controller")
if not self.testmode:
signal.signal(signal.SIGINT, self.handler)
self.server = HttpServer("test server", "0.0.0.0", 8080,
server_handler, self)
self.server.start()