Detect firmware version and choose correct driver automatically
Change-Id: I8c26fb85af2e85ee93439a618c0b428282a32883
diff --git a/lavapdu/socketserver.py b/lavapdu/socketserver.py
index 5a6011c..62551bc 100644
--- a/lavapdu/socketserver.py
+++ b/lavapdu/socketserver.py
@@ -19,46 +19,10 @@
# 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()
+import time
+from dbhandler import DBHandler
class ListenerServer(object):
@@ -75,8 +39,15 @@
del(self.db)
def create_db(self):
- sql = "create table if not exists pdu_queue (id serial, hostname text, port int, request text)"
+ sql = "create table if not exists pdu_queue (id serial, hostname text, port int, request text, exectime int)"
self.db.do_sql(sql)
+ sql = "select column_name from information_schema.columns where table_name='pdu_queue'" \
+ "and column_name='exectime'"
+ res = self.db.do_sql_with_fetch(sql)
+ if not res:
+ logging.info("Old db schema discovered, upgrading")
+ sql = "alter table pdu_queue add column exectime int default 1"
+ self.db.do_sql(sql)
def start(self):
logging.info("Starting the ListenerServer")
@@ -88,21 +59,41 @@
def insert_request(self, data):
logging.getLogger().name = "TCPRequestHandler"
array = data.split(" ")
- if len(array) != 3:
+ delay = 10
+ custom_delay = False
+ now = int(time.time())
+ if len(array) < 3:
logging.info("Wrong data size")
raise Exception("Unexpected data")
+ if len(array) == 4:
+ delay = int(array[3])
+ custom_delay = True
hostname = array[0]
port = int(array[1])
request = array[2]
- if not (request in ["reboot", "on", "off", "delayed"]):
+ if not (request in ["reboot","on","off"]):
logging.info("Unknown request: %s" % request)
raise Exception("Unknown request: %s" % request)
+ if request == "reboot":
+ logging.debug("reboot requested, submitting off/on")
+ self.queue_request(hostname,port,"off",now)
+ self.queue_request(hostname,port,"on",now+delay)
+ else:
+ if custom_delay:
+ logging.debug("using delay as requested")
+ self.queue_request(hostname,port,request,now+delay)
+ else:
+ self.queue_request(hostname,port,request,now)
+
+ def queue_request(self, hostname, port, request, exectime):
db = DBHandler(self.server.config)
- sql = "insert into pdu_queue (hostname,port,request) values ('%s',%i,'%s')" % (hostname, port, request)
+ sql = "insert into pdu_queue (hostname,port,request,exectime)" \
+ "values ('%s',%i,'%s')" % (hostname,port,request,exectime)
db.do_sql(sql)
db.close()
del(db)
+
def handle(self):
logging.getLogger().name = "TCPRequestHandler"
ip = self.client_address[0]
@@ -112,7 +103,7 @@
try:
request_host = socket.gethostbyaddr(ip)[0]
except socket.herror as e:
- logging.debug("Unable to resolve: %s error: %s" % (ip, 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)
@@ -122,7 +113,6 @@
self.request.sendall("nack\n")
self.request.close()
-
class TCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
allow_reuse_address = True
daemon_threads = True
@@ -133,11 +123,11 @@
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",
+ "port":16421,
+ "dbhost":"127.0.0.1",
+ "dbuser":"pdudaemon",
+ "dbpass":"pdudaemon",
+ "dbname":"lavapdu",
"logging_level": logging.DEBUG}
ss = ListenerServer(starter)
- ss.start()
+ ss.start()
\ No newline at end of file