PaloAltoNetworks / pan-os-python

The PAN-OS SDK for Python is a package to help interact with Palo Alto Networks devices (including physical and virtualized Next-generation Firewalls and Panorama). The pan-os-python SDK is object oriented and mimics the traditional interaction with the device via the GUI or CLI/API.
https://pan-os-python.readthedocs.io
ISC License
340 stars 168 forks source link

Bug due to None datatype in _parse_job_results() #470

Closed undodelete closed 7 months ago

undodelete commented 2 years ago

Describe the bug

When using the base.syncjob method i'm encountering an issue if there is no details in the job response. This is happening when downloading a vm series plugin.

Expected behavior

Expect the method to complete successfully even when there is no 'details' in response.

Current behavior

download_result = parent.syncjob(download_response)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/dpadmin/venv/pan-os/lib/python3.8/site-packages/panos/base.py", line 4983, in syncjob
    return self._parse_job_results(job_xml, get_devices=False)
  File "/home/dpadmin/venv/pan-os/lib/python3.8/site-packages/panos/base.py", line 5131, in _parse_job_results
    messages = job["details"]["line"]
TypeError: 'NoneType' object is not subscriptable

Response from python call and details is None

{
   "response":{
      "status":"success",
      "result":{
         "job":{
            "tenq":"2022/07/26 07:32:25",
            "tdeq":"07:32:25",
            "id":"14",
            "user":"None",
            "type":"Downld",
            "status":"FIN",
            "queued":"NO",
            "stoppable":false,
            "result":"OK",
            "tfin":"07:32:26",
            "description":"None",
            "positionInQ":"0",
            "progress":"100",
            "details":"None",
            "warnings":"None"
         }
      }
   }
}

Response form the xml api direct is consistent and there is no details / line.

<job>
  <tenq>2022/07/26 07:32:25</tenq>
  <tdeq>07:32:25</tdeq>
  <id>14</id>
  <user/>
  <type>Downld</type>
  <status>FIN</status>
  <queued>NO</queued>
  <stoppable>no</stoppable>
  <result>OK</result>
  <tfin>07:32:26</tfin>
  <description/>
  <positionInQ>0</positionInQ>
  <progress>100</progress>
  <details/>
  <warnings/>
</job>

Possible solution

The issue appears to be in the _parse_job_results() method in base.py. Adding an exception handler for the type error would resolve the issue.

line 5130 base.py

try:
    messages = job["details"]["line"]
except (TypeError, KeyError):
    messages = []

Steps to reproduce

download_cmd = "<request><plugins><download><file>vm_series-2.1.2</file></download></plugins></request>"
download_response = parent.op(download_cmd, cmd_xml=False)
download_result = parent.syncjob(download_response)

Context

Basically I'm trying to download / install vm plugins and wait for the task to complete using the base.syncjob method.

Your Environment

welcome-to-palo-alto-networks[bot] commented 2 years ago

:tada: Thanks for opening your first issue here! Welcome to the community!