- Remove UA regex extraction (extract_ua_regex, _extract_ua_from_all/any) - Remove Country rule collection from parse_bot_policies_inline - Simplify fetch_rules.py: collect_all_rules returns (ip_rules, asn_rules) - Remove insert_ua_rules and insert_country_rules functions - reload_dicts now only reloads dict_anubis_ip + dict_anubis_asn - Simplify CASE blocks in 04_mv_http_logs.sql, 07_ai_features_view.sql, view_ai_features_anubis.sql, mv_http_logs.sql: IP > ASN (was 5-level UA+IP > UA > IP > ASN > Country cascade) - Remove dict_anubis_country + dict_anubis_ua from 03_anubis_tables.sql (UA table kept as stub for REGEXP_TREE catch-all compatibility) - Remove anubis_country_rules table from schema - Remove Anubis UA and Country tabs from dashboard reflists page - Remove anubis_ua_rules/country_rules from API reflist queries - deploy_schema.sql simplified from 339 to 122 lines - 764 lines removed across 9 files Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
93 lines
3.4 KiB
SQL
93 lines
3.4 KiB
SQL
-- =============================================================================
|
|
-- 03_anubis_tables.sql — Anubis crawler rule tables and dictionaries
|
|
-- Only IP/CIDR and ASN rules are populated by fetch_rules.py.
|
|
-- UA and Country dictionaries are kept as stubs (required by MV references)
|
|
-- but are never populated with real data.
|
|
-- =============================================================================
|
|
|
|
-- -----------------------------------------------------------------------------
|
|
-- 1. TABLE SOURCE — User-Agent rules (REGEXP_TREE stub)
|
|
-- REGEXP_TREE requires ≥1 rule; the catch-all is seeded at init time.
|
|
-- This table is NOT populated by fetch_rules.py.
|
|
-- -----------------------------------------------------------------------------
|
|
CREATE TABLE IF NOT EXISTS ja4_processing.anubis_ua_rules
|
|
(
|
|
id UInt64,
|
|
parent_id UInt64,
|
|
regexp String,
|
|
keys Array(String),
|
|
values Array(String)
|
|
)
|
|
ENGINE = ReplacingMergeTree()
|
|
ORDER BY id;
|
|
|
|
|
|
-- -----------------------------------------------------------------------------
|
|
-- 2. TABLE SOURCE — IP/CIDR rules (for IP_TRIE dictionary)
|
|
-- Populated by fetch_rules.py from Anubis GitHub data.
|
|
-- -----------------------------------------------------------------------------
|
|
CREATE TABLE IF NOT EXISTS ja4_processing.anubis_ip_rules
|
|
(
|
|
prefix String,
|
|
bot_name LowCardinality(String),
|
|
action LowCardinality(String),
|
|
rule_id UInt64,
|
|
has_ua UInt8,
|
|
category LowCardinality(String)
|
|
)
|
|
ENGINE = ReplacingMergeTree()
|
|
ORDER BY prefix;
|
|
|
|
|
|
-- -----------------------------------------------------------------------------
|
|
-- 3. TABLE SOURCE — ASN rules (for Flat dictionary)
|
|
-- Populated by fetch_rules.py from botPolicies.yaml.
|
|
-- -----------------------------------------------------------------------------
|
|
CREATE TABLE IF NOT EXISTS ja4_processing.anubis_asn_rules
|
|
(
|
|
asn UInt32,
|
|
bot_name LowCardinality(String),
|
|
action LowCardinality(String),
|
|
category LowCardinality(String)
|
|
)
|
|
ENGINE = ReplacingMergeTree()
|
|
ORDER BY asn;
|
|
|
|
|
|
-- -----------------------------------------------------------------------------
|
|
-- 4. DICTIONARY — IP IP_TRIE (active)
|
|
-- dictGetOrDefault('ja4_processing.dict_anubis_ip', 'bot_name', toIPv6(src_ip), '')
|
|
-- -----------------------------------------------------------------------------
|
|
DROP DICTIONARY IF EXISTS ja4_processing.dict_anubis_ip;
|
|
CREATE DICTIONARY ja4_processing.dict_anubis_ip
|
|
(
|
|
prefix String,
|
|
bot_name String,
|
|
action String,
|
|
rule_id UInt64,
|
|
has_ua UInt8,
|
|
category String
|
|
)
|
|
PRIMARY KEY prefix
|
|
SOURCE(CLICKHOUSE(HOST 'localhost' PORT 9000 USER 'admin' PASSWORD 'CHANGE_ME' DB 'ja4_processing' TABLE 'anubis_ip_rules'))
|
|
LAYOUT(IP_TRIE())
|
|
LIFETIME(MIN 300 MAX 600);
|
|
|
|
|
|
-- -----------------------------------------------------------------------------
|
|
-- 5. DICTIONARY — ASN Flat (active)
|
|
-- dictGetOrDefault('ja4_processing.dict_anubis_asn', 'bot_name', src_asn, '')
|
|
-- -----------------------------------------------------------------------------
|
|
DROP DICTIONARY IF EXISTS ja4_processing.dict_anubis_asn;
|
|
CREATE DICTIONARY ja4_processing.dict_anubis_asn
|
|
(
|
|
asn UInt32,
|
|
bot_name String,
|
|
action String,
|
|
category String
|
|
)
|
|
PRIMARY KEY asn
|
|
SOURCE(CLICKHOUSE(HOST 'localhost' PORT 9000 USER 'admin' PASSWORD 'CHANGE_ME' DB 'ja4_processing' TABLE 'anubis_asn_rules'))
|
|
LAYOUT(FLAT())
|
|
LIFETIME(MIN 300 MAX 600);
|