blob: ec5c2d89344bfc40abb0ffc12bf70fd3772bdd1f [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"])
Matt Hart40d6c312013-08-20 14:47:31 +010012 logging.getLogger().name = "PDURunner"
Matt Hart63ed9112013-08-20 13:31:50 +010013 self.db = DBHandler(config["dbfile"])
Matt Hart1499bd42013-08-20 11:35:46 +010014
Matt Hart1306d822013-08-09 12:08:22 +010015 def get_one(self):
Matt Hart63ed9112013-08-20 13:31:50 +010016 res = self.db.get_one("SELECT * FROM pdu_queue ORDER BY id asc limit 1")
Matt Hart1306d822013-08-09 12:08:22 +010017 if res:
18 id,hostname,port,request = res
Matt Hart63ed9112013-08-20 13:31:50 +010019 logging.debug("Processing queue item: (%s %s) on hostname: %s" % (request, port, hostname))
20 #logging.debug(id, hostname, request, port)
Matt Hart1306d822013-08-09 12:08:22 +010021 res = self.do_job(hostname,port,request)
22 self.delete_row(id)
23
24 def delete_row(self, id):
Matt Hart63ed9112013-08-20 13:31:50 +010025 logging.debug("deleting row %i" % id)
26 self.db.do_sql("delete from pdu_queue where id=%i" % id)
Matt Hart1306d822013-08-09 12:08:22 +010027
28 def do_job(self, hostname, port, request):
Matt Hart63ed9112013-08-20 13:31:50 +010029 retries = 5
30 while retries > 0:
31 try:
Matt Hart40d6c312013-08-20 14:47:31 +010032 logging.debug("creating a new PDUEngine")
Matt Hart63ed9112013-08-20 13:31:50 +010033 pe = PDUEngine(hostname, 23)
34 if request == "reboot":
35 pe.driver.port_reboot(port)
36 elif request == "on":
37 pe.driver.port_on(port)
38 elif request == "off":
39 pe.driver.port_off(port)
40 elif request == "delayed":
41 pe.driver.port_delayed(port)
42 else:
43 logging.debug("Unknown request type: %s" % request)
Matt Hart40d6c312013-08-20 14:47:31 +010044 pe.pduclose()
Matt Hart63ed9112013-08-20 13:31:50 +010045 retries = 0
Matt Hart40d6c312013-08-20 14:47:31 +010046 except:
Matt Hart63ed9112013-08-20 13:31:50 +010047 logging.warn("Failed to execute job: %s %s %s (attempts left %i)" % (hostname,port,request,retries))
Matt Hart40d6c312013-08-20 14:47:31 +010048 #logging.warn(e)
49 time.sleep(5)
Matt Hart63ed9112013-08-20 13:31:50 +010050 retries -= 1
51
Matt Hart1306d822013-08-09 12:08:22 +010052
53 def run_me(self):
54 print("Starting up the PDURunner")
55 while 1:
56 self.get_one()
57 time.sleep(1)
58
59if __name__ == "__main__":
Matt Hart1499bd42013-08-20 11:35:46 +010060 starter = {"logging_level": logging.DEBUG,
61 "dbfile": "/var/lib/lava-pdu/pdu.db"}
62 p = PDURunner(starter)
Matt Hart1306d822013-08-09 12:08:22 +010063 p.run_me()