예제 #1
0
def _applyMultisiteThread(component, context, template_content, generic_links, netcfg):
    logger = ContextLoggerChild(context, component)
    lock_manager = component.core.lock_manager
    use_template = bool(template_content)
    config = component.config
    use_nufw = (config['global']['firewall_type'] == NUFW_GATEWAY)
    last_ruleset = lastRulesetApplied()
    ruleset_name = last_ruleset.get('ruleset')

    # Create transactions
    transactions = []
    if use_template:
        # Write the new multisite template content
        write_template = WriteTemplate(logger, MULTISITE_TEMPLATE_FILENAME, template_content)
        transactions.append(write_template)
    transactions.append(WriteGenericLinks(generic_links, logger))

    if use_template and (not ruleset_name):
        # There is not production ruleset:
        # create an empty ruleset using the template
        create_empty = CreateEmptyRuleset(logger, component, netcfg)
        transactions.append(create_empty)
    else:
        create_empty = None

    # Replace the template in all existing rulesets
    replace = replaceTemplateTransactions(logger, component, netcfg,
        MULTISITE_TEMPLATE_NAME, use_template)
    transactions.append(replace)

    # Reapply the ruleset
    apply = ApplyRuleset(logger, component, context, netcfg,
        ruleset_name, use_nufw)
    transactions.append(apply)
    if create_empty:
        create_empty.name_callbacks.append(apply.setRuleset)

        # The new ruleset is now the production ruleset
        save = SaveRuleset(None, use_nufw)
        transactions.append(save)
        create_empty.name_callbacks.append(save.setRuleset)

    if (not use_template) and exists(MULTISITE_TEMPLATE_FILENAME):
        # Remove the multisite template
        remove = RemoveTemplate(logger, MULTISITE_TEMPLATE_FILENAME)
        transactions.append(remove)

    lock_manager.acquire(context, LOCK_RULESET)
    try:
        executeTransactions(logger, transactions)
    finally:
        lock_manager.release(context, LOCK_RULESET)
예제 #2
0
    def service_productionRules(self, context):
        """
        Get informations about the rules in production as a dictionary with
        keys:

         - timestamp: use parseDatetime() from ufwi_rpcd.common.transport
           to get a datetime object
         - use_nufw: boolean (True if NuFW is used)
         - ruleset (optional): name of the ruleset

        Name is not set if localfw component was used to create the rules
        (without any ruleset).

        Return an empty dict if ufwi_ruleset.apply() nor localfw.apply() was not
        called (if no rules are in production).
        """
        return lastRulesetApplied()
예제 #3
0
def reapplyLastRuleset(netcfg, context, component):
    logger = ContextLoggerChild(context, component)
    last_ruleset = lastRulesetApplied()

    if 'ruleset' in last_ruleset:
        name = last_ruleset['ruleset']
        message = "Reapply the last rule set: %s" % name
        ruleset = Ruleset(component, logger, netcfg)
        ruleset.load(logger, "ruleset", name, filename=PRODUCTION_RULESET)
        use_nufw = last_ruleset['use_nufw']
    else:
        message = "Reapply the last rule set: not rule set (only write localfw rules)"
        ruleset = None
        use_nufw = False
    logger.error(message)

    apply = ApplyRules(context, component, ruleset, use_nufw,
        raise_error=True, consistency_error=False)
    return apply.applyRules()