Class: Aikido::Zen::WorkerProcess::Agent::Server

Inherits:
Object
  • Object
show all
Defined in:
lib/aikido/zen/worker_process/agent/server.rb

Defined Under Namespace

Classes: RequestKind

Instance Method Summary collapse

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

#closeObject



47
48
49
# File 'lib/aikido/zen/worker_process/agent/server.rb', line 47

def close
  @rpc_server.close
end

#hostObject



35
36
37
# File 'lib/aikido/zen/worker_process/agent/server.rb', line 35

def host
  @rpc_server.host
end

#portObject



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>?

Returns:

  • (Array<Hash>, nil)


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

#startObject



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

Returns:

  • (Boolean)


43
44
45
# File 'lib/aikido/zen/worker_process/agent/server.rb', line 43

def started?
  !!@started_at
end

#stopObject



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