server_status 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/Gemfile.lock +1 -0
- data/VERSION +1 -1
- data/bin/statusd +26 -4
- data/lib/server_status/app.rb +6 -1
- data/lib/server_status/client.rb +2 -0
- data/public/js/status.js +90 -0
- data/views/index.slim +3 -30
- data/views/layout.slim +1 -0
- metadata +20 -3
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.1
|
data/bin/statusd
CHANGED
@@ -1,10 +1,32 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
if ARGV.length <
|
3
|
-
puts
|
2
|
+
if ARGV.length < 2
|
3
|
+
puts "usage: #{File.basename __FILE__} (run|start|stop) <path_to_config_file>"
|
4
4
|
exit 1
|
5
5
|
end
|
6
6
|
|
7
7
|
require 'server_status'
|
8
|
+
require 'daemons'
|
8
9
|
|
9
|
-
set_config ARGV[
|
10
|
-
|
10
|
+
set_config ARGV[1]
|
11
|
+
|
12
|
+
conf_name = File.expand_path ARGV[1]
|
13
|
+
pid_name = "#{File.basename __FILE__}.pid"
|
14
|
+
pid_path = pid_name
|
15
|
+
|
16
|
+
case ARGV[0]
|
17
|
+
when 'run'
|
18
|
+
ServerStatusApp.run!
|
19
|
+
when 'start'
|
20
|
+
Daemons.daemonize app_name: "#{File.basename __FILE__}"
|
21
|
+
ServerStatusApp.run!
|
22
|
+
when 'stop'
|
23
|
+
pid = 0
|
24
|
+
File.open("#{pid_path}", 'r') do |file|
|
25
|
+
pid = file.read.to_i
|
26
|
+
end
|
27
|
+
if pid != 0
|
28
|
+
Process.kill('SIGINT', pid)
|
29
|
+
end
|
30
|
+
else
|
31
|
+
puts "usage: #{File.basename __FILE__} (run|start|stop) <path_to_config_file>"
|
32
|
+
end
|
data/lib/server_status/app.rb
CHANGED
@@ -20,7 +20,12 @@ class ServerStatusApp < Sinatra::Base
|
|
20
20
|
end
|
21
21
|
|
22
22
|
get '/servers' do
|
23
|
-
|
23
|
+
result = []
|
24
|
+
ServerStatusConfig.servers.each do |k, v|
|
25
|
+
result.push({name: k, description: v[:description.to_s]})
|
26
|
+
end
|
27
|
+
|
28
|
+
result.to_json
|
24
29
|
end
|
25
30
|
|
26
31
|
get '/:server/status' do
|
data/lib/server_status/client.rb
CHANGED
data/public/js/status.js
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
(function ($) {
|
2
|
+
var ServerModel = Backbone.Model.extend({
|
3
|
+
url:function () {
|
4
|
+
return '/' + this.get('name') + '/status'
|
5
|
+
}
|
6
|
+
});
|
7
|
+
var ServerCollection = Backbone.Collection.extend({
|
8
|
+
model:ServerModel,
|
9
|
+
url:'/servers'
|
10
|
+
});
|
11
|
+
var ItemView = Backbone.View.extend({
|
12
|
+
tagName:'tr',
|
13
|
+
initialize:function () {
|
14
|
+
_.bindAll(this, 'render');
|
15
|
+
this.model.bind('change', this.render);
|
16
|
+
this.nameTemplate = _.template('<td class="center"><%= name %></td>');
|
17
|
+
this.descriptionTemplate = _.template('<td><%= description %></td>');
|
18
|
+
this.portTemplate = _.template('<td class="center"><i class="icon-<%= port %>"/></td>');
|
19
|
+
this.apiTemplate = _.template('<td class="center"><i class="icon-<%= api %>"/> <span class="label label-<%= label %>"><%= code %></span></td>')
|
20
|
+
this.template = _.template('<td class="center"><i class="icon-<%= api %>"/> <span class="label label-<%="></span></td>');
|
21
|
+
},
|
22
|
+
render:function () {
|
23
|
+
var nameMarkup = this.nameTemplate({name:this.model.get('name')});
|
24
|
+
var descriptionMarkup = this.descriptionTemplate({description:this.model.get('description')});
|
25
|
+
var portMarkup = '<td></td>';
|
26
|
+
var apiMarkup = '<td></td>';
|
27
|
+
if (this.model.has('is_open')) {
|
28
|
+
var isOpen = this.model.get('is_open');
|
29
|
+
portMarkup = this.portTemplate({port:isOpen ? 'ok' : 'remove'});
|
30
|
+
}
|
31
|
+
if (this.model.has('code')) {
|
32
|
+
var isLive = this.model.get('code') == 200;
|
33
|
+
apiMarkup = this.apiTemplate({api:isLive ? 'ok' : 'remove', code:this.model.get('code'), label:isLive ? 'success' : 'important'});
|
34
|
+
}
|
35
|
+
|
36
|
+
if (this.model.has('is_open') && this.model.has('code')) {
|
37
|
+
$(this.el).attr('class', isLive && isOpen ? 'success' : 'error');
|
38
|
+
}
|
39
|
+
$(this.el).html([nameMarkup, descriptionMarkup, portMarkup, apiMarkup].join());
|
40
|
+
return this;
|
41
|
+
},
|
42
|
+
update:function () {
|
43
|
+
this.model.fetch({success:this.render});
|
44
|
+
}
|
45
|
+
});
|
46
|
+
var CollectionView = Backbone.View.extend({
|
47
|
+
el:$('table.server tbody'),
|
48
|
+
initialize:function () {
|
49
|
+
_.bindAll(this, 'render', 'append');
|
50
|
+
this.fetched = false;
|
51
|
+
this.collection = new ServerCollection();
|
52
|
+
this.childViews = {};
|
53
|
+
this.collection.bind('add', this.append);
|
54
|
+
this.collection.bind('change', this.render);
|
55
|
+
this.collection.fetch({
|
56
|
+
success:_.bind(this.render, this)
|
57
|
+
});
|
58
|
+
},
|
59
|
+
render:function () {
|
60
|
+
var self = this;
|
61
|
+
this.collection.models.forEach(_.bind(function (item) {
|
62
|
+
var keys = _.keys(self.childViews);
|
63
|
+
if (!_.contains(keys, item.get('name'))) {
|
64
|
+
self.append(item);
|
65
|
+
}
|
66
|
+
}, self));
|
67
|
+
this.fetched = true;
|
68
|
+
},
|
69
|
+
append:function (item) {
|
70
|
+
var itemView = new ItemView({model:item});
|
71
|
+
$(this.el).append(itemView.render().el);
|
72
|
+
this.childViews[item.get('name')] = itemView;
|
73
|
+
},
|
74
|
+
update:function () {
|
75
|
+
if (!this.fetched) {
|
76
|
+
_.delay(_.bind(this.update, this), 300);
|
77
|
+
return;
|
78
|
+
}
|
79
|
+
this.collection.models.forEach(function (item) {
|
80
|
+
item.fetch();
|
81
|
+
});
|
82
|
+
}
|
83
|
+
});
|
84
|
+
|
85
|
+
var serverView = new CollectionView();
|
86
|
+
serverView.update();
|
87
|
+
setInterval(function () {
|
88
|
+
serverView.update();
|
89
|
+
}, 3000);
|
90
|
+
})(jQuery);
|
data/views/index.slim
CHANGED
@@ -1,34 +1,7 @@
|
|
1
|
-
table.table.table-striped
|
1
|
+
table.table.table-striped.server
|
2
2
|
thead
|
3
|
-
th.
|
4
|
-
th.
|
3
|
+
th.span2.center Name
|
4
|
+
th.span6.center Description
|
5
5
|
th.span2.center Connection
|
6
6
|
th.span2.center API Status
|
7
7
|
tbody
|
8
|
-
- for status in @server_status do
|
9
|
-
- if status.code.eql? 200
|
10
|
-
tr.success
|
11
|
-
td.center = status.name
|
12
|
-
td = status.description
|
13
|
-
td.center
|
14
|
-
- if status.is_open?
|
15
|
-
i.icon-ok
|
16
|
-
- else
|
17
|
-
i.icon-remove
|
18
|
-
td.center
|
19
|
-
i.icon-ok
|
20
|
-
= ' '
|
21
|
-
span.label.label-success = status.code
|
22
|
-
- else
|
23
|
-
tr.error
|
24
|
-
td.center = status.name
|
25
|
-
td = status.description
|
26
|
-
td.center
|
27
|
-
- if status.is_open?
|
28
|
-
i.icon-ok
|
29
|
-
- else
|
30
|
-
i.icon-remove
|
31
|
-
td.center
|
32
|
-
i.icon-remove
|
33
|
-
= ' '
|
34
|
-
span.label.label-important = status.code
|
data/views/layout.slim
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: server_status
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
@@ -91,6 +91,22 @@ dependencies:
|
|
91
91
|
- - ! '>='
|
92
92
|
- !ruby/object:Gem::Version
|
93
93
|
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: daemons
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :runtime
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
94
110
|
- !ruby/object:Gem::Dependency
|
95
111
|
name: rspec
|
96
112
|
requirement: !ruby/object:Gem::Requirement
|
@@ -204,6 +220,7 @@ files:
|
|
204
220
|
- public/js/bootstrap.js
|
205
221
|
- public/js/bootstrap.min.js
|
206
222
|
- public/js/jquery.min.js
|
223
|
+
- public/js/status.js
|
207
224
|
- public/js/underscore.min.js
|
208
225
|
- spec/sample.yml
|
209
226
|
- spec/server_status_spec.rb
|
@@ -225,7 +242,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
225
242
|
version: '0'
|
226
243
|
segments:
|
227
244
|
- 0
|
228
|
-
hash:
|
245
|
+
hash: 1518391760238564387
|
229
246
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
230
247
|
none: false
|
231
248
|
requirements:
|