aws-codedeploy-agent 0.0.4 → 0.1.0

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.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -1
  3. data/.travis.yml +10 -0
  4. data/CHANGES.md +5 -0
  5. data/Gemfile +6 -3
  6. data/README.md +35 -0
  7. data/Rakefile +52 -0
  8. data/aws-codedeploy-agent.gemspec +5 -10
  9. data/conf/codedeployagent.yml +1 -0
  10. data/features/AwsCredentials.yml +4 -0
  11. data/features/agent.feature +11 -0
  12. data/features/aws_credentials.rb +35 -0
  13. data/features/step_definitions.rb +233 -0
  14. data/init.d/codedeploy-agent +11 -6
  15. data/lib/instance_agent.rb +1 -1
  16. data/lib/instance_agent/config.rb +3 -1
  17. data/lib/instance_agent/log.rb +18 -0
  18. data/lib/instance_agent/platform/linux_util.rb +27 -5
  19. data/lib/instance_agent/plugins/codedeploy/application_specification/application_specification.rb +2 -1
  20. data/lib/instance_agent/plugins/codedeploy/application_specification/file_info.rb +2 -2
  21. data/lib/instance_agent/plugins/codedeploy/application_specification/script_info.rb +3 -2
  22. data/lib/instance_agent/plugins/codedeploy/codedeploy_control.rb +15 -14
  23. data/lib/instance_agent/plugins/codedeploy/command_executor.rb +34 -6
  24. data/lib/instance_agent/plugins/codedeploy/command_poller.rb +12 -1
  25. data/lib/instance_agent/plugins/codedeploy/deployment_specification.rb +2 -12
  26. data/lib/instance_agent/plugins/codedeploy/hook_executor.rb +8 -4
  27. data/lib/instance_agent/plugins/codedeploy/install_instruction.rb +3 -1
  28. data/lib/instance_metadata.rb +1 -1
  29. data/test/instance_agent/config_test.rb +3 -1
  30. data/test/instance_agent/platform/linux_util_test.rb +35 -0
  31. data/test/instance_agent/plugins/codedeploy/application_specification_test.rb +7 -6
  32. data/test/instance_agent/plugins/codedeploy/command_executor_test.rb +13 -10
  33. data/test/instance_agent/plugins/codedeploy/command_poller_test.rb +28 -6
  34. data/test/instance_agent/plugins/codedeploy/deployment_specification_test.rb +9 -9
  35. data/test/instance_agent/plugins/codedeploy/hook_executor_test.rb +12 -4
  36. data/test/test_helper.rb +6 -1
  37. data/vendor/gems/codedeploy-commands/apis/CodeDeployCommand.api.json +1 -0
  38. data/vendor/gems/codedeploy-commands/lib/aws/codedeploy_commands.rb +2 -0
  39. data/vendor/gems/codedeploy-commands/lib/aws/plugins/deploy_agent_version.rb +31 -0
  40. data/vendor/gems/codedeploy-commands/lib/aws/plugins/deploy_control_endpoint.rb +1 -12
  41. data/vendor/gems/process_manager/lib/process_manager/master.rb +3 -3
  42. data/vendor/specifications/codedeploy-commands-1.0.0.gemspec +5 -5
  43. metadata +52 -149
  44. data/vendor/gems/codedeploy-commands/codedeploy-commands-1.0.0.gemspec +0 -28
  45. data/vendor/gems/process_manager/process_manager-0.0.13.gemspec +0 -42
  46. data/vendor/specifications/aws-sdk-core-2.0.42.gemspec +0 -37
  47. data/vendor/specifications/builder-3.2.2.gemspec +0 -29
  48. data/vendor/specifications/gli-2.5.6.gemspec +0 -51
  49. data/vendor/specifications/jmespath-1.0.1.gemspec +0 -29
  50. data/vendor/specifications/little-plugger-1.1.3.gemspec +0 -32
  51. data/vendor/specifications/logging-1.8.1.gemspec +0 -44
  52. data/vendor/specifications/multi_json-1.7.7.gemspec +0 -30
  53. data/vendor/specifications/multi_json-1.8.4.gemspec +0 -30
  54. data/vendor/specifications/multi_xml-0.5.5.gemspec +0 -30
  55. data/vendor/specifications/simple_pid-0.2.1.gemspec +0 -28
@@ -17,24 +17,30 @@
17
17
  # the deployment artifacts on to this instance.
18
18
  ### END INIT INFO
19
19
 
20
- RETVAL=0
20
+ [ -f /etc/profile ] && [ "`stat --format '%U %G' /etc/profile`" == "root root" ] && source /etc/profile
21
21
 
22
22
  BIN="codedeploy-agent"
23
23
 
24
24
  start() {
25
25
  echo -n $"Starting $BIN:"
26
- nohup $BIN start >/dev/null </dev/null 2>&1 # Try to start the server
26
+ nohup $BIN start >/dev/null </dev/null 2>&1
27
27
  exit $?
28
28
  }
29
29
 
30
30
  stop() {
31
31
  echo -n $"Stopping $BIN:"
32
- nohup $BIN stop >/dev/null </dev/null 2>&1 # Try to stop the server
32
+ nohup $BIN stop >/dev/null </dev/null 2>&1
33
+ exit $?
34
+ }
35
+
36
+ restart() {
37
+ echo -n $"Restarting $BIN:"
38
+ nohup $BIN restart >/dev/null </dev/null 2>&1
33
39
  exit $?
34
40
  }
35
41
 
36
42
  status() {
37
- $BIN status # Status of the server
43
+ $BIN status
38
44
  exit $?
39
45
  }
40
46
 
@@ -46,8 +52,7 @@ case "$1" in
46
52
  stop
47
53
  ;;
48
54
  restart)
49
- stop
50
- start
55
+ restart
51
56
  ;;
52
57
  force-reload)
53
58
  stop
@@ -1,6 +1,6 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'core_ext'
3
+ require_relative 'core_ext'
4
4
  require 'process_manager'
5
5
 
6
6
  unless defined?(InstanceAgent)
@@ -31,7 +31,9 @@ module InstanceAgent
31
31
  :wait_between_runs => 30,
32
32
  :wait_after_error => 30,
33
33
  :codedeploy_test_profile => 'prod',
34
- :on_premises_config_file => '/etc/codedeploy-agent/conf/codedeploy.onpremises.yml'
34
+ :on_premises_config_file => '/etc/codedeploy-agent/conf/codedeploy.onpremises.yml',
35
+ :proxy_uri => nil,
36
+ :enable_deployments_log => true
35
37
  })
36
38
  end
37
39
 
@@ -1,3 +1,21 @@
1
1
  require 'process_manager/log'
2
+ require 'singleton'
2
3
 
3
4
  InstanceAgent::Log = ProcessManager::Log
5
+
6
+ class InstanceAgent::DeploymentLog
7
+ include Singleton
8
+
9
+ def initialize
10
+ deployment_logs_dir = File.join(InstanceAgent::Config.config[:root_dir], 'deployment-logs')
11
+ FileUtils.mkdir_p(deployment_logs_dir) unless File.exists? deployment_logs_dir
12
+ @deployment_log ||= Logger.new(File.join(deployment_logs_dir, "#{InstanceAgent::Config.config[:program_name]}-deployments.log"), 8, 64 * 1024 * 1024)
13
+ @deployment_log.formatter = proc do |severity, datetime, progname, msg|
14
+ "[#{datetime.strftime('%Y-%m-%d %H:%M:%S.%L')}] #{msg}\n"
15
+ end
16
+ end
17
+
18
+ def log(message)
19
+ @deployment_log.info(message)
20
+ end
21
+ end
@@ -8,12 +8,30 @@ module InstanceAgent
8
8
  ['linux']
9
9
  end
10
10
 
11
- def self.prepare_script_command(script, absolute_path)
12
- script_command = absolute_path
13
- if(!script.runas.nil?)
14
- script_command = 'su ' + script.runas + ' -c ' + absolute_path
11
+ def self.prepare_script_command(script, absolute_cmd_path)
12
+ runas = !!script.runas
13
+ sudo = !!script.sudo
14
+
15
+ if runas && sudo
16
+ return 'sudo su ' + script.runas + ' -c ' + absolute_cmd_path
17
+ end
18
+
19
+ if runas && !sudo
20
+ return 'su ' + script.runas + ' -c ' + absolute_cmd_path
21
+ end
22
+
23
+ if !runas && sudo
24
+ return 'sudo ' + absolute_cmd_path
15
25
  end
16
- script_command
26
+
27
+ # If neither sudo or runas is specified, execute the
28
+ # command as the code deploy agent user
29
+ absolute_cmd_path
30
+ end
31
+
32
+ def self.quit()
33
+ # Send kill signal to parent and exit
34
+ Process.kill('TERM', Process.ppid)
17
35
  end
18
36
 
19
37
  def self.script_executable?(path)
@@ -33,6 +51,10 @@ module InstanceAgent
33
51
  def self.supports_process_groups?()
34
52
  true
35
53
  end
54
+
55
+ def self.codedeploy_version_file
56
+ File.join(ProcessManager::Config.config[:root_dir], '..')
57
+ end
36
58
 
37
59
  private
38
60
  def self.execute_tar_command(cmd)
@@ -60,6 +60,7 @@ module InstanceAgent
60
60
  current_hook_scripts << InstanceAgent::Plugins::CodeDeployPlugin::ApplicationSpecification::ScriptInfo.new(script['location'].to_s.strip,
61
61
  {
62
62
  :runas => script.has_key?('runas') && !script['runas'].nil? ? script['runas'].to_s.strip : nil,
63
+ :sudo => script['sudo'],
63
64
  :timeout => script['timeout']
64
65
  })
65
66
  else
@@ -140,4 +141,4 @@ module InstanceAgent
140
141
  end
141
142
  end
142
143
  end
143
- end
144
+ end
@@ -10,7 +10,7 @@ module InstanceAgent
10
10
  if(source.nil?)
11
11
  raise AppSpecValidationException, 'File needs to have a source'
12
12
  elsif (destination.nil?)
13
- raise AppSpecValidationException, 'File needs to have a destination'
13
+ raise AppSpecValidationException, "File #{source} needs to have a destination"
14
14
  end
15
15
  @source = source
16
16
  @destination = destination
@@ -20,4 +20,4 @@ module InstanceAgent
20
20
  end
21
21
  end
22
22
  end
23
- end
23
+ end
@@ -5,7 +5,7 @@ module InstanceAgent
5
5
  #Helper Class for storing data parsed from hook script maps
6
6
  class ScriptInfo
7
7
 
8
- attr_reader :location, :runas, :timeout
8
+ attr_reader :location, :runas, :sudo, :timeout
9
9
  def initialize(location, opts = {})
10
10
  location = location.to_s
11
11
  if(location.empty?)
@@ -13,6 +13,7 @@ module InstanceAgent
13
13
  end
14
14
  @location = location
15
15
  @runas = opts[:runas]
16
+ @sudo = opts[:sudo]
16
17
  @timeout = opts[:timeout] || 3600
17
18
  @timeout = @timeout.to_i
18
19
  if(@timeout <= 0)
@@ -24,4 +25,4 @@ module InstanceAgent
24
25
  end
25
26
  end
26
27
  end
27
- end
28
+ end
@@ -22,6 +22,11 @@ module InstanceAgent
22
22
  64 * 1024 * 1024),
23
23
  :http_wire_trace => true})
24
24
  end
25
+
26
+ if InstanceAgent::Config.config[:proxy_uri]
27
+ @options = options.update({
28
+ :http_proxy => URI(InstanceAgent::Config.config[:proxy_uri]) })
29
+ end
25
30
  end
26
31
 
27
32
  def validate_ssl_config
@@ -66,6 +71,15 @@ module InstanceAgent
66
71
  client.verify_mode = OpenSSL::SSL::VERIFY_PEER
67
72
  client.ca_file = ENV['SSL_CERT_FILE']
68
73
 
74
+ if InstanceAgent::Config.config[:proxy_uri]
75
+ proxy_uri = URI(InstanceAgent::Config.config[:proxy_uri])
76
+ client.proxy_from_env = false # make sure proxy settings can be overridden
77
+ client.proxy_address = proxy_uri.host
78
+ client.proxy_port = proxy_uri.port
79
+ client.proxy_user = proxy_uri.user if proxy_uri.user
80
+ client.proxy_pass = proxy_uri.password if proxy_uri.password
81
+ end
82
+
69
83
  client.verify_callback = lambda do |preverify_ok, cert_store|
70
84
  return false unless preverify_ok
71
85
  @cert = cert_store.chain[0]
@@ -78,20 +92,7 @@ module InstanceAgent
78
92
  # Do minimal cert pinning
79
93
  def verify_subject
80
94
  InstanceAgent::Log.debug("#{self.class.to_s}: Actual certificate subject is '#{@cert.subject.to_s}'")
81
-
82
- case @region
83
- when 'us-east-1'
84
- @cert.subject.to_s == "/C=US/ST=Washington/L=Seattle/O=Amazon.com, Inc./CN=codedeploy-commands.us-east-1.amazonaws.com"
85
- when 'us-west-2'
86
- @cert.subject.to_s == "/C=US/ST=Washington/L=Seattle/O=Amazon.com, Inc./CN=codedeploy-commands.us-west-2.amazonaws.com"
87
- when 'eu-west-1'
88
- @cert.subject.to_s == "/C=US/ST=Washington/L=Seattle/O=Amazon.com, Inc./CN=codedeploy-commands.eu-west-1.amazonaws.com"
89
- when 'ap-southeast-2'
90
- @cert.subject.to_s == "/C=US/ST=Washington/L=Seattle/O=Amazon.com, Inc./CN=codedeploy-commands.ap-southeast-2.amazonaws.com"
91
- else
92
- InstanceAgent::Log.debug("#{self.class.to_s}: Unsupported region '#{@region}'")
93
- false
94
- end
95
+ @cert.subject.to_s == "/C=US/ST=Washington/L=Seattle/O=Amazon.com, Inc./CN=codedeploy-commands."+@region+".amazonaws.com"
95
96
  end
96
97
 
97
98
  end
@@ -11,6 +11,7 @@ module InstanceAgent
11
11
  module Plugins
12
12
  module CodeDeployPlugin
13
13
  ARCHIVES_TO_RETAIN = 5
14
+
14
15
  class CommandExecutor
15
16
  class << self
16
17
  attr_reader :command_methods
@@ -26,6 +27,17 @@ module InstanceAgent
26
27
  if(!@hook_mapping.nil?)
27
28
  map
28
29
  end
30
+ begin
31
+ max_revisions = ProcessManager::Config.config[:max_revisions]
32
+ @archives_to_retain = max_revisions.nil?? ARCHIVES_TO_RETAIN : Integer(max_revisions)
33
+ if @archives_to_retain < 0
34
+ raise ArgumentError
35
+ end
36
+ rescue ArgumentError
37
+ log(:error, "Invalid configuration :max_revision=#{max_revisions}")
38
+ Platform.util.quit()
39
+ end
40
+ log(:info, "Archives to retain is: #{@archives_to_retain}}")
29
41
  end
30
42
 
31
43
  def self.command(name, &blk)
@@ -115,6 +127,7 @@ module InstanceAgent
115
127
  :application_name => deployment_spec.application_name,
116
128
  :deployment_id => deployment_spec.deployment_id,
117
129
  :deployment_group_name => deployment_spec.deployment_group_name,
130
+ :deployment_group_id => deployment_spec.deployment_group_id,
118
131
  :deployment_root_dir => deployment_root_dir(deployment_spec),
119
132
  :last_successful_deployment_dir => last_successful_deployment_dir(deployment_spec.deployment_group_id),
120
133
  :app_spec_path => app_spec_path)
@@ -165,6 +178,11 @@ module InstanceAgent
165
178
  def download_from_s3(deployment_spec, bucket, key, version, etag)
166
179
  log(:debug, "Downloading artifact bundle from bucket '#{bucket}' and key '#{key}', version '#{version}', etag '#{etag}'")
167
180
  region = ENV['AWS_REGION'] || InstanceMetadata.region
181
+
182
+ proxy_uri = nil
183
+ if InstanceAgent::Config.config[:proxy_uri]
184
+ proxy_uri = URI(InstanceAgent::Config.config[:proxy_uri])
185
+ end
168
186
 
169
187
  if InstanceAgent::Config.config[:log_aws_wire]
170
188
  s3 = Aws::S3::Client.new(
@@ -176,11 +194,15 @@ module InstanceAgent
176
194
  File.join(InstanceAgent::Config.config[:log_dir], "#{InstanceAgent::Config.config[:program_name]}.aws_wire.log"),
177
195
  16,
178
196
  64 * 1024 * 1024),
179
- :http_wire_trace => true)
197
+ :http_wire_trace => true,
198
+ :signature_version => 'v4',
199
+ :http_proxy => proxy_uri)
180
200
  else
181
201
  s3 = Aws::S3::Client.new(
182
202
  :region => region,
183
- :ssl_ca_directory => ENV['AWS_SSL_CA_DIRECTORY'])
203
+ :ssl_ca_directory => ENV['AWS_SSL_CA_DIRECTORY'],
204
+ :signature_version => 'v4',
205
+ :http_proxy => proxy_uri)
184
206
  end
185
207
 
186
208
  File.open(artifact_bundle(deployment_spec), 'wb') do |file|
@@ -316,16 +338,22 @@ module InstanceAgent
316
338
 
317
339
  private
318
340
  def cleanup_old_archives(deployment_group)
319
- deployment_archives = Dir[File.join(ProcessManager::Config.config[:root_dir], deployment_group, '*')]
320
- extra = deployment_archives.size - ARCHIVES_TO_RETAIN
341
+ deployment_archives = Dir.entries(File.join(ProcessManager::Config.config[:root_dir], deployment_group))
342
+ # remove . and ..
343
+ deployment_archives.delete(".")
344
+ deployment_archives.delete("..")
345
+
346
+ full_path_deployment_archives = deployment_archives.map{ |f| File.join(ProcessManager::Config.config[:root_dir], deployment_group, f)}
347
+
348
+ extra = full_path_deployment_archives.size - @archives_to_retain
321
349
  return unless extra > 0
322
350
 
323
351
  # Never remove the last successful deployment
324
352
  last_success = last_successful_deployment_dir(deployment_group)
325
- deployment_archives.delete(last_success)
353
+ full_path_deployment_archives.delete(last_success)
326
354
 
327
355
  # Sort oldest -> newest, take first `extra` elements
328
- oldest_extra = deployment_archives.sort_by{ |f| File.mtime(f) }.take(extra)
356
+ oldest_extra = full_path_deployment_archives.sort_by{ |f| File.mtime(f) }.take(extra)
329
357
 
330
358
  # Absolute path takes care of relative root directories
331
359
  directories = oldest_extra.map{ |f| File.absolute_path(f) }
@@ -8,6 +8,15 @@ module InstanceAgent
8
8
 
9
9
  VERSION = "2013-04-23"
10
10
  def initialize
11
+ test_profile = InstanceAgent::Config.config[:codedeploy_test_profile]
12
+ unless ["beta", "gamma"].include?(test_profile.downcase)
13
+ # Remove any user overrides set in the environment.
14
+ # The agent should always pull credentials from the EC2 instance
15
+ # profile or the credentials in the OnPremises config file.
16
+ ENV['AWS_ACCESS_KEY_ID'] = nil
17
+ ENV['AWS_SECRET_ACCESS_KEY'] = nil
18
+ ENV['AWS_CREDENTIAL_FILE'] = nil
19
+ end
11
20
  CodeDeployPlugin::OnPremisesConfig.configure
12
21
  region = ENV['AWS_REGION'] || InstanceMetadata.region
13
22
  @host_identifier = ENV['AWS_HOST_IDENTIFIER'] || InstanceMetadata.host_identifier
@@ -135,7 +144,9 @@ module InstanceAgent
135
144
 
136
145
  private
137
146
  def gather_diagnostics_from_script_error(script_error)
138
- script_error.to_json
147
+ return script_error.to_json
148
+ rescue Exception => e
149
+ return {'error_code' => "Unknown", 'script_name' => script_error.script_name, 'message' => "Attempting minimal diagnostics", 'log' => "Exception #{e.class} occured"}.to_json
139
150
  end
140
151
 
141
152
  private
@@ -1,5 +1,6 @@
1
1
  require 'openssl'
2
2
  require 'instance_metadata'
3
+ require 'open-uri'
3
4
 
4
5
  module InstanceAgent
5
6
  module Plugins
@@ -132,18 +133,7 @@ module InstanceAgent
132
133
  when 'beta', 'gamma'
133
134
  cert.subject.to_s == "/C=US/ST=Washington/L=Seattle/O=Amazon.com, Inc./CN=codedeploy-signer-integ.amazonaws.com"
134
135
  when 'prod'
135
- case @@region
136
- when 'us-east-1'
137
- cert.subject.to_s == "/C=US/ST=Washington/L=Seattle/O=Amazon.com, Inc./CN=codedeploy-signer-us-east-1.amazonaws.com"
138
- when 'us-west-2'
139
- cert.subject.to_s == "/C=US/ST=Washington/L=Seattle/O=Amazon.com, Inc./CN=codedeploy-signer-us-west-2.amazonaws.com"
140
- when 'eu-west-1'
141
- cert.subject.to_s == "/C=US/ST=Washington/L=Seattle/O=Amazon.com, Inc./CN=codedeploy-signer-eu-west-1.amazonaws.com"
142
- when 'ap-southeast-2'
143
- cert.subject.to_s == "/C=US/ST=Washington/L=Seattle/O=Amazon.com, Inc./CN=codedeploy-signer-ap-southeast-2.amazonaws.com"
144
- else
145
- raise "Unknown region '#{@region}'"
146
- end
136
+ cert.subject.to_s == "/C=US/ST=Washington/L=Seattle/O=Amazon.com, Inc./CN=codedeploy-signer-"+@@region+".amazonaws.com"
147
137
  else
148
138
  raise "Unknown profile '#{Config.config()[:codedeploy_test_profile]}'"
149
139
  end
@@ -52,6 +52,7 @@ module InstanceAgent
52
52
  def to_json
53
53
  log = @log.log || []
54
54
  log = log.join("")
55
+ log.force_encoding("utf-8")
55
56
  {'error_code' => @error_code, 'script_name' => @script_name, 'message' => message, 'log' => log}.to_json
56
57
  end
57
58
  end
@@ -72,6 +73,8 @@ module InstanceAgent
72
73
  @deployment_id = arguments[:deployment_id]
73
74
  @application_name = arguments[:application_name]
74
75
  @deployment_group_name = arguments[:deployment_group_name]
76
+ @deployment_group_id = arguments[:deployment_group_id]
77
+ @current_deployment_root_dir = arguments[:deployment_root_dir]
75
78
  select_correct_deployment_root_dir(arguments[:deployment_root_dir], arguments[:last_successful_deployment_dir])
76
79
  return if @deployment_root_dir.nil?
77
80
  @deployment_archive_dir = File.join(@deployment_root_dir, 'deployment-archive')
@@ -82,8 +85,8 @@ module InstanceAgent
82
85
  @child_envs={'LIFECYCLE_EVENT' => @lifecycle_event.to_s,
83
86
  'DEPLOYMENT_ID' => @deployment_id.to_s,
84
87
  'APPLICATION_NAME' => @application_name,
85
- 'DEPLOYMENT_GROUP_NAME' => @deployment_group_name}
86
-
88
+ 'DEPLOYMENT_GROUP_NAME' => @deployment_group_name,
89
+ 'DEPLOYMENT_GROUP_ID' => @deployment_group_id}
87
90
  end
88
91
 
89
92
  def execute
@@ -94,7 +97,7 @@ module InstanceAgent
94
97
  log_script("LifecycleEvent - " + @lifecycle_event + "\n", script_log_file)
95
98
  hooks.each do |script|
96
99
  if(!File.exist?(script_absolute_path(script)))
97
- raise ScriptError.new(ScriptError::SCRIPT_MISSING_CODE, script.location, @script_log), 'Script does not exist at specified location: ' + script.location
100
+ raise ScriptError.new(ScriptError::SCRIPT_MISSING_CODE, script.location, @script_log), 'Script does not exist at specified location: ' + File.expand_path(script_absolute_path(script))
98
101
  elsif(!InstanceAgent::Platform.util.script_executable?(script_absolute_path(script)))
99
102
  log :warn, 'Script at specified location: ' + script.location + ' is not executable. Trying to make it executable.'
100
103
  begin
@@ -153,7 +156,7 @@ module InstanceAgent
153
156
 
154
157
  private
155
158
  def create_script_log_file_if_needed
156
- script_log_file_location = File.join(@deployment_root_dir, 'logs/scripts.log')
159
+ script_log_file_location = File.join(@current_deployment_root_dir, 'logs/scripts.log')
157
160
  if(!File.exists?(script_log_file_location))
158
161
  unless File.directory?(File.dirname(script_log_file_location))
159
162
  FileUtils.mkdir_p(File.dirname(script_log_file_location))
@@ -217,6 +220,7 @@ module InstanceAgent
217
220
  @hook_logging_mutex.synchronize do
218
221
  @script_log.append_to_log(message)
219
222
  script_log_file.write(Time.now.to_s[0..-7] + ' ' + message)
223
+ InstanceAgent::DeploymentLog.instance.log("[#{@deployment_id}]#{message.strip}") if InstanceAgent::Config.config[:enable_deployments_log]
220
224
  script_log_file.flush
221
225
  end
222
226
  end
@@ -205,7 +205,9 @@ module InstanceAgent
205
205
 
206
206
  def execute
207
207
  #If the file doesn't exist the command is ignored
208
- if File.exist?(@file_path)
208
+ if File.symlink?(@file_path)
209
+ FileUtils.rm(@file_path)
210
+ elsif File.exist?(@file_path)
209
211
  if File.directory?(@file_path)
210
212
  # TODO (AWSGLUE-713): handle the exception if the directory is non-empty;
211
213
  # this might mean the customer has put files in this directory and we should
@@ -6,7 +6,7 @@ class InstanceMetadata
6
6
 
7
7
  IP_ADDRESS = '169.254.169.254'
8
8
  PORT = 80
9
-
9
+
10
10
  def self.host_identifier
11
11
  doc = JSON.parse(http_get('/latest/dynamic/instance-identity/document').strip)
12
12
  "arn:aws:ec2:#{doc['region']}:#{doc['accountId']}:instance/#{doc['instanceId']}"