config/parser: add support for log on_notice_condition
This commit is contained in:
@@ -27,9 +27,11 @@ Use ``load()`` to obtain an instance of ``Configuration`` for use with
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import contextlib
|
import contextlib
|
||||||
|
import ipaddress
|
||||||
import json
|
import json
|
||||||
import math
|
import math
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
import string
|
import string
|
||||||
import sys
|
import sys
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
@@ -167,6 +169,66 @@ def json_str(value: Any) -> dict:
|
|||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def json_str_condition(value: Any) -> dict:
|
||||||
|
if not value:
|
||||||
|
return {}
|
||||||
|
ret = json.loads(value)
|
||||||
|
for (token, props) in ret.items():
|
||||||
|
checked_props = check_and_sanitize_props(props)
|
||||||
|
# check token
|
||||||
|
if token not in log.LOG_CONDITION_TOKEN:
|
||||||
|
raise ValueError("unsupported log condition token: %r" % token)
|
||||||
|
# check condition entry
|
||||||
|
for cond_name in checked_props:
|
||||||
|
if cond_name not in log.LOG_CONDITION_CONDITION:
|
||||||
|
raise ValueError("unsupported log condition: %r" % cond_name)
|
||||||
|
if cond_name == "match":
|
||||||
|
if log.LOG_CONDITION_TOKEN[token] == "str":
|
||||||
|
if checked_props[cond_name] not in log.LOG_CONDITION_MATCH_STR:
|
||||||
|
raise ValueError("unsupported log match: %r" % checked_props[cond_name])
|
||||||
|
elif log.LOG_CONDITION_TOKEN[token] == "int":
|
||||||
|
if checked_props[cond_name] not in log.LOG_CONDITION_MATCH_INT:
|
||||||
|
raise ValueError("unsupported log match: %r" % checked_props[cond_name])
|
||||||
|
elif log.LOG_CONDITION_TOKEN[token] == "ipaddress":
|
||||||
|
if checked_props[cond_name] not in log.LOG_CONDITION_MATCH_IPADDRESS + log.LOG_CONDITION_MATCH_IPNETWORK:
|
||||||
|
raise ValueError("unsupported log match: %r" % checked_props[cond_name])
|
||||||
|
else:
|
||||||
|
raise RuntimeError("unsupported log match (fix code): %r" % cond_name)
|
||||||
|
if cond_name == "value":
|
||||||
|
if log.LOG_CONDITION_TOKEN[token] == "str":
|
||||||
|
if checked_props["match"] == "re":
|
||||||
|
try:
|
||||||
|
if re.match(checked_props[cond_name], "Test"):
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
except Exception as e:
|
||||||
|
raise ValueError("unsupported log match value(re) for condition %r: %r (%s)" % (checked_props["match"], checked_props[cond_name], e))
|
||||||
|
pass
|
||||||
|
elif log.LOG_CONDITION_TOKEN[token] == "int":
|
||||||
|
if str(int(checked_props[cond_name])) != checked_props[cond_name]:
|
||||||
|
raise ValueError("unsupported log match value(int): %r" % checked_props[cond_name])
|
||||||
|
if token == "status":
|
||||||
|
# only 100-599 are valid
|
||||||
|
if int(checked_props[cond_name]) < 100 or int(checked_props[cond_name]) > 599:
|
||||||
|
raise ValueError("unsupported log match value(int) not in range 100-599: %r" % checked_props[cond_name])
|
||||||
|
elif log.LOG_CONDITION_TOKEN[token] == "ipaddress":
|
||||||
|
try:
|
||||||
|
if checked_props["match"] in log.LOG_CONDITION_MATCH_IPADDRESS:
|
||||||
|
ip = ipaddress.ip_address(checked_props[cond_name]) # noqa: F841
|
||||||
|
elif checked_props["match"] in log.LOG_CONDITION_MATCH_IPNETWORK:
|
||||||
|
ip_net = ipaddress.ip_network(checked_props[cond_name], strict=True) # noqa: F841
|
||||||
|
except Exception as e:
|
||||||
|
raise ValueError("unsupported log match value(ipaddress) for condition %r: %r (%s)" % (checked_props["match"], checked_props[cond_name], e))
|
||||||
|
# check condition entries are complete
|
||||||
|
for cond_name in log.LOG_CONDITION_CONDITION:
|
||||||
|
if cond_name not in checked_props:
|
||||||
|
raise ValueError("incomplete condition, misses: %r" % cond_name)
|
||||||
|
# all checks passed
|
||||||
|
ret[token] = checked_props
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
INTERNAL_OPTIONS: Sequence[str] = ("_allow_extra",)
|
INTERNAL_OPTIONS: Sequence[str] = ("_allow_extra",)
|
||||||
# Default configuration
|
# Default configuration
|
||||||
DEFAULT_CONFIG_SCHEMA: types.CONFIG_SCHEMA = OrderedDict([
|
DEFAULT_CONFIG_SCHEMA: types.CONFIG_SCHEMA = OrderedDict([
|
||||||
@@ -667,6 +729,22 @@ This is an automated message. Please do not reply.""",
|
|||||||
"value": "False",
|
"value": "False",
|
||||||
"help": "log response content on level=debug",
|
"help": "log response content on level=debug",
|
||||||
"type": bool}),
|
"type": bool}),
|
||||||
|
("request_header_on_notice_condition", {
|
||||||
|
"value": "{}",
|
||||||
|
"help": "log request header on level=notice with condition",
|
||||||
|
"type": json_str_condition}),
|
||||||
|
("request_content_on_notice_condition", {
|
||||||
|
"value": "{}",
|
||||||
|
"help": "log request content on level=notice with condition",
|
||||||
|
"type": json_str_condition}),
|
||||||
|
("response_header_on_notice_condition", {
|
||||||
|
"value": "{}",
|
||||||
|
"help": "log response header on level=notice with condition",
|
||||||
|
"type": json_str_condition}),
|
||||||
|
("response_content_on_notice_condition", {
|
||||||
|
"value": "{}",
|
||||||
|
"help": "log response content on level=notice with condition",
|
||||||
|
"type": json_str_condition}),
|
||||||
("rights_rule_doesnt_match_on_debug", {
|
("rights_rule_doesnt_match_on_debug", {
|
||||||
"value": "False",
|
"value": "False",
|
||||||
"help": "log rights rules which doesn't match on level=debug",
|
"help": "log rights rules which doesn't match on level=debug",
|
||||||
|
|||||||
Reference in New Issue
Block a user