def replace_rel_dirs(self, dirs, lookup=None): """Looks up embedded keywords in a dict. Args: dirs: dict with strings to parse. lookup: dict in which keywords are located. If None, looks up in dirs.""" if lookup is None: lookup = dirs for k in dirs: #Loop and take care of embedded lookups replaced = repl(lookup, dirs[k]) while replaced != dirs[k]: dirs[k] = replaced replaced = repl(lookup, dirs[k])
def replace_rel_dirs(self, dirs, lookup=None): """Looks up embedded keywords in a dict. Args: dirs: dict with strings to parse. lookup: dict in which keywords are located. If None, looks up in dirs.""" if lookup is None: lookup = dirs for k in dirs: # Loop and take care of embedded lookups replaced = repl(lookup, dirs[k]) while replaced != dirs[k]: dirs[k] = replaced replaced = repl(lookup, dirs[k])
def parse_slash2_conf(self): """Reads and parses slash2 conf for tokens. Writes to the base directory; updates slash2 objects in the tsuite.""" try: with open(self.conf["slash2"]["conf"]) as conf: new_conf = "#TSuite Slash2 Conf\n" res, site_name = None, None in_site = False site_id, fsuuid = -1, -1 client = None #Regex config parsing for sl2objects reg = { "clients": re.compile("^\s*?#\s*clients\s*=\s*(.+?)\s*;\s*$"), "type": re.compile("^\s*?type\s*?=\s*?(\S+?)\s*?;\s*$"), "id": re.compile("^\s*id\s*=\s*(\d+)\s*;\s*$"), "zpool": re.compile( r"^\s*?#\s*?zfspool\s*?=\s*?(\w+?)\s+?(.*?)\s*$"), "zpool_path": re.compile(r"^\s*?#\s*?zfspath\s*?=\s*?(.+?)\s*$"), "prefmds": re.compile(r"\s*?#\s*?prefmds\s*?=\s*?(\w+?@\w+?)\s*$"), "fsuuid": re.compile( r"^\s*set\s*fsuuid\s*=\s*\"?(0x[a-fA-F\d]+|\d+)\"?\s*;\s*$" ), "fsroot": re.compile("^\s*?fsroot\s*?=\s*?(\S+?)\s*?;\s*$"), "nids": re.compile("^\s*?nids\s*?=\s*?(.*)$"), "new_res": re.compile("^\s*resource\s+(\w+)\s*{\s*$"), "fin_res": re.compile("^\s*?}\s*$"), "site": re.compile("^\s*?site\s*?@(\w+).*?"), "site_id": re.compile( "^\s*site_id\s*=\s*(0x[a-fA-F\d]+|\d+)\s*;\s*$"), "jrnldev": re.compile("^\s*jrnldev\s*=\s*([/\w]+)\s*;\s*$") } line = conf.readline() while line: #Replace keywords and append to new conf new_conf += repl(self.build_dirs, line) #Iterate through the regexes and return a tuple of #(name, [\1, \2, \3, ...]) for successful matches matches = [ (k, reg[k].match(line).groups()) for k in reg\ if reg[k].match(line) ] #Should not be possible to have more than one assert (len(matches) <= 1) #log.debug("%s %s %s\n->%s" % (matches, in_site, res, line)) if matches: (name, groups) = matches[0] if in_site: if name == "site_id": site_id = groups[0] elif res: if name == "type": res["type"] = groups[0] elif name == "id": res["id"] = groups[0] elif name == "zpool_path": res["zpool_path"] = groups[0].strip() elif name == "jrnldev": res["jrnldev"] = groups[0] elif name == "zpool": res["zpool_name"] = groups[0] res["zpool_cache"] = path.join( self.build_dirs["base"], "{0}.zcf".format(groups[0])) res["zpool_args"] = groups[1] elif name == "prefmds": res["prefmds"] = groups[0] elif name == "fsroot": res["fsroot"] = groups[0].strip('"') elif name == "nids": #Read subsequent lines and get the first host tmp = groups[0] while line and ";" not in line: tmp += line line = conf.readline() tmp = re.sub(";\s*$", "", tmp) res["host"] = re.split("\s*,\s*", tmp, 1)[0].strip(" ") elif name == "fin_res": #Check for errors finalizing object res["site_id"] = site_id res["fsuuid"] = fsuuid if not res.finalize(self.sl2objects): self.shutdown() res = None else: if name == "new_res": res = SL2Res(groups[0], site_name) else: if name == "clients": for client in [ g.strip() for g in groups[0].split(",") ]: client_res = SL2Res(client, None) client_res["type"] = "client" client_res["host"] = client client_res.finalize(self.sl2objects) elif name == "site": site_name = groups[0] in_site = True elif name == "fsuuid": fsuuid = groups[0] line = conf.readline() new_conf_path = path.join(self.build_dirs["base"], "slash.conf") try: with open(new_conf_path, "w") as new_conf_file: new_conf_file.write(new_conf) log.debug("Successfully wrote build slash2 conf at {0}"\ .format(new_conf_path)) for sl2_obj in self.all_objects(): try: ssh = SSH(self.user, sl2_obj["host"], "") log.debug("Copying new config to {0}".format( sl2_obj["host"])) try: ssh.copy_file(new_conf_path, new_conf_path) except IOError: log.critical( "Error copying config file to {0}". format(ssh.host)) self.shutdown() ssh.close() except SSHException: log.error("Unable to copy config file to {0}!". format(sl2_obj["host"])) except IOError, e: log.fatal("Unable to write new conf to build directory!") log.fatal(new_conf_path) log.fatal(e) return False except IOError, e: log.fatal("Unable to read conf file at {0}"\ .format(self.conf["slash2"]["conf"])) log.fatal(e) return False
def parse_slash2_conf(self): """Reads and parses slash2 conf for tokens. Writes to the base directory; updates slash2 objects in the tsuite.""" try: with open(self.conf["slash2"]["conf"]) as conf: new_conf = "#TSuite Slash2 Conf\n" res, site_name = None, None in_site = False site_id, fsuuid = -1, -1 client = None # Regex config parsing for sl2objects reg = { "clients": re.compile("^\s*?#\s*clients\s*=\s*(.+?)\s*;\s*$"), "type": re.compile("^\s*?type\s*?=\s*?(\S+?)\s*?;\s*$"), "id": re.compile("^\s*id\s*=\s*(\d+)\s*;\s*$"), "zpool": re.compile(r"^\s*?#\s*?zfspool\s*?=\s*?(\w+?)\s+?(.*?)\s*$"), "zpool_path": re.compile(r"^\s*?#\s*?zfspath\s*?=\s*?(.+?)\s*$"), "prefmds": re.compile(r"\s*?#\s*?prefmds\s*?=\s*?(\w+?@\w+?)\s*$"), "fsuuid": re.compile(r"^\s*set\s*fsuuid\s*=\s*\"?(0x[a-fA-F\d]+|\d+)\"?\s*;\s*$"), "fsroot": re.compile("^\s*?fsroot\s*?=\s*?(\S+?)\s*?;\s*$"), "nids": re.compile("^\s*?nids\s*?=\s*?(.*)$"), "new_res": re.compile("^\s*resource\s+(\w+)\s*{\s*$"), "fin_res": re.compile("^\s*?}\s*$"), "site": re.compile("^\s*?site\s*?@(\w+).*?"), "site_id": re.compile("^\s*site_id\s*=\s*(0x[a-fA-F\d]+|\d+)\s*;\s*$"), "jrnldev": re.compile("^\s*jrnldev\s*=\s*([/\w]+)\s*;\s*$"), } line = conf.readline() while line: # Replace keywords and append to new conf new_conf += repl(self.build_dirs, line) # Iterate through the regexes and return a tuple of # (name, [\1, \2, \3, ...]) for successful matches matches = [(k, reg[k].match(line).groups()) for k in reg if reg[k].match(line)] # Should not be possible to have more than one assert len(matches) <= 1 # log.debug("%s %s %s\n->%s" % (matches, in_site, res, line)) if matches: (name, groups) = matches[0] if in_site: if name == "site_id": site_id = groups[0] elif res: if name == "type": res["type"] = groups[0] elif name == "id": res["id"] = groups[0] elif name == "zpool_path": res["zpool_path"] = groups[0].strip() elif name == "jrnldev": res["jrnldev"] = groups[0] elif name == "zpool": res["zpool_name"] = groups[0] res["zpool_cache"] = path.join(self.build_dirs["base"], "{0}.zcf".format(groups[0])) res["zpool_args"] = groups[1] elif name == "prefmds": res["prefmds"] = groups[0] elif name == "fsroot": res["fsroot"] = groups[0].strip('"') elif name == "nids": # Read subsequent lines and get the first host tmp = groups[0] while line and ";" not in line: tmp += line line = conf.readline() tmp = re.sub(";\s*$", "", tmp) res["host"] = re.split("\s*,\s*", tmp, 1)[0].strip(" ") elif name == "fin_res": # Check for errors finalizing object res["site_id"] = site_id res["fsuuid"] = fsuuid if not res.finalize(self.sl2objects): self.shutdown() res = None else: if name == "new_res": res = SL2Res(groups[0], site_name) else: if name == "clients": for client in [g.strip() for g in groups[0].split(",")]: client_res = SL2Res(client, None) client_res["type"] = "client" client_res["host"] = client client_res.finalize(self.sl2objects) elif name == "site": site_name = groups[0] in_site = True elif name == "fsuuid": fsuuid = groups[0] line = conf.readline() new_conf_path = path.join(self.build_dirs["base"], "slash.conf") try: with open(new_conf_path, "w") as new_conf_file: new_conf_file.write(new_conf) log.debug("Successfully wrote build slash2 conf at {0}".format(new_conf_path)) for sl2_obj in self.all_objects(): try: ssh = SSH(self.user, sl2_obj["host"], "") log.debug("Copying new config to {0}".format(sl2_obj["host"])) try: ssh.copy_file(new_conf_path, new_conf_path) except IOError: log.critical("Error copying config file to {0}".format(ssh.host)) self.shutdown() ssh.close() except SSHException: log.error("Unable to copy config file to {0}!".format(sl2_obj["host"])) except IOError, e: log.fatal("Unable to write new conf to build directory!") log.fatal(new_conf_path) log.fatal(e) return False except IOError, e: log.fatal("Unable to read conf file at {0}".format(self.conf["slash2"]["conf"])) log.fatal(e) return False