wbem 0.1.0 → 0.1.1
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.
- data/CHANGELOG.rdoc +5 -0
- data/lib/wbem.rb +26 -7
- data/lib/wbem/cimxml.rb +25 -11
- data/lib/wbem/version.rb +1 -1
- data/lib/wbem/wbem.rb +1 -0
- data/lib/wbem/wsman.rb +22 -20
- metadata +20 -4
data/CHANGELOG.rdoc
CHANGED
data/lib/wbem.rb
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
#
|
2
|
+
# wbem.rb
|
3
|
+
#
|
4
|
+
# A CIM client abstraction layer on top of sfcc (cim/xml) and openwsman (WS-Management)
|
5
|
+
#
|
6
|
+
# Copyright (c) 2011, SUSE Linux Products GmbH
|
7
|
+
# Written by Klaus Kaempf <kkaempf@suse.de>
|
8
|
+
#
|
9
|
+
# Licensed under the MIT license
|
10
|
+
#
|
1
11
|
module Wbem
|
2
12
|
@@debug = nil
|
3
13
|
def Wbem.debug
|
@@ -11,8 +21,6 @@ module Wbem
|
|
11
21
|
require 'wbem/wsman'
|
12
22
|
require 'wbem/cimxml'
|
13
23
|
|
14
|
-
attr_reader :url, :response
|
15
|
-
|
16
24
|
#
|
17
25
|
# Wbem::Client.connect uri, protocol = nil
|
18
26
|
#
|
@@ -23,15 +31,26 @@ module Wbem
|
|
23
31
|
# else - probe connection (cim/xml first)
|
24
32
|
#
|
25
33
|
def self.connect uri, protocol = nil
|
26
|
-
STDERR.puts "Wbem::Client.connect(#{uri},#{protocol})"
|
27
|
-
|
34
|
+
STDERR.puts "Wbem::Client.connect(#{uri},#{protocol})"
|
35
|
+
unless uri.is_a?(URI)
|
36
|
+
u = URI.parse(uri)
|
37
|
+
protocol_given = uri.match(/:\d/)
|
38
|
+
else
|
39
|
+
u = uri
|
40
|
+
protocol_given = uri.port
|
41
|
+
end
|
28
42
|
case protocol
|
29
43
|
when :wsman
|
44
|
+
unless protocol_given
|
45
|
+
u.port = (u.scheme == "http") ? 5985 : 5986
|
46
|
+
end
|
30
47
|
return WsmanClient.new u
|
31
48
|
when :cimxml
|
49
|
+
unless protocol_given
|
50
|
+
u.port = (u.scheme == "http") ? 5988 : 5989
|
51
|
+
end
|
32
52
|
return CimxmlClient.new u
|
33
53
|
end
|
34
|
-
STDERR.puts "no connect, check known ports"
|
35
54
|
# no connect, check known ports
|
36
55
|
case u.port
|
37
56
|
when 8888, 8889, 5985, 5986
|
@@ -39,7 +58,7 @@ module Wbem
|
|
39
58
|
when 5988, 5989
|
40
59
|
return CimxmlClient.new u
|
41
60
|
end
|
42
|
-
STDERR.puts "no known ports"
|
61
|
+
# STDERR.puts "no known ports"
|
43
62
|
port = u.port # keep orig port as we change u.port below
|
44
63
|
[:wsman, :cimxml].each do |protocol|
|
45
64
|
# enforce port if uri provides scheme and host only
|
@@ -51,7 +70,7 @@ module Wbem
|
|
51
70
|
end
|
52
71
|
c = Wbem::Client.connect u, protocol
|
53
72
|
if c
|
54
|
-
STDERR.puts "Connect #{u} as #{c}"
|
73
|
+
# STDERR.puts "Connect #{u} as #{c}"
|
55
74
|
return c
|
56
75
|
end
|
57
76
|
end
|
data/lib/wbem/cimxml.rb
CHANGED
@@ -12,30 +12,44 @@ require "wbem/wbem"
|
|
12
12
|
module Wbem
|
13
13
|
class CimxmlClient < WbemClient
|
14
14
|
require "sfcc"
|
15
|
+
private
|
16
|
+
#
|
17
|
+
# identify client
|
18
|
+
# return identification string
|
19
|
+
# on error return nil and set @response to http response code
|
20
|
+
#
|
21
|
+
def _identify
|
22
|
+
# sfcb has /root/interop:CIM_ObjectManager
|
23
|
+
sfcb_op = objectpath "root/interop", "CIM_ObjectManager"
|
24
|
+
STDERR.puts "Looking for #{sfcb_op}"
|
25
|
+
begin
|
26
|
+
@client.instances(sfcb_op).each do |inst|
|
27
|
+
@product = inst.Description
|
28
|
+
break
|
29
|
+
end
|
30
|
+
rescue Sfcc::Cim::ErrorInvalidClass, Sfcc::Cim::ErrorInvalidNamespace
|
31
|
+
# not sfcb
|
32
|
+
raise "Unknown CIMOM"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
public
|
15
36
|
|
16
37
|
def initialize url
|
17
38
|
super url
|
18
39
|
@client = Sfcc::Cim::Client.connect url
|
40
|
+
STDERR.puts "CIMXML.connect #{url} -> #{@client}" if Wbem.debug
|
41
|
+
_identify
|
19
42
|
end
|
20
43
|
|
21
44
|
def objectpath namespace, classname = nil
|
22
45
|
Sfcc::Cim::ObjectPath.new(namespace, classname)
|
23
46
|
end
|
24
47
|
|
25
|
-
#
|
26
|
-
# identify client
|
27
|
-
# return identification string
|
28
|
-
# on error return nil and set @response to http response code
|
29
|
-
#
|
30
|
-
def identify
|
31
|
-
"CIM/XML client at #{@url.host}:#{@url.port}"
|
32
|
-
end
|
33
|
-
|
34
48
|
#
|
35
49
|
# Return instances for namespace and classname
|
36
50
|
#
|
37
51
|
def each_instance( ns, cn )
|
38
|
-
op =
|
52
|
+
op = objectpath ns, cn
|
39
53
|
begin
|
40
54
|
@client.instances(op).each do |inst|
|
41
55
|
yield inst
|
@@ -76,4 +90,4 @@ class CimxmlClient < WbemClient
|
|
76
90
|
ret
|
77
91
|
end
|
78
92
|
end # class
|
79
|
-
end # module
|
93
|
+
end # module
|
data/lib/wbem/version.rb
CHANGED
data/lib/wbem/wbem.rb
CHANGED
data/lib/wbem/wsman.rb
CHANGED
@@ -31,6 +31,27 @@ end
|
|
31
31
|
|
32
32
|
module Wbem
|
33
33
|
class WsmanClient < WbemClient
|
34
|
+
private
|
35
|
+
#
|
36
|
+
# WS-Identify
|
37
|
+
# returns Openwsman::XmlDoc
|
38
|
+
#
|
39
|
+
def _identify
|
40
|
+
STDERR.puts "Identify client #{@client} with #{@options}" if Wbem.debug
|
41
|
+
doc = @client.identify( @options )
|
42
|
+
unless doc
|
43
|
+
raise RuntimeError.new "Identify failed: HTTP #{@client.response_code}, Err #{@client.last_error}:#{@client.fault_string}"
|
44
|
+
end
|
45
|
+
if doc.fault?
|
46
|
+
fault = doc.fault
|
47
|
+
STDERR.puts "Fault: #{fault.to_xml}"
|
48
|
+
raise fault.to_s
|
49
|
+
end
|
50
|
+
# STDERR.puts "Return #{doc.to_xml}"
|
51
|
+
doc
|
52
|
+
end
|
53
|
+
public
|
54
|
+
|
34
55
|
def initialize uri
|
35
56
|
super uri
|
36
57
|
@url.path = "/wsman" if @url.path.nil? || @url.path.empty?
|
@@ -47,7 +68,7 @@ class WsmanClient < WbemClient
|
|
47
68
|
@client.transport.auth_method = Openwsman::BASIC_AUTH_STR
|
48
69
|
@options = Openwsman::ClientOptions.new
|
49
70
|
|
50
|
-
doc =
|
71
|
+
doc = _identify
|
51
72
|
# STDERR.puts doc.to_xml
|
52
73
|
@protocol_version = doc.ProtocolVersion.text
|
53
74
|
@product_vendor = doc.ProductVendor.text
|
@@ -103,25 +124,6 @@ class WsmanClient < WbemClient
|
|
103
124
|
Openwsman::ObjectPath.new classname, namespace
|
104
125
|
end
|
105
126
|
|
106
|
-
#
|
107
|
-
# WS-Identify
|
108
|
-
# returns Openwsman::XmlDoc
|
109
|
-
#
|
110
|
-
def identify
|
111
|
-
STDERR.puts "Identify client #{@client} with #{@options}" if Wbem.debug
|
112
|
-
doc = @client.identify( @options )
|
113
|
-
unless doc
|
114
|
-
raise RuntimeError.new "Identify failed: HTTP #{@client.response_code}, Err #{@client.last_error}:#{@client.fault_string}"
|
115
|
-
end
|
116
|
-
if doc.fault?
|
117
|
-
fault = doc.fault
|
118
|
-
STDERR.puts "Fault: #{fault.to_xml}"
|
119
|
-
raise fault.to_s
|
120
|
-
end
|
121
|
-
# STDERR.puts "Return #{doc.to_xml}"
|
122
|
-
doc
|
123
|
-
end
|
124
|
-
|
125
127
|
def each_instance( ns, cn )
|
126
128
|
@options.flags = Openwsman::FLAG_ENUMERATION_OPTIMIZATION
|
127
129
|
@options.max_elements = 999
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wbem
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- "Klaus K\xC3\xA4mpf"
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-01-
|
18
|
+
date: 2012-01-18 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -33,6 +33,22 @@ dependencies:
|
|
33
33
|
version: "0.5"
|
34
34
|
type: :development
|
35
35
|
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: sfcc
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 17
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
- 3
|
48
|
+
- 1
|
49
|
+
version: 0.3.1
|
50
|
+
type: :runtime
|
51
|
+
version_requirements: *id002
|
36
52
|
description: ruby-wbem allows to access a CIMOM transparently through CIM/XML or WS-Management
|
37
53
|
email:
|
38
54
|
- kkaempf@suse.de
|