blob: 0a9a27480f99d25c88ac9f18436272472acfb67b [file] [log] [blame]
# winenum.rb
# enumerate/pull/release for Win32_SoftwareElement
#
#
$:.unshift "../../../bindings/ruby"
$:.unshift "../../../build/bindings/ruby"
$:.unshift "../.libs"
require 'rexml/document'
require 'openwsman/openwsman'
require '_client'
WIDTH = 25
#
# extract reference information from a node
#
# returns a [ <uri>, <selectors> ] pair
#
def get_reference_from node
uri = node.ReferenceParameters.ResourceURI
selectors = {}
node.ReferenceParameters.SelectorSet.each do |s|
name = s.attr_find(nil, "Name")
selectors[name] = s.text
end
[uri,selectors]
end
def enum_properties client, opt, classname, *properties
options = Openwsman::ClientOptions.new
uri = "http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/#{classname}"
result = client.enumerate( options, nil, uri )
# puts result if opt.include? :raw
puts classname
unless properties.empty?
printf "%-#{WIDTH}s" * properties.size, *properties
puts
puts "-" * WIDTH * properties.size
end
results = 0
faults = 0
context = nil
loop do
context = result.context
break unless context
result = client.pull( options, nil, uri, context )
break unless result
body = result.body
if result.fault?
puts "Got fault"
faults += 1
break
end
items = body.PullResponse.Items.send classname
next unless items
results += 1
puts items if opt.include? :raw
node = items.send classname
if properties.empty?
# puts node.string
node.each do |c|
puts " #{c.name}: #{c.text}"
end
else
values = []
properties.each do |p|
values << node.send(p)
end
printf "%-#{WIDTH}s" * values.size, *values
puts
end
end
client.release( options, uri, context ) if context
puts "#{results} results, #{faults} faults"
end
client = Client.open
classname = ""
opts = []
loop do
classname = ARGV.shift
break unless classname
break unless classname[0,1] == "-"
opts << classname[2..-1].to_sym
end
enum_properties client, opts, classname, *ARGV