diff options
author | Matt Hart <matthew.hart@linaro.org> | 2014-04-18 17:43:41 +0100 |
---|---|---|
committer | Matt Hart <matthew.hart@linaro.org> | 2014-04-18 17:43:41 +0100 |
commit | ffb5edd271230606407c5ebe4c708cd637ea7436 (patch) | |
tree | 4183ac39b7e348a660fcae2ce7e134e1a3889f03 | |
parent | bc8b057384ebc289f6f708818c78690b4c4d36d4 (diff) |
Renamed folder and cut down socketserver.py to remove the lavapdu specific stuff
-rw-r--r-- | lavapdu/socketserver.py | 143 | ||||
-rw-r--r-- | lavaproxy/__init__.py (renamed from lavapdu/__init__.py) | 0 | ||||
-rw-r--r-- | lavaproxy/apcdrivers.py (renamed from lavapdu/apcdrivers.py) | 0 | ||||
-rw-r--r-- | lavaproxy/driver.py (renamed from lavapdu/driver.py) | 0 | ||||
-rw-r--r-- | lavaproxy/engine.py (renamed from lavapdu/engine.py) | 0 | ||||
-rw-r--r-- | lavaproxy/pdurunner.py (renamed from lavapdu/pdurunner.py) | 0 | ||||
-rw-r--r-- | lavaproxy/proxyexample.py | 98 | ||||
-rw-r--r-- | lavaproxy/socketserver.py | 80 |
8 files changed, 178 insertions, 143 deletions
diff --git a/lavapdu/socketserver.py b/lavapdu/socketserver.py deleted file mode 100644 index 5a6011c..0000000 --- a/lavapdu/socketserver.py +++ /dev/null @@ -1,143 +0,0 @@ -#! /usr/bin/python - -# Copyright 2013 Linaro Limited -# Author Matt Hart <matthew.hart@linaro.org> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, -# MA 02110-1301, USA. - -import SocketServer -import psycopg2 -import logging -import socket - - -class DBHandler(object): - def __init__(self, config): - logging.debug("Creating new DBHandler: %s" % config["dbhost"]) - logging.getLogger().name = "DBHandler" - self.conn = psycopg2.connect(database=config["dbname"], user=config["dbuser"], - password=config["dbpass"], host=config["dbhost"]) - self.cursor = self.conn.cursor() - - def do_sql(self, sql): - logging.debug("executing sql: %s" % sql) - self.cursor.execute(sql) - self.conn.commit() - - def do_sql_with_fetch(self, sql): - logging.debug("executing sql: %s" % sql) - self.cursor.execute(sql) - row = self.cursor.fetchone() - self.conn.commit() - return row - - def delete_row(self, row_id): - logging.debug("deleting row %i" % row_id) - self.do_sql("delete from pdu_queue where id=%i" % row_id) - - def get_res(self, sql): - return self.cursor.execute(sql) - - def get_next_job(self): - row = self.do_sql_with_fetch("select * from pdu_queue order by id asc limit 1") - return row - - def close(self): - logging.debug("Closing DBHandler") - self.cursor.close() - self.conn.close() - - -class ListenerServer(object): - - def __init__(self, config): - self.server = TCPServer((config["hostname"], config["port"]), TCPRequestHandler) - logging.getLogger().name = "ListenerServer" - logging.getLogger().setLevel(config["logging_level"]) - logging.info("listening on %s:%s" % (config["hostname"], config["port"])) - self.server.config = config - self.db = DBHandler(config) - self.create_db() - self.db.close() - del(self.db) - - def create_db(self): - sql = "create table if not exists pdu_queue (id serial, hostname text, port int, request text)" - self.db.do_sql(sql) - - def start(self): - logging.info("Starting the ListenerServer") - self.server.serve_forever() - - -class TCPRequestHandler(SocketServer.BaseRequestHandler): - #"One instance per connection. Override handle(self) to customize action." - def insert_request(self, data): - logging.getLogger().name = "TCPRequestHandler" - array = data.split(" ") - if len(array) != 3: - logging.info("Wrong data size") - raise Exception("Unexpected data") - hostname = array[0] - port = int(array[1]) - request = array[2] - if not (request in ["reboot", "on", "off", "delayed"]): - logging.info("Unknown request: %s" % request) - raise Exception("Unknown request: %s" % request) - db = DBHandler(self.server.config) - sql = "insert into pdu_queue (hostname,port,request) values ('%s',%i,'%s')" % (hostname, port, request) - db.do_sql(sql) - db.close() - del(db) - - def handle(self): - logging.getLogger().name = "TCPRequestHandler" - ip = self.client_address[0] - try: - data = self.request.recv(4096).strip() - socket.setdefaulttimeout(2) - try: - request_host = socket.gethostbyaddr(ip)[0] - except socket.herror as e: - logging.debug("Unable to resolve: %s error: %s" % (ip, e)) - request_host = ip - logging.info("Received a request from %s: '%s'" % (request_host, data)) - self.insert_request(data) - self.request.sendall("ack\n") - except Exception as e: - logging.debug(e) - self.request.sendall("nack\n") - self.request.close() - - -class TCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): - allow_reuse_address = True - daemon_threads = True - pass - -if __name__ == "__main__": - logging.basicConfig(level=logging.DEBUG) - logging.getLogger().setLevel(logging.DEBUG) - logging.debug("Executing from __main__") - starter = {"hostname": "0.0.0.0", - "port": 16421, - "dbhost": "127.0.0.1", - "dbuser": "pdudaemon", - "dbpass": "pdudaemon", - "dbname": "lavapdu", - "logging_level": logging.DEBUG} - ss = ListenerServer(starter) - ss.start() diff --git a/lavapdu/__init__.py b/lavaproxy/__init__.py index 9b73b54..9b73b54 100644 --- a/lavapdu/__init__.py +++ b/lavaproxy/__init__.py diff --git a/lavapdu/apcdrivers.py b/lavaproxy/apcdrivers.py index 0dad9b6..0dad9b6 100644 --- a/lavapdu/apcdrivers.py +++ b/lavaproxy/apcdrivers.py diff --git a/lavapdu/driver.py b/lavaproxy/driver.py index bd36c18..bd36c18 100644 --- a/lavapdu/driver.py +++ b/lavaproxy/driver.py diff --git a/lavapdu/engine.py b/lavaproxy/engine.py index beb954f..beb954f 100644 --- a/lavapdu/engine.py +++ b/lavaproxy/engine.py diff --git a/lavapdu/pdurunner.py b/lavaproxy/pdurunner.py index cc2b19d..cc2b19d 100644 --- a/lavapdu/pdurunner.py +++ b/lavaproxy/pdurunner.py diff --git a/lavaproxy/proxyexample.py b/lavaproxy/proxyexample.py new file mode 100644 index 0000000..e11a4a0 --- /dev/null +++ b/lavaproxy/proxyexample.py @@ -0,0 +1,98 @@ +__author__ = 'matt' + +#!/usr/bin/python +# This is a simple port-forward / proxy, written using only the default python +# library. If you want to make a suggestion or fix something you can contact-me +# at voorloop_at_gmail.com +# Distributed over IDC(I Don't Care) license +import socket +import select +import time +import sys + +# Changing the buffer_size and delay, you can improve the speed and bandwidth. +# But when buffer get to high or delay go too down, you can broke things +buffer_size = 4096 +delay = 0.0001 +forward_to = ('smtp.zaz.ufsk.br', 25) + +class Forward: + def __init__(self): + self.forward = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + def start(self, host, port): + try: + self.forward.connect((host, port)) + return self.forward + except Exception, e: + print e + return False + +class TheServer: + input_list = [] + channel = {} + + def __init__(self, host, port): + self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.server.bind((host, port)) + self.server.listen(200) + + def main_loop(self): + self.input_list.append(self.server) + while 1: + time.sleep(delay) + ss = select.select + inputready, outputready, exceptready = ss(self.input_list, [], []) + for self.s in inputready: + if self.s == self.server: + self.on_accept() + break + + self.data = self.s.recv(buffer_size) + if len(self.data) == 0: + self.on_close() + else: + self.on_recv() + + def on_accept(self): + forward = Forward().start(forward_to[0], forward_to[1]) + clientsock, clientaddr = self.server.accept() + if forward: + print clientaddr, "has connected" + self.input_list.append(clientsock) + self.input_list.append(forward) + self.channel[clientsock] = forward + self.channel[forward] = clientsock + else: + print "Can't establish connection with remote server.", + print "Closing connection with client side", clientaddr + clientsock.close() + + def on_close(self): + print self.s.getpeername(), "has disconnected" + #remove objects from input_list + self.input_list.remove(self.s) + self.input_list.remove(self.channel[self.s]) + out = self.channel[self.s] + # close the connection with client + self.channel[out].close() # equivalent to do self.s.close() + # close the connection with remote server + self.channel[self.s].close() + # delete both objects from channel dict + del self.channel[out] + del self.channel[self.s] + + def on_recv(self): + data = self.data + # here we can parse and/or modify the data before send forward + print data + self.channel[self.s].send(data) + +if __name__ == '__main__': + server = TheServer('', 9090) + try: + server.main_loop() + except KeyboardInterrupt: + print "Ctrl C - Stopping server" + sys.exit(1)
\ No newline at end of file diff --git a/lavaproxy/socketserver.py b/lavaproxy/socketserver.py new file mode 100644 index 0000000..a678207 --- /dev/null +++ b/lavaproxy/socketserver.py @@ -0,0 +1,80 @@ +#! /usr/bin/python + +# Copyright 2013 Linaro Limited +# Author Matt Hart <matthew.hart@linaro.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301, USA. + +import SocketServer +import logging +import socket + +class ListenerServer(object): + servers = [] + + def __init__(self, config): + logging.getLogger().name = "ManagementServer" + logging.getLogger().setLevel(config["logging_level"]) + self.management_server = TCPServer((config["hostname"], config["mgmt-port"]), TCPRequestHandler) +# for portnum in range(config["port-start"], config["port-end"]): +# self.servers.append(TCPServer((config["hostname"], portnum), TCPRequestHandler)) +# logging.info("listening on %s:%s" % (config["hostname"], portnum)) + + def start(self): + logging.info("Starting the Management Server") + self.management_server.serve_forever() + # for server in self.servers: + # server.serve_forever() + + +class TCPRequestHandler(SocketServer.BaseRequestHandler): + #"One instance per connection. Override handle(self) to customize action." + def handle(self): + logging.getLogger().name = "TCPRequestHandler" + ip = self.client_address[0] + logging.debug(self.client_address) + try: + data = self.request.recv(4096).strip() + socket.setdefaulttimeout(2) + try: + request_host = socket.gethostbyaddr(ip)[0] + except socket.herror as e: + logging.debug("Unable to resolve: %s error: %s" % (ip, e)) + request_host = ip + logging.info("Received a request from %s: '%s'" % (request_host, data)) + self.request.sendall("ack\n") + except Exception as e: + logging.debug(e) + self.request.sendall("nack\n") + self.request.close() + + +class TCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): + allow_reuse_address = True + daemon_threads = True + pass + +if __name__ == "__main__": + logging.basicConfig(level=logging.DEBUG) + logging.getLogger().setLevel(logging.DEBUG) + logging.debug("Executing from __main__") + starter = {"hostname": "0.0.0.0", + "port-start": 40001, + "port-end": 41000, + "mgmt-port": 40000, + "logging_level": logging.DEBUG} + ss = ListenerServer(starter) + ss.start() |