aws-codedeploy-agent 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/aws-codedeploy-agent.gemspec +5 -5
- data/certs/host-agent-deployment-signer-ca-chain.pem +30 -0
- data/conf/codedeployagent.yml +0 -1
- data/lib/instance_agent.rb +1 -13
- data/lib/instance_agent/agent/base.rb +38 -12
- data/lib/instance_agent/agent/plugin.rb +21 -0
- data/lib/instance_agent/config.rb +2 -1
- data/lib/instance_agent/platform/linux_util.rb +4 -0
- data/lib/instance_agent/plugins/codedeploy/application_specification/ace_info.rb +133 -0
- data/lib/instance_agent/plugins/codedeploy/application_specification/acl_info.rb +163 -0
- data/lib/instance_agent/plugins/codedeploy/application_specification/application_specification.rb +143 -0
- data/lib/instance_agent/plugins/codedeploy/application_specification/context_info.rb +23 -0
- data/lib/instance_agent/plugins/codedeploy/application_specification/file_info.rb +23 -0
- data/lib/instance_agent/plugins/codedeploy/application_specification/linux_permission_info.rb +121 -0
- data/lib/instance_agent/plugins/codedeploy/application_specification/mode_info.rb +66 -0
- data/lib/instance_agent/plugins/codedeploy/application_specification/range_info.rb +134 -0
- data/lib/instance_agent/plugins/codedeploy/application_specification/script_info.rb +27 -0
- data/lib/instance_agent/plugins/codedeploy/codedeploy_control.rb +100 -0
- data/lib/instance_agent/plugins/codedeploy/command_executor.rb +359 -0
- data/lib/instance_agent/plugins/codedeploy/command_poller.rb +178 -0
- data/lib/instance_agent/plugins/codedeploy/deployment_specification.rb +161 -0
- data/lib/instance_agent/plugins/codedeploy/hook_executor.rb +226 -0
- data/lib/instance_agent/plugins/codedeploy/install_instruction.rb +389 -0
- data/lib/instance_agent/plugins/codedeploy/installer.rb +147 -0
- data/lib/instance_agent/plugins/codedeploy/onpremise_config.rb +42 -0
- data/lib/instance_agent/plugins/codedeploy/register_plugin.rb +17 -0
- data/lib/instance_agent/runner/child.rb +20 -5
- data/lib/instance_agent/runner/master.rb +2 -15
- data/lib/instance_metadata.rb +2 -2
- data/test/certificate_helper.rb +1 -1
- data/test/helpers/instance_agent_helper.rb +1 -0
- data/test/instance_agent/agent/base_test.rb +16 -3
- data/test/instance_agent/config_test.rb +2 -1
- data/test/instance_agent/plugins/codedeploy/application_specification_test.rb +1713 -0
- data/test/instance_agent/{codedeploy_plugin → plugins/codedeploy}/codedeploy_control_test.rb +1 -1
- data/test/instance_agent/{codedeploy_plugin → plugins/codedeploy}/command_executor_test.rb +32 -9
- data/test/instance_agent/{codedeploy_plugin → plugins/codedeploy}/command_poller_test.rb +13 -14
- data/test/instance_agent/{codedeploy_plugin → plugins/codedeploy}/deployment_specification_test.rb +98 -25
- data/test/instance_agent/{codedeploy_plugin → plugins/codedeploy}/hook_executor_test.rb +83 -15
- data/test/instance_agent/plugins/codedeploy/install_instruction_test.rb +568 -0
- data/test/instance_agent/{codedeploy_plugin → plugins/codedeploy}/installer_test.rb +12 -9
- data/test/instance_agent/plugins/codedeploy/onpremise_config_test.rb +72 -0
- data/test/instance_agent/runner/child_test.rb +1 -1
- data/vendor/gems/.codedeploy-commands-1.0.0.created.rid +1 -1
- data/vendor/gems/codedeploy-commands/lib/aws/plugins/deploy_control_endpoint.rb +4 -0
- data/vendor/gems/jmespath-1.0.1/lib/jmespath.rb +41 -0
- data/vendor/gems/jmespath-1.0.1/lib/jmespath/caching_parser.rb +30 -0
- data/vendor/gems/jmespath-1.0.1/lib/jmespath/errors.rb +17 -0
- data/vendor/gems/jmespath-1.0.1/lib/jmespath/expr_node.rb +15 -0
- data/vendor/gems/jmespath-1.0.1/lib/jmespath/lexer.rb +116 -0
- data/vendor/gems/jmespath-1.0.1/lib/jmespath/parser.rb +347 -0
- data/vendor/gems/jmespath-1.0.1/lib/jmespath/runtime.rb +71 -0
- data/vendor/gems/jmespath-1.0.1/lib/jmespath/token.rb +41 -0
- data/vendor/gems/jmespath-1.0.1/lib/jmespath/token_stream.rb +60 -0
- data/vendor/gems/jmespath-1.0.1/lib/jmespath/tree_interpreter.rb +523 -0
- data/vendor/gems/jmespath-1.0.1/lib/jmespath/version.rb +3 -0
- data/vendor/gems/process_manager/lib/process_manager/master.rb +16 -5
- data/vendor/specifications/{aws-sdk-core-2.0.5.gemspec → aws-sdk-core-2.0.42.gemspec} +9 -11
- data/vendor/specifications/builder-3.2.2.gemspec +1 -1
- data/vendor/specifications/codedeploy-commands-1.0.0.gemspec +7 -6
- data/vendor/specifications/gli-2.5.6.gemspec +1 -1
- data/vendor/specifications/jmespath-1.0.1.gemspec +29 -0
- data/vendor/specifications/little-plugger-1.1.3.gemspec +1 -1
- data/vendor/specifications/logging-1.8.1.gemspec +1 -1
- data/vendor/specifications/multi_json-1.7.7.gemspec +1 -1
- data/vendor/specifications/multi_json-1.8.4.gemspec +1 -1
- data/vendor/specifications/multi_xml-0.5.5.gemspec +1 -1
- data/vendor/specifications/process_manager-0.0.13.gemspec +1 -1
- data/vendor/specifications/simple_pid-0.2.1.gemspec +1 -1
- metadata +76 -63
- data/lib/instance_agent/codedeploy_plugin/application_specification/ace_info.rb +0 -133
- data/lib/instance_agent/codedeploy_plugin/application_specification/acl_info.rb +0 -163
- data/lib/instance_agent/codedeploy_plugin/application_specification/application_specification.rb +0 -142
- data/lib/instance_agent/codedeploy_plugin/application_specification/context_info.rb +0 -23
- data/lib/instance_agent/codedeploy_plugin/application_specification/file_info.rb +0 -23
- data/lib/instance_agent/codedeploy_plugin/application_specification/linux_permission_info.rb +0 -121
- data/lib/instance_agent/codedeploy_plugin/application_specification/mode_info.rb +0 -66
- data/lib/instance_agent/codedeploy_plugin/application_specification/range_info.rb +0 -134
- data/lib/instance_agent/codedeploy_plugin/application_specification/script_info.rb +0 -27
- data/lib/instance_agent/codedeploy_plugin/codedeploy_control.rb +0 -72
- data/lib/instance_agent/codedeploy_plugin/command_executor.rb +0 -357
- data/lib/instance_agent/codedeploy_plugin/command_poller.rb +0 -170
- data/lib/instance_agent/codedeploy_plugin/deployment_specification.rb +0 -150
- data/lib/instance_agent/codedeploy_plugin/hook_executor.rb +0 -206
- data/lib/instance_agent/codedeploy_plugin/install_instruction.rb +0 -374
- data/lib/instance_agent/codedeploy_plugin/installer.rb +0 -143
- data/lib/instance_agent/codedeploy_plugin/request_helper.rb +0 -28
- data/test/instance_agent/codedeploy_plugin/application_specification_test.rb +0 -1710
- data/test/instance_agent/codedeploy_plugin/install_instruction_test.rb +0 -566
- data/test/instance_agent/codedeploy_plugin/request_helper_test.rb +0 -37
- data/vendor/specifications/jamespath-0.5.1.gemspec +0 -35
@@ -5,7 +5,7 @@ $:.push File.expand_path("../vendor/gems/process_manager/lib", __FILE__)
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = 'aws-codedeploy-agent'
|
8
|
-
s.version = '0.0.
|
8
|
+
s.version = '0.0.3'
|
9
9
|
s.license = 'Apache-2.0'
|
10
10
|
s.summary = 'AWS CodeDeploy Agent'
|
11
11
|
s.description = 'CodeDeploy Agent is responsible for doing the actual work of deploying software on an individual EC2 instance.'
|
@@ -21,16 +21,16 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
22
22
|
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
23
23
|
|
24
|
-
s.add_dependency('
|
25
|
-
s.add_dependency('rubyzip')
|
24
|
+
s.add_dependency('json_pure', '~> 1.6')
|
25
|
+
s.add_dependency('rubyzip', '~> 1.1.0')
|
26
26
|
s.add_dependency('httpclient')
|
27
27
|
s.add_dependency('rake')
|
28
|
+
s.add_dependency('archive-tar-minitar', '~> 0.5.2')
|
28
29
|
|
29
30
|
s.add_dependency('gli', '~> 2.5')
|
30
|
-
s.add_dependency('aws-sdk-core', '~> 2.0.
|
31
|
+
s.add_dependency('aws-sdk-core', '~> 2.0.42')
|
31
32
|
s.add_dependency('builder', '~> 3.2.2')
|
32
33
|
s.add_dependency('gli', '~> 2.5.6')
|
33
|
-
s.add_dependency('jamespath', '~> 0.5.1')
|
34
34
|
s.add_dependency('little-plugger', '~> 1.1.3')
|
35
35
|
s.add_dependency('logging', '~> 1.8.1')
|
36
36
|
s.add_dependency('multi_json', '~> 1.8.4')
|
@@ -74,3 +74,33 @@ CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i
|
|
74
74
|
2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ
|
75
75
|
2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ
|
76
76
|
-----END CERTIFICATE-----
|
77
|
+
-----BEGIN CERTIFICATE-----
|
78
|
+
MIIFODCCBCCgAwIBAgIQUT+5dDhwtzRAQY0wkwaZ/zANBgkqhkiG9w0BAQsFADCB
|
79
|
+
yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
|
80
|
+
ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
|
81
|
+
U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
|
82
|
+
ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
|
83
|
+
aG9yaXR5IC0gRzUwHhcNMTMxMDMxMDAwMDAwWhcNMjMxMDMwMjM1OTU5WjB+MQsw
|
84
|
+
CQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNV
|
85
|
+
BAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxLzAtBgNVBAMTJlN5bWFudGVjIENs
|
86
|
+
YXNzIDMgU2VjdXJlIFNlcnZlciBDQSAtIEc0MIIBIjANBgkqhkiG9w0BAQEFAAOC
|
87
|
+
AQ8AMIIBCgKCAQEAstgFyhx0LbUXVjnFSlIJluhL2AzxaJ+aQihiw6UwU35VEYJb
|
88
|
+
A3oNL+F5BMm0lncZgQGUWfm893qZJ4Itt4PdWid/sgN6nFMl6UgfRk/InSn4vnlW
|
89
|
+
9vf92Tpo2otLgjNBEsPIPMzWlnqEIRoiBAMnF4scaGGTDw5RgDMdtLXO637QYqzu
|
90
|
+
s3sBdO9pNevK1T2p7peYyo2qRA4lmUoVlqTObQJUHypqJuIGOmNIrLRM0XWTUP8T
|
91
|
+
L9ba4cYY9Z/JJV3zADreJk20KQnNDz0jbxZKgRb78oMQw7jW2FUyPfG9D72MUpVK
|
92
|
+
Fpd6UiFjdS8W+cRmvvW1Cdj/JwDNRHxvSz+w9wIDAQABo4IBYzCCAV8wEgYDVR0T
|
93
|
+
AQH/BAgwBgEB/wIBADAwBgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vczEuc3ltY2Iu
|
94
|
+
Y29tL3BjYTMtZzUuY3JsMA4GA1UdDwEB/wQEAwIBBjAvBggrBgEFBQcBAQQjMCEw
|
95
|
+
HwYIKwYBBQUHMAGGE2h0dHA6Ly9zMi5zeW1jYi5jb20wawYDVR0gBGQwYjBgBgpg
|
96
|
+
hkgBhvhFAQc2MFIwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuc3ltYXV0aC5jb20v
|
97
|
+
Y3BzMCgGCCsGAQUFBwICMBwaGmh0dHA6Ly93d3cuc3ltYXV0aC5jb20vcnBhMCkG
|
98
|
+
A1UdEQQiMCCkHjAcMRowGAYDVQQDExFTeW1hbnRlY1BLSS0xLTUzNDAdBgNVHQ4E
|
99
|
+
FgQUX2DPYZBV34RDFIpgKrL1evRDGO8wHwYDVR0jBBgwFoAUf9Nlp8Ld7LvwMAnz
|
100
|
+
Qzn6Aq8zMTMwDQYJKoZIhvcNAQELBQADggEBAF6UVkndji1l9cE2UbYD49qecxny
|
101
|
+
H1mrWH5sJgUs+oHXXCMXIiw3k/eG7IXmsKP9H+IyqEVv4dn7ua/ScKAyQmW/hP4W
|
102
|
+
Ko8/xabWo5N9Q+l0IZE1KPRj6S7t9/Vcf0uatSDpCr3gRRAMFJSaXaXjS5HoJJtG
|
103
|
+
QGX0InLNmfiIEfXzf+YzguaoxX7+0AjiJVgIcWjmzaLmFN5OUiQt/eV5E1PnXi8t
|
104
|
+
TRttQBVSK/eHiXgSgW7ZTaoteNTCLD0IX4eRnh8OsN4wUmSGiaqdZpwOdgyA8nTY
|
105
|
+
Kvi4Os7X1g8RvmurFPW9QaAiY4nxug9vKWNmLT+sjHLF+8fk1A/yO0+MKcc=
|
106
|
+
-----END CERTIFICATE-----
|
data/conf/codedeployagent.yml
CHANGED
data/lib/instance_agent.rb
CHANGED
@@ -8,20 +8,8 @@ unless defined?(InstanceAgent)
|
|
8
8
|
require 'instance_agent/log'
|
9
9
|
require 'instance_agent/platform'
|
10
10
|
require 'instance_agent/platform/linux_util'
|
11
|
+
require 'instance_agent/agent/plugin'
|
11
12
|
require 'instance_agent/agent/base'
|
12
|
-
require 'instance_agent/codedeploy_plugin/command_poller'
|
13
|
-
require 'instance_agent/codedeploy_plugin/command_executor'
|
14
|
-
require 'instance_agent/codedeploy_plugin/deployment_specification'
|
15
|
-
require 'instance_agent/codedeploy_plugin/application_specification/application_specification'
|
16
|
-
require 'instance_agent/codedeploy_plugin/application_specification/file_info'
|
17
|
-
require 'instance_agent/codedeploy_plugin/application_specification/script_info'
|
18
|
-
require 'instance_agent/codedeploy_plugin/application_specification/linux_permission_info'
|
19
|
-
require 'instance_agent/codedeploy_plugin/application_specification/mode_info'
|
20
|
-
require 'instance_agent/codedeploy_plugin/application_specification/acl_info'
|
21
|
-
require 'instance_agent/codedeploy_plugin/application_specification/ace_info'
|
22
|
-
require 'instance_agent/codedeploy_plugin/application_specification/context_info'
|
23
|
-
require 'instance_agent/codedeploy_plugin/application_specification/range_info'
|
24
|
-
require 'instance_agent/codedeploy_plugin/install_instruction'
|
25
13
|
require 'instance_agent/runner/master'
|
26
14
|
require 'instance_agent/runner/child'
|
27
15
|
end
|
@@ -1,10 +1,15 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
+
require 'instance_agent/agent/plugin'
|
3
|
+
|
2
4
|
module InstanceAgent
|
3
5
|
module Agent
|
4
6
|
class Base
|
7
|
+
include InstanceAgent::Agent::Plugin
|
5
8
|
|
6
9
|
def self.runner
|
7
|
-
self.new
|
10
|
+
instance = self.new
|
11
|
+
instance.validate if instance.respond_to?('validate')
|
12
|
+
instance
|
8
13
|
end
|
9
14
|
|
10
15
|
def description
|
@@ -17,18 +22,39 @@ module InstanceAgent
|
|
17
22
|
end
|
18
23
|
|
19
24
|
def run
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
25
|
+
start_time = Time.now
|
26
|
+
|
27
|
+
begin
|
28
|
+
perform
|
29
|
+
@error_count = 0
|
30
|
+
rescue Aws::Errors::MissingCredentialsError
|
31
|
+
log(:error, "Missing credentials - please check if this instance was started with an IAM instance profile")
|
32
|
+
@error_count = @error_count.to_i + 1
|
33
|
+
rescue SocketError, Errno::ENETDOWN, Aws::Errors::ServiceError => e
|
34
|
+
log(:error, "Cannot reach InstanceService: #{e.class} - #{e.message}")
|
35
|
+
@error_count = @error_count.to_i + 1
|
36
|
+
rescue Exception => e
|
37
|
+
log(:error, "Error during perform: #{e.class} - #{e.message} - #{e.backtrace.join("\n")}")
|
38
|
+
@error_count = @error_count.to_i + 1
|
39
|
+
end
|
40
|
+
|
41
|
+
if @error_count > 0
|
42
|
+
# Max out at 90 seconds between calls and take 5 minutes before reaching the cap and allowing 10 calls to get there
|
31
43
|
|
44
|
+
if @error_count > 10
|
45
|
+
@error_count = 10
|
46
|
+
end
|
47
|
+
|
48
|
+
elapsed_time = (Time.now - start_time).ceil
|
49
|
+
backoff_time = (((1.2675 ** @error_count) * (90.0 / (1.2675 ** 10)))).floor
|
50
|
+
sleep_time = backoff_time - elapsed_time
|
51
|
+
|
52
|
+
if(sleep_time > 0)
|
53
|
+
log(:debug, "Sleeping #{sleep_time} seconds.")
|
54
|
+
sleep sleep_time
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
32
58
|
end
|
33
59
|
end
|
34
60
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
module InstanceAgent
|
4
|
+
module Agent
|
5
|
+
module Plugin
|
6
|
+
module PluginMethods
|
7
|
+
def plugins
|
8
|
+
@plugins ||= Set.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def inherited(plugin)
|
12
|
+
plugins << plugin
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.included(klass)
|
17
|
+
klass.extend PluginMethods
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -30,7 +30,8 @@ module InstanceAgent
|
|
30
30
|
:instance_service_port => nil,
|
31
31
|
:wait_between_runs => 30,
|
32
32
|
:wait_after_error => 30,
|
33
|
-
:codedeploy_test_profile => 'prod'
|
33
|
+
:codedeploy_test_profile => 'prod',
|
34
|
+
:on_premises_config_file => '/etc/codedeploy-agent/conf/codedeploy.onpremises.yml'
|
34
35
|
})
|
35
36
|
end
|
36
37
|
|
@@ -0,0 +1,133 @@
|
|
1
|
+
module InstanceAgent
|
2
|
+
module Plugins
|
3
|
+
module CodeDeployPlugin
|
4
|
+
module ApplicationSpecification
|
5
|
+
#Helper Class for storing an ace
|
6
|
+
class AceInfo
|
7
|
+
|
8
|
+
attr_reader :default, :type, :name, :read, :write, :execute
|
9
|
+
def initialize(ace, internal=false)
|
10
|
+
@default = false
|
11
|
+
@type = nil
|
12
|
+
@name = ""
|
13
|
+
parts = ace.split(":", -1).reverse
|
14
|
+
if (parts.length < 2) || (parts.length > 4)
|
15
|
+
raise AppSpecValidationException, "invalid acl entry #{ace}"
|
16
|
+
end
|
17
|
+
|
18
|
+
if (parts.length == 4)
|
19
|
+
if !(parts[3].eql?("d") || (parts[3].eql?("default")))
|
20
|
+
raise AppSpecValidationException, "invalid acl entry #{ace}"
|
21
|
+
end
|
22
|
+
@default = true
|
23
|
+
end
|
24
|
+
|
25
|
+
if parts.length >= 3
|
26
|
+
if parts[2].eql?("d") || (parts[2].eql?("default"))
|
27
|
+
if @default
|
28
|
+
raise AppSpecValidationException, "invalid acl entry #{ace}"
|
29
|
+
end
|
30
|
+
@default = true
|
31
|
+
elsif parts[2].eql?("m") || parts[2].eql?("mask")
|
32
|
+
@type = "mask"
|
33
|
+
elsif parts[2].eql?("o") || parts[2].eql?("other")
|
34
|
+
@type = "other"
|
35
|
+
elsif parts[2].eql?("g") || parts[2].eql?("group")
|
36
|
+
@type = "group"
|
37
|
+
elsif parts[2].eql?("u") || parts[2].eql?("user")
|
38
|
+
@type = "user"
|
39
|
+
else
|
40
|
+
raise AppSpecValidationException, "invalid acl entry #{ace}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
if parts[1].eql?("m") || parts[1].eql?("mask")
|
45
|
+
if @type.nil?
|
46
|
+
@type = "mask"
|
47
|
+
else
|
48
|
+
@name = "mask"
|
49
|
+
end
|
50
|
+
elsif parts[1].eql?("o") || parts[1].eql?("other")
|
51
|
+
if @type.nil?
|
52
|
+
@type = "other"
|
53
|
+
else
|
54
|
+
@name = "other"
|
55
|
+
end
|
56
|
+
else
|
57
|
+
if @type.nil?
|
58
|
+
@type = "user"
|
59
|
+
end
|
60
|
+
@name = parts[1]
|
61
|
+
end
|
62
|
+
|
63
|
+
if (@type.eql?("mask") || @type.eql?("other")) && !@name.empty?
|
64
|
+
raise AppSpecValidationException, "invalid acl entry #{ace}"
|
65
|
+
end
|
66
|
+
if (!internal && !@default && !@type.eql?("mask") && @name.empty?)
|
67
|
+
raise AppSpecValidationException, "use mode to set the base acl entry #{ace}"
|
68
|
+
end
|
69
|
+
|
70
|
+
perm_chars = parts[0].chars.entries
|
71
|
+
if (perm_chars.length == 1) && (perm_chars[0].ord >= "0".ord) && (perm_chars[0].ord <= "7".ord)
|
72
|
+
perm_bits = to_bits(perm_chars[0].to_i, 3)
|
73
|
+
@read = (perm_bits[0] == 1)
|
74
|
+
@write = (perm_bits[1] == 1)
|
75
|
+
@execute = (perm_bits[2] == 1)
|
76
|
+
else
|
77
|
+
@read = false
|
78
|
+
@write = false
|
79
|
+
@execute = false
|
80
|
+
perm_chars.each do |perm|
|
81
|
+
case perm
|
82
|
+
when 'r'
|
83
|
+
@read = true
|
84
|
+
when 'w'
|
85
|
+
@write = true
|
86
|
+
when 'x'
|
87
|
+
@execute = true
|
88
|
+
when '-'
|
89
|
+
else
|
90
|
+
raise AppSpecValidationException, "unrecognized permission character #{perm} in #{ace}"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
#format [default:][user|group|mask|other]:[name]:(r|-)(w|-)(x|-)
|
97
|
+
def get_ace
|
98
|
+
result = "";
|
99
|
+
if @default
|
100
|
+
result = "default:"
|
101
|
+
end
|
102
|
+
result = result + type + ":" + name + ":"
|
103
|
+
if (@read)
|
104
|
+
result = result + "r"
|
105
|
+
else
|
106
|
+
result = result + "-"
|
107
|
+
end
|
108
|
+
if (@write)
|
109
|
+
result = result + "w"
|
110
|
+
else
|
111
|
+
result = result + "-"
|
112
|
+
end
|
113
|
+
if (@execute)
|
114
|
+
result = result + "x"
|
115
|
+
else
|
116
|
+
result = result + "-"
|
117
|
+
end
|
118
|
+
result
|
119
|
+
end
|
120
|
+
|
121
|
+
def to_bits(num, min_size)
|
122
|
+
bits = Array.new(min_size, 0)
|
123
|
+
num_bits = num.to_s(2).split("")
|
124
|
+
diff = [0, min_size - num_bits.length].max
|
125
|
+
num_bits.map.with_index {|n,i| bits[i+diff] = n.to_i}
|
126
|
+
bits
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
module InstanceAgent
|
2
|
+
module Plugins
|
3
|
+
module CodeDeployPlugin
|
4
|
+
module ApplicationSpecification
|
5
|
+
#Helper Class for storing an acl
|
6
|
+
class AclInfo
|
7
|
+
|
8
|
+
attr_reader :aces, :additional
|
9
|
+
def initialize(acl)
|
10
|
+
@aces = []
|
11
|
+
@additional = []
|
12
|
+
acl.each do |ace|
|
13
|
+
@aces << AceInfo.new(ace)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
#format [default:][user|group|mask|other]:[name]:(r|-)(w|-)(x|-) (or nil if none present)
|
18
|
+
def get_default_ace
|
19
|
+
@aces.each do |ace|
|
20
|
+
if ace.default
|
21
|
+
return ace.get_ace
|
22
|
+
end
|
23
|
+
end
|
24
|
+
@additional.each do |ace|
|
25
|
+
if ace.default
|
26
|
+
return ace.get_ace
|
27
|
+
end
|
28
|
+
end
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
|
32
|
+
#format array of aces with format: [default:][user|group|mask|other]:[name]:(r|-)(w|-)(x|-)
|
33
|
+
def get_acl
|
34
|
+
aces = []
|
35
|
+
@aces.each do |ace|
|
36
|
+
aces << ace.get_ace
|
37
|
+
end
|
38
|
+
@additional.each do |ace|
|
39
|
+
aces << ace.get_ace
|
40
|
+
end
|
41
|
+
aces
|
42
|
+
end
|
43
|
+
|
44
|
+
def add_ace(ace)
|
45
|
+
additional << AceInfo.new(ace, true)
|
46
|
+
end
|
47
|
+
|
48
|
+
def clear_additional()
|
49
|
+
additional = []
|
50
|
+
end
|
51
|
+
|
52
|
+
def has_base_named?
|
53
|
+
@aces.each do |ace|
|
54
|
+
if !ace.default && !ace.name.eql?("")
|
55
|
+
return true
|
56
|
+
end
|
57
|
+
end
|
58
|
+
@additional.each do |ace|
|
59
|
+
if !ace.default && !ace.name.eql?("")
|
60
|
+
return true
|
61
|
+
end
|
62
|
+
end
|
63
|
+
false
|
64
|
+
end
|
65
|
+
|
66
|
+
def has_base_mask?
|
67
|
+
@aces.each do |ace|
|
68
|
+
if !ace.default && ace.type.eql?("mask")
|
69
|
+
return true
|
70
|
+
end
|
71
|
+
end
|
72
|
+
@additional.each do |ace|
|
73
|
+
if !ace.default && ace.type.eql?("mask")
|
74
|
+
return true
|
75
|
+
end
|
76
|
+
end
|
77
|
+
false
|
78
|
+
end
|
79
|
+
|
80
|
+
def has_default?
|
81
|
+
!get_default_ace.nil?
|
82
|
+
end
|
83
|
+
|
84
|
+
def has_default_user?
|
85
|
+
@aces.each do |ace|
|
86
|
+
if ace.default && ace.type.eql?("user") && ace.name.eql?("")
|
87
|
+
return true
|
88
|
+
end
|
89
|
+
end
|
90
|
+
@additional.each do |ace|
|
91
|
+
if ace.default && ace.type.eql?("user") && ace.name.eql?("")
|
92
|
+
return true
|
93
|
+
end
|
94
|
+
end
|
95
|
+
false
|
96
|
+
end
|
97
|
+
|
98
|
+
def has_default_group?
|
99
|
+
!get_default_group_ace.nil?
|
100
|
+
end
|
101
|
+
|
102
|
+
#format [default:][user|group|mask|other]:[name]:(r|-)(w|-)(x|-) (or nil if not present)
|
103
|
+
def get_default_group_ace
|
104
|
+
@aces.each do |ace|
|
105
|
+
if ace.default && ace.type.eql?("group") && ace.name.eql?("")
|
106
|
+
return ace.get_ace
|
107
|
+
end
|
108
|
+
end
|
109
|
+
@additional.each do |ace|
|
110
|
+
if ace.default && ace.type.eql?("group") && ace.name.eql?("")
|
111
|
+
return ace.get_ace
|
112
|
+
end
|
113
|
+
end
|
114
|
+
nil
|
115
|
+
end
|
116
|
+
|
117
|
+
def has_default_other?
|
118
|
+
@aces.each do |ace|
|
119
|
+
if ace.default && ace.type.eql?("other")
|
120
|
+
return true
|
121
|
+
end
|
122
|
+
end
|
123
|
+
@additional.each do |ace|
|
124
|
+
if ace.default && ace.type.eql?("other")
|
125
|
+
return true
|
126
|
+
end
|
127
|
+
end
|
128
|
+
false
|
129
|
+
end
|
130
|
+
|
131
|
+
def has_default_named?
|
132
|
+
@aces.each do |ace|
|
133
|
+
if ace.default && !ace.name.eql?("")
|
134
|
+
return true
|
135
|
+
end
|
136
|
+
end
|
137
|
+
@additional.each do |ace|
|
138
|
+
if ace.default && !ace.name.eql?("")
|
139
|
+
return true
|
140
|
+
end
|
141
|
+
end
|
142
|
+
false
|
143
|
+
end
|
144
|
+
|
145
|
+
def has_default_mask?
|
146
|
+
@aces.each do |ace|
|
147
|
+
if ace.default && ace.type.eql?("mask")
|
148
|
+
return true
|
149
|
+
end
|
150
|
+
end
|
151
|
+
@additional.each do |ace|
|
152
|
+
if ace.default && ace.type.eql?("mask")
|
153
|
+
return true
|
154
|
+
end
|
155
|
+
end
|
156
|
+
false
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|