sys_viewer 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,56 @@
1
+ # Compiled source #
2
+ ###################
3
+ *.com
4
+ *.class
5
+ *.dll
6
+ *.exe
7
+ *.o
8
+ *.so
9
+
10
+ # Packages #
11
+ ############
12
+ # it's better to unpack these files and commit the raw source
13
+ # git has its own built in compression methods
14
+ *.7z
15
+ *.dmg
16
+ *.gz
17
+ *.iso
18
+ *.jar
19
+ *.rar
20
+ *.tar
21
+ *.zip
22
+
23
+ # Logs and databases #
24
+ ######################
25
+ *.log
26
+ *.sql
27
+ *.sqlite
28
+ *.sqlite3
29
+
30
+ # OS generated files #
31
+ ######################
32
+ .DS_Store*
33
+ ehthumbs.db
34
+ Icon?
35
+ Thumbs.db
36
+
37
+ # IDE & Editors files #
38
+ #######################
39
+ *.swp
40
+ .idea
41
+ *.iml
42
+ .~*
43
+
44
+ # Ruby & Rails files #
45
+ ######################
46
+ Gemfile.lock
47
+ .bundle
48
+ tmp/*
49
+ log/*.log
50
+ pkg
51
+ *.gem
52
+ .sass-cache/
53
+ public/assets/
54
+ test/dummy/db/*.sqlite3
55
+ test/dummy/log/*.log
56
+ test/dummy/tmp/
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in sys_viewer.gemspec
4
+ gemspec
5
+
6
+ group :test do
7
+ gem 'test-unit'
8
+ end
data/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
2
+ Version 2, December 2004
3
+
4
+ Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
5
+
6
+ Everyone is permitted to copy and distribute verbatim or modified
7
+ copies of this license document, and changing it is allowed as long
8
+ as the name is changed.
9
+
10
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
11
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
12
+
13
+ 0. You just DO WHAT THE FUCK YOU WANT TO.
data/README.md ADDED
@@ -0,0 +1,53 @@
1
+ # SysViewer
2
+
3
+ Small library for viewing some system data. Nothing fancy, just created it to play around with some stuff.
4
+
5
+ # Install
6
+
7
+ $ gem install sys_viewer
8
+
9
+ # Usage
10
+ $ irb
11
+ &gt;&gt; require 'sys_viewer'
12
+
13
+ &gt;&gt; SysViewer.hostname
14
+
15
+ =&gt; "Skynet.local"
16
+
17
+ &gt;&gt; SysViewer.user
18
+
19
+ =&gt; "michael"
20
+
21
+ &gt;&gt; SysViewer.memory_info
22
+
23
+ =&gt; {:memtotal=>8192.0, :memused=>3715.296875, :memfree=>4476.703125, :swaptotal=>64.0, :swapused=>0.0, :swapfree=>64.0}
24
+
25
+ &gt;&gt; SysViewer.disk_usage
26
+
27
+ =&gt; {"/dev/disk0s2"=>{:total=>"596Gi", :used=>"149Gi", :free=>"447Gi", :percent=>"26%", :path=>"/"}, "devfs"=>{:total=>"109Ki", :used=>"109Ki", :free=>"0Bi", :percent=>"100%", :path=>"/dev"}, "map -hosts"=>{:total=>"0Bi", :used=>"0Bi", :free=>"0Bi", :percent=>"100%", :path=>"/net"}, "map auto_home"=>{:total=>"0Bi", :used=>"0Bi", :free=>"0Bi", :percent=>"100%", :path=>"/home"}}
28
+
29
+ &gt;&gt; SysViewer.uptime
30
+
31
+ =&gt; {:days=>0, :hours=>2, :minutes=>36, :seconds=>11}
32
+
33
+ &gt;&gt; SysViewer.load_average
34
+
35
+ =&gt; {:minute=>0.69, :five_minutes=>0.45, :fifteen_minutes=>0.39, :cores=>16}
36
+
37
+ &gt;&gt; SysViewer.cpu_utilization
38
+
39
+ =&gt; {:user=>1, :system=>1, :idle=>98}
40
+
41
+ &gt;&gt; SysViewer.network_traffic
42
+
43
+ =&gt; {"lo0"=>{:received=>0, :transmitted=>0}, "gif0"=>{:received=>0, :transmitted=>0}, "stf0"=>{:received=>0, :transmitted=>0}, "en0"=>{:received=>183, :transmitted=>233}, "en1"=>{:received=>0, :transmitted=>0}, "en2"=>{:received=>0, :transmitted=>0}, "fw0"=>{:received=>0, :transmitted=>0}, "en4"=>{:received=>0, :transmitted=>0}}
44
+
45
+ # Todo
46
+
47
+ - This only works on OS X
48
+ - Some exception handling would be nice
49
+
50
+ # Copyright
51
+
52
+ See LICENSE for details
53
+
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require "rake/testtask"
4
+ Rake::TestTask.new(:test) do |test|
5
+ test.libs << 'lib' << 'test'
6
+ test.pattern = 'test/**/test_*.rb'
7
+ test.verbose = true
8
+ end
9
+ task :default => :test
@@ -0,0 +1,117 @@
1
+ module SysViewer
2
+ module Osx
3
+
4
+ def memory_info
5
+ memory = { memtotal: 0, memused: 0, memfree: 0, swaptotal: 0, swapused: 0, swapfree: 0 }
6
+
7
+ stdin, stdout, stderr = Open3.popen3('sysctl', '-n', 'hw.memsize')
8
+ memory[:memtotal] = stdout.gets.to_f / 1048576
9
+
10
+ stdin, stdout, stderr = Open3.popen3('vm_stat')
11
+ vm_lines = stdout.readlines
12
+ vm_lines.pop # remove footer
13
+ vm_lines.shift # remove header
14
+
15
+ vm_stats = {}
16
+ vm_lines.each do |line|
17
+ element = line.split(/:[\s]+/)
18
+ vm_stats[element[0]] = element[1].gsub!(/.[\n]+/, '').to_f * 4096
19
+ end
20
+ memory[:memfree] = vm_stats['Pages free'] / 1048576 + vm_stats['Pages speculative'] / 1048576
21
+ memory[:memused] = memory[:memtotal] - memory[:memfree]
22
+
23
+ stdin, stdout, stderr = Open3.popen3('sysctl', '-n', 'vm.swapusage')
24
+ swap_info = stdout.gets.split(/[\s]+/)
25
+
26
+ memory[:swaptotal] = swap_info[2].gsub('M', '').to_f
27
+ memory[:swapused] = swap_info[5].gsub('M', '').to_f
28
+ memory[:swapfree] = swap_info[8].gsub('M', '').to_f
29
+
30
+ memory
31
+ end
32
+
33
+ def disk_usage
34
+ stdin, stdout, stderr = Open3.popen3('df', '-h')
35
+ volumes = stdout.readlines
36
+ volumes.shift # remove header
37
+
38
+ data = {}
39
+
40
+ volumes.each do |volume|
41
+ columns = { total: '', used: '', free: '', percent: '', path: '' }
42
+ line = volume.split(/[ ]{2,}/, 6)
43
+
44
+ columns[:total] = line[1]
45
+ columns[:used] = line[2]
46
+ columns[:free] = line[3]
47
+ columns[:percent] = line[4]
48
+ columns[:path] = line[5].gsub(/[\n]+/,'')
49
+
50
+ data[line[0]] = columns
51
+ end
52
+
53
+ data
54
+ end
55
+
56
+ def uptime
57
+ stdin, stdout, stderr = Open3.popen3('sysctl', 'kern.boottime')
58
+
59
+ uptime = stdout.gets.scan(/sec = \d+/)[0].split('=')[1].strip.to_f
60
+ uptime = Time.now.to_i - uptime
61
+
62
+ minute = 60
63
+ hour = minute * 60
64
+ day = hour * 24
65
+
66
+ days = (uptime / day).to_i
67
+ hours = ((uptime % day) / hour).to_i
68
+ minutes = ((uptime % hour) / minute).to_i
69
+ seconds = (uptime % minute).to_i
70
+
71
+ { days: days, hours: hours, minutes: minutes, seconds: seconds }
72
+ end
73
+
74
+ def load_average
75
+ stdin, stdout, stderr = Open3.popen3('sysctl', 'vm.loadavg')
76
+
77
+ loadavg = { minute: 0, five_minutes: 0, fifteen_minutes: 0, cores: 0 }
78
+ loadavg[:minute], loadavg[:five_minutes], loadavg[:fifteen_minutes] = stdout.gets.scan(/\d+.\d+/).map { |value| value.to_f }
79
+
80
+ stdin, stdout, stderr = Open3.popen3('sysctl', '-n', 'hw.logicalcpu')
81
+
82
+ loadavg[:cores] = stdout.gets.to_i
83
+ loadavg
84
+ end
85
+
86
+ def cpu_utilization
87
+ stdin, stdout, stderr = Open3.popen3('iostat')
88
+
89
+ lines = stdout.readlines
90
+ values = lines[2].split
91
+
92
+ { user: values[3].to_i, system: values[4].to_i, idle: values[5].to_i }
93
+ end
94
+
95
+ def network_traffic
96
+ stdin, stdout, stderr = Open3.popen3('sar', '-n', 'DEV', '1', '1')
97
+
98
+ data = stdout.readlines
99
+ 4.times { data.shift } # remove first 4 lines
100
+
101
+ network_data = {}
102
+ data.each do |line|
103
+ if line.start_with?("Average")
104
+ values = line.split
105
+ # Ipkts/s - Packets received per second
106
+ # Ibytes/s - Bytes received per second
107
+ # Opkts/s - Packets transmitted per second
108
+ # Obytes/s - Bytes tranmitted per second
109
+ network_data[values[1]] = { received: values[3].to_i, transmitted: values[5].to_i}
110
+ end
111
+ end
112
+
113
+ network_data
114
+ end
115
+
116
+ end
117
+ end
@@ -0,0 +1,3 @@
1
+ module SysViewer
2
+ VERSION = "0.0.1"
3
+ end
data/lib/sys_viewer.rb ADDED
@@ -0,0 +1,23 @@
1
+ require 'socket'
2
+ require 'open3'
3
+ require 'sys_viewer/version'
4
+ require 'sys_viewer/osx'
5
+
6
+ module SysViewer
7
+ class << self
8
+
9
+ case RUBY_PLATFORM
10
+ when /darwin/
11
+ include SysViewer::Osx
12
+ else raise "Platform not yet supported"
13
+ end
14
+
15
+ def hostname
16
+ Socket.gethostname
17
+ end
18
+
19
+ def user
20
+ ENV['USER']
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "sys_viewer/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "sys_viewer"
7
+ s.version = SysViewer::VERSION
8
+ s.authors = ["Michaël Rigart"]
9
+ s.email = ["michael@netronix.be"]
10
+ s.homepage = ""
11
+ s.summary = %q{View system information}
12
+ s.description = %q{View system information}
13
+
14
+ s.rubyforge_project = "sys_viewer"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ # s.add_development_dependency "rspec"
23
+ # s.add_runtime_dependency "rest-client"
24
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'bundler'
2
+
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+
12
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
13
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
14
+ require 'sys_viewer'
15
+
16
+ class Test::Unit::TestCase
17
+ end
@@ -0,0 +1,136 @@
1
+ require 'helper'
2
+
3
+ class TestSysViewer < Test::Unit::TestCase
4
+
5
+ test "OS specific inclusion" do
6
+ case RUBY_PLATFORM
7
+ when /darwin/
8
+ SysViewer.include?(SysViewer::Osx)
9
+ end
10
+ end
11
+
12
+ test "hostname" do
13
+ assert SysViewer.hostname.kind_of?(String)
14
+ end
15
+
16
+ test "user" do
17
+ assert SysViewer.user.kind_of?(String)
18
+ end
19
+
20
+ test "memory_info exists" do
21
+ assert_respond_to SysViewer, :memory_info
22
+ end
23
+
24
+ test "memory info" do
25
+ response = SysViewer.memory_info
26
+
27
+ assert response.kind_of?(Hash)
28
+
29
+ assert response.has_key?(:memtotal)
30
+ assert response.has_key?(:memused)
31
+ assert response.has_key?(:memfree)
32
+ assert response.has_key?(:swaptotal)
33
+ assert response.has_key?(:swapused)
34
+ assert response.has_key?(:swapfree)
35
+
36
+ response.each { |key, value| assert value.kind_of?(Float) }
37
+ end
38
+
39
+ test "disk_usage exists" do
40
+ assert_respond_to SysViewer, :disk_usage
41
+ end
42
+
43
+ test "disk_usage" do
44
+ response = SysViewer.disk_usage
45
+
46
+ assert response.kind_of?(Hash)
47
+
48
+ response.each do | key, value |
49
+ assert key.kind_of?(String)
50
+ assert value.has_key?(:total)
51
+ assert value[:total].kind_of?(String)
52
+ assert value.has_key?(:used)
53
+ assert value[:used].kind_of?(String)
54
+ assert value.has_key?(:free)
55
+ assert value[:free].kind_of?(String)
56
+ assert value.has_key?(:percent)
57
+ assert value[:percent].kind_of?(String)
58
+ assert value.has_key?(:path)
59
+ assert value[:path].kind_of?(String)
60
+ end
61
+ end
62
+
63
+ test "uptime exists" do
64
+ assert_respond_to SysViewer, :uptime
65
+ end
66
+
67
+ test "uptime" do
68
+ response = SysViewer.uptime
69
+
70
+ assert response.kind_of?(Hash)
71
+
72
+ assert response.has_key?(:days)
73
+ assert response[:days].kind_of?(Integer)
74
+ assert response.has_key?(:hours)
75
+ assert response[:hours].kind_of?(Integer)
76
+ assert response.has_key?(:minutes)
77
+ assert response[:minutes].kind_of?(Integer)
78
+ assert response.has_key?(:seconds)
79
+ assert response[:seconds].kind_of?(Integer)
80
+ end
81
+
82
+ test "load_average exists" do
83
+ assert_respond_to SysViewer, :load_average
84
+ end
85
+
86
+ test "load_average" do
87
+ response = SysViewer.load_average
88
+
89
+ assert response.kind_of?(Hash)
90
+
91
+ assert response.has_key?(:minute)
92
+ assert response[:minute].kind_of?(Float)
93
+ assert response.has_key?(:five_minutes)
94
+ assert response[:five_minutes].kind_of?(Float)
95
+ assert response.has_key?(:fifteen_minutes)
96
+ assert response[:fifteen_minutes].kind_of?(Float)
97
+ assert response.has_key?(:cores)
98
+ assert response[:cores].kind_of?(Integer)
99
+ end
100
+
101
+ test "cpu_utilization exists" do
102
+ assert_respond_to SysViewer, :cpu_utilization
103
+ end
104
+
105
+ test "cpu_utilization" do
106
+ response = SysViewer.cpu_utilization
107
+
108
+ assert response.kind_of?(Hash)
109
+
110
+ assert response.has_key?(:user)
111
+ assert response[:user].kind_of?(Integer)
112
+ assert response.has_key?(:system)
113
+ assert response[:system].kind_of?(Integer)
114
+ assert response.has_key?(:idle)
115
+ assert response[:idle].kind_of?(Integer)
116
+ end
117
+
118
+ test "network_traffic exists" do
119
+ assert_respond_to SysViewer, :network_traffic
120
+ end
121
+
122
+ test "network_traffic" do
123
+ response = SysViewer.network_traffic
124
+
125
+ assert response.kind_of?(Hash)
126
+
127
+ response.each do | key, value |
128
+ assert key.kind_of?(String)
129
+ assert value.has_key?(:received)
130
+ assert value[:received].kind_of?(Integer)
131
+ assert value.has_key?(:transmitted)
132
+ assert value[:transmitted].kind_of?(Integer)
133
+ end
134
+ end
135
+
136
+ end
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sys_viewer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Michaël Rigart
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-05-06 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: View system information
15
+ email:
16
+ - michael@netronix.be
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - .gitignore
22
+ - Gemfile
23
+ - LICENSE
24
+ - README.md
25
+ - Rakefile
26
+ - lib/sys_viewer.rb
27
+ - lib/sys_viewer/osx.rb
28
+ - lib/sys_viewer/version.rb
29
+ - sys_viewer.gemspec
30
+ - test/helper.rb
31
+ - test/test_sys_viewer.rb
32
+ homepage: ''
33
+ licenses: []
34
+ post_install_message:
35
+ rdoc_options: []
36
+ require_paths:
37
+ - lib
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ requirements: []
51
+ rubyforge_project: sys_viewer
52
+ rubygems_version: 1.8.23
53
+ signing_key:
54
+ specification_version: 3
55
+ summary: View system information
56
+ test_files:
57
+ - test/helper.rb
58
+ - test/test_sys_viewer.rb