itamae-plugin-resource-authorized_keys 0.0.1

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: dfcbb26fc7f2a800ee8eb8813ba79fce54508c92
4
+ data.tar.gz: 799cdaf31187dfa2e5c929d6aef6e32c1a85f443
5
+ SHA512:
6
+ metadata.gz: 4e0a13d0471ef2521c05136449e04971881714d5f934c2db15a98d62cabb5f834d8bcd6983d5f21815e748dcddcc5cb9e03f99a6726253e015d6a6b030288ff5
7
+ data.tar.gz: d6faa5e7921ed3a8ee0770e0563af18d3502a996726239d5f210b1ea6dd766e8888b3e49e9ce2aaa132b30cf121b9b42f758f14fc036db9aa108987c78a337ed
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ .vagrant
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in itamae-plugin-resource-ssh_key.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # Authorized Keys Resource for Itamae
2
+
3
+ This gem is an itamae plugin resource to provide user's SSH public key.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'itamae-plugin-resource-authorized_keys'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ ## Usage
18
+
19
+ In your recipe:
20
+
21
+ ```ruby
22
+ require "itamae/plugin/resource/authorized_keys"
23
+
24
+ user "user01"
25
+ authorized_keys "user01" do
26
+ content "ssh-rsa A..."
27
+ end
28
+
29
+ user "user02"
30
+ authorized_keys "user02" do
31
+ content ["ssh-rsa A...", "ssh-rsa A..."]
32
+ end
33
+
34
+ user "user03"
35
+ authorized_keys "user03" do
36
+ source "/home/user/.ssh/id_rsa.pub"
37
+ end
38
+
39
+ # Import SSH keys from github user.
40
+ user "user04"
41
+ authorized_keys "user04" do
42
+ github "user04"
43
+ end
44
+ ```
45
+
46
+ ## Development
47
+
48
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
49
+
50
+ 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` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
51
+
52
+ ## Contributing
53
+
54
+ 1. Fork it ( https://github.com/[my-github-username]/itamae-plugin-resource-authorized_keys/fork )
55
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
56
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
57
+ 4. Push to the branch (`git push origin my-new-feature`)
58
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,55 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+ require "tempfile"
4
+ require "net/ssh"
5
+
6
+ VAGRANT_HOSTNAME = "itamae-spec-authorizedkeys"
7
+
8
+ desc "Run provisining vagrant and serverspec tests"
9
+ task integration: ["integration:provision", "integration:spec", "integration:destroy"]
10
+
11
+ namespace :integration do
12
+ desc "Provision Vagrant"
13
+ task :provision do
14
+ env = {"VAGRANT_CWD" => File.expand_path("./spec/integration")}
15
+ tmp_ssh_config = Tempfile.new("", Dir.tmpdir)
16
+
17
+ Bundler.with_clean_env do
18
+ system(env, "vagrant up #{VAGRANT_HOSTNAME}") || abort
19
+ system(env, "vagrant ssh-config #{VAGRANT_HOSTNAME} > #{tmp_ssh_config.path}") || abort
20
+
21
+ ssh_option = Net::SSH::Config.for(VAGRANT_HOSTNAME, [tmp_ssh_config.path])
22
+
23
+ cmd = [
24
+ "bundle exec itamae ssh",
25
+ "-h #{ssh_option[:host_name]}",
26
+ "-u #{ssh_option[:user]}",
27
+ "-p #{ssh_option[:port]}",
28
+ "-i #{ssh_option[:keys].first}",
29
+ "-l debug",
30
+ "spec/integration/recipe.rb"
31
+ ]
32
+
33
+ cmd << "--dry-run" if ENV["DRY_RUN"]
34
+
35
+ cmd_str = cmd.join(" ")
36
+ puts cmd_str
37
+ system(cmd_str) || abort
38
+ end
39
+ end
40
+
41
+ desc "Run serverspec tests"
42
+ RSpec::Core::RakeTask.new(:spec) do |t|
43
+ t.ruby_opts = "-I ./spec/integration"
44
+ t.pattern = "spec/integration/*_spec.rb"
45
+ end
46
+
47
+ desc "Destroy Vagrant Virtual Machine"
48
+ task :destroy do
49
+ env = {"VAGRANT_CWD" => File.expand_path("./spec/integration")}
50
+
51
+ Bundler.with_clean_env do
52
+ system(env, "vagrant destroy #{VAGRANT_HOSTNAME}") || abort
53
+ end
54
+ end
55
+ end
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "itamae/plugin/resource/ssh_key"
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/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "itamae-plugin-resource-authorized_keys"
7
+ spec.version = "0.0.1"
8
+ spec.authors = ["nownabe"]
9
+ spec.email = ["nownabe@gmail.com"]
10
+
11
+ spec.summary = %q{An Itamae plugin to provide user's authorized_keys file.}
12
+
13
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
14
+ spec.bindir = "exe"
15
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
16
+ spec.require_paths = ["lib"]
17
+
18
+ spec.add_dependency "itamae"
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.9"
21
+ spec.add_development_dependency "rake", "~> 10.0"
22
+ spec.add_development_dependency "rspec"
23
+ spec.add_development_dependency "webmock"
24
+ spec.add_development_dependency "serverspec"
25
+ end
@@ -0,0 +1,121 @@
1
+ require "open-uri"
2
+ require "itamae/resource/file"
3
+
4
+ module Itamae
5
+ module Plugin
6
+ module Resource
7
+ class AuthorizedKeys < ::Itamae::Resource::File
8
+ define_attribute :content, type: [String, Array]
9
+ define_attribute :github, type: String
10
+ define_attribute :source, type: String
11
+ define_attribute :username, type: String, default_name: true
12
+
13
+ def action_create(options)
14
+ return unless user_exist?
15
+ create_ssh_directory unless current.dir_exist
16
+ super
17
+ end
18
+
19
+ def pre_action
20
+ return unless user_exist?
21
+ set_attributes
22
+ super
23
+ end
24
+
25
+ def set_current_attributes
26
+ return unless user_exist?
27
+ super
28
+
29
+ current.dir_exist = run_specinfra(:check_file_is_directory, ssh_directory)
30
+ if current.dir_exist
31
+ current.dir_mode = current_ssh_directory_mode
32
+ current.dir_owner = current_ssh_directory_owner
33
+ current.dir_group = current_ssh_directory_group
34
+ end
35
+ end
36
+
37
+ def show_differences
38
+ current.mode = current.mode.rjust(4, "0") if current.mode
39
+ current.dir_mode = current.dir_mode.rjust(4, "0") if current.dir_mode
40
+
41
+ super
42
+ end
43
+
44
+ private
45
+
46
+ def content_file
47
+ if ssh_keys
48
+ nil
49
+ else
50
+ source_file
51
+ end
52
+ end
53
+
54
+ def create_ssh_directory
55
+ run_specinfra(:create_file_as_directory, ssh_directory)
56
+ run_specinfra(:change_file_mode, ssh_directory, attributes.dir_mode)
57
+ run_specinfra(:change_file_owner, ssh_directory, attributes.dir_owner, attributes.dir_group)
58
+ end
59
+
60
+ def current_ssh_directory_mode
61
+ run_specinfra(:get_file_mode, ssh_directory).stdout.strip
62
+ end
63
+
64
+ def current_ssh_directory_owner
65
+ run_specinfra(:get_file_owner_user, ssh_directory).stdout.strip
66
+ end
67
+
68
+ def current_ssh_directory_group
69
+ run_specinfra(:get_file_owner_group, ssh_directory).stdout.strip
70
+ end
71
+
72
+ def home_directory
73
+ run_specinfra(:get_user_home_directory, attributes.username).stdout.strip
74
+ end
75
+
76
+ def keys_from_github
77
+ open("https://github.com/#{attributes.github}.keys").read
78
+ end
79
+
80
+ def keys_path
81
+ ::File.join(ssh_directory, "authorized_keys")
82
+ end
83
+
84
+ def set_attributes
85
+ attributes.content = ssh_keys
86
+ attributes.mode = "0600"
87
+ attributes.owner = attributes.username
88
+ attributes.group = attributes.username
89
+ attributes.path = keys_path
90
+
91
+ attributes.dir_mode = "0700"
92
+ attributes.dir_owner = attributes.username
93
+ attributes.dir_group = attributes.username
94
+ end
95
+
96
+ def source_file
97
+ @source_file ||= ::File.expand_path(attributes.source, @recipe.dir)
98
+ end
99
+
100
+ def ssh_directory
101
+ @ssh_directory ||= ::File.join(home_directory, ".ssh")
102
+ end
103
+
104
+ def ssh_keys
105
+ @ssh_keys ||=
106
+ if attributes.content
107
+ [*attributes.content].join("\n")
108
+ elsif attributes.github
109
+ keys_from_github
110
+ else
111
+ nil
112
+ end
113
+ end
114
+
115
+ def user_exist?
116
+ run_specinfra(:check_user_exists, attributes.username)
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,9 @@
1
+ module Itamae
2
+ module Plugin
3
+ module Resource
4
+ module AuthorizedKeys
5
+ VERSION = "0.1.0"
6
+ end
7
+ end
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: itamae-plugin-resource-authorized_keys
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - nownabe
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-10-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: itamae
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: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.9'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.9'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: serverspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description:
98
+ email:
99
+ - nownabe@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".rspec"
106
+ - ".travis.yml"
107
+ - Gemfile
108
+ - README.md
109
+ - Rakefile
110
+ - bin/console
111
+ - bin/setup
112
+ - itamae-plugin-resource-authorized_keys.gemspec
113
+ - lib/itamae/plugin/resource/authorized_keys.rb
114
+ - lib/itamae/plugin/resource/authorized_keys/version.rb
115
+ homepage:
116
+ licenses: []
117
+ metadata: {}
118
+ post_install_message:
119
+ rdoc_options: []
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubyforge_project:
134
+ rubygems_version: 2.4.5
135
+ signing_key:
136
+ specification_version: 4
137
+ summary: An Itamae plugin to provide user's authorized_keys file.
138
+ test_files: []