4.4.7.2. From CSV files¶
Parser for AQL queries and GUI expressions from CSV files.
- class axonius_api_client.api.wizards.wizard_csv.WizardCsv(apiobj, log_level='debug')[source]¶
Bases:
Wizard
Parser for AQL queries and GUI expressions from CSV files.
Notes
This wizard can create as many saved queries as you like. The first row of the CSV must always have a type value of “saved_query”. All rows under that row will be added to that saved query until another row with a type value of “saved_query” is found. Repeat this pattern as you see fit.
The description, tags, and fields columns are only used for types of “saved_query”
Examples
Create a
client
usingaxonius_api_client.connect.Connect
and assumeapiobj
is eitherclient.devices
orclient.users
>>> apiobj = client.devices # or client.users
Define a CSV string to parse
>>> content = ''' ... type,value,description,tags,fields ... saved_query,name of sq,description of sq,"tag1,tag2, tag4","os.type,default, aws:aws_device_type" ... simple,hostname contains test,,, ... simple,os.type equals windows,,, ... saved_query,name of second sq,description of sq,"tag1,tag2, tag4", ... simple,hostname contains test,,, ... complex,installed_software // name contains chrome // version earlier_than 82,,, ... simple,os.type equals windows,,, ... '''
Parse the CSV string into a query and GUI expressions
>>> parsed = apiobj.wizard_csv.parse(content=content) >>> for sq in parsed: ... sq['name'] ... sq['query'][:80] ... len(sq['expressions']) ... 'name of sq' '(specific_data.data.hostname == regex("test", "i")) and (specific_data.data.os.t' 2 'name of second sq' '(specific_data.data.hostname == regex("test", "i")) and (specific_data.data.inst' 3
Or parse a CSV file directly
>>> parsed = apiobj.wizard_csv.parse(path="~/test.csv")
Use the result to create saved queries that the GUI understands
>>> sqs = [apiobj.saved_query.add(**sq) for sq in parsed] >>> for sq in sqs: ... sq['name'] ... sq['uuid'] ... sq['view']['query']['filter'][:80] ... 'name of sq' '5f79e90be4557d5cbab26344' '(specific_data.data.hostname == regex("test", "i")) and (specific_data.data.os.t' 'name of second sq' '5f79e90be4557d5cbab26359' '(specific_data.data.hostname == regex("test", "i")) and (specific_data.data.inst'
- Parameters:
log_level (
typing.Union
[str
,int
]) –
-
DOCS:
str
= '\ntype,value,description,tags,fields,asset_scope,private,always_cached,gui_page_size\n"# If type column is empty or begins with # it is ignored",,,,\n"# type of simple or complex will belong to the saved_query they are under",,,,\n"# Column descriptions for type of saved_query","Name of Saved Query","Description of Saved Query","Tags to apply to Saved Query","Columns to display in Saved Query",Optional: True or False (default False if empty),Optional: True or False (default False if empty),Optional: True or False (default False if empty),"20 or 50 or 100 (default 20 if empty)",\n"# Column descriptions for type of simple","Format -- [] represents optional items: [& | ! ( )] FIELD OPERATOR VALUE [)]","Description: Filter entry for simple fields","Only uses columns type and value",\n"# Column descriptions for type of complex","Format -- [] represents optional items: [& | ! ( )] COMPLEX-FIELD // SUB-FIELD OPERATOR VALUE[ // ...] [)]","Description: Filter entry for complex fields and their sub-fields","Only uses columns type and value",\n"# Value Flags for type of simple or complex","& Use and instead of or (default), | Use or instead of and (overrides &), ! Use not, ( Open a parentheses, ) Close a parentheses (can also be at end of entry)",,,\n"saved_query","example 1","Filters, default fields, custom fields","example,tag1,tag2","os.distribution,os.os_str,active_directory:ad_password_last_set,default,os.build"\n"simple","( hostname contains test",,,\n"simple","! hostname contains internal )",,,\n"simple","( os.type equals windows",,,\n"simple","| os.type equals os x )",,,\n"saved_query","example 2","No filters, no default fields, custom fields","example,tag3,tag4","os.distribution,os.os_str,active_directory:ad_password_last_set"\n"saved_query","example 3","No filters, default fields, no custom fields","example,tag5,tag6",\n'¶
- parse(content, source='csv text string')[source]¶
Parse a CSV string into a set of saved queries.
- Parameters:
- Return type:
- parse_path(path, source='csv file {path}')[source]¶
Parse a CSV file into a set of saved queries.
- Parameters:
path (
typing.Union
[str
,pathlib.Path
]) – CSV filesource (
str
) – where csv file came from
- Return type:
- _load_csv(content, source)[source]¶
Load a CSV string and parse the rows into entries.
- Parameters:
- Return type:
- _process_csv(rows, columns, source)[source]¶
Process and validate the rows and columns from a CSV into entries.
- Parameters:
rows (
typing.List
[dict
]) – rows from the CSVcolumns (
typing.List
[str
]) – columns from the CSVsource (
str
) – where content came from
- Return type:
- _rows_to_entries(rows, source)[source]¶
Process and validate the rows from a CSV into entries.
- Parameters:
rows (
typing.List
[dict
]) – rows from the CSVsource (
str
) – where content came from
- Return type:
- _process_sqs(entries)[source]¶
Process the saved queries defined in the CSV.
- Parameters:
entries (
typing.List
[dict
]) – the entries produced by parsing the rows- Return type:
- _process_sq(entry, is_last)[source]¶
Process a saved query.
- Parameters:
entry (
dict
) – entry being processed by_process_sqs()
is_last (
bool
) – entry is the last entry being processed by_process_sqs()
- Return type:
- _new_sq(entry)[source]¶
Create a new current saved query.
- Parameters:
entry (
dict
) – entry being processed by_process_sqs()
- _process_desc(entry)[source]¶
Process the description key of an entry.
- Parameters:
entry (
dict
) – entry being processed by_process_sqs()
- Return type:
- _process_tags(entry)[source]¶
Process the tags key of an entry.
- Parameters:
entry (
dict
) – entry being processed by_process_sqs()
- Return type:
- _process_fields(entry)[source]¶
Process the fields key of an entry.
- Parameters:
entry (
dict
) – entry being processed by_process_sqs()
- Return type:
- __init__(apiobj, log_level='debug')¶
Query wizard builder.
- Parameters:
apiobj (
axonius_api_client.api.assets.asset_mixin.AssetMixin
) – Asset objectlog_level (
typing.Union
[str
,int
]) – logging level for this object
- _check_entry_keys(entry, keys)¶
Check that an entry has the required keys.
- Parameters:
entry (
dict
) – entry to check keys againstkeys (
typing.List
[str
]) – list of keys that entry must have
- Raises:
axonius_api_client.exceptions.WizardError – if key is not in entry, value is empty, or value is not a string
- Return type:
- _check_entry_type(etype, types)¶
Check that a supplied entry type is valid.
- Parameters:
etype (
str
) – entry type to checktypes (
typing.List
[str
]) – valid entry types to check etype against
- Raises:
axonius_api_client.exceptions.WizardError – if etype is not on of types
- Return type:
- _check_patterns(value_raw, value, src, patterns)¶
Check that a value matches a list of regex patterns.
- Parameters:
value_raw (
str
) – raw unparsed value where value came fromvalue (
str
) – value to check patterns againstsrc (
str
) – identifier of what value representspatterns (
typing.List
[str
]) – list of regex patterns to check value against
- Raises:
axonius_api_client.exceptions.WizardError – if value is empty or does not match one of the patterns
- _get_field(value, value_raw)¶
Find a field schema for the supplied field name.
- Parameters:
- Raises:
axonius_api_client.exceptions.WizardError – if field can not be found or is “all” field
- Return type:
- _get_field_complex(value, value_raw)¶
Find a field schema for the supplied complex field name.
- Parameters:
- Raises:
axonius_api_client.exceptions.WizardError – if field can not be found, is not a complex field, or is “all” field
- Return type:
- _get_operator(operator, field, value_raw)¶
Validate the supplied operator for an expression for the type of field.
- Parameters:
- Return type:
- _parse_complex(entry, idx)¶
Parse an entry of type complex into GUI expressions.
- Parameters:
- Raises:
axonius_api_client.exceptions.WizardError – if sub expr fails to parse
- Return type:
- _parse_entries(entries, source)¶
Parse a list of entries into a query and the associated GUI query wizard expressions.
- Parameters:
entries (
typing.List
[dict
]) – list of entries to parsesource (
str
) – where entries came from
- Raises:
axonius_api_client.exceptions.WizardError – if an entry fails to be parsed
- Return type:
- _parse_exprs(entries)¶
Parse a list of entries into GUI expressions.
- Parameters:
entries (
typing.List
[dict
]) – list of entries to parse- Raises:
axonius_api_client.exceptions.WizardError – if an entry fails to be parsed
- Return type:
- _parse_flags(entry, idx, entries, tracker, is_open)¶
Parse flags from an entry.
- _parse_simple(entry, idx)¶
Parse an entry of type simple into GUI expressions.
- _parse_sub(field, value_raw, idx)¶
Parse sub expression of an entry of type complex.
- Parameters:
- Raises:
axonius_api_client.exceptions.WizardError – if sub-field supplied is not a valid sub-field of the complex field
- Return type:
- _split_complex(value_raw)¶
Split a complex query wizard expression into field and sub-field expressions.
- Parameters:
value_raw (
str
) – the raw unparsed value to parse- Return type:
- _split_flags(value_raw, flags=None)¶
Parse an expression and get the flags from the beginning and end.
- Parameters:
value_raw (
str
) – the value to get the flags fromflags (
typing.Optional
[typing.List
[str
]]) – flags from the entry
- Raises:
axonius_api_client.exceptions.WizardError – if value is empty after removing flags
- Return type:
- _split_simple(value_raw)¶
Split a simple query wizard expression into field, operator, and value.
- Parameters:
value_raw (
str
) – the raw unparsed value to parse- Return type:
typing.Tuple
[str
,str
,str
]
- LOG: logging.Logger¶
Logger for this object.
- APIOBJ¶
Asset object.
- PARSER¶
Value parser.