spqr 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.2
1
+ 0.3.3
@@ -18,6 +18,8 @@ require 'logger'
18
18
 
19
19
  module SPQR
20
20
  class App < Qmf::AgentHandler
21
+ VALID_MECHANISMS = %w{ANONYMOUS PLAIN GSSAPI}
22
+
21
23
  class ClassMeta < Struct.new(:object_class, :schema_class) ; end
22
24
 
23
25
  attr_reader :agent
@@ -52,12 +54,11 @@ module SPQR
52
54
  @app_name = (options[:appname] or "SPQR application [#{Process.pid}]")
53
55
  @qmf_host = options[:server]
54
56
  @qmf_port = options[:port]
55
- @qmf_sendUserId = if options.has_key?(:send_user_id)
56
- options[:send_user_id]
57
- else
58
- (options.has_key?(:user) || options.has_key?(:password))
59
- end
60
-
57
+ @qmf_sendUserId = options.has_key?(:send_user_id) ? options[:send_user_id] : (options.has_key?(:user) || options.has_key?(:password))
58
+
59
+ @qmf_explicit_auth = options[:mechanism] && options[:mechanism].upcase
60
+ raise "Invalid authentication mechanism #{@qmf_explicit_auth}" unless (!@qmf_explicit_auth || VALID_MECHANISMS.include?(@qmf_explicit_auth))
61
+
61
62
  @qmf_user = options[:user]
62
63
  @qmf_password = options[:password]
63
64
  end
@@ -195,6 +196,9 @@ module SPQR
195
196
 
196
197
  settings.username = @qmf_user if @qmf_sendUserId
197
198
  settings.password = @qmf_password if @qmf_sendUserId
199
+
200
+ implicit_mechanism = @qmf_sendUserId ? "PLAIN" : "ANONYMOUS"
201
+ settings.mechanism = @explicit_mechanism || implicit_mechanism
198
202
 
199
203
  @connection = Qmf::Connection.new(settings)
200
204
  @log.debug(" +-- @connection created: #{@connection}")
@@ -70,6 +70,12 @@ rm -rf %{buildroot}
70
70
 
71
71
  %changelog
72
72
 
73
+ * Fri Feb 4 2011 <willb@redhat> - 0.3.3-1
74
+ - support for alternate authentication mechanisms (BZ 675323)
75
+
76
+ * Fri Dec 17 2010 <willb@redhat> - 0.3.2-2
77
+ - packaging fixes (BZ 638569)
78
+
73
79
  * Wed Sep 15 2010 <willb@redhat> - 0.3.2-1
74
80
  - updated to version 0.3.2-1
75
81
  - removed spurious debugging output
@@ -35,7 +35,7 @@ module QmfTestHelpers
35
35
  end
36
36
 
37
37
  def event_received(event)
38
- puts "GOT AN EVENT: #{event} at #{Time.now.utc}"
38
+ puts "GOT AN EVENT: #{event} at #{Time.now.utc}" if DEBUG
39
39
  @eq << event
40
40
  end
41
41
  end
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spqr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ hash: 21
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 3
9
+ - 3
10
+ version: 0.3.3
5
11
  platform: ruby
6
12
  authors:
7
13
  - William Benton
@@ -9,19 +15,25 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2010-09-15 00:00:00 -05:00
18
+ date: 2011-02-04 00:00:00 -06:00
13
19
  default_executable: spqr-gen.rb
14
20
  dependencies:
15
21
  - !ruby/object:Gem::Dependency
16
22
  name: rspec
17
- type: :development
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
20
26
  requirements:
21
27
  - - ">="
22
28
  - !ruby/object:Gem::Version
29
+ hash: 13
30
+ segments:
31
+ - 1
32
+ - 2
33
+ - 9
23
34
  version: 1.2.9
24
- version:
35
+ type: :development
36
+ version_requirements: *id001
25
37
  description: SPQR makes it very simple to expose methods on Ruby objects over QMF. You must install ruby-qmf in order to use SPQR.
26
38
  email: willb@redhat.com
27
39
  executables:
@@ -80,21 +92,27 @@ rdoc_options:
80
92
  require_paths:
81
93
  - lib
82
94
  required_ruby_version: !ruby/object:Gem::Requirement
95
+ none: false
83
96
  requirements:
84
97
  - - ">="
85
98
  - !ruby/object:Gem::Version
99
+ hash: 3
100
+ segments:
101
+ - 0
86
102
  version: "0"
87
- version:
88
103
  required_rubygems_version: !ruby/object:Gem::Requirement
104
+ none: false
89
105
  requirements:
90
106
  - - ">="
91
107
  - !ruby/object:Gem::Version
108
+ hash: 3
109
+ segments:
110
+ - 0
92
111
  version: "0"
93
- version:
94
112
  requirements: []
95
113
 
96
114
  rubyforge_project:
97
- rubygems_version: 1.3.5
115
+ rubygems_version: 1.3.7
98
116
  signing_key:
99
117
  specification_version: 3
100
118
  summary: "SPQR: {Schema Processor|Straightforward Publishing} for QMF agents in Ruby"
@@ -109,7 +127,6 @@ test_files:
109
127
  - test/helper.rb
110
128
  - test/test_failbot.rb
111
129
  - test/test_spqr_boolprop.rb
112
- - test/standalone-test.rb
113
130
  - test/test_spqr_clicker.rb
114
131
  - test/test_spqr_integerprop.rb
115
132
  - test/test_user_and_context.rb
@@ -1,330 +0,0 @@
1
- require 'qmf'
2
-
3
- class App < Qmf::AgentHandler
4
- class ClassMeta < Struct.new(:object_class, :schema_class) ; end
5
-
6
- attr_reader :agent
7
-
8
- def initialize(options=nil)
9
- defaults = {:logfile=>STDERR, :loglevel=>Logger::WARN, :notifier=>nil, :server=>"localhost", :port=>5672}
10
-
11
- # convenient shorthands for log levels
12
- loglevels = {:debug => Logger::DEBUG, :info => Logger::INFO, :warn => Logger::WARN, :error => Logger::ERROR, :fatal => Logger::FATAL}
13
-
14
- options = defaults unless options
15
-
16
- # set unsupplied options to defaults
17
- defaults.each do |k,v|
18
- options[k] = v unless options[k]
19
- end
20
-
21
- # fix up shorthands
22
- options[:loglevel] = loglevels[options[:loglevel]] if loglevels[options[:loglevel]]
23
-
24
- logger_opts = ([options[:logfile]] + [options[:logoptions]]).flatten.compact
25
-
26
- @log = Logger.new(*logger_opts)
27
- @log.level = options[:loglevel]
28
-
29
- @log.info("initializing SPQR app....")
30
-
31
- @classes_by_name = {}
32
- @classes_by_id = {}
33
- @pipe = options[:notifier]
34
- @app_name = (options[:appname] or "SPQR application [#{Process.pid}]")
35
- @qmf_host = options[:server]
36
- @qmf_port = options[:port]
37
- @qmf_sendUserId = if options.has_key?(:send_user_id)
38
- options[:send_user_id]
39
- else
40
- (options.has_key?(:user) || options.has_key?(:password))
41
- end
42
-
43
- @qmf_user = options[:user]
44
- @qmf_password = options[:password]
45
- end
46
-
47
- def register(*ks)
48
- manageable_ks = ks.select {|kl| manageable? kl}
49
- unmanageable_ks = ks.select {|kl| not manageable? kl}
50
- manageable_ks.each do |klass|
51
- schemaclass = schematize(klass)
52
-
53
- klass.log = @log
54
-
55
- # XXX
56
- if klass.included_modules.include?(::SPQR::Manageable)
57
- @classes_by_id[klass.class_id] = klass
58
- @classes_by_name[klass.spqr_meta.classname.to_s] = ClassMeta.new(klass, schemaclass)
59
- else
60
- @log.info "NOT registering query/lookup info for #{klass}; is it an event class?"
61
- end
62
-
63
- @log.info("SETTING #{klass.spqr_meta.classname}.app to #{self.inspect}")
64
- klass.app = self
65
- end
66
-
67
- unmanageable_ks.each do |klass|
68
- @log.warn("SPQR can't manage #{klass}, which was registered")
69
- end
70
- end
71
-
72
-
73
- def method_call(context, name, obj_id, args, user_id)
74
- begin
75
- status = 0
76
- message = "OK"
77
- failed = false
78
-
79
- class_id = obj_id.object_num_high
80
- obj_id = obj_id.object_num_low
81
-
82
- Thread.current[:qmf_user_id] = user_id
83
- Thread.current[:qmf_context] = context
84
-
85
- @log.debug "calling method: context=#{context} method=#{name} object_id=#{obj_id}, user=#{user_id}"
86
-
87
- managed_object = find_object(context, class_id, obj_id)
88
- @log.debug("managed object is #{managed_object}")
89
- managed_method = managed_object.class.spqr_meta.mmethods[name.to_sym]
90
-
91
- raise RuntimeError.new("#{managed_object.class} does not have #{name} exposed as a manageable method; has #{managed_object.class.spqr_meta.mmethods.inspect}") unless managed_method
92
-
93
- # Extract actual parameters from the Qmf::Arguments structure into a proper ruby list
94
- @log.debug("actual params are: #{args.instance_variable_get(:@by_hash).inspect}") rescue nil
95
- actuals_in = managed_method.formals_in.inject([]) {|acc,nm| acc << args[nm]}
96
- actual_count = actuals_in.size
97
-
98
- @log.debug("managed_object.respond_to? #{managed_method.name.to_sym} ==> #{managed_object.respond_to? managed_method.name.to_sym}")
99
- @log.debug("managed_object.class.spqr_meta.mmethods.include? #{name.to_sym} ==> #{managed_object.class.spqr_meta.mmethods.include? name.to_sym}")
100
- @log.debug("formals: #{managed_method.formals_in.inspect}")
101
- @log.debug("actuals: #{actuals_in.inspect}")
102
-
103
- actuals_out = []
104
-
105
- begin
106
- actuals_out = case actual_count
107
- when 0 then managed_object.send(name.to_sym)
108
- when 1 then managed_object.send(name.to_sym, actuals_in[0])
109
- else managed_object.send(name.to_sym, *actuals_in)
110
- end
111
-
112
- raise RuntimeError.new("#{managed_object.class} did not return the appropriate number of return values; got '#{actuals_out.inspect}', but expected #{managed_method.types_out.inspect}") unless result_valid(actuals_out, managed_method)
113
-
114
- rescue ::SPQR::ManageableObjectError => failure
115
- @log.info "#{name} called SPQR::Manageable#fail: #{failure}"
116
- status = failure.status
117
- message = failure.message || "ERROR"
118
- # XXX: failure.result is currently ignored
119
- actuals_out = failure.result || managed_method.formals_out.inject([]) {|acc, val| acc << args[val]; acc}
120
- failed = true
121
- end
122
-
123
- if managed_method.formals_out.size == 0
124
- actuals_out = [] # ignore return value in this case
125
- elsif managed_method.formals_out.size == 1
126
- actuals_out = [actuals_out] # wrap this up in a list
127
- end
128
-
129
- @log.debug("formals_out == #{managed_method.formals_out.inspect}")
130
- @log.debug("actuals_out == #{actuals_out.inspect}")
131
-
132
- unless failed
133
- # Copy any out parameters from return value to the
134
- # Qmf::Arguments structure; see XXX above
135
- managed_method.formals_out.zip(actuals_out).each do |k,v|
136
- @log.debug("fixing up out params: #{k.inspect} --> #{v.inspect}")
137
- encoded_val = encode_object(v)
138
- args[k] = encoded_val
139
- end
140
- end
141
-
142
- @agent.method_response(context, status, message, args)
143
- rescue Exception => ex
144
- @log.error "Error calling #{name}: #{ex}"
145
- @log.error " " + ex.backtrace.join("\n ")
146
- @agent.method_response(context, 1, "ERROR: #{ex}", args)
147
- end
148
- end
149
-
150
- def get_query(context, query, user_id)
151
- @log.debug "query: user=#{user_id} context=#{context} class=#{query.class_name} object_num=#{query.object_id.object_num_low if query.object_id} details=#{query} haveSelect=#{query.impl and query.impl.haveSelect} getSelect=#{query.impl and query.impl.getSelect} (#{query.impl and query.impl.getSelect and query.impl.getSelect.methods.inspect})"
152
-
153
- cmeta = @classes_by_name[query.class_name]
154
- objs = []
155
-
156
- # XXX: are these cases mutually exclusive?
157
-
158
- # handle queries for a certain class
159
- if cmeta
160
- objs = objs + cmeta.object_class.find_all.collect {|obj| qmfify(obj)}
161
- end
162
-
163
- # handle queries for a specific object
164
- o = find_object(context, query.object_id.object_num_high, query.object_id.object_num_low) rescue nil
165
- if o
166
- objs << qmfify(o)
167
- end
168
-
169
- objs.each do |obj|
170
- @log.debug("query_response of: #{obj.inspect}")
171
- @agent.query_response(context, obj) rescue @log.error($!.inspect)
172
- end
173
-
174
- @log.debug("completing query....")
175
- @agent.query_complete(context)
176
- end
177
-
178
- def main
179
- settings = Qmf::ConnectionSettings.new
180
- settings.host = @qmf_host
181
- settings.port = @qmf_port
182
- settings.sendUserId = @qmf_sendUserId
183
-
184
- settings.username = @qmf_user if @qmf_sendUserId
185
- settings.password = @qmf_password if @qmf_sendUserId
186
-
187
- @schemaclass = Qmf::SchemaObjectClass.new("test", "testclass")
188
-
189
- @connection = Qmf::Connection.new(settings)
190
- @log.debug(" +-- @connection created: #{@connection}")
191
- @log.debug(" +-- app name is '#{@app_name}'")
192
-
193
- @agent = Qmf::Agent.new(self, @app_name)
194
- @log.debug(" +-- @agent created: #{@agent}")
195
-
196
- @agent.set_connection(@connection)
197
- @log.debug(" +-- @agent.set_connection called")
198
-
199
- @log.debug(" +-- registering classes...")
200
- @classes_by_name.values.each do |km|
201
- @agent.register_class(km.schema_class)
202
- @log.debug(" +--+-- #{km.schema_class.package_name} #{km.schema_class.class_name} registered")
203
- end
204
-
205
- @log.debug("entering orbit....")
206
-
207
- sleep
208
- end
209
-
210
- private
211
-
212
- def result_valid(actuals, mm)
213
- (actuals.kind_of?(Array) and mm.formals_out.size == actuals.size) or mm.formals_out.size <= 1
214
- end
215
-
216
- def qmf_arguments_to_hash(args)
217
- result = {}
218
- args.each do |k,v|
219
- result[k] = v
220
- end
221
- result
222
- end
223
-
224
- def encode_object(o)
225
- return o unless o.kind_of? ::SPQR::Manageable
226
- @agent.alloc_object_id(*(o.qmf_id))
227
- end
228
-
229
- def find_object(ctx, c_id, obj_id)
230
- # XXX: context is currently ignored
231
- @log.debug("in find_object; class ID is #{c_id}, object ID is #{obj_id}...")
232
- klass = @classes_by_id[c_id]
233
- @log.debug("found class #{klass.inspect}")
234
- klass.find_by_id(obj_id) if klass
235
- end
236
-
237
- def schematize(klass)
238
- @log.info("Making a QMF schema for #{klass.spqr_meta.classname}")
239
-
240
- if klass.respond_to? :schematize
241
- @log.info("#{klass.spqr_meta.classname} knows how to schematize itself; it's probably an event class")
242
- return klass.schematize
243
- else
244
- @log.info("#{klass.spqr_meta.classname} doesn't know how to schematize itself; it's probably an object class")
245
- return schematize_object_class(klass)
246
- end
247
- end
248
-
249
- def schematize_object_class(klass)
250
- meta = klass.spqr_meta
251
- package = meta.package.to_s
252
- classname = meta.classname.to_s
253
- @log.info("+-- class #{classname} is in package #{package}")
254
-
255
- sc = Qmf::SchemaObjectClass.new(package, classname)
256
-
257
- meta.manageable_methods.each do |mm|
258
- @log.info("+-- creating a QMF schema for method #{mm}")
259
- m_opts = mm.options
260
- m_opts[:desc] ||= mm.description if mm.description
261
-
262
- method = Qmf::SchemaMethod.new(mm.name.to_s, m_opts)
263
-
264
- mm.args.each do |arg|
265
- @log.info("| +-- creating a QMF schema for arg #{arg}")
266
-
267
- encode_argument(arg, method)
268
- end
269
-
270
- sc.add_method(method)
271
- end
272
-
273
- add_attributes(sc, meta.properties, :add_property, Qmf::SchemaProperty)
274
- add_attributes(sc, meta.statistics, :add_statistic, Qmf::SchemaStatistic)
275
-
276
- sc
277
- end
278
-
279
- def add_attributes(sc, collection, msg, klass, what=nil)
280
- what ||= (msg.to_s.split("_").pop rescue "property or statistic")
281
- collection.each do |basic|
282
- basic_name = basic.name.to_s
283
- basic_type = get_xml_constant(basic.kind.to_s, ::SPQR::XmlConstants::Type)
284
- @log.debug("+-- creating a QMF schema for #{what} #{basic_name} (#{basic_type}) with options #{basic.options.inspect}")
285
- sc.send(msg, klass.new(basic_name, basic_type, basic.options))
286
- end
287
- end
288
-
289
- include ::SPQR::Util
290
-
291
- # turns an instance of a managed object into a QmfObject
292
- def qmfify(obj)
293
- @log.debug("trying to qmfify #{obj}: qmf_oid is #{obj.qmf_oid} and class_id is #{obj.class.class_id}")
294
- cm = @classes_by_name[obj.class.spqr_meta.classname.to_s]
295
- return nil unless cm
296
-
297
- qmfobj = Qmf::AgentObject.new(cm.schema_class)
298
-
299
- set_attrs(qmfobj, obj)
300
-
301
- @log.debug("calling alloc_object_id(#{obj.qmf_oid}, #{obj.class.class_id})")
302
- oid = @agent.alloc_object_id(obj.qmf_oid, obj.class.class_id)
303
-
304
- @log.debug("calling qmfobj.set_object_id(#{oid})")
305
- qmfobj.set_object_id(oid)
306
-
307
- @log.debug("returning from qmfify")
308
- qmfobj
309
- end
310
-
311
- def set_attrs(qo, o)
312
- return unless o.class.respond_to? :spqr_meta
313
-
314
- attrs = o.class.spqr_meta.properties + o.class.spqr_meta.statistics
315
-
316
- attrs.each do |a|
317
- getter = a.name.to_s
318
- @log.debug("setting property/statistic #{getter} to its value from #{o}: #{o.send(getter) if o.respond_to?(getter)}")
319
- value = o.send(getter) if o.respond_to?(getter)
320
-
321
- if value || a.kind == :bool
322
- # XXX: remove this line when/if Manageable includes an
323
- # appropriate impl method
324
- value = encode_object(value) if value.kind_of?(::SPQR::Manageable)
325
- qo[getter] = value
326
- end
327
-
328
- end
329
- end
330
- end