Guest User

Untitled

a guest
Mar 11th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.92 KB | None | 0 0
  1. include Java
  2.  
  3. import javax.management.DynamicMBean
  4. import javax.management.MBeanInfo
  5. import javax.management.ObjectName
  6. import javax.management.remote.JMXServiceURL
  7. import javax.management.remote.JMXConnectorServerFactory
  8.  
  9. class ObjectName
  10. def [](key)
  11. get_key_property(key.to_s)
  12. end
  13. end
  14.  
  15. module javax::management::openmbean::CompositeData
  16. include Enumerable
  17.  
  18. def [](key)
  19. get(key.to_s)
  20. end
  21.  
  22. def each
  23. get_composite_type.key_set.each { |key| yield key }
  24. end
  25.  
  26. def each_pair
  27. get_composite_type.key_set.each { |key| yield key, get(key) }
  28. end
  29. end
  30.  
  31. module JMX
  32. # Holder for beans created from retrieval (namespace protection [tm])
  33. module MBeans
  34. end
  35.  
  36. class MBeanProxy
  37. def self.generate(server, object_name)
  38. class_name = object_name[:type]
  39.  
  40. # Hmmm, I guess type is not everywhere
  41. return nil unless class_name
  42. return nil if class_name =~ /^([a-z_-])/
  43.  
  44. parent = object_name.domain.split(".").inject(MBeans) do |parent, segment|
  45. segment.capitalize!
  46. new_parent = unless parent.const_defined? segment
  47. parent.const_set segment, Module.new
  48. else
  49. parent.const_get segment
  50. end
  51. end
  52.  
  53. if parent.const_defined? class_name
  54. return parent.const_get(class_name).new(server, object_name)
  55. end
  56.  
  57. proxy = Class.new MBeanProxy
  58.  
  59. parent.const_set class_name, proxy
  60.  
  61. proxy.new(server, object_name)
  62. end
  63.  
  64. def initialize(server, object_name)
  65. @server, @object_name = server, object_name
  66.  
  67. define_operations
  68. end
  69.  
  70. def [](name)
  71. @server.getAttribute @object_name, name.to_s
  72. end
  73.  
  74. def []=(name, value)
  75. @server.setAttribute @object_name, Attribute.new(name, value)
  76. end
  77.  
  78. def add_notification_listener(filter=nil, handback=nil, &listener)
  79. @server.addNotificationListener @object_name, listener, filter, handback
  80. end
  81.  
  82. def emove_notification_listener(listener)
  83. @server.removeNotificationListener @object_name, listener
  84. end
  85.  
  86. def method_missing(name, *args)
  87. java_args = java_args(args)
  88. @server.invoke @object_name, name.to_s, java_args, java_types(java_args)
  89. end
  90.  
  91. def inspect
  92.  
  93. end
  94.  
  95. private
  96.  
  97. def define_operations
  98. @server.getMBeanInfo(@object_name).operations.each do |op|
  99. self.class.__send__(:define_method, op.name) do |*args|
  100. java_args = java_args(args)
  101. @server.invoke @object_name, op.name, java_args, java_types(java_args)
  102. end
  103. end
  104. end
  105.  
  106. def java_args(params)
  107. return nil if params.nil?
  108.  
  109. params.to_java(:string)
  110. end
  111.  
  112. def java_types(params)
  113. return nil if params.nil?
  114.  
  115. params.map {|e| Java.ruby_to_java(e).java_class.name }.to_java(:string)
  116. end
  117. end
  118.  
  119. class MBeanServerConnector
  120. def initialize(location, server)
  121. @url = JMXServiceURL.new location
  122. @server = JMXConnectorServerFactory.newJMXConnectorServer @url, nil, server.server
  123.  
  124. if block_given?
  125. start
  126. yield
  127. stop
  128. end
  129. end
  130.  
  131. def active?
  132. @server.isActive
  133. end
  134.  
  135. def start
  136. @server.start
  137. end
  138.  
  139. def stop
  140. @server.stop if active?
  141. end
  142. end
  143.  
  144. # Represents both MBeanServer and MBeanServerConnection
  145. class MBeanServer
  146. import javax.management.remote.JMXConnectorFactory
  147. import javax.management.MBeanServerFactory
  148. import javax.management.Attribute
  149.  
  150. attr_accessor :server
  151. @@classes = {}
  152.  
  153. def initialize(location=nil, username=nil, password=nil)
  154. if (location)
  155. env = username ?
  156. {"jmx.remote.credentials" => [username, password].to_java(:string)} :
  157. nil
  158. url = JMXServiceURL.new location
  159. @server = JMXConnectorFactory.connect(url, env).getMBeanServerConnection
  160. else
  161. @server = MBeanServerFactory.createMBeanServer
  162. end
  163. end
  164.  
  165. def [](object_name)
  166. name = make_object_name object_name
  167.  
  168. unless @server.isRegistered(name)
  169. raise NoSuchBeanError.new("No name: #{object_name}")
  170. end
  171.  
  172. @server.getObjectInstance name
  173. MBeanProxy.generate(@server, name)
  174. end
  175.  
  176. def []=(class_name, object_name)
  177. name = make_object_name object_name
  178.  
  179. @server.createMBean class_name, name, nil, nil
  180.  
  181. MBeanProxy.generate(@server, name)
  182. end
  183.  
  184. def default_domain
  185. @server.getDefaultDomain
  186. end
  187.  
  188. def domains
  189. @server.domains
  190. end
  191.  
  192. def mbean_count
  193. @server.getMBeanCount
  194. end
  195.  
  196. def query_names(name=nil, query=nil)
  197. name = make_object_name name
  198. @server.queryNames(name, query)
  199. end
  200.  
  201. def register_mbean(object, object_name)
  202. name = make_object_name object_name
  203.  
  204. @server.registerMBean(object, name)
  205.  
  206. MBeanProxy.generate(@server, name)
  207. end
  208.  
  209. private
  210.  
  211. def make_object_name(object_name)
  212. return object_name if object_name.kind_of? ObjectName
  213.  
  214. ObjectName.new object_name
  215. rescue
  216. raise ArgumentError.new("Invalid ObjectName #{$!.message}")
  217. end
  218. end
  219.  
  220. class NoSuchBeanError < RuntimeError
  221. end
  222. end
  223.  
  224. class RubyDynamicMBean
  225. include DynamicMBean
  226.  
  227. def initialize(name, description)
  228. @info = MBeanInfo.new name, description, nil, nil, nil, nil
  229. @name, @description = name, description
  230. end
  231.  
  232. def getAttribute(attribute); $stderr.puts "getAttribute"; end
  233. def getAttributes(attributes); $stderr.puts "getAttributes"; end
  234. def getMBeanInfo; $stderr.puts "getMBeanInfo"; @info; end
  235. def invoke(actionName, params=nil, signature=nil);
  236. send(actionName, *params)
  237. end
  238. def setAttribute(attribute); $stderr.puts "setAttribute"; end
  239. def setAttributes(attributes); $stderr.puts "setAttributes"; end
  240. def to_s; "#@name: #@description"; end
  241. def inspect; "#@name: #@description"; end
  242. def toString; "#@name: #@description"; end
  243. end
Add Comment
Please, Sign In to add comment