class Kanrisuru::Remote::Fstab::Entry

Attributes

device[R]
freq[R]
invalid[R]
label[R]
mount_point[RW]
opts[R]
passno[R]
type[R]
uuid[R]

Public Class Methods

new(opts = {}) click to toggle source
# File lib/kanrisuru/remote/fstab.rb, line 141
def initialize(opts = {})
  @host = opts[:host]
  @line = opts[:line]

  @default = nil

  @device = opts[:device] || nil
  @opts = opts[:opts] || nil
  @label = opts[:label] || nil
  @uuid = opts[:uuid] || nil
  @mount_point = opts[:mount_point] || nil
  @type = opts[:type] || nil
  @freq = opts[:freq] || nil
  @passno = opts[:passno] || nil

  @changed = false

  @ucount = 0
  @special = false
  @invalid = false

  if Kanrisuru::Util.present?(@line) && @line.instance_of?(String)
    parse_line!
  elsif Kanrisuru::Util.present?(@opts) && @opts.instance_of?(String) || @opts.instance_of?(Hash)
    @opts = Kanrisuru::Remote::Fstab::Options.new(@type, @opts)
  end
end

Public Instance Methods

inspect() click to toggle source
# File lib/kanrisuru/remote/fstab.rb, line 169
def inspect
  str = '#<Kanrisuru::Remote::Fstab::Entry:0x%<object_id>s ' \
        '@line=%<line>s @device=%<device>s @label=%<label>s' \
        '@uuid=%<uuid>s @freq=%<freq>s @pasno=%<passno>s' \
        '@opts=%<opts>s}>'

  format(
    str,
    object_id: object_id,
    line: @line,
    device: @device,
    label: @label,
    uuid: @uuid,
    freq: @freq,
    passno: @passno,
    opts: @opts.inspect
  )
end
to_s(override = nil) click to toggle source
# File lib/kanrisuru/remote/fstab.rb, line 192
def to_s(override = nil)
  mode = override || @default

  case mode
  when 'uuid'
    "UUID=#{@uuid} #{@mount_point} #{@type} #{@opts} #{@freq} #{@passno}"
  when 'label'
    "LABEL=#{@label} #{@mount_point} #{@type} #{@opts} #{@freq} #{@passno}"
  else
    "#{@device} #{@mount_point} #{@type} #{@opts} #{@freq} #{@passno}"
  end
end
valid?() click to toggle source
# File lib/kanrisuru/remote/fstab.rb, line 188
def valid?
  !@invalid
end

Private Instance Methods

parse_dev(fsline) click to toggle source
# File lib/kanrisuru/remote/fstab.rb, line 275
def parse_dev(fsline)
  @device = fsline
  result = @host.blkid(device: @device)

  @label = result.success? ? result.label : nil
  @uuid = result.success? ? result.uuid : nil
end
parse_label(fsline) click to toggle source
# File lib/kanrisuru/remote/fstab.rb, line 247
def parse_label(fsline)
  @label = fsline.split('=').last.strip.chomp
  path = @host.realpath("/dev/disk/by-label/#{@label}").path

  @device = begin
    "/dev/#{path.split('/').last}"
  rescue StandardError
    "unknown_#{@ucount}"
  end

  result = @host.blkid(device: @device)
  @uuid = result.success? ? result.uuid : nil
end
parse_line!() click to toggle source
# File lib/kanrisuru/remote/fstab.rb, line 207
def parse_line!
  fsline, mp, @type, opts, freq, passno = @line.split

  @mount_point = mp
  @freq = freq || '0'
  @passno = passno || '0'

  @opts = Fstab::Options.new(@type, opts)

  case @line
  when /^\s*LABEL=/
    @default = 'label'
    parse_label(fsline)
  when /^\s*UUID=/
    @default = 'uuid'
    parse_uuid(fsline)
  when %r{^\s*/dev}
    @default = 'dev'
    parse_dev(fsline)
  else
    # TODO: somewhat risky to assume that everything else
    # can be considered a special device, but validating this
    # is really tricky.
    @special = true
    @device = fsline
  end

  # Fstab entries not matching real devices have device unknown
  @invalid = (@line.split.count != 6) # invalid entry if < 6 columns

  if (@uuid.nil? && @label.nil? && !@special) ||
     @device =~ /^unknown_/ ||
     (!@host.inode?(@device) && !@special)
    @invalid = true
    @ucount += 1
  end

  @invalid = true unless @freq =~ /0|1|2/ && @passno =~ /0|1|2/
end
parse_uuid(fsline) click to toggle source
# File lib/kanrisuru/remote/fstab.rb, line 261
def parse_uuid(fsline)
  @uuid = fsline.split('=').last.strip.chomp
  path = @host.realpath("/dev/disk/by-uuid/#{uuid}").path

  @device = begin
    "/dev/#{path.split('/').last}"
  rescue StandardError
    "unknown_#{@ucount}"
  end

  result = @host.blkid(device: @device)
  @label = result.success? ? result.label : nil
end