Skip to content

Commit a66b6ed

Browse files
authored
Support v2 https layers (#97)
* Fix import failure of threat-profile overrides * Fix import failure of threat-profile overrides * support https layers V2 API change
1 parent f931d32 commit a66b6ed

File tree

6 files changed

+108
-30
lines changed

6 files changed

+108
-30
lines changed

exporting/export_https_rulebase.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
def export_https_rulebase(package, layer, layer_uid, client):
1111
data_dict = {}
12-
12+
certs = {}
1313
debug_log("Exporting HTTPS Layer [" + layer + "]", True)
1414

1515
layer_settings, rulebase_sections, rulebase_rules, general_objects = \
@@ -24,9 +24,23 @@ def export_https_rulebase(package, layer, layer_uid, client):
2424
to_position = None
2525

2626
debug_log("Processing https rules and sections", True)
27-
2827
for rulebase_item in rulebase_sections + rulebase_rules:
2928
if "rule" in rulebase_item["type"]:
29+
cert_uid = rulebase_item["certificate"]
30+
if cert_uid not in certs:
31+
for index, obj in enumerate(unexportable_objects):
32+
if obj["uid"] == cert_uid:
33+
if "display-name" in obj:
34+
certs[cert_uid] = obj["display-name"]
35+
else:
36+
certs[cert_uid] = obj["name"].split(cert_uid + '_')[-1]
37+
rulebase_item["certificate"] = certs[cert_uid]
38+
unexportable_objects.pop(index)
39+
break
40+
# in case the cert is a default obj then we can keep its uid
41+
#we already iterated of this crt in a different rule
42+
else:
43+
rulebase_item["certificate"] = certs[cert_uid]
3044
replace_rule_field_uids_by_name(rulebase_item, general_objects)
3145
elif "section" in rulebase_item["type"]:
3246
if "from" in rulebase_item:

exporting/export_objects.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ def get_query_rulebase_data(client, api_type, payload):
4848
"comments": layer_data["comments"],
4949
"shared": layer_data["shared"],
5050
"type": "https-layer"}
51+
if "layer-type" in layer_data:
52+
layer_settings["layer-type"] = layer_data["layer-type"]
5153
else:
5254
layer_settings = {"name": layer_data["name"],
5355
"uid": layer_data["uid"],

exporting/export_package.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from exporting.export_threat_rulebase import export_threat_rulebase
1010
from exporting.export_https_rulebase import export_https_rulebase
1111
from lists_and_dictionaries import singular_to_plural_dictionary
12-
from utils import debug_log, export_to_tar, create_tar_file, generate_export_error_report
12+
from utils import debug_log, export_to_tar, create_tar_file, generate_export_error_report, compare_versions
1313

1414

1515
def export_package(client, args):
@@ -92,7 +92,12 @@ def export_package(client, args):
9292
if "https-inspection-policy" in show_package.data:
9393
if show_package.data["https-inspection-policy"]:
9494
debug_log("Exporting HTTPS layers", True)
95-
https_layers = [show_package.data["https-inspection-layer"]]
95+
if compare_versions(client.api_version, '2') == -1:
96+
https_layers = [show_package.data["https-inspection-layer"]]
97+
else:
98+
https_layers = []
99+
for layer_data in show_package.data["https-inspection-layers"].values():
100+
https_layers.append(layer_data)
96101
for https_layer in https_layers:
97102
https_data_dict, https_unexportable_objects \
98103
= export_https_rulebase(show_package.data["name"], https_layer["name"], https_layer["uid"], client)

importing/import_package.py

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import sys
55

66
from importing.import_objects import import_objects, add_tag_to_object_payload
7-
from utils import debug_log, generate_import_error_report, count_global_layers
7+
from utils import debug_log, generate_import_error_report, count_global_layers, compare_versions
88

99

1010
def import_package(client, args):
@@ -53,6 +53,7 @@ def import_package(client, args):
5353
exit(0)
5454

5555
debug_log("Importing general objects", True)
56+
machine_version = client.api_version
5657
layers_to_attach = import_objects(args.file, client, {}, package, None, args)
5758

5859
num_global_access, num_global_threat = count_global_layers(client, package)
@@ -74,17 +75,31 @@ def import_package(client, args):
7475
set_package_payload = {"name": package, "access-layers": {"add": access_layers},
7576
"threat-layers": {"add": threat_layers}}
7677

77-
if "https" in layers_to_attach and len(layers_to_attach["https"]) > 0:
78-
https_layer_name = layers_to_attach["https"][0]
79-
set_package_payload["https-layer"] = https_layer_name
78+
if "https" in layers_to_attach:
79+
# If the imported package's version < 2
80+
if compare_versions(client.api_version, '2') == -1:
81+
outbound_layer_name = layers_to_attach["https"][0]
82+
# If the version of the machine importing the package < 2
83+
if compare_versions(machine_version, '2') == -1:
84+
set_package_payload["https-layer"] = outbound_layer_name
85+
86+
else:
87+
inbound_layer_name = layers_to_attach["https"][0]
88+
outbound_layer_name = layers_to_attach["https"][1]
89+
set_package_payload["https-inspection-layers"] = {"inbound-https-layer": inbound_layer_name,
90+
"outbound-https-layer": outbound_layer_name}
91+
8092
# Remove default 'Predefined Rule'
81-
https_rulebase_reply = client.api_call("show-https-rulebase", {"name": https_layer_name, "details-level": "uid"})
93+
https_rulebase_reply = client.api_call("show-https-rulebase",
94+
{"name": outbound_layer_name, "details-level": "uid"})
8295
if https_rulebase_reply.success and "total" in https_rulebase_reply.data:
8396
last_rule_number = int(https_rulebase_reply.data["total"])
8497
if last_rule_number > 1:
85-
delete_https_rule = client.api_call("delete-https-rule", {"rule-number": last_rule_number, "layer": https_layer_name})
98+
delete_https_rule = client.api_call("delete-https-rule",
99+
{"rule-number": last_rule_number, "layer": outbound_layer_name})
86100
if not delete_https_rule.success:
87-
debug_log("Failed to remove default Predefined Rule in https layer ["+https_layer_name+"]", True, True)
101+
debug_log("Failed to remove default Predefined Rule in https layer [" + outbound_layer_name + "]",
102+
True, True)
88103

89104
debug_log("Attaching layers to package")
90105
layer_attachment_reply = client.api_call("set-package", set_package_payload)
@@ -97,22 +112,4 @@ def import_package(client, args):
97112
"Error: " + publish_reply.error_message + ". Import operation aborted.", True, True)
98113
sys.exit(1)
99114

100-
generate_import_error_report()
101-
102-
103-
104-
105-
106-
107-
108-
109-
110-
111-
112-
113-
114-
115-
116-
117-
118-
115+
generate_import_error_report()

lists_and_dictionaries.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,64 @@
761761
"https-rule": "https-rules",
762762
"central-license": "central-licenses"
763763
},
764+
"2": {
765+
"access-role": "access-roles",
766+
"threat-profile": "threat-profiles",
767+
"host": "hosts",
768+
"network": "networks",
769+
"address-range": "address_ranges",
770+
"multicast-address-range": "multicast-address-ranges",
771+
"security-zone": "security-zones",
772+
"time": "times",
773+
"simple-gateway": "simple-gateways",
774+
"simple-cluster": "simple-clusters",
775+
"dynamic-object": "dynamic-objects",
776+
"trusted-client": "trusted-clients",
777+
"tags": "tags",
778+
"dns-domain": "dns-domains",
779+
"opsec-application": "opsec-applications",
780+
"data-center": "data-centers",
781+
"data-center-object": "data-center-objects",
782+
"service-tcp": "services-tcp",
783+
"service-udp": "services-udp",
784+
"service-icmp": "services-icmp",
785+
"service-icmp6": "services-icmp6",
786+
"service-sctp": "services-sctp",
787+
"service-rpc": "services-rpc",
788+
"service-other": "services-other",
789+
"service-dce-rpc": "services-dce-rpc",
790+
"application-site": "applications-sites",
791+
"application-site-category": "application-site-categories",
792+
"application-site-group": "application-site-groups",
793+
"vpn-community-meshed": "vpn-communities-meshed",
794+
"vpn-community-star": "vpn-communities-star",
795+
"placeholder": "placeholders",
796+
"administrator": "administrators",
797+
"group": "groups",
798+
"group-with-exclusion": "groups-with-exclusion",
799+
"service-group": "service-groups",
800+
"time-group": "time-groups",
801+
"application-group": "application-groups",
802+
"threat-protection": "threat-protections",
803+
"exception-group": "exception-groups",
804+
"generic-object": "",
805+
"access-layer": "access-layers",
806+
"access-section": "access-sections",
807+
"access-rule": "access-rules",
808+
"nat-layer": "nat-layers",
809+
"nat-section": "nat-sections",
810+
"nat-rule": "nat-rules",
811+
"threat-layer": "threat-layers",
812+
"threat-rule": "threat-rules",
813+
"threat-exception-section": "threat-exception-sections",
814+
"threat-exception": "threat-exceptions",
815+
"wildcard": "wildcards",
816+
"updatable-object": "updatable-objects",
817+
"https-layer": "https-layers",
818+
"https-section": "https-sections",
819+
"https-rule": "https-rules",
820+
"central-license": "central-licenses"
821+
},
764822
}
765823

766824
unexportable_objects_map = {}

utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,8 @@ def export_to_tar(data_dict, timestamp, tar, lst, api_version, ignore_list=None)
284284
def write_data(json_data, out_file, file_format, close_file=True):
285285
for obj in json_data:
286286
for field in obj:
287+
if field == "certificate" and "https-rule" in out_file.name:
288+
continue
287289
if obj[field] in unexportable_objects_map:
288290
obj[field] = unexportable_objects_map[obj[field]]
289291
if "json" in file_format:

0 commit comments

Comments
 (0)