octo 0.0.4 → 0.0.5

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 (6) hide show
  1. checksums.yaml +7 -0
  2. data/bin/octo +26 -7
  3. data/lib/octo/profile.rb +19 -9
  4. data/lib/octo.rb +30 -2
  5. data/octo.gemspec +3 -1
  6. metadata +41 -21
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6f725787f4c6ae31626f1eceed7504ed32eb98f3
4
+ data.tar.gz: 3e3214b8d920d863483ba69b558ec78a5696dccc
5
+ SHA512:
6
+ metadata.gz: 95a553226385139f430c0ab7b3cce4b7e4d254a040e30e24dd348e59eaa79f0457167ab3626ea2a34036c93f2a658d9241ff48810076f7bc4026d10efd4c3aae
7
+ data.tar.gz: bed80746eeecec5bb79b557c27ad18000155e7999d3e04e19438dcabd244413ff3ae73a506fe7eb2981181fc0bf3b14f2d2ee6df928084144cda94b2d8ca28c5
data/bin/octo CHANGED
@@ -20,6 +20,9 @@ include GLI::App
20
20
 
21
21
  program_desc 'Run commands on multiple hosts'
22
22
 
23
+ desc 'Set the mode tht octo will run in (eg. ssh, mysql)'
24
+ flag [:m, :mode], must_match: /(mysql)|(ssh)/i, default_value: 'ssh', type: String
25
+
23
26
  octo = nil
24
27
  pre do |global_opts, command, opts, args|
25
28
  octo = Octo.new(opts)
@@ -35,17 +38,19 @@ command :profile do |profile|
35
38
  profile.command :list do |list|
36
39
  list.action do |global_opts, opts, args|
37
40
  if args.empty?
38
- octo.list.each do |profile|
41
+ octo.config[global_opts[:m]].each do |profile, servers|
39
42
  puts "#{profile}:"
40
- octo.config[profile].each do |server|
43
+ servers.each do |server|
41
44
  puts "- #{server}"
42
45
  end
43
46
  end
44
47
  else
45
- exit_now!("#{args.first} is not a defined profile") unless octo.config.keys.include? args.first
48
+ unless octo.profile_exists? global_opts[:m], args.first
49
+ exit_now!("#{args.first} is not a defined profile")
50
+ end
46
51
 
47
52
  puts "#{args.first}:"
48
- octo.config[args.first].each do |server|
53
+ octo.list(global_opts[:m], args.first).each do |server|
49
54
  puts "- #{server}"
50
55
  end
51
56
  end
@@ -57,7 +62,7 @@ command :profile do |profile|
57
62
  profile.long_desc 'Add a host to a profile, the host should be specified using the form user@hostname, eg. nan@nine27.com.'
58
63
  profile.command :add do |add|
59
64
  add.action do |global_opts, opts, args|
60
- octo.add args[0], args[1]
65
+ octo.add global_opts[:m], args[0], args[1]
61
66
  end
62
67
  end
63
68
 
@@ -66,7 +71,11 @@ command :profile do |profile|
66
71
  profile.arg_name 'profile server'
67
72
  profile.command :rm do |rm|
68
73
  rm.action do |global_opts, opts, args|
69
- octo.rm args[0], args[1]
74
+ unless octo.profile_exists? global_opts[:m], args.first
75
+ exit_now!("#{args.first} is not a defined profile")
76
+ end
77
+
78
+ octo.rm global_opts[:m], args[0], args[1]
70
79
  end
71
80
  end
72
81
  end
@@ -76,7 +85,17 @@ long_desc 'Run a command in parallel on all configured hosts in the profile, eg.
76
85
  octo run cluster_1 \'tail -f /var/log/httpd/error_log\'.'
77
86
  command :run do |cmd|
78
87
  cmd.action do |global_opts, tops, args|
79
- octo.run args[0], args[1]
88
+ unless octo.profile_exists? global_opts[:m], args.first
89
+ exit_now!("#{args.first} is not a defined profile")
90
+ end
91
+
92
+ case global_opts[:m]
93
+ when 'ssh'
94
+ octo.run_ssh args[0], args[1]
95
+ when 'mysql'
96
+ exit_now!("No query specified") if args[1].nil? || args[1].empty?
97
+ octo.run_mysql args[0], args[1]
98
+ end
80
99
  end
81
100
  end
82
101
 
data/lib/octo/profile.rb CHANGED
@@ -7,22 +7,32 @@ module Octo::Profile
7
7
  "#{Dir.home}/.octorc"
8
8
  end
9
9
 
10
- def list(profile = nil)
10
+ def profile_exists?(type, profile)
11
+ @config[type].keys.include? profile
12
+ end
13
+
14
+ def list(type, profile = nil)
11
15
  if profile.nil?
12
- @config.keys
16
+ @config[type].keys
13
17
  else
14
- @config[profile]
18
+ @config[type].each do |name, servers|
19
+ if name == profile
20
+ return servers
21
+ end
22
+ end
23
+
24
+ return nil
15
25
  end
16
26
  end
17
27
 
18
- def add(profile, server)
19
- @config[profile] = [] if @config[profile].nil?
20
- @config[profile] << server
28
+ def add(type, profile, server)
29
+ @config[type][profile] = [] if @config[type][profile].nil?
30
+ @config[type][profile] << server
21
31
  end
22
32
 
23
- def rm(profile, server)
24
- @config[profile].delete(server)
25
- @config.delete(profile) if @config[profile].empty?
33
+ def rm(type, profile, server)
34
+ @config[type][profile].delete(server)
35
+ @config[type].delete(profile) if @config[type][profile].empty?
26
36
  end
27
37
 
28
38
  def load
data/lib/octo.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require 'yaml'
2
2
  require 'net/ssh/multi'
3
+ require 'mysql2'
4
+ require 'terminal-table'
3
5
  require 'term/ansicolor'
4
6
 
5
7
  class Octo
@@ -16,9 +18,9 @@ class Octo
16
18
  self.load
17
19
  end
18
20
 
19
- def run(profile, command)
21
+ def run_ssh(profile, command)
20
22
  Net::SSH::Multi.start do |session|
21
- @config[profile].each do |server|
23
+ @config['ssh'][profile].each do |server|
22
24
  session.use server
23
25
  end
24
26
 
@@ -31,4 +33,30 @@ class Octo
31
33
  session.loop
32
34
  end
33
35
  end
36
+
37
+ def run_mysql(profile, query)
38
+ @config['mysql'][profile].each do |server|
39
+ print "Running query on #{server}... "
40
+
41
+ begin
42
+ server_data = server.match(/(.+):(.+)@(.+)\/(.+)/)
43
+ client = Mysql2::Client.new(username: server_data[1],
44
+ password: server_data[2],
45
+ host: server_data[3],
46
+ database: server_data[4])
47
+
48
+ results = client.query(query)
49
+ puts "#{results.count} results"
50
+ table = Terminal::Table.new(headings: results.fields) do |t|
51
+ results.each(as: :array) do |row|
52
+ t << row
53
+ end
54
+ end
55
+
56
+ puts table
57
+ rescue Exception => e
58
+ puts "ERROR: #{e.inspect}"
59
+ end
60
+ end
61
+ end
34
62
  end
data/octo.gemspec CHANGED
@@ -2,7 +2,7 @@ Gem::Specification.new do |s|
2
2
  s.name = 'octo'
3
3
  s.summary = 'Run commands in parallel on multiple hosts'
4
4
  s.description = 'A lightweight script that allows you to run commands in parallel on multiple hosts'
5
- s.version = '0.0.4'
5
+ s.version = '0.0.5'
6
6
  s.author = 'Nan Zhong'
7
7
  s.email = 'nan@nine27.com'
8
8
  s.homepage = 'https://github.com/nanzhong/octo'
@@ -11,6 +11,8 @@ Gem::Specification.new do |s|
11
11
  s.executables << 'octo'
12
12
 
13
13
  s.add_dependency 'net-ssh-multi'
14
+ s.add_dependency 'mysql2'
14
15
  s.add_dependency 'gli'
15
16
  s.add_dependency 'term-ansicolor'
17
+ s.add_dependency 'terminal-table'
16
18
  end
metadata CHANGED
@@ -1,62 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: octo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
5
- prerelease:
4
+ version: 0.0.5
6
5
  platform: ruby
7
6
  authors:
8
7
  - Nan Zhong
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-12-20 00:00:00.000000000 Z
11
+ date: 2013-03-13 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: net-ssh-multi
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mysql2
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
28
39
  - !ruby/object:Gem::Version
29
40
  version: '0'
30
41
  - !ruby/object:Gem::Dependency
31
42
  name: gli
32
43
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
44
  requirements:
35
- - - ! '>='
45
+ - - '>='
36
46
  - !ruby/object:Gem::Version
37
47
  version: '0'
38
48
  type: :runtime
39
49
  prerelease: false
40
50
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
51
  requirements:
43
- - - ! '>='
52
+ - - '>='
44
53
  - !ruby/object:Gem::Version
45
54
  version: '0'
46
55
  - !ruby/object:Gem::Dependency
47
56
  name: term-ansicolor
48
57
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
58
  requirements:
51
- - - ! '>='
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: terminal-table
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
52
74
  - !ruby/object:Gem::Version
53
75
  version: '0'
54
76
  type: :runtime
55
77
  prerelease: false
56
78
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
79
  requirements:
59
- - - ! '>='
80
+ - - '>='
60
81
  - !ruby/object:Gem::Version
61
82
  version: '0'
62
83
  description: A lightweight script that allows you to run commands in parallel on multiple
@@ -74,26 +95,25 @@ files:
74
95
  - octo.gemspec
75
96
  homepage: https://github.com/nanzhong/octo
76
97
  licenses: []
98
+ metadata: {}
77
99
  post_install_message:
78
100
  rdoc_options: []
79
101
  require_paths:
80
102
  - lib
81
103
  required_ruby_version: !ruby/object:Gem::Requirement
82
- none: false
83
104
  requirements:
84
- - - ! '>='
105
+ - - '>='
85
106
  - !ruby/object:Gem::Version
86
107
  version: '0'
87
108
  required_rubygems_version: !ruby/object:Gem::Requirement
88
- none: false
89
109
  requirements:
90
- - - ! '>='
110
+ - - '>='
91
111
  - !ruby/object:Gem::Version
92
112
  version: '0'
93
113
  requirements: []
94
114
  rubyforge_project:
95
- rubygems_version: 1.8.24
115
+ rubygems_version: 2.0.0
96
116
  signing_key:
97
- specification_version: 3
117
+ specification_version: 4
98
118
  summary: Run commands in parallel on multiple hosts
99
119
  test_files: []