From c6dfbf6de2c9e70ef2f4082708d47ab0ed60ab68 Mon Sep 17 00:00:00 2001 From: Horia Gunica <43091730+horiagunica@users.noreply.github.com> Date: Wed, 21 May 2025 09:57:59 +0300 Subject: [PATCH 1/6] fix: Added check for commit_response text parsing (#557) --- panos/base.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/panos/base.py b/panos/base.py index d8505e91..083cc3e2 100644 --- a/panos/base.py +++ b/panos/base.py @@ -4900,7 +4900,7 @@ def _commit( except AttributeError: if exception: raise err.PanCommitNotNeeded("Commit not needed", pan_device=self) - else: + elif commit_response.find("./msg/line") is not None: # By getting here, there was no "./result/job" in the commit response, # and there was no exception raised either, so capture the response message commit_response_msg = commit_response.find("./msg/line").text @@ -4921,6 +4921,7 @@ def _commit( "messages": [commit_response_msg], } return log_collector_group_push_result + else: return if not sync: # Don't synchronize, just return From 66db30e339be6866e109ebb9c3cb95d3ecba0fc0 Mon Sep 17 00:00:00 2001 From: rgangam-PAN <103026777+rgangam-PAN@users.noreply.github.com> Date: Tue, 3 Jun 2025 16:56:50 +0530 Subject: [PATCH 2/6] fix: bgp peer properties no longer flipped (#583) --- panos/network.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/panos/network.py b/panos/network.py index 1a9e1ad3..a45fb5dc 100644 --- a/panos/network.py +++ b/panos/network.py @@ -3046,9 +3046,10 @@ def _setup(self): ) params.append( VersionedParamPath( - "export_nexthop", - path="type/{type}/export-nexthop", - values=("resolve", "use-self"), + "remove_private_as", + condition={"type": "ebgp"}, + path="type/{type}/remove-private-as", + vartype="yesno", ) ) params.append( @@ -3061,10 +3062,9 @@ def _setup(self): ) params.append( VersionedParamPath( - "remove_private_as", - condition={"type": "ebgp"}, - path="type/{type}/remove-private-as", - vartype="yesno", + "export_nexthop", + path="type/{type}/export-nexthop", + values=("resolve", "use-self"), ) ) From cecf2dfba9896707b5bb3b9d6217ab2fc9e74691 Mon Sep 17 00:00:00 2001 From: Adam Baumeister <32481037+adambaumeister@users.noreply.github.com> Date: Thu, 5 Jun 2025 09:41:20 +1000 Subject: [PATCH 3/6] chore: Update bgp object docstring (#596) --- panos/network.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/panos/network.py b/panos/network.py index a45fb5dc..d68a4152 100644 --- a/panos/network.py +++ b/panos/network.py @@ -3017,10 +3017,9 @@ class BgpPeerGroup(VersionedPanObject): aggregated_confed_as_path (bool): the peers understand aggregated confederation AS path soft_reset_with_stored_info (bool): soft reset with stored info type (str): peer group type I('ebgp')/I('ibgp')/I('ebgp-confed')/I('ibgp-confed') - export_nexthop (str): export locally resolved nexthop I('resolve')/I('use-self') - import_nexthop (str): override nexthop with peer address I('original')/I('use-peer'), only with 'ebgp' remove_private_as (bool): remove private AS when exporting route, only with 'ebgp' - + import_nexthop (str): override nexthop with peer address I('original')/I('use-peer'), only with 'ebgp' + export_nexthop (str): export locally resolved nexthop I('resolve')/I('use-self') """ SUFFIX = ENTRY From 97e62a764b5a8dc2488abb9c60bf08fc1f5330c6 Mon Sep 17 00:00:00 2001 From: Adam Baumeister <32481037+adambaumeister@users.noreply.github.com> Date: Wed, 25 Feb 2026 10:03:58 +1100 Subject: [PATCH 4/6] fix: logical routers attachable to vsys objects #605 --- panos/base.py | 1 + panos/device.py | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/panos/base.py b/panos/base.py index 083cc3e2..03aae887 100644 --- a/panos/base.py +++ b/panos/base.py @@ -3479,6 +3479,7 @@ def set_vsys( "vlan": "vlans", "virtual-wire": "virtual_wires", "virtual-router": "virtual_routers", + "logical-router": "logical_routers", "interface": "interface", } for key, param_name in import_to_vsys_param.items(): diff --git a/panos/device.py b/panos/device.py index 704c9aa6..2a288a90 100644 --- a/panos/device.py +++ b/panos/device.py @@ -99,6 +99,7 @@ class Vsys(VersionedPanObject): vlans (list): A list of strings of VLANs virtual_wires (list): A list of strings of virtual wires virtual_routers (list): A list of strings of virtual routers + logical_routers (list): (10.2+) A list of strings of logical routers visible_vsys (list): A list of strings of the vsys visible dns_proxy (str): DNS Proxy server decrypt_forwarding (bool): Allow forwarding of decrypted content @@ -188,6 +189,10 @@ def _setup(self): path="import/network/virtual-router", ) ) + params.append(VersionedParamPath("logical_routers", exclude=True)) + params[-1].add_profile( + "10.2.0", path="import/network/logical-router", vartype="member" + ) params.append( VersionedParamPath( "visible_vsys", vartype="member", path="import/visible-vsys" From 641489d381d0268817689effde55526205e550dd Mon Sep 17 00:00:00 2001 From: pavelrn <30939390+pavelrn@users.noreply.github.com> Date: Tue, 10 Mar 2026 10:22:36 +0100 Subject: [PATCH 5/6] fix: Force commit now correctly performs a 'commit force' operation --- panos/firewall.py | 9 +++------ panos/panorama.py | 9 +++------ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/panos/firewall.py b/panos/firewall.py index aafb7564..5349f019 100644 --- a/panos/firewall.py +++ b/panos/firewall.py @@ -591,7 +591,6 @@ def is_partial(self): self.exclude_device_and_network, self.exclude_shared_objects, self.exclude_policy_and_objects, - self.force, ] return any(x for x in pp_list) @@ -622,11 +621,9 @@ def element(self): ET.SubElement(partial, "shared-object").text = "excluded" if self.exclude_policy_and_objects: ET.SubElement(partial, "policy-and-objects").text = "excluded" + fe.append(partial) - if self.force: - fe = ET.SubElement(root, "force") - fe.append(partial) - else: - root.append(partial) + if self.force: + fe = ET.SubElement(root, "force") return root diff --git a/panos/panorama.py b/panos/panorama.py index 64600ecf..16e36055 100644 --- a/panos/panorama.py +++ b/panos/panorama.py @@ -990,7 +990,6 @@ def is_partial(self): self.log_collector_groups, self.exclude_device_and_network, self.exclude_shared_objects, - self.force, ] return any(x for x in pp_list) @@ -1031,12 +1030,10 @@ def element(self): ET.SubElement(partial, "device-and-network").text = "excluded" if self.exclude_shared_objects: ET.SubElement(partial, "shared-object").text = "excluded" + root.append(partial) - if self.force: - fe = ET.SubElement(root, "force") - fe.append(partial) - else: - root.append(partial) + if self.force: + fe = ET.SubElement(root, "force") return root From 65b0f78dd5272e3bd574381cca94267af035cc79 Mon Sep 17 00:00:00 2001 From: John Stevens-Garmon Date: Thu, 12 Mar 2026 14:42:02 -0400 Subject: [PATCH 6/6] fix partial commit bug from 1.12.5 --- panos/firewall.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panos/firewall.py b/panos/firewall.py index 5349f019..e9c123a1 100644 --- a/panos/firewall.py +++ b/panos/firewall.py @@ -621,7 +621,7 @@ def element(self): ET.SubElement(partial, "shared-object").text = "excluded" if self.exclude_policy_and_objects: ET.SubElement(partial, "policy-and-objects").text = "excluded" - fe.append(partial) + root.append(partial) if self.force: fe = ET.SubElement(root, "force")