Skip to content

Commit

Permalink
feat: allow rich_rules to be specified as a dict
Browse files Browse the repository at this point in the history
When specifying rich rules as a dictionary ipsets and services can be
specified as lists. They will be expanded out by the jinja template into
individual rich rules for the parent zone.
  • Loading branch information
Sxderp committed Mar 30, 2020
1 parent cf21cca commit cd4cec0
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 2 deletions.
39 changes: 37 additions & 2 deletions firewalld/files/zone.xml
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,7 @@
{%- endfor %}
{%- endif %}

{%- if 'rich_rules' in zone %}
{%- for rule in zone.rich_rules %}
{%- macro rich_rule(rule) -%}
{%- if 'family' in rule %}
<rule family="{{ rule.family }}">
{%- else %}
Expand Down Expand Up @@ -149,6 +148,42 @@
<drop/>
{%- endif %}
</rule>
{%- endmacro %}

{%- if 'rich_rules' in zone %}
{%- if zone.rich_rules is list %}
{%- set rich_rules = zone.rich_rules %}
{%- else %}
{%- set expanded_ipset_rules = [] %}
{%- for name,rule in zone.rich_rules|dictsort %}
{%- if 'ipsets' in rule %}
{%- for ipset in rule.ipsets %}
{%- set tmp_rule = {} %}
{%- set _dummy = tmp_rule.update(rule) %}
{%- set _dummy = tmp_rule.update({'ipset':{'name':ipset}}) %}
{%- set _dummy = expanded_ipset_rules.append(tmp_rule) %}
{%- endfor %}
{%- else %}
{%- set _dummy = expanded_ipset_rules.append(rule) %}
{%- endif %}
{%- endfor %}
{%- set rich_rules = [] %}
{%- for rule in expanded_ipset_rules %}
{%- if 'services' in rule %}
{%- for service in rule.services %}
{%- set tmp_rule = {} %}
{%- set _dummy = tmp_rule.update(rule) %}
{%- set _dummy = tmp_rule.update({'service':service}) %}
{%- set _dummy = rich_rules.append(tmp_rule) %}
{%- endfor %}
{%- else %}
{%- set _dummy = rich_rules.append(rule) %}
{%- endif %}
{%- endfor %}
{%- endif %}
{%- for rule in rich_rules %}
{{ rich_rule(rule) }}
{%- endfor %}
{%- endif %}

</zone>
15 changes: 15 additions & 0 deletions pillar.example
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,21 @@ firewalld:
port: 4444
protocol: tcp

rich_public:
short: rich_public
description: "Example"
# Rich rules can be specified as a dictionary. All keys from standard rich rules
# can be used. Special keys "ipsets" and "services", if defined, take precedence.
# They will be auto-expanded into separate rich rules per value in the list.
rich_rules:
ssh-csg:
accept: true
ipsets:
- fail2ban-ssh
- other-ipset
services:
- ssh

direct:
chain:
MYCHAIN:
Expand Down

0 comments on commit cd4cec0

Please sign in to comment.