Source
import demistomock as demisto
from CommonServerPython import *
def validate_args(parse_all, header, value):
if parse_all.lower() != "true" and (not header or not value):
return_error("Error: If parse_all is false, both header and value must be specified.")
def validate_list_exists(list_data):
if not list_data or "Item not found" in list_data:
return_error("Error: The supplied list name was not found.")
def validate_header_exists(headers, header):
if header not in headers:
return_error("Error: The supplied header name was not found.")
def list_to_headers_and_lines(list_data: str, list_separator: str):
list_data = list_data.strip()
lines_and_headers = [
(line.replace("\r", "") if line.endswith("\r") else line).split(list_separator) for line in list_data.split("\n")
]
headers = lines_and_headers[0]
return headers, lines_and_headers[1:]
def lines_to_context_format(list_lines, headers):
lines_context = []
for line in list_lines:
line_context = {headers[item]: line[item] for item in range(len(line))}
lines_context.append(line_context)
return lines_context
def parse_relevant_rows(headers, lines, header, value, context, parse_all=False):
outputs_key_field = ["list_name", "parse_all"]
if parse_all:
lines_context = lines_to_context_format(lines, headers)
else:
header_location = headers.index(header)
specific_lines_to_parse = [line for line in lines if line[header_location] == value]
lines_context = lines_to_context_format(specific_lines_to_parse, headers)
outputs_key_field.extend(["header", "value"])
if not lines_context:
return CommandResults(readable_output="No results found")
context["Results"] = lines_context
human_readable = tableToMarkdown("List Result", lines_context, headers=headers, removeNull=True)
return CommandResults(
outputs_prefix="GetListRow", outputs_key_field=outputs_key_field, outputs=context, readable_output=human_readable
)
def parse_list(parse_all, header, value, list_name, list_separator: str):
validate_args(parse_all, header, value)
list_data = demisto.executeCommand("getList", {"listName": list_name})[0]["Contents"]
context = {"ListName": list_name, "Header": header, "Value": value, "ParseAll": parse_all}
validate_list_exists(list_data)
headers, lines = list_to_headers_and_lines(list_data, list_separator)
if parse_all.lower() == "true":
command_results = parse_relevant_rows(headers, lines, header, value, context, parse_all=True)
else:
validate_header_exists(headers, header)
command_results = parse_relevant_rows(headers, lines, header, value, context)
return command_results
def main():
args = demisto.args()
list_name = args["list_name"]
parse_all = args["parse_all"]
header = args.get("header", "")
value = args.get("value", "")
list_separator = args.get("list_separator", ",") or ","
list_separator = list_separator.replace("\\t", "\t")
return_results(parse_list(parse_all, header, value, list_name, list_separator))
if __name__ in ("__main__", "__builtin__", "builtins"):
main()