From f0c1cb7c6cc7a8d39a2f81781e4e6ca116649eea Mon Sep 17 00:00:00 2001 From: Vimesa <93142944+ViMesTor@users.noreply.github.com> Date: Wed, 12 Nov 2025 09:16:30 +0000 Subject: [PATCH 01/13] Release 6.19.0 (#317) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Feature/#22929 adapt yara scripts (#311) * control rvm gemset and collapse into validation function * add better explanation * Update pyyara.py to python 3 * move pyyara script to this repo --------- Co-authored-by: ljblancoredborder Co-authored-by: Rafa Gómez * bump version * reduce version to patch, this is not blocking manager to run * Revert "reduce version to patch, this is not blocking manager to run" This reverts commit efc0a55753bf78f106caf4ccbdd8fa6bf990bf83. * Add 'drill' to the list of cookbooks for upload (#316) Add cookbook-drill * Release 6.19.0 --------- Co-authored-by: Pablo Pérez Co-authored-by: ljblancoredborder Co-authored-by: Rafa Gómez Co-authored-by: Juan Soto <127120525+jsotofernandez@users.noreply.github.com> --- VERSION | 2 +- resources/bin/rb_upload_cookbooks.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 1b386a5..74c926a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -6.18.0 +6.19.0 diff --git a/resources/bin/rb_upload_cookbooks.sh b/resources/bin/rb_upload_cookbooks.sh index 6911cc2..5249568 100755 --- a/resources/bin/rb_upload_cookbooks.sh +++ b/resources/bin/rb_upload_cookbooks.sh @@ -48,7 +48,7 @@ function upload_cookbook() { listCookbooks="rb-common rb-selinux cron rb-firewall zookeeper kafka druid http2k memcached chef-server consul - nginx geoip webui snmp rbmonitor rbscanner redis airflow + nginx geoip webui snmp rbmonitor rbscanner redis drill airflow f2k logstash pmacct minio postgresql aerospike yara rbdswatcher rbevents-counter rsyslog freeradius rbnmsp n2klocd rbale rbcep k2http rblogstatter rb-arubacentral rbcgroup rb-exporter rb-chrony rb-clamav rb-postfix keepalived snort barnyard2 rbaioutliers snort3 mem2incident secor rb-druid-indexer From 1bad18a751d669352b22a3be01c620795d838ee6 Mon Sep 17 00:00:00 2001 From: ljblancoredborder Date: Mon, 17 Nov 2025 11:29:23 +0000 Subject: [PATCH 02/13] add helper executable script to restart rb_monitor (or any other superv) through shell --- .../scripts/rb_restart_druid_supervisor.rb | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100755 resources/scripts/rb_restart_druid_supervisor.rb diff --git a/resources/scripts/rb_restart_druid_supervisor.rb b/resources/scripts/rb_restart_druid_supervisor.rb new file mode 100755 index 0000000..06aab45 --- /dev/null +++ b/resources/scripts/rb_restart_druid_supervisor.rb @@ -0,0 +1,63 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +####################################################################### +## Copyright (c) 2025 ENEO Tecnología S.L. +## This file is part of redBorder. +## redBorder is free software: you can redistribute it and/or modify +## it under the terms of the GNU Affero General Public License License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## redBorder is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU Affero General Public License License for more details. +## You should have received a copy of the GNU Affero General Public License License +## along with redBorder. If not, see . +######################################################################## + +require 'net/http' +require 'uri' +require 'json' + +def usage + printf "rb_restart_druid_supervisor.rb [-h] -s \n" + printf " -h : print this help\n" + printf ' -s : rb_monitor | rb_monitor_ | rb_vault (etc)' + printf ' To get full list of active supervisors, execute rb_get_druid_supervisors' +end + +def post_to_supervisor(supervisor_name, action) + url = 'http://localhost:8090/druid/indexer/v1/supervisor' + uri = URI("#{url}/#{supervisor_name}/#{action}") + + request = Net::HTTP::Post.new(uri) + request['Content-Type'] = 'application/json' + request.body = {}.to_json # Druid expects valid JSON body for POST + + response = Net::HTTP.start(uri.hostname, uri.port) do |http| + http.request(request) + end + puts response.body +end + +opt = Getopt::Std.getopts('s:h') + +if opt['h'] + usage + exit 0 +elsif opt['s'].nil? + usage + exit 1 +else + supervisor_name = opt['s'] + post_to_supervisor(supervisor_name, 'suspend') + post_to_supervisor(supervisor_name, 'reset') + post_to_supervisor(supervisor_name, 'resume') + + # `curl -X POST -H 'Content-Type: application/json' "http://localhost:8090/druid/indexer/v1/supervisor/#{supervisor_name}/suspend"` + + # `curl -X POST -H 'Content-Type: application/json' "http://localhost:8090/druid/indexer/v1/supervisor/#{supervisor_name}/reset` + + # `curl -X POST -H 'Content-Type: application/json' "http://localhost:8090/druid/indexer/v1/supervisor/#{supervisor_name}/resume"` +end From 8469ab7874c95cd8354a1a33f2d2e57c5110e1ce Mon Sep 17 00:00:00 2001 From: ljblancoredborder Date: Mon, 17 Nov 2025 15:18:53 +0000 Subject: [PATCH 03/13] fix opt adquire, find supervisor by feed not by id --- .../scripts/rb_restart_druid_supervisor.rb | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/resources/scripts/rb_restart_druid_supervisor.rb b/resources/scripts/rb_restart_druid_supervisor.rb index 06aab45..749547d 100755 --- a/resources/scripts/rb_restart_druid_supervisor.rb +++ b/resources/scripts/rb_restart_druid_supervisor.rb @@ -19,12 +19,13 @@ require 'net/http' require 'uri' require 'json' +require 'optparse' def usage - printf "rb_restart_druid_supervisor.rb [-h] -s \n" - printf " -h : print this help\n" - printf ' -s : rb_monitor | rb_monitor_ | rb_vault (etc)' - printf ' To get full list of active supervisors, execute rb_get_druid_supervisors' + p 'rb_restart_druid_supervisor.rb [-h] -s ' + p ' -h : print this help' + p ' -s : rb_monitor | rb_monitor_ | rb_vault (etc)' + p ' To get full list of active supervisors, execute rb_get_druid_supervisors' end def post_to_supervisor(supervisor_name, action) @@ -33,7 +34,7 @@ def post_to_supervisor(supervisor_name, action) request = Net::HTTP::Post.new(uri) request['Content-Type'] = 'application/json' - request.body = {}.to_json # Druid expects valid JSON body for POST + request.body = { feed: supervisor_name }.to_json response = Net::HTTP.start(uri.hostname, uri.port) do |http| http.request(request) @@ -41,23 +42,20 @@ def post_to_supervisor(supervisor_name, action) puts response.body end -opt = Getopt::Std.getopts('s:h') +options = {} +OptionParser.new do |opts| + opts.on('-s VALUE', 'Specify supervisor name') { |v| options[:s] = v } + opts.on('-h', 'Display help') { options[:h] = true } +end.parse! -if opt['h'] +if options[:h] usage - exit 0 -elsif opt['s'].nil? +elsif options[:s].nil? usage exit 1 else - supervisor_name = opt['s'] + supervisor_name = options[:s] post_to_supervisor(supervisor_name, 'suspend') post_to_supervisor(supervisor_name, 'reset') post_to_supervisor(supervisor_name, 'resume') - - # `curl -X POST -H 'Content-Type: application/json' "http://localhost:8090/druid/indexer/v1/supervisor/#{supervisor_name}/suspend"` - - # `curl -X POST -H 'Content-Type: application/json' "http://localhost:8090/druid/indexer/v1/supervisor/#{supervisor_name}/reset` - - # `curl -X POST -H 'Content-Type: application/json' "http://localhost:8090/druid/indexer/v1/supervisor/#{supervisor_name}/resume"` end From 3c00c34db650c3e9dcaf5a710ebdb853cf6d196e Mon Sep 17 00:00:00 2001 From: ljblancoredborder Date: Tue, 18 Nov 2025 11:01:57 +0000 Subject: [PATCH 04/13] improve response --- resources/scripts/rb_restart_druid_supervisor.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/scripts/rb_restart_druid_supervisor.rb b/resources/scripts/rb_restart_druid_supervisor.rb index 749547d..51ac40e 100755 --- a/resources/scripts/rb_restart_druid_supervisor.rb +++ b/resources/scripts/rb_restart_druid_supervisor.rb @@ -29,6 +29,7 @@ def usage end def post_to_supervisor(supervisor_name, action) + puts "On #{action} to supervisor #{supervisor_name}..." url = 'http://localhost:8090/druid/indexer/v1/supervisor' uri = URI("#{url}/#{supervisor_name}/#{action}") @@ -39,7 +40,8 @@ def post_to_supervisor(supervisor_name, action) response = Net::HTTP.start(uri.hostname, uri.port) do |http| http.request(request) end - puts response.body + # puts response.body + puts "Action: #{action} to supervisor #{supervisor_name} done." end options = {} From 008e7f81bdb032aace5ec21fe355adc7f4fe09be Mon Sep 17 00:00:00 2001 From: ljblancoredborder Date: Tue, 18 Nov 2025 15:01:50 +0000 Subject: [PATCH 05/13] fix port of druid console to run supervisor related tasks --- resources/scripts/rb_restart_druid_supervisor.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/scripts/rb_restart_druid_supervisor.rb b/resources/scripts/rb_restart_druid_supervisor.rb index 51ac40e..9bb66fb 100755 --- a/resources/scripts/rb_restart_druid_supervisor.rb +++ b/resources/scripts/rb_restart_druid_supervisor.rb @@ -30,7 +30,9 @@ def usage def post_to_supervisor(supervisor_name, action) puts "On #{action} to supervisor #{supervisor_name}..." - url = 'http://localhost:8090/druid/indexer/v1/supervisor' + + druid_port = 8081 + url = "http://localhost:#{druid_port}/druid/indexer/v1/supervisor" uri = URI("#{url}/#{supervisor_name}/#{action}") request = Net::HTTP::Post.new(uri) From 5a6698316065db5fd193108b537371b015e53286 Mon Sep 17 00:00:00 2001 From: ljblancoredborder Date: Fri, 21 Nov 2025 14:26:01 +0000 Subject: [PATCH 06/13] add rescue to make control errors in a function run by chef --- .../scripts/rb_restart_druid_supervisor.rb | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/resources/scripts/rb_restart_druid_supervisor.rb b/resources/scripts/rb_restart_druid_supervisor.rb index 9bb66fb..a191fdf 100755 --- a/resources/scripts/rb_restart_druid_supervisor.rb +++ b/resources/scripts/rb_restart_druid_supervisor.rb @@ -33,17 +33,22 @@ def post_to_supervisor(supervisor_name, action) druid_port = 8081 url = "http://localhost:#{druid_port}/druid/indexer/v1/supervisor" - uri = URI("#{url}/#{supervisor_name}/#{action}") + begin + uri = URI("#{url}/#{supervisor_name}/#{action}") - request = Net::HTTP::Post.new(uri) - request['Content-Type'] = 'application/json' - request.body = { feed: supervisor_name }.to_json + request = Net::HTTP::Post.new(uri) + request['Content-Type'] = 'application/json' + request.body = { feed: supervisor_name }.to_json - response = Net::HTTP.start(uri.hostname, uri.port) do |http| - http.request(request) + _response = Net::HTTP.start(uri.hostname, uri.port) do |http| + http.request(request) + end + + # puts response.body + puts "Action: #{action} to supervisor #{supervisor_name} done." + rescue e + puts "ERROR: #{action} to supervisor #{supervisor_name} failed." end - # puts response.body - puts "Action: #{action} to supervisor #{supervisor_name} done." end options = {} From 1e5d2367446c538b5c6b11460cf924ac49e9dd4d Mon Sep 17 00:00:00 2001 From: ljblancoredborder Date: Fri, 21 Nov 2025 15:59:10 +0000 Subject: [PATCH 07/13] make cluster sensitive using zookeeper and druid router instead of just query to localhost --- .../scripts/rb_restart_druid_supervisor.rb | 98 +++++++++++++------ 1 file changed, 70 insertions(+), 28 deletions(-) diff --git a/resources/scripts/rb_restart_druid_supervisor.rb b/resources/scripts/rb_restart_druid_supervisor.rb index a191fdf..fb9e581 100755 --- a/resources/scripts/rb_restart_druid_supervisor.rb +++ b/resources/scripts/rb_restart_druid_supervisor.rb @@ -16,55 +16,97 @@ ## along with redBorder. If not, see . ######################################################################## +require 'zk' require 'net/http' require 'uri' require 'json' require 'optparse' def usage - p 'rb_restart_druid_supervisor.rb [-h] -s ' - p ' -h : print this help' - p ' -s : rb_monitor | rb_monitor_ | rb_vault (etc)' - p ' To get full list of active supervisors, execute rb_get_druid_supervisors' + puts 'rb_restart_druid_supervisor.rb [-h] -s ' + puts ' -h : show help' + puts ' -s : rb_monitor | rb_monitor_ | rb_vault | ...' + puts 'To list active supervisors, run: rb_get_druid_supervisors' end +# ---------------------------------------------------------- +# Resolve a Druid Router host/port from ZooKeeper +# ---------------------------------------------------------- +def resolve_druid_router + begin + zk_hosts = 'zookeeper.service:2181' + zk = ZK.new(zk_hosts) + + druid_router_path = '/druid/discoveryPath/druid:router' + raise "Router path '#{druid_router_path}' does not exist in Zookeeper" unless zk.exists?(druid_router_path) + + routers = zk.children(druid_router_path) + raise 'ERROR: No routers found. Please enable druid router at least in one node.' if routers.empty? + + # Pick one router randomly + router_id = routers.sample + data, _stat = zk.get("#{druid_router_path}/#{router_id}") + + router_info = JSON.parse(data) || {} + raise 'ERROR on restart supervisor' unless router_info['address'] && router_info['port'] + + router_info + rescue => e + puts "ERROR on restart supervisor: #{e.message}" + exit 0 + ensure + zk&.close + end +end + +# ---------------------------------------------------------- +# POST action to supervisor via Druid Router +# ---------------------------------------------------------- def post_to_supervisor(supervisor_name, action) - puts "On #{action} to supervisor #{supervisor_name}..." + r = resolve_druid_router + address = r['address'] # druid api address + port = r['port'] # druid api port - druid_port = 8081 - url = "http://localhost:#{druid_port}/druid/indexer/v1/supervisor" - begin - uri = URI("#{url}/#{supervisor_name}/#{action}") + puts "Performing '#{action}' on supervisor '#{supervisor_name}' via #{address}:#{port}" - request = Net::HTTP::Post.new(uri) - request['Content-Type'] = 'application/json' - request.body = { feed: supervisor_name }.to_json + uri = URI("http://#{address}:#{port}/druid/indexer/v1/supervisor/#{supervisor_name}/#{action}") - _response = Net::HTTP.start(uri.hostname, uri.port) do |http| - http.request(request) - end + request = Net::HTTP::Post.new(uri) + request['Content-Type'] = 'application/json' + request.body = { feed: supervisor_name }.to_json - # puts response.body - puts "Action: #{action} to supervisor #{supervisor_name} done." - rescue e - puts "ERROR: #{action} to supervisor #{supervisor_name} failed." + response = Net::HTTP.start(uri.hostname, uri.port) { |http| http.request(request) } + + unless response.is_a?(Net::HTTPSuccess) + raise "HTTP #{response.code} #{response.message} - #{response.body}" end + + puts "✔ Action '#{action}' completed successfully." +rescue => e + puts "✖ ERROR performing '#{action}' on supervisor '#{supervisor_name}': #{e.message}" end +# ---------------------------------------------------------- +# MAIN +# ---------------------------------------------------------- options = {} OptionParser.new do |opts| - opts.on('-s VALUE', 'Specify supervisor name') { |v| options[:s] = v } - opts.on('-h', 'Display help') { options[:h] = true } + opts.on('-s VALUE', 'Supervisor name') { |v| options[:s] = v } + opts.on('-h', 'Help') { options[:h] = true } end.parse! if options[:h] usage -elsif options[:s].nil? + exit 0 +end + +if options[:s].nil? usage - exit 1 -else - supervisor_name = options[:s] - post_to_supervisor(supervisor_name, 'suspend') - post_to_supervisor(supervisor_name, 'reset') - post_to_supervisor(supervisor_name, 'resume') + exit 0 end + +supervisor_name = options[:s] + +post_to_supervisor(supervisor_name, 'suspend') +post_to_supervisor(supervisor_name, 'reset') +post_to_supervisor(supervisor_name, 'resume') From bd4734a980d2764b6e4a94545c327ced4189854c Mon Sep 17 00:00:00 2001 From: ljblancoredborder Date: Fri, 21 Nov 2025 16:16:20 +0000 Subject: [PATCH 08/13] remove emojies --- resources/scripts/rb_restart_druid_supervisor.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/scripts/rb_restart_druid_supervisor.rb b/resources/scripts/rb_restart_druid_supervisor.rb index fb9e581..e52a4a9 100755 --- a/resources/scripts/rb_restart_druid_supervisor.rb +++ b/resources/scripts/rb_restart_druid_supervisor.rb @@ -81,9 +81,9 @@ def post_to_supervisor(supervisor_name, action) raise "HTTP #{response.code} #{response.message} - #{response.body}" end - puts "✔ Action '#{action}' completed successfully." + puts "Action '#{action}' completed successfully." rescue => e - puts "✖ ERROR performing '#{action}' on supervisor '#{supervisor_name}': #{e.message}" + puts "ERROR performing '#{action}' on supervisor '#{supervisor_name}': #{e.message}" end # ---------------------------------------------------------- From f491b622b67b6a87475502485faecc3db27ada50 Mon Sep 17 00:00:00 2001 From: ljblancoredborder Date: Fri, 21 Nov 2025 16:42:54 +0000 Subject: [PATCH 09/13] call resolve_druid only once. Refactor --- .../scripts/rb_restart_druid_supervisor.rb | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/resources/scripts/rb_restart_druid_supervisor.rb b/resources/scripts/rb_restart_druid_supervisor.rb index e52a4a9..adb4e80 100755 --- a/resources/scripts/rb_restart_druid_supervisor.rb +++ b/resources/scripts/rb_restart_druid_supervisor.rb @@ -62,10 +62,11 @@ def resolve_druid_router # ---------------------------------------------------------- # POST action to supervisor via Druid Router # ---------------------------------------------------------- -def post_to_supervisor(supervisor_name, action) - r = resolve_druid_router - address = r['address'] # druid api address - port = r['port'] # druid api port +def post_to_supervisor(params) + address = params[:address] + port = params[:port] + supervisor_name = params[:supervisor_name] + action = params[:action] puts "Performing '#{action}' on supervisor '#{supervisor_name}' via #{address}:#{port}" @@ -77,9 +78,7 @@ def post_to_supervisor(supervisor_name, action) response = Net::HTTP.start(uri.hostname, uri.port) { |http| http.request(request) } - unless response.is_a?(Net::HTTPSuccess) - raise "HTTP #{response.code} #{response.message} - #{response.body}" - end + raise "HTTP #{response.code} #{response.message} - #{response.body}" unless response.is_a?(Net::HTTPSuccess) puts "Action '#{action}' completed successfully." rescue => e @@ -95,18 +94,17 @@ def post_to_supervisor(supervisor_name, action) opts.on('-h', 'Help') { options[:h] = true } end.parse! -if options[:h] - usage - exit 0 -end - -if options[:s].nil? +if options[:h] || options[:s].nil? usage exit 0 end -supervisor_name = options[:s] +router = resolve_druid_router -post_to_supervisor(supervisor_name, 'suspend') -post_to_supervisor(supervisor_name, 'reset') -post_to_supervisor(supervisor_name, 'resume') +params = { supervisor_name: options[:s], address: router['address'], port: router['port'] } +params['action'] = 'suspend' +post_to_supervisor(params) +params['action'] = 'reset' +post_to_supervisor(params) +params['action'] = 'resume' +post_to_supervisor(params) From f8c6c9e174f44a9ea587ce57be74209a423b1fe8 Mon Sep 17 00:00:00 2001 From: ljblancoredborder Date: Fri, 28 Nov 2025 17:19:03 +0000 Subject: [PATCH 10/13] fix param action --- resources/scripts/rb_restart_druid_supervisor.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/scripts/rb_restart_druid_supervisor.rb b/resources/scripts/rb_restart_druid_supervisor.rb index adb4e80..1da8d9d 100755 --- a/resources/scripts/rb_restart_druid_supervisor.rb +++ b/resources/scripts/rb_restart_druid_supervisor.rb @@ -102,9 +102,9 @@ def post_to_supervisor(params) router = resolve_druid_router params = { supervisor_name: options[:s], address: router['address'], port: router['port'] } -params['action'] = 'suspend' +params[:action] = 'suspend' post_to_supervisor(params) -params['action'] = 'reset' +params[:action] = 'reset' post_to_supervisor(params) -params['action'] = 'resume' +params[:action] = 'resume' post_to_supervisor(params) From 5d4ef8555cd6a763512a342f9523eaf5f4c8dd21 Mon Sep 17 00:00:00 2001 From: ljblancoredborder Date: Wed, 3 Dec 2025 10:15:45 +0000 Subject: [PATCH 11/13] added delete action --- .../scripts/rb_druid_supervisor_action.rb | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100755 resources/scripts/rb_druid_supervisor_action.rb diff --git a/resources/scripts/rb_druid_supervisor_action.rb b/resources/scripts/rb_druid_supervisor_action.rb new file mode 100755 index 0000000..465afb7 --- /dev/null +++ b/resources/scripts/rb_druid_supervisor_action.rb @@ -0,0 +1,113 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +####################################################################### +## Copyright (c) 2025 ENEO Tecnología S.L. +## This file is part of redBorder. +## redBorder is free software: you can redistribute it and/or modify +## it under the terms of the GNU Affero General Public License License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## redBorder is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU Affero General Public License License for more details. +## You should have received a copy of the GNU Affero General Public License License +## along with redBorder. If not, see . +######################################################################## + +require 'zk' +require 'net/http' +require 'uri' +require 'json' +require 'optparse' + +def usage + puts 'rb_restart_druid_supervisor.rb [-h] -s ' + puts ' -h : show help' + puts ' -s : rb_monitor | rb_monitor_ | rb_vault | ...' + puts 'To list active supervisors, run: rb_get_druid_supervisors' +end + +# ---------------------------------------------------------- +# Resolve a Druid Router host/port from ZooKeeper +# ---------------------------------------------------------- +def resolve_druid_router + begin + zk_hosts = 'zookeeper.service:2181' + zk = ZK.new(zk_hosts) + + druid_router_path = '/druid/discoveryPath/druid:router' + raise "Router path '#{druid_router_path}' does not exist in Zookeeper" unless zk.exists?(druid_router_path) + + routers = zk.children(druid_router_path) + raise 'ERROR: No routers found. Please enable druid router at least in one node.' if routers.empty? + + # Pick one router randomly + router_id = routers.sample + data, _stat = zk.get("#{druid_router_path}/#{router_id}") + + router_info = JSON.parse(data) || {} + raise 'ERROR on restart supervisor' unless router_info['address'] && router_info['port'] + + router_info + rescue => e + puts "ERROR on restart supervisor: #{e.message}" + exit 0 + ensure + zk&.close + end +end + +# ---------------------------------------------------------- +# POST action to supervisor via Druid Router +# ---------------------------------------------------------- +def post_to_supervisor(params) + address = params[:address] + port = params[:port] + supervisor_name = params[:supervisor_name] + action = params[:action] + + puts "Performing '#{action}' on supervisor '#{supervisor_name}' via #{address}:#{port}" + + if action == 'delete' + # DELETE /supervisor/{name} + uri = URI("http://#{address}:#{port}/druid/indexer/v1/supervisor/#{supervisor_name}") + + request = Net::HTTP::Delete.new(uri) + else + uri = URI("http://#{address}:#{port}/druid/indexer/v1/supervisor/#{supervisor_name}/#{action}") + + request = Net::HTTP::Post.new(uri) + request['Content-Type'] = 'application/json' + request.body = { feed: supervisor_name }.to_json + end + + response = Net::HTTP.start(uri.hostname, uri.port) { |http| http.request(request) } + + raise "HTTP #{response.code} #{response.message} - #{response.body}" unless response.is_a?(Net::HTTPSuccess) + + puts "Action '#{action}' completed successfully." +rescue => e + puts "ERROR performing '#{action}' on supervisor '#{supervisor_name}': #{e.message}" +end + +# ---------------------------------------------------------- +# MAIN +# ---------------------------------------------------------- +options = {} +OptionParser.new do |opts| + opts.on('-s VALUE', 'Supervisor name') { |v| options[:s] = v } + opts.on('-a VALUE', 'Supervisor action') { |v| options[:a] = v } + opts.on('-h', 'Help') { options[:h] = true } +end.parse! + +if options[:h] || options[:s].nil? || options[:a].nil? + usage + exit 0 +end + +router = resolve_druid_router + +params = { supervisor_name: options[:s], address: router['address'], port: router['port'], action: options[:a]} +post_to_supervisor(params) From 66a92c2b9a68cbe40caa5eb81df91e87a5032671 Mon Sep 17 00:00:00 2001 From: ljblancoredborder Date: Wed, 3 Dec 2025 10:20:44 +0000 Subject: [PATCH 12/13] update usage and comments --- resources/scripts/rb_druid_supervisor_action.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/scripts/rb_druid_supervisor_action.rb b/resources/scripts/rb_druid_supervisor_action.rb index 465afb7..48dcfe4 100755 --- a/resources/scripts/rb_druid_supervisor_action.rb +++ b/resources/scripts/rb_druid_supervisor_action.rb @@ -26,6 +26,7 @@ def usage puts 'rb_restart_druid_supervisor.rb [-h] -s ' puts ' -h : show help' puts ' -s : rb_monitor | rb_monitor_ | rb_vault | ...' + puts ' -a : delete | suspend | restart | resume' puts 'To list active supervisors, run: rb_get_druid_supervisors' end @@ -43,7 +44,6 @@ def resolve_druid_router routers = zk.children(druid_router_path) raise 'ERROR: No routers found. Please enable druid router at least in one node.' if routers.empty? - # Pick one router randomly router_id = routers.sample data, _stat = zk.get("#{druid_router_path}/#{router_id}") @@ -60,7 +60,7 @@ def resolve_druid_router end # ---------------------------------------------------------- -# POST action to supervisor via Druid Router +# Send action to supervisor via Druid Router # ---------------------------------------------------------- def post_to_supervisor(params) address = params[:address] From e318881616359013269e0cdfe4d8bced8929c2b1 Mon Sep 17 00:00:00 2001 From: ljblancoredborder Date: Wed, 3 Dec 2025 10:32:17 +0000 Subject: [PATCH 13/13] delete is not valid, use shutdown instead --- .../scripts/rb_druid_supervisor_action.rb | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/resources/scripts/rb_druid_supervisor_action.rb b/resources/scripts/rb_druid_supervisor_action.rb index 48dcfe4..440cdec 100755 --- a/resources/scripts/rb_druid_supervisor_action.rb +++ b/resources/scripts/rb_druid_supervisor_action.rb @@ -26,7 +26,7 @@ def usage puts 'rb_restart_druid_supervisor.rb [-h] -s ' puts ' -h : show help' puts ' -s : rb_monitor | rb_monitor_ | rb_vault | ...' - puts ' -a : delete | suspend | restart | resume' + puts ' -a : shutdown | suspend | restart | resume' puts 'To list active supervisors, run: rb_get_druid_supervisors' end @@ -70,18 +70,18 @@ def post_to_supervisor(params) puts "Performing '#{action}' on supervisor '#{supervisor_name}' via #{address}:#{port}" - if action == 'delete' - # DELETE /supervisor/{name} - uri = URI("http://#{address}:#{port}/druid/indexer/v1/supervisor/#{supervisor_name}") + # if action == 'delete' + # # DELETE /supervisor/{name} + # uri = URI("http://#{address}:#{port}/druid/indexer/v1/supervisor/#{supervisor_name}") - request = Net::HTTP::Delete.new(uri) - else - uri = URI("http://#{address}:#{port}/druid/indexer/v1/supervisor/#{supervisor_name}/#{action}") + # request = Net::HTTP::Delete.new(uri) + # else + uri = URI("http://#{address}:#{port}/druid/indexer/v1/supervisor/#{supervisor_name}/#{action}") - request = Net::HTTP::Post.new(uri) - request['Content-Type'] = 'application/json' - request.body = { feed: supervisor_name }.to_json - end + request = Net::HTTP::Post.new(uri) + request['Content-Type'] = 'application/json' + request.body = { feed: supervisor_name }.to_json + # end response = Net::HTTP.start(uri.hostname, uri.port) { |http| http.request(request) }