keymaster 0.0.6
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/LICENSE +3 -0
- data/README.md +3 -0
- data/Rakefile +48 -0
- data/TODO +4 -0
- data/bin/ey-keymaster +7 -0
- data/lib/keymaster.rb +53 -0
- data/lib/keymaster/request.rb +31 -0
- data/lib/keymaster/response.rb +9 -0
- metadata +61 -0
data/LICENSE
ADDED
data/README.md
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'rake/gempackagetask'
|
2
|
+
require 'rubygems/specification'
|
3
|
+
require 'date'
|
4
|
+
require 'bundler'
|
5
|
+
|
6
|
+
task :default => :spec
|
7
|
+
|
8
|
+
spec = Gem::Specification.new do |s|
|
9
|
+
s.name = "keymaster"
|
10
|
+
s.version = "0.0.6"
|
11
|
+
s.author = "Ninjas at Engine Yard"
|
12
|
+
s.email = "ninja@engineyard.com"
|
13
|
+
s.homepage = "http://example.com"
|
14
|
+
s.description = s.summary = "A gem that updates ssh authorized_keys on an instance"
|
15
|
+
|
16
|
+
s.platform = Gem::Platform::RUBY
|
17
|
+
s.has_rdoc = false
|
18
|
+
|
19
|
+
manifest = Bundler::Environment.load(File.dirname(__FILE__) + '/Gemfile')
|
20
|
+
manifest.dependencies.each do |d|
|
21
|
+
next unless d.only && d.only.include?('release')
|
22
|
+
s.add_dependency(d.name, d.version)
|
23
|
+
end
|
24
|
+
|
25
|
+
s.require_path = 'lib'
|
26
|
+
s.files = %w(LICENSE README.md Rakefile TODO) + Dir.glob("{lib}/**/*")
|
27
|
+
|
28
|
+
s.bindir = "bin"
|
29
|
+
s.executables = %w( ey-keymaster )
|
30
|
+
end
|
31
|
+
|
32
|
+
require 'spec/rake/spectask'
|
33
|
+
desc "Run specs"
|
34
|
+
Spec::Rake::SpecTask.new do |t|
|
35
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
36
|
+
t.spec_opts = %w(-fs --color)
|
37
|
+
end
|
38
|
+
|
39
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
40
|
+
pkg.gem_spec = spec
|
41
|
+
end
|
42
|
+
|
43
|
+
desc "create a gemspec file"
|
44
|
+
task :make_spec do
|
45
|
+
File.open("#{GEM}.gemspec", "w") do |file|
|
46
|
+
file.puts spec.to_ruby
|
47
|
+
end
|
48
|
+
end
|
data/TODO
ADDED
data/bin/ey-keymaster
ADDED
data/lib/keymaster.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'open-uri'
|
3
|
+
|
4
|
+
DNA_FILE = "/etc/chef/dna.json" unless defined?(DNA_FILE)
|
5
|
+
|
6
|
+
module EY
|
7
|
+
module Keymaster
|
8
|
+
def self.fetch(url)
|
9
|
+
Request.fetch(url)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.update!(filename = File.expand_path("~/.ssh/authorized_keys"))
|
13
|
+
new_keys = keys
|
14
|
+
FileUtils.mkdir_p(File.expand_path("~/.ssh/"))
|
15
|
+
File.open(filename, "w") do |fp|
|
16
|
+
new_keys.each do |key|
|
17
|
+
fp.puts key
|
18
|
+
end
|
19
|
+
fp.chmod(0600)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.keys
|
24
|
+
(management_keys + amazon_keys + user_keys).uniq
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.management_keys
|
28
|
+
response = Request.fetch("http://gatekeeper.ninja-staging.engineyard.com/cloud/root?token=#{instance_token}")
|
29
|
+
response.authorized_keys
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.amazon_keys
|
33
|
+
[ open('http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key').read ]
|
34
|
+
rescue OpenURI::HTTPError
|
35
|
+
[]
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.user_keys
|
39
|
+
dna["user_ssh_key"]
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.instance_token
|
43
|
+
dna["reporting_url"].split(/\//).last
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.dna
|
47
|
+
YAML.load_file(DNA_FILE)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
require 'keymaster/response'
|
53
|
+
require 'keymaster/request'
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
|
3
|
+
module EY::Keymaster
|
4
|
+
class Request
|
5
|
+
class RequestError < StandardError
|
6
|
+
def initialize(code, body)
|
7
|
+
@code, @body = code, body
|
8
|
+
end
|
9
|
+
|
10
|
+
def message
|
11
|
+
"RequestFailed: #{@code} -> #{@body}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
def self.fetch(url)
|
15
|
+
Response.new(get(url))
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.get(url)
|
19
|
+
url = URI.parse(url)
|
20
|
+
res = Net::HTTP.start(url.host, url.port) do |http|
|
21
|
+
http.get(url.path)
|
22
|
+
end
|
23
|
+
case res.code
|
24
|
+
when "200"
|
25
|
+
res.body.split("\n")
|
26
|
+
else
|
27
|
+
raise RequestError.new(res.code, res.body)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
metadata
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: keymaster
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.6
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ninjas at Engine Yard
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-12-11 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: A gem that updates ssh authorized_keys on an instance
|
17
|
+
email: ninja@engineyard.com
|
18
|
+
executables:
|
19
|
+
- ey-keymaster
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- LICENSE
|
26
|
+
- README.md
|
27
|
+
- Rakefile
|
28
|
+
- TODO
|
29
|
+
- lib/keymaster/response.rb
|
30
|
+
- lib/keymaster/request.rb
|
31
|
+
- lib/keymaster.rb
|
32
|
+
has_rdoc: true
|
33
|
+
homepage: http://example.com
|
34
|
+
licenses: []
|
35
|
+
|
36
|
+
post_install_message:
|
37
|
+
rdoc_options: []
|
38
|
+
|
39
|
+
require_paths:
|
40
|
+
- lib
|
41
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: "0"
|
46
|
+
version:
|
47
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: "0"
|
52
|
+
version:
|
53
|
+
requirements: []
|
54
|
+
|
55
|
+
rubyforge_project:
|
56
|
+
rubygems_version: 1.3.5
|
57
|
+
signing_key:
|
58
|
+
specification_version: 3
|
59
|
+
summary: A gem that updates ssh authorized_keys on an instance
|
60
|
+
test_files: []
|
61
|
+
|