module Train::Extras::DetectLinux

Public Instance Methods

detect_linux() click to toggle source
# File lib/train/extras/os_detect_linux.rb, line 114
def detect_linux
  # TODO: print an error in this step of the detection
  return false if uname_s.nil? || uname_s.empty?
  return false if uname_r.nil? || uname_r.empty?

  return true if detect_linux_via_config
  return true if detect_linux_via_lsb
  # in all other cases we failed the detection
  @platform[:family] = 'unknown'
end
detect_linux_via_config() click to toggle source
# File lib/train/extras/os_detect_linux.rb, line 17
def detect_linux_via_config # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
  if !(raw = get_config('oracle-release')).nil?
    @platform[:family] = 'oracle'
    @platform[:release] = redhatish_version(raw)
  elsif !(raw = get_config('/etc/enterprise-release')).nil?
    @platform[:family] = 'oracle'
    @platform[:release] = redhatish_version(raw)
  elsif !(raw = get_config('/etc/debian_version')).nil?
    case lsb[:id]
    when /ubuntu/i
      @platform[:family] = 'ubuntu'
      @platform[:release] = lsb[:release]
    when /linuxmint/i
      @platform[:family] = 'linuxmint'
      @platform[:release] = lsb[:release]
    else
      @platform[:family] = unix_file?('/usr/bin/raspi-config') ? 'raspbian' : 'debian'
      @platform[:release] = raw.chomp
    end
  elsif !(raw = get_config('/etc/parallels-release')).nil?
    @platform[:family] = redhatish_platform(raw)
    @platform[:release] = raw[/(\d\.\d\.\d)/, 1]
  elsif !(raw = get_config('/etc/redhat-release')).nil?
    # TODO: Cisco
    # TODO: fully investigate os-release and integrate it;
    # here we just use it for centos
    if !(osrel = get_config('/etc/os-release')).nil? && osrel =~ /centos/i
      @platform[:family] = 'centos'
    else
      @platform[:family] = redhatish_platform(raw)
    end
    @platform[:release] = redhatish_version(raw)
  elsif !(raw = get_config('/etc/system-release')).nil?
    # Amazon Linux
    @platform[:family] = redhatish_platform(raw)
    @platform[:release] = redhatish_version(raw)
  elsif !(suse = get_config('/etc/SuSE-release')).nil?
    version = suse.scan(/VERSION = (\d+)\nPATCHLEVEL = (\d+)/).flatten.join('.')
    version = suse[/VERSION = ([\d\.]{2,})/, 1] if version == ''
    @platform[:release] = version
    @platform[:family] = 'suse'
    @platform[:family] = 'opensuse' if suse =~ /^openSUSE/
  elsif !(raw = get_config('/etc/arch-release')).nil?
    @platform[:family] = 'arch'
    # Because this is a rolling release distribution,
    # use the kernel release, ex. 4.1.6-1-ARCH
    @platform[:release] = uname_r
  elsif !(raw = get_config('/etc/slackware-version')).nil?
    @platform[:family] = 'slackware'
    @platform[:release] = raw.scan(/(\d+|\.+)/).join
  elsif !(raw = get_config('/etc/exherbo-release')).nil?
    @platform[:family] = 'exherbo'
    # Because this is a rolling release distribution,
    # use the kernel release, ex. 4.1.6
    @platform[:release] = uname_r
  elsif !(raw = get_config('/etc/gentoo-release')).nil?
    @platform[:family] = 'gentoo'
    @platform[:release] = raw.scan(/(\d+|\.+)/).join
  elsif !(raw = get_config('/etc/alpine-release')).nil?
    @platform[:family] = 'alpine'
    @platform[:release] = raw.strip
  elsif !(raw = get_config('/etc/coreos/update.conf')).nil?
    @platform[:family] = 'coreos'
    meta = lsb_config(raw)
    @platform[:release] = meta[:release]
  elsif !(os_info = fetch_os_release).nil?
    if os_info['ID_LIKE'] =~ /wrlinux/
      @platform[:family]  = 'wrlinux'
      @platform[:release] = os_info['VERSION']
    end
  end

  !@platform[:family].nil? && !@platform[:release].nil?
end
fetch_os_release() click to toggle source
# File lib/train/extras/os_detect_linux.rb, line 125
def fetch_os_release
  data = get_config('/etc/os-release')
  return if data.nil?

  os_info = parse_os_release_info(data)
  cisco_info_file = os_info['CISCO_RELEASE_INFO']
  if cisco_info_file
    os_info.merge!(parse_os_release_info(get_config(cisco_info_file)))
  end

  os_info
end
parse_os_release_info(raw) click to toggle source
# File lib/train/extras/os_detect_linux.rb, line 138
def parse_os_release_info(raw)
  return {} if raw.nil?

  raw.lines.each_with_object({}) do |line, memo|
    line.strip!
    key, value = line.split('=', 2)
    memo[key] = value.gsub(/\A"|"\Z/, '') unless value.empty?
  end
end
redhatish_platform(conf) click to toggle source
# File lib/train/extras/os_detect_linux.rb, line 104
def redhatish_platform(conf)
  conf[/^red hat/i] ? 'redhat' : conf[/(\w+)/i, 1].downcase
end
redhatish_version(conf) click to toggle source
# File lib/train/extras/os_detect_linux.rb, line 108
def redhatish_version(conf)
  return conf[/((\d+) \(Rawhide\))/i, 1].downcase if conf[/rawhide/i]
  return conf[/Linux ((\d+|\.)+)/i, 1] if conf[/derived from .*linux/i]
  conf[/release ([\d\.]+)/, 1]
end
uname_r() click to toggle source
# File lib/train/extras/os_detect_linux.rb, line 96
def uname_r
  @uname_r ||= (
    res = @backend.run_command('uname -r').stdout
    res.strip! unless res.nil?
    res
  )
end
uname_s() click to toggle source
# File lib/train/extras/os_detect_linux.rb, line 92
def uname_s
  @uname_s ||= @backend.run_command('uname -s').stdout
end