ServState 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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";