Module: LinuxStat::OS

Defined in:
lib/linux_stat/os.rb

Class Method Summary collapse

Class Method Details

.bitsObject

Reads ruby configuration and tries to guess if the system is 64 bit.

If it fails then it runs utsname.h to guess the machine.

It the machine is 64 bits, it will return 64, else it returns 32.

The return type is strictly Integer and doesn’t fail.



97
98
99
100
101
102
103
# File 'lib/linux_stat/os.rb', line 97

def bits
  @@bits ||= if RbConfig::CONFIG['host_cpu'].end_with?('64') || RUBY_PLATFORM.end_with?('64') || machine.end_with?('64')
    64
  else
    32
  end
end

.distributionObject

Reads /etc/lsb-release or /etc/os-release tries to get information about the distribution.

If the information isn’t available, it will read and return /etc/issue.

The return type is String. If none of the info is available, it will return an empty frozen String.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/linux_stat/os.rb', line 42

def distribution
  @@distribution ||= if os_release.key?(:NAME)
    os_release[:NAME]
  else
    v = lsb_release

    if v.key?(:DISTRIB_DESCRIPTION)
      v[:DISTRIB_DESCRIPTION]
    elsif v.key?(:DISTRIB_ID)
      v[:DISTRIB_ID]
    elsif File.readable?('/etc/issue')
      IO.read('/etc/issue').strip
    else
      'Unknown'.freeze
    end
  end
end

.hostnameObject

Reads /etc/hostname and returns the hostname.

The return type is String. If the info info isn’t available, it will return ‘localhost’.



81
82
83
84
85
86
87
# File 'lib/linux_stat/os.rb', line 81

def hostname
  @@hostname ||= if File.exist?('/etc/hostname')
    IO.read('/etc/hostname').strip
  else
    'localhost'
  end
end

.lsb_releaseObject

Reads /etc/lsb-release and returns a Hash. For example:

{:LSB_VERSION=>"1.4", :DISTRIB_ID=>"Arch", :DISTRIB_RELEASE=>"rolling", :DISTRIB_DESCRIPTION=>"Arch Linux"}

If the info isn’t available, it will return an empty Hash.

The amount of data read is 4096 bytes. Any more than that will result in truncated output.

The information is also cached, and once loaded, won’t change in runtime. Because changing the /etc/lsb-release isn’t expected in runtime.



30
31
32
33
# File 'lib/linux_stat/os.rb', line 30

def lsb_release
  # cached (memoized) ; as changing the value in runtime is unexpected
  @@lsb_release ||= File.readable?('/etc/lsb-release') ? release('/etc/lsb-release') : {}
end

.machineObject

Uses utsname.h to determine the machine

It returns a String but if the info isn’t available, it will return an empty String



64
65
66
# File 'lib/linux_stat/os.rb', line 64

def machine
  @@machine ||= LinuxStat::Uname.machine
end

.nodenameObject

Uses utsname.h to determine the system nodename

It returns String but if the info isn’t available, it will return an empty String



72
73
74
# File 'lib/linux_stat/os.rb', line 72

def nodename
  @@nodename ||= LinuxStat::Uname.nodename
end

.os_releaseObject

Reads /etc/os-release and returns a Hash. For example:

{:NAME=>"Arch Linux", :PRETTY_NAME=>"Arch Linux", :ID=>"arch", :BUILD_ID=>"rolling", :ANSI_COLOR=>"38;2;23;147;209", :HOME_URL=>"https://www.archlinux.org/", :DOCUMENTATION_URL=>"https://wiki.archlinux.org/", :SUPPORT_URL=>"https://bbs.archlinux.org/", :BUG_REPORT_URL=>"https://bugs.archlinux.org/", :LOGO=>"archlinux"}

If the info isn’t available, it will return an empty Hash.

The amount of data read is 4096 bytes. Any more than that will result in truncated output.

The information is also cached, and once loaded, won’t change in runtime. Because changing the /etc/lsb-release isn’t expected in runtime.



15
16
17
18
# File 'lib/linux_stat/os.rb', line 15

def os_release
  # cached (memoized) ; as changing the value in runtime is unexpected
  @@os_release ||= File.readable?('/etc/os-release') ? release('/etc/os-release') : {}
end

.uptimeObject

Reads /proc/uptime and returns the system uptime:

{:hour=>10, :minute=>34, :second=>12.59}

If the stat isn’t available, an empty hash is returned.



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/linux_stat/os.rb', line 110

def uptime
  return {} unless uptime_readable?

  uptime = IO.read('/proc/uptime').to_f
  uptime_i = uptime.to_i

  h = uptime_i / 3600
  m = uptime_i % 3600 / 60
  s = uptime.%(3600).%(60).round(2)

  {
    hour: h,
    minute: m,
    second: s
  }
end