infra-ctrl 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a20ea9fdca4060e35455bfd95e798aff5aebd88b
4
+ data.tar.gz: f32042a097739689a8343c3c459897ecd2613bcd
5
+ SHA512:
6
+ metadata.gz: 2c4fd0cc3c814ff55ff494e81d4624e7def7f05e959fdab55ef445acbc010aaeed244e24df0b5b0e37efcdf9f8febf8df7d15f77310cde72122671c0f855f5e6
7
+ data.tar.gz: b790b3efad626c62a362f18295cf957393bd9b2c6363a0b7ac66a70e2dec98d47676df0117a259951f9f678ad351800ae91f4c2f00d5ef19ef1964f5730d68ac
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ vendor
2
+ .bundle
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.3.1
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ctrl.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,103 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ ctrl (0.1.0)
5
+ aws-sdk (~> 2)
6
+ methadone (~> 1.9.2)
7
+ virtus
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ aruba (0.14.2)
13
+ childprocess (~> 0.5.6)
14
+ contracts (~> 0.9)
15
+ cucumber (>= 1.3.19)
16
+ ffi (~> 1.9.10)
17
+ rspec-expectations (>= 2.99)
18
+ thor (~> 0.19)
19
+ aws-sdk (2.6.4)
20
+ aws-sdk-resources (= 2.6.4)
21
+ aws-sdk-core (2.6.4)
22
+ jmespath (~> 1.0)
23
+ aws-sdk-resources (2.6.4)
24
+ aws-sdk-core (= 2.6.4)
25
+ axiom-types (0.1.1)
26
+ descendants_tracker (~> 0.0.4)
27
+ ice_nine (~> 0.11.0)
28
+ thread_safe (~> 0.3, >= 0.3.1)
29
+ builder (3.2.2)
30
+ childprocess (0.5.9)
31
+ ffi (~> 1.0, >= 1.0.11)
32
+ coderay (1.1.1)
33
+ coercible (1.0.0)
34
+ descendants_tracker (~> 0.0.1)
35
+ contracts (0.14.0)
36
+ cucumber (2.4.0)
37
+ builder (>= 2.1.2)
38
+ cucumber-core (~> 1.5.0)
39
+ cucumber-wire (~> 0.0.1)
40
+ diff-lcs (>= 1.1.3)
41
+ gherkin (~> 4.0)
42
+ multi_json (>= 1.7.5, < 2.0)
43
+ multi_test (>= 0.1.2)
44
+ cucumber-core (1.5.0)
45
+ gherkin (~> 4.0)
46
+ cucumber-wire (0.0.1)
47
+ descendants_tracker (0.0.4)
48
+ thread_safe (~> 0.3, >= 0.3.1)
49
+ diff-lcs (1.2.5)
50
+ equalizer (0.0.11)
51
+ ffi (1.9.14)
52
+ gherkin (4.0.0)
53
+ ice_nine (0.11.2)
54
+ jmespath (1.3.1)
55
+ json (1.8.3)
56
+ methadone (1.9.2)
57
+ bundler
58
+ method_source (0.8.2)
59
+ multi_json (1.12.1)
60
+ multi_test (0.1.2)
61
+ pry (0.10.4)
62
+ coderay (~> 1.1.0)
63
+ method_source (~> 0.8.1)
64
+ slop (~> 3.4)
65
+ rake (10.5.0)
66
+ rdoc (4.2.2)
67
+ json (~> 1.4)
68
+ rspec (3.5.0)
69
+ rspec-core (~> 3.5.0)
70
+ rspec-expectations (~> 3.5.0)
71
+ rspec-mocks (~> 3.5.0)
72
+ rspec-core (3.5.3)
73
+ rspec-support (~> 3.5.0)
74
+ rspec-expectations (3.5.0)
75
+ diff-lcs (>= 1.2.0, < 2.0)
76
+ rspec-support (~> 3.5.0)
77
+ rspec-mocks (3.5.0)
78
+ diff-lcs (>= 1.2.0, < 2.0)
79
+ rspec-support (~> 3.5.0)
80
+ rspec-support (3.5.0)
81
+ slop (3.6.0)
82
+ thor (0.19.1)
83
+ thread_safe (0.3.5)
84
+ virtus (1.0.5)
85
+ axiom-types (~> 0.1)
86
+ coercible (~> 1.0)
87
+ descendants_tracker (~> 0.0, >= 0.0.3)
88
+ equalizer (~> 0.0, >= 0.0.9)
89
+
90
+ PLATFORMS
91
+ ruby
92
+
93
+ DEPENDENCIES
94
+ aruba
95
+ bundler (~> 1.12)
96
+ ctrl!
97
+ pry
98
+ rake (~> 10.0)
99
+ rdoc
100
+ rspec (~> 3.0)
101
+
102
+ BUNDLED WITH
103
+ 1.12.5
data/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # Ctrl
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/ctrl`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'ctrl'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install ctrl
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/ctrl.
36
+
data/README.rdoc ADDED
@@ -0,0 +1,19 @@
1
+ = ctrl - DESCRIBE YOUR GEM
2
+
3
+ Author:: YOUR NAME (YOUR EMAIL)
4
+ Copyright:: Copyright (c) 2016 YOUR NAME
5
+
6
+
7
+ DESCRIBE YOUR GEM HERE
8
+
9
+ == Links
10
+
11
+ * {Source on Github}[LINK TO GITHUB]
12
+ * RDoc[LINK TO RDOC.INFO]
13
+
14
+ == Install
15
+
16
+ == Examples
17
+
18
+ == Contributing
19
+
data/Rakefile ADDED
@@ -0,0 +1,66 @@
1
+ def dump_load_path
2
+ puts $LOAD_PATH.join("\n")
3
+ found = nil
4
+ $LOAD_PATH.each do |path|
5
+ if File.exists?(File.join(path,"rspec"))
6
+ puts "Found rspec in #{path}"
7
+ if File.exists?(File.join(path,"rspec","core"))
8
+ puts "Found core"
9
+ if File.exists?(File.join(path,"rspec","core","rake_task"))
10
+ puts "Found rake_task"
11
+ found = path
12
+ else
13
+ puts "!! no rake_task"
14
+ end
15
+ else
16
+ puts "!!! no core"
17
+ end
18
+ end
19
+ end
20
+ if found.nil?
21
+ puts "Didn't find rspec/core/rake_task anywhere"
22
+ else
23
+ puts "Found in #{path}"
24
+ end
25
+ end
26
+ require 'bundler'
27
+ require 'rake/clean'
28
+
29
+ begin
30
+ require 'rspec/core/rake_task'
31
+ rescue LoadError
32
+ dump_load_path
33
+ raise
34
+ end
35
+
36
+ require 'cucumber'
37
+ require 'cucumber/rake/task'
38
+ gem 'rdoc' # we need the installed RDoc gem, not the system one
39
+ require 'rdoc/task'
40
+
41
+ include Rake::DSL
42
+
43
+ Bundler::GemHelper.install_tasks
44
+
45
+
46
+ RSpec::Core::RakeTask.new do |t|
47
+ # Put spec opts in a file named .rspec in root
48
+ end
49
+
50
+
51
+ CUKE_RESULTS = 'results.html'
52
+ CLEAN << CUKE_RESULTS
53
+ Cucumber::Rake::Task.new(:features) do |t|
54
+ t.cucumber_opts = "features --format html -o #{CUKE_RESULTS} --format pretty --no-source -x"
55
+ t.fork = false
56
+ end
57
+
58
+ Rake::RDocTask.new do |rd|
59
+
60
+ rd.main = "README.rdoc"
61
+
62
+ rd.rdoc_files.include("README.rdoc","lib/**/*.rb","bin/**/*")
63
+ end
64
+
65
+ task :default => [:spec,:features]
66
+
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "ctrl"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/ctrl ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+ require 'methadone'
5
+ require 'ctrl.rb'
6
+
7
+ class App
8
+ include Methadone::Main
9
+ include Methadone::CLILogging
10
+
11
+ description "Control Infrastructure"
12
+
13
+ main do |command, env_name, instance_name|
14
+ cmd_klass = case command.strip
15
+ when 'ls'
16
+ Ctrl::Commands::ListInstances
17
+ when 'ssh'
18
+ Ctrl::Commands::Ssh
19
+ end
20
+
21
+ cmd_klass.new(env_name: env_name, instance_name: instance_name).perform
22
+ end
23
+
24
+ arg :command
25
+ arg :env_name, :optional
26
+ arg :instance_name, :optional
27
+
28
+ version Ctrl::VERSION
29
+
30
+ # use_log_level_option toggle_debug_on_signal: 'USR1'
31
+ leak_exceptions true
32
+ go!
33
+ end
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/ctrl.gemspec ADDED
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'ctrl/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "infra-ctrl"
8
+ spec.license=""
9
+ spec.version = Ctrl::VERSION
10
+ spec.authors = ["Matt Hall"]
11
+ spec.email = ["matt@codebeef.com"]
12
+
13
+ spec.summary = "Control infra"
14
+ spec.description = "Simple way to ls / ssh into vpns"
15
+ spec.homepage = "https://github.com/MattHall/ctrl"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = "bin"
19
+ spec.executables = ["ctrl"]
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_dependency "virtus"
23
+ spec.add_dependency('methadone', '~> 1.9.2')
24
+ spec.add_dependency('aws-sdk', '~> 2')
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.12"
27
+ spec.add_development_dependency "rake", "~> 10.0"
28
+ spec.add_development_dependency "rspec", "~> 3.0"
29
+ spec.add_development_dependency('rdoc')
30
+ spec.add_development_dependency('aruba')
31
+ spec.add_development_dependency('pry')
32
+ end
@@ -0,0 +1,19 @@
1
+ module Ctrl
2
+ module Commands
3
+ class Base
4
+ include Virtus::Model
5
+
6
+ def self.perform(*opts)
7
+ new(*opts).tap(&:perform)
8
+ end
9
+
10
+ def client
11
+ @client ||= Aws::EC2::Resource.new
12
+ end
13
+
14
+ def perform
15
+ fail 'override #perform'
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,32 @@
1
+ module Ctrl
2
+ module Commands
3
+ class ListInstances < Base
4
+ attribute :env_name, String
5
+ attribute :instance_name, String
6
+ attribute :instance_state, String
7
+
8
+ def filters
9
+ @filters ||= [
10
+ { name: 'tag:Environment', values: [env_name].compact },
11
+ { name: 'tag:Name', values: [instance_name].compact },
12
+ { name: 'instance-state-name', values: [instance_state].compact }
13
+ ].delete_if {|e| e[:values].empty?}
14
+ end
15
+
16
+ def scope
17
+ filters.any? ? client.instances(filters: filters) : client.instances
18
+ end
19
+
20
+ def instances
21
+ @instances ||= scope.inject([]) do |a, e|
22
+ a << Ctrl::Ec2Instance.from_instance(e)
23
+ end
24
+ end
25
+
26
+ def perform
27
+ puts "Instances"
28
+ puts instances.map(&:to_s)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,33 @@
1
+ module Ctrl
2
+ module Commands
3
+ class Ssh < Base
4
+ attribute :env_name, String
5
+ attribute :instance_name, String
6
+
7
+ def instances
8
+ @instances ||= ListInstances.new(
9
+ attributes.merge(instance_state: 'running')
10
+ ).instances
11
+ end
12
+
13
+ def selected_instance
14
+ @selected_instance ||= Ctrl::InstanceSelector.new(instances: instances).perform
15
+ end
16
+
17
+ def nat_instance
18
+ @nat_instance ||= ListInstances.new(
19
+ attributes.merge(instance_state: 'running', instance_name: 'nat')
20
+ ).instances.first
21
+ end
22
+
23
+ def perform
24
+ cmd = Ctrl::SshCommand.new(
25
+ nat_instance: nat_instance,
26
+ target_instance: selected_instance
27
+ )
28
+
29
+ exec cmd.to_s
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,30 @@
1
+ module Ctrl
2
+ class Ec2Instance
3
+ include Virtus::Model
4
+
5
+ attribute :private_ip_address, String
6
+ attribute :public_ip_address, String
7
+ attribute :name, String
8
+ attribute :environment, String
9
+ attribute :state, String
10
+ attribute :instance_id, String
11
+
12
+ def self.from_instance(_instance)
13
+ new.tap do |i|
14
+ name_tag = _instance.tags.select {|e| e.key == 'Name'}.first
15
+ env_tag = _instance.tags.select {|e| e.key == 'Environment'}.first
16
+
17
+ i.private_ip_address = _instance.private_ip_address
18
+ i.name = name_tag.value if name_tag
19
+ i.environment = env_tag.value if env_tag
20
+ i.state = _instance.state.name
21
+ i.instance_id = _instance.instance_id
22
+ i.public_ip_address = _instance.public_ip_address
23
+ end
24
+ end
25
+
26
+ def to_s
27
+ "%10s %20s %15s %10s %16s %16s" % [environment, name, state, instance_id, private_ip_address, public_ip_address]
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,32 @@
1
+ module Ctrl
2
+ class InstanceSelector
3
+ include Virtus::Model
4
+
5
+ attribute :instances, Array[Ec2Instance]
6
+
7
+ def display_options
8
+ puts "Instances"
9
+ instances.each_with_index do |instance, i|
10
+ puts ("%2d %s" % [i + 1, instance.to_s])
11
+ end
12
+ puts "\nPlease select an instance"
13
+ end
14
+
15
+ def selection
16
+ return @selection if @selection
17
+
18
+ loop do
19
+ display_options
20
+ selected_index = Readline.readline(">> ")
21
+ @selection = instances[selected_index.to_i - 1]
22
+ break if selected_index.to_i > 0 && @selection
23
+ end
24
+
25
+ @selection
26
+ end
27
+
28
+ def perform
29
+ instances.size == 1 ? instances.first : selection
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,28 @@
1
+ module Ctrl
2
+ class SshCommand
3
+ include Virtus::Model
4
+
5
+ NAT_USER = ENV['CTRL_SSH_NAT_USER'] || 'ec2_user'
6
+ SSH_USER = ENV['CTRL_SSH_USER'] || 'ubuntu'
7
+
8
+ attribute :nat_instance
9
+ attribute :target_instance
10
+
11
+ def target_is_nat?
12
+ nat_instance.instance_id == target_instance.instance_id
13
+ end
14
+
15
+ def direct_cmd
16
+ "ssh -A #{SSH_USER}@#{nat_instance.public_ip_address}"
17
+ end
18
+
19
+ def proxied_cmd
20
+ "ssh -A -t #{NAT_USER}@#{nat_instance.public_ip_address} \"ssh #{SSH_USER}@#{target_instance.private_ip_address}\""
21
+ end
22
+
23
+ def to_s
24
+ return direct_cmd if target_is_nat?
25
+ proxied_cmd
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,3 @@
1
+ module Ctrl
2
+ VERSION = "0.1.5"
3
+ end
data/lib/ctrl.rb ADDED
@@ -0,0 +1,16 @@
1
+ require 'aws-sdk'
2
+ require 'virtus'
3
+ require 'readline'
4
+
5
+ require "ctrl/version"
6
+
7
+ require "ctrl/ec2_instance"
8
+ require "ctrl/instance_selector"
9
+ require "ctrl/ssh_command"
10
+
11
+ require "ctrl/commands/base"
12
+ require "ctrl/commands/list_instances"
13
+ require "ctrl/commands/ssh"
14
+
15
+ module Ctrl
16
+ end
metadata ADDED
@@ -0,0 +1,190 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: infra-ctrl
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.5
5
+ platform: ruby
6
+ authors:
7
+ - Matt Hall
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-09-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: virtus
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: methadone
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.9.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.9.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: aws-sdk
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.12'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.12'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rdoc
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: aruba
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: pry
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ description: Simple way to ls / ssh into vpns
140
+ email:
141
+ - matt@codebeef.com
142
+ executables:
143
+ - ctrl
144
+ extensions: []
145
+ extra_rdoc_files: []
146
+ files:
147
+ - ".gitignore"
148
+ - ".ruby-version"
149
+ - Gemfile
150
+ - Gemfile.lock
151
+ - README.md
152
+ - README.rdoc
153
+ - Rakefile
154
+ - bin/console
155
+ - bin/ctrl
156
+ - bin/setup
157
+ - ctrl.gemspec
158
+ - lib/ctrl.rb
159
+ - lib/ctrl/commands/base.rb
160
+ - lib/ctrl/commands/list_instances.rb
161
+ - lib/ctrl/commands/ssh.rb
162
+ - lib/ctrl/ec2_instance.rb
163
+ - lib/ctrl/instance_selector.rb
164
+ - lib/ctrl/ssh_command.rb
165
+ - lib/ctrl/version.rb
166
+ homepage: https://github.com/MattHall/ctrl
167
+ licenses:
168
+ - ''
169
+ metadata: {}
170
+ post_install_message:
171
+ rdoc_options: []
172
+ require_paths:
173
+ - lib
174
+ required_ruby_version: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ version: '0'
179
+ required_rubygems_version: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - ">="
182
+ - !ruby/object:Gem::Version
183
+ version: '0'
184
+ requirements: []
185
+ rubyforge_project:
186
+ rubygems_version: 2.5.1
187
+ signing_key:
188
+ specification_version: 4
189
+ summary: Control infra
190
+ test_files: []