A filter (also known as a rule) is a shorthand expression that allows you to select IP addresses from the ipinterface table.
The rule builds the WHERE clause of a SQL query.
The database-schema.xml file in the
/opt/opennms/etc directory informs the filter parser which tables can be used in an expression.
Explanation of database-schema.xml file
Each table the filter code uses appears in a
If a table has an attribute of
visible=false, then none of the columns in that table can be used in the WHERE clause and thus cannot appear in the rule.
You will get a syntax exception if it sees any non-visible columns in the rule.
The same applies to a non-visible column in a table.
<join> tag tells the filter module how to relate this table to the ipinterface table.
You can use C/Java-style comparison operators with data types they apply to.
(You can use
!= on strings, as well as the SQL
For LIKE comparisons, the character "_" matches any single character and "%" matches any series of characters (or none at all). For example, "F_o%"" matches "Foo", "Foom", and "Flowers" but not "Foip".
To handle NULL values (which include cases where you’ve joined across to a table where there is no matching row), use the
IS NULL and
IS NOT NULL operators.
Comparing a null value to anything with any other operator always returns false, so
categoryName != 'SomeCategory' will not return anything with a null categoryName.
Instead, you would need to use
categoryName != 'SomeCategory' | categoryName IS NULL to exclude all nodes that are tagged with
You can use parentheses to group expressions and can apply boolean operators anywhere in an expression.
|In a departure from C/Java convention, boolean operators are single characters rather than double, so they look more like the bitwise arithmetic operators in C:|
Each comparison is joined together with the
| operators meaning logical AND, logical OR operations.
Anything delimited by an
| character gets translated into a sub-select that selects IP addresses based on the comparison for that clause.
|Depending on the format you use in your rules, you might need to escape your AND operator. See Rule_formats.|
Here is an example:
(nodesysname == 'something') & (snmpifdescr == 'something else')
SELECT DISTINCT ipInterface.ipAddr FROM ipinterface JOIN node ON (ipInterface.nodeID = node.nodeID) JOIN snmpInterface ON (ipInterface.snmpinterfaceid = snmpInterface.id) WHERE (node.nodesysname = 'something') AND (snmpInterface.snmpifdescr = 'something else') LIMIT 1
The IPLIKE function is shorthand to call a PostgreSQL function that was written in C to compare ipaddresses using *, lists, and ranges. isService is shorthand to build a complicated join to match on a service name. notisService is also available.