informo 1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1,31 @@
1
+ # Informo
2
+
3
+ A ruby gem for retrieving info from linux systems.
4
+
5
+ ## Installation
6
+
7
+ clone this repo
8
+
9
+ ```
10
+ $ gem build informo.gemspec
11
+ $ gem install informo-1.0.gem
12
+ ```
13
+
14
+ ## Usage
15
+
16
+ ```
17
+ require 'informo'
18
+ ```
19
+
20
+ The following top level classes exist:
21
+
22
+ - Informo::Bios
23
+ - Informo::Dpkg
24
+ - Informo::Memory
25
+ - Informo::Network
26
+ - Informo::Processor
27
+ - Informo::Rpm
28
+ - Informo::Storage
29
+ - Informo::System
30
+
31
+
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << 'test'
5
+ end
6
+
7
+ desc "Run tests"
8
+ task :default => :test
data/informo.gemspec ADDED
@@ -0,0 +1,12 @@
1
+ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
2
+ require 'informo/version'
3
+
4
+ Gem::Specification.new 'informo', Informo::VERSION do |s|
5
+ s.date = '2013-05-03'
6
+ s.summary = 'Linux info wrapped in a gem'
7
+ s.description = 'Informo is used to gather information from your linux system'
8
+ s.files = `git ls-files`.split("\n") - %w[]
9
+ s.author = 'Rick Briganti'
10
+ s.email = 'jeviolle@newaliases.org'
11
+ s.homepage = 'http://github.com/jeviolle/informo'
12
+ end
data/lib/informo.rb ADDED
@@ -0,0 +1,31 @@
1
+ require 'informo/bios.rb'
2
+ require 'informo/dpkg.rb'
3
+ require 'informo/memory.rb'
4
+ require 'informo/network.rb'
5
+ require 'informo/processor.rb'
6
+ require 'informo/rpm.rb'
7
+ require 'informo/storage.rb'
8
+ require 'informo/system.rb'
9
+ require 'informo/version.rb'
10
+
11
+ ##
12
+ # Informo make's it easy to get system information
13
+ # for Linux systems from inside ruby scripts. Currently it is
14
+ # a glorified wrapper around existing native commands and
15
+ # tries to avoid reinventing wheels that already exist inside
16
+ # GNU/Linux.
17
+ #
18
+ # The following classes are available:
19
+ #
20
+ # - Informo::Bios
21
+ # - Informo::Dpkg
22
+ # - Informo::Memory
23
+ # - Informo::Network
24
+ # - Informo::Processor
25
+ # - Informo::Rpm
26
+ # - Informo::Storage
27
+ # - Informo::System
28
+ #
29
+ module Informo
30
+
31
+ end
@@ -0,0 +1,30 @@
1
+ module Informo
2
+ ##
3
+ # Allows for the retrieval of bios related information.
4
+ class Bios
5
+ ##
6
+ # returns the serial number as a string
7
+ def serial
8
+ serial = `dmidecode -s system-serial-number`.chomp
9
+ return serial
10
+ end
11
+ ##
12
+ # returns the bios vendor as a string
13
+ def vendor
14
+ vendor = `dmidecode -s system-product-name`.chomp
15
+ return vendor
16
+ end
17
+ ##
18
+ # returns the bios version as a string
19
+ def version
20
+ version = `dmidecode -s bios-version`.chomp
21
+ return version
22
+ end
23
+ ##
24
+ # returns the release date of the installed bios version as a string
25
+ def date
26
+ date = `dmidecode -s bios-release-date`.chomp
27
+ return date
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,81 @@
1
+ require 'time'
2
+
3
+ module Informo
4
+ ##
5
+ # This class is used to return information about installed packages
6
+ # for systems utilizing debian/ubuntu package formats
7
+ class Dpkg
8
+ def initialize()
9
+ @@dpkgquery = "dpkg-query"
10
+ @@pkginfo = "/var/lib/dpkg/info"
11
+ end
12
+ ##
13
+ # returns an array of package names that are/were installed
14
+ # as show via +dpkg-query+ command
15
+ def get_packages
16
+ packages = Array.new
17
+ packages = `#{@@dpkgquery} -W -f='${Package}\n'`.split("\n")
18
+ return packages
19
+ end
20
+ ##
21
+ # returns the version of the package specified as a string
22
+ def get_version(name)
23
+ package_version = `#{@@dpkgquery} -W -f='${Version}' #{name}`
24
+ return package_version
25
+ end
26
+ ##
27
+ # returns the architecture of the package specified as a string
28
+ def get_architecture(name)
29
+ package_architecture = `#{@@dpkgquery} -W -f='${Architecture}' #{name}`
30
+ return package_architecture
31
+ end
32
+ ##
33
+ # returns the package maintainer for the given package as a string
34
+ def get_maintainer(name)
35
+ package_maintainer = `#{@@dpkgquery} -W -f='${Maintainer}' #{name}`
36
+ return package_maintainer
37
+ end
38
+ ##
39
+ # returns a brief description of a given package as a string
40
+ def get_short_description(name)
41
+ package_description = `#{@@dpkgquery} -W -f='${Description}' #{name}`.split("\n")
42
+ return package_description[0]
43
+ end
44
+ ##
45
+ # returns the full, possibly lengthy, description for the specified package as a string
46
+ def get_description(name)
47
+ package_description = `#{@@dpkgquery} -W -f='${Description}' #{name}`
48
+ return package_description
49
+ end
50
+ ##
51
+ # returns the status for the package specified as a string
52
+ def get_status(name)
53
+ package_status = `#{@@dpkgquery} -W -f='${Status}' #{name}`
54
+ return package_status
55
+ end
56
+ ##
57
+ # returns the installation date of the given package
58
+ def get_installdate(name)
59
+ create_time = Time.at(File.stat(@@pkginfo + "/#{name}.list")).ctime.utc
60
+ return create_time
61
+ end
62
+ ##
63
+ # returns the following information for a given package name as a hash
64
+ #
65
+ # - version
66
+ # - architecture
67
+ # - maintainer
68
+ # - description
69
+ # - status
70
+ def get_all(name)
71
+ results = `#{@@dpkgquery} -W -f='${Version}|||${Architecture}|||${Maintainer}|||${Description}|||${Status}' #{name}`.split('|||')
72
+
73
+ # return results as an array and map
74
+ hresults = {'name' => name, 'version' => results[0],
75
+ 'architecture' => results[1], 'maintainer' => results[2],
76
+ 'description' => results[3], 'status' => results[4]}
77
+
78
+ return hresults
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,77 @@
1
+ module Informo
2
+ ##
3
+ # This class is used to return various physical memory related information. For
4
+ # example: how many modules are installed, module size, etc
5
+ #
6
+ # For virtualized systems some of these might not be applicable
7
+ class Memory
8
+ ##
9
+ # returns the maximum size for memory modules
10
+ def max_module_size
11
+ `dmidecode -t 5`.each_line do |line|
12
+ if line =~ /Maximum Memory Module Size.+?(\d+)\s+/
13
+ max_module_size = $1
14
+ return max_module_size
15
+ end
16
+ end
17
+ end
18
+ ##
19
+ # returns the maximum amount of memory slots.
20
+ def max_modules
21
+ `dmidecode -t 5`.each_line do |line|
22
+ if line =~ /Associated Memory Slots.+?(\d+)\s+/
23
+ max_modules = $1
24
+ return max_modules
25
+ end
26
+ end
27
+ end
28
+ ##
29
+ # returns the maximum amount of memory supported by the bios/system
30
+ def max_capacity
31
+ `dmidecode -t 5`.each_line do |line|
32
+ if line =~ /Maximum Total Memory Size.+?(\d+)\s+/
33
+ max_capacity = $1
34
+ return max_capacity
35
+ end
36
+ end
37
+ end
38
+ ##
39
+ # returns the amount of physical memory installed
40
+ def installed
41
+ `free -m`.each_line do |line|
42
+ if line =~ /^Mem.+?(\d+)\s+/
43
+ installed_memory = $1
44
+ return installed_memory
45
+ end
46
+ end
47
+ end
48
+
49
+ ##
50
+ # returns details for memory installed in each memory slot
51
+ #
52
+ # - size
53
+ # - location on board
54
+ # - speed
55
+ # - form factor
56
+ def slots
57
+ count = -1
58
+ modules = Array.new
59
+
60
+ `dmidecode -t 17`.each_line do |line|
61
+ if line =~ /\cI(Array Handle|Size|Locator|Speed|Form Factor):\s*(.*)$/
62
+ key, value = $1, $2
63
+ if key =~ /Array Handle/
64
+ count += 1
65
+ modules[count] = Hash.new
66
+ else
67
+ key = "type" if key =~ /Form Factor/
68
+ modules[count][key.downcase] = value
69
+ end
70
+ end
71
+ end
72
+
73
+ return modules
74
+ end
75
+
76
+ end
77
+ end
@@ -0,0 +1,73 @@
1
+ module Informo
2
+ ##
3
+ # This class is used to provide information about the network configuration of the system
4
+ # and physical networking hardware available to the system.
5
+ class Network
6
+ ##
7
+ # returns an array of available network interfaces
8
+ def interfaces
9
+ interfaces = Array.new
10
+ if File.exists?("/sbin/ip")
11
+ `ip a`.each_line do |line|
12
+ interfaces.push($1) if line =~ /scope.+?\s(\w+\d+(:.+?)?)$/
13
+ end
14
+ else
15
+ `ifconfig -a`.each_line do |line|
16
+ interfaces.push($1) if line =~ /^(\w+\d+(:.+?)?)\s+Link/
17
+ end
18
+ end
19
+
20
+ return interfaces
21
+ end
22
+ ##
23
+ # returns hash of the following info for a given network interface
24
+ #
25
+ # - ip address
26
+ # - subnet mask
27
+ # - broadcast address
28
+ # - mtu
29
+ def interface_details(dev)
30
+ details = Hash.new
31
+ details["ip6"] = Array.new
32
+ count = -1
33
+
34
+ if File.exists?("/sbin/ip")
35
+ `ip addr show #{dev}`.each_line do |line|
36
+ details["mtu"] = $1 if line =~ /mtu (\d+)/
37
+
38
+ if line =~ /inet\s(\d+\.\d+\.\d+\.\d+)\/(\d+)\s+brd\s(\d+\.\d+\.\d+\.\d+)\sscope.+#{dev}$/
39
+ details["ipaddr"],details["prefix"],details["broadcast"] = $1, $2, $3
40
+ end
41
+
42
+ if dev != /:/
43
+ if line =~ /inet6\s(.+?)\/(\d+)\sscope/
44
+ count += 1
45
+ details["ip6"][count] = Hash.new
46
+ details["ip6"][count]["ipaddr"],details["ip6"][count]["prefix"] = $1, $2
47
+ end
48
+ end
49
+ end
50
+ else
51
+ `ifconfig #{dev}`.each_line do |line|
52
+ end
53
+ end
54
+
55
+ return details
56
+ end
57
+ ##
58
+ # returns an array of installed HBAs
59
+ def host_bus_adapters
60
+ list = Array.new
61
+
62
+ `lspci`.each_line do |line|
63
+ if line =~ /fib|hba/i
64
+
65
+ list.push($1) if line =~ /.+?:\s+(.+)/
66
+ end
67
+ end
68
+
69
+ return list
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,45 @@
1
+ module Informo
2
+ ##
3
+ # This class is used to retrieve information about the processors available
4
+ # to the system.
5
+ class Processor
6
+ ##
7
+ # returns the total number of processors on the system
8
+ def count
9
+ total = 0
10
+ File.open("/proc/cpuinfo").each_line do |line|
11
+ total += 1 if line =~ /^processor/
12
+ end
13
+
14
+ return total
15
+ end
16
+ ##
17
+ # returns the details of the processor(s) as an array with the following
18
+ # information
19
+ #
20
+ # - vendor (amd, intel, etc)
21
+ # - model (xeon, k9, etc)
22
+ # - speed (2000 Mhz, etc)
23
+ # - cache size (512k, etc)
24
+ def details
25
+ count = -1
26
+ processors = Array.new
27
+
28
+ File.open("/proc/cpuinfo").each_line do |line|
29
+
30
+ if line =~ /(processor|vendor_id|model name|cpu MHz|cache size)\s+:\s+(.+)/
31
+ key, value = $1, $2
32
+ if key =~ /processor/
33
+ count += 1
34
+ processors[count] = Hash.new
35
+ else
36
+ key = key.gsub(/\s+/,"_")
37
+ processors[count][key] = value
38
+ end
39
+ end
40
+ end
41
+
42
+ return processors
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,85 @@
1
+ require 'time'
2
+
3
+ module Informo
4
+ ##
5
+ # This class is used to get information about installed RPMs
6
+ class Rpm
7
+ def initialize()
8
+ @@rpmquery = "rpm"
9
+ end
10
+ ##
11
+ # returns an array of installed package names
12
+ def get_packages
13
+ packages = Array.new
14
+ packages = `#{@@rpmquery} -qa --qf='%{NAME}\n'`.split("\n")
15
+ return packages
16
+ end
17
+ ##
18
+ # returns the version of the given package
19
+ def get_version(name)
20
+ package_version = `#{@@rpmquery} -q --qf='%{VERSION}' #{name}`
21
+ return package_version
22
+ end
23
+ ##
24
+ # returns the release of the given package
25
+ def get_release(name)
26
+ package_release = `#{@@rpmquery} -q --qf='%{RELEASE}' #{name}`
27
+ return package_release
28
+ end
29
+ ##
30
+ # returns the architecture of the given package
31
+ def get_architecture(name)
32
+ package_architecture = `#{@@rpmquery} -q --qf='%{ARCH}' #{name}`
33
+ return package_architecture
34
+ end
35
+ ##
36
+ # returns the maintainer of the given package
37
+ def get_maintainer(name)
38
+ package_maintainer = `#{@@rpmquery} -q --qf='%{VENDOR}' #{name}`
39
+ return package_maintainer
40
+ end
41
+ ##
42
+ # returns the +short+ description (ie: rpm summary field) of the given package
43
+ def get_short_description(name)
44
+ package_description = `#{@@rpmquery} -q --qf='%{SUMMARY}' #{name}`.split("\n")
45
+ return package_description[0]
46
+ end
47
+ ##
48
+ # returns the +full+ description of the given package
49
+ def get_description(name)
50
+ package_description = `#{@@rpmquery} -q --qf='%{DESCRIPTION}' #{name}`
51
+ return package_description
52
+ end
53
+ ##
54
+ # returns the installed date of the given package
55
+ def get_installdate(name)
56
+ package_status = Time.at(Time.parse(`#{@@rpmquery} -q --qf='%{INSTALLTIME:date}' #{name}`)).utc
57
+ return package_status
58
+ end
59
+ ##
60
+ # returns the status of the installed package (ie. nothing for RPM), kind of a placeholder I guess...
61
+ def get_status(name)
62
+ return
63
+ end
64
+ ##
65
+ # returns a hash of details for the given package
66
+ #
67
+ # - version
68
+ # - release
69
+ # - architecture
70
+ # - maintainer
71
+ # - summary
72
+ # - description
73
+ # - install date
74
+ def get_all(name)
75
+ results = `#{@@rpmquery} -q --queryformat "%{VERSION}|||%{RELEASE}|||%{ARCH}|||%{VENDOR}|||%{SUMMARY}|||%{DESCRIPTION}|||%{INSTALLTIME:date}" #{name}`.split('|||')
76
+
77
+ # return results as an array and map
78
+ hresults = {'name' => name, 'version' => results[0], 'release' => results[1],
79
+ 'architecture' => results[2], 'maintainer' => results[3], 'summary' => results[4],
80
+ 'description' => results[5], 'installdate' => results[6]}
81
+
82
+ return hresults
83
+ end
84
+ end
85
+ end