{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "type": "object",
    "properties": {
        "modules": {
            "type": "object",
            "properties": {
                "mempools": {
                    "type": "object",
                    "properties": {
                        "additional_oids": {"$ref": "#/$defs/additional_oids"},
                        "data": {
                            "type": "array",
                            "items": {
                                "properties": {
                                    "descr": {
                                        "type": "string"
                                    },
                                    "free": {
                                        "type": "string"
                                    },
                                    "index": {
                                        "type": [
                                            "integer",
                                            "string"
                                        ]
                                    },
                                    "oid": {"$ref": "oid_types.json#/$defs/oid"},
                                    "percent_used": {
                                        "type": "string"
                                    },
                                    "precision": {
                                        "type": [
                                            "integer",
                                            "string"
                                        ]
                                    },
                                    "skip_values": {
                                        "$ref": "#/$defs/skip_values"
                                    },
                                    "snmp_flags": {
                                        "type": "string"
                                    },
                                    "total": {
                                        "type": [
                                            "integer",
                                            "string"
                                        ]
                                    },
                                    "type": {
                                        "type": "string"
                                    },
                                    "class": {
                                        "type": "string"
                                    },
                                    "used": {
                                        "type": "string"
                                    },
                                    "warn_percent": {
                                        "type": [
                                            "integer",
                                            "string"
                                        ]
                                    },
                                    "snmp_no_Ih_flag": {
                                        "type": "string"
                                    }
                                },
                                "additionalProperties": false
                            }
                        }
                    },
                    "additionalProperties": false,
                    "required": [
                        "data"
                    ]
                },
                "os": {
                    "type": "object",
                    "properties": {
                        "version": {"$ref": "#/$defs/oids"},
                        "hardware": {"$ref": "#/$defs/oids"},
                        "features": {"$ref": "#/$defs/oids"},
                        "serial": {"$ref": "#/$defs/oids"},
                        "sysName": {"$ref": "#/$defs/oids"},
                        "lat": {"$ref": "oid_types.json#/$defs/oid"},
                        "location": {"$ref": "#/$defs/oids"},
                        "long": {"$ref": "oid_types.json#/$defs/oid"},
                        "sysDescr_regex": {
                            "type": ["string", "array"]
                        },
                        "version_regex": {
                            "type": "string"
                        },
                        "hardware_mib": {
                            "type": "string"
                        },
                        "hardware_regex": {
                            "type": "string"
                        },
                        "features_regex": {
                            "type": "string"
                        },
                        "serial_regex": {
                            "type": "string"
                        },
                        "location_regex": {
                            "type": "string"
                        },
                        "version_template": {
                            "type": "string"
                        },
                        "hardware_template": {
                            "type": "string"
                        },
                        "features_template": {
                            "type": "string"
                        },
                        "serial_template": {
                            "type": "string"
                        },
                        "location_template": {
                            "type": "string"
                        },
                        "version_replace": {"$ref": "#/$defs/os_replacements"},
                        "hardware_replace": {"$ref": "#/$defs/os_replacements"},
                        "features_replace": {"$ref": "#/$defs/os_replacements"},
                        "serial_replace": {"$ref": "#/$defs/os_replacements"}
                    },
                    "additionalProperties": false
                },
                "processors": {
                    "type": "object",
                    "properties": {
                        "data": {
                            "type": "array",
                            "items": {
                                "type": "object",
                                "properties": {
                                    "oid": {"$ref": "oid_types.json#/$defs/oid"},
                                    "num_oid": {"$ref": "#/$defs/num_oid"},
                                    "index": {
                                        "type": [
                                            "integer",
                                            "string"
                                        ]
                                    },
                                    "descr": {
                                        "type": "string"
                                    },
                                    "precision": {
                                        "type": "integer"
                                    },
                                    "value": {
                                        "type": "string"
                                    },
                                    "type": {
                                        "type": "string",
                                        "maxLength": 16
                                    },
                                    "skip_values": {
                                        "$ref": "#/$defs/skip_values"
                                    },
                                    "entPhysicalIndex": {
                                        "type": "string"
                                    },
                                    "warn_percent": {
                                        "type": "string"
                                    },
                                    "snmp_flags": {
                                        "type": [
                                            "string",
                                            "array"
                                        ]
                                    },
                                    "snmp_no_Ih_flag": {
                                        "type": "string"
                                    }
                                },
                                "additionalProperties": false,
                                "required": [
                                    "oid",
                                    "num_oid"
                                ]
                            }
                        }
                    },
                    "additionalProperties": false,
                    "required": [
                        "data"
                    ]
                },
                "sensors": {
                    "type": "object",
                    "properties": {
                        "state": {
                            "type": "object",
                            "properties": {
                                "data": {
                                    "type": "array",
                                    "items": {
                                        "type": "object",
                                        "properties": {
                                            "oid": {"$ref": "oid_types.json#/$defs/oid"},
                                            "value": {
                                                "type": "string"
                                            },
                                            "group": {
                                                "type": "string"
                                            },
                                            "low_limit": {
                                                "type": ["number", "string"]
                                            },
                                            "low_warn_limit": {
                                                "type": ["number", "string"]
                                            },
                                            "warn_limit": {
                                                "type": ["number", "string"]
                                            },
                                            "high_limit": {
                                                "type": ["number", "string"]
                                            },
                                            "skip_value_lt": {
                                                "type": "number"
                                            },
                                            "skip_value_gt": {
                                                "type": "number"
                                            },
                                            "num_oid": {"$ref": "#/$defs/num_oid"},
                                            "descr": {
                                                "type": "string"
                                            },
                                            "index": {
                                                "type": [
                                                    "integer",
                                                    "string"
                                                ]
                                            },
                                            "user_func": {
                                                "type": "string"
                                            },
                                            "states": {
                                                "type": "array",
                                                "items": {
                                                    "type": "object",
                                                    "properties": {
                                                        "value": {
                                                            "type": "integer"
                                                        },
                                                        "descr": {
                                                            "type": "string"
                                                        },
                                                        "generic": {
                                                            "type": "integer"
                                                        }
                                                    },
                                                    "additionalProperties": false,
                                                    "required": [
                                                        "descr",
                                                        "generic",
                                                        "value"
                                                    ]
                                                }
                                            },
                                            "state_name": {
                                                "type": "string"
                                            },
                                            "skip_values": {
                                                "$ref": "#/$defs/skip_values"
                                            },
                                            "snmp_flags": {
                                                "type": [
                                                    "string",
                                                    "array"
                                                ]
                                            },
                                            "snmp_bulk": {
                                                "type": "boolean"
                                            },
                                            "entPhysicalIndex": {
                                                "type": ["integer", "string"]
                                            },
                                            "entPhysicalIndex_measured": {
                                                "type": [ "string", "null" ],
                                                "enum": [ "ports", null ]
                                            },
                                            "snmp_no_Ih_flag": {
                                                "type": "string"
                                            }
                                        },
                                        "additionalProperties": false,
                                        "required": [
                                            "descr",
                                            "num_oid",
                                            "oid",
                                            "states"
                                        ]
                                    }
                                },
                                "options": {"$ref": "#/$defs/options"}
                            },
                            "required": [
                                "data"
                            ]
                        },
                        "additional_oids": {"$ref":  "#/$defs/sensor_additional_oids"},
                        "airflow": {"$ref": "#/$defs/sensor"},
                        "ber": {"$ref": "#/$defs/sensor"},
                        "bitrate": {"$ref": "#/$defs/sensor"},
                        "charge": {"$ref": "#/$defs/sensor"},
                        "chromatic_dispersion": {"$ref": "#/$defs/sensor"},
                        "cooling": {"$ref": "#/$defs/sensor"},
                        "count": {"$ref":  "#/$defs/sensor"},
                        "current": {"$ref": "#/$defs/sensor"},
                        "dbm": {"$ref": "#/$defs/sensor"},
                        "delay": {"$ref": "#/$defs/sensor"},
                        "eer": {"$ref": "#/$defs/sensor"},
                        "fanspeed": {"$ref": "#/$defs/sensor"},
                        "frequency": {"$ref": "#/$defs/sensor"},
                        "humidity": {"$ref": "#/$defs/sensor"},
                        "load": {"$ref": "#/$defs/sensor"},
                        "loss": {"$ref": "#/$defs/sensor"},
                        "percent": {"$ref": "#/$defs/sensor"},
                        "power": {"$ref": "#/$defs/sensor"},
                        "power_factor": {"$ref": "#/$defs/sensor"},
                        "power_consumed": {"$ref": "#/$defs/sensor"},
                        "pressure": {"$ref": "#/$defs/sensor"},
                        "quality_factor": {"$ref": "#/$defs/sensor"},
                        "runtime": {"$ref": "#/$defs/sensor"},
                        "signal": {"$ref": "#/$defs/sensor"},
                        "signal_loss": {"$ref": "#/$defs/sensor"},
                        "snr": {"$ref": "#/$defs/sensor"},
                        "temperature": {"$ref": "#/$defs/sensor"},
                        "tv_signal": {"$ref": "#/$defs/sensor"},
                        "voltage": {"$ref": "#/$defs/sensor"},
                        "waterflow": {"$ref": "#/$defs/sensor"}
                    },
                    "additionalProperties": false
                },
                "storage": {
                    "type": "object",
                    "properties": {
                        "data": {
                            "type": "array",
                            "items": {
                                "properties": {
                                    "descr": {
                                        "type": "string"
                                    },
                                    "free": {
                                        "type": "string"
                                    },
                                    "free_num_oid": {"$ref": "#/$defs/num_oid"},
                                    "index": {
                                        "type": [
                                            "integer",
                                            "string"
                                        ]
                                    },
                                    "oid": {"$ref": "oid_types.json#/$defs/oid"},
                                    "percent_used": {
                                        "type": "string"
                                    },
                                    "percent_used_num_oid": {"$ref": "#/$defs/num_oid"},
                                    "units": {
                                        "type": [
                                            "integer",
                                            "string"
                                        ]
                                    },
                                    "size": {
                                        "type": [
                                            "integer",
                                            "string"
                                        ]
                                    },
                                    "size_num_oid": {"$ref": "#/$defs/num_oid"},
                                    "skip_values": {
                                        "$ref": "#/$defs/skip_values"
                                    },
                                    "type": {
                                        "type": "string"
                                    },
                                    "poller_type": {
                                        "type": "string"
                                    },
                                    "used": {
                                        "type": "string"
                                    },
                                    "used_num_oid": {"$ref": "#/$defs/num_oid"},
                                    "warn_percent": {
                                        "type": [
                                            "integer",
                                            "string"
                                        ]
                                    }
                                },
                                "additionalProperties": false
                            }
                        }
                    }
                }
            }
        }
    },
    "additionalProperties": false,
    "required": [
        "modules"
    ],
    "$defs": {
        "num_oid": {
            "type": "string",
            "pattern": "^(\\.\\d+)+(\\.\\{\\{ \\$(index|subindex\\d) }}|\\{\\{ \\$noindex }})$"
        },
        "oids": {
            "type": ["string", "array"],
            "items": {
                "type": "string",
                "pattern": "^((?!sysDescr\\.0|^\\.?1\\.3\\.6\\.1\\.2\\.1\\.1\\.1\\.0).)*$"
            }
        },
        "additional_oids": {
            "type": "object",
            "properties": {
                "oids": {"$ref": "#/$defs/oids"},
                "snmp_flags": {
                    "type": [
                        "string",
                        "array"
                    ]
                },
                "snmp_no_Ih_flag": {
                    "type": "string"
                }
            },
            "additionalProperties": false,
            "required": [
                "oids"
            ]
        },
        "sensor_additional_oids": {
            "type": "object",
            "properties": {
                "data": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "oid": {"$ref": "#/$defs/oids"},
                            "snmp_flags": {
                                "type": [
                                    "string",
                                    "array"
                                ]
                            },
                            "snmp_no_Ih_flag": {
                                "type": "string"
                            }
                        },
                        "additionalProperties": false,
                        "required": ["oid"]
                    }
                }
            },
            "additionalProperties": false,
            "required": [
                "data"
            ]
        },
        "sensor": {
            "type": "object",
            "properties": {
                "data": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "oid": {"$ref": "oid_types.json#/$defs/oid"},
                            "num_oid": {"$ref": "#/$defs/num_oid"},
                            "index": {
                                "type": ["integer", "string"]
                            },
                            "descr": {
                                "type": "string"
                            },
                            "divisor": {
                                "type": ["number", "string"]
                            },
                            "multiplier": {
                                "type": ["number", "string"]
                            },
                            "value": {
                                "type": "string"
                            },
                            "group": {
                                "type": "string"
                            },
                            "low_limit": {
                                "type": ["number", "string"]
                            },
                            "low_warn_limit": {
                                "type": ["number", "string"]
                            },
                            "warn_limit": {
                                "type": ["number", "string"]
                            },
                            "high_limit": {
                                "type": ["number", "string"]
                            },
                            "skip_value_lt": {
                                "type": "number"
                            },
                            "skip_value_gt": {
                                "type": "number"
                            },
                            "skip_values": {
                                "$ref": "#/$defs/skip_values"
                            },
                            "snmp_flags": {
                                "type": [
                                    "string",
                                    "array"
                                ]
                            },
                            "snmp_bulk": {
                                "type": "boolean"
                            },
                            "rrd_type": {
                                "type": "string"
                            },
                            "entPhysicalIndex": {
                                "type": ["integer", "string"]
                            },
                            "entPhysicalIndex_measured": {
                                "type": [ "string", "null" ],
                                "enum": [ "ports", null ]
                            },
                            "user_func": {
                                "type": "string"
                            },
                            "snmp_no_Ih_flag": {
                                "type": "string"
                            },
                            "skip_limits_calc": {
                                "type": "boolean"
                            }
                        },
                        "additionalProperties": false,
                        "required": [
                            "descr",
                            "num_oid",
                            "oid"
                        ]
                    }
                },
                "options": {
                    "$ref": "#/$defs/options"
                }
            },
            "additionalProperties": false,
            "required": [
                "data"
            ]
        },
        "os_replacements": {
            "type": "array",
            "items": {
                "oneOf": [
                    {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "minItems": 2,
                        "maxItems": 2
                    },
                    {
                        "type": "string"
                    }
                ]
            }
        },
        "skip_values": {
            "anyOf": [
                {
                    "type": "number"
                },
                {
                    "type": "array",
                    "items": {
                        "anyOf": [
                            {
                                "type": "number"
                            },
                            {
                                "type": "object",
                                "properties": {
                                    "oid": {
                                        "type": "string"
                                    },
                                    "device": {
                                        "enum": [
                                            "sysName",
                                            "sysObjectID",
                                            "sysDescr",
                                            "version",
                                            "hardware",
                                            "features"
                                        ]
                                    },
                                    "op": {
                                        "$ref": "#/$defs/comparison"
                                    },
                                    "value": {
                                        "type": ["boolean", "number", "string", "array"],
                                        "items": {
                                            "type": ["number", "string"]
                                        }
                                    }
                                },
                                "additionalProperties": false,
                                "required": [
                                    "op",
                                    "value"
                                ],
                                "minProperties": 3,
                                "maxProperties": 3
                            }
                        ]
                    }
                }
            ]
        },
        "options": {
            "type": "object",
            "properties": {
                "divisor": {
                    "type": "integer"
                },
                "skip_values": {
                    "$ref": "#/$defs/skip_values"
                },
                "skip_value_gt": {
                    "type": "integer"
                },
                "skip_value_lt": {
                    "type": "integer"
                }
            },
            "additionalProperties": false
        },
        "comparison": {
            "type": "string",
            "enum": [
                "=",
                "!=",
                "==",
                "!==",
                "<=",
                ">=",
                "<",
                ">",
                "starts",
                "ends",
                "contains",
                "regex",
                "not_starts",
                "not_ends",
                "not_contains",
                "not_regex",
                "in_array",
                "not_in_array",
                "exists"
            ]
        }
    }
}
