From 11d45f70ceb41f7dfbf0ae337ebd0ed7a3a63090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Ko=C4=8D=C3=AD?= Date: Wed, 19 Aug 2015 10:14:53 +0200 Subject: Store boot output to database Because configuration is now stored in database only missing informations to make database fully descriptive is boot output. This makes output of boot command to be saved to database and not to file. Also parse script should read input from stdin and not from file from argument. --- scripts/boot.py | 19 ++----------------- scripts/database.py | 12 ++++++------ scripts/databaseinit.sql | 2 +- scripts/utils.py | 7 +++++-- 4 files changed, 14 insertions(+), 26 deletions(-) (limited to 'scripts') diff --git a/scripts/boot.py b/scripts/boot.py index 2d1461a..6209461 100644 --- a/scripts/boot.py +++ b/scripts/boot.py @@ -12,20 +12,7 @@ from exceptions import MissingFile import database def boot(config, to_database = True): - try: - os.mkdir(sf(conf.output_folder)) - except FileExistsError: - pass - - sprc = subprocess.Popen(conf.boot_command, stdout = subprocess.PIPE) - with open(os.path.join(sf(conf.output_folder), config.cfile), "a") as f: - for linen in sprc.stdout: - line = linen.decode('utf-8') - if conf.boot_output: - print(line, end="") - f.write(line) - - # Let user script parse double value + out = utils.callsubprocess('boot', conf.boot_command, conf.boot_output, True) value = None try: @@ -38,6 +25,4 @@ def boot(config, to_database = True): if to_database: dtb = database.database() - dtb.add_measure(config.cfile, config.id, value) - - return config.cfile + dtb.add_measure(out, config.id, value) diff --git a/scripts/database.py b/scripts/database.py index 01c341a..df89a9a 100644 --- a/scripts/database.py +++ b/scripts/database.py @@ -20,7 +20,7 @@ def __timestamp__(): return datetime.datetime.now().strftime('%y-%m-%d-%H-%M-%S') Config = collections.namedtuple('Config', 'id hash config') # Named tuple for configuration -Measure = collections.namedtuple('Measure', 'id conf_id mfile value') # Named tuple for measurement +Measure = collections.namedtuple('Measure', 'id conf_id output value') # Named tuple for measurement class database: "Class used for accessing PostgreSQL project database." @@ -99,17 +99,17 @@ class database: rtn.append(Config(dt[0], hash, dt[1])) return rtn - def add_measure(self, mfile, conf_id, value = None): + def add_measure(self, output, conf_id, value = None): "Add measurement." ps = self.db.prepare("""INSERT INTO measure - (conf, mfile, value, mtime, toolgit, linuxgit, measurement) + (conf, output, value, mtime, toolgit, linuxgit, measurement) VALUES ($1, $2, $3, $4, $5, $6, $7); """) gt = self.check_toolsgit() lgt = self.check_linuxgit() tm = datetime.datetime.now() - ps(conf_id, mfile, value, tm, gt, lgt, conf.measure_identifier) + ps(conf_id, output, value, tm, gt, lgt, conf.measure_identifier) def update_measure(self, measure_id, value): "Update measured value" @@ -122,7 +122,7 @@ class database: def get_measures(self, conf_id): "Get measures for configuration with conf_id id" - ps = self.db.prepare("""SELECT id, mfile, value FROM measure + ps = self.db.prepare("""SELECT id, output, value FROM measure WHERE conf = $1; """) rtn = [] @@ -132,7 +132,7 @@ class database: def get_unmeasured(self): "Returns list of all unmeasured configurations." - ps = self.db.prepare("""SELECT id, hash, cfile FROM configurations + ps = self.db.prepare("""SELECT id, hash, config FROM configurations WHERE id NOT IN (SELECT conf FROM measure) """) diff --git a/scripts/databaseinit.sql b/scripts/databaseinit.sql index d1ab3e2..0ca9b5a 100644 --- a/scripts/databaseinit.sql +++ b/scripts/databaseinit.sql @@ -28,7 +28,7 @@ CREATE TABLE measure ( id BIGSERIAL PRIMARY KEY, -- Id conf BIGINT REFERENCES configurations (id), -- Reference to configuration measurement TEXT NOT NULL, -- Text identifivator of measuring tool - mfile TEXT NOT NULL, -- File with measuring output + output TEXT NOT NULL, -- Output of boot value DOUBLE PRECISION DEFAULT null, -- Measured data value mtime timestamp NOT NULL, -- Time and date of measurement linuxgit BIGINT REFERENCES linuxgit (id), -- Reference to git version of Linux diff --git a/scripts/utils.py b/scripts/utils.py index 742aec5..e06bdbb 100644 --- a/scripts/utils.py +++ b/scripts/utils.py @@ -30,15 +30,18 @@ def build_symbol_map(): def callsubprocess(process_name, process, show_output = True, return_output = False, env=os.environ, allowed_exit_codes = [0], - allow_all_exit_codes = False): + allow_all_exit_codes = False, stdin = None): sprc = subprocess.Popen(process, stdout = subprocess.PIPE, - stderr = subprocess.STDOUT, env = env) + stderr = subprocess.STDOUT, stdin = subprocess.PIPE, env = env) try: os.mkdir(os.path.join(sf(conf.log_folder), process_name)) except OSError: pass + if stdin != None: + sprc.stdin.write(bytes(stdin, sys.getdefaultencoding())) + rtn = [] with open(os.path.join(sf(conf.log_folder), process_name, time.strftime("%y-%m-%d-%H-%M-%S") + ".log"), -- cgit v1.2.3