sys_viewer 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|