class Facter::Resolvers::Partitions
Constants
- BLOCK_PATH
- BLOCK_SIZE
Private Class Methods
available?(command, blkid_and_lsblk)
click to toggle source
# File lib/facter/resolvers/partitions.rb, line 105 def available?(command, blkid_and_lsblk) command_exists_key = command == 'blkid' ? :blkid_exists : :lsblk_exists return blkid_and_lsblk[command_exists_key] unless blkid_and_lsblk[command_exists_key].nil? blkid_and_lsblk[command_exists_key] = !Facter::Core::Execution.which(command).nil? end
browse_subdirectories(path)
click to toggle source
# File lib/facter/resolvers/partitions.rb, line 83 def browse_subdirectories(path) dirs = Dir[File.join(path, '**', '*')].select { |p| File.directory? p } dirs.select { |subdir| subdir.split('/').last.include?(path.split('/').last) }.reject(&:nil?) end
execute_and_extract_blkid_info()
click to toggle source
# File lib/facter/resolvers/partitions.rb, line 113 def execute_and_extract_blkid_info stdout = Facter::Core::Execution.execute('blkid', logger: log) output_hash = Hash[*stdout.split(/^([^:]+):/)[1..-1]] output_hash.each do |key, value| output_hash[key] = Hash[*value.delete('"').chomp.rstrip.split(/ ([^= ]+)=/)[1..-1]] end end
extract_from_device(block_path, blkid_and_lsblk)
click to toggle source
# File lib/facter/resolvers/partitions.rb, line 39 def extract_from_device(block_path, blkid_and_lsblk) subdirs = browse_subdirectories(block_path) subdirs.each do |subdir| name = "/dev/#{subdir.split('/').last}" populate_partitions(name, subdir, blkid_and_lsblk) end end
extract_from_dm(block_path, block_device, blkid_and_lsblk)
click to toggle source
# File lib/facter/resolvers/partitions.rb, line 47 def extract_from_dm(block_path, block_device, blkid_and_lsblk) map_name = Facter::Util::FileHelper.safe_read("#{block_path}/dm/name").chomp if map_name.empty? populate_partitions("/dev/#{block_device}", block_path, blkid_and_lsblk) else populate_partitions("/dev/mapper/#{map_name}", block_path, blkid_and_lsblk) end end
extract_from_loop(block_path, block_device, blkid_and_lsblk)
click to toggle source
# File lib/facter/resolvers/partitions.rb, line 56 def extract_from_loop(block_path, block_device, blkid_and_lsblk) backing_file = Facter::Util::FileHelper.safe_read("#{block_path}/loop/backing_file").chomp if backing_file.empty? populate_partitions("/dev/#{block_device}", block_path, blkid_and_lsblk) else populate_partitions("/dev/#{block_device}", block_path, blkid_and_lsblk, backing_file) end end
parse_part_info(part_info)
click to toggle source
# File lib/facter/resolvers/partitions.rb, line 132 def parse_part_info(part_info) result = { filesystem: part_info[1] } if part_info.count.eql?(5) result[:label] = part_info[2] result[:uuid] = part_info[3] else result[:uuid] = part_info[2] end result end
populate_from_blkid(partition_name, blkid_and_lsblk)
click to toggle source
# File lib/facter/resolvers/partitions.rb, line 88 def populate_from_blkid(partition_name, blkid_and_lsblk) return {} unless available?('blkid', blkid_and_lsblk) blkid_and_lsblk[:blkid] ||= execute_and_extract_blkid_info partition_data = blkid_and_lsblk[:blkid][partition_name] return {} unless partition_data filesys = partition_data['TYPE'] uuid = partition_data['UUID'] label = partition_data['LABEL'] part_uuid = partition_data['PARTUUID'] part_label = partition_data['PARTLABEL'] { filesystem: filesys, uuid: uuid, label: label, partuuid: part_uuid, partlabel: part_label } end
populate_from_lsblk(partition_name, blkid_and_lsblk)
click to toggle source
# File lib/facter/resolvers/partitions.rb, line 121 def populate_from_lsblk(partition_name, blkid_and_lsblk) return {} unless available?('lsblk', blkid_and_lsblk) blkid_and_lsblk[:lsblk] ||= Facter::Core::Execution.execute('lsblk -fp', logger: log) part_info = blkid_and_lsblk[:lsblk].match(/#{partition_name}.*/).to_s.split(' ') return {} if part_info.empty? parse_part_info(part_info) end
populate_from_syscalls(partition_name, blkid_and_lsblk)
click to toggle source
# File lib/facter/resolvers/partitions.rb, line 75 def populate_from_syscalls(partition_name, blkid_and_lsblk) part_info = populate_from_blkid(partition_name, blkid_and_lsblk) return populate_from_lsblk(partition_name, blkid_and_lsblk) if part_info.empty? part_info end
populate_partitions(partition_name, block_path, blkid_and_lsblk, backing_file = nil)
click to toggle source
# File lib/facter/resolvers/partitions.rb, line 65 def populate_partitions(partition_name, block_path, blkid_and_lsblk, backing_file = nil) size_bytes = Facter::Util::FileHelper.safe_read("#{block_path}/size", '0') .chomp.to_i * BLOCK_SIZE info_hash = { size_bytes: size_bytes, size: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(size_bytes), backing_file: backing_file } info_hash.merge!(populate_from_syscalls(partition_name, blkid_and_lsblk)) @fact_list[:partitions][partition_name] = info_hash.reject { |_key, value| value.nil? } end
post_resolve(fact_name, _options)
click to toggle source
# File lib/facter/resolvers/partitions.rb, line 14 def post_resolve(fact_name, _options) @fact_list.fetch(fact_name) { read_partitions(fact_name) } end
read_partitions(fact_name)
click to toggle source
# File lib/facter/resolvers/partitions.rb, line 18 def read_partitions(fact_name) return unless File.readable?(BLOCK_PATH) block_devices = Dir.entries(BLOCK_PATH).reject { |dir| dir =~ /^\.+/ } @fact_list[:partitions] = {} unless block_devices.empty? blkid_and_lsblk = {} block_devices.each do |block_device| block_path = "#{BLOCK_PATH}/#{block_device}" if File.directory?("#{block_path}/device") extract_from_device(block_path, blkid_and_lsblk) elsif File.directory?("#{block_path}/dm") extract_from_dm(block_path, block_device, blkid_and_lsblk) elsif File.directory?("#{block_path}/loop") extract_from_loop(block_path, block_device, blkid_and_lsblk) end end @fact_list[fact_name] end