]> git.ipfire.org Git - ipfire.org.git/blobdiff - build/builder.py
Added pxe site.
[ipfire.org.git] / build / builder.py
index 35778f8eba68e2f6174dcee33e74b823afda13aa..73c643aecec6136cc2f53b91bd69e5429d964e7d 100644 (file)
@@ -23,6 +23,8 @@ import os
 import sys
 import time
 import socket
+import base64
+import shutil
 from pysqlite2 import dbapi2 as sqlite
 
 sys.path.append(".")
@@ -53,11 +55,12 @@ class Database:
                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:
@@ -88,6 +91,8 @@ class DatabaseConfig:
                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():
@@ -107,6 +112,7 @@ class DatabaseConfig:
                c.close()
                self.data = value
                self.db.commit()
+               return """Set "%s" to "%s".""" % (self.key, self.data,)
 
 class DurationsConfig:
        def __init__(self, db):
@@ -118,7 +124,7 @@ class DurationsConfig:
                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()
@@ -133,6 +139,7 @@ class DurationsConfig:
                                                "value" : value, })
                c.close()
                self.db.commit()
+               return """Accepted build duration of %s seconds.""" % (value,)
 
        def get_avg(self):
                sum = 0
@@ -152,15 +159,16 @@ class DurationsConfig:
                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:
@@ -170,6 +178,34 @@ class DistccConfig(DatabaseConfig):
        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
@@ -183,27 +219,60 @@ class Builder:
                                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 3 days -> continue...
-               if (time.time() - builder.state.time()) > 3*24*60*60:
-                       continue
+               # 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