dtk-node-agent 0.5.10 → 0.5.12

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