module Kanrisuru::Core::Disk

Constants

BlkidDevice
DiskFree
DiskUsage
LsblkDevice

Public Instance Methods

blkid(opts = {}) click to toggle source
# File lib/kanrisuru/core/disk.rb, line 89
def blkid(opts = {})
  label = opts[:label]
  uuid  = opts[:uuid]
  device = opts[:device]

  mode = ''
  command = Kanrisuru::Command.new('blkid')

  if Kanrisuru::Util.present?(label) || Kanrisuru::Util.present?(uuid)
    mode = 'search'
    command.append_arg('-L', opts[:label])
    command.append_arg('-U', opts[:uuid])
  elsif Kanrisuru::Util.present?(device)
    mode = 'device'
    command.append_arg('-pio', 'export')
    command << device
  else
    mode = 'list'
    command.append_arg('-o', 'export')
  end

  execute_shell(command)

  Kanrisuru::Result.new(command) do |cmd|
    case mode
    when 'search'
      cmd.to_s
    when 'device'
      lines = cmd.to_a
      blkid_devices(lines)
    else
      lines = cmd.to_a
      blkid_devices(lines)
    end
  end
end
df(opts = {}) click to toggle source
# File lib/kanrisuru/core/disk.rb, line 54
def df(opts = {})
  path   = opts[:path]
  inodes = opts[:inodes]

  command = Kanrisuru::Command.new('df')

  command.append_flag('-PT')
  command.append_flag('-i', inodes)

  command << path if Kanrisuru::Util.present?(path)
  command | "awk '{print $1, $2, $3, $5, $6, $7}'"

  execute(command)

  Kanrisuru::Result.new(command) do |cmd|
    items = []
    rows = cmd.to_a
    rows.each.with_index do |row, index|
      next if index.zero?

      values = row.split

      items << DiskFree.new(
        values[0],
        values[1],
        values[2].to_i,
        values[3].to_i,
        values[4].to_i,
        values[5]
      )
    end
    items
  end
end
du(opts = {}) click to toggle source
# File lib/kanrisuru/core/disk.rb, line 29
def du(opts = {})
  path      = opts[:path]
  summarize = opts[:summarize]
  convert   = opts[:convert]

  command = Kanrisuru::Command.new('du')
  command.append_flag('-s', summarize)
  command << path if Kanrisuru::Util.present?(path)
  command | "awk '{print \\$1, \\$2}'"

  execute_shell(command)

  Kanrisuru::Result.new(command) do |cmd|
    lines = cmd.to_a

    lines.map do |line|
      values = line.split
      size = values[0].to_i
      size = convert ? Kanrisuru::Util::Bits.convert_bytes(size, :byte, convert) : size

      DiskUsage.new(size, values[1])
    end
  end
end
lsblk(opts = {}) click to toggle source
# File lib/kanrisuru/core/disk.rb, line 126
def lsblk(opts = {})
  all    = opts[:all]
  nodeps = opts[:nodeps]
  paths  = opts[:paths]

  command = Kanrisuru::Command.new('lsblk')

  version = lsblk_version

  ## lsblk after version 2.26 handles json parsing.
  ## TODO: parse nested children for earlier version of lsblk
  if version >= 2.27
    command.append_flag('--json') if version >= 2.27
  else
    command.append_flag('-i')
    command.append_flag('-P')
    command.append_flag('--noheadings')
  end

  command.append_flag('-a', all)
  command.append_flag('-p', paths)
  command.append_flag('-d', nodeps)

  command.append_arg('-o', 'NAME,FSTYPE,MAJ:MIN,MOUNTPOINT,SIZE,UUID,RO,RM,OWNER,GROUP,MODE,TYPE')
  execute(command)

  Kanrisuru::Result.new(command) do |cmd|
    if version >= 2.27
      result  = cmd.to_json
      devices = result['blockdevices']
      build_lsblk_devices_json(devices)
    else
      build_lsblk_devices_text(cmd.to_a)
    end
  end
end

Private Instance Methods

blkid_devices(lines) click to toggle source
# File lib/kanrisuru/core/disk.rb, line 165
def blkid_devices(lines)
  devices = []
  current_device = nil

  lines.each do |line|
    value = line.split('=')[1]

    if line =~ /^DEVNAME=/
      current_device = BlkidDevice.new(value)
    elsif line =~ /^UUID=/
      current_device.uuid = value
    elsif line =~ /^LABEL=/
      current_device.label = value
    elsif line =~ /^TYPE=/
      current_device.type = value
    elsif line =~ /^LABEL_FATBOOT=/
      current_device.label_fatboot = value
    elsif line =~ /^PARTUUID=/
      current_device.part_uuid = value
    elsif line =~ /^UUID_SUB=/
      current_device.uuid_sub = value
    elsif line =~ /^USAGE=/
      current_device.usage = value
    elsif line =~ /^VERSION=/
      current_device.version = value.to_f
    elsif line =~ /^MINIMUM_IO_SIZE=/
      current_device.minimum_io_size = value.to_i
    elsif line =~ /^PHYSICAL_SECTOR_SIZE=/
      current_device.physical_sector_size = value.to_i
    elsif line =~ /^LOGICAL_SECTOR_SIZE=/
      current_device.logical_sector_size = value.to_i
    elsif line =~ /^PART_ENTRY_SCHEME=/
      current_device.part_entry_scheme = value
    elsif line =~ /^PART_ENTRY_UUID=/
      current_device.part_entry_uuid = value
    elsif line =~ /^PART_ENTRY_DISK=/
      current_device.part_entry_disk = value
    elsif line =~ /^PART_ENTRY_NUMBER=/
      current_device.part_entry_number = value.to_i
    elsif line =~ /^PART_ENTRY_OFFSET=/
      current_device.part_entry_offset = value.to_i
    elsif line =~ /^PART_ENTRY_SIZE=/
      current_device.part_entry_size = value.to_i
    elsif line =~ /^PART_ENTRY_TYPE=/
      current_device.part_entry_type = value
    elsif Kanrisuru::Util.blank?(line)
      devices << current_device
      current_device = nil
    end
  end

  devices << current_device if Kanrisuru::Util.present?(current_device)
  devices
end
build_lsblk_devices_json(devices) click to toggle source
# File lib/kanrisuru/core/disk.rb, line 282
def build_lsblk_devices_json(devices)
  devices.map do |device|
    children = (build_lsblk_devices_json(device['children']) if device.key?('children'))

    maj_min = device['maj:min']

    LsblkDevice.new(
      device['name'],
      maj_min ? maj_min.split(':')[0].to_i : nil,
      maj_min ? maj_min.split(':')[1].to_i : nil,
      device['rm'],
      device['ro'],
      device['owner'],
      device['group'],
      device['mode'],
      device['size'],
      device['type'],
      device['mountpoint'],
      device['fstype'],
      device['uuid'],
      children
    )
  end
end
build_lsblk_devices_text(lines) click to toggle source
# File lib/kanrisuru/core/disk.rb, line 234
def build_lsblk_devices_text(lines)
  devices = []

  lines.each do |line|
    values = line.split

    current_device = LsblkDevice.new

    values.each do |value|
      key, value = value.split('=')
      value = value.gsub(/"/, '')

      case key
      when 'NAME'
        current_device.name = value
      when 'FSTYPE'
        current_device.fs_type = value
      when 'MAJ:MIN'
        maj, min = value.split(':')
        current_device.maj_dev = maj ? maj.to_i : nil
        current_device.min_dev = min ? min.to_i : nil
      when 'MOUNTPOINT'
        current_device.mount_point = value
      when 'SIZE'
        current_device.fsize = value
      when 'UUID'
        current_device.uuid = value
      when 'RO'
        current_device.readonly_device = value
      when 'RM'
        current_device.removable_device = value
      when 'OWNER'
        current_device.owner = value
      when 'GROUP'
        current_device.group = value
      when 'MODE'
        current_device.mode = value
      when 'TYPE'
        current_device.type = value
      end
    end

    devices << current_device
  end

  devices
end
lsblk_version() click to toggle source
# File lib/kanrisuru/core/disk.rb, line 220
def lsblk_version
  command = Kanrisuru::Command.new('lsblk --version')
  execute(command)

  version = 0.00
  regex = Regexp.new(/\d+(?:[,.]\d+)?/)

  raise 'lsblk command not found' if command.failure?

  version = command.to_s.scan(regex)[0].to_f unless regex.match(command.to_s).nil?

  version
end