Guest User

Untitled

a guest
Apr 16th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.94 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(listener, *rest)
  79. filter, handback = *rest
  80. @server.addNotificationListener @object_name, listener, filter, handback
  81. end
  82.  
  83. def emove_notification_listener(listener)
  84. @server.removeNotificationListener @object_name, listener
  85. end
  86.  
  87. def method_missing(name, *args)
  88. java_args = java_args(args)
  89. @server.invoke @object_name, name.to_s, java_args, java_types(java_args)
  90. end
  91.  
  92. def inspect
  93.  
  94. end
  95.  
  96. private
  97.  
  98. def define_operations
  99. @server.getMBeanInfo(@object_name).operations.each do |op|
  100. self.class.__send__(:define_method, op.name) do |*args|
  101. java_args = java_args(args)
  102. @server.invoke @object_name, op.name, java_args, java_types(java_args)
  103. end
  104. end
  105. end
  106.  
  107. def java_args(params)
  108. return nil if params.nil?
  109.  
  110. params.to_java(:string)
  111. end
  112.  
  113. def java_types(params)
  114. return nil if params.nil?
  115.  
  116. params.map {|e| Java.ruby_to_java(e).java_class.name }.to_java(:string)
  117. end
  118. end
  119.  
  120. class MBeanServerConnector
  121. def initialize(location, server)
  122. @url = JMXServiceURL.new location
  123. @server = JMXConnectorServerFactory.newJMXConnectorServer @url, nil, server.server
  124.  
  125. if block_given?
  126. start
  127. yield
  128. stop
  129. end
  130. end
  131.  
  132. def active?
  133. @server.isActive
  134. end
  135.  
  136. def start
  137. @server.start
  138. end
  139.  
  140. def stop
  141. @server.stop if active?
  142. end
  143. end
  144.  
  145. # Represents both MBeanServer and MBeanServerConnection
  146. class MBeanServer
  147. import javax.management.remote.JMXConnectorFactory
  148. import javax.management.MBeanServerFactory
  149. import javax.management.Attribute
  150.  
  151. attr_accessor :server
  152. @@classes = {}
  153.  
  154. def initialize(location=nil, username=nil, password=nil)
  155. if (location)
  156. env = username ?
  157. {"jmx.remote.credentials" => [username, password].to_java(:string)} :
  158. nil
  159. url = JMXServiceURL.new location
  160. @server = JMXConnectorFactory.connect(url, env).getMBeanServerConnection
  161. else
  162. @server = MBeanServerFactory.createMBeanServer
  163. end
  164. end
  165.  
  166. def [](object_name)
  167. name = make_object_name object_name
  168.  
  169. unless @server.isRegistered(name)
  170. raise NoSuchBeanError.new("No name: #{object_name}")
  171. end
  172.  
  173. @server.getObjectInstance name
  174. MBeanProxy.generate(@server, name)
  175. end
  176.  
  177. def []=(class_name, object_name)
  178. name = make_object_name object_name
  179.  
  180. @server.createMBean class_name, name, nil, nil
  181.  
  182. MBeanProxy.generate(@server, name)
  183. end
  184.  
  185. def default_domain
  186. @server.getDefaultDomain
  187. end
  188.  
  189. def domains
  190. @server.domains
  191. end
  192.  
  193. def mbean_count
  194. @server.getMBeanCount
  195. end
  196.  
  197. def query_names(name=nil, query=nil)
  198. name = make_object_name name
  199. @server.queryNames(name, query)
  200. end
  201.  
  202. def register_mbean(object, object_name)
  203. name = make_object_name object_name
  204.  
  205. @server.registerMBean(object, name)
  206.  
  207. MBeanProxy.generate(@server, name)
  208. end
  209.  
  210. private
  211.  
  212. def make_object_name(object_name)
  213. return object_name if object_name.kind_of? ObjectName
  214.  
  215. ObjectName.new object_name
  216. rescue
  217. raise ArgumentError.new("Invalid ObjectName #{$!.message}")
  218. end
  219. end
  220.  
  221. class NoSuchBeanError < RuntimeError
  222. end
  223. end
  224.  
  225. class RubyDynamicMBean
  226. include DynamicMBean
  227.  
  228. def initialize(name, description)
  229. @info = MBeanInfo.new name, description, nil, nil, nil, nil
  230. @name, @description = name, description
  231. end
  232.  
  233. def getAttribute(attribute); $stderr.puts "getAttribute"; end
  234. def getAttributes(attributes); $stderr.puts "getAttributes"; end
  235. def getMBeanInfo; $stderr.puts "getMBeanInfo"; @info; end
  236. def invoke(actionName, params=nil, signature=nil);
  237. send(actionName, *params)
  238. end
  239. def setAttribute(attribute); $stderr.puts "setAttribute"; end
  240. def setAttributes(attributes); $stderr.puts "setAttributes"; end
  241. def to_s; "#@name: #@description"; end
  242. def inspect; "#@name: #@description"; end
  243. def toString; "#@name: #@description"; end
  244. end
Add Comment
Please, Sign In to add comment