lib/instance_agent/plugins/codedeploy/application_specification/linux_permission_info.rb
module InstanceAgent
module Plugins
module CodeDeployPlugin
module ApplicationSpecification
#Helper Class for storing data parsed from permissions list
class LinuxPermissionInfo
attr_reader :object, :pattern, :except, :type, :owner, :group, :mode, :acls, :context
def initialize(object, opts = {})
object = object.to_s
if (object.empty?)
raise AppSpecValidationException, 'The deployment failed because a permission listed in the application specification file has no object value. Update the permissions section of the AppSpec file, and then try again.'
end
@object = object
@pattern = opts[:pattern] || "**"
@except = opts[:except] || []
@type = opts[:type] || ["file", "directory"]
@owner = opts[:owner]
@group = opts[:group]
@mode = opts[:mode]
@acls = opts[:acls]
@context = opts[:context]
end
def validate_file_permission()
if @type.include?("file")
if !"**".eql?(@pattern)
raise AppSpecValidationException, "The deployment failed because the application specification file includes an object (#{@object}) with an invalid pattern (#{@pattern}), such as a pattern for a file applied to a directory. Correct the permissions section of the AppSpec file, and then try again."
end
if !@except.empty?
raise AppSpecValidationException, "The deployment failed because the except parameter for a pattern in the permissions section (#{@except}) for the object named #{@object} contains an invalid format. Update the AppSpec file, and then try again."
end
end
end
def validate_file_acl(object)
if !@acls.nil?
default_acl = @acls.get_default_ace
if !default_acl.nil?
raise "The deployment failed because the -d parameter has been specified to apply an acl setting to a file. This parameter is supported for directories only. Update the AppSpec file, and then try again."
end
end
end
def matches_pattern?(name)
name = name.chomp(File::SEPARATOR)
base_object = sanitize_dir_path(@object)
if !base_object.end_with?(File::SEPARATOR)
base_object = base_object + File::SEPARATOR
end
if name.start_with?(base_object)
if ("**".eql?(@pattern))
return true
end
rel_name = name[base_object.length..name.length]
return matches_simple_glob(rel_name, @pattern)
end
false
end
def matches_except?(name)
name = name.chomp(File::SEPARATOR)
base_object = sanitize_dir_path(@object)
if !base_object.end_with?(File::SEPARATOR)
base_object = base_object + File::SEPARATOR
end
if name.start_with?(base_object)
rel_name = name[base_object.length..name.length]
@except.each do |item|
if matches_simple_glob(rel_name, item)
return true
end
end
end
false
end
private
def matches_simple_glob(name, pattern)
if name.include?(File::SEPARATOR)
return false
end
options = expand(pattern.chars.entries)
name.chars.each do |char|
new_options = []
options.each do |option|
if option[0].eql?("*")
new_options.concat(expand(option))
elsif option[0].eql?(char)
option.shift
new_options.concat(expand(option))
end
end
options = new_options
if (options.include?(["*"]))
return true
end
end
options.include?([])
end
private
def expand(option)
previous_option = nil
while "*".eql?(option[0]) do
previous_option = Array.new(option)
option.shift
end
previous_option.nil? ? [option] : [previous_option, option]
end
private
def sanitize_dir_path(path)
File.expand_path(path)
end
end
end
end
end
end