cloudblocks 0.0.10 → 0.0.11

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.
Files changed (3) hide show
  1. data/bin/quartz +15 -14
  2. data/lib/plugins/redis.rb +91 -0
  3. metadata +37 -14
data/bin/quartz CHANGED
@@ -5,9 +5,11 @@ require File.expand_path("../../lib/cloud-quartz", __FILE__)
5
5
  require 'optparse'
6
6
  require 'socket'
7
7
  require 'logger'
8
+ require 'highline/import'
8
9
  begin
9
10
  gem 'eventmachine', '~>1.0.0.beta.4'
10
11
  gem 'faye', '~>0.8.0'
12
+ gem 'highline', '~>1.6.11'
11
13
 
12
14
  require 'eventmachine'
13
15
  require 'faye'
@@ -138,8 +140,7 @@ def load_plugins
138
140
  else
139
141
  @log.error "Invalid plugin found #{clazz}"
140
142
  end
141
- rescue => exc
142
- @log.error "Error during loading plugin #{classname} due to #{exc}"
143
+ rescue
143
144
  end
144
145
  end
145
146
  end
@@ -177,8 +178,9 @@ def get_job
177
178
  EM.defer(operation)
178
179
  else
179
180
  @log.error "No plugin found with uid #{guid}"
180
- # TODO: Send this back to server as run error
181
- #@quartz.post_results(job_id, data)
181
+ job_id = message['job_id']
182
+ data = { :run_start => Time.now.utc.to_i, :run_end => Time.now.utc.to_i, :agent_uid => @agent_id, :ok => false, :fail_reason => "Requested plugin not found. Does this agent support this job type?" }
183
+ @quartz.post_results(job_id, data)
182
184
  end
183
185
  end
184
186
  else
@@ -234,9 +236,9 @@ def run
234
236
  Signal.trap('TERM'){ stop }
235
237
 
236
238
  if @realtime
237
- @log.info "Listening to realtime nofitifications from /quartz/jobs/#{@agent_id} on #{@faye_url}"
239
+ @log.info "Listening to realtime nofitifications from /quartz/agents/#{@agent_id} on #{@faye_url}"
238
240
  client = Faye::Client.new(@faye_url)
239
- client.subscribe("/quartz/jobs/#{@agent_id}") do |message|
241
+ client.subscribe("/quartz/agents/#{@agent_id}") do |message|
240
242
  @log.info "Got realtime notice for a new job #{message}"
241
243
  get_job
242
244
  end
@@ -269,13 +271,13 @@ str_version = "0.0.#{@version}"
269
271
  config_file = 'cloudblocks.yaml'
270
272
  @pid_file = 'quartz.pid'
271
273
  @log_file = 'quartz.log'
272
- @config_dir = File.join(Dir.home, '.cloudblocks')
274
+ @config_dir = File.join(File.expand_path('~'), '.cloudblocks')
273
275
  @config_full = File.join(@config_dir, config_file)
274
276
  @pid_full = File.join('/tmp', @pid_file)
275
277
  @log_full = File.join('/tmp', @log_file)
276
278
 
277
279
  @api_key = ''
278
- @faye_url = 'https://socket.thecloudblocks.com:8443/'
280
+ @faye_url = 'https://socket.thecloudblocks.com:8443/push/'
279
281
  commands = %w[register unregister start stop]
280
282
 
281
283
  @plugins = {}
@@ -368,8 +370,7 @@ end
368
370
  # still no api key, we need to get it
369
371
  if @api_key.empty?
370
372
  puts 'CloudBlocks CloudQuartz'
371
- print 'Please enter your API key. (you can find it at https://www.thecloudblocks.com/me):'
372
- @api_key = gets.chomp
373
+ @api_key = ask('Please enter your API key. (you can find it at https://www.thecloudblocks.com/me): ')
373
374
  if @api_key.length != 32
374
375
  puts 'Invalid API key'
375
376
  exit -1
@@ -381,13 +382,13 @@ end
381
382
 
382
383
  # no agent id?
383
384
  if @agent_id.empty?
384
- print 'Register the agent? [Y/n]'
385
- if gets.chomp.downcase != 'n'
385
+ q = ask("Register the agent? ") { |q| q.default = "Y" }
386
+ if q.chomp.downcase != 'n'
386
387
  @quartz = CloudQuartz.new(:api_key => @api_key, :url => @url)
387
388
  register
388
389
 
389
- print 'Start the agent as daemon? [Yn]'
390
- if gets.chomp.downcase != 'n'
390
+ q = ask("Start the agent as daemon? ") { |q| q.default = "Y" }
391
+ if q.chomp.downcase != 'n'
391
392
  @quartz = CloudQuartz.new(:api_key => @api_key, :url => @url, :agent_id => @agent_id)
392
393
  start
393
394
  else
@@ -0,0 +1,91 @@
1
+ require File.join(File.dirname(__FILE__), 'quartz_plugin')
2
+ require 'fileutils'
3
+
4
+ class Redis < QuartzPlugin
5
+
6
+ def info
7
+ { :uid => "6342c1ef0d8bb2a47ab1362a6b02c058", :name => "Redis Backup", :version => "0.0.0" }
8
+ end
9
+
10
+ def run(message)
11
+ pl = payload(message)
12
+
13
+ @job_name = pl['job_name'].gsub(/[^\w\s_-]+/, '').gsub(/(^|\b\s)\s+($|\s?\b)/, '\\1\\2').gsub(/\s/, '_')
14
+ @redisdump_utility = pl['redis client'] || '/usr/bin/redis-cli'
15
+ @name = pl['db name'] || 'dump'
16
+ @password = pl['password']
17
+ @socket = pl['socket']
18
+ @host = pl['host'] || '127.0.0.1'
19
+ @port = pl['port'] || 6379
20
+ @additional_options = pl['additional options'] || []
21
+ @path = pl['db path']
22
+ @dump_path = pl['backup folder']
23
+
24
+ @name = 'dump' if @name.empty?
25
+ @host = '127.0.0.1' if @host.empty?
26
+ @port = 6379 if @port.empty?
27
+ @additional_options = [] if @additional_options.empty?
28
+ @redisdump_utility = '/usr/bin/redis-cli' if @redisdump_utility.empty?
29
+
30
+ save_result = invoke_save
31
+ return save_result unless save_result.nil?
32
+
33
+ result = copy
34
+ if result[:ok]
35
+ run_result(true, "Redis Backup finished successfully")
36
+ else
37
+ run_result(false, result[:message])
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ ## based on Backup Gem with minor modifications
44
+
45
+ def database
46
+ "#{@name}.rdb"
47
+ end
48
+
49
+ def credential_options
50
+ @password.to_s.empty? ? '' : "-a '#{@password}'"
51
+ end
52
+
53
+ def connectivity_options
54
+ %w[host port socket].map do |option|
55
+ value = instance_variable_get("@#{option}")
56
+ next if value.to_s.empty?
57
+ "-#{option[0,1]} '#{value}'"
58
+ end.compact.join(' ')
59
+ end
60
+
61
+ def user_options
62
+ @additional_options.join(' ')
63
+ end
64
+
65
+ def invoke_save
66
+ command = "#{@redisdump_utility} #{credential_options} #{connectivity_options} #{user_options} SAVE"
67
+ @log.debug "Running #{command}"
68
+ response = run_shell(command)
69
+ @log.debug "redis-cli run result: #{response}"
70
+ unless response[:ok]
71
+ run_result(false, "Failed to save from server '#{response[:message]}'")
72
+ else
73
+ nil
74
+ end
75
+ end
76
+
77
+ def copy
78
+ src_path = File.join(@path, database)
79
+ unless File.exist?(src_path)
80
+ raise "Redis database dump not found at #{src_path}"
81
+ end
82
+
83
+ FileUtils.mkdir_p(@dump_path)
84
+
85
+ dst_path = File.join(@dump_path, database)
86
+ dump_cmd = "gzip -c #{src_path} > #{dst_path}.gz"
87
+ @log.debug "Running #{dump_cmd}"
88
+ run_shell dump_cmd
89
+ end
90
+
91
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudblocks
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.11
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-24 00:00:00.000000000Z
12
+ date: 2012-04-01 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
16
- requirement: &70183955918280 !ruby/object:Gem::Requirement
16
+ requirement: &70213937662760 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.8.1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70183955918280
24
+ version_requirements: *70213937662760
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: json
27
- requirement: &70183955902580 !ruby/object:Gem::Requirement
27
+ requirement: &70213937659840 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.6.3
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70183955902580
35
+ version_requirements: *70213937659840
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: eventmachine
38
- requirement: &70183955876500 !ruby/object:Gem::Requirement
38
+ requirement: &70213937658000 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,21 @@ dependencies:
43
43
  version: 0.12.10
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70183955876500
46
+ version_requirements: *70213937658000
47
+ - !ruby/object:Gem::Dependency
48
+ name: eventmachine
49
+ requirement: &70213937651580 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 1.0.0.beta.4
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *70213937651580
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: faye
49
- requirement: &70183955851220 !ruby/object:Gem::Requirement
60
+ requirement: &70213937650380 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ! '>='
@@ -54,10 +65,10 @@ dependencies:
54
65
  version: 0.8.0
55
66
  type: :runtime
56
67
  prerelease: false
57
- version_requirements: *70183955851220
68
+ version_requirements: *70213937650380
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: open4
60
- requirement: &70183955848320 !ruby/object:Gem::Requirement
71
+ requirement: &70213937649300 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
74
  - - ! '>='
@@ -65,10 +76,10 @@ dependencies:
65
76
  version: 1.3.0
66
77
  type: :runtime
67
78
  prerelease: false
68
- version_requirements: *70183955848320
79
+ version_requirements: *70213937649300
69
80
  - !ruby/object:Gem::Dependency
70
81
  name: fog
71
- requirement: &70183955832100 !ruby/object:Gem::Requirement
82
+ requirement: &70213937648440 !ruby/object:Gem::Requirement
72
83
  none: false
73
84
  requirements:
74
85
  - - ! '>='
@@ -76,7 +87,18 @@ dependencies:
76
87
  version: 1.1.2
77
88
  type: :runtime
78
89
  prerelease: false
79
- version_requirements: *70183955832100
90
+ version_requirements: *70213937648440
91
+ - !ruby/object:Gem::Dependency
92
+ name: highline
93
+ requirement: &70213937647060 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ~>
97
+ - !ruby/object:Gem::Version
98
+ version: 1.6.11
99
+ type: :runtime
100
+ prerelease: false
101
+ version_requirements: *70213937647060
80
102
  description: See http://www.thecloudblocks.com for more info
81
103
  email: khash@thecloudblocks.com
82
104
  executables:
@@ -92,6 +114,7 @@ files:
92
114
  - lib/plugins/mysql.rb
93
115
  - lib/plugins/quartz_plugin.rb
94
116
  - lib/plugins/rake.rb
117
+ - lib/plugins/redis.rb
95
118
  - lib/plugins/rotater.rb
96
119
  - lib/plugins/s3backup.rb
97
120
  - lib/plugins/shell.rb