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 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.")