JSON Rule Engine
PBH uses a JSON rule engine to parse rules.
Here is a simple example of a JSON rule:
client-name-blacklist:
enabled: true
banned-client-name:
- '{"method":"CONTAINS","content":"xunlei"}'
Its function is to ban any Peer with the keyword Xunlei in the ClientName.
JSON Rule Engine - Matching Modes
All rules must specify a matching mode method. Here is a list of matching modes currently supported by PBH, all matching modes ignore case:
STARTS_WITH- Matches the beginning string, the given parameter must start with the specified string- Available extended parameters:
contentThe beginning string to check
- Available extended parameters:
ENDS_WITH- Matches the ending string, the given parameter must end with the specified string- Available extended parameters:
contentThe ending string to check
- Available extended parameters:
CONTAINS- Matches whether it contains a substring, the given parameter must contain the specified string- Available extended parameters:
contentThe substring to check
- Available extended parameters:
EQUALS- Exact match, the given parameter must be exactly the same as the content of the matching template- Available extended parameters:
contentExact match template
- Available extended parameters:
LENGTH- Matches the length of the string, the given parameter must be within the specified range- Available extended parameters:
minMinimum lengthmaxMaximum length
- Available extended parameters:
REGEX- Matches regular expressions, the given parameter must be hit by the provided regular expression- Available extended parameters
contentRegular expression
- Available extended parameters
Condition Control
Each rule execution will choose one of TRUE, FALSE and DEFAULT as the return value.
For if conditions, TRUE and DEFAULT both return true results, FALSE returns false results.
For ban rules, TRUE will ban Peer, FALSE will force Peer to pass (priority is higher than ban), and DEFAULT will keep default, do nothing.
For if conditions, if the user does not explicitly specify, always return TRUE, so that the condition is true, execute the rule. For ban rules, if the user does not explicitly specify, the hit behavior always returns TRUE, so that the condition is true, ban Peer; while the miss behavior always returns DEFAULT, keep default, do not do extra operations.
Custom Return Types
PBH's JSON rule engine provides two fields, hit and miss. By default, they are TRUE and DEFAULT, here is an example:
{"method":"CONTAINS","content":"xunlei 0019","hit": "FALSE"}
This rule specifies that when the rule is hit, return FALSE, so that Xunlei 0019 is forced to pass (the priority of pass is higher than ban).
if Control
PBH's JSON rule engine allows you to do if nesting. As mentioned before, each rule will return a logical value, which can also be parsed by the if field. When the if field of a rule is parsed as FALSE, this rule will not be executed.
Here is an example, through if nesting to achieve the ban of Xunlei, but not ban Xunlei 0019:
{
"method": "CONTAINS",
"if": {
"method": "CONTAINS",
"content": "xunlei 0019",
"hit": "FALSE"
},
"content": "xunlei"
}
In this example, although the top-level rule requires banning all clients containing the xunlei keyword, the user provides the if field, so PBH first checks whether the result of the if field is true. As you can see, when the secondary rule inside if is hit, it returns the FALSE logical value, so the execution result of the if field is false, and this ban command is not executed this time.
if Nesting
Although the if field inside the if rule can nest another rule, it is absolutely readability hell. Try to avoid doing this!
Whitelist Mode
This is an example, do not use the whitelist function in practice, because malicious Peer will disguise themselves
The new JSON rule engine allows users to write whitelist mode rules, the operation is simple:
First add a regular expression to ban all clients:
client-name-blacklist:
enabled: true
banned-client-name:
- '{"method": "REGEX", "content": "*", "hit": "TRUE"}'
Then we force each client you want to pass one by one, such as qBittorrent:
client-name-blacklist:
enabled: true
banned-client-name:
- '{"method": "REGEX", "content": "*", "hit": "TRUE"}'
- '{"method": "CONTAINS", "content": "qbittorrent", "hit": "FALSE"}'
This achieves the effect of a whitelist.