ServState 0.0.2 → 0.1.0

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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -4
  3. data/.travis.yml +13 -0
  4. data/README.md +9 -0
  5. data/ServState.gemspec +5 -2
  6. data/bin/servstate +1 -55
  7. data/lib/ServState/application.rb +118 -0
  8. data/lib/ServState/cpu_usage.rb +36 -0
  9. data/lib/ServState/log_manager.rb +47 -0
  10. data/lib/ServState/network_usage.rb +48 -0
  11. data/lib/ServState/public/css/rickshaw.min.css +1 -0
  12. data/lib/ServState/public/css/style.css +28 -0
  13. data/lib/ServState/public/js/charts.js +89 -0
  14. data/lib/ServState/public/js/d3.layout.min.js +1 -0
  15. data/lib/ServState/public/js/d3.min.js +2 -0
  16. data/lib/ServState/public/js/{app.js → dashboard.js} +7 -19
  17. data/lib/ServState/public/js/jquery.js +6 -0
  18. data/lib/ServState/public/js/notification.js +11 -0
  19. data/lib/ServState/public/js/rickshaw.min.js +3 -0
  20. data/lib/ServState/rotator.rb +17 -0
  21. data/lib/ServState/services_manager.rb +42 -0
  22. data/lib/ServState/usage_manager.rb +121 -0
  23. data/lib/ServState/version.rb +1 -1
  24. data/lib/ServState/views/charts.erb +74 -0
  25. data/lib/ServState/views/error.erb +43 -0
  26. data/lib/ServState/views/index.erb +66 -48
  27. data/lib/ServState/views/login.erb +14 -15
  28. data/lib/ServState.rb +43 -2
  29. data/spec/charts_json_spec.rb +12 -0
  30. data/spec/dashboard_spec.rb +33 -0
  31. data/spec/spec_helper.rb +11 -0
  32. metadata +87 -27
  33. data/.rvmrc +0 -1
  34. data/lib/ServState/info.rb +0 -122
  35. data/lib/ServState/main.rb +0 -61
  36. data/lib/ServState/views/css/base.scss +0 -2
  37. data/lib/ServState/views/css/custom.scss +0 -20
  38. data/lib/ServState/views/css/style.scss +0 -2
@@ -1,25 +1,24 @@
1
1
  <!doctype html>
2
2
  <html>
3
3
  <head>
4
- <title><%=@name %> login</title>
5
- <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
6
- <script type="text/javascript" src="js/uikit.min.js"></script>
7
- <link rel="stylesheet" href="css/uikit.gradient.min.css">
4
+ <title><%=@name %> login</title>
5
+ <script type="text/javascript" src="js/jquery.js"></script>
6
+ <script type="text/javascript" src="js/uikit.min.js"></script>
7
+ <link rel="stylesheet" href="css/uikit.gradient.min.css">
8
8
 
9
- <!-- Custom includes -->
10
- <script type="text/javascript" src="js/app.js"></script>
11
- <link rel="stylesheet" href="style.css">
9
+ <!-- Custom includes -->
10
+ <link rel="stylesheet" href="css/style.css">
12
11
  </head>
13
12
  <body>
14
13
 
15
- <div class="login uk-panel uk-panel-box">
16
- <form class="uk-form" method="post">
17
- <legend>Login to ServState</legend>
18
- <fieldset>
19
- <input type="password" name="pass" class="uk-width-1-1 uk-form-large" placeholder="password">
20
- </fieldset>
21
- </form>
22
- </div>
14
+ <div class="login uk-panel uk-panel-box">
15
+ <form class="uk-form" method="post">
16
+ <legend>Login to ServState</legend>
17
+ <fieldset>
18
+ <input type="password" name="pass" class="uk-width-1-1 uk-form-large" placeholder="password">
19
+ </fieldset>
20
+ </form>
21
+ </div>
23
22
 
24
23
  </body>
25
24
  </html>
data/lib/ServState.rb CHANGED
@@ -1,6 +1,47 @@
1
+ require "rack"
2
+ require "slop"
1
3
  require_relative "ServState/version"
2
- require_relative "ServState/main"
4
+ require_relative "ServState/application"
3
5
 
4
6
  module ServState
5
- # Your code goes here...
7
+ def self.run!
8
+
9
+ options = Slop.parse(help: true) do
10
+ banner 'Usage: servstate [options]'
11
+ on 'pass=', 'Password to login.'
12
+ on 'port=', 'Set port.'
13
+ end
14
+
15
+ app_port = options.port? ? options[:port] : 8080
16
+ app_pass = options.pass? ? options[:pass] : nil
17
+ options.inspect
18
+
19
+ puts " ____ ____ _ _ "
20
+ puts "/ ___| ___ _ ____ __/ ___|| |_ __ _| |_ ___ "
21
+ puts "\\___ \\ / _ \\ '__\\ \\ / /\\___ \\| __/ _` | __/ _ \\"
22
+ puts " ___) | __/ | \\ V / ___) | || (_| | || __/"
23
+ puts "|____/ \\___|_| \\_/ |____/ \\__\\__,_|\\__\\___|"
24
+ puts "\nPORT: #{app_port}"
25
+ if(app_pass)
26
+ puts "PASSWORD: #{app_pass}"
27
+ else
28
+ puts "WITHOUT PASSWORD"
29
+ end
30
+ puts "\n"*3
31
+
32
+ #Rack::Handler::WEBrick.run(Application,{:Port => port, :Password => pass, :AccessLog => []})
33
+ Application.set_settings do
34
+ port app_port
35
+ password app_pass
36
+ end
37
+ Application.run!
38
+
39
+ end
40
+
41
+ def self.run &block
42
+ p block
43
+ Application.set_settings &block
44
+ Application.run!
45
+ end
46
+
6
47
  end
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'Charts json' do
4
+ it 'should has cpu information' do
5
+ visit '/charts/10min/renew.json'
6
+ expect(page).to have_content /.*cpu.*\:\[({.*},?)+\]/
7
+ end
8
+ it 'should has ram information' do
9
+ visit '/charts/10min/renew.json'
10
+ expect(page).to have_content /.*ram.*\:\[({.*},?)+\]/
11
+ end
12
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+ feature 'Dashboard' do
3
+
4
+ it 'should has uptime information' do
5
+ visit '/'
6
+ expect(page).to have_content /Uptime(\ )+[0-9]+\ days\ [0-9]+h\ [0-9]+m/
7
+ end
8
+
9
+ it 'should has cpu load information' do
10
+ visit '/'
11
+ expect(page).to have_content /CPU\ usage(\ )+[0-9]+/
12
+ end
13
+
14
+ it 'should has ram usage information' do
15
+ visit '/'
16
+ expect(page).to have_content /RAM\ used\ [0-9]+(\.[0-9]+)?Gb\ from\ [0-9]+(\.[0-9]+)?Gb\ total/
17
+ end
18
+
19
+ it 'should show swap usage' do
20
+ visit '/'
21
+ expect(page).to have_content /Swap\ used\ [0-9]+(\.[0-9]+)?Gb\ from\ [0-9](\.[0-9]+)?Gb\ total/
22
+ end
23
+
24
+ it 'should show network interfaces' do
25
+ visit '/'
26
+ expect(page).to have_content /[a-z]+[0-9][0-9\.]+(\ )/
27
+ end
28
+
29
+ it 'should show disks status' do
30
+ visit '/'
31
+ expect(page).to have_content /\/.*used\ [0-9\.]+Gb\ from\ [0-9\.]+Gb\ total/
32
+ end
33
+ end
@@ -0,0 +1,11 @@
1
+ require 'capybara/rspec'
2
+ require 'capybara-webkit'
3
+ require './lib/ServState'
4
+
5
+ ServState::Application.set_settings do
6
+ password nil
7
+ port 8080
8
+ end
9
+
10
+ Capybara.app = ServState::Application
11
+ Capybara.default_driver = :webkit
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ServState
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Sergienko
@@ -9,76 +9,118 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-11-26 00:00:00.000000000 Z
12
+ date: 2014-03-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sinatra
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ~>
18
+ - - "~>"
19
19
  - !ruby/object:Gem::Version
20
20
  version: '1.4'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ~>
25
+ - - "~>"
26
26
  - !ruby/object:Gem::Version
27
27
  version: '1.4'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rack
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - ~>
32
+ - - "~>"
33
33
  - !ruby/object:Gem::Version
34
34
  version: '1.5'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - ~>
39
+ - - "~>"
40
40
  - !ruby/object:Gem::Version
41
41
  version: '1.5'
42
42
  - !ruby/object:Gem::Dependency
43
- name: sass
43
+ name: slop
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - ~>
46
+ - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '3.2'
48
+ version: 3.5.0
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - ~>
53
+ - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '3.2'
55
+ version: 3.5.0
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: bundler
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - ~>
60
+ - - "~>"
61
61
  - !ruby/object:Gem::Version
62
62
  version: '1.3'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - ~>
67
+ - - "~>"
68
68
  - !ruby/object:Gem::Version
69
69
  version: '1.3'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rake
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
- - - '>='
74
+ - - ">="
75
75
  - !ruby/object:Gem::Version
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - '>='
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rspec
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: capybara
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: capybara-webkit
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
82
124
  - !ruby/object:Gem::Version
83
125
  version: '0'
84
126
  description: Simple tool to watch your linux server state
@@ -89,8 +131,8 @@ executables:
89
131
  extensions: []
90
132
  extra_rdoc_files: []
91
133
  files:
92
- - .gitignore
93
- - .rvmrc
134
+ - ".gitignore"
135
+ - ".travis.yml"
94
136
  - Gemfile
95
137
  - LICENSE.txt
96
138
  - README.md
@@ -98,21 +140,36 @@ files:
98
140
  - ServState.gemspec
99
141
  - bin/servstate
100
142
  - lib/ServState.rb
101
- - lib/ServState/info.rb
102
- - lib/ServState/main.rb
143
+ - lib/ServState/application.rb
144
+ - lib/ServState/cpu_usage.rb
145
+ - lib/ServState/log_manager.rb
146
+ - lib/ServState/network_usage.rb
147
+ - lib/ServState/public/css/rickshaw.min.css
148
+ - lib/ServState/public/css/style.css
103
149
  - lib/ServState/public/css/uikit.gradient.min.css
104
150
  - lib/ServState/public/fonts/FontAwesome.otf
105
151
  - lib/ServState/public/fonts/fontawesome-webfont.eot
106
152
  - lib/ServState/public/fonts/fontawesome-webfont.ttf
107
153
  - lib/ServState/public/fonts/fontawesome-webfont.woff
108
- - lib/ServState/public/js/app.js
154
+ - lib/ServState/public/js/charts.js
155
+ - lib/ServState/public/js/d3.layout.min.js
156
+ - lib/ServState/public/js/d3.min.js
157
+ - lib/ServState/public/js/dashboard.js
158
+ - lib/ServState/public/js/jquery.js
159
+ - lib/ServState/public/js/notification.js
160
+ - lib/ServState/public/js/rickshaw.min.js
109
161
  - lib/ServState/public/js/uikit.min.js
162
+ - lib/ServState/rotator.rb
163
+ - lib/ServState/services_manager.rb
164
+ - lib/ServState/usage_manager.rb
110
165
  - lib/ServState/version.rb
111
- - lib/ServState/views/css/base.scss
112
- - lib/ServState/views/css/custom.scss
113
- - lib/ServState/views/css/style.scss
166
+ - lib/ServState/views/charts.erb
167
+ - lib/ServState/views/error.erb
114
168
  - lib/ServState/views/index.erb
115
169
  - lib/ServState/views/login.erb
170
+ - spec/charts_json_spec.rb
171
+ - spec/dashboard_spec.rb
172
+ - spec/spec_helper.rb
116
173
  homepage: http://github.com/ololyay/ServState
117
174
  licenses:
118
175
  - MIT
@@ -123,18 +180,21 @@ require_paths:
123
180
  - lib
124
181
  required_ruby_version: !ruby/object:Gem::Requirement
125
182
  requirements:
126
- - - '>='
183
+ - - ">="
127
184
  - !ruby/object:Gem::Version
128
185
  version: '0'
129
186
  required_rubygems_version: !ruby/object:Gem::Requirement
130
187
  requirements:
131
- - - '>='
188
+ - - ">="
132
189
  - !ruby/object:Gem::Version
133
190
  version: '0'
134
191
  requirements: []
135
192
  rubyforge_project:
136
- rubygems_version: 2.1.4
193
+ rubygems_version: 2.2.2
137
194
  signing_key:
138
195
  specification_version: 4
139
196
  summary: http://github.com/ololyay/ServState
140
- test_files: []
197
+ test_files:
198
+ - spec/charts_json_spec.rb
199
+ - spec/dashboard_spec.rb
200
+ - spec/spec_helper.rb
data/.rvmrc DELETED
@@ -1 +0,0 @@
1
- rvm use 2.0.0@servstate --create
@@ -1,122 +0,0 @@
1
- class Info
2
- @@old_usage=0
3
- @@old_total_usage=0
4
- @@old_traffic=Hash.new
5
- @@old_time_for_traffic=Time.now
6
- @@cpu_stat_value=0
7
- @@traffic_speed_value=0
8
- def self.hostname
9
- `hostname`.chomp
10
- end
11
- #hash[interface name] => ipaddr as string
12
- def self.interfaces
13
- ifconfig=`ifconfig -a`
14
- ifconfig=ifconfig.lines.map do |line|
15
- line.chomp
16
- end
17
- key=''
18
- faces=Hash.new
19
- ifconfig.each do |line|
20
- unless line.start_with?' ' or line.start_with?'lo'
21
- key=line.split[0]
22
- end
23
- if line.include? 'inet addr:' and key
24
- faces[key]=line.split[1][5..-1]
25
- end
26
- end
27
- faces
28
- end
29
- # hash with fixnum values
30
- def self.uptime
31
- upt=Hash.new
32
- upt[:total_sec]=IO.read('/proc/uptime').split.first.to_i
33
- upt[:days]=upt[:total_sec]/86400
34
- upt[:hours]=(upt[:total_sec]-upt[:days]*86400)/3600
35
- upt[:minutes]=(upt[:total_sec]-upt[:days]*86400-upt[:hours]*3600)/60
36
- upt[:seconds]=upt[:total_sec]-upt[:days]*86400-upt[:hours]*3600-upt[:minutes]*60
37
- upt
38
- end
39
- # fixnum % of cpu load
40
- def self.cpu_stat
41
- if @@old_total_usage==0 # first call
42
- @@old_usage=IO.readlines('/proc/stat').grep(/^cpu /).first.split[1..3].collect{|i| i.to_i}.inject(:+)
43
- @@old_total_usage=IO.readlines('/proc/stat').grep(/^cpu /).first.split.collect{|i| i.to_i}.inject(:+)
44
- sleep 1
45
- end
46
- new_usage=IO.readlines('/proc/stat').grep(/^cpu /).first.split[1..3].collect{|i| i.to_i}.inject(:+)
47
- usage=new_usage-@@old_usage
48
-
49
- new_total_usage=IO.readlines('/proc/stat').grep(/^cpu /).first.split.collect{|i| i.to_i}.inject(:+)
50
- total_usage=new_total_usage-@@old_total_usage
51
-
52
- @@old_usage=new_usage
53
- @@old_total_usage=new_total_usage
54
-
55
- ((usage/total_usage.to_f)*100).to_i
56
- end
57
- # hash[mount point] => [usage %, total space in gb, used space in gb, free space in gb ]
58
- def self.disk_usage
59
- disk_usage=Hash.new
60
- df=`df`.lines.grep(/^\/dev/)
61
- df.each do |line|
62
- line=line.split
63
- name = line[5..-1].join(' ').chomp
64
- usage_per = line[4].chop.to_i
65
- total = (line[1].to_f/1048576).round 2
66
- used = (line[2].to_f/1048576).round 2
67
- available = (line[3].to_f/1048576).round 2
68
- disk_usage[name]=[usage_per,total,used,available]
69
- end
70
- disk_usage
71
- end
72
- def self.ram_usage
73
- usage=Hash.new
74
- ram=`free`.lines
75
- # [memory type]=[total, used] in Gb
76
- usage[:ram]=[(ram[1].split[1].to_f/1048576).round(2),(ram[2].split[2].to_f/1048576).round(2)]
77
- usage[:ram_per]=(100*(ram[2].split[2].to_f/1048576)/(ram[1].split[1].to_f/1048576)).round
78
- usage[:swap]=[(ram[3].split[1].to_f/1048576).round(2),(ram[3].split[2].to_f/1048576).round(2)]
79
- usage[:swap_per]=(100*(ram[3].split[2].to_f/1048576)/(ram[3].split[1].to_f/1048576)).round if ram[3].split[1].to_f!=0
80
- usage
81
- end
82
- def self.traffic_stat
83
- new_traffic=Hash.new
84
- lines=IO.readlines('/proc/net/dev').grep(/:/)
85
- lines.each do |line|
86
- line=line.split
87
- new_traffic[line[0].chop.to_sym]=[line[1].to_i,line[9].to_i] # [receive bytes, transmit bytes]
88
- end
89
- if @@old_traffic.size==0
90
- @@old_traffic=new_traffic
91
- end
92
- speeds=Hash.new
93
- time_diff=Time.new-@@old_time_for_traffic
94
- @@old_time_for_traffic=Time.new
95
- new_traffic.each do |interface,data|
96
- down=data[0]-@@old_traffic[interface][0]
97
- up=data[1]-@@old_traffic[interface][1]
98
- speeds[interface]=[(down/1024/128/time_diff).round(2),(up/1024/128/time_diff).round(2)]
99
- end
100
- @@old_traffic=new_traffic
101
- speeds
102
-
103
- end
104
-
105
- def self.update
106
- @@cpu_stat_value=self.cpu_stat # run different long-time operations in different threads
107
- Thread.new{
108
- @@traffic_speed_value=self.traffic_stat
109
- }
110
- # network will be here
111
- end
112
- # operations of getting cpu load or network load take a few seconds
113
- # we will calculate this values in another thread
114
- # and just return values by this functions
115
- def self.get_cpu_stat
116
- @@cpu_stat_value
117
- end
118
- def self.get_traffic_speed
119
- @@traffic_speed_value
120
- end
121
-
122
- end
@@ -1,61 +0,0 @@
1
-
2
- require 'sinatra/base'
3
- require 'json'
4
- require 'date'
5
- require 'sass'
6
-
7
- require_relative 'info'
8
- # require_relative 'controllers/assets'
9
- # require_relative 'controllers/home'
10
-
11
-
12
-
13
- class ServStateApp < Sinatra::Base
14
-
15
- enable :sessions
16
-
17
- get '/' do
18
- if session[:login] or not APP_OPTIONS[:password]
19
- @name=Info.hostname
20
- erb :index
21
- else
22
- redirect '/login'
23
- end
24
- end
25
-
26
- get("/style.css") do
27
- scss "css/style".to_sym
28
- end
29
- get '/renew.json' do
30
- if session[:login] or not APP_OPTIONS[:password]
31
- content_type :json
32
- { :cpu => Info.get_cpu_stat,
33
- :uptime => Info.uptime,
34
- :mem_usage => Info.ram_usage,
35
- :disks_usage => Info.disk_usage,
36
- :interfaces => Info.interfaces,
37
- :network => Info.get_traffic_speed }.to_json
38
- end
39
- end
40
-
41
- get '/login' do
42
- unless(APP_OPTIONS[:password])
43
- redirect '/'
44
- end
45
- session[:login]=false;
46
- @name=Info.hostname
47
- erb :login
48
- end
49
-
50
- post '/login' do
51
- unless(APP_OPTIONS[:password])
52
- redirect '/'
53
- end
54
- if(params[:pass])==APP_OPTIONS[:password]
55
- session[:login]=true;
56
- redirect '/'
57
- else
58
- redirect '/login'
59
- end
60
- end
61
- end
@@ -1,2 +0,0 @@
1
- $wrapperMinWidth: 480px;
2
- $wrapperMaxWidth: 960px;
@@ -1,20 +0,0 @@
1
- #wrapper {
2
- min-width: $wrapperMinWidth;
3
- max-width: $wrapperMaxWidth;
4
- margin: 0 auto;
5
- padding: 10px;
6
- }
7
- .uk-width-medium-1-2 {
8
- padding: 10px;
9
- }
10
- .uk-width-medium-1-4 {
11
- padding: 10px;
12
- }
13
- .uk-panel {
14
- margin-bottom: 10px;
15
- }
16
- .login {
17
- width: 200px;
18
- height: 100px;
19
- margin: 0 auto;
20
- }
@@ -1,2 +0,0 @@
1
- @import "base";
2
- @import "custom";