sys_viewer 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +56 -0
- data/Gemfile +8 -0
- data/LICENSE +13 -0
- data/README.md +53 -0
- data/Rakefile +9 -0
- data/lib/sys_viewer/osx.rb +117 -0
- data/lib/sys_viewer/version.rb +3 -0
- data/lib/sys_viewer.rb +23 -0
- data/sys_viewer.gemspec +24 -0
- data/test/helper.rb +17 -0
- data/test/test_sys_viewer.rb +136 -0
- metadata +58 -0
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
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
|
+
>> require 'sys_viewer'
|
12
|
+
|
13
|
+
>> SysViewer.hostname
|
14
|
+
|
15
|
+
=> "Skynet.local"
|
16
|
+
|
17
|
+
>> SysViewer.user
|
18
|
+
|
19
|
+
=> "michael"
|
20
|
+
|
21
|
+
>> SysViewer.memory_info
|
22
|
+
|
23
|
+
=> {:memtotal=>8192.0, :memused=>3715.296875, :memfree=>4476.703125, :swaptotal=>64.0, :swapused=>0.0, :swapfree=>64.0}
|
24
|
+
|
25
|
+
>> SysViewer.disk_usage
|
26
|
+
|
27
|
+
=> {"/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
|
+
>> SysViewer.uptime
|
30
|
+
|
31
|
+
=> {:days=>0, :hours=>2, :minutes=>36, :seconds=>11}
|
32
|
+
|
33
|
+
>> SysViewer.load_average
|
34
|
+
|
35
|
+
=> {:minute=>0.69, :five_minutes=>0.45, :fifteen_minutes=>0.39, :cores=>16}
|
36
|
+
|
37
|
+
>> SysViewer.cpu_utilization
|
38
|
+
|
39
|
+
=> {:user=>1, :system=>1, :idle=>98}
|
40
|
+
|
41
|
+
>> SysViewer.network_traffic
|
42
|
+
|
43
|
+
=> {"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,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
|
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
|
data/sys_viewer.gemspec
ADDED
@@ -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
|