import sys
import time
import socket
+import base64
+import shutil
from pysqlite2 import dbapi2 as sqlite
sys.path.append(".")
self.db.commit()
class DatabaseConfig:
- def __init__(self, db, key):
+ def __init__(self, db, key, base64=0):
self.db = db
self.key = key
self.data = None
self.date = None
+ self.base64 = base64
def get(self):
if not self.data:
return self.date or float(0)
def set(self, value):
+ if self.base64:
+ value = base64.b64decode(value)
#value = (value,)
c = self.db.cursor()
if not self.get():
c.close()
self.data = value
self.db.commit()
+ return """Set "%s" to "%s".""" % (self.key, self.data,)
class DurationsConfig:
def __init__(self, db):
ret = []
for value in c.fetchall():
value = int("%s" % value)
- if value < 5400: # 1,5h
+ if value < 900: # 15min
continue
ret.append(value)
c.close()
"value" : value, })
c.close()
self.db.commit()
+ return """Accepted build duration of %s seconds.""" % (value,)
def get_avg(self):
sum = 0
return time.ctime(eta)
class DistccConfig(DatabaseConfig):
- def __init__(self, db, key, hostname):
+ def __init__(self, db, key, hostname, jobs):
DatabaseConfig.__init__(self, db, key)
self.hostname = hostname
+ self.jobs = jobs
def __str__(self):
if not self.ping() or self.get() == "0":
return ""
- return "%s:%s/4,lzo" % \
- (socket.gethostbyname(self.hostname), self.get(),)
+ return "%s:%s/%s,lzo" % \
+ (self.hostname, self.get(), self.jobs or "4",)
def ping(self):
if not self.hostname:
def version(self):
return os.popen("distcc --version").readlines()
+class FileConfig:
+ def __init__(self, path, filetype):
+ self.filename = os.path.join(path, config["path"][filetype])
+
+ # Create the file if not existant
+ if not os.access(self.filename, os.R_OK):
+ f = open(self.filename, "w")
+ f.close()
+
+ def get(self):
+ ret = []
+ try:
+ f = open(self.filename)
+ ret = f.readlines()
+ f.close()
+ except:
+ pass
+ return ret or ["Log is empty."]
+
+ __call__ = get
+
+ def set(self, lines):
+ f = open(self.filename, "w")
+ for line in base64.b64decode(lines).split("\n"):
+ f.write("%s\n" % line.rstrip("\n"))
+ f.close()
+ return """Saved file content to %s.""" % (self.filename,)
+
class Builder:
def __init__(self, config, uuid):
self.uuid = uuid
pass
self.db = Database(self.path)
-
+
self.hostname = DatabaseConfig(self.db, "hostname")
self.state = DatabaseConfig(self.db, "state")
self.package = DatabaseConfig(self.db, "package")
-
+ self.target = DatabaseConfig(self.db, "target")
+ self.toolchain= DatabaseConfig(self.db, "toolchain")
+
self.duration = DurationsConfig(self.db)
- self.distcc = DistccConfig(self.db, "distcc", self.hostname.get())
+ self.jobs = DatabaseConfig(self.db, "jobs")
+ self.distcc = DistccConfig(self.db, "distcc", self.hostname(), self.jobs())
+ self.cpu = DatabaseConfig(self.db, "cpu", base64=1)
+ self.machine = DatabaseConfig(self.db, "machine")
+ self.system = DatabaseConfig(self.db, "system", base64=1)
+
+ self.log = FileConfig(self.path, "log")
+
+ # If host was longer than 3 days in state compiling we set it as idle.
+ if self.state() == "compiling" and \
+ (time.time() - self.state.time()) > 3*24*60*60:
+ self.state.set("idle")
+
+ # If host is idle and distcc is not disabled we set it as distcc host.
+ if self.state() == "idle" and self.distcc() != "0":
+ self.state.set("distcc")
+
+ # If host is longer than 24h in error state we set it as distcc host.
+ if self.state() == "error" and \
+ (time.time() - self.state.time()) > 24*60*60:
+ self.state.set("distcc")
+
+ # If host was longer than two weeks in distcc state we set it as unknown.
+ if self.state() == "error" and \
+ (time.time() - self.state.time()) > 2*7*24*60*60:
+ self.state.set("unknown")
+
+ # If host was longer than four weels in distcc state we delete it.
+ if self.state() in ("distcc", "unknown",) and \
+ (time.time() - self.state.time()) > 4*7*24*60*60:
+ del self.db
+ shutil.rmtree(self.path)
def set(self, key, value):
- eval("self.%s.set(\"%s\")" % (key, value,))
+ return eval("self.%s.set(\"%s\")" % (key, value,))
def get(self, key):
return eval("self.%s.get()" % (key,))
-def getAllBuilders():
+def getAllBuilders(age=0):
builders = []
for uuid in os.listdir(config["path"]["db"]):
if uuid == "empty.txt": continue
builder = Builder(config, uuid)
+ # If there was no activity since "age" days -> continue...
+ if age and (time.time() - builder.state.time()) > age*24*60*60:
+ continue
builders.append(builder)
return builders