ocular 0.1.3 → 0.1.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 44118cd5f02b3dc8ef6388b180368295a0d9fa33
4
- data.tar.gz: f9742f999a9dee9e10afcc0b1fde77c91dd7a0b3
3
+ metadata.gz: 80d3eab4870432f28e3a67ed391012aa4cbd0d3d
4
+ data.tar.gz: d899c2f9ec2020c3d18bf82dc61543bbb8e1163c
5
5
  SHA512:
6
- metadata.gz: e394d8d393db01c4fe7e3d00e57a29b8150eff97eb495c61897f4b00e3bebac985f82931060a08821d2d4230e23990f2d4a85c5a592e7625c2fb6e9366ba890f
7
- data.tar.gz: a4d83f22add7eeefda8f3bfb36ad3e6016b981b8c20574982efe94a9d661e0f418eba0ce0eac000ed9ee62f2301d51c3b6ba5e09926c07ac0140f092a5685e88
6
+ metadata.gz: b51e2835fb8aa855eeb85a342782d6e0d7c2e7a5b8293f0fe4aaae6c135727a82952a8b4fd85296eec3f5f3802175d6db511274097f6eaebc1a063e9d82282a1
7
+ data.tar.gz: c8a79305a5259ea4d6f782a81c91ea41c918910603105d885db97cc2b39d14f1a74a326d2a8584b1e26254e0fdb58475cdf7088535b6aef10b5a71d95efd22ae
data/bin/ocular CHANGED
@@ -21,7 +21,7 @@ class OptparseExample
21
21
  options.transfer_type = :auto
22
22
  options.verbose = false
23
23
  options.server = false
24
- options.settings = "~/.ocular.yaml"
24
+ options.settings = nil
25
25
  options.root = nil
26
26
 
27
27
  opt_parser = OptionParser.new do |opts|
@@ -55,7 +55,7 @@ class OptparseExample
55
55
  options.root = path
56
56
  end
57
57
 
58
- opts.on("--settings FILE", "Full path and file name to the settings yaml file. Default: #{options.settings}") do |path|
58
+ opts.on("--settings FILE", "Full path and file name to the settings yaml file.") do |path|
59
59
  options.settings = path
60
60
  end
61
61
 
@@ -69,7 +69,7 @@ end # class OptparseExample
69
69
 
70
70
  options = OptparseExample.parse(ARGV)
71
71
 
72
- Ocular::Settings.load_from_file(File.expand_path(options.settings))
72
+ Ocular::Settings.load_from_file(Ocular::Settings.find_settings_file_from_system(options.settings))
73
73
 
74
74
  if options.server
75
75
  if !options.root && !Ocular::Settings.get(:script_root)
@@ -96,7 +96,7 @@ else
96
96
  proxy = ef.load_from_file(ARGV.shift)
97
97
 
98
98
  context = Ocular::DSL::RunContext.new
99
- eventbase = proxy.events[0]
99
+ eventbase = proxy.events["onEvent"][nil]
100
100
  eventbase.exec(context)
101
101
 
102
102
  end
@@ -27,6 +27,19 @@ class Ocular
27
27
  })
28
28
  end
29
29
 
30
+ def find_servers_in_autoscaling_groups(substring)
31
+ instances = []
32
+ for group in autoscaling.groups
33
+ if group.id.include?(substring)
34
+ for i in group.instances
35
+ instances << aws.servers.get(i.id)
36
+ end
37
+ end
38
+ end
39
+
40
+ return instances
41
+ end
42
+
30
43
  end
31
44
 
32
45
  end
@@ -7,6 +7,7 @@ class Ocular
7
7
  attr_accessor :run_id
8
8
  attr_accessor :proxy
9
9
  attr_accessor :class_name
10
+ attr_accessor :event_signature
10
11
 
11
12
  include Ocular::DSL::Logging
12
13
  include Ocular::DSL::SSH
@@ -14,6 +15,7 @@ class Ocular
14
15
  def initialize
15
16
  @run_id = SecureRandom.uuid()
16
17
  @logger = Ocular::DSL::Logger.new
18
+ @cleanups = []
17
19
  end
18
20
 
19
21
  def method_missing(method_sym, *arguments, &block)
@@ -23,6 +25,16 @@ class Ocular
23
25
  raise NoMethodError("undefined method `#{method_sym}` in event #{self.class_name}")
24
26
  end
25
27
  end
28
+
29
+ def register_cleanup(&block)
30
+ @cleanups << block
31
+ end
32
+
33
+ def cleanup()
34
+ for i in @cleanups
35
+ i.call()
36
+ end
37
+ end
26
38
  end
27
39
  end
28
40
  end
@@ -7,20 +7,63 @@ class Ocular
7
7
  module DSL
8
8
 
9
9
  class EventBase
10
- include Ocular::DSL::SSH
11
- include Ocular::DSL::Fog
12
- include Ocular::DSL::Logging
13
10
 
14
- attr_accessor :proxy
11
+ class Results
12
+ attr_accessor :response
13
+ attr_accessor :error
14
+ end
15
15
 
16
+ attr_accessor :proxy
16
17
 
17
18
  def initialize(&block)
18
- @callback = block
19
+ @callback = block
20
+ end
21
+
22
+ def exec(context, do_fork = self.proxy.do_fork)
23
+ context.proxy = self.proxy
24
+ if do_fork
25
+ return exec_fork(context)
26
+ else
27
+ return exec_nofork(context)
28
+ end
29
+ end
30
+
31
+ def exec_fork(context)
32
+ reader, writer = IO::pipe
33
+ child_pid = fork do
34
+ reader.close
35
+ r = Results.new
36
+
37
+ begin
38
+ retval = context.instance_eval(&@callback)
39
+
40
+ # This check is to make sure that whatever we return that it can be serialised
41
+ if String === retval or Array === retval
42
+ r.response = retval
43
+ end
44
+
45
+ rescue Exception => error
46
+ r.error = error
47
+ end
48
+
49
+ response_data = Marshal.dump(r)
50
+ writer.puts(response_data)
51
+ writer.close
52
+ end
53
+ writer.close
54
+
55
+ Process.wait(child_pid)
56
+ r = Marshal.load(reader.read)
57
+ reader.close
58
+
59
+ if r.error
60
+ raise r.error
61
+ end
62
+ return r.response
19
63
  end
20
64
 
21
- def exec(run_context)
22
- run_context.proxy = self.proxy
23
- run_context.instance_eval(&@callback)
65
+ def exec_nofork(context)
66
+ return context.instance_eval(&@callback)
24
67
  end
25
68
 
26
69
  end
@@ -6,14 +6,15 @@ class Ocular
6
6
  module Event
7
7
  class DefinitionProxy
8
8
  attr_accessor :events
9
- attr_reader :script_name
10
- attr_accessor :handlers
9
+ attr_reader :script_name, :do_fork
10
+ attr_accessor :handlers, :events
11
11
 
12
12
  def initialize(script_name, handlers)
13
13
  @script_name = script_name
14
- @events = []
14
+ @events = {}
15
15
  @logger = Ocular::DSL::Logger.new
16
16
  @handlers = handlers
17
+ @do_fork = true
17
18
  end
18
19
 
19
20
  include Ocular::Mixin::FromFile
@@ -22,10 +23,14 @@ class Ocular
22
23
  include Ocular::DSL::Fog
23
24
  include Ocular::Inputs::HTTP::DSL
24
25
 
25
- def onEvent(factory_class, &block)
26
+ def fork(value)
27
+ @do_fork = value
28
+ end
29
+
30
+ def onEvent(type, &block)
26
31
  eventbase = Ocular::DSL::EventBase.new(&block)
27
32
  eventbase.proxy = self
28
- @events << eventbase
33
+ (@events["onEvent"] ||= {})[type] = eventbase
29
34
  end
30
35
  end
31
36
 
@@ -1,8 +1,14 @@
1
- require 'sinatra/base'
2
1
  require 'puma'
3
2
  require 'rack'
4
3
  require 'rack/server'
4
+ require 'rack/protection'
5
+ require 'uri'
6
+
5
7
  require 'ocular/inputs/base.rb'
8
+ require 'ocular/dsl/runcontext.rb'
9
+
10
+ # Some of this code is copied from the excellent Sinatra Ruby web library by
11
+ # Blake Mizerany and Konstantin Haase.
6
12
 
7
13
  class Ocular
8
14
  module Inputs
@@ -11,19 +17,34 @@ class Ocular
11
17
 
12
18
  module DSL
13
19
 
14
- def onGET(path, opts = {}, &block)
20
+
21
+ def onGET(path, opts = {}, &block)
15
22
  handler = handlers.get(::Ocular::Inputs::HTTP::Input)
16
- handler.add_get(script_name, path, opts, &block)
23
+ handler.add_get(script_name, path, opts, self, &block)
17
24
  end
18
25
 
19
26
  def onPOST(path, opts = {}, &block)
20
27
  handler = handlers.get(::Ocular::Inputs::HTTP::Input)
21
- handler.add_post(script_name, path, opts, &block)
28
+ handler.add_post(script_name, path, opts, self, &block)
22
29
  end
23
30
 
31
+ def onDELETE(path, opts = {}, &block)
32
+ handler = handlers.get(::Ocular::Inputs::HTTP::Input)
33
+ handler.add_delete(script_name, path, opts, self, &block)
34
+ end
24
35
  end
25
36
 
26
37
  class Input < ::Ocular::Inputs::Base
38
+
39
+ attr_reader :routes
40
+
41
+ class WebRunContext < ::Ocular::DSL::RunContext
42
+ attr_accessor :request, :response, :params, :env
43
+ end
44
+
45
+
46
+ URI_INSTANCE = URI::Parser.new
47
+
27
48
  DEFAULT_SETTINGS = {
28
49
  :host => '0.0.0.0',
29
50
  :port => 8080,
@@ -31,19 +52,167 @@ class Ocular
31
52
  :silent => false
32
53
  }
33
54
 
34
- class SinatraApp < Sinatra::Base
35
- configure do
36
- set :server, :puma
55
+ class Request < Rack::Request
56
+ HEADER_PARAM = /\s*[\w.]+=(?:[\w.]+|"(?:[^"\\]|\\.)*")?\s*/
57
+ HEADER_VALUE_WITH_PARAMS = /(?:(?:\w+|\*)\/(?:\w+(?:\.|\-|\+)?|\*)*)\s*(?:;#{HEADER_PARAM})*/
58
+
59
+ # Returns an array of acceptable media types for the response
60
+ def accept
61
+ @env['sinatra.accept'] ||= begin
62
+ if @env.include? 'HTTP_ACCEPT' and @env['HTTP_ACCEPT'].to_s != ''
63
+ @env['HTTP_ACCEPT'].to_s.scan(HEADER_VALUE_WITH_PARAMS).
64
+ map! { |e| AcceptEntry.new(e) }.sort
65
+ else
66
+ [AcceptEntry.new('*/*')]
67
+ end
68
+ end
69
+ end
70
+
71
+ def accept?(type)
72
+ preferred_type(type).to_s.include?(type)
73
+ end
74
+
75
+ def preferred_type(*types)
76
+ accepts = accept # just evaluate once
77
+ return accepts.first if types.empty?
78
+ types.flatten!
79
+ return types.first if accepts.empty?
80
+ accepts.detect do |pattern|
81
+ type = types.detect { |t| File.fnmatch(pattern, t) }
82
+ return type if type
83
+ end
84
+ end
85
+
86
+ alias secure? ssl?
87
+
88
+ def forwarded?
89
+ @env.include? "HTTP_X_FORWARDED_HOST"
90
+ end
91
+
92
+ def safe?
93
+ get? or head? or options? or trace?
94
+ end
95
+
96
+ def idempotent?
97
+ safe? or put? or delete? or link? or unlink?
98
+ end
99
+
100
+ def link?
101
+ request_method == "LINK"
102
+ end
103
+
104
+ def unlink?
105
+ request_method == "UNLINK"
106
+ end
107
+
108
+ private
109
+
110
+ class AcceptEntry
111
+ attr_accessor :params
112
+ attr_reader :entry
113
+
114
+ def initialize(entry)
115
+ params = entry.scan(HEADER_PARAM).map! do |s|
116
+ key, value = s.strip.split('=', 2)
117
+ value = value[1..-2].gsub(/\\(.)/, '\1') if value.start_with?('"')
118
+ [key, value]
119
+ end
120
+
121
+ @entry = entry
122
+ @type = entry[/[^;]+/].delete(' ')
123
+ @params = Hash[params]
124
+ @q = @params.delete('q') { 1.0 }.to_f
125
+ end
126
+
127
+ def <=>(other)
128
+ other.priority <=> self.priority
129
+ end
130
+
131
+ def priority
132
+ # We sort in descending order; better matches should be higher.
133
+ [ @q, -@type.count('*'), @params.size ]
134
+ end
135
+
136
+ def to_str
137
+ @type
138
+ end
139
+
140
+ def to_s(full = false)
141
+ full ? entry : to_str
142
+ end
143
+
144
+ def respond_to?(*args)
145
+ super or to_str.respond_to?(*args)
146
+ end
147
+
148
+ def method_missing(*args, &block)
149
+ to_str.send(*args, &block)
150
+ end
151
+ end
152
+ end
153
+
154
+ class NotFound < NameError #:nodoc:
155
+ def http_status; 404 end
156
+ end
157
+
158
+ # The response object. See Rack::Response and Rack::Response::Helpers for
159
+ # more info:
160
+ # http://rubydoc.info/github/rack/rack/master/Rack/Response
161
+ # http://rubydoc.info/github/rack/rack/master/Rack/Response/Helpers
162
+ class Response < Rack::Response
163
+ DROP_BODY_RESPONSES = [204, 205, 304]
164
+ def initialize(*)
165
+ super
166
+ headers['Content-Type'] ||= 'text/html'
167
+ end
168
+
169
+ def body=(value)
170
+ value = value.body while Rack::Response === value
171
+ @body = String === value ? [value.to_str] : value
37
172
  end
38
173
 
39
- get '/noop' do
40
- puts "/check called"
41
- "OK\n"
174
+ def each
175
+ block_given? ? super : enum_for(:each)
176
+ end
177
+
178
+ def finish
179
+ result = body
180
+
181
+ if drop_content_info?
182
+ headers.delete "Content-Length"
183
+ headers.delete "Content-Type"
184
+ end
185
+
186
+ if drop_body?
187
+ close
188
+ result = []
189
+ end
190
+
191
+ if calculate_content_length?
192
+ # if some other code has already set Content-Length, don't muck with it
193
+ # currently, this would be the static file-handler
194
+ headers["Content-Length"] = body.inject(0) { |l, p| l + p.bytesize }.to_s
195
+ end
196
+
197
+ [status.to_i, headers, result]
198
+ end
199
+
200
+ private
201
+
202
+ def calculate_content_length?
203
+ headers["Content-Type"] and not headers["Content-Length"] and Array === body
204
+ end
205
+
206
+ def drop_content_info?
207
+ status.to_i / 100 == 1 or drop_body?
208
+ end
209
+
210
+ def drop_body?
211
+ DROP_BODY_RESPONSES.include?(status.to_i)
42
212
  end
43
213
  end
44
214
 
45
215
  def generate_uri_from_names(script_name, path)
46
- puts "generate_uri_from_names: #{script_name}, #{path}"
47
216
  if path[0] == "/"
48
217
  path = path[1..-1]
49
218
  end
@@ -57,37 +226,286 @@ class Ocular
57
226
  return "/" + name
58
227
  end
59
228
 
60
- def add_get(script_name, path, options = {}, &block)
229
+ def add_get(script_name, path, options, proxy, &block)
61
230
  name = generate_uri_from_names(script_name, path)
62
- puts "adding get at #{name}"
63
- @app_class.get(name, options, &block)
231
+ route('GET', name, options, proxy, &block)
64
232
  end
65
233
 
66
- def add_post(script_name, path, options = {}, &block)
67
- name = generate_uri_from_names(script_name, path)
68
- @app_class.post(name, options, &block)
234
+ def add_post(script_name, path, options, proxy, &block)
235
+ name = generate_uri_from_names(script_name, path)
236
+ route('POST', name, options, proxy, &block)
237
+ end
238
+
239
+ def add_delete(script_name, path, options, proxy, &block)
240
+ name = generate_uri_from_names(script_name, path)
241
+ route('DELETE', name, options, proxy, &block)
242
+ end
243
+
244
+ def build_signature(pattern, keys, &block)
245
+ return [pattern, keys, block]
246
+ end
247
+
248
+ def route(verb, path, options, proxy, &block)
249
+ eventbase = Ocular::DSL::EventBase.new(&block)
250
+ eventbase.proxy = proxy
251
+ (proxy.events[verb] ||= {})[path] = eventbase
252
+
253
+ pattern, keys = compile(path)
254
+
255
+ (@routes[verb] ||= []) << build_signature(pattern, keys) do |context|
256
+ context.event_signature = [verb, path]
257
+ eventbase.exec(context)
258
+ end
259
+ end
260
+
261
+
262
+ def safe_ignore(ignore)
263
+ unsafe_ignore = []
264
+ ignore = ignore.gsub(/%[\da-fA-F]{2}/) do |hex|
265
+ unsafe_ignore << hex[1..2]
266
+ ''
267
+ end
268
+ unsafe_patterns = unsafe_ignore.map! do |unsafe|
269
+ chars = unsafe.split(//).map! do |char|
270
+ char == char.downcase ? char : char + char.downcase
271
+ end
272
+
273
+ "|(?:%[^#{chars[0]}].|%[#{chars[0]}][^#{chars[1]}])"
274
+ end
275
+ if unsafe_patterns.length > 0
276
+ "((?:[^#{ignore}/?#%]#{unsafe_patterns.join()})+)"
277
+ else
278
+ "([^#{ignore}/?#]+)"
279
+ end
280
+ end
281
+
282
+
283
+ def compile(path)
284
+ if path.respond_to? :to_str
285
+ keys = []
286
+
287
+ # Split the path into pieces in between forward slashes.
288
+ # A negative number is given as the second argument of path.split
289
+ # because with this number, the method does not ignore / at the end
290
+ # and appends an empty string at the end of the return value.
291
+ #
292
+ segments = path.split('/', -1).map! do |segment|
293
+ ignore = []
294
+
295
+ # Special character handling.
296
+ #
297
+ pattern = segment.to_str.gsub(/[^\?\%\\\/\:\*\w]|:(?!\w)/) do |c|
298
+ ignore << escaped(c).join if c.match(/[\.@]/)
299
+ patt = encoded(c)
300
+ patt.gsub(/%[\da-fA-F]{2}/) do |match|
301
+ match.split(//).map! { |char| char == char.downcase ? char : "[#{char}#{char.downcase}]" }.join
302
+ end
303
+ end
304
+
305
+ ignore = ignore.uniq.join
306
+
307
+ # Key handling.
308
+ #
309
+ pattern.gsub(/((:\w+)|\*)/) do |match|
310
+ if match == "*"
311
+ keys << 'splat'
312
+ "(.*?)"
313
+ else
314
+ keys << $2[1..-1]
315
+ ignore_pattern = safe_ignore(ignore)
316
+
317
+ ignore_pattern
318
+ end
319
+ end
320
+ end
321
+
322
+ # Special case handling.
323
+ #
324
+ if last_segment = segments[-1] and last_segment.match(/\[\^\\\./)
325
+ parts = last_segment.rpartition(/\[\^\\\./)
326
+ parts[1] = '[^'
327
+ segments[-1] = parts.join
328
+ end
329
+ [/\A#{segments.join('/')}\z/, keys]
330
+ elsif path.respond_to?(:keys) && path.respond_to?(:match)
331
+ [path, path.keys]
332
+ elsif path.respond_to?(:names) && path.respond_to?(:match)
333
+ [path, path.names]
334
+ elsif path.respond_to? :match
335
+ [path, []]
336
+ else
337
+ raise TypeError, path
338
+ end
339
+ end
340
+
341
+ def call(env)
342
+ dup.call!(env)
343
+ end
344
+
345
+ # Set or retrieve the response body. When a block is given,
346
+ # evaluation is deferred until the body is read with #each.
347
+ def body(context, value = nil, &block)
348
+ if block_given?
349
+ def block.each; yield(call) end
350
+ context.response.body = block
351
+ elsif value
352
+ # Rack 2.0 returns a Rack::File::Iterator here instead of
353
+ # Rack::File as it was in the previous API.
354
+ unless context.request.head?
355
+ headers(context).delete 'Content-Length'
356
+ end
357
+ context.response.body = value
358
+ else
359
+ context.response.body
360
+ end
361
+ end
362
+
363
+ def call!(env)
364
+ context = WebRunContext.new
365
+
366
+ context.request = Request.new(env)
367
+ context.response = Response.new
368
+ context.env = env
369
+ context.params = indifferent_params(context.request.params)
370
+
371
+ context.response['Content-Type'] = nil
372
+ invoke(context) { |context| dispatch(context) }
373
+
374
+ unless context.response['Content-Type']
375
+ context.response['Content-Type'] = "text/html"
376
+ end
377
+
378
+ context.response.finish
379
+ end
380
+
381
+ def dispatch(context)
382
+ invoke(context) do |context|
383
+ route!(context)
384
+ end
385
+ rescue ::Exception => error
386
+ invoke(context) do |context|
387
+ handle_exception!(context, error)
388
+ end
389
+ ensure
390
+
391
+ end
392
+
393
+ def handle_exception!(context, error)
394
+ context.env['error'] = error
395
+
396
+ if error.respond_to? :http_status
397
+ context.response.status = error.http_status
398
+ else
399
+ context.response.status = 500
400
+ puts "Internal Server Error: #{error}"
401
+ puts error.backtrace
402
+ end
403
+
404
+ end
405
+
406
+ def call_block(context)
407
+ yield(context)
408
+ end
409
+
410
+ def route!(context)
411
+ if routes = @routes[context.request.request_method]
412
+ routes.each do |pattern, keys, block|
413
+ process_route(context, pattern, keys) do |*args|
414
+ #env['route'] = block.instance_variable_get(:@route_name)
415
+
416
+ #throw :halt, context.exec(&block)
417
+ throw :halt, call_block(context, &block)
418
+ end
419
+ end
420
+ end
421
+
422
+ puts "Route missing"
423
+ raise NotFound
424
+ end
425
+
426
+ def process_route(context, pattern, keys, values = [])
427
+ route = context.request.path_info
428
+ route = '/' if route.empty?
429
+ return unless match = pattern.match(route)
430
+ values += match.captures.map! { |v| URI_INSTANCE.unescape(v) if v }
431
+
432
+ if values.any?
433
+ original, @params = context.params, context.params.merge('splat' => [], 'captures' => values)
434
+ keys.zip(values) { |k,v| Array === context.params[k] ? context.params[k] << v : context.params[k] = v if v }
435
+ end
436
+
437
+ yield(self, values)
438
+
439
+ rescue
440
+ context.env['error.params'] = context.params
441
+ raise
442
+ ensure
443
+ @params = original if original
444
+ end
445
+
446
+ def invoke(context)
447
+ res = catch(:halt) { yield(context) }
448
+
449
+ res = [res] if Fixnum === res or String === res
450
+ if Array === res and Fixnum === res.first
451
+ res = res.dup
452
+ status(context, res.shift)
453
+ body(context, res.pop)
454
+ headers(context, *res)
455
+ elsif res.respond_to? :each
456
+ body(context, res)
457
+ end
458
+ nil # avoid double setting the same response tuple twice
459
+ end
460
+
461
+ # Creates a Hash with indifferent access.
462
+ def indifferent_hash
463
+ Hash.new {|hash,key| hash[key.to_s] if Symbol === key }
464
+ end
465
+
466
+
467
+ def indifferent_params(object)
468
+ case object
469
+ when Hash
470
+ new_hash = indifferent_hash
471
+ object.each { |key, value| new_hash[key] = indifferent_params(value) }
472
+ new_hash
473
+ when Array
474
+ object.map { |item| indifferent_params(item) }
475
+ else
476
+ object
477
+ end
478
+ end
479
+
480
+ def status(context, value = nil)
481
+ context.response.status = value if value
482
+ context.response.status
483
+ end
484
+
485
+ def headers(context, hash = nil)
486
+ context.response.headers.merge! hash if hash
487
+ context.response.headers
69
488
  end
70
489
 
71
490
  def initialize(settings_factory)
72
491
  settings = settings_factory[:http]
73
492
 
493
+ @routes = {}
74
494
  @settings = DEFAULT_SETTINGS.merge(settings)
75
495
  @stopsignal = Queue.new()
76
496
  @thread = nil
77
497
 
78
- @app_class = Class.new(SinatraApp)
79
-
80
498
  end
81
499
 
82
500
  def start()
83
- @app = @app_class.new
84
- if @settings[:Verbose]
501
+
502
+ if @settings[:verbose]
85
503
  @app = Rack::CommonLogger.new(@app, STDOUT)
86
504
  end
87
505
 
88
506
  @thread = Thread.new do
89
- events_hander = @settings[:Silent] ? ::Puma::Events.strings : ::Puma::Events.stdio
90
- server = ::Puma::Server.new(@app, events_hander)
507
+ events_hander = @settings[:silent] ? ::Puma::Events.strings : ::Puma::Events.stdio
508
+ server = ::Puma::Server.new(self, events_hander)
91
509
 
92
510
  server.add_tcp_listener @settings[:host], @settings[:port]
93
511
  server.min_threads = 0
@@ -11,8 +11,7 @@ class Ocular
11
11
  def initialize()
12
12
  end
13
13
 
14
- def self.find_settings_file_from_system()
15
- filename = nil
14
+ def self.find_settings_file_from_system(filename)
16
15
  if ENV['OCULAR_SETTINGS'] != nil
17
16
  filename = File.expand_path(ENV['OCULAR_SETTINGS'])
18
17
  end
@@ -1,3 +1,3 @@
1
1
  class Ocular
2
- Version = "0.1.3"
2
+ Version = "0.1.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ocular
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juho Mäkinen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-24 00:00:00.000000000 Z
11
+ date: 2016-02-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rye
@@ -53,19 +53,33 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: 2.16.0
55
55
  - !ruby/object:Gem::Dependency
56
- name: sinatra
56
+ name: rack
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 1.4.7
61
+ version: 1.6.4
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: 1.4.7
68
+ version: 1.6.4
69
+ - !ruby/object:Gem::Dependency
70
+ name: rack-protection
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 1.5.3
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 1.5.3
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: faraday
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -120,7 +134,6 @@ files:
120
134
  - lib/ocular/dsl/ssh.rb
121
135
  - lib/ocular/event/eventbase.rb
122
136
  - lib/ocular/event/eventfactory.rb
123
- - lib/ocular/event/forker.rb
124
137
  - lib/ocular/inputs/base.rb
125
138
  - lib/ocular/inputs/handlers.rb
126
139
  - lib/ocular/inputs/http_input.rb
@@ -1,35 +0,0 @@
1
- require 'ocular/mixin/from_file'
2
- require 'ocular/dsl/fog'
3
- require 'ocular/dsl/ssh'
4
- require 'ocular/dsl/logging'
5
-
6
- class Ocular
7
- module Event
8
-
9
- class Forker
10
-
11
- def initialize(&block)
12
- puts "Forker created with block #{block}"
13
- @callback = block
14
- end
15
-
16
- def get_proc()
17
- cb = @callback
18
-
19
- def proxy(&block)
20
- return block
21
- end
22
-
23
- p = proxy do |*args|
24
- puts "Calling proc callback: #{cb}"
25
- cb.call(*args)
26
- end
27
-
28
- puts "returning p: #{p}"
29
-
30
- return p
31
- end
32
- end
33
- end
34
- end
35
-