nexpose_pxgrid 0.1.2-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile +4 -0
  5. data/LICENCE.APACHE +144 -0
  6. data/LICENSE.MIT +21 -0
  7. data/README.md +49 -0
  8. data/RadiusSimulator.jar +0 -0
  9. data/Rakefile +31 -0
  10. data/bin/logback.xml +17 -0
  11. data/bin/pxnx.rb +34 -0
  12. data/bin/pxnx_daemon.rb +105 -0
  13. data/keystore.jks +0 -0
  14. data/lib/java_libs/FastInfoset-1.2.12.jar +0 -0
  15. data/lib/java_libs/commons-cli-20040117.000000.jar +0 -0
  16. data/lib/java_libs/commons-codec-1.7.jar +0 -0
  17. data/lib/java_libs/commons-io-2.4.jar +0 -0
  18. data/lib/java_libs/commons-lang-2.6.jar +0 -0
  19. data/lib/java_libs/cxf-api-2.7.3.jar +0 -0
  20. data/lib/java_libs/cxf-rt-bindings-xml-2.7.3.jar +0 -0
  21. data/lib/java_libs/cxf-rt-core-2.7.3.jar +0 -0
  22. data/lib/java_libs/cxf-rt-frontend-jaxrs-2.7.3.jar +0 -0
  23. data/lib/java_libs/cxf-rt-transports-http-2.7.3.jar +0 -0
  24. data/lib/java_libs/geronimo-javamail_1.4_spec-1.7.1.jar +0 -0
  25. data/lib/java_libs/istack-commons-runtime-2.14.jar +0 -0
  26. data/lib/java_libs/javax.ws.rs-api-2.0-m10.jar +0 -0
  27. data/lib/java_libs/jaxb-api-2.2.7.jar +0 -0
  28. data/lib/java_libs/jaxb-core-2.2.7-b57.jar +0 -0
  29. data/lib/java_libs/jaxb-impl-2.2.7-b57.jar +0 -0
  30. data/lib/java_libs/log4j-1.2.17.jar +0 -0
  31. data/lib/java_libs/log4j-rolling-appender-20131024-2017.jar +0 -0
  32. data/lib/java_libs/logback-classic-1.1.2.jar +0 -0
  33. data/lib/java_libs/logback-core-1.1.2.jar +0 -0
  34. data/lib/java_libs/pxgrid-core-model-1.0.0.10.jar +0 -0
  35. data/lib/java_libs/pxgrid-eps-client-stub-1.0.0.10.jar +0 -0
  36. data/lib/java_libs/pxgrid-eps-model-1.0.0.10.jar +0 -0
  37. data/lib/java_libs/pxgrid-gc-admin-model-1.0.0.10.jar +0 -0
  38. data/lib/java_libs/pxgrid-gcl-1.0.0.10.jar +0 -0
  39. data/lib/java_libs/pxgrid-identity-client-stub-1.0.0.10.jar +0 -0
  40. data/lib/java_libs/pxgrid-identity-model-1.0.0.10.jar +0 -0
  41. data/lib/java_libs/pxgrid-ise-model-1.0.0.10.jar +0 -0
  42. data/lib/java_libs/pxgrid-isemetadata-client-stub-1.0.0.10.jar +0 -0
  43. data/lib/java_libs/pxgrid-isemetadata-model-1.0.0.10.jar +0 -0
  44. data/lib/java_libs/pxgrid-net-model-1.0.0.10.jar +0 -0
  45. data/lib/java_libs/pxgrid-netcapture-model-1.0.0.10.jar +0 -0
  46. data/lib/java_libs/pxgrid-tdanalysis-model-1.0.0.10.jar +0 -0
  47. data/lib/java_libs/slf4j-api-1.7.2.jar +0 -0
  48. data/lib/java_libs/smack-3.2.1.jar +0 -0
  49. data/lib/java_libs/smackx-3.2.1.jar +0 -0
  50. data/lib/java_libs/stax-api-1.0-2.jar +0 -0
  51. data/lib/java_libs/stax2-api-3.1.1.jar +0 -0
  52. data/lib/java_libs/woodstox-core-asl-4.1.4.jar +0 -0
  53. data/lib/java_libs/wsdl4j-1.6.2.jar +0 -0
  54. data/lib/java_libs/xmlschema-core-2.0.3.jar +0 -0
  55. data/lib/pxnx_jruby.rb +70 -0
  56. data/lib/pxnx_jruby/config/pxnx.config +40 -0
  57. data/lib/pxnx_jruby/connection.rb +84 -0
  58. data/lib/pxnx_jruby/connection_manager.rb +44 -0
  59. data/lib/pxnx_jruby/eps_broker.rb +49 -0
  60. data/lib/pxnx_jruby/nexpose_connection.rb +62 -0
  61. data/lib/pxnx_jruby/nx_logger.rb +166 -0
  62. data/lib/pxnx_jruby/session_directory_notification.rb +26 -0
  63. data/lib/pxnx_jruby/spoon/README +7 -0
  64. data/lib/pxnx_jruby/spoon/pxnx_daemon_unix.rb +181 -0
  65. data/lib/pxnx_jruby/spoon/pxnx_daemon_windows.rb +50 -0
  66. data/lib/pxnx_jruby/spoon/pxnx_runner.rb +7 -0
  67. data/lib/pxnx_jruby/version.rb +5 -0
  68. data/pxnx.gemspec +28 -0
  69. data/releases/pxnx-0.1.0-java.gem +0 -0
  70. data/truststore.jks +0 -0
  71. metadata +220 -0
@@ -0,0 +1,166 @@
1
+ require 'fileutils'
2
+ require 'json'
3
+ require 'net/http'
4
+ require 'singleton'
5
+
6
+ module PxnxJruby
7
+ class NxLogger
8
+ include Singleton
9
+ LOG_PATH = "../logs/rapid7_%s.log"
10
+ KEY_FORMAT = "external.integration.%s"
11
+ PRODUCT_FORMAT = "%s_%s"
12
+
13
+ DEFAULT_LOG = 'integration'
14
+ PRODUCT_RANGE = 4..30
15
+ KEY_RANGE = 3..15
16
+
17
+ ENDPOINT = '/data/external/statistic/'
18
+
19
+ def initialize()
20
+ create_calls
21
+ @logger_file = get_log_path @product
22
+ setup_logging(true, 'info')
23
+ end
24
+
25
+ def setup_statistics_collection(vendor, product_name, gem_version)
26
+ begin
27
+ @statistic_key = get_statistic_key vendor
28
+ @product = get_product product_name, gem_version
29
+ rescue => e
30
+ #Continue
31
+ end
32
+ end
33
+
34
+ def setup_logging(enabled, log_level = 'info', stdout=false)
35
+ @stdout = stdout
36
+
37
+ log_message('Logging disabled.') unless enabled || @log.nil?
38
+ @enabled = enabled
39
+ return unless @enabled
40
+
41
+ @logger_file = get_log_path @product
42
+
43
+ require 'logger'
44
+ directory = File.dirname(@logger_file)
45
+ FileUtils.mkdir_p(directory) unless File.directory?(directory)
46
+ io = IO.for_fd(IO.sysopen(@logger_file, 'a'), 'a')
47
+ io.autoclose = false
48
+ io.sync = true
49
+ @log = Logger.new(io, 'weekly')
50
+ @log.level = if log_level.to_s.casecmp('info') == 0
51
+ Logger::INFO
52
+ else
53
+ Logger::DEBUG
54
+ end
55
+ log_message("Logging enabled at level <#{log_level}>")
56
+ end
57
+
58
+ def create_calls
59
+ levels = [:info, :debug, :error, :warn]
60
+ levels.each do |level|
61
+ method_name =
62
+ define_singleton_method("log_#{level.to_s}_message") do |message|
63
+ puts message if @stdout
64
+ @log.send(level, message) unless !@enabled || @log.nil?
65
+ end
66
+ end
67
+ end
68
+
69
+ def log_message(message)
70
+ log_info_message message
71
+ end
72
+
73
+ def log_stat_message(message)
74
+ end
75
+
76
+ def get_log_path(product)
77
+ product.downcase! unless product.nil?
78
+ File.join(File.dirname(__FILE__), LOG_PATH % (product || DEFAULT_LOG))
79
+ end
80
+
81
+ def get_statistic_key(vendor)
82
+ if vendor.nil? || vendor.length < KEY_RANGE.min
83
+ log_stat_message("Vendor length is below minimum of <#{KEY_RANGE}>")
84
+ return nil
85
+ end
86
+
87
+ vendor.gsub!('-', '_')
88
+ vendor.slice! vendor.rindex('_') until vendor.count('_') <= 1
89
+
90
+ vendor.delete! "^A-Za-z0-9\_"
91
+
92
+ KEY_FORMAT % vendor[0...KEY_RANGE.max].downcase
93
+ end
94
+
95
+ def get_product(product, version)
96
+ return nil if ((product.nil? || product.empty?) ||
97
+ (version.nil? || version.empty?))
98
+
99
+ product.gsub!('-', '_')
100
+ product.slice! product.rindex('_') until product.count('_') <= 1
101
+
102
+ product.delete! "^A-Za-z0-9\_"
103
+ version.delete! "^A-Za-z0-9\.\-"
104
+
105
+ product = (PRODUCT_FORMAT % [product, version])[0...PRODUCT_RANGE.max]
106
+
107
+ product.slice! product.rindex(/[A-Z0-9]/i)+1..-1
108
+
109
+ if product.length < PRODUCT_RANGE.min
110
+ log_stat_message("Product length below minimum <#{PRODUCT_RANGE.min}>.")
111
+ return nil
112
+ end
113
+ product.downcase
114
+ end
115
+
116
+ def generate_payload(statistic_value='')
117
+ product_name, separator, version = @product.to_s.rpartition('_')
118
+ payload_value = {'version' => version}.to_json
119
+
120
+ payload = {'statistic-key' => @statistic_key.to_s,
121
+ 'statistic-value' => payload_value,
122
+ 'product' => product_name}
123
+ JSON.generate(payload)
124
+ end
125
+
126
+ def send(nexpose_address, nexpose_port, session_id, payload)
127
+ header = {'Content-Type' => 'application/json',
128
+ 'nexposeCCSessionID' => session_id,
129
+ 'Cookie' => "nexposeCCSessionID=#{session_id}"}
130
+ req = Net::HTTP::Put.new(ENDPOINT, header)
131
+ req.body = payload
132
+ http_instance = Net::HTTP.new(nexpose_address, nexpose_port)
133
+ http_instance.use_ssl = true
134
+ http_instance.verify_mode = OpenSSL::SSL::VERIFY_NONE
135
+ response = http_instance.start { |http| http.request(req) }
136
+ log_stat_message "Received code #{response.code} from Nexpose console."
137
+ log_stat_message "Received message #{response.msg} from Nexpose console."
138
+ log_stat_message 'Finished sending statistics data to Nexpose.'
139
+
140
+ response.code
141
+ end
142
+
143
+ def on_connect(nexpose_address, nexpose_port, session_id, value)
144
+ log_stat_message 'Sending statistics data to Nexpose'
145
+
146
+ if @product.nil? || @statistic_key.nil?
147
+ log_stat_message('Invalid product name and/or statistics key.')
148
+ log_stat_message('Statistics collection not enabled.')
149
+ return
150
+ end
151
+
152
+ begin
153
+ payload = generate_payload value
154
+ send(nexpose_address, nexpose_port, session_id, payload)
155
+ rescue => e
156
+ #Let the program continue
157
+ end
158
+ end
159
+
160
+ #Used by net library for debugging
161
+ def <<(value)
162
+ log_debug_message(value)
163
+ end
164
+
165
+ end
166
+ end
@@ -0,0 +1,26 @@
1
+ module PxnxJruby
2
+ class SessionDirectoryNotification
3
+ require 'java'
4
+ require 'jruby/core_ext'
5
+ java_import org.slf4j.Logger
6
+ java_import org.slf4j.LoggerFactory
7
+ include Java::com.cisco.pxgrid.stub.identity.SessionDirectoryNotification
8
+ java_signature 'void onChange(com.cisco.pxgrid.model.net.Session)'
9
+ attr_accessor :session, :interface, :device_ip_address
10
+
11
+ # TODO: Test this method.
12
+ # TODO: Properly create calls to start integration with the IP received.
13
+ def onChange(session)
14
+ # Log this session id.
15
+ @session = session
16
+ @interface = session.getInterface
17
+ device_interfaces = @interface.getIpIntfIDs
18
+ device = device_interfaces[0]
19
+ @device_ip_address = device.get_ip_address
20
+ connect_manager = PxnxJruby::ConnectionManager.instance
21
+ log = LoggerFactory.getLogger(SessionDirectoryNotification.become_java!)
22
+ log.info("Found new IP #{@device_ip_address} connecting to the network, assessing.")
23
+ connect_manager.new_connection(@device_ip_address)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,7 @@
1
+ The Apache licence applies to all files within this folder ('spoon').
2
+
3
+ The original project was authored by 'headius' (https://github.com/headius) and is located at: https://github.com/headius/spoon.
4
+
5
+ Modifications have been made to the pxnx_daemon_windows.rb file to fix issue #17 (https://github.com/headius/spoon/issues/17):
6
+ * Now extends the FFI Lib
7
+ * Imports MSVCRT DLL where some of the used functions are defined.
@@ -0,0 +1,181 @@
1
+ # Licensed under the Apache License, Version 2.0 (the "License");
2
+ # you may not use this file except in compliance with the License.
3
+ # You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ # UNIX posix_spawn
14
+
15
+ require 'ffi'
16
+
17
+ module Spoon
18
+ class FileActions
19
+ attr_reader :pointer
20
+ SIZE = FFI::Platform.mac? ? FFI.type_size(:pointer) : 128
21
+
22
+ def initialize
23
+ @pointer = FFI::AutoPointer.new(LibC.malloc(SIZE), Releaser)
24
+ error = LibC.posix_spawn_file_actions_init(@pointer)
25
+ raise SystemCallError.new("posix_file_actions_init", error) unless error == 0
26
+ end
27
+
28
+ class Releaser
29
+ def self.call(ptr)
30
+ LibC.posix_spawn_file_actions_destroy(ptr)
31
+ LibC.free(ptr)
32
+ end
33
+ end
34
+
35
+ def open(fd, path, oflag, mode)
36
+ error = LibC.posix_spawn_file_actions_addopen(@pointer, fd, path, oflag, mode)
37
+ raise SystemCallError.new("posix_file_actions_addopen", error) unless error == 0
38
+ self
39
+ end
40
+
41
+ def close(fd)
42
+ error = LibC.posix_spawn_file_actions_addclose(@pointer, fd)
43
+ raise SystemCallError.new("posix_file_actions_addclose", error) unless error == 0
44
+ self
45
+ end
46
+
47
+ def dup2(fd, newfd)
48
+ error = LibC.posix_spawn_file_actions_adddup2(@pointer, fd, newfd)
49
+ raise SystemCallError.new("posix_file_actions_adddup2", error) unless error == 0
50
+ self
51
+ end
52
+ end
53
+
54
+ class SpawnAttributes
55
+ attr_reader :pointer
56
+ SIZE = FFI::Platform.mac? ? FFI.type_size(:pointer) : 512
57
+
58
+ def initialize
59
+ @pointer = FFI::AutoPointer.new(LibC.malloc(SIZE), Releaser)
60
+ error = LibC.posix_spawnattr_init(@pointer)
61
+ raise SystemCallError.new("posix_spawnattr_init", error) unless error == 0
62
+ end
63
+
64
+ class Releaser
65
+ def self.call(ptr)
66
+ LibC.posix_spawnattr_destroy(ptr)
67
+ LibC.free(ptr)
68
+ end
69
+ end
70
+
71
+ def pgroup=(group)
72
+ error = LibC.posix_spawnattr_setpgroup(pointer, group)
73
+ raise SystemCallError.new("posix_spawnattr_setpgroup", error) unless error == 0
74
+ group
75
+ end
76
+
77
+ def pgroup
78
+ group = FFI::MemoryPointer.new :pid_t
79
+ error = LibC.posix_spawnattr_getpgroup(pointer, group)
80
+ raise SystemCallError.new("posix_spawnattr_getpgroup", error) unless error == 0
81
+ get_pid(group)
82
+ end
83
+ end
84
+
85
+ def self.posix_spawn(path, file_actions, spawn_attr, argv, env = ENV)
86
+ pid_ptr, argv_ptr, env_ptr = _prepare_spawn_args(argv, env)
87
+ error = LibC.posix_spawnp(pid_ptr, path, file_actions, spawn_attr, argv_ptr, env_ptr)
88
+ raise SystemCallError.new(path, error) unless error == 0
89
+ get_pid(pid_ptr)
90
+ end
91
+
92
+ def self.posix_spawnp(file, file_actions, spawn_attr, argv, env = ENV)
93
+ pid_ptr, argv_ptr, env_ptr = _prepare_spawn_args(argv, env)
94
+ error = LibC.posix_spawnp(pid_ptr, file, file_actions, spawn_attr, argv_ptr, env_ptr)
95
+ raise SystemCallError.new(file, error) unless error == 0
96
+ get_pid(pid_ptr)
97
+ end
98
+
99
+ def self.spawn(*args)
100
+ posix_spawn(args[0], nil, nil, args, ENV)
101
+ end
102
+
103
+ def self.spawnp(*args)
104
+ posix_spawnp(args[0], nil, nil, args, ENV)
105
+ end
106
+
107
+ private
108
+
109
+ class PointerArray
110
+ def initialize
111
+ @ary = []
112
+ end
113
+
114
+ def <<(ptr)
115
+ @ary << ptr
116
+ self
117
+ end
118
+
119
+ def pointer
120
+ if @pointer.nil? || (@pointer.size / @pointer.type_size) <= @ary.length
121
+ ptr = FFI::MemoryPointer.new(:pointer, @ary.length + 1)
122
+ ptr.put_array_of_pointer(0, @ary)
123
+ @pointer = ptr
124
+ end
125
+ @pointer
126
+ end
127
+ end
128
+
129
+ if FFI.type_size(:pid_t) == 4
130
+ def self.get_pid(ptr)
131
+ ptr.get_int32(0)
132
+ end
133
+ else
134
+ def self.get_pid(ptr)
135
+ ptr.get_int64(0)
136
+ end
137
+ end
138
+
139
+ module LibC
140
+ extend FFI::Library
141
+ ffi_lib FFI::Library::LIBC
142
+
143
+ class PointerConverter
144
+ extend FFI::DataConverter
145
+ native_type FFI::Type::POINTER
146
+
147
+ def self.to_native(value, ctx)
148
+ value ? value.pointer : nil
149
+ end
150
+ end
151
+
152
+ typedef PointerConverter, :file_actions
153
+ typedef PointerConverter, :spawn_attr
154
+ typedef PointerConverter, :ptr_array
155
+
156
+ attach_function :posix_spawn, [:pointer, :string, :file_actions, :spawn_attr, :ptr_array, :ptr_array ], :int
157
+ attach_function :posix_spawnp, [:pointer, :string, :file_actions, :spawn_attr, :ptr_array, :ptr_array ], :int
158
+ attach_function :posix_spawn_file_actions_init, [ :pointer ], :int
159
+ attach_function :posix_spawn_file_actions_destroy, [ :pointer ], :int
160
+ attach_function :posix_spawn_file_actions_adddup2, [ :pointer, :int, :int ], :int
161
+ attach_function :posix_spawn_file_actions_addclose, [ :pointer, :int ], :int
162
+ attach_function :posix_spawn_file_actions_addopen, [ :pointer, :int, :string, :int, :mode_t ], :int
163
+ attach_function :posix_spawnattr_init, [ :pointer ], :int
164
+ attach_function :posix_spawnattr_destroy, [ :pointer ], :int
165
+ attach_function :posix_spawnattr_setpgroup, [ :pointer, :pid_t ], :int
166
+ attach_function :posix_spawnattr_getpgroup, [ :pointer, :pointer ], :int
167
+ attach_function :malloc, [ :size_t ], :pointer
168
+ attach_function :free, [ :pointer ], :void
169
+ attach_function :strerror, [ :int ], :string
170
+ end
171
+
172
+ def self._prepare_spawn_args(argv, env)
173
+ pid_ptr = FFI::MemoryPointer.new(:pid_t, 1)
174
+
175
+ args_ary = argv.inject(PointerArray.new) { |ary, str| ary << FFI::MemoryPointer.from_string(str) }
176
+ env_ary = PointerArray.new
177
+ env.each_pair { |key, value| env_ary << FFI::MemoryPointer.from_string("#{key}=#{value}") }
178
+
179
+ [pid_ptr, args_ary, env_ary]
180
+ end
181
+ end
@@ -0,0 +1,50 @@
1
+ # Licensed under the Apache License, Version 2.0 (the "License");
2
+ # you may not use this file except in compliance with the License.
3
+ # You may obtain a copy of the License at
4
+ #
5
+ # http://www.apache.org/licenses/LICENSE-2.0
6
+ #
7
+ # Unless required by applicable law or agreed to in writing, software
8
+ # distributed under the License is distributed on an "AS IS" BASIS,
9
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10
+ # See the License for the specific language governing permissions and
11
+ # limitations under the License.
12
+
13
+ require 'ffi'
14
+
15
+ module Spoon
16
+ extend FFI::Library
17
+ P_NOWAIT = 1
18
+
19
+ ffi_lib 'MSVCRT'
20
+ attach_function :_spawnve, [:int, :string, :pointer, :pointer], :int
21
+ attach_function :_spawnvpe, [:int, :string, :pointer, :pointer], :int
22
+
23
+ ffi_lib 'kernel32'
24
+ ffi_convention :stdcall
25
+ attach_function :_get_process_id, :GetProcessId, [:int], :ulong
26
+
27
+ def self.spawn(*args)
28
+ spawn_args = _prepare_spawn_args(args)
29
+ _get_process_id(_spawnve(*spawn_args))
30
+ end
31
+
32
+ def self.spawnp(*args)
33
+ spawn_args = _prepare_spawn_args(args)
34
+ _get_process_id(_spawnvpe(*spawn_args))
35
+ end
36
+
37
+ private
38
+
39
+ def self._prepare_spawn_args(args)
40
+ args_ary = FFI::MemoryPointer.new(:pointer, args.length + 1)
41
+ str_ptrs = args.map {|str| FFI::MemoryPointer.from_string(str)}
42
+ args_ary.put_array_of_pointer(0, str_ptrs)
43
+
44
+ env_ary = FFI::MemoryPointer.new(:pointer, ENV.length + 1)
45
+ env_ptrs = ENV.map {|key,value| FFI::MemoryPointer.from_string("#{key}=#{value}")}
46
+ env_ary.put_array_of_pointer(0, env_ptrs)
47
+
48
+ [P_NOWAIT, args[0], args_ary, env_ary]
49
+ end
50
+ end
@@ -0,0 +1,7 @@
1
+ require 'rbconfig'
2
+
3
+ if RbConfig::CONFIG['host_os'] =~ /mingw|mswin|bccwin/
4
+ require_relative 'pxnx_daemon_windows'
5
+ else
6
+ require_relative 'pxnx_daemon_unix'
7
+ end
@@ -0,0 +1,5 @@
1
+ module PxnxJruby
2
+ PRODUCT = 'pxGrid'
3
+ VENDOR = 'Cisco'
4
+ VERSION = "0.1.2"
5
+ end