PageRenderTime 47ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/secstate-0.4.1/remediation/puppet-modules/file_perms/lib/puppet/provider/file_perms/file_perms.rb

#
Ruby | 327 lines | 249 code | 57 blank | 21 comment | 40 complexity | d3817d890b004b38ef9b0157bb668d22 MD5 | raw file
Possible License(s): BSD-3-Clause, GPL-2.0, LGPL-2.1
  1. # Copyright (C) 2010 Tresys Technology, LLC
  2. #
  3. # This library is free software; you can redistribute it and/or
  4. # modify it under the terms of the GNU Lesser General Public
  5. # License as published by the Free Software Foundation; either
  6. # version 2.1 of the License, or (at your option) any later version.
  7. #
  8. # This library is distributed in the hope that it will be useful,
  9. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. # Lesser General Public License for more details.
  12. #
  13. # You should have received a copy of the GNU Lesser General Public
  14. # License along with this library; if not, write to the Free Software
  15. # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  16. #
  17. # File: file_perms.rb
  18. # This file is the implementation of the file_perms provider
  19. require 'puppet'
  20. require 'fileutils'
  21. require 'find'
  22. Puppet::Type.type(:file_perms).provide :file_perms, :parent => Puppet::Provider do
  23. desc 'Allows setting of unix dac mode bits. Bits not specified are untouched'
  24. @@mode_bits_hash = { :suid => 2048,
  25. :sgid => 1024,
  26. :sticky => 512,
  27. :uread => 256,
  28. :uwrite => 128,
  29. :uexec => 64,
  30. :gread => 32,
  31. :gwrite => 16,
  32. :gexec => 8,
  33. :oread => 4,
  34. :owrite => 2,
  35. :oexec => 1 }
  36. def initialize(args)
  37. super
  38. param_parse
  39. prefetch
  40. end
  41. def param_parse
  42. originals = @resource.original_parameters
  43. if originals[:recurse] != nil
  44. @resource[:recurse] = convert_symbol(originals[:recurse])
  45. else
  46. @resource[:recurse] = false
  47. end
  48. if originals[:change_files] != nil
  49. @resource[:change_files] = convert_symbol(originals[:change_files])
  50. else
  51. @resource[:change_files] = true
  52. end
  53. if originals[:change_dirs] != nil
  54. @resource[:change_dirs] = convert_symbol(originals[:change_dirs])
  55. else
  56. @resource[:change_dirs] = false
  57. end
  58. end
  59. def prefetch
  60. unless @resource
  61. raise Puppet::DevError, "Somehow got told to prefetch with no resource set"
  62. end
  63. if not File.exists?(@resource[:name])
  64. raise ArgumentError,
  65. "Error: No such file or directory : #{@resource[:name]}"
  66. end
  67. if convert_symbol(@resource[:recurse])
  68. #when the recurse option is set mode_bits is a hash from filenames (or directory names) to a hash of its permission bits
  69. @permissions = Hash.new
  70. #recurses over the directory
  71. Find.find(@resource[:name]) do |fname|
  72. next if (File.file?(fname) and (convert_symbol(@resource[:change_files]) == false))
  73. next if (File.directory?(fname) and (convert_symbol(@resource[:change_dirs]) == false))
  74. mode = File.stat(fname).mode
  75. @permissions[fname] = mode_to_hash(mode)
  76. @permissions[fname][:owner] = File.stat(@resource[:name]).uid
  77. @permissions[fname][:group] = File.stat(@resource[:name]).gid
  78. end
  79. if @permissions.size == 0
  80. raise RuntimeError,
  81. "Error: There are no files or directories to be processed."
  82. end
  83. else
  84. mode = File.stat(@resource[:name]).mode
  85. @permissions = mode_to_hash(mode)
  86. @permissions[:owner] = File.stat(@resource[:name]).uid
  87. @permissions[:group] = File.stat(@resource[:name]).gid
  88. end
  89. end
  90. def flush
  91. if convert_symbol(@resource[:recurse])
  92. @permissions.each do |fname, value|
  93. new_mode = hash_to_mode(value)
  94. File.chmod(new_mode, fname)
  95. File.chown(value[:owner], value[:group], fname)
  96. end
  97. else
  98. new_mode = hash_to_mode(@permissions)
  99. File.chmod(new_mode, @resource[:name])
  100. File.chown(@permissions[:owner], @permissions[:group], @resource[:name])
  101. end
  102. end
  103. def all_or_nil(hash, hash2_key)
  104. aon = nil
  105. hash.each do |key, value|
  106. if aon == nil
  107. aon = value[hash2_key]
  108. elsif aon != value[hash2_key]
  109. return nil
  110. end
  111. end
  112. return aon
  113. end
  114. def set_all_hash_vals(hash, hash2_key, hash2_val)
  115. hash.each do |key, value|
  116. value[hash2_key] = hash2_val
  117. end
  118. end
  119. def get_val(symbol)
  120. if @resource[:recurse] == :true
  121. value = all_or_nil(@permissions, symbol)
  122. else
  123. value = @permissions[symbol]
  124. end
  125. return truth_to_symbol(value)
  126. end
  127. def set_val(symbol, value)
  128. value = convert_symbol(value)
  129. if convert_symbol(@resource[:recurse])
  130. set_all_hash_vals(@permissions, symbol, value)
  131. else
  132. @permissions[symbol] = value
  133. end
  134. end
  135. def suid
  136. get_val(:suid)
  137. end
  138. def sgid
  139. get_val(:sgid)
  140. end
  141. def sticky
  142. get_val(:sticky)
  143. end
  144. def uread
  145. get_val(:uread)
  146. end
  147. def uwrite
  148. get_val(:uwrite)
  149. end
  150. def uexec
  151. get_val(:uexec)
  152. end
  153. def gread
  154. get_val(:gread)
  155. end
  156. def gwrite
  157. get_val(:gwrite)
  158. end
  159. def gexec
  160. get_val(:gexec)
  161. end
  162. def oread
  163. get_val(:oread)
  164. end
  165. def owrite
  166. get_val(:owrite)
  167. end
  168. def oexec
  169. get_val(:oexec)
  170. end
  171. def owner
  172. get_val(:owner)
  173. end
  174. def group
  175. get_val(:group)
  176. end
  177. def suid=(value)
  178. set_val(:suid, value)
  179. end
  180. def sgid=(value)
  181. set_val(:sgid, value)
  182. end
  183. def sticky=(value)
  184. set_val(:sticky, value)
  185. end
  186. def uread=(value)
  187. set_val(:uread, value)
  188. end
  189. def uwrite=(value)
  190. set_val(:uwrite, value)
  191. end
  192. def uexec=(value)
  193. set_val(:uexec, value)
  194. end
  195. def gread=(value)
  196. set_val(:gread, value)
  197. end
  198. def gwrite=(value)
  199. set_val(:gwrite, value)
  200. end
  201. def gexec=(value)
  202. set_val(:gexec, value)
  203. end
  204. def oread=(value)
  205. set_val(:oread, value)
  206. end
  207. def owrite=(value)
  208. set_val(:owrite, value)
  209. end
  210. def oexec=(value)
  211. set_val(:oexec, value)
  212. end
  213. def owner=(value)
  214. set_val(:owner, value)
  215. end
  216. def group=(value)
  217. set_val(:group, value)
  218. end
  219. def mode_to_hash(mode)
  220. mode_bits = Hash.new()
  221. mode_bits[:suid] = (mode & @@mode_bits_hash[:suid]) != 0 ? true : false
  222. mode_bits[:sgid] = (mode & @@mode_bits_hash[:sgid]) != 0 ? true : false
  223. mode_bits[:sticky] = (mode & @@mode_bits_hash[:sticky]) != 0 ? true : false
  224. mode_bits[:uread] = (mode & @@mode_bits_hash[:uread]) != 0 ? true : false
  225. mode_bits[:uwrite] = (mode & @@mode_bits_hash[:uwrite]) != 0 ? true : false
  226. mode_bits[:uexec] = (mode & @@mode_bits_hash[:uexec]) != 0 ? true : false
  227. mode_bits[:gread] = (mode & @@mode_bits_hash[:gread]) != 0 ? true : false
  228. mode_bits[:gwrite] = (mode & @@mode_bits_hash[:gwrite]) != 0 ? true : false
  229. mode_bits[:gexec] = (mode & @@mode_bits_hash[:gexec]) != 0 ? true : false
  230. mode_bits[:oread] = (mode & @@mode_bits_hash[:oread]) != 0 ? true : false
  231. mode_bits[:owrite] = (mode & @@mode_bits_hash[:owrite]) != 0 ? true : false
  232. mode_bits[:oexec] = (mode & @@mode_bits_hash[:oexec]) != 0 ? true : false
  233. #returns the new hash
  234. return mode_bits
  235. end
  236. def convert_symbol(value)
  237. if value == true or value == :true
  238. return true
  239. elsif value == false or value ==:false
  240. return false
  241. else
  242. return value
  243. end
  244. end
  245. def truth_to_symbol(value)
  246. if value == true
  247. return :true
  248. elsif value == false
  249. return :false
  250. else
  251. return value
  252. end
  253. end
  254. def hash_to_mode(hash)
  255. new_mode = 0
  256. new_mode |= convert_symbol( hash[:suid] ) ? @@mode_bits_hash[:suid] : 0
  257. new_mode |= convert_symbol( hash[:sgid] ) ? @@mode_bits_hash[:sgid] : 0
  258. new_mode |= convert_symbol( hash[:sticky] ) ? @@mode_bits_hash[:sticky] : 0
  259. new_mode |= convert_symbol( hash[:uread] ) ? @@mode_bits_hash[:uread] : 0
  260. new_mode |= convert_symbol( hash[:uwrite] ) ? @@mode_bits_hash[:uwrite] : 0
  261. new_mode |= convert_symbol( hash[:uexec] ) ? @@mode_bits_hash[:uexec] : 0
  262. new_mode |= convert_symbol( hash[:gread] ) ? @@mode_bits_hash[:gread] : 0
  263. new_mode |= convert_symbol( hash[:gwrite] ) ? @@mode_bits_hash[:gwrite] : 0
  264. new_mode |= convert_symbol( hash[:gexec] ) ? @@mode_bits_hash[:gexec] : 0
  265. new_mode |= convert_symbol( hash[:oread] ) ? @@mode_bits_hash[:oread] : 0
  266. new_mode |= convert_symbol( hash[:owrite] ) ? @@mode_bits_hash[:owrite] : 0
  267. new_mode |= convert_symbol( hash[:oexec] ) ? @@mode_bits_hash[:oexec] : 0
  268. return new_mode
  269. end
  270. end