summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Hart <matthew.hart@linaro.org>2014-04-18 17:43:41 +0100
committerMatt Hart <matthew.hart@linaro.org>2014-04-18 17:43:41 +0100
commitffb5edd271230606407c5ebe4c708cd637ea7436 (patch)
tree4183ac39b7e348a660fcae2ce7e134e1a3889f03
parentbc8b057384ebc289f6f708818c78690b4c4d36d4 (diff)
Renamed folder and cut down socketserver.py to remove the lavapdu specific stuff
-rw-r--r--lavapdu/socketserver.py143
-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.py98
-rw-r--r--lavaproxy/socketserver.py80
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()