impossibleTravelerGetDistance
Computes the distance between two sets of coordinates, in miles.
python · Core
Source
import demistomock as demisto # noqa: F401 from CommonServerPython import * # noqa: F401 import itertools import geopy.distance import urllib3 urllib3.disable_warnings() def get_distances_list(src_coords_list: list, events_dict: dict): distance_list = [] for unique_pair in itertools.combinations(src_coords_list, 2): geo_distance = round(geopy.distance.geodesic(unique_pair[0], unique_pair[1]).miles, 2) hr = f"Calculated Distance: {str(geo_distance)} miles." context = { "distance": geo_distance, "src_coords": unique_pair[0], "dest_coords": unique_pair[1], "source_ip": events_dict[unique_pair[0]]["ip"], "source_country": events_dict[unique_pair[0]]["Country"], "dest_ip": events_dict[unique_pair[1]]["ip"], "dest_country": events_dict[unique_pair[1]]["Country"], "timestamp": events_dict[unique_pair[0]]["event_timestamp"], "identity": events_dict[unique_pair[0]]["identity_display_name"], } distance_list.append( CommandResults(readable_output=hr, outputs=context, outputs_prefix="GeoEvents", outputs_key_field="") ) return distance_list def verify_coords(args: dict): """ Verify the two given coords lists are identical - we receive two lists (and not one) for BC reasons Args: args: the script's arguments """ if not set(argToList(args["src_coords"])) == set(argToList(args["dest_coords"])): raise ValueError("The source coordination list and the destination coordination list should be identical.") def generate_evetns_dict(): existing = demisto.get(demisto.context(), "ImpossibleTraveler.Events") return {o["location"]: o for o in existing} def main(): try: events_dict = generate_evetns_dict() args = demisto.args() verify_coords(args) return_results(get_distances_list(argToList(args["src_coords"]), events_dict)) except Exception as e: return_error("Error occurred while parsing output from command. Exception info:\n" + str(e)) if __name__ in ("__main__", "__builtin__", "builtins"): main()