Module: Chef::Mixin::Securable
- Included in:
- Resource::CookbookFile, Resource::Directory, Resource::File, Resource::Link, Resource::RemoteDirectory, Resource::RemoteFile, Resource::Template
- Defined in:
- lib/chef/mixin/securable.rb
Class Method Summary collapse
-
.rights_attribute(name) ⇒ Object
rights_attribute “meta-method” for dynamically creating rights attributes on resources.
Instance Method Summary collapse
- #group(arg = nil) ⇒ Object
- #inherits(arg = nil) ⇒ Object
- #mode(arg = nil) ⇒ Object
- #owner(arg = nil) ⇒ Object (also: #user)
Class Method Details
.rights_attribute(name) ⇒ Object
rights_attribute
“meta-method” for dynamically creating rights attributes on resources.
Multiple rights attributes can be declared. This enables resources to have multiple rights attributes with separate runtime states.
For example, Chef::Resource::RemoteDirectory
supports different rights on the directories and files by declaring separate rights attributes for each (rights and files_rights).
User Level API
Given a resource that calls
rights_attribute(:rights)
Then the resource DSL could be used like this:
rights :read, ["Administrators","Everyone"]
rights :deny, "Pinky"
rights :full_control, "Users", :applies_to_children => true
rights :write, "John Keiser", :applies_to_children => :containers_only, :applies_to_self => false, :one_level_deep => true
Internal Data Structure
rights attributes support multiple right declarations in a single resource block–the data will be merged into a single internal hash.
The internal representation is a hash with the following keys:
-
‘:permissions`: Integer of Windows permissions flags, 1..2^32
or one of ‘[:full_control, :modify, :read_execute, :read, :write]`
-
‘:principals`: String or Array of Strings represnting usernames on
the system.
-
‘:applies_to_children` (optional): Boolean
-
‘:applies_to_self` (optional): Boolean
-
‘:one_level_deep` (optional): Boolean
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/chef/mixin/securable.rb', line 102 def self.rights_attribute(name) # equivalent to something like: # def rights(permissions=nil, principals=nil, args_hash=nil) define_method(name) do |*args| # Ruby 1.8 compat: default the arguments = args.length >= 1 ? args[0] : nil principals = args.length >= 2 ? args[1] : nil args_hash = args.length >= 3 ? args[2] : nil raise ArgumentError.new("wrong number of arguments (#{args.length} for 3)") if args.length >= 4 rights = self.instance_variable_get("@#{name.to_s}".to_sym) unless .nil? input = { :permissions => , :principals => principals } input.merge!(args_hash) unless args_hash.nil? validations = {:permissions => { :required => true }, :principals => { :required => true, :kind_of => [String, Array] }, :applies_to_children => { :equal_to => [ true, false, :containers_only, :objects_only ]}, :applies_to_self => { :kind_of => [ TrueClass, FalseClass ] }, :one_level_deep => { :kind_of => [ TrueClass, FalseClass ] } } validate(input, validations) [ ].flatten.each do || if .is_a?(Integer) if < 0 || > 1<<32 raise ArgumentError, "permissions flags must be positive and <= 32 bits (#{})" end elsif !([:full_control, :modify, :read_execute, :read, :write].include?(.to_sym)) raise ArgumentError, "permissions parameter must be :full_control, :modify, :read_execute, :read, :write or an integer representing Windows permission flags" end end [ principals ].flatten.each do |principal| if !principal.is_a?(String) raise ArgumentError, "principals parameter must be a string or array of strings representing usernames" end end if input[:applies_to_children] == false if input[:applies_to_self] == false raise ArgumentError, "'rights' attribute must specify either :applies_to_children or :applies_to_self." end if input[:one_level_deep] == true raise ArgumentError, "'rights' attribute specified :one_level_deep without specifying :applies_to_children." end end rights ||= [] rights << input end set_or_return( name, rights, {} ) end end |
Instance Method Details
#group(arg = nil) ⇒ Object
33 34 35 36 37 38 39 |
# File 'lib/chef/mixin/securable.rb', line 33 def group(arg=nil) set_or_return( :group, arg, :regex => Chef::Config[:group_valid_regex] ) end |
#inherits(arg = nil) ⇒ Object
168 169 170 171 172 173 174 |
# File 'lib/chef/mixin/securable.rb', line 168 def inherits(arg=nil) set_or_return( :inherits, arg, :kind_of => [ TrueClass, FalseClass ] ) end |
#mode(arg = nil) ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/chef/mixin/securable.rb', line 41 def mode(arg=nil) set_or_return( :mode, arg, :callbacks => { "not in valid numeric range" => lambda { |m| if m.kind_of?(String) m =~ /^0/ || m="0#{m}" end # Windows does not support the sticky or setuid bits if Chef::Platform.windows? Integer(m)<=0777 && Integer(m)>=0 else Integer(m)<=07777 && Integer(m)>=0 end }, } ) end |