#!/usr/bin/plcsh # # Bootstraps the PLC database with a default administrator account and # a default site, defines default slice attribute types, and # creates/updates default system slices. # scan ordered scripts in /etc/planetlab/db-config.d # # Mark Huang # Copyright (C) 2006 The Trustees of Princeton University # Thierry Parmentelat # # to run with options, do e.g. # db-config -- -l import os import sys from argparse import ArgumentParser from plc_config import PLCConfiguration def GetSnippets(directory): filenames = [] if os.path.exists(directory): try: filenames = os.listdir(directory) except OSError as e: raise Exception("Error when opening %s (%s)" % (os.path.join(dir, file), e)) # ignore files that contain either ~ or . ignore_tokens = ("~", ".") numberedfiles = {} for filename in filenames: ignore = False for token in ignore_tokens: if filename.find(token) >= 0: ignore = True break if not ignore: parts = filename.split('-') if len(parts) >= 2: name = '-'.join(parts) try: number = int(parts[0]) entry = numberedfiles.get(number, []) entry.append(name) numberedfiles[number] = entry except ValueError: ignore = True else: ignore = True if ignore: print("db-config: ignored %s snippet" % filename) filenames = [] keys = list(numberedfiles.keys()) keys.sort() for k in keys: for filename in numberedfiles[k]: filenames.append(filename) return filenames def main(): cfg = PLCConfiguration() cfg.load() variables = cfg.variables() usage = "%prog [-- options] [steps]" parser = ArgumentParser(usage=usage) parser.add_argument( "-l", "--list", dest="list_steps", action="store_true", default=False, help="Lists available steps") parser.add_argument( "-v", "--verbose", dest="verbose", action="store_true", default=False, help="Run verbosely") parser.add_argument('steps', nargs='*') args = parser.parse_args() globals_exec = globals().copy() locals_exec = {} # Load variables into dictionaries for category_id, (category, variablelist) in variables.items(): globals_exec[category_id] = dict( zip(variablelist.keys(), [variable['value'] for variable in variablelist.values()])) directory = "/etc/planetlab/db-config.d" snippets = GetSnippets(directory) steps = args.steps for snippet in snippets: selected = False # no steps provided on the command-line : run them all if not steps: selected = True else: for step in steps: if snippet.find(step) >= 0: selected = True if not selected: continue if args.list_steps: if not args.verbose: print(snippet) else: print("Found step %s/%s" % (directory, snippet)) os.system("rpm -qf %s/%s" % (directory, snippet)) continue fullpath = os.path.join(directory, snippet) if args.verbose: print("Running step %s" % fullpath) with open(fullpath) as feed: exec(feed.read(), globals_exec, locals_exec) if __name__ == '__main__': main()