From 1d1f09ded60a653898820b0223f67d74dfe18997 Mon Sep 17 00:00:00 2001 From: Amit Mahajan Date: Sat, 28 Nov 2009 14:38:15 +0530 Subject: [PATCH] Dyamic addition/deletion of baremetal projects to codezero --- config/configuration.py | 5 +- scripts/baremetal/baremetal_add_container.py | 155 +++++++++++++++++++ 2 files changed, 156 insertions(+), 4 deletions(-) create mode 100755 scripts/baremetal/baremetal_add_container.py diff --git a/config/configuration.py b/config/configuration.py index 735e281..66dd477 100644 --- a/config/configuration.py +++ b/config/configuration.py @@ -131,10 +131,7 @@ class configuration: # TODO: Carry this over to Container() as static method??? def get_container_parameter(self, id, param, val): - if param[:len("SOURCE_PATH")] == "SOURCE_PATH": - parts = val.split("\"", 3) - self.containers[id].src_path = parts[1] - elif param[:len("PAGER_LMA")] == "PAGER_LMA": + if param[:len("PAGER_LMA")] == "PAGER_LMA": self.containers[id].pager_lma = int(val, 0) elif param[:len("PAGER_VMA")] == "PAGER_VMA": self.containers[id].pager_vma = int(val, 0) diff --git a/scripts/baremetal/baremetal_add_container.py b/scripts/baremetal/baremetal_add_container.py new file mode 100755 index 0000000..aba431f --- /dev/null +++ b/scripts/baremetal/baremetal_add_container.py @@ -0,0 +1,155 @@ +#! /usr/bin/env python2.6 +# -*- mode: python; coding: utf-8; -*- +# +# Script to add/remove project to baremetal +# menu of main screen +# +# This script should be called from project root directory +# +import os, sys, shutil, re +from optparse import OptionParser +from os.path import join +from shutil import copytree + +def parse_cmdline_options(): + usage = "usage: %prog [options] arg" + parser = OptionParser(usage) + + parser.add_option("-a", "--add", action = "store_true", default = False, + dest = "addproject", help = "Add new project to baremetal projects") + parser.add_option("-d", "--del", action = "store_true", default = False, + dest = "delproject", help = "Delete existing project from baremetal projects") + parser.add_option("--desc", type = "string", dest = "projdesc", + help = "Description to be used for newly added project") + parser.add_option("--id", type = "int", dest = "srcid", + help = "If used with -a, Baremetal container id, to be used as source for source project\ + If used with -d, Baremetal container id to be deleted") + + (options, args) = parser.parse_args() + + # Sanity checks + if (not options.addproject and not options.delproject) or \ + (options.addproject and options.delproject): + parser.error("Only one of -a or -d needed, use -h argument for help") + exit() + + if options.addproject: + add_del = 1 + if not options.projdesc or not options.srcid: + parser.error("--desc or --id missing, use -h argument for help") + exit() + + if options.delproject: + add_del = 0 + if options.projdesc or not options.srcid: + parser.error("--desc provided or --id missing with -d, use -h argument for help") + exit() + + return options.projdesc, options.srcid, add_del + +def container_cml_templ_del_symbl(srcid): + cont_templ = "config/cml/container_ruleset.template" + sym = "CONT%(cn)d_BAREMETAL_PROJ" + str(srcid) + + buffer = "" + with open(cont_templ, 'r') as fin: + exist = False + # Prepare buffer for new cont_templ with new project symbols added + for line in fin: + parts = line.split() + + # Find out where baremetal symbols start in cont_templ + if len(parts) > 1 and parts[0] == sym: + exist = True + continue + elif len(parts) == 1 and parts[0] == sym: + continue + + buffer += line + if exist == False: + print "Project named baremetal" + str(srcid) + " does not exist" + exit() + + # Write new cont_templ + with open(cont_templ, 'w+') as fout: + fout.write(buffer) + + +def container_cml_templ_add_symbl(projdesc): + cont_templ = "config/cml/container_ruleset.template" + + pattern = re.compile("(CONT\%\(cn\)d_BAREMETAL_PROJ)([0-9]*)") + new_sym = "CONT%(cn)d_BAREMETAL_PROJ" + + # ID for new project + projid = -1 + + buffer = "" + with open(cont_templ, 'r') as fin: + baremetal_sym_found = False + + # Prepare buffer for new cont_templ with new project symbols added + for line in fin: + parts = line.split() + + # Find out where baremetal symbols start in cont_templ + if len(parts) > 1 and re.match(pattern, parts[0]): + baremetal_sym_found = True + # Last project id in use for baremetal conts + projid = \ + int(parts[0][len("CONT%(cn)d_BAREMETAL_PROJ"):]) + + # We are done with baremetal symbols, add new symbol to buffer + elif baremetal_sym_found == True: + baremetal_sym_found = False + sym_def = new_sym + str(int(projid) + 1) + \ + "\t\'" + projdesc + "\'\n" + buffer += sym_def + + # Search for baremetal menu and add new project symbol + elif len(parts) == 1 and parts[0] == new_sym + str(projid): + sym_reference = "\t" + new_sym + str(projid + 1) + "\n" + line += sym_reference + + buffer += line + + # Write new cont_templ + with open(cont_templ, 'w+') as fout: + fout.write(buffer) + + return projid + 1 + +def add_project(projdesc, srcid): + dest_id = container_cml_templ_add_symbl(projdesc) + + baremetal_dir = "conts/baremetal" + src_dir = join(baremetal_dir, "baremetal" + str(srcid)) + dest_dir = join(baremetal_dir, "baremetal" + str(dest_id)) + + print "Copying source files from " + src_dir + " to " + dest_dir + shutil.copytree(src_dir, dest_dir) + print "Done, New project baremetal" +str(dest_id) + \ + " is ready to be used." + +def del_project(srcid): + container_cml_templ_del_symbl(srcid) + + baremetal_dir = "conts/baremetal" + src_dir = join(baremetal_dir, "baremetal" + str(srcid)) + + print "Deleting source files from " + src_dir + shutil.rmtree(src_dir, "ignore_errors") + print "Done.." + +def main(): + projdesc, srcid, add_del = parse_cmdline_options() + + if add_del == 1: + add_project(projdesc, srcid) + else: + del_project(srcid) + + +if __name__ == "__main__": + main() +