What is the best way to return a variable or call a function to maximize code reuse?

Question:

I was wondering if i could get some input from some season python exports, i have a couple questions

I am extracting data from an api request and calculating the total vulnerabilities,

  1. what is the best way i can return this data so that i can call it in another function

  2. what is the way i can add up all the vulnerabilities (right now its just adding it per 500 at a time, id like to do the sum of every vulnerability

def _request():

    third_party_patching_filer = {
    "asset": "asset.agentKey IS NOT NULL", 
    "vulnerability" : "vulnerability.categories NOT IN ['microsoft patch']"}

    headers = _headers()
    print(headers)
    url1 = f"https://us.api.insight.rapid7.com/vm/v4/integration/assets"
    resp = requests.post(url=url1, headers=headers, json=third_party_patching_filer, verify=False).json()

    jsonData = resp
    #print(jsonData)

    has_next_cursor = False
    nextKey = ""
  
    if "cursor" in jsonData["metadata"]:
        has_next_cursor = True
        nextKey = jsonData["metadata"]["cursor"]

    while has_next_cursor:

        url2 = f"https://us.api.insight.rapid7.com/vm/v4/integration/assets?&size=500&cursor={nextKey}"
        resp2 = requests.post(url=url2, headers=headers, json=third_party_patching_filer, verify=False).json()
        cursor = resp2["metadata"]
        print(cursor)
        if "cursor" in cursor:

            nextKey = cursor["cursor"]
            print(f"next key {nextKey}")
            #print(desktop_support)
            for data in resp2["data"]:

                for tags in data['tags']:
                    total_critical_vul_osswin = []
                    total_severe_vul_osswin = []
                    total_modoer_vuln_osswin = []
                    if tags["name"] == 'OSSWIN':
                        print("OSSWIN")

                        critical_vuln_osswin = data['critical_vulnerabilities']
                        severe_vuln_osswin = data['severe_vulnerabilities']
                        modoer_vuln_osswin = data['moderate_vulnerabilities']
                        total_critical_vul_osswin.append(critical_vuln_osswin)
                        total_severe_vul_osswin.append(severe_vuln_osswin)
                        total_modoer_vuln_osswin.append(modoer_vuln_osswin)
                        print(sum(total_critical_vul_osswin))
                        print(sum(total_severe_vul_osswin))
                        print(sum(total_modoer_vuln_osswin))

                    if tags["name"] == 'DESKTOP_SUPPORT':
                        print("Desktop")
                        total_critical_vul_desktop = []
                        total_severe_vul_desktop = []
                        total_modorate_vuln_desktop = []
                        critical_vuln_desktop = data['critical_vulnerabilities']
                        severe_vuln_desktop = data['severe_vulnerabilities']
                        moderate_vuln_desktop = data['moderate_vulnerabilities']
                        total_critical_vul_desktop.append(critical_vuln_desktop)
                        total_severe_vul_desktop.append(severe_vuln_desktop)
                        total_modorate_vuln_desktop.append(moderate_vuln_desktop)
                        print(sum(total_critical_vul_desktop))
                        print(sum(total_severe_vul_desktop))
                        print(sum(total_modorate_vuln_desktop))

                    else:
                        pass

        else:
            has_next_cursor = False
Asked By: FloydLee

||

Answers:

If you have a lot of parameters to pass, consider using a dict to combine them. Then you can just return the dict and pass it along to the next function that needs that data. Another approach would be to create a class and either access the variables directly or have helper functions that do so. The latter is a cleaner solution vs a dict, since with a dict you have to quote every variable name, and with a class you can easily add additional functionally beyond just being a container for a bunch of instance variables.

If you want the total across all the data, you should put these initializations:

total_critical_vul_osswin = []
total_severe_vul_osswin = []
total_modoer_vuln_osswin = []

before the while has_next_cursor loop (and similarly for the desktop totals). The way your code is currently, they are initialized each cursor (ie, each 500 samples based on the URL).

Answered By: craigb
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.