Superquickpronto change to use postgres as the backend datastore
diff --git a/MANIFEST.in b/MANIFEST.in
index 148b2a2..9f951a3 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,6 +1,4 @@
-include etc/lavapdu-listener.conf
-include etc/lavapdu-runner.conf
+include etc/lavapdu.conf
include etc/lavapdu-runner.init
include etc/lavapdu-listen.init
-include etc/lavapdulogrotate
-include var/lib/lavapdu/pdu.db
\ No newline at end of file
+include etc/lavapdulogrotate
\ No newline at end of file
diff --git a/etc/lavapdu-listener.conf b/etc/lavapdu-listener.conf
deleted file mode 100644
index aa9b61a..0000000
--- a/etc/lavapdu-listener.conf
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "hostname": "0.0.0.0",
- "port": 16421,
- "dbfile": "/var/lib/lavapdu/pdu.db"
-}
\ No newline at end of file
diff --git a/etc/lavapdu-runner.conf b/etc/lavapdu-runner.conf
deleted file mode 100644
index c6978d9..0000000
--- a/etc/lavapdu-runner.conf
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "dbfile": "/var/lib/lavapdu/pdu.db"
-}
\ No newline at end of file
diff --git a/etc/lavapdu.conf b/etc/lavapdu.conf
new file mode 100644
index 0000000..fba2a26
--- /dev/null
+++ b/etc/lavapdu.conf
@@ -0,0 +1,8 @@
+{
+ "hostname": "0.0.0.0",
+ "port": 16421,
+ "dbhost": "127.0.0.1",
+ "dbuser": "pdudaemon",
+ "dbpass": "pdudaemon",
+ "dbname": "lavapdu"
+}
\ No newline at end of file
diff --git a/lavapdu-listen b/lavapdu-listen
index d781358..331a708 100755
--- a/lavapdu-listen
+++ b/lavapdu-listen
@@ -48,7 +48,8 @@
"""
Read settings from config file, to listen to all hosts, hostname should be 0.0.0.0
"""
- settings = {"port": 16421, "hostname": "0.0.0.0", "dbfile":"/var/lib/lava-pdu/pdu.db"}
+ settings = {"port": 16421, "hostname": "0.0.0.0", "dbuser": "pdudaemon",
+ "dbpass": "pdudaemon", "dbname": "pdu_queue", "dbhost": "127.0.0.1"}
with open(filename) as stream:
jobdata = stream.read()
json_default = json.loads(jobdata)
@@ -56,8 +57,14 @@
settings['port'] = json_default['port']
if "hostname" in json_default:
settings['hostname'] = json_default['hostname']
- if "dbfile" in json_default:
- settings['dbfile'] = json_default['dbfile']
+ if "dbuser" in json_default:
+ settings['dbuser'] = json_default['dbuser']
+ if "dbpass" in json_default:
+ settings['dbpass'] = json_default['dbpass']
+ if "dbname" in json_default:
+ settings['dbname'] = json_default['dbname']
+ if "dbhost" in json_default:
+ settings['dbhost'] = json_default['dbhost']
return settings
if __name__ == '__main__':
@@ -65,7 +72,7 @@
# not necessarily per-instance, so use the command line and a default conf file.
pidfile = "/var/run/lavapdu-listen.pid"
logfile = "/var/log/lavapdu-listener.log"
- conffile = "/etc/lavapdu-listener.conf"
+ conffile = "/etc/lavapdu.conf"
settings = readSettings(conffile)
usage = "Usage: %prog [--logfile] --[loglevel]"
description = "LAVA PDU request listener server, host and port are handled in %s" % conffile
@@ -88,7 +95,8 @@
level = logging.WARNING
if options.loglevel == "ERROR":
level = logging.ERROR
- client_logger, watched_file_handler = getDaemonLogger(logfile, loglevel=level)
+ client_logger, watched_file_handler = getDaemonLogger(logfile, loglevel=level,
+ log_format='%(asctime)s:%(levelname)s:%(name)s:%(message)s')
if isinstance(client_logger, Exception):
print("Fatal error creating client_logger: " + str(client_logger))
sys.exit(os.EX_OSERR)
@@ -106,7 +114,10 @@
starter = {"logging_level": level,
"hostname": settings['hostname'],
"port": settings['port'],
- "dbfile": settings['dbfile']}
+ "dbhost": settings["dbhost"],
+ "dbuser": settings["dbuser"],
+ "dbpass": settings["dbpass"],
+ "dbname": settings["dbname"]}
with context:
logging.info("Running LAVA PDU Listener %s %s %d."
% (logfile, settings['hostname'], settings['port']))
diff --git a/lavapdu-runner b/lavapdu-runner
index 278a998..19ee5cc 100755
--- a/lavapdu-runner
+++ b/lavapdu-runner
@@ -48,12 +48,18 @@
"""
Read settings from config file, to listen to all hosts, hostname should be 0.0.0.0
"""
- settings = {"dbfile":"/var/lib/lavapdu/pdu.db"}
+ settings = {"dbuser": "pdudaemon", "dbpass": "pdudaemon", "dbname": "pdu_queue", "dbhost": "127.0.0.1"}
with open(filename) as stream:
jobdata = stream.read()
json_default = json.loads(jobdata)
- if "dbfile" in json_default:
- settings['dbfile'] = json_default['dbfile']
+ if "dbuser" in json_default:
+ settings['dbuser'] = json_default['dbuser']
+ if "dbpass" in json_default:
+ settings['dbpass'] = json_default['dbpass']
+ if "dbname" in json_default:
+ settings['dbname'] = json_default['dbname']
+ if "dbhost" in json_default:
+ settings['dbhost'] = json_default['dbhost']
return settings
if __name__ == '__main__':
@@ -61,7 +67,7 @@
# not necessarily per-instance, so use the command line and a default conf file.
pidfile = "/var/run/lavapdu-runner.pid"
logfile = "/var/log/lavapdu-runner.log"
- conffile = "/etc/lavapdu-runner.conf"
+ conffile = "/etc/lavapdu.conf"
settings = readSettings(conffile)
usage = "Usage: %prog [--logfile] --[loglevel]"
description = "LAVA PDU request listener server, host and port are handled in %s" % conffile
@@ -84,7 +90,8 @@
level = logging.WARNING
if options.loglevel == "ERROR":
level = logging.ERROR
- client_logger, watched_file_handler = getDaemonLogger(logfile, loglevel=level)
+ client_logger, watched_file_handler = getDaemonLogger(logfile, loglevel=level,
+ log_format='%(asctime)s:%(levelname)s:%(name)s:%(message)s')
if isinstance(client_logger, Exception):
print("Fatal error creating client_logger: " + str(client_logger))
sys.exit(os.EX_OSERR)
@@ -100,9 +107,12 @@
stderr=watched_file_handler.stream,
stdout=watched_file_handler.stream)
starter = {"logging_level": level,
- "dbfile": settings["dbfile"]}
+ "dbhost": settings["dbhost"],
+ "dbuser": settings["dbuser"],
+ "dbpass": settings["dbpass"],
+ "dbname": settings["dbname"]}
with context:
- logging.info("Running LAVA PDU Runner %s %s"
- % (logfile, settings["dbfile"]))
+ logging.info("Running LAVA PDU Runner %s dbhost: %s"
+ % (logfile, settings["dbhost"]))
p = PDURunner(starter)
p.run_me()
diff --git a/lavapdu/pdurunner.py b/lavapdu/pdurunner.py
index 9533a5d..3c1ed29 100644
--- a/lavapdu/pdurunner.py
+++ b/lavapdu/pdurunner.py
@@ -29,26 +29,23 @@
logging.basicConfig(level=config["logging_level"])
logging.getLogger().setLevel(config["logging_level"])
logging.getLogger().name = "PDURunner"
- self.db = DBHandler(config["dbfile"])
+ self.config = config
- def get_one(self):
- res = self.db.get_one("SELECT * FROM pdu_queue ORDER BY id asc limit 1")
- if res:
- id,hostname,port,request = res
- logging.debug("Processing queue item: (%s %s) on hostname: %s" % (request, port, hostname))
+ def get_one(self, db):
+ job = db.get_next_job()
+ if job:
+ job_id,hostname,port,request = job
+ logging.info("Processing queue item: (%s %s) on hostname: %s" % (request, port, hostname))
#logging.debug(id, hostname, request, port)
res = self.do_job(hostname,port,request)
- self.delete_row(id)
-
- def delete_row(self, id):
- logging.debug("deleting row %i" % id)
- self.db.do_sql("delete from pdu_queue where id=%i" % id)
+ db.delete_row(job_id)
+ else:
+ logging.debug("Found nothing to do in database")
def do_job(self, hostname, port, request):
retries = 5
while retries > 0:
try:
- logging.debug("creating a new PDUEngine")
pe = PDUEngine(hostname, 23)
if request == "reboot":
pe.driver.port_reboot(port)
@@ -70,13 +67,19 @@
def run_me(self):
- print("Starting up the PDURunner")
+ logging.info("Starting up the PDURunner")
while 1:
- self.get_one()
- time.sleep(1)
+ db = DBHandler(self.config)
+ self.get_one(db)
+ db.close()
+ del(db)
+ time.sleep(2)
if __name__ == "__main__":
- starter = {"logging_level": logging.DEBUG,
- "dbfile": "/var/lib/lavapdu/pdu.db"}
+ starter = {"dbhost":"127.0.0.1",
+ "dbuser":"pdudaemon",
+ "dbpass":"pdudaemon",
+ "dbname":"lavapdu",
+ "logging_level": logging.DEBUG}
p = PDURunner(starter)
p.run_me()
\ No newline at end of file
diff --git a/lavapdu/socketserver.py b/lavapdu/socketserver.py
index 4c9e128..3eb190f 100644
--- a/lavapdu/socketserver.py
+++ b/lavapdu/socketserver.py
@@ -19,18 +19,17 @@
# MA 02110-1301, USA.
import SocketServer
-import sqlite3
+#import sqlite3
+import psycopg2
import logging
-
+import socket
class DBHandler(object):
- db_file = "pdu.db"
-
- def __init__(self, db_file="pdu.db"):
- self.db_file = db_file
- logging.debug("Creating new DBHandler: %s" % self.db_file)
+ def __init__(self, config):
+ logging.debug("Creating new DBHandler: %s" % config["dbhost"])
logging.getLogger().name = "DBHandler"
- self.conn = sqlite3.connect(self.db_file, check_same_thread = False)
+ 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):
@@ -38,14 +37,26 @@
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_one(self, sql):
- res = self.get_res(sql)
- return res.fetchone()
+ 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()
@@ -59,12 +70,15 @@
logging.getLogger().name = "ListenerServer"
logging.getLogger().setLevel(config["logging_level"])
logging.info("listening on %s:%s" % (config["hostname"], config["port"]))
- self.db = DBHandler(config["dbfile"])
+ self.server.config = config
+ self.db = DBHandler(config)
self.create_db()
- self.server.db = self.db
+ self.db.close()
+ del(self.db)
+ #self.server.db = self.db
def create_db(self):
- sql = "create table if not exists pdu_queue (id integer primary key, hostname text, port int, request text)"
+ sql = "create table if not exists pdu_queue (id serial, hostname text, port int, request text)"
self.db.do_sql(sql)
def start(self):
@@ -86,19 +100,24 @@
if not (request in ["reboot","on","off","delayed"]):
logging.info("Unknown request: %s" % request)
raise Exception("Unknown request: %s" % request)
- db = self.server.db
- sql = "insert into pdu_queue values (NULL,'%s',%i,'%s')" % (hostname,port,request)
+ #db = self.server.db
+ 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()
+ db.close()
+ del(db)
def handle(self):
logging.getLogger().name = "TCPRequestHandler"
try:
data = self.request.recv(4096).strip()
- logging.debug("got request: %s" % data)
+ socket.setdefaulttimeout(2)
+ request_host = socket.gethostbyaddr(self.client_address[0])[0]
+ logging.info("Received a request from %s: '%s'" % (request_host, data))
self.insert_request(data)
self.request.sendall("ack\n")
- except:
+ except Exception as e:
+ logging.debug(e)
self.request.sendall("nack\n")
self.request.close()
@@ -113,7 +132,10 @@
logging.debug("Executing from __main__")
starter = {"hostname": "0.0.0.0",
"port":16421,
- "dbfile": "/var/lib/lavapdu/pdu.db",
+ "dbhost":"127.0.0.1",
+ "dbuser":"pdudaemon",
+ "dbpass":"pdudaemon",
+ "dbname":"lavapdu",
"logging_level": logging.DEBUG}
ss = ListenerServer(starter)
ss.start()
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 744e869..c2a6fd3 100644
--- a/setup.py
+++ b/setup.py
@@ -33,15 +33,13 @@
"daemon",
"lockfile",
"pexpect",
- "sqlite2"
+ "psycopg2"
],
data_files=[
("/etc/init.d/", ["etc/lavapdu-runner.init"]),
("/etc/init.d/", ["etc/lavapdu-listen.init"]),
- ("/etc/", ["etc/lavapdu-listener.conf"]),
- ("/etc/", ["etc/lavapdu-runner.conf"]),
+ ("/etc/", ["etc/lavapdu.conf"]),
("/etc/logrotate.d/", ["etc/lavapdulogrotate"]),
- ("/var/lib/lavapdu/", ["var/lib/lavapdu/pdu.db"])
],
scripts=[
'lavapdu-runner',