From ed763cd668b395821c04e116fc4d7ef10fa4a6d1 Mon Sep 17 00:00:00 2001 From: andryyy <andre.peters@debinux.de> Date: Sat, 15 Dec 2018 21:23:42 +0100 Subject: [PATCH] [Rspamd] Use meta exporter to pipe meta data of ratelimited msg to Redis --- .../rspamd/local.d/metadata_exporter.conf | 32 ++++++++++++---- data/conf/rspamd/meta_exporter/pipe_rl.php | 38 +++++++++++++++++++ 2 files changed, 62 insertions(+), 8 deletions(-) create mode 100644 data/conf/rspamd/meta_exporter/pipe_rl.php diff --git a/data/conf/rspamd/local.d/metadata_exporter.conf b/data/conf/rspamd/local.d/metadata_exporter.conf index f1600708..afe5c7e1 100644 --- a/data/conf/rspamd/local.d/metadata_exporter.conf +++ b/data/conf/rspamd/local.d/metadata_exporter.conf @@ -1,10 +1,26 @@ rules { - QUARANTINE { - backend = "http"; - url = "http://nginx:9081/pipe.php"; - selector = "is_reject"; - formatter = "default"; - meta_headers = true; - } + QUARANTINE { + backend = "http"; + url = "http://nginx:9081/pipe.php"; + selector = "is_reject"; + formatter = "default"; + meta_headers = true; + } + RLINFO { + backend = "http"; + url = "http://nginx:9081/pipe_rl.php"; + selector = "ratelimited"; + formatter = "json"; + } +} +custom_select { + ratelimited = <<EOD +return function(task) + local ratelimited = task:get_symbol("RATELIMITED") + if ratelimited then + return true + end + return +end +EOD; } - diff --git a/data/conf/rspamd/meta_exporter/pipe_rl.php b/data/conf/rspamd/meta_exporter/pipe_rl.php new file mode 100644 index 00000000..036bf881 --- /dev/null +++ b/data/conf/rspamd/meta_exporter/pipe_rl.php @@ -0,0 +1,38 @@ +<?php +// File size is limited by Nginx site to 10M +// To speed things up, we do not include prerequisites +header('Content-Type: text/plain'); +require_once "vars.inc.php"; +// Do not show errors, we log to using error_log +ini_set('error_reporting', 0); +// Init Redis +$redis = new Redis(); +$redis->connect('redis-mailcow', 6379); + +$raw_data_content = file_get_contents('php://input'); +$raw_data_decoded = json_decode($raw_data_content, true); + +$data['time'] = time(); +$data['rcpt'] = implode(', ', $raw_data_decoded['rcpt']); +$data['from'] = $raw_data_decoded['from']; +$data['user'] = $raw_data_decoded['user']; +$symbol_rl_key = array_search('RATELIMITED', array_column($raw_data_decoded['symbols'], 'name')); +$data['rl_info'] = implode($raw_data_decoded['symbols'][$symbol_rl_key]['options']); +preg_match('/(.+)\((.+)\)/i', $data['rl_info'], $rl_matches); +if (!empty($rl_matches[1]) && !empty($rl_matches[2])) { + $data['rl_name'] = $rl_matches[1]; + $data['rl_hash'] = $rl_matches[2]; +} +else { + $data['rl_name'] = 'err'; + $data['rl_hash'] = 'err'; +} +$data['qid'] = $raw_data_decoded['qid']; +$data['ip'] = $raw_data_decoded['ip']; +$data['message_id'] = $raw_data_decoded['message_id']; +$data['header_subject'] = implode(' ', $raw_data_decoded['header_subject']); +$data['header_from'] = implode(', ', $raw_data_decoded['header_from']); + +$redis->lpush('RL_LOG', json_encode($data)); +exit; +