@param [Integer] user The uid to switch from root to @param [Integer] group The gid to switch from root to @param [Hash] opts The options to create a observer with @option opts [Array<String>] :paths Additional paths to change
ownership of.
@option opts [String] :paths Additional path to to change ownership of
# File lib/boxgrinder-build/util/permissions/fs-observer.rb, line 34 def initialize(user, group, opts={}) @path_set = Set.new(Array(opts[:paths])) # Filter some default directories, plus any subdirectories of # paths we discover at runtime @filter_set = Set.new([%r(^/(etc|dev|sys|bin|sbin|etc|lib|lib64|boot|run|proc|selinux|tmp)(/|$))]) @user = user @group = group end
Receives updates from BoxGrinder::FSMonitor#add_path
@param [Hash] opts The options to update the observer @option opts [:symbol] :command The command to instruct the
observer to execute. * +:add_path+ Indicates the +:data+ field contains a path. * +:stop_capture+ indicates that capturing has ceased. The observer will change ownership of the files, and switch to the user specified at #initialize.
@option opts [String] :data Contains a resource path when the
* +:add_path+ Command is called, otherwise ignored.
# File lib/boxgrinder-build/util/permissions/fs-observer.rb, line 54 def update(update={}) case update[:command] when :add_path unless match_filter?(update[:data]) @path_set.add(update[:data]) @filter_set.merge(subdirectory_regex(update[:data])) end when :stop_capture, :chown do_chown end end
# File lib/boxgrinder-build/util/permissions/fs-observer.rb, line 68 def do_chown @path_set.each do |p| FileUtils.chown_R(@user, @group, p, :force => true) if File.exist?(p) end end
# File lib/boxgrinder-build/util/permissions/fs-observer.rb, line 74 def match_filter?(path) @filter_set.inject(false){ |accum, filter| accum || !!(path =~ filter) } end
# File lib/boxgrinder-build/util/permissions/fs-observer.rb, line 78 def subdirectory_regex(paths) Array(paths).collect{ |p| Regexp.new("^#{p}/") } end