blob: fea423f10bfb55d155009a68f6fc67fefd688b7d [file] [log] [blame]
Matt Hart1306d822013-08-09 12:08:22 +01001import sqlite3
Matt Hart1499bd42013-08-20 11:35:46 +01002import logging
Matt Hart1306d822013-08-09 12:08:22 +01003import time
4from engine import PDUEngine
Matt Hart63ed9112013-08-20 13:31:50 +01005from socketserver import DBHandler
Matt Hart1306d822013-08-09 12:08:22 +01006
7class PDURunner():
Matt Hart1499bd42013-08-20 11:35:46 +01008
9 def __init__(self, config):
Matt Hart63ed9112013-08-20 13:31:50 +010010 logging.basicConfig(level=config["logging_level"])
11 logging.getLogger().setLevel(config["logging_level"])
12 self.db = DBHandler(config["dbfile"])
Matt Hart1499bd42013-08-20 11:35:46 +010013
Matt Hart1306d822013-08-09 12:08:22 +010014 def get_one(self):
Matt Hart63ed9112013-08-20 13:31:50 +010015 res = self.db.get_one("SELECT * FROM pdu_queue ORDER BY id asc limit 1")
Matt Hart1306d822013-08-09 12:08:22 +010016 if res:
17 id,hostname,port,request = res
Matt Hart63ed9112013-08-20 13:31:50 +010018 logging.debug("Processing queue item: (%s %s) on hostname: %s" % (request, port, hostname))
19 #logging.debug(id, hostname, request, port)
Matt Hart1306d822013-08-09 12:08:22 +010020 res = self.do_job(hostname,port,request)
21 self.delete_row(id)
22
23 def delete_row(self, id):
Matt Hart63ed9112013-08-20 13:31:50 +010024 logging.debug("deleting row %i" % id)
25 self.db.do_sql("delete from pdu_queue where id=%i" % id)
Matt Hart1306d822013-08-09 12:08:22 +010026
27 def do_job(self, hostname, port, request):
Matt Hart63ed9112013-08-20 13:31:50 +010028 retries = 5
29 while retries > 0:
30 try:
31 pe = PDUEngine(hostname, 23)
32 if request == "reboot":
33 pe.driver.port_reboot(port)
34 elif request == "on":
35 pe.driver.port_on(port)
36 elif request == "off":
37 pe.driver.port_off(port)
38 elif request == "delayed":
39 pe.driver.port_delayed(port)
40 else:
41 logging.debug("Unknown request type: %s" % request)
42 retries = 0
43 except BaseException:
44 logging.warn("Failed to execute job: %s %s %s (attempts left %i)" % (hostname,port,request,retries))
45 pe.close()
46 time.sleep(1)
47 retries -= 1
48
Matt Hart1306d822013-08-09 12:08:22 +010049
50 def run_me(self):
51 print("Starting up the PDURunner")
52 while 1:
53 self.get_one()
54 time.sleep(1)
55
56if __name__ == "__main__":
Matt Hart1499bd42013-08-20 11:35:46 +010057 starter = {"logging_level": logging.DEBUG,
58 "dbfile": "/var/lib/lava-pdu/pdu.db"}
59 p = PDURunner(starter)
Matt Hart1306d822013-08-09 12:08:22 +010060 p.run_me()