Class: Aikido::Zen::WorkerProcess::Agent::Server
- Inherits:
-
Object
- Object
- Aikido::Zen::WorkerProcess::Agent::Server
- Defined in:
- lib/aikido/zen/worker_process/agent/server.rb
Defined Under Namespace
Classes: RequestKind
Instance Method Summary collapse
- #calculate_rate_limits(route_data, ip, actor_data) ⇒ Object
- #close ⇒ Object
- #host ⇒ Object
-
#initialize(config: Aikido::Zen.config, detector: Aikido::Zen.attack_wave_detector) ⇒ Server
constructor
A new instance of Server.
- #port ⇒ Object
- #record_attack_wave(client_ip, verb, path) ⇒ Array<Hash>?
- #send_collector_events(events_data) ⇒ Object
- #start ⇒ Object
- #started? ⇒ Boolean
- #stop ⇒ Object
- #updated_settings(known_config_generation = nil, known_firewall_lists_generation = nil) ⇒ Object
Constructor Details
#initialize(config: Aikido::Zen.config, detector: Aikido::Zen.attack_wave_detector) ⇒ Server
Returns a new instance of Server.
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# File 'lib/aikido/zen/worker_process/agent/server.rb', line 6 def initialize(config: Aikido::Zen.config, detector: Aikido::Zen.attack_wave_detector) @config = config @detector = detector @rpc_server = Aikido::Zen::RPC::Server.new(Aikido::Zen.secret) @rpc_server.handle("ping") do |respond| respond.call(nil) end @rpc_server.handle("updated_settings") do |respond, known_config_generation = nil, known_firewall_lists_generation = nil| respond.call(updated_settings(known_config_generation, known_firewall_lists_generation)) end @rpc_server.handle("send_collector_events") do |respond, events_data| respond.call(nil) send_collector_events(events_data) end @rpc_server.handle("calculate_rate_limits") do |respond, route_data, ip, actor_data| result = calculate_rate_limits(route_data, ip, actor_data) respond.call(result&.as_json) end @rpc_server.handle("record_attack_wave") do |respond, client_ip, verb, path| respond.call(record_attack_wave(client_ip, verb, path)) end end |
Instance Method Details
#calculate_rate_limits(route_data, ip, actor_data) ⇒ Object
94 95 96 97 98 |
# File 'lib/aikido/zen/worker_process/agent/server.rb', line 94 def calculate_rate_limits(route_data, ip, actor_data) actor = Aikido::Zen::Actor.from_json(actor_data) if actor_data route = Aikido::Zen::Route.from_json(route_data) Aikido::Zen.rate_limiter.calculate_rate_limits(RequestKind.new(route, nil, ip, actor)) end |
#close ⇒ Object
47 48 49 |
# File 'lib/aikido/zen/worker_process/agent/server.rb', line 47 def close @rpc_server.close end |
#host ⇒ Object
35 36 37 |
# File 'lib/aikido/zen/worker_process/agent/server.rb', line 35 def host @rpc_server.host end |
#port ⇒ Object
39 40 41 |
# File 'lib/aikido/zen/worker_process/agent/server.rb', line 39 def port @rpc_server.port end |
#record_attack_wave(client_ip, verb, path) ⇒ Array<Hash>?
101 102 103 104 105 |
# File 'lib/aikido/zen/worker_process/agent/server.rb', line 101 def record_attack_wave(client_ip, verb, path) sample = Aikido::Zen::AttackWave::Sample.new(verb: verb, path: path) samples = @detector.record(client_ip, sample) samples&.map(&:as_json) end |
#send_collector_events(events_data) ⇒ Object
87 88 89 90 91 92 |
# File 'lib/aikido/zen/worker_process/agent/server.rb', line 87 def send_collector_events(events_data) events_data.each do |event_data| event = Aikido::Zen::Collector::Event.from_json(event_data) Aikido::Zen.collector.add_event(event) end end |
#start ⇒ Object
51 52 53 54 55 56 57 |
# File 'lib/aikido/zen/worker_process/agent/server.rb', line 51 def start @config.logger.info("Starting RPC Server...") @rpc_server.start @started_at = Time.now.utc end |
#started? ⇒ Boolean
43 44 45 |
# File 'lib/aikido/zen/worker_process/agent/server.rb', line 43 def started? !!@started_at end |
#stop ⇒ Object
59 60 61 62 63 64 65 |
# File 'lib/aikido/zen/worker_process/agent/server.rb', line 59 def stop @config.logger.info("Stopping RPC Server...") @rpc_server.stop @started_at = nil end |
#updated_settings(known_config_generation = nil, known_firewall_lists_generation = nil) ⇒ Object
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/aikido/zen/worker_process/agent/server.rb', line 71 def updated_settings(known_config_generation = nil, known_firewall_lists_generation = nil) result = {} config_change = Aikido::Zen.api_cache.config_if_changed(known_config_generation) if config_change result["config"], result["config_generation"] = config_change end firewall_lists_change = Aikido::Zen.api_cache.firewall_lists_if_changed(known_firewall_lists_generation) if firewall_lists_change result["firewall_lists"], result["firewall_lists_generation"] = firewall_lists_change end result end |