dtk-node-agent 0.5.10 → 0.5.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MzkwMmViNTAyZjQwZTFmY2FiZTczODliMjE3YTQ0YTQ5YmU3OGIzYg==
4
+ NGUwMWQxZTY3ZDA1MWUyOGNkNDI3YWUxZWYxNjhkYzUwY2JlZTBkMA==
5
5
  data.tar.gz: !binary |-
6
- ZGQ5NTFmZDZlZTc0MjViNTJjMzUzNDZhNzhiZGM0N2NhYjk3NGMxMQ==
6
+ ODc0NTA0ZDRkMzQxZmI1ODkyNTIyNDliOWRiZGM3OTRjMjcwM2Q0Yw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YzdiYjNjYTM5ZjlmODJlNjBlMzFiMzdkMzEzOGZhYTVmNTc5NzdkNDBhZmE1
10
- ODcwZWQ3ZTQ1MGI0NmRlMTU4NWZlYzY0ZjlmYTg1YmJjNTAzY2I4MGQ4Y2Rl
11
- ZTE1YTI5ODg5ZTAzNzgyYThlOThiNTIwMjgyMGIzNWE5ZTljMDQ=
9
+ MDIxZWIzNmEzYzNmNTk1N2U5ZjcyNDkyNDhjMDExNTYwMmFhNzhiODk0YmVm
10
+ YTkzZGRjZDJiZDg5MmVhOWE1NGU2MGQ4YjMwMGY4YjQ0YzIzMDNiMTA3MWJh
11
+ Yzc3NGIwYjdiMzU4M2Q4NDNjNzI5YTg4YzM0YWI2NGY0N2VlODE=
12
12
  data.tar.gz: !binary |-
13
- ZjUyNTU0NmNhYjYxYzJiMDExNzExNTg3M2EzMGM3N2FjNjMxNjc2MjMxZTkz
14
- NTA5ZDFkZTU1MjcyNmZiOGM2MTAxZTJiZTdhNWJlNDlmYTExZDc1NTcxZmVl
15
- NDQyODdkYzczMjViYzBkMDY1OTEwYzdmZTJhNjQwMTQ3OWJiYjI=
13
+ OGViMTNmMTc3ODkzYmQ0YzA5YzYwODNhMjYzOTViMDA2YmRkNzZjYmI4YzZk
14
+ YTkxMzJjODYxNTRhYmQwYzZhMGEwNjAxMzk0NTI0NzQyYjRkODFiMTQ5NGJi
15
+ MzAwNjFkMTFiYjgyZjc5M2QyNTgxMmRmYzdhOGU5Njg3NDA4ODY=
data/README.md CHANGED
@@ -35,6 +35,12 @@ ruby create_agent_ami.rb --region us-east-1 --ami-id ami-da0000aa --key-pair tes
35
35
  --ssh-username root --image-name dtk-agent-ubuntu-precise
36
36
  ```
37
37
 
38
+ #### Build all supported AMI images with [packer](http://www.packer.io/)
39
+ ```
40
+ packer build template.json
41
+ ```
42
+ This will also copy images to all AWS regions.
43
+
38
44
  License
39
45
  ----------------------
40
46
  DTK Node Agent is released under the GPLv3 license. Please see LICENSE for more details.
@@ -33,6 +33,7 @@ Gem::Specification.new do |gem|
33
33
  gem.add_dependency 'grit', '~> 2.5.0'
34
34
  gem.add_dependency 'stomp', '~> 1.3.1'
35
35
  gem.add_dependency 'sshkeyauth', '~> 0.0.11'
36
- gem.add_dependency 'serverspec'
36
+ gem.add_dependency 'serverspec', '~> 1.1.0'
37
+ gem.add_dependency 'specinfra', '~> 1.0.4'
37
38
 
38
39
  end
@@ -1,3 +1,3 @@
1
1
  module DtkNodeAgent
2
- VERSION="0.5.10"
2
+ VERSION="0.5.12"
3
3
  end
@@ -4,6 +4,6 @@ metadata :name => "development manager",
4
4
  :license => "",
5
5
  :version => "",
6
6
  :url => "",
7
- :timeout => 2
7
+ :timeout => 60
8
8
  action "inject_agent", :description => "Injects agent content and restarts mcollective" do
9
9
  end
@@ -4,9 +4,8 @@ module MCollective
4
4
  module Agent
5
5
  class Dev_manager < RPC::Agent
6
6
 
7
- AGENT_MCOLLECTIVE_LOCATION = "#{::MCollective::Config.instance.libdir}/mcollective/agent/"
8
- @log = Log.instance
9
-
7
+ AGENT_MCOLLECTIVE_LOCATION = "#{::MCollective::Config.instance.libdir.join}/mcollective/agent/"
8
+
10
9
  action "inject_agent" do
11
10
  begin
12
11
 
@@ -31,7 +30,7 @@ module MCollective
31
30
  return ret
32
31
 
33
32
  rescue Exception => e
34
- @log.error e
33
+ Log.instance.error e
35
34
  ret.set_status_failed!()
36
35
  error_info = { :error => { :message => "Error syncing agents: #{e}" } }
37
36
  ret.merge!(error_info)
@@ -1,64 +1,104 @@
1
- module MCollective
2
- module Agent
3
- class Execute_tests < RPC::Agent
4
- def initialize()
5
- super()
6
- @log = Log.instance
7
- end
8
-
9
- action "execute_tests" do
10
- #Get list of component modules that have spec tests
11
- list_output=`ls /etc/puppet/modules/*/dtk/serverspec/spec/localhost/*/*_spec.rb`
12
- regex_pattern=/modules\/(.+)\/dtk\/serverspec\/spec\/localhost\/(.+)\//
13
- ModuleInfo = Struct.new(:module_name, :component_name)
14
- modules_info = []
15
-
16
- components = []
17
- request[:components].each do |c|
18
- if c.include? "::"
19
- components << c.split("::").last
20
- elsif c.include? "/"
21
- components << c.split("/").last
22
- else
23
- components << c
24
- end
25
- end
26
-
27
- list_output.each do |line|
28
- match = line.match(regex_pattern)
29
- components.each do |c|
30
- if c.eql? match[2]
31
- modules_info << ModuleInfo.new(match[1],match[2])
32
- end
33
- end
34
- end
35
-
36
- all_spec_results = []
37
- #filter out redundant module info if any
38
- modules_info = modules_info.uniq
39
- modules_info.each do |module_info|
40
- component_module = module_info[:module_name]
41
- component = module_info[:component_name]
42
-
43
- spec_results=`/opt/puppet-omnibus/embedded/bin/rspec /etc/puppet/modules/#{component_module}/dtk/serverspec/spec/localhost/#{component}/*_spec.rb --format j`
44
- @log.info("Executing serverspec test: /etc/puppet/modules/#{component_module}/tests/serverspec/spec/localhost/#{component}/*_spec.rb")
45
-
46
- spec_results_json = JSON.parse(spec_results)
47
-
48
- spec_results_json['examples'].each do |spec|
49
- spec_result = {}
50
- spec_result.store(:module_name, component_module)
51
- spec_result.store(:component_name, component)
52
- spec_result.store(:test_result, spec['full_description'])
53
- spec_result.store(:status, spec['status'])
54
- all_spec_results << spec_result
55
- end
56
- end
57
-
58
- reply[:data] = all_spec_results
59
- reply[:pbuilderid] = Facts["pbuilderid"]
60
- reply[:status] = :ok
61
- end
62
- end
63
- end
64
- end
1
+ module MCollective
2
+ module Agent
3
+ class Execute_tests < RPC::Agent
4
+ def initialize()
5
+ super()
6
+ @log = Log.instance
7
+ end
8
+
9
+ def pull_modules(module_version_context, git_server)
10
+ ENV['GIT_SHELL'] = nil #This is put in because if vcsrepo Puppet module used it sets this
11
+ begin
12
+ repo_dir = "#{ModulePath}/#{module_version_context[:implementation]}"
13
+ remote_repo = "#{git_server}:#{module_version_context[:repo]}"
14
+ opts = Hash.new
15
+ begin
16
+ if File.exists?(repo_dir)
17
+ @log.info("Branch already exists. Checkout to branch and pull latest changes...")
18
+ git_repo = ::DTK::NodeAgent::GitClient.new(repo_dir)
19
+ git_repo.pull_and_checkout_branch?(module_version_context[:branch],opts)
20
+ else
21
+ @log.info("Branch does not exist. Cloning branch...")
22
+ git_repo = ::DTK::NodeAgent::GitClient.new(repo_dir,:create=>true)
23
+ git_repo.clone_branch(remote_repo,module_version_context[:branch],opts)
24
+ end
25
+ rescue Exception => e
26
+ log_error(e)
27
+ #to achieve idempotent behavior; fully remove directory if any problems
28
+ FileUtils.rm_rf repo_dir
29
+ raise e
30
+ end
31
+ rescue Exception => e
32
+ log_error(e)
33
+ end
34
+ end
35
+
36
+ def log_error(e)
37
+ log_error = ([e.inspect]+backtrace_subset(e)).join("\n")
38
+ @log.info("\n----------------error-----\n#{log_error}\n----------------error-----")
39
+ end
40
+
41
+ action "execute_tests" do
42
+ #Get list of component modules that have spec tests
43
+ list_output=`ls /etc/puppet/modules/*/dtk/serverspec/spec/localhost/*/*_spec.rb`
44
+ regex_pattern=/modules\/(.+)\/dtk\/serverspec\/spec\/localhost\/(.+)\//
45
+ ModuleInfo = Struct.new(:module_name, :component_name, :full_component_name)
46
+ modules_info = []
47
+
48
+ components = []
49
+ #Strip away node part (/)...leave only part which represent full component name
50
+ request[:components].each do |c|
51
+ if c.include? "/"
52
+ components << c.split("/").last
53
+ else
54
+ components << c
55
+ end
56
+ end
57
+
58
+ list_output.each do |line|
59
+ match = line.match(regex_pattern)
60
+ components.each do |c|
61
+ if c.include? "::"
62
+ stripped_c = c.split("::").last
63
+ modules_info << ModuleInfo.new(match[1],match[2],c) if stripped_c.eql? match[2]
64
+ elsif c.eql? match[2]
65
+ modules_info << ModuleInfo.new(match[1],match[2],c)
66
+ end
67
+ end
68
+ end
69
+
70
+ all_spec_results = []
71
+ #filter out redundant module info if any
72
+ modules_info = modules_info.uniq
73
+ #Pull latest changes for modules if any
74
+ git_server = Facts["git-server"]
75
+
76
+ modules_info.each do |module_info|
77
+ component_module = module_info[:module_name]
78
+ component_name = module_info[:component_name]
79
+ full_component_name = module_info[:full_component_name]
80
+ #Filter out version context for modules that don't exist on node
81
+ filtered_version_context = request[:version_context].select { |x| x[:implementation] == module_info[:module_name] }.first
82
+ pull_modules(filtered_version_context,git_server)
83
+
84
+ spec_results=`/opt/puppet-omnibus/embedded/bin/rspec /etc/puppet/modules/#{component_module}/dtk/serverspec/spec/localhost/#{component_name}/*_spec.rb --format j`
85
+ @log.info("Executing serverspec test: /etc/puppet/modules/#{component_module}/dtk/serverspec/spec/localhost/#{component_name}/*_spec.rb")
86
+
87
+ spec_results_json = JSON.parse(spec_results)
88
+ spec_results_json['examples'].each do |spec|
89
+ spec_result = {}
90
+ spec_result.store(:module_name, component_module)
91
+ spec_result.store(:component_name, full_component_name)
92
+ spec_result.store(:test_result, spec['full_description'])
93
+ spec_result.store(:status, spec['status'])
94
+ all_spec_results << spec_result
95
+ end
96
+ end
97
+
98
+ reply[:data] = all_spec_results
99
+ reply[:pbuilderid] = Facts["pbuilderid"]
100
+ reply[:status] = :ok
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,13 @@
1
+ metadata :name => "ssh agent",
2
+ :description => "SSH Agent allows adding of public keys, removing them and listing",
3
+ :author => "Reactor8",
4
+ :license => "",
5
+ :version => "",
6
+ :url => "",
7
+ :timeout => 2
8
+ action "grant_access", :description => "Add SSH access to host instance" do
9
+ end
10
+ action "revoke_access", :description => "Remove SSH access from host instance" do
11
+ end
12
+ action "list_access", :description => "List current SSH access for host instance" do
13
+ end
@@ -0,0 +1,93 @@
1
+ require 'base64'
2
+
3
+ module MCollective
4
+ module Agent
5
+ class Ssh_agent < RPC::Agent
6
+
7
+ AGENT_MCOLLECTIVE_LOCATION = "#{::MCollective::Config.instance.libdir.join}/mcollective/agent/"
8
+ SSH_AUTH_KEYS_FILE_NAME = "authorized_keys"
9
+
10
+ action "grant_access" do
11
+ validate :rsa_pub_key, String
12
+ validate :rsa_pub_name, String
13
+ validate :system_user, String
14
+
15
+ if does_user_exist?(request[:system_user])
16
+ begin
17
+ puppet_params = {
18
+ :name => request[:rsa_pub_name],
19
+ :ensure => 'present',
20
+ :key =>normalize_rsa_pub_key(request[:rsa_pub_key]),
21
+ :type => 'ssh-rsa',
22
+ :user => request[:system_user]
23
+ }
24
+
25
+ ::MCollective::Util.loadclass("MCollective::Util::PuppetRunner")
26
+ ::MCollective::Util::PuppetRunner.apply(:ssh_authorized_key, puppet_params)
27
+
28
+ # There is a bug where we are expiriencing issues with above changes not taking effect for no apperent reason
29
+ # if detected we repeat puppet apply
30
+
31
+ unless key_added?(puppet_params[:user], puppet_params[:key])
32
+ Log.info("Fallback, repeating SSH access grant")
33
+ ::MCollective::Util::PuppetRunner.apply(:ssh_authorized_key, puppet_params)
34
+ end
35
+
36
+ raise "We were not able to add SSH access for given node (PuppetError)" unless key_added?(puppet_params[:user], puppet_params[:key])
37
+
38
+ reply[:data] = { :message => "Access to system user '#{request[:system_user]}' has been granted for '#{request[:rsa_pub_name]}'"}
39
+ rescue Exception => e
40
+ reply[:data] = { :error => "Puppet error not able to process request, reason: '#{e.message}'" }
41
+ end
42
+ else
43
+ reply[:data] = { :error => "System user '#{request[:system_user]}' not found on given node" }
44
+ end
45
+ reply[:pbuilderid] = Facts["pbuilderid"]
46
+ reply[:status] = :ok
47
+ end
48
+
49
+ action "revoke_access" do
50
+ validate :rsa_pub_name, String
51
+ validate :system_user, String
52
+
53
+ if does_user_exist?(request[:system_user])
54
+ begin
55
+ ::MCollective::Util.loadclass("MCollective::Util::PuppetRunner")
56
+ ::MCollective::Util::PuppetRunner.apply(
57
+ :ssh_authorized_key,
58
+ {
59
+ :name => request[:rsa_pub_name],
60
+ :ensure => 'absent',
61
+ :type => 'ssh-rsa',
62
+ :user => request[:system_user]
63
+ }
64
+ )
65
+ reply[:data] = { :message => "Access for system user '#{request[:system_user]}' has been revoked" }
66
+ rescue Exception => e
67
+ reply[:data] = { :error => "Puppet error not able to process request, reason: '#{e.message}'" }
68
+ end
69
+ else
70
+ reply[:data] = { :error => "System user '#{request[:system_user]}' not found on given node" }
71
+ end
72
+
73
+ reply[:pbuilderid] = Facts["pbuilderid"]
74
+ reply[:status] = :ok
75
+ end
76
+
77
+ def does_user_exist?(system_user)
78
+ !File.open('/etc/passwd').grep(/home\/#{system_user}:/).empty?
79
+ end
80
+
81
+ def key_added?(system_user, pub_key)
82
+ results = `more /home/#{system_user}/.ssh/#{SSH_AUTH_KEYS_FILE_NAME} | grep #{pub_key}`
83
+ !results.empty?
84
+ end
85
+
86
+ def normalize_rsa_pub_key(rsa_pub_key)
87
+ rsa_pub_key.strip!()
88
+ rsa_pub_key.gsub!(/.* (.*) .*/,'\1')
89
+ rsa_pub_key
90
+ end
91
+ end
92
+ end
93
+ end
@@ -4,7 +4,7 @@ require 'grit'
4
4
  require 'tempfile'
5
5
  require 'fileutils'
6
6
 
7
- AGENT_MCOLLECTIVE_LOCATION = "#{::MCollective::Config.instance.libdir}/mcollective/agent/"
7
+ AGENT_MCOLLECTIVE_LOCATION = "#{::MCollective::Config.instance.libdir.join}/mcollective/agent/"
8
8
 
9
9
  module MCollective
10
10
  module Agent
@@ -0,0 +1,31 @@
1
+ require 'puppet'
2
+
3
+ module MCollective
4
+ module Util
5
+ class PuppetRunner
6
+
7
+ def self.apply(puppet_definition, resource_hash)
8
+ Puppet.settings.initialize_global_settings
9
+ Puppet.settings.initialize_app_defaults(Puppet::Settings.app_defaults_for_run_mode(Puppet.run_mode))
10
+
11
+ Log.info("Puppet Runner, INPUT :")
12
+ Log.info(puppet_definition)
13
+ Log.info(resource_hash.inspect)
14
+ Log.info("########################################################################")
15
+
16
+ pup = Puppet::Type.type(puppet_definition).new(resource_hash)
17
+ catalog = Puppet::Resource::Catalog.new
18
+ catalog.add_resource pup
19
+ catalog.apply()
20
+
21
+ Log.info("Puppet Runner, OUTPUT: ")
22
+ Log.info(Thread.current[:report_status])
23
+ Log.info(Thread.current[:report_info])
24
+ Log.info("########################################################################")
25
+ true
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dtk-node-agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.10
4
+ version: 0.5.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rich PELAVIN
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-17 00:00:00.000000000 Z
11
+ date: 2014-04-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: puppet
@@ -84,16 +84,30 @@ dependencies:
84
84
  name: serverspec
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ! '>='
87
+ - - ~>
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: 1.1.0
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ! '>='
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 1.1.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: specinfra
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: 1.0.4
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
95
109
  - !ruby/object:Gem::Version
96
- version: '0'
110
+ version: 1.0.4
97
111
  description: DTK node agent is tool used to install and configure DTK agents.
98
112
  email:
99
113
  - rich@reactor8.com
@@ -148,6 +162,8 @@ files:
148
162
  - mcollective_additions/plugins/v2.2/agent/puppet_cancel.rb
149
163
  - mcollective_additions/plugins/v2.2/agent/rpcutil.ddl
150
164
  - mcollective_additions/plugins/v2.2/agent/rpcutil.rb
165
+ - mcollective_additions/plugins/v2.2/agent/ssh_agent.ddl
166
+ - mcollective_additions/plugins/v2.2/agent/ssh_agent.rb
151
167
  - mcollective_additions/plugins/v2.2/agent/sync_agent_code.ddl
152
168
  - mcollective_additions/plugins/v2.2/agent/sync_agent_code.rb
153
169
  - mcollective_additions/plugins/v2.2/agent/tail.ddl
@@ -158,6 +174,7 @@ files:
158
174
  - mcollective_additions/plugins/v2.2/facts/pbuilder_facts.rb
159
175
  - mcollective_additions/plugins/v2.2/security/sshkey.ddl
160
176
  - mcollective_additions/plugins/v2.2/security/sshkey.rb
177
+ - mcollective_additions/plugins/v2.2/util/puppetrunner.rb
161
178
  - mcollective_additions/server.cfg
162
179
  - src/etc/init.d/ec2-run-user-data
163
180
  - src/etc/logrotate.d/mcollective
@@ -182,7 +199,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
182
199
  version: '0'
183
200
  requirements: []
184
201
  rubyforge_project:
185
- rubygems_version: 2.1.5
202
+ rubygems_version: 2.1.9
186
203
  signing_key:
187
204
  specification_version: 4
188
205
  summary: DTK ndoe agent tool.