ey_info 0.1.0
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.
- data/README.markdown +72 -0
- data/Rakefile +30 -0
- data/TODO +23 -0
- data/bin/ey_info +5 -0
- data/ey_info.gemspec +54 -0
- data/lib/ey_info.rb +190 -0
- data/lib/templates/default_ssh_config.erb +12 -0
- data/lib/text_injector.rb +92 -0
- data/test/ey_info_test.rb +19 -0
- data/test/test_helper.rb +16 -0
- metadata +94 -0
data/README.markdown
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
Ey Info
|
2
|
+
=======
|
3
|
+
|
4
|
+
Summary
|
5
|
+
-------
|
6
|
+
Quickly set up your ~/.ssh/config shortcuts for your ey cloud servers.
|
7
|
+
|
8
|
+
Install
|
9
|
+
-------
|
10
|
+
|
11
|
+
<pre>
|
12
|
+
gem install --no-ri --no-rdoc ey_info # sudo if you need to
|
13
|
+
</pre>
|
14
|
+
|
15
|
+
Usage Command Line
|
16
|
+
-------
|
17
|
+
|
18
|
+
<pre>
|
19
|
+
# will set up your ~/ssh/config shortcuts.
|
20
|
+
$ ey_info -i "id_rsa" -u "root" # same as defaults
|
21
|
+
$ ey_info # same as above
|
22
|
+
</pre>
|
23
|
+
|
24
|
+
If you're environment in the ey cloud dashboard is called 'production' with an app_master, and 2 app instances.
|
25
|
+
|
26
|
+
<pre>
|
27
|
+
$ ssh production_app_master
|
28
|
+
vs
|
29
|
+
$ ssh -i ~/.ssh/id-rsa root@ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com
|
30
|
+
|
31
|
+
$ ssh production_app1
|
32
|
+
$ ssh production_app2
|
33
|
+
$ ssh production_db_master
|
34
|
+
$ ssh production_db_slave1
|
35
|
+
</pre>
|
36
|
+
|
37
|
+
Usage With Capistrano
|
38
|
+
-------
|
39
|
+
|
40
|
+
I still find capistrano a very useful utility for debugging and still use wanted to use it with EY's cloud.
|
41
|
+
|
42
|
+
<pre>
|
43
|
+
$ cap invoke COMMAND="..." is extremely useful. The engineyard gem provides a
|
44
|
+
"ey ssh 'uptime' --all -e production" command but it loops through the servers one by one instead of running
|
45
|
+
the commands in parallel, which can be slow if you have lots of servers.
|
46
|
+
</pre>
|
47
|
+
|
48
|
+
You can use this gem to dynamically grab the ec2 hosts information from your ey environment and set up your
|
49
|
+
capistrano roles.
|
50
|
+
|
51
|
+
Here are a few examples of how you can use it in your config/deploy.rb:
|
52
|
+
|
53
|
+
<pre>
|
54
|
+
require 'ey_info'
|
55
|
+
task :production do
|
56
|
+
@info = EyInfo::Hosts.new
|
57
|
+
hosts = @info.hosts("production") # parameter is the environment name in EY's gui interface
|
58
|
+
|
59
|
+
role :db, hosts.find {|x| x[:role] == "app_master" }[:ssh_key], :primary => true
|
60
|
+
# app instances
|
61
|
+
hosts.select {|x| x[:role] =~ /app/ }.each do |h|
|
62
|
+
role :web, h[:ssh_key]
|
63
|
+
role :app, h[:ssh_key], :sphinx => true
|
64
|
+
end
|
65
|
+
# utility instances
|
66
|
+
hosts.select {|x| x[:role] =~ /util/ }.each do |h|
|
67
|
+
role :web, h[:ssh_key]
|
68
|
+
role :app, h[:ssh_key], :sphinx => true
|
69
|
+
end
|
70
|
+
end
|
71
|
+
</pre>
|
72
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.expand_path('../lib/ey_info', __FILE__)
|
2
|
+
begin
|
3
|
+
require 'jeweler'
|
4
|
+
Jeweler::Tasks.new do |gem|
|
5
|
+
gem.version = EyInfo::Version
|
6
|
+
gem.name = "ey_info"
|
7
|
+
gem.executables = %W(ey_info)
|
8
|
+
gem.summary = %Q{Ey Info - Easy way to setup ssh keys for ey cloud servers}
|
9
|
+
gem.description = %Q{Ey Info - Easy way to setup ssh keys for ey cloud servers and also to dynamically pull server information from your ey servers and just it within capistrano.}
|
10
|
+
gem.homepage = "http://github.com/tongueroo/ey_info"
|
11
|
+
gem.email = [ "tongueroo@gmail.com" ]
|
12
|
+
gem.authors = [ "Tung Nguyen" ]
|
13
|
+
gem.add_dependency "engineyard", ">=1.3.11"
|
14
|
+
# gem.add_dependency "net-sftp", ">=2.0.0"
|
15
|
+
# gem.add_development_dependency "mocha", ">= 0"
|
16
|
+
end
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'rake/testtask'
|
22
|
+
Rake::TestTask.new(:test) do |test|
|
23
|
+
test.libs << 'lib' << 'test'
|
24
|
+
test.pattern = 'test/**/*_test.rb'
|
25
|
+
test.verbose = true
|
26
|
+
end
|
27
|
+
|
28
|
+
task :test => :check_dependencies
|
29
|
+
task :default => :test
|
30
|
+
|
data/TODO
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
CloudInfo::Instances outline
|
2
|
+
1. connect to ec2
|
3
|
+
|
4
|
+
2. find instances that are in the ey-env
|
5
|
+
find ey instances from ey-recipes for specific environment
|
6
|
+
grab aws_group from one of the instances in the ey-env
|
7
|
+
instances in group
|
8
|
+
I can simply also just grab the instances from ey-recipes instead of working back from the aws_group..
|
9
|
+
|
10
|
+
3. connect to instances (ssh) and build info
|
11
|
+
connect to servers
|
12
|
+
download json and store in dictionary lookup
|
13
|
+
at this point we have enough data about the servers to build up the info we want
|
14
|
+
|
15
|
+
4. hosts
|
16
|
+
{:prod_app0 => 'xx.xx.xx.xx', :prod_app1 => 'xx.xx.xx.xx'}
|
17
|
+
|
18
|
+
============
|
19
|
+
good stopping point:
|
20
|
+
* figure out a way to test exception from ssh.connect
|
21
|
+
* bad password
|
22
|
+
* timeout
|
23
|
+
|
data/bin/ey_info
ADDED
data/ey_info.gemspec
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{ey_info}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Tung Nguyen"]
|
12
|
+
s.date = %q{2011-01-03}
|
13
|
+
s.default_executable = %q{ey_info}
|
14
|
+
s.description = %q{Ey Info - Easy way to setup ssh keys for ey cloud servers and also to dynamically pull server information from your ey servers and just it within capistrano.}
|
15
|
+
s.email = ["tongueroo@gmail.com"]
|
16
|
+
s.executables = ["ey_info"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"README.markdown",
|
19
|
+
"TODO"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
"README.markdown",
|
23
|
+
"Rakefile",
|
24
|
+
"TODO",
|
25
|
+
"bin/ey_info",
|
26
|
+
"lib/ey_info.rb",
|
27
|
+
"lib/templates/default_ssh_config.erb",
|
28
|
+
"lib/text_injector.rb",
|
29
|
+
"test/ey_info_test.rb",
|
30
|
+
"test/test_helper.rb"
|
31
|
+
]
|
32
|
+
s.homepage = %q{http://github.com/tongueroo/ey_info}
|
33
|
+
s.require_paths = ["lib"]
|
34
|
+
s.rubygems_version = %q{1.3.7}
|
35
|
+
s.summary = %q{Ey Info - Easy way to setup ssh keys for ey cloud servers}
|
36
|
+
s.test_files = [
|
37
|
+
"test/ey_info_test.rb",
|
38
|
+
"test/test_helper.rb"
|
39
|
+
]
|
40
|
+
|
41
|
+
if s.respond_to? :specification_version then
|
42
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
43
|
+
s.specification_version = 3
|
44
|
+
|
45
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
46
|
+
s.add_runtime_dependency(%q<engineyard>, [">= 1.3.11"])
|
47
|
+
else
|
48
|
+
s.add_dependency(%q<engineyard>, [">= 1.3.11"])
|
49
|
+
end
|
50
|
+
else
|
51
|
+
s.add_dependency(%q<engineyard>, [">= 1.3.11"])
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
data/lib/ey_info.rb
ADDED
@@ -0,0 +1,190 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'engineyard'
|
4
|
+
require 'optparse'
|
5
|
+
require 'erb'
|
6
|
+
require 'pp'
|
7
|
+
require File.expand_path("../text_injector", __FILE__)
|
8
|
+
|
9
|
+
module EyInfo
|
10
|
+
Version = "0.1.0"
|
11
|
+
|
12
|
+
class CLI
|
13
|
+
def self.run(args)
|
14
|
+
cli = new(args)
|
15
|
+
cli.parse_options!
|
16
|
+
cli.run
|
17
|
+
end
|
18
|
+
|
19
|
+
# The array of (unparsed) command-line options
|
20
|
+
attr_reader :args
|
21
|
+
# The hash of (parsed) command-line options
|
22
|
+
attr_reader :options
|
23
|
+
|
24
|
+
def initialize(args)
|
25
|
+
@args = args.dup
|
26
|
+
end
|
27
|
+
|
28
|
+
def option_parser
|
29
|
+
# @logger = Logger.new
|
30
|
+
@option_parser ||= OptionParser.new do |opts|
|
31
|
+
opts.banner = "Usage: #{File.basename($0)} ssh_config"
|
32
|
+
|
33
|
+
opts.on("-i", "--identity-file [IDENTITY_FILE]", "ssh key default id_rsa.") do |value|
|
34
|
+
options[:ssh_key] = value
|
35
|
+
end
|
36
|
+
|
37
|
+
opts.on("-u", "--user [USER]", "ssh key default root.") do |value|
|
38
|
+
options[:user] = value
|
39
|
+
end
|
40
|
+
|
41
|
+
opts.on("-h", "--help", "Display this help message.") do
|
42
|
+
puts opts
|
43
|
+
exit
|
44
|
+
end
|
45
|
+
|
46
|
+
opts.on("-V", "--version",
|
47
|
+
"Display the ey_info version, and exit."
|
48
|
+
) do
|
49
|
+
puts "EyInfo Version #{EyInfo::Version}"
|
50
|
+
exit
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def parse_options!
|
57
|
+
# defaults
|
58
|
+
@options = {:actions => [], :user => 'root', :ssh_key => 'id_rsa'}
|
59
|
+
|
60
|
+
if args.empty?
|
61
|
+
warn "Please specifiy an action to execute."
|
62
|
+
warn option_parser
|
63
|
+
exit 1
|
64
|
+
end
|
65
|
+
|
66
|
+
option_parser.parse!(args)
|
67
|
+
extract_environment_variables!
|
68
|
+
|
69
|
+
options[:actions].concat(args)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Extracts name=value pairs from the remaining command-line arguments
|
73
|
+
# and assigns them as environment variables.
|
74
|
+
def extract_environment_variables! #:nodoc:
|
75
|
+
args.delete_if do |arg|
|
76
|
+
next unless arg.match(/^(\w+)=(.*)$/)
|
77
|
+
ENV[$1] = $2
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def run
|
82
|
+
write_ssh_config
|
83
|
+
puts "Your #{ENV['HOME']}/.ssh/config now has shortcuts your ey cloud servers."
|
84
|
+
end
|
85
|
+
|
86
|
+
def write_ssh_config
|
87
|
+
@ssh_config = "#{ENV['HOME']}/.ssh/config"
|
88
|
+
@info = EyInfo::Hosts.new
|
89
|
+
|
90
|
+
# clear out old known_hosts
|
91
|
+
`grep -v 'compute-1.amazonaws.com' ~/.ssh/known_hosts > ~/.ssh/known_hosts.tmp`
|
92
|
+
`mv ~/.ssh/known_hosts.tmp ~/.ssh/known_hosts`
|
93
|
+
|
94
|
+
# for erb template
|
95
|
+
@identify_file = "~/.ssh/#{options[:ssh_key]}"
|
96
|
+
@user = options[:user]
|
97
|
+
|
98
|
+
if File.exist?(@ssh_config)
|
99
|
+
injector = TextInjector.new(
|
100
|
+
:file => @ssh_config,
|
101
|
+
:update => true,
|
102
|
+
:content => ssh_servers
|
103
|
+
)
|
104
|
+
else
|
105
|
+
injector = TextInjector.new(
|
106
|
+
:file => @ssh_config,
|
107
|
+
:write => true,
|
108
|
+
:content => ssh_servers
|
109
|
+
)
|
110
|
+
end
|
111
|
+
injector.run
|
112
|
+
end
|
113
|
+
|
114
|
+
def ssh_servers
|
115
|
+
@hosts = {}
|
116
|
+
@info = EyInfo::Hosts.new
|
117
|
+
all_hosts = @info.all_hosts
|
118
|
+
all_hosts.keys.each do |env_name|
|
119
|
+
all_hosts[env_name].each do |server|
|
120
|
+
@hosts["#{server[:ssh_key]}"] = server[:hostname]
|
121
|
+
end
|
122
|
+
end
|
123
|
+
# content = IO.readlines(RAILS_ROOT+"/dev/ssh_config.erb").join("")
|
124
|
+
content = IO.readlines(File.expand_path("../templates/default_ssh_config.erb", __FILE__)).join("")
|
125
|
+
template = ERB.new(content)
|
126
|
+
template.result(binding)
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
class Hosts
|
132
|
+
def initialize(options = {})
|
133
|
+
@api_token = YAML.load_file(File.expand_path("~/.eyrc"))["api_token"]
|
134
|
+
@api = EY::API.new(@api_token)
|
135
|
+
@envs = @api.apps.map{ |a| a.environments }
|
136
|
+
end
|
137
|
+
|
138
|
+
def all_hosts
|
139
|
+
hosts = {}
|
140
|
+
@envs.flatten.map{|x| x.name}.sort.uniq.each do |env_name, index|
|
141
|
+
env_name = env_name.to_sym
|
142
|
+
arr = []
|
143
|
+
app_count = 0
|
144
|
+
db_count = 0
|
145
|
+
|
146
|
+
@api.environments.match_one!(env_name.to_s).instances.sort_by {|x| x.hostname}.each do |i, idx|
|
147
|
+
# if i.role == 'app_master'
|
148
|
+
# key = "app0"
|
149
|
+
# elsif i.role == 'app'
|
150
|
+
# app_count += 1
|
151
|
+
# key = "app#{app_count}"
|
152
|
+
# elsif i.role == 'db_master'
|
153
|
+
# key = "db0"
|
154
|
+
# elsif i.role == 'db_slave'
|
155
|
+
# db_count += 1
|
156
|
+
# key = "db#{db_count}"
|
157
|
+
# elsif i.role == 'util'
|
158
|
+
# key = "#{i.name}"
|
159
|
+
# elsif i.role == 'solo'
|
160
|
+
# key = "solo"
|
161
|
+
# end
|
162
|
+
|
163
|
+
key = i.role == 'util' ? i.name : i.role
|
164
|
+
if key == 'app'
|
165
|
+
app_count += 1
|
166
|
+
key = "app#{app_count}"
|
167
|
+
elsif key == 'db_slave'
|
168
|
+
db_count += 1
|
169
|
+
key = "db_slave#{db_count}"
|
170
|
+
end
|
171
|
+
|
172
|
+
arr << {
|
173
|
+
:ssh_key => "#{env_name}_#{key}",
|
174
|
+
:hostname => i.hostname,
|
175
|
+
:role => i.role,
|
176
|
+
:name => i.name
|
177
|
+
}
|
178
|
+
end
|
179
|
+
|
180
|
+
hosts[env_name] = arr
|
181
|
+
end
|
182
|
+
hosts
|
183
|
+
end
|
184
|
+
|
185
|
+
def hosts(env_name)
|
186
|
+
all_hosts[env_name.to_sym]
|
187
|
+
end
|
188
|
+
|
189
|
+
end
|
190
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
##########################################
|
2
|
+
# ey cloud environments
|
3
|
+
StrictHostKeyChecking no
|
4
|
+
|
5
|
+
<% @hosts.keys.sort.each do |name| %>
|
6
|
+
Host <%= name %>
|
7
|
+
Hostname <%= @hosts[name] %>
|
8
|
+
Port 22
|
9
|
+
User <%= @user %>
|
10
|
+
IdentityFile <%= @identify_file %>
|
11
|
+
|
12
|
+
<% end %>
|
@@ -0,0 +1,92 @@
|
|
1
|
+
class TextInjector
|
2
|
+
def initialize(options={})
|
3
|
+
@options = options
|
4
|
+
|
5
|
+
@options[:file] ||= raise "required :file option missing"
|
6
|
+
@identifier ||= (@options[:identifier] || default_identifier)
|
7
|
+
@content ||= @options[:content]
|
8
|
+
|
9
|
+
if @options[:update] && !File.exists?(@options[:file])
|
10
|
+
warn("[fail] Can't find file: #{@options[:file]}")
|
11
|
+
exit(1)
|
12
|
+
end
|
13
|
+
|
14
|
+
if @options[:update] && @options[:write]
|
15
|
+
warn("[fail] Can't update AND write. choose one.")
|
16
|
+
exit(1)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# both setter and getter for the dsl
|
21
|
+
def content(text = nil)
|
22
|
+
text.nil? ? @content : @content = text
|
23
|
+
end
|
24
|
+
def identifier(id = nil)
|
25
|
+
id.nil? ? @identifier : @identifier = id
|
26
|
+
end
|
27
|
+
|
28
|
+
def run
|
29
|
+
if @options[:update]
|
30
|
+
write_file(updated_file)
|
31
|
+
elsif @options[:write]
|
32
|
+
write_file(marked_content)
|
33
|
+
else
|
34
|
+
puts marked_content
|
35
|
+
exit
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
protected
|
40
|
+
|
41
|
+
def default_identifier
|
42
|
+
File.expand_path(@options[:file])
|
43
|
+
end
|
44
|
+
|
45
|
+
def marked_content
|
46
|
+
@marked_content ||= [comment_open, @content, comment_close].join("\n")
|
47
|
+
end
|
48
|
+
|
49
|
+
def read_file
|
50
|
+
return @current_file if @current_file
|
51
|
+
results = ''
|
52
|
+
File.open(@options[:file], 'r') {|f| results = f.readlines.join("") }
|
53
|
+
@current_file = results
|
54
|
+
end
|
55
|
+
|
56
|
+
def write_file(contents)
|
57
|
+
File.open(@options[:file], 'w') do |file|
|
58
|
+
file.write(contents)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def updated_file
|
63
|
+
# Check for unopened or unclosed identifier blocks
|
64
|
+
if read_file.index(comment_open) && !read_file.index(comment_close)
|
65
|
+
warn "[fail] Unclosed indentifier; Your file contains '#{comment_open}', but no '#{comment_close}'"
|
66
|
+
exit(1)
|
67
|
+
elsif !read_file.index(comment_open) && read_file.index(comment_close)
|
68
|
+
warn "[fail] Unopened indentifier; Your file contains '#{comment_close}', but no '#{comment_open}'"
|
69
|
+
exit(1)
|
70
|
+
end
|
71
|
+
|
72
|
+
# If an existing identifier block is found, replace it with the content text
|
73
|
+
if read_file.index(comment_open) && read_file.index(comment_close)
|
74
|
+
read_file.gsub(Regexp.new("#{comment_open}.+#{comment_close}", Regexp::MULTILINE), marked_content)
|
75
|
+
else # Otherwise, append the new content after
|
76
|
+
[read_file, marked_content].join("\n\n")
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def comment_base
|
81
|
+
"TextInjector marker for: #{@identifier}"
|
82
|
+
end
|
83
|
+
|
84
|
+
def comment_open
|
85
|
+
"# Begin #{comment_base}"
|
86
|
+
end
|
87
|
+
|
88
|
+
def comment_close
|
89
|
+
"# End #{comment_base}"
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.expand_path("../test_helper", __FILE__)
|
2
|
+
|
3
|
+
class EyInfoTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@info = EyInfo::Hosts.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_all_hosts_hash
|
9
|
+
# pp @info.all_hosts
|
10
|
+
assert_equal @info.all_hosts.class, Hash
|
11
|
+
assert @info.all_hosts.keys.include?(:beta)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_hosts_hash
|
15
|
+
pp @info.hosts(:alpha)
|
16
|
+
assert @info.hosts(:alpha).class, Array
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
ENV['RAILS_ENV'] = 'test'
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'test/unit'
|
7
|
+
require 'mocha'
|
8
|
+
require 'pp'
|
9
|
+
require File.expand_path("../../lib/ey_info", __FILE__)
|
10
|
+
|
11
|
+
module TestExtensions
|
12
|
+
end
|
13
|
+
|
14
|
+
class Test::Unit::TestCase
|
15
|
+
include TestExtensions
|
16
|
+
end
|
metadata
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ey_info
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Tung Nguyen
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-01-03 00:00:00 -08:00
|
19
|
+
default_executable: ey_info
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: engineyard
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 13
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 3
|
33
|
+
- 11
|
34
|
+
version: 1.3.11
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
description: Ey Info - Easy way to setup ssh keys for ey cloud servers and also to dynamically pull server information from your ey servers and just it within capistrano.
|
38
|
+
email:
|
39
|
+
- tongueroo@gmail.com
|
40
|
+
executables:
|
41
|
+
- ey_info
|
42
|
+
extensions: []
|
43
|
+
|
44
|
+
extra_rdoc_files:
|
45
|
+
- README.markdown
|
46
|
+
- TODO
|
47
|
+
files:
|
48
|
+
- README.markdown
|
49
|
+
- Rakefile
|
50
|
+
- TODO
|
51
|
+
- bin/ey_info
|
52
|
+
- ey_info.gemspec
|
53
|
+
- lib/ey_info.rb
|
54
|
+
- lib/templates/default_ssh_config.erb
|
55
|
+
- lib/text_injector.rb
|
56
|
+
- test/ey_info_test.rb
|
57
|
+
- test/test_helper.rb
|
58
|
+
has_rdoc: true
|
59
|
+
homepage: http://github.com/tongueroo/ey_info
|
60
|
+
licenses: []
|
61
|
+
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options: []
|
64
|
+
|
65
|
+
require_paths:
|
66
|
+
- lib
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
hash: 3
|
73
|
+
segments:
|
74
|
+
- 0
|
75
|
+
version: "0"
|
76
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
hash: 3
|
82
|
+
segments:
|
83
|
+
- 0
|
84
|
+
version: "0"
|
85
|
+
requirements: []
|
86
|
+
|
87
|
+
rubyforge_project:
|
88
|
+
rubygems_version: 1.3.7
|
89
|
+
signing_key:
|
90
|
+
specification_version: 3
|
91
|
+
summary: Ey Info - Easy way to setup ssh keys for ey cloud servers
|
92
|
+
test_files:
|
93
|
+
- test/ey_info_test.rb
|
94
|
+
- test/test_helper.rb
|