evegem 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ config/database.yml
6
+ .DS_Store
7
+ .rvmrc
8
+ log
9
+ doc
10
+ appstats_*
11
+ *_real_spec.rb
12
+ *.rdb
13
+ *.log
14
+ *.cmd
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "http://gems.cenx.test"
2
+ source "http://rubygems.org"
3
+
4
+ # Specify your gem's dependencies in eve.gemspec
5
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ import 'lib/eve/ci.rake'
5
+ RSpec::Core::RakeTask.new
@@ -0,0 +1,2 @@
1
+ require 'autotest/fsevent'
2
+ Autotest.add_discovery { "rspec2" }
data/bin/eve ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require "bundler/setup"
4
+ require File.dirname(__FILE__) + "/../lib/evegem"
5
+
6
+ case ARGV.first
7
+ when "server"
8
+ ARGV.shift
9
+ Eve::EventConnection.run(ARGV)
10
+ when "watch"
11
+ ARGV.shift
12
+ Signal.trap("SIGINT") { exit }
13
+ Eve::FileNotifierConnection.run(ARGV)
14
+ else
15
+ app = Eve::Application.new(:display => :stdio, :system_calls_display => { :filename => "./eve_system_calls.log" })
16
+ Signal.trap("SIGINT") { app.enqueue_cmd("exit") }
17
+ app.run(ARGV)
18
+ end
data/config.ru ADDED
@@ -0,0 +1,2 @@
1
+ require File.dirname(__FILE__) + '/lib/evegem'
2
+ run Eve::WebServer.new
@@ -0,0 +1,16 @@
1
+ development:
2
+ adapter: mysql2
3
+ encoding: utf8
4
+ reconnect: true
5
+ database: eve_dev
6
+ pool: 5
7
+ username: root
8
+ socket: "/tmp/mysql.sock"
9
+ test:
10
+ adapter: mysql2
11
+ encoding: utf8
12
+ reconnect: true
13
+ database: eve_dev
14
+ pool: 5
15
+ username: root
16
+ socket: "/tmp/mysql.sock"
@@ -0,0 +1,10 @@
1
+
2
+ require "#{File.dirname(__FILE__)}/../spec/db_helper"
3
+
4
+ env = Object.const_defined?('Rails') ? Rails.env : "test"
5
+ db = YAML::load(File.open("#{File.dirname(__FILE__)}/database.yml"))[env]
6
+
7
+ path = ENV['SIN_DOC_PATH'] || "#{File.dirname(__FILE__)}/../../sin_doc"
8
+ execute_sql(db,"drop database `#{db['database']}`;",false)
9
+ execute_sql(db,"create database `#{db['database']}`;",false)
10
+ execute_sql_file(db,"#{path}/CDB_EXPORT_For_Test_Suite.sql",true)
data/eve.gemspec ADDED
@@ -0,0 +1,39 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "eve/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "evegem"
7
+ s.version = Eve::VERSION
8
+ s.authors = ["Andrew Forward"]
9
+ s.email = ["andrew.forward@cenx.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{A DSL for managing OSS Data Entry}
12
+ s.description = %q{A DSL for managing OSS Data Entry}
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.executables = [ 'eve' ]
18
+ s.require_paths = ["lib"]
19
+
20
+ s.add_dependency('utest','>=0.0.3')
21
+ s.add_dependency('watchme','>=0.0.1')
22
+ s.add_dependency('awesome_print')
23
+ s.add_dependency('rake','0.9.2')
24
+ s.add_dependency('rails','>=3.2.1')
25
+ s.add_dependency('mysql2','0.3.11')
26
+ s.add_dependency('rack','1.4.1')
27
+ s.add_dependency('eventmachine','0.12.10')
28
+ s.add_dependency('net-ssh','2.3.0')
29
+ s.add_dependency('redis','2.2.0')
30
+
31
+ s.add_development_dependency('rspec')
32
+ s.add_development_dependency('autotest')
33
+ s.add_development_dependency('autotest-fsevent') if RUBY_PLATFORM =~ /darwin/i
34
+ s.add_development_dependency('ZenTest')
35
+ s.add_development_dependency('rb-fsevent') if RUBY_PLATFORM =~ /darwin/i
36
+ s.add_development_dependency('geminabox')
37
+ s.add_development_dependency('simplecov')
38
+
39
+ end
@@ -0,0 +1,465 @@
1
+ module Eve
2
+
3
+ class Application
4
+
5
+ cattr_accessor :cmd_data
6
+ attr_accessor :id, :console, :system_calls, :message, :redis, :poll, :poll_cmds, :cmds, :big_t, :mode, :server, :port
7
+
8
+ @@cmd_data = {
9
+ "version" => [],
10
+ "help" => [],
11
+ "appid" => [],
12
+ "shell" => [],
13
+ "poll" => [ "set", "add", "rm" ],
14
+ "event" => [],
15
+ "remote" => [],
16
+ "interrupt" => [],
17
+ "register" => [ "add", "rm", "reload", "add-path", "rm-path", "path" ],
18
+ "print" => [],
19
+ "exit" => [],
20
+ }
21
+
22
+ def initialize(data = {})
23
+ @redis = data[:redis] || Redis.new
24
+ @console = Messenger.new( :display => data[:display] )
25
+ @system_calls = Messenger.new( :display => data[:system_calls_display] || data[:display] )
26
+
27
+ @message = Message.new(self)
28
+ @poll = 5*60
29
+ @poll_cmds = []
30
+ @cmds = []
31
+ @big_t = data[:big_t] || "1month"
32
+ @mode = data[:mode] || :queue
33
+ @server = data[:server] || "0.0.0.0"
34
+ @port = data[:port] || "4848"
35
+ @running = false
36
+ end
37
+
38
+ def reset
39
+ @cmds = []
40
+ @console.reset
41
+ end
42
+
43
+ def self.extract_arg(name,args,default = [],has_data = true)
44
+ is_multi = default.kind_of?(Array)
45
+ index = args.index(name)
46
+ return default if index.nil?
47
+ return is_multi ? [true] : true unless has_data
48
+
49
+ results = []
50
+ args.each_with_index.collect { |d,i| d == name ? i : nil }.compact.each do |index|
51
+ val = ""
52
+ args[index+1..-1].each do |data|
53
+ break if data.start_with?("--")
54
+ val += " #{data}"
55
+ end
56
+ results << val.strip
57
+ end
58
+ is_multi ? results : results.first
59
+ end
60
+
61
+ def self.methodize(input)
62
+ input.gsub(/-/,"_")
63
+ end
64
+
65
+ def default_result
66
+ { :data => nil, :status => :continue, :track_cmd => true }
67
+ end
68
+
69
+ #------------
70
+ # EVENT MACHINE
71
+ #------------
72
+
73
+ def post_init
74
+ @message.print_server_init
75
+ end
76
+
77
+ def receive_data(data)
78
+ cmd(data,true,true)
79
+ end
80
+
81
+ #------------
82
+ # MAIN DRIVER - RUN / CMD
83
+ #------------
84
+
85
+ def run(args = [])
86
+ @running = true
87
+ scripts = ["version"] + handle_args(args)
88
+ loop do
89
+ scripts.each do |script|
90
+ status = cmd(script,true,true)[:status]
91
+ status = cmd("exit") if status == :should_exit
92
+ return if status == :exited
93
+ end
94
+ scripts = next_cmds
95
+ end
96
+ end
97
+
98
+ def call_interrupt(result,appid,display_messages)
99
+ @redis.set(lookup_id("mode",appid),"shell")
100
+ @message.print_app_interrupted(appid) if display_messages
101
+ result
102
+ end
103
+
104
+ def cmd(raw,display_messages = true,external_cmd = false)
105
+ result = default_result
106
+ raw = "remote #{raw}" if @mode == :event
107
+ begin
108
+ action, data = action_and_input(raw)
109
+
110
+ num_times_processed = 0
111
+ if @@cmd_data.keys.include?(action)
112
+ inner_action, inner_data = action_and_input(data)
113
+ if @@cmd_data[action].include?(inner_action)
114
+ result = send(Application.methodize("call_#{action}_#{inner_action}"), result, inner_data, display_messages)
115
+ else
116
+ result = send(Application.methodize("call_#{action}"), result, data, display_messages)
117
+ end
118
+ num_times_processed += 1
119
+ end
120
+ num_times_processed, result = delegate(num_times_processed,result,raw,display_messages) unless @id.nil?
121
+
122
+ if num_times_processed == 0 && !action.empty?
123
+ @message.print_unknown_cmd(raw)
124
+ end
125
+
126
+ @cmds << raw if external_cmd && result[:track_cmd]
127
+ rescue Exception => ex
128
+ @message.print_cmd_error(raw,ex)
129
+ end
130
+ result
131
+ end
132
+
133
+ #------------
134
+ # CALLER METHODS
135
+ #------------
136
+
137
+ def call_register(result,data,display_messages)
138
+ result[:data] = {}
139
+ @redis.smembers(lookup_id("registers")).collect do |classname|
140
+ result[:data][classname] = @redis.smembers(lookup_id("register.#{classname}.files"))
141
+ end
142
+ @message.print_registry(result[:data])
143
+ result
144
+ end
145
+
146
+ def call_register_add(result,data,display_messages)
147
+ parts = data.split
148
+ classname = parts[0]
149
+ filename = parts[1]
150
+ if filename.nil? || filename == ""
151
+ (cmd("register path",false)[:data]).each do |path|
152
+ filename = "#{path}/#{classname.split("::").last.underscore}.rb"
153
+ next unless p?(filename)
154
+ filename = p(filename)
155
+ break
156
+ end
157
+ end
158
+ load filename
159
+ @redis.sadd(lookup_id("registers"),classname)
160
+ @redis.sadd(lookup_id("register.#{classname}.files"),filename)
161
+ result[:data] = true
162
+ result
163
+ end
164
+
165
+ def call_register_add_path(result,path,display_messages)
166
+ if p?(path)
167
+ result[:data] = @redis.sadd(lookup_id("register.paths"),p(path))
168
+ else
169
+ result[:data] = false
170
+ end
171
+ result
172
+ end
173
+
174
+ def call_register_rm_path(result,path,display_messages)
175
+ normalized_path = p?(path) ? p(path) : path
176
+ result[:data] = @redis.srem(lookup_id("register.paths"),normalized_path)
177
+ result
178
+ end
179
+
180
+ def call_register_path(result,path,display_messages)
181
+ result[:data] = [ p("#{File.dirname(__FILE__)}/../registry") ] + @redis.smembers(lookup_id("register.paths"))
182
+ @message.print_registry_path(result[:data]) if display_messages
183
+ result
184
+ end
185
+
186
+ def call_register_rm(result,classname,display_messages)
187
+ result[:data] = @redis.srem(lookup_id("registers"),classname)
188
+ @redis.del(lookup_id("register.#{classname}.files"))
189
+ result
190
+ end
191
+
192
+ def call_register_reload(result,data,display_messages)
193
+ @redis.smembers(lookup_id("registers")).each do |classname|
194
+ @redis.smembers(lookup_id("register.#{classname}.files")).each do |filename|
195
+ load filename
196
+ end
197
+ end
198
+ @message.print_registry_reloaded if display_messages
199
+ result[:data] = true
200
+ result
201
+ end
202
+
203
+ def call_appid(result,appid,display_messages)
204
+ @id = appid == "" || appid.nil? ? $$.to_s : appid
205
+
206
+ is_existing = @redis.sismember("Eve.ApplicationIds",@id)
207
+ @redis.sadd("Eve.ApplicationIds",@id)
208
+ result[:data] = @id
209
+ @message.print_appid(@id)
210
+ cmd("register reload",display_messages) if is_existing
211
+ result
212
+ end
213
+
214
+ def call_version(result,data,display_messages)
215
+ result[:data] = Eve::VERSION
216
+ @message.print_version(@id) if display_messages
217
+ result
218
+ end
219
+
220
+ def call_help(result,data,display_messages)
221
+
222
+ if data.nil? || data == ""
223
+ result[:data] = @@cmd_data.dup
224
+ @redis.smembers(lookup_id("registers")).each do |name|
225
+ clazz = reg(name)
226
+ if clazz.nil?
227
+ @redis.srem(lookup_id("registers"),name)
228
+ else
229
+ result[:data].merge!(clazz.available)
230
+ end
231
+ end
232
+ else
233
+ clazz = reg(data)
234
+ if clazz.nil?
235
+ @message.print_unknown_handler(data) if display_messages
236
+ result[:data] = {}
237
+ else
238
+ result[:data] = clazz.available
239
+ end
240
+ end
241
+ @message.print_help(result[:data],data) if display_messages && !result[:data].empty?
242
+ result
243
+ end
244
+
245
+ def call_print(result,msg,display_messages)
246
+ result[:data] = msg
247
+ @console.print("#{msg}\n") if display_messages
248
+ result
249
+ end
250
+
251
+ def call_exit(result,data,display_messages)
252
+ result[:status] = :exited
253
+ @message.print_exit if display_messages
254
+ result
255
+ end
256
+
257
+ def call_poll(result,duration,display_messages)
258
+ result[:data] = @poll_cmds
259
+ @message.print_poll_details(@poll,result[:data])
260
+ result
261
+ end
262
+
263
+ def call_poll_add(result,cmd,display_messages)
264
+ @poll_cmds << cmd
265
+ result
266
+ end
267
+
268
+ def call_poll_rm(result,index,display_messages)
269
+ result[:data] = []
270
+ if index.to_i.to_s == index
271
+ @poll_cmds.delete_at(index.to_i)
272
+ else
273
+ @poll_cmds.delete(index)
274
+ end
275
+ result
276
+ end
277
+
278
+ def call_poll_set(result,duration,display_messages)
279
+ @mode = :poll
280
+ in_secs = WatchMe::Timer.to_seconds(duration)
281
+ result[:data] = in_secs
282
+ @poll = in_secs
283
+ @message.print_poll_mode(@id,in_secs) if display_messages
284
+ result
285
+ end
286
+
287
+ def call_shell(result,data,display_messages)
288
+ @mode = :shell
289
+ result[:data] = @mode
290
+ @message.print_shell_mode if display_messages
291
+ result
292
+ end
293
+
294
+ def call_event(result, data, display_messages)
295
+ @mode = :event
296
+ @server,@port = data.split(":")
297
+ @server ||= "0.0.0.0"
298
+ @port ||= "4848"
299
+ result[:data] = { :server => @server, :port => @port }
300
+ @message.print_event_mode("#{@server}:#{@port}") if display_messages
301
+ result
302
+ end
303
+
304
+ def call_remote(result, cmd, display_messages)
305
+ should_exit = false
306
+ begin
307
+ @telnet ||= Net::Telnet::new("Host" => @server, "Port" => @port, "Timeout" => 10, "Telnetmode" => false) # debugging "Output_log"=>"application_telnet.log"
308
+ if cmd == "exit"
309
+ should_exit = true
310
+ @telnet.close
311
+ else
312
+ result[:data] = @telnet.cmd(cmd) do |data|
313
+ data.sub!(/[^\n]*> $/,"") unless @running
314
+ @console.print data
315
+ end
316
+ end
317
+ rescue Exception => ex
318
+ @message.print_error("Telnet session failed", ex)
319
+ should_exit = true
320
+ end
321
+
322
+ if should_exit
323
+ @mode = :shell
324
+ cmd("exit",display_messages)
325
+ result[:status] = :exited
326
+ end
327
+
328
+ result
329
+ end
330
+
331
+ #------------
332
+ # HELPER METHODS
333
+ #------------
334
+
335
+ def reg(classname)
336
+ begin
337
+ all_names = classname.split("::")
338
+ all_names.size == 1 ? Object::const_get(classname) : eval(all_names[0...-1].join("::")).const_get(all_names.last)
339
+ rescue
340
+ nil
341
+ end
342
+ end
343
+
344
+ def delegate(num_times_processed,result,cmd,display_messages)
345
+ all_results = num_times_processed > 0 ? [ result.dup ] : []
346
+ @redis.smembers(lookup_id("registers")).each do |classname|
347
+ all_names = classname.split("::")
348
+ clazz = reg(classname)
349
+ next unless clazz.handle?(cmd)
350
+ all_results << clazz.handle(self,cmd,display_messages)
351
+ num_times_processed += 1
352
+ end
353
+ result[:data] = nil if num_times_processed == 0
354
+ result[:data] = all_results[0][:data] if num_times_processed == 1
355
+ result[:data] = all_results if num_times_processed > 1
356
+ [ num_times_processed, result ]
357
+ end
358
+
359
+ def enqueue_cmd(raw)
360
+ @redis.rpush(lookup_id("next_cmds"),raw)
361
+ end
362
+
363
+ def next_cmds(scripts = [])
364
+ case(@mode)
365
+ when :event
366
+ scripts << user_input
367
+ when :poll
368
+ scripts += @poll_cmds
369
+ scripts << "sleep #{@poll}"
370
+ when :shell
371
+ scripts << user_input
372
+ when :queue
373
+ the_cmd = @redis.lpop(lookup_id("next_cmds")) || "exit"
374
+ scripts << the_cmd
375
+ end
376
+ scripts
377
+ end
378
+
379
+ def handle_args(args)
380
+ scripts = []
381
+
382
+ is_event = false
383
+ Application.extract_arg("--event",args).each do |event|
384
+ is_event = true
385
+ scripts << "event #{event}"
386
+ end
387
+
388
+ index = args.index("--interrupt")
389
+ unless index.nil?
390
+ scripts << "interrupt #{args[index+1]}"
391
+ scripts << "exit"
392
+ return scripts
393
+ end
394
+
395
+ index = args.index("--id")
396
+ if !index.nil?
397
+ scripts << "appid #{args[index + 1]}"
398
+ elsif @id.nil? && !is_event
399
+ scripts << "appid"
400
+ end
401
+
402
+ Application.extract_arg("--register",args).each { |register| scripts << "register add #{register}" }
403
+
404
+ unless is_event
405
+ Application.extract_arg("--poll",args).each { |poll| scripts << "poll #{poll}" }
406
+ scripts << "shell" unless Application.extract_arg("--shell",args,nil,false).nil?
407
+ end
408
+
409
+ Application.extract_arg("--run",args).each do |cmd|
410
+ scripts << cmd
411
+ end
412
+
413
+ scripts
414
+ end
415
+
416
+ def self.ids(redis = Redis.new)
417
+ redis.smembers("Eve.ApplicationIds")
418
+ end
419
+
420
+ def self.alive?(id)
421
+ return false if id == "" || id.nil?
422
+ begin
423
+ Process.kill 0, id.to_i
424
+ true
425
+ rescue Exception => ex
426
+ false
427
+ end
428
+ end
429
+
430
+ def lookup_id(sub_id, appid = nil)
431
+ raise "Application ID not set yet" if appid.nil? && @id.nil?
432
+ appid ||= @id
433
+ "Eve.#{appid}.#{sub_id}"
434
+ end
435
+
436
+ def history
437
+ @console.history
438
+ end
439
+
440
+ def system_call(input)
441
+ @message.print_system_call(input)
442
+ `#{input}`
443
+ end
444
+
445
+ def user_input
446
+ @console.print "> " unless @mode == :event
447
+ STDOUT.flush
448
+ STDIN.gets.chomp
449
+ end
450
+
451
+
452
+ private
453
+
454
+ def action_and_input(raw)
455
+ return [ "", nil ] if raw.nil?
456
+ action = raw.split.shift
457
+ return [ "", nil ] if (action.nil? || action.starts_with?("#"))
458
+ data = raw[(action.size)..-1].strip
459
+ [ action, data ]
460
+ end
461
+
462
+
463
+ end
464
+
465
+ end