diff --git a/salt/common/tools/sbin/so-firewall b/salt/common/tools/sbin/so-firewall
index 409a09fd2..2a394fdff 100755
--- a/salt/common/tools/sbin/so-firewall
+++ b/salt/common/tools/sbin/so-firewall
@@ -16,6 +16,7 @@
# along with this program. If not, see .
import os
+import re
import subprocess
import sys
import time
@@ -26,6 +27,7 @@ hostgroupsFilename = "/opt/so/saltstack/local/salt/firewall/hostgroups.local.yam
portgroupsFilename = "/opt/so/saltstack/local/salt/firewall/portgroups.local.yaml"
defaultPortgroupsFilename = "/opt/so/saltstack/default/salt/firewall/portgroups.yaml"
supportedProtocols = ['tcp', 'udp']
+readonly = False
def showUsage(options, args):
print('Usage: {} [OPTIONS] [ARGS...]'.format(sys.argv[0]))
@@ -70,10 +72,26 @@ def checkApplyOption(options):
return apply(None, None)
def loadYaml(filename):
+ global readonly
+
file = open(filename, "r")
- return yaml.safe_load(file.read())
+ content = file.read()
+
+ # Remove Jinja templating (for read-only operations)
+ if "{%" in content or "{{" in content:
+ content = content.replace("{{ ssh_port }}", "22")
+ pattern = r'.*({%|{{|}}|%}).*'
+ content = re.sub(pattern, "", content)
+ readonly = True
+
+ return yaml.safe_load(content)
def writeYaml(filename, content):
+ global readonly
+
+ if readonly:
+ raise Exception("Cannot write yaml file that has been flagged as read-only")
+
file = open(filename, "w")
return yaml.dump(content, file)