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 
     | 
    
         
            +
             
     |