class WriteTemplate(Transaction, LoggerChild): def __init__(self, logger, filename, content): LoggerChild.__init__(self, logger) self.filename = filename self.new = File(self.filename + ".new", False) self.old = File(self.filename + ".old", False) self.content = content def prepare(self): umask(0077) with self.new.open("wb") as f: f.write(self.content) def save(self): umask(0077) self.old.copyFrom(self.filename) def apply(self): self.critical("Write the new multisite template") self.new.renameTo(self.filename) def rollback(self): if self.old.exist: self.old.renameTo(self.filename) else: unlinkQuiet(self.filename) def cleanup(self): self.old.unlink(quiet=True) self.new.unlink(quiet=True)
class ReplaceTemplate(Transaction, LoggerChild): def __init__(self, logger, component, netcfg, ruleset, template, use_template): LoggerChild.__init__(self, logger) self.component = component self.netcfg = netcfg self.ruleset = ruleset # Ruleset name (str) self.template = template self.use_template = use_template self.filename = rulesetFilename("ruleset", self.ruleset) self.old = File(self.filename + ".old", False) def save(self): umask(0077) self.old.copyFrom(self.filename) def apply(self): self.debug("Replace multisite templates in ruleset %s" % self.ruleset) logger = self.getLogger() ruleset = Ruleset(self.component, logger, self.netcfg) ruleset.load(logger, "ruleset", self.ruleset) if self.use_template: template = self.template else: template = None replaceTemplate(self.getLogger(), ruleset, template) ruleset.write(self.filename) def rollback(self): self.old.renameTo(self.filename) def cleanup(self): self.old.unlink(quiet=True)
class WriteGenericLinks(Transaction, LoggerChild): def __init__(self, links, logger): LoggerChild.__init__(self, logger) self.filename = GENERIC_LINKS_XML self.links = links self.old = File(self.filename + ".old", False) def prepare(self): filename = self.filename + ".new" generic_links = BaseGenericLinks(filename) generic_links.setLinks(self.links) generic_links.write() self.new = File(filename, True) def save(self): umask(0077) self.old.copyFrom(self.filename) def apply(self): self.error("Write new generic links") self.new.renameTo(self.filename) def rollback(self): if self.old.exist: self.old.renameTo(self.filename) else: unlinkQuiet(self.filename) def cleanup(self): self.old.unlink(quiet=True) self.new.unlink(quiet=True)
class RemoveTemplate(Transaction, LoggerChild): def __init__(self, logger, filename): LoggerChild.__init__(self, logger) self.filename = filename self.copy = File(self.filename + ".copy", False) def save(self): umask(0077) self.copy.copyFrom(self.filename) def apply(self): self.critical("Remove multisite template") try: unlink(self.filename) except IOError, err: raise RulesetError(tr("Unable to delete the multisite template: %s!"), exceptionAsUnicode(err))
class WriteRules(Transaction, LoggerChild): def __init__(self, logger, ufwi_ruleset_rules): LoggerChild.__init__(self, logger) self.ufwi_ruleset_rules = ufwi_ruleset_rules self.filename = RULES_FILENAME self.old_rules = File(self.filename + ".old", False) self.new_rules = File(self.filename + ".new", False) def prepare(self): self.info("Write new rules") umask(0077) with self.new_rules.open("wb") as fp: pickle.dump(self.ufwi_ruleset_rules, fp, pickle.HIGHEST_PROTOCOL) def save(self): self.info("Keep current rules") umask(0077) self.old_rules.copyFrom(self.filename) def apply(self): self.error("Write rules to disk") try: self.new_rules.renameTo(self.filename) except OSError: self.error("No new rules to rename.") def rollback(self): self.error("Restore old rules") try: self.old_rules.renameTo(self.filename) except OSError: self.error("No old rules to rename.") def cleanup(self): self.error("Remove temp files") try: self.old_rules.unlink(quiet=True) except OSError: self.error("No old rules to clean.") try: self.new_rules.unlink(quiet=True) except OSError: self.error("No new rules to clean.")
class ProductionRuleset(Transaction): def __init__(self, new_ruleset): Transaction.__init__(self) self.filename = PRODUCTION_RULESET self.new_ruleset = new_ruleset self.old_production = File(self.filename + ".old", False) def save(self): self.old_production.copyFrom(self.filename) def apply(self): copyfile(self.new_ruleset, self.filename) def rollback(self): if self.old_production.exist: self.old_production.renameTo(self.filename) else: unlinkQuiet(self.filename) def cleanup(self): self.old_production.unlink(quiet=True)