Skip to content

Commit 2fb0b9a

Browse files
committed
Allow rich_rules to be specified as a dictionary
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.
1 parent cf21cca commit 2fb0b9a

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

firewalld/files/zone.xml

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,7 @@
8383
{%- endfor %}
8484
{%- endif %}
8585

86-
{%- if 'rich_rules' in zone %}
87-
{%- for rule in zone.rich_rules %}
86+
{%- macro rich_rule(rule) -%}
8887
{%- if 'family' in rule %}
8988
<rule family="{{ rule.family }}">
9089
{%- else %}
@@ -149,6 +148,42 @@
149148
<drop/>
150149
{%- endif %}
151150
</rule>
151+
{%- endmacro %}
152+
153+
{%- if 'rich_rules' in zone %}
154+
{%- if zone.rich_rules is list %}
155+
{%- set rich_rules = zone.rich_rules %}
156+
{%- else %}
157+
{%- set expanded_ipset_rules = [] %}
158+
{%- for name,rule in zone.rich_rules|dictsort %}
159+
{%- if 'ipsets' in rule %}
160+
{%- for ipset in rule.ipsets %}
161+
{%- set tmp_rule = {} %}
162+
{%- set _dummy = tmp_rule.update(rule) %}
163+
{%- set _dummy = tmp_rule.update({'ipset':{'name':ipset}}) %}
164+
{%- set _dummy = expanded_ipset_rules.append(tmp_rule) %}
165+
{%- endfor %}
166+
{%- else %}
167+
{%- set _dummy = expanded_ipset_rules.append(rule) %}
168+
{%- endif %}
169+
{%- endfor %}
170+
{%- set rich_rules = [] %}
171+
{%- for rule in expanded_ipset_rules %}
172+
{%- if 'services' in rule %}
173+
{%- for service in rule.services %}
174+
{%- set tmp_rule = {} %}
175+
{%- set _dummy = tmp_rule.update(rule) %}
176+
{%- set _dummy = tmp_rule.update({'service':service}) %}
177+
{%- set _dummy = rich_rules.append(tmp_rule) %}
178+
{%- endfor %}
179+
{%- else %}
180+
{%- set _dummy = rich_rules.append(rule) %}
181+
{%- endif %}
182+
{%- endfor %}
183+
{%- endif %}
184+
{%- for rule in rich_rules %}
185+
{{ rich_rule(rule) }}
152186
{%- endfor %}
153187
{%- endif %}
188+
154189
</zone>

pillar.example

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,21 @@ firewalld:
151151
port: 4444
152152
protocol: tcp
153153

154+
rich_public:
155+
short: rich_public
156+
description: "Example"
157+
# Rich rules can be specified as a dictionary. All keys from standard rich rules
158+
# are applicable. Special keys "ipsets" and "services", if defined, take precedence.
159+
# They will be auto-expanded into separate rich rules per value in the list.
160+
rich_rules:
161+
ssh-csg:
162+
accept: true
163+
ipsets:
164+
- fail2ban-ssh
165+
- other-ipset
166+
services:
167+
- ssh
168+
154169
direct:
155170
chain:
156171
MYCHAIN:

0 commit comments

Comments
 (0)