tcell_agent 2.0.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +2 -2
  3. data/bin/tcell_agent +41 -150
  4. data/lib/tcell_agent/agent.rb +87 -52
  5. data/lib/tcell_agent/config_initializer.rb +63 -0
  6. data/lib/tcell_agent/configuration.rb +72 -267
  7. data/lib/tcell_agent/hooks/login_fraud.rb +1 -1
  8. data/lib/tcell_agent/instrument_servers.rb +14 -18
  9. data/lib/tcell_agent/instrumentation/cmdi.rb +47 -15
  10. data/lib/tcell_agent/instrumentation/lfi.rb +72 -15
  11. data/lib/tcell_agent/instrumentation/monkey_patches/ruby_2/file.rb +21 -0
  12. data/lib/tcell_agent/instrumentation/monkey_patches/ruby_2/io.rb +75 -0
  13. data/lib/tcell_agent/instrumentation/monkey_patches/ruby_2/kernel.rb +80 -0
  14. data/lib/tcell_agent/instrumentation/monkey_patches/ruby_3/file.rb +21 -0
  15. data/lib/tcell_agent/instrumentation/monkey_patches/ruby_3/io.rb +75 -0
  16. data/lib/tcell_agent/instrumentation/monkey_patches/ruby_3/kernel.rb +80 -0
  17. data/lib/tcell_agent/instrumentation.rb +14 -6
  18. data/lib/tcell_agent/logger.rb +3 -4
  19. data/lib/tcell_agent/policies/command_injection_policy.rb +1 -1
  20. data/lib/tcell_agent/policies/dataloss_policy.rb +15 -8
  21. data/lib/tcell_agent/policies/headers_policy.rb +2 -2
  22. data/lib/tcell_agent/policies/patches_policy.rb +8 -4
  23. data/lib/tcell_agent/policies/policies_manager.rb +1 -0
  24. data/lib/tcell_agent/policies/policy_polling.rb +4 -3
  25. data/lib/tcell_agent/rails/auth/authlogic.rb +49 -44
  26. data/lib/tcell_agent/rails/auth/authlogic_helper.rb +20 -0
  27. data/lib/tcell_agent/rails/auth/devise.rb +103 -102
  28. data/lib/tcell_agent/rails/auth/devise_helper.rb +29 -0
  29. data/lib/tcell_agent/rails/auth/doorkeeper.rb +54 -57
  30. data/lib/tcell_agent/{userinfo.rb → rails/auth/userinfo.rb} +0 -0
  31. data/lib/tcell_agent/rails/better_ip.rb +7 -19
  32. data/lib/tcell_agent/rails/csrf_exception.rb +0 -8
  33. data/lib/tcell_agent/rails/dlp/process_request.rb +5 -0
  34. data/lib/tcell_agent/rails/dlp.rb +58 -56
  35. data/lib/tcell_agent/rails/dlp_handler.rb +9 -10
  36. data/lib/tcell_agent/rails/js_agent_insert.rb +2 -3
  37. data/lib/tcell_agent/rails/middleware/context_middleware.rb +2 -1
  38. data/lib/tcell_agent/rails/middleware/global_middleware.rb +3 -4
  39. data/lib/tcell_agent/rails/middleware/headers_middleware.rb +1 -0
  40. data/lib/tcell_agent/rails/{on_start.rb → railties/tcell_agent_railties.rb} +9 -16
  41. data/lib/tcell_agent/rails/railties/tcell_agent_unicorn_railties.rb +8 -0
  42. data/lib/tcell_agent/rails/routes/grape.rb +5 -12
  43. data/lib/tcell_agent/rails/routes.rb +6 -9
  44. data/lib/tcell_agent/rails/settings_reporter.rb +3 -6
  45. data/lib/tcell_agent/rails/tcell_body_proxy.rb +4 -7
  46. data/lib/tcell_agent/routes/table.rb +3 -0
  47. data/lib/tcell_agent/rust/agent_config.rb +62 -33
  48. data/lib/tcell_agent/rust/{libtcellagent-4.14.0.so → libtcellagent-alpine.so} +0 -0
  49. data/lib/tcell_agent/rust/{libtcellagent-4.14.0.dylib → libtcellagent-x64.dll} +0 -0
  50. data/lib/tcell_agent/rust/{libtcellagent-alpine-4.14.0.so → libtcellagent.dylib} +0 -0
  51. data/lib/tcell_agent/rust/libtcellagent.so +0 -0
  52. data/lib/tcell_agent/rust/models.rb +9 -0
  53. data/lib/tcell_agent/rust/native_agent.rb +61 -51
  54. data/lib/tcell_agent/rust/native_library.rb +8 -10
  55. data/lib/tcell_agent/sensor_events/server_agent.rb +3 -100
  56. data/lib/tcell_agent/sensor_events/util/sanitizer_utilities.rb +1 -0
  57. data/lib/tcell_agent/servers/puma.rb +30 -13
  58. data/lib/tcell_agent/servers/rack_puma_handler.rb +33 -0
  59. data/lib/tcell_agent/servers/rails_server.rb +4 -4
  60. data/lib/tcell_agent/servers/unicorn.rb +1 -1
  61. data/lib/tcell_agent/servers/webrick.rb +12 -3
  62. data/lib/tcell_agent/settings_reporter.rb +0 -93
  63. data/lib/tcell_agent/sinatra.rb +1 -0
  64. data/lib/tcell_agent/tcell_context.rb +16 -7
  65. data/lib/tcell_agent/utils/headers.rb +0 -1
  66. data/lib/tcell_agent/utils/strings.rb +2 -2
  67. data/lib/tcell_agent/version.rb +1 -1
  68. data/lib/tcell_agent.rb +8 -16
  69. data/spec/cruby_spec_helper.rb +26 -0
  70. data/spec/lib/tcell_agent/configuration_spec.rb +62 -212
  71. data/spec/lib/tcell_agent/instrument_servers_spec.rb +95 -0
  72. data/spec/lib/tcell_agent/instrumentation/cmdi/io_cmdi_spec.rb +2 -2
  73. data/spec/lib/tcell_agent/{cmdi_spec.rb → instrumentation/cmdi_spec.rb} +50 -0
  74. data/spec/lib/tcell_agent/instrumentation/lfi/file_lfi_spec.rb +211 -272
  75. data/spec/lib/tcell_agent/instrumentation/lfi/io_lfi_spec.rb +213 -223
  76. data/spec/lib/tcell_agent/instrumentation/lfi/kernel_lfi_spec.rb +95 -61
  77. data/spec/lib/tcell_agent/instrumentation/lfi_spec.rb +120 -2
  78. data/spec/lib/tcell_agent/patches_spec.rb +2 -1
  79. data/spec/lib/tcell_agent/policies/clickjacking_policy_spec.rb +1 -2
  80. data/spec/lib/tcell_agent/policies/content_security_policy_spec.rb +5 -6
  81. data/spec/lib/tcell_agent/policies/patches_policy_spec.rb +21 -2
  82. data/spec/lib/tcell_agent/policies/policies_manager_spec.rb +1 -1
  83. data/spec/lib/tcell_agent/policies/secure_headers_policy_spec.rb +13 -8
  84. data/spec/lib/tcell_agent/rails/better_ip_spec.rb +9 -11
  85. data/spec/lib/tcell_agent/rails/csrf_exception_spec.rb +6 -6
  86. data/spec/lib/tcell_agent/rails/dlp_spec.rb +1 -0
  87. data/spec/lib/tcell_agent/rails/js_agent_insert_spec.rb +10 -2
  88. data/spec/lib/tcell_agent/rails/middleware/tcell_body_proxy_spec.rb +2 -1
  89. data/spec/lib/tcell_agent/rails/routes/route_id_spec.rb +4 -4
  90. data/spec/lib/tcell_agent/rust/agent_config_spec.rb +27 -0
  91. data/spec/lib/tcell_agent/settings_reporter_spec.rb +2 -89
  92. data/spec/lib/tcell_agent/tcell_context_spec.rb +6 -5
  93. data/spec/spec_helper.rb +9 -1
  94. data/spec/support/builders.rb +8 -7
  95. data/spec/support/server_mocks/passenger_mock.rb +7 -0
  96. data/spec/support/server_mocks/puma_mock.rb +21 -0
  97. data/spec/support/server_mocks/rails_mock.rb +7 -0
  98. data/spec/support/server_mocks/thin_mock.rb +7 -0
  99. data/spec/support/server_mocks/unicorn_mock.rb +11 -0
  100. data/spec/support/shared_spec.rb +29 -0
  101. data/tcell_agent.gemspec +14 -14
  102. metadata +46 -29
  103. data/Rakefile +0 -18
  104. data/lib/tcell_agent/authlogic.rb +0 -23
  105. data/lib/tcell_agent/config/unknown_options.rb +0 -119
  106. data/lib/tcell_agent/devise.rb +0 -33
  107. data/lib/tcell_agent/instrumentation/monkey_patches/file.rb +0 -25
  108. data/lib/tcell_agent/instrumentation/monkey_patches/io.rb +0 -123
  109. data/lib/tcell_agent/instrumentation/monkey_patches/kernel.rb +0 -159
  110. data/lib/tcell_agent/rails/start_agent_after_initializers.rb +0 -12
  111. data/lib/tcell_agent/rust/tcellagent-4.14.0.dll +0 -0
  112. data/spec/lib/tcell_agent/config/unknown_options_spec.rb +0 -195
@@ -9,53 +9,18 @@ require 'tcell_agent/utils/headers'
9
9
  module TCellAgent
10
10
  module Rust
11
11
  class NativeAgent # rubocop:disable Metrics/ClassLength
12
- def self.test_event_sender(events)
13
- config = TCellAgent.configuration
14
- event_sender = {
15
- :uuid => config.uuid,
16
- :hostname => config.host_identifier,
17
- :agent_type => 'Ruby',
18
- :agent_version => TCellAgent::VERSION,
19
- :app_id => config.app_id,
20
- :api_key => config.api_key,
21
- :tcell_input_url => config.tcell_input_url,
22
- :events => events
23
- }
24
- event_sender_pointer = FFI::MemoryPointer.from_string(
25
- JSON.dump(event_sender)
26
- )
27
-
28
- buf = FFI::MemoryPointer.new(:uint8, 1024 * 8)
29
- # config_pointer.size - 1: strips null terminator
30
- result_size = TCellAgent::Rust::NativeLibrary.test_event_sender(
31
- event_sender_pointer, event_sender_pointer.size - 1, buf, buf.size
32
- )
33
-
34
- response = NativeAgentResponse.new('test_event_sender', buf, result_size)
35
-
36
- response.errors
37
- end
12
+ def self.test_agent(config)
13
+ agent_config = TCellAgent::Rust::AgentConfig.new(config)
38
14
 
39
- def self.test_policies
40
- config = TCellAgent.configuration
41
- policies_info = {
42
- :app_id => config.app_id,
43
- :api_key => config.api_key,
44
- :tcell_api_url => config.tcell_api_url
45
- }
46
- policies_info_pointer = FFI::MemoryPointer.from_string(
47
- JSON.dump(policies_info)
15
+ config_pointer = FFI::MemoryPointer.from_string(
16
+ JSON.dump(agent_config)
48
17
  )
49
18
 
50
19
  buf = FFI::MemoryPointer.new(:uint8, 1024 * 8)
51
20
  # config_pointer.size - 1: strips null terminator
52
- result_size = TCellAgent::Rust::NativeLibrary.test_policies(
53
- policies_info_pointer, policies_info_pointer.size - 1, buf, buf.size
21
+ TCellAgent::Rust::NativeLibrary.test_agent(
22
+ config_pointer, config_pointer.size - 1, buf, buf.size
54
23
  )
55
-
56
- response = NativeAgentResponse.new('test_event_sender', buf, result_size)
57
-
58
- response.errors
59
24
  end
60
25
 
61
26
  def self.free_agent(agent_ptr)
@@ -88,6 +53,9 @@ module TCellAgent
88
53
  return nil
89
54
  end
90
55
 
56
+ return unless response['config'] && response['agent_enabled']
57
+
58
+ TCellAgent.configuration.populate_configuration(response['config'])
91
59
  NativeAgent.new(response['agent_ptr'])
92
60
  end
93
61
 
@@ -116,6 +84,7 @@ module TCellAgent
116
84
  :headers => header_params,
117
85
  :cookies => cookie_params,
118
86
  :path_params => path_params,
87
+ :reverse_proxy_header_value => appsensor_meta.reverse_proxy_header_value,
119
88
  :remote_address => appsensor_meta.remote_address,
120
89
  :full_uri => appsensor_meta.location,
121
90
  :session_id => appsensor_meta.session_id,
@@ -126,7 +95,6 @@ module TCellAgent
126
95
  :content_type => appsensor_meta.content_type,
127
96
  :request_body => appsensor_meta.raw_request_body
128
97
  }
129
-
130
98
  request_response_json[:sql_exceptions] = appsensor_meta.sql_exceptions if appsensor_meta.sql_exceptions
131
99
  request_response_json[:database_result_sizes] = appsensor_meta.database_result_sizes if appsensor_meta.database_result_sizes
132
100
 
@@ -167,13 +135,15 @@ module TCellAgent
167
135
  :method => appsensor_meta.method,
168
136
  :path => appsensor_meta.path,
169
137
  :remote_address => appsensor_meta.remote_address,
138
+ :reverse_proxy_header_value => appsensor_meta.reverse_proxy_header_value,
170
139
  :request_bytes_length => appsensor_meta.request_content_bytes_len,
171
140
  :query_params => query_params,
172
- :post_params => post_params,
141
+ :post_params => post_params,
173
142
  :headers => header_params,
174
143
  :cookies => cookie_params,
175
144
  :content_type => appsensor_meta.content_type,
176
- :full_uri => appsensor_meta.location
145
+ :full_uri => appsensor_meta.location,
146
+ :request_body => appsensor_meta.raw_request_body
177
147
  }
178
148
 
179
149
  patches_request_pointer = FFI::MemoryPointer.from_string(
@@ -196,6 +166,37 @@ module TCellAgent
196
166
  response.response
197
167
  end
198
168
 
169
+ def apply_suspicious_quick_check(appsensor_meta)
170
+ return {} unless appsensor_meta
171
+
172
+ sus_quick_check_request_json = {
173
+ :reverse_proxy_header_value => appsensor_meta.reverse_proxy_header_value,
174
+ :method => appsensor_meta.method,
175
+ :path => appsensor_meta.path,
176
+ :full_uri => appsensor_meta.location,
177
+ :request_bytes_length => appsensor_meta.request_content_bytes_len
178
+ }
179
+
180
+ if appsensor_meta.reverse_proxy_header_value.nil?
181
+ sus_quick_check_request_json.merge(
182
+ {
183
+ :client_ip_override => appsensor_meta.remote_address
184
+ }
185
+ )
186
+ end
187
+
188
+ sus_quick_check_request_ptr = FFI::MemoryPointer.from_string(
189
+ JSON.dump(sus_quick_check_request_json)
190
+ )
191
+
192
+ # sus_quick_check_request_ptr.size - 1: strips null terminator
193
+ TCellAgent::Rust::NativeLibrary.suspicious_quick_check_apply(
194
+ FFI::Pointer.new(@agent_ptr),
195
+ sus_quick_check_request_ptr,
196
+ sus_quick_check_request_ptr.size - 1
197
+ )
198
+ end
199
+
199
200
  def apply_cmdi(command, tcell_context)
200
201
  return unless TCellAgent::Utils::Strings.present?(command)
201
202
 
@@ -203,12 +204,14 @@ module TCellAgent
203
204
  :command => command,
204
205
  :method => tcell_context.request_method,
205
206
  :path => tcell_context.path,
207
+ :reverse_proxy_header_value => tcell_context.reverse_proxy_header_value,
206
208
  :remote_address => tcell_context.remote_address,
207
209
  :route_id => tcell_context.route_id,
208
210
  :session_id => tcell_context.session_id,
209
211
  :user_id => tcell_context.user_id,
210
212
  :full_uri => tcell_context.uri
211
213
  }
214
+
212
215
  command_pointer = FFI::MemoryPointer.from_string(
213
216
  JSON.dump(command_info)
214
217
  )
@@ -229,10 +232,11 @@ module TCellAgent
229
232
  response.response
230
233
  end
231
234
 
232
- def get_headers(tcell_context)
235
+ def get_headers(content_type, tcell_context)
233
236
  return unless tcell_context
234
237
 
235
238
  headers_request = {
239
+ :content_type => content_type,
236
240
  :method => tcell_context.request_method,
237
241
  :path => tcell_context.path,
238
242
  :route_id => tcell_context.route_id.to_s,
@@ -270,8 +274,9 @@ module TCellAgent
270
274
  :status_code => status_code,
271
275
  :method => tcell_context.request_method,
272
276
  :path => tcell_context.path,
277
+ :reverse_proxy_header_value => tcell_context.reverse_proxy_header_value,
273
278
  :remote_addr => tcell_context.remote_address,
274
- :full_uri => tcell_context.fullpath,
279
+ :full_uri => tcell_context.uri,
275
280
  :route_id => tcell_context.route_id,
276
281
  :session_id => tcell_context.session_id,
277
282
  :user_id => tcell_context.user_id
@@ -335,11 +340,12 @@ module TCellAgent
335
340
  :event_name => event_name,
336
341
  :user_id => user_id,
337
342
  :user_agent => tcell_context.user_agent,
343
+ :reverse_proxy_header_value => tcell_context.reverse_proxy_header_value,
338
344
  :remote_address => tcell_context.remote_address,
339
345
  :header_keys => header_keys,
340
- :passsword => password,
346
+ :password => password,
341
347
  :session_id => tcell_context.session_id,
342
- :full_uri => tcell_context.fullpath,
348
+ :full_uri => tcell_context.uri,
343
349
  :referrer => tcell_context.referrer,
344
350
  :user_valid => user_valid
345
351
  }
@@ -377,11 +383,14 @@ module TCellAgent
377
383
  if tcell_context
378
384
  file_access_info = file_access_info.merge(
379
385
  {
380
- :full_uri => tcell_context.fullpath,
386
+ :full_uri => tcell_context.uri,
387
+ :reverse_proxy_header_value => tcell_context.reverse_proxy_header_value,
381
388
  :remote_address => tcell_context.remote_address,
382
389
  :route_id => tcell_context.route_id,
383
390
  :session_id => tcell_context.session_id,
384
- :user_id => tcell_context.user_id
391
+ :user_id => tcell_context.user_id,
392
+ :method => tcell_context.request_method,
393
+ :request_path => tcell_context.path
385
394
  }
386
395
  )
387
396
  end
@@ -453,6 +462,7 @@ module TCellAgent
453
462
  :session_id => tcell_context && tcell_context.session_id,
454
463
  :user_id => tcell_context && tcell_context.user_id,
455
464
  :user_agent => tcell_context && tcell_context.user_agent,
465
+ :reverse_proxy_header_value => tcell_context.reverse_proxy_header_value,
456
466
  :remote_address => tcell_context && tcell_context.remote_address
457
467
  }
458
468
  message_pointer = FFI::MemoryPointer.from_string(
@@ -504,7 +514,7 @@ module TCellAgent
504
514
  end
505
515
  end
506
516
 
507
- # Note: for tests
517
+ # NOTE: for tests
508
518
  def update_policies(policies)
509
519
  return {} unless TCellAgent::Utils::Strings.present?(policies)
510
520
 
@@ -6,22 +6,20 @@ module TCellAgent
6
6
  require 'ffi'
7
7
  extend FFI::Library
8
8
 
9
- VERSION = '4.14.0'.freeze
10
- prefix = 'lib'
11
9
  extension = '.so'
12
10
  variant = ''
13
11
  if /cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM
12
+ variant = '-x64'
14
13
  extension = '.dll'
15
- prefix = ''
16
14
  elsif /darwin/ =~ RUBY_PLATFORM
17
15
  extension = '.dylib'
18
16
  elsif /musl/ =~ RUBY_PLATFORM
19
- variant = 'alpine-'
17
+ variant = '-alpine'
20
18
  end
21
19
 
22
20
  begin
23
21
  ffi_lib File.join(File.dirname(__FILE__),
24
- "#{prefix}tcellagent-#{variant}#{VERSION}#{extension}")
22
+ "libtcellagent#{variant}#{extension}")
25
23
 
26
24
  # All the rust library calls have the following response api:
27
25
  #
@@ -36,6 +34,7 @@ module TCellAgent
36
34
  attach_function :poll_new_policies, %i[pointer pointer size_t], :int
37
35
  attach_function :appfirewall_apply, %i[pointer pointer size_t pointer size_t], :int
38
36
  attach_function :patches_apply, %i[pointer pointer size_t pointer size_t], :int
37
+ attach_function :suspicious_quick_check_apply, %i[pointer pointer size_t], :int
39
38
  attach_function :cmdi_apply, %i[pointer pointer size_t pointer size_t], :int
40
39
  attach_function :get_headers, %i[pointer pointer size_t pointer size_t], :int
41
40
  attach_function :get_js_agent_script_tag, %i[pointer pointer size_t pointer size_t], :int
@@ -48,16 +47,15 @@ module TCellAgent
48
47
  attach_function :log_message, %i[pointer pointer size_t pointer size_t], :int
49
48
 
50
49
  attach_function :update_policies, %i[pointer pointer size_t pointer size_t], :int
51
- attach_function :test_event_sender, %i[pointer size_t pointer size_t], :int
52
- attach_function :test_policies, %i[pointer size_t pointer size_t], :int
50
+ attach_function :test_agent, %i[pointer size_t pointer size_t], :int
53
51
 
54
52
  def self.common_lib_available?
55
53
  true
56
54
  end
57
- rescue LoadError => load_error
55
+ rescue LoadError => e
58
56
  logger = TCellAgent::ModuleLogger.new(TCellAgent::RubyLogger.new, name)
59
- logger.error("Failed loading agent library. #{load_error.message}")
60
- logger.exception(load_error)
57
+ logger.error("Failed loading agent library. #{e.message}")
58
+ logger.exception(e)
61
59
 
62
60
  def self.common_lib_available? # rubocop:disable Lint/DuplicateMethods
63
61
  false
@@ -7,59 +7,6 @@ require 'etc'
7
7
 
8
8
  module TCellAgent
9
9
  module SensorEvents
10
- class ServerAgentDetailsSensorEvent < TCellSensorEvent
11
- include TCellAgent::ModuleLoggerAccess
12
-
13
- def initialize
14
- super('server_agent_details')
15
- @flush = true
16
- @ensure = true
17
-
18
- self['user'] = 'unknown'
19
- self['group'] = 'unknown'
20
-
21
- begin
22
- login = Etc.getlogin
23
- if login
24
- self['user'] = login
25
- begin
26
- info = Etc.getpwnam(login)
27
- self['group'] = info.gid.to_s
28
- rescue StandardError => te
29
- module_logger.debug("Could not get group id: #{te.message}")
30
- module_logger.exception(te)
31
- end
32
- end
33
- rescue StandardError => to
34
- module_logger.debug("Could not get user & group: #{to.message}")
35
- module_logger.exception(te)
36
- end
37
-
38
- module_logger.debug("User #{self['user']}")
39
- module_logger.debug("Group #{self['group']}")
40
- end
41
- end
42
-
43
- class ServerAgentDetailsLanguageEvent < TCellSensorEvent
44
- def initialize(language, language_version)
45
- super('server_agent_details')
46
- @flush = true
47
- @ensure = true
48
- self['language'] = language
49
- self['language_version'] = language_version
50
- end
51
- end
52
-
53
- class ServerAgentAppFrameworkEvent < TCellSensorEvent
54
- def initialize(framework_name, framework_version)
55
- super('server_agent_details')
56
- @flush = true
57
- @ensure = true
58
- self['app_framework'] = framework_name
59
- self['app_framework_version'] = framework_version
60
- end
61
- end
62
-
63
10
  class ServerAgentPackagesSensorEvent < TCellSensorEvent
64
11
  include TCellAgent::ModuleLoggerAccess
65
12
 
@@ -75,59 +22,15 @@ module TCellAgent
75
22
  packages.push(package)
76
23
  module_logger.debug("Adding packages #{x.name}")
77
24
  end
78
- rescue StandardError => te
79
- module_logger.error("Exception adding package: #{te.message}")
80
- module_logger.exception(te)
25
+ rescue StandardError => e
26
+ module_logger.error("Exception adding package: #{e.message}")
27
+ module_logger.exception(e)
81
28
  end
82
29
  end
83
30
  self['packages'] = packages
84
31
  end
85
32
  end
86
33
 
87
- class AppFramework < TCellSensorEvent
88
- def initialize(name, version)
89
- super('appserver_framework')
90
- @flush = false
91
- @ensure = true
92
- self['n'] = name
93
- self['v'] = version
94
- end
95
- end
96
-
97
- class AppAuthFramework < TCellSensorEvent
98
- def initialize(name, version)
99
- super('appserver_auth_framework')
100
- @flush = false
101
- @ensure = true
102
- self['n'] = name
103
- self['v'] = version
104
- end
105
- end
106
-
107
- class AppFrameworkSetting < TCellSensorEvent
108
- def initialize(framework_name, setting, value)
109
- super('appserver_framework_setting')
110
- @flush = false
111
- @ensure = true
112
- self['framework'] = framework_name
113
- self['s'] = setting
114
- self['v'] = value
115
- end
116
- end
117
-
118
- class AppCookie < TCellSensorEvent
119
- def initialize(name, value, secure, http_only, session)
120
- super('appserver_framework_setting')
121
- @flush = false
122
- @ensure = true
123
- self['n'] = name
124
- self['v'] = value
125
- self['http_only'] = http_only
126
- self['secure'] = secure
127
- self['session'] = session
128
- end
129
- end
130
-
131
34
  class AppRoutesSensorEvent < TCellSensorEvent
132
35
  def initialize(uri, method, route_id, params = nil, destination = nil)
133
36
  super('appserver_routes')
@@ -19,6 +19,7 @@ module TCellAgent
19
19
  params = CGI.parse(query)
20
20
  params.each do |param_name, param_values|
21
21
  next if param_values.nil? || param_values.empty?
22
+
22
23
  params[param_name] = ['']
23
24
  end
24
25
  params.map { |k, v| "#{k}=#{v.join(',')}" }.join('&')
@@ -1,38 +1,55 @@
1
1
  if defined?(Puma.cli_config)
2
2
  if Puma.cli_config.options[:preload_app]
3
- if Puma.cli_config.options[:workers] == 0 # rubocop:disable Style/NumericPredicate
3
+ if Puma.cli_config.options[:workers] == 0
4
4
  # Puma is running in single mode, so run both the initial instrumentation and
5
5
  # start the agent
6
6
  Puma::Runner.class_eval do
7
- alias_method :original_start_server, :start_server
7
+ alias_method :tcell_original_start_server, :start_server
8
8
  def start_server
9
- TCellAgent.thread_agent.start('Puma Single Mode')
9
+ TCellAgent.thread_agent.start('Puma')
10
10
 
11
- original_start_server
11
+ tcell_original_start_server
12
12
  end
13
13
  end
14
14
 
15
15
  else
16
16
  Puma::Server.class_eval do
17
- alias_method :original_run, :run
18
- def run(background = true)
19
- TCellAgent.thread_agent.start('Puma Cluster Mode (Worker)')
17
+ alias_method :tcell_original_run, :run
20
18
 
21
- original_run(background)
19
+ if defined?(Gem::Version) &&
20
+ defined?(Puma::Const::PUMA_VERSION) &&
21
+ (Gem::Version.new(Puma::Const::PUMA_VERSION) < Gem::Version.new('5.1.0'))
22
+ def run(background = true)
23
+ TCellAgent.thread_agent.start('Puma')
24
+ original_run(background, options)
25
+ end
26
+ else
27
+ def run(background = true, thread_name: 'server')
28
+ TCellAgent.thread_agent.start('Puma')
29
+ original_run(background, :thread_name => thread_name)
30
+ end
22
31
  end
23
32
  end
24
33
  end
25
-
26
34
  else
27
35
  # this ensures instrumentation runs for preload_app = false.
28
36
  # Instrumentation will run for each worker but there's
29
37
  # nothing we can do about that (Unicorn's preload_app behaves the same way)
30
38
  Puma::Server.class_eval do
31
- alias_method :original_run, :run
32
- def run(background = true)
33
- TCellAgent.thread_agent.start('Puma Cluster Mode (Worker)')
39
+ alias_method :tcell_original_run, :run
34
40
 
35
- original_run(background)
41
+ if defined?(Gem::Version) &&
42
+ defined?(Puma::Const::PUMA_VERSION) &&
43
+ (Gem::Version.new(Puma::Const::PUMA_VERSION) < Gem::Version.new('5.1.0'))
44
+ def run(background = true)
45
+ TCellAgent.thread_agent.start('Puma')
46
+ tcell_original_run(background)
47
+ end
48
+ else
49
+ def run(background = true, thread_name: 'server')
50
+ TCellAgent.thread_agent.start('Puma')
51
+ original_run(background, :thread_name => thread_name)
52
+ end
36
53
  end
37
54
  end
38
55
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rack::Handler::Puma.class_eval do
4
+ class << self
5
+ alias_method :tcell_original_config, :config
6
+ def config(app, options = {})
7
+ conf = tcell_original_config(app, options)
8
+
9
+ if defined?(Puma::Server) && !Puma::Server.instance_methods.include?(:tcell_original_run)
10
+ Puma::Server.class_eval do
11
+ alias_method :tcell_original_run, :run
12
+
13
+ if defined?(Gem::Version) &&
14
+ defined?(Puma::Const::PUMA_VERSION) &&
15
+ (Gem::Version.new(Puma::Const::PUMA_VERSION) >= Gem::Version.new('5.1.0'))
16
+ def run(background = true, thread_name: 'server')
17
+ TCellAgent.thread_agent.start('Puma')
18
+ original_run(background, :thread_name => thread_name)
19
+ end
20
+ else
21
+ def run(background = true)
22
+ TCellAgent.thread_agent.start('Puma')
23
+
24
+ tcell_original_run(background)
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ conf
31
+ end
32
+ end
33
+ end
@@ -5,17 +5,17 @@
5
5
  Rails::Server.class_eval do
6
6
  alias_method :tcell_build_app, :build_app
7
7
  def build_app(app)
8
+ require('tcell_agent/servers/rack_puma_handler') if defined?(Rack::Handler::Puma)
8
9
  require('tcell_agent/servers/unicorn') if defined?(Unicorn::HttpServer)
9
10
  require('tcell_agent/servers/webrick') if defined?(Rack::Handler::WEBrick)
10
11
  require('tcell_agent/servers/thin') if defined?(Thin::Server)
11
12
 
12
13
  if defined?(Puma::Server)
13
14
  Puma::Server.class_eval do
14
- alias_method :original_run, :run
15
+ alias_method :tcell_original_run, :run
15
16
  def run(background = true)
16
- TCellAgent.thread_agent.start('Puma Single Mode')
17
-
18
- original_run(background)
17
+ TCellAgent.thread_agent.start('Puma')
18
+ tcell_original_run(background)
19
19
  end
20
20
  end
21
21
  end
@@ -3,7 +3,7 @@ Unicorn::HttpServer.class_eval do
3
3
  # - This check also ensures that a server is running as opposed to a different command such
4
4
  # as `bundle exec rails runner User.count`.
5
5
  unless Unicorn::HttpServer::START_CTX && Unicorn::HttpServer::START_CTX[0]
6
- require 'tcell_agent/rails/start_agent_after_initializers'
6
+ require 'tcell_agent/rails/railties/tcell_agent_unicorn_railties'
7
7
  end
8
8
 
9
9
  # This only gets instrumented when preload_app is true
@@ -1,10 +1,19 @@
1
1
  Rack::Handler::WEBrick.class_eval do
2
2
  class << self
3
3
  alias_method :original_run, :run
4
- def run(app, options = {})
5
- TCellAgent.thread_agent.start('WEBrick')
6
4
 
7
- original_run(app, options)
5
+ if defined?(Gem::Version) &&
6
+ defined?(Rack.release) &&
7
+ Gem::Version.new(Rack.release) < Gem::Version.new('2.2.0')
8
+ def run(app, options = {})
9
+ TCellAgent.thread_agent.start('WEBrick')
10
+ original_run(app, options)
11
+ end
12
+ else
13
+ def run(app, **options)
14
+ TCellAgent.thread_agent.start('WEBrick')
15
+ original_run(app, **options)
16
+ end
8
17
  end
9
18
  end
10
19
  end
@@ -7,25 +7,11 @@ require 'thread'
7
7
  module TCellAgent
8
8
  def self.report_settings
9
9
  Thread.new do
10
- TCellAgent::Instrumentation.safe_block('Instrumenting Agent Details') do
11
- event = TCellAgent::SensorEvents::ServerAgentDetailsSensorEvent.new
12
- TCellAgent.send_event(event)
13
- end
14
-
15
10
  TCellAgent::Instrumentation.safe_block('Instrumenting Server Packages') do
16
11
  event = TCellAgent::SensorEvents::ServerAgentPackagesSensorEvent.new
17
12
  TCellAgent.send_event(event)
18
13
  end
19
14
 
20
- TCellAgent::Instrumentation.safe_block('Instrumenting Language Info') do
21
- TCellAgent.send_event(
22
- TCellAgent::SensorEvents::ServerAgentDetailsLanguageEvent.new(
23
- 'Ruby',
24
- RUBY_VERSION
25
- )
26
- )
27
- end
28
-
29
15
  TCellAgent::Instrumentation.safe_block('Instrumenting Native Lib Status') do
30
16
  require 'tcell_agent/rust/native_agent'
31
17
 
@@ -37,85 +23,6 @@ module TCellAgent
37
23
  )
38
24
  end
39
25
 
40
- TCellAgent::Instrumentation.safe_block('Instrumenting Initial Config') do
41
- TCellAgent.send_event(
42
- TCellAgent::SensorEvents::AgentSettingEvent.new(
43
- 'allow_payloads',
44
- (!!TCellAgent.configuration.allow_payloads).to_s # rubocop:disable Style/DoubleNegation
45
- )
46
- )
47
-
48
- TCellAgent.send_event(
49
- TCellAgent::SensorEvents::AgentSettingEvent.new(
50
- 'reverse_proxy',
51
- (!!TCellAgent.configuration.reverse_proxy).to_s # rubocop:disable Style/DoubleNegation
52
- )
53
- )
54
-
55
- # Because of all the diff ways to initialize the agent
56
- # some some of the following vars might not be set until
57
- # we call this method, so call this method to set all
58
- # the variables
59
- TCellAgent.configuration.log_filename
60
-
61
- TCellAgent.send_event(
62
- TCellAgent::SensorEvents::AgentSettingEvent.new(
63
- 'config_filename',
64
- TCellAgent.configuration.config_filename
65
- )
66
- )
67
- TCellAgent.send_event(
68
- TCellAgent::SensorEvents::AgentSettingEvent.new(
69
- 'logging_directory',
70
- TCellAgent.configuration.agent_log_dir
71
- )
72
- )
73
-
74
- TCellAgent.send_event(
75
- TCellAgent::SensorEvents::AgentSettingEvent.new(
76
- 'agent_home_directory',
77
- TCellAgent.configuration.agent_home_dir
78
- )
79
- )
80
-
81
- logging_options = TCellAgent.configuration.logging_options || {}
82
- use_default_setting = !logging_options.key?(:enabled) && !logging_options.key?('enabled')
83
- if use_default_setting || logging_options[:enabled] || logging_options['enabled']
84
- TCellAgent.send_event(
85
- TCellAgent::SensorEvents::AgentSettingEvent.new('logging_enabled', 'true')
86
- )
87
-
88
- TCellAgent.send_event(
89
- TCellAgent::SensorEvents::AgentSettingEvent.new(
90
- 'logging_level',
91
- logging_options[:level] || logging_options['level'] || 'INFO'
92
- )
93
- )
94
- else
95
- TCellAgent.send_event(
96
- TCellAgent::SensorEvents::AgentSettingEvent.new('logging_enabled', 'false')
97
- )
98
- end
99
-
100
- if TCellAgent.configuration.hmac_key
101
- TCellAgent.send_event(
102
- TCellAgent::SensorEvents::AgentSettingEvent.new(
103
- 'hmac_key_present',
104
- (!!TCellAgent.configuration.hmac_key).to_s # rubocop:disable Style/DoubleNegation
105
- )
106
- )
107
- end
108
-
109
- if TCellAgent.configuration.reverse_proxy
110
- TCellAgent.send_event(
111
- TCellAgent::SensorEvents::AgentSettingEvent.new(
112
- 'reverse_proxy_ip_address_header',
113
- TCellAgent.configuration.reverse_proxy_ip_address_header
114
- )
115
- )
116
- end
117
- end
118
-
119
26
  if defined?(::Rails)
120
27
  TCellAgent::Instrumentation.safe_block('Instrumenting routes') do
121
28
  TCellAgent::Instrumentation::Rails.instrument_routes