keymaster 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,3 @@
1
+ Copyright (c) 2009 Engine Yard, Inc. <http://engineyard.com>
2
+
3
+ All Rights Reserved
@@ -0,0 +1,3 @@
1
+ == keymaster
2
+
3
+ A gem that provides...
@@ -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
@@ -0,0 +1,4 @@
1
+ TODO:
2
+ Fix LICENSE with your name
3
+ Fix Rakefile with your name and contact info
4
+ Add your code to lib/<%= name %>.rb
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+
4
+ gem 'keymaster'
5
+
6
+ require File.dirname(__FILE__) + '/../lib/keymaster'
7
+ EY::Keymaster.update!
@@ -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
@@ -0,0 +1,9 @@
1
+ module EY::Keymaster
2
+ class Response
3
+ attr_accessor :authorized_keys
4
+
5
+ def initialize(authorized_keys)
6
+ @authorized_keys = authorized_keys
7
+ end
8
+ end
9
+ 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
+