hq-log-monitor-server 0.7.0 → 0.8.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.
- data/features/support/steps.rb +1 -1
- data/features/support/time.rb +21 -0
- data/lib/hq/log-monitor-server/do-checks.rb +172 -68
- data/lib/hq/log-monitor-server/overview-page.rb +8 -3
- data/lib/hq/log-monitor-server/script.rb +2 -18
- data/lib/hq/log-monitor-server/service-host-page.rb +51 -3
- data/lib/hq/log-monitor-server/service-page.rb +8 -0
- data/spec/hq/log-monitor-server/misc-spec.rb +14 -60
- metadata +63 -33
- checksums.yaml +0 -7
data/features/support/steps.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
# time manipulation which doesn't break background threads
|
2
|
+
|
3
|
+
Before do
|
4
|
+
|
5
|
+
original_now = Time.method(:now)
|
6
|
+
|
7
|
+
@set_time = nil
|
8
|
+
|
9
|
+
Time.stub(:now) do
|
10
|
+
if @set_time
|
11
|
+
@set_time
|
12
|
+
else
|
13
|
+
original_now.call
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def set_time new_time
|
20
|
+
@set_time = new_time
|
21
|
+
end
|
@@ -3,103 +3,207 @@ module LogMonitorServer
|
|
3
3
|
|
4
4
|
class Script
|
5
5
|
|
6
|
+
CHECK_FREQUENCY = 60
|
7
|
+
|
8
|
+
def background
|
9
|
+
|
10
|
+
@mutex = Mutex.new
|
11
|
+
@run_now_signal = ConditionVariable.new
|
12
|
+
@next_check_done_signal = nil
|
13
|
+
@current_check_done_signal = nil
|
14
|
+
@stop_checks_signal = nil
|
15
|
+
|
16
|
+
@next_check = Time.now
|
17
|
+
|
18
|
+
loop do
|
19
|
+
|
20
|
+
# wait till next invocation
|
21
|
+
|
22
|
+
@mutex.synchronize do
|
23
|
+
|
24
|
+
until @next_check_done_signal
|
25
|
+
|
26
|
+
if @next_check < Time.now
|
27
|
+
@next_check_done_signal = ConditionVariable.new
|
28
|
+
break
|
29
|
+
end
|
30
|
+
|
31
|
+
@run_now_signal.wait @mutex, 1
|
32
|
+
|
33
|
+
if @stop_checks_signal
|
34
|
+
@stop_checks_signal.broadcast
|
35
|
+
return
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
@current_check_done_signal = @next_check_done_signal
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
# perform the checks
|
45
|
+
|
46
|
+
begin
|
47
|
+
do_checks_real
|
48
|
+
rescue => e
|
49
|
+
$stderr.puts e, *e.backtrace
|
50
|
+
sleep 10
|
51
|
+
ensure
|
52
|
+
|
53
|
+
# notify waiting threads
|
54
|
+
|
55
|
+
@mutex.synchronize do
|
56
|
+
|
57
|
+
if @next_check_done_signal == @current_check_done_signal
|
58
|
+
@next_check_done_signal = nil
|
59
|
+
end
|
60
|
+
|
61
|
+
@current_check_done_signal.broadcast
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
@next_check = Time.now + CHECK_FREQUENCY
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
def stop_checks
|
74
|
+
|
75
|
+
@mutex.synchronize do
|
76
|
+
|
77
|
+
unless @stop_checks_signal
|
78
|
+
@stop_checks_signal = ConditionVariable.new
|
79
|
+
end
|
80
|
+
|
81
|
+
@run_now_signal.signal
|
82
|
+
|
83
|
+
@stop_checks_signal.wait @mutex
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
6
89
|
def do_checks
|
90
|
+
|
7
91
|
@mutex.synchronize do
|
8
92
|
|
9
|
-
|
10
|
-
|command_io|
|
93
|
+
if @next_check_done_signal
|
11
94
|
|
12
|
-
|
13
|
-
get_summaries_by_service
|
95
|
+
# next run already scheduled, just wait for it
|
14
96
|
|
15
|
-
@
|
16
|
-
|service_elem|
|
97
|
+
@next_check_done_signal.wait @mutex
|
17
98
|
|
18
|
-
|
99
|
+
else
|
19
100
|
|
20
|
-
|
21
|
-
warning_count = 0
|
22
|
-
unknown_count = 0
|
101
|
+
# create new next run and wait for it
|
23
102
|
|
24
|
-
|
25
|
-
summaries_by_service[service_name]
|
103
|
+
@next_check_done_signal = ConditionVariable.new
|
26
104
|
|
27
|
-
|
28
|
-
summaries["types"].each do
|
29
|
-
|type_name, type_info|
|
105
|
+
@run_now_signal.signal
|
30
106
|
|
31
|
-
|
32
|
-
when "critical"
|
33
|
-
critical_count += type_info["new"]
|
34
|
-
when "warning"
|
35
|
-
warning_count += type_info["new"]
|
36
|
-
else
|
37
|
-
unknown_count += type_info["new"]
|
38
|
-
end
|
107
|
+
@next_check_done_signal.wait @mutex
|
39
108
|
|
40
|
-
|
41
|
-
end
|
109
|
+
end
|
42
110
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
elsif unknown_count > 0
|
49
|
-
3
|
50
|
-
else
|
51
|
-
0
|
52
|
-
end
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
def do_checks_real
|
53
116
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
117
|
+
File.open @icinga_elem["command-file"], "a" do
|
118
|
+
|command_io|
|
119
|
+
|
120
|
+
summaries_by_service =
|
121
|
+
get_summaries_by_service
|
122
|
+
|
123
|
+
@icinga_elem.find("service").each do
|
124
|
+
|service_elem|
|
125
|
+
|
126
|
+
service_name = service_elem["name"]
|
127
|
+
|
128
|
+
critical_count = 0
|
129
|
+
warning_count = 0
|
130
|
+
unknown_count = 0
|
131
|
+
|
132
|
+
summaries =
|
133
|
+
summaries_by_service[service_name]
|
134
|
+
|
135
|
+
if summaries
|
136
|
+
summaries["types"].each do
|
137
|
+
|type_name, type_info|
|
138
|
+
|
139
|
+
case level_for_type service_name, type_name
|
140
|
+
when "critical"
|
141
|
+
critical_count += type_info["new"]
|
142
|
+
when "warning"
|
143
|
+
warning_count += type_info["new"]
|
61
144
|
else
|
62
|
-
"
|
145
|
+
unknown_count += type_info["new"]
|
63
146
|
end
|
64
147
|
|
65
|
-
|
148
|
+
end
|
149
|
+
end
|
66
150
|
|
151
|
+
status_int =
|
67
152
|
if critical_count > 0
|
68
|
-
|
153
|
+
2
|
154
|
+
elsif warning_count > 0
|
155
|
+
1
|
156
|
+
elsif unknown_count > 0
|
157
|
+
3
|
158
|
+
else
|
159
|
+
0
|
69
160
|
end
|
70
161
|
|
71
|
-
|
72
|
-
|
162
|
+
status_str =
|
163
|
+
if critical_count > 0
|
164
|
+
"CRITICAL"
|
165
|
+
elsif warning_count > 0
|
166
|
+
"WARNING"
|
167
|
+
elsif unknown_count > 0
|
168
|
+
"UNKNOWN"
|
169
|
+
else
|
170
|
+
"OK"
|
73
171
|
end
|
74
172
|
|
75
|
-
|
76
|
-
parts << "%d unknown" % unknown_count
|
77
|
-
end
|
173
|
+
parts = []
|
78
174
|
|
79
|
-
|
80
|
-
|
81
|
-
|
175
|
+
if critical_count > 0
|
176
|
+
parts << "%d critical" % critical_count
|
177
|
+
end
|
82
178
|
|
179
|
+
if warning_count > 0
|
180
|
+
parts << "%d warning" % warning_count
|
181
|
+
end
|
83
182
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
"PROCESS_SERVICE_CHECK_RESULT",
|
88
|
-
service_elem["icinga-host"],
|
89
|
-
service_elem["icinga-service"],
|
90
|
-
status_int,
|
91
|
-
"%s %s" % [
|
92
|
-
status_str,
|
93
|
-
parts.join(", "),
|
94
|
-
]
|
95
|
-
].join(";"),
|
96
|
-
]
|
183
|
+
if unknown_count > 0
|
184
|
+
parts << "%d unknown" % unknown_count
|
185
|
+
end
|
97
186
|
|
187
|
+
if parts.empty?
|
188
|
+
parts << "no new events"
|
98
189
|
end
|
99
190
|
|
100
|
-
end
|
101
191
|
|
102
|
-
|
192
|
+
command_io.print "[%s] %s\n" % [
|
193
|
+
Time.now.to_i,
|
194
|
+
[
|
195
|
+
"PROCESS_SERVICE_CHECK_RESULT",
|
196
|
+
service_elem["icinga-host"],
|
197
|
+
service_elem["icinga-service"],
|
198
|
+
status_int,
|
199
|
+
"%s %s" % [
|
200
|
+
status_str,
|
201
|
+
parts.join(", "),
|
202
|
+
]
|
203
|
+
].join(";"),
|
204
|
+
]
|
205
|
+
|
206
|
+
end
|
103
207
|
|
104
208
|
end
|
105
209
|
|
@@ -8,6 +8,11 @@ class Script
|
|
8
8
|
summaries_by_service =
|
9
9
|
get_summaries_by_service
|
10
10
|
|
11
|
+
summaries =
|
12
|
+
summaries_by_service
|
13
|
+
.values
|
14
|
+
.sort_by { |summary| summary["_id"]["service"] }
|
15
|
+
|
11
16
|
headers = {}
|
12
17
|
html = []
|
13
18
|
|
@@ -57,7 +62,7 @@ class Script
|
|
57
62
|
esc_ht(title),
|
58
63
|
]
|
59
64
|
|
60
|
-
if
|
65
|
+
if summaries.empty?
|
61
66
|
html << "<p>No events have been logged</p>\n"
|
62
67
|
else
|
63
68
|
|
@@ -74,8 +79,8 @@ class Script
|
|
74
79
|
html << "</thead>\n"
|
75
80
|
html << "<tbody>\n"
|
76
81
|
|
77
|
-
|
78
|
-
|
|
82
|
+
summaries.each do
|
83
|
+
|summary|
|
79
84
|
|
80
85
|
html << "<tr class=\"%s\">\n" % [
|
81
86
|
esc_ht([
|
@@ -19,7 +19,6 @@ class Script
|
|
19
19
|
|
20
20
|
def initialize
|
21
21
|
@status = 0
|
22
|
-
@mutex = Mutex.new
|
23
22
|
end
|
24
23
|
|
25
24
|
def main
|
@@ -34,11 +33,12 @@ class Script
|
|
34
33
|
def start
|
35
34
|
setup
|
36
35
|
Thread.new { run }
|
37
|
-
Thread.new { background }
|
36
|
+
@background_thread = Thread.new { background }
|
38
37
|
end
|
39
38
|
|
40
39
|
def stop
|
41
40
|
@web_server.shutdown
|
41
|
+
stop_checks
|
42
42
|
end
|
43
43
|
|
44
44
|
def setup
|
@@ -52,22 +52,6 @@ class Script
|
|
52
52
|
@web_server.start
|
53
53
|
end
|
54
54
|
|
55
|
-
def background
|
56
|
-
|
57
|
-
@next_check = Time.now
|
58
|
-
|
59
|
-
loop do
|
60
|
-
sleep 1 while Time.now < @next_check
|
61
|
-
begin
|
62
|
-
do_checks
|
63
|
-
rescue => e
|
64
|
-
$stderr.puts e, *e.backtrace
|
65
|
-
sleep 10
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
end
|
70
|
-
|
71
55
|
def process_args
|
72
56
|
|
73
57
|
@opts, @args =
|
@@ -31,15 +31,27 @@ class Script
|
|
31
31
|
|
32
32
|
# read from database
|
33
33
|
|
34
|
-
|
34
|
+
all_events =
|
35
35
|
@db["events"]
|
36
36
|
.find({
|
37
37
|
"source.class" => source["class"],
|
38
38
|
"source.host" => source["host"],
|
39
39
|
"source.service" => source["service"],
|
40
40
|
})
|
41
|
+
.sort({
|
42
|
+
"timestamp" => -1,
|
43
|
+
})
|
41
44
|
.to_a
|
42
45
|
|
46
|
+
page_size = 100
|
47
|
+
page_num = req.GET["page"].to_i
|
48
|
+
|
49
|
+
page_start = page_num * page_size
|
50
|
+
page_end = page_start + page_size
|
51
|
+
page_count = (all_events.size + page_size - 1) / page_size
|
52
|
+
|
53
|
+
page_events = all_events[page_start...page_end] || []
|
54
|
+
|
43
55
|
title =
|
44
56
|
"%s %s \u2014 Log monitor" % [
|
45
57
|
context[:host],
|
@@ -103,13 +115,22 @@ class Script
|
|
103
115
|
esc_ht(title),
|
104
116
|
]
|
105
117
|
|
106
|
-
if
|
118
|
+
if all_events.size > page_size || page_num > 0
|
119
|
+
pagination html, page_count, page_num
|
120
|
+
end
|
121
|
+
|
122
|
+
if all_events.empty?
|
107
123
|
|
108
124
|
html << "<p>No events have been logged for this service on this " +
|
109
125
|
"host</p>\n"
|
110
126
|
|
127
|
+
elsif page_events.empty?
|
128
|
+
|
129
|
+
html << "<p>No events on this page</p>\n"
|
130
|
+
|
111
131
|
else
|
112
132
|
|
133
|
+
|
113
134
|
html << "<table id=\"events\" class=\"table table-striped\">\n"
|
114
135
|
html << "<thead>\n"
|
115
136
|
|
@@ -127,7 +148,7 @@ class Script
|
|
127
148
|
|
128
149
|
unseen_count = 0
|
129
150
|
|
130
|
-
|
151
|
+
page_events.each do
|
131
152
|
|event|
|
132
153
|
|
133
154
|
html << "<tr class=\"%s\">\n" % [
|
@@ -175,6 +196,10 @@ class Script
|
|
175
196
|
html << "</tbody>\n"
|
176
197
|
html << "</table>\n"
|
177
198
|
|
199
|
+
if all_events.size > page_size || page_num > 0
|
200
|
+
pagination html, page_count, page_num
|
201
|
+
end
|
202
|
+
|
178
203
|
html << "<form method=\"post\">\n"
|
179
204
|
|
180
205
|
html << "<p>\n"
|
@@ -212,6 +237,29 @@ class Script
|
|
212
237
|
|
213
238
|
end
|
214
239
|
|
240
|
+
def pagination html, page_count, page_num
|
241
|
+
|
242
|
+
html << "<div class=\"pagination\">\n"
|
243
|
+
html << "<ul>\n"
|
244
|
+
|
245
|
+
page_count.times do
|
246
|
+
|num|
|
247
|
+
|
248
|
+
if num == page_num
|
249
|
+
html << "<li class=\"active\">"
|
250
|
+
else
|
251
|
+
html << "<li>"
|
252
|
+
end
|
253
|
+
|
254
|
+
html << "<a href=\"?page=#{num}\">#{num+1}</a>\n"
|
255
|
+
|
256
|
+
end
|
257
|
+
|
258
|
+
html << "</ul>\n"
|
259
|
+
html << "</div>\n"
|
260
|
+
|
261
|
+
end
|
262
|
+
|
215
263
|
end
|
216
264
|
|
217
265
|
end
|
@@ -33,88 +33,42 @@ describe Script do
|
|
33
33
|
|
34
34
|
before do
|
35
35
|
require "xml"
|
36
|
-
end
|
37
|
-
|
38
|
-
it "returns nil if the service does not exist" do
|
39
|
-
|
40
|
-
subject.instance_variable_set \
|
41
|
-
"@icinga_elem",
|
42
|
-
XML::Document.string("<icinga/>")
|
43
|
-
|
44
|
-
ret = subject.level_for_type "service", "type"
|
45
|
-
|
46
|
-
ret.should == nil
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
it "returns nil if the type does not exist" do
|
51
|
-
|
52
36
|
subject.instance_variable_set \
|
53
37
|
"@icinga_elem",
|
54
38
|
XML::Document.string("
|
55
39
|
<icinga>
|
56
|
-
<service name=\"service\"
|
40
|
+
<service name=\"service\">
|
41
|
+
<type name=\"type\" level=\"level\"/>
|
42
|
+
<type name=\"no-level\"/>
|
43
|
+
<type name=\"empty-level\" level=\"\"/>
|
44
|
+
</service>
|
57
45
|
</icinga>
|
58
46
|
")
|
47
|
+
end
|
59
48
|
|
60
|
-
|
61
|
-
|
49
|
+
it "returns nil if the service does not exist" do
|
50
|
+
ret = subject.level_for_type "blah", "type"
|
62
51
|
ret.should == nil
|
52
|
+
end
|
63
53
|
|
54
|
+
it "returns nil if the type does not exist" do
|
55
|
+
ret = subject.level_for_type "service", "blah"
|
56
|
+
ret.should == nil
|
64
57
|
end
|
65
58
|
|
66
59
|
it "returns nil if the type has no level" do
|
67
|
-
|
68
|
-
subject.instance_variable_set \
|
69
|
-
"@icinga_elem",
|
70
|
-
XML::Document.string("
|
71
|
-
<icinga>
|
72
|
-
<service name=\"service\">
|
73
|
-
<type name=\"type\"/>
|
74
|
-
</service>
|
75
|
-
</icinga>
|
76
|
-
")
|
77
|
-
|
78
|
-
ret = subject.level_for_type "service", "type"
|
79
|
-
|
60
|
+
ret = subject.level_for_type "service", "no-level"
|
80
61
|
ret.should == nil
|
81
|
-
|
82
62
|
end
|
83
63
|
|
84
64
|
it "returns nil if the type has an empty level" do
|
85
|
-
|
86
|
-
subject.instance_variable_set \
|
87
|
-
"@icinga_elem",
|
88
|
-
XML::Document.string("
|
89
|
-
<icinga>
|
90
|
-
<service name=\"service\">
|
91
|
-
<type name=\"type\" level=\"\"/>
|
92
|
-
</service>
|
93
|
-
</icinga>
|
94
|
-
")
|
95
|
-
|
96
|
-
ret = subject.level_for_type "service", "type"
|
97
|
-
|
65
|
+
ret = subject.level_for_type "service", "empty-level"
|
98
66
|
ret.should == nil
|
99
|
-
|
100
67
|
end
|
101
68
|
|
102
69
|
it "returns the appropriate level if all is well" do
|
103
|
-
|
104
|
-
subject.instance_variable_set \
|
105
|
-
"@icinga_elem",
|
106
|
-
XML::Document.string("
|
107
|
-
<icinga>
|
108
|
-
<service name=\"service\">
|
109
|
-
<type name=\"type\" level=\"level\"/>
|
110
|
-
</service>
|
111
|
-
</icinga>
|
112
|
-
")
|
113
|
-
|
114
70
|
ret = subject.level_for_type "service", "type"
|
115
|
-
|
116
71
|
ret.should == "level"
|
117
|
-
|
118
72
|
end
|
119
73
|
|
120
74
|
end
|
metadata
CHANGED
@@ -1,195 +1,222 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hq-log-monitor-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- James Pharaoh
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-09 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: bson_ext
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
|
-
- - '>='
|
19
|
+
- - ! '>='
|
18
20
|
- !ruby/object:Gem::Version
|
19
21
|
version: 1.8.2
|
20
22
|
type: :runtime
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
|
-
- - '>='
|
27
|
+
- - ! '>='
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: 1.8.2
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: hq-tools
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
|
-
- - '>='
|
35
|
+
- - ! '>='
|
32
36
|
- !ruby/object:Gem::Version
|
33
37
|
version: 0.2.0
|
34
38
|
type: :runtime
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
|
-
- - '>='
|
43
|
+
- - ! '>='
|
39
44
|
- !ruby/object:Gem::Version
|
40
45
|
version: 0.2.0
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: libxml-ruby
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
|
-
- - '>='
|
51
|
+
- - ! '>='
|
46
52
|
- !ruby/object:Gem::Version
|
47
53
|
version: 2.6.0
|
48
54
|
type: :runtime
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
|
-
- - '>='
|
59
|
+
- - ! '>='
|
53
60
|
- !ruby/object:Gem::Version
|
54
61
|
version: 2.6.0
|
55
62
|
- !ruby/object:Gem::Dependency
|
56
63
|
name: mongo
|
57
64
|
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
58
66
|
requirements:
|
59
|
-
- - '>='
|
67
|
+
- - ! '>='
|
60
68
|
- !ruby/object:Gem::Version
|
61
69
|
version: 1.8.2
|
62
70
|
type: :runtime
|
63
71
|
prerelease: false
|
64
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
65
74
|
requirements:
|
66
|
-
- - '>='
|
75
|
+
- - ! '>='
|
67
76
|
- !ruby/object:Gem::Version
|
68
77
|
version: 1.8.2
|
69
78
|
- !ruby/object:Gem::Dependency
|
70
79
|
name: multi_json
|
71
80
|
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
72
82
|
requirements:
|
73
|
-
- - '>='
|
83
|
+
- - ! '>='
|
74
84
|
- !ruby/object:Gem::Version
|
75
85
|
version: 1.6.1
|
76
86
|
type: :runtime
|
77
87
|
prerelease: false
|
78
88
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
79
90
|
requirements:
|
80
|
-
- - '>='
|
91
|
+
- - ! '>='
|
81
92
|
- !ruby/object:Gem::Version
|
82
93
|
version: 1.6.1
|
83
94
|
- !ruby/object:Gem::Dependency
|
84
95
|
name: rack
|
85
96
|
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
86
98
|
requirements:
|
87
|
-
- - '>='
|
99
|
+
- - ! '>='
|
88
100
|
- !ruby/object:Gem::Version
|
89
101
|
version: 1.5.1
|
90
102
|
type: :runtime
|
91
103
|
prerelease: false
|
92
104
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
93
106
|
requirements:
|
94
|
-
- - '>='
|
107
|
+
- - ! '>='
|
95
108
|
- !ruby/object:Gem::Version
|
96
109
|
version: 1.5.1
|
97
110
|
- !ruby/object:Gem::Dependency
|
98
111
|
name: capybara
|
99
112
|
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
100
114
|
requirements:
|
101
|
-
- - '>='
|
115
|
+
- - ! '>='
|
102
116
|
- !ruby/object:Gem::Version
|
103
117
|
version: 2.0.2
|
104
118
|
type: :development
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
107
122
|
requirements:
|
108
|
-
- - '>='
|
123
|
+
- - ! '>='
|
109
124
|
- !ruby/object:Gem::Version
|
110
125
|
version: 2.0.2
|
111
126
|
- !ruby/object:Gem::Dependency
|
112
127
|
name: cucumber
|
113
128
|
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
114
130
|
requirements:
|
115
|
-
- - '>='
|
131
|
+
- - ! '>='
|
116
132
|
- !ruby/object:Gem::Version
|
117
133
|
version: 1.2.1
|
118
134
|
type: :development
|
119
135
|
prerelease: false
|
120
136
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
121
138
|
requirements:
|
122
|
-
- - '>='
|
139
|
+
- - ! '>='
|
123
140
|
- !ruby/object:Gem::Version
|
124
141
|
version: 1.2.1
|
125
142
|
- !ruby/object:Gem::Dependency
|
126
143
|
name: json
|
127
144
|
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
128
146
|
requirements:
|
129
|
-
- - '>='
|
147
|
+
- - ! '>='
|
130
148
|
- !ruby/object:Gem::Version
|
131
149
|
version: 1.7.7
|
132
150
|
type: :development
|
133
151
|
prerelease: false
|
134
152
|
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
135
154
|
requirements:
|
136
|
-
- - '>='
|
155
|
+
- - ! '>='
|
137
156
|
- !ruby/object:Gem::Version
|
138
157
|
version: 1.7.7
|
139
158
|
- !ruby/object:Gem::Dependency
|
140
159
|
name: rake
|
141
160
|
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
142
162
|
requirements:
|
143
|
-
- - '>='
|
163
|
+
- - ! '>='
|
144
164
|
- !ruby/object:Gem::Version
|
145
165
|
version: 10.0.3
|
146
166
|
type: :development
|
147
167
|
prerelease: false
|
148
168
|
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
149
170
|
requirements:
|
150
|
-
- - '>='
|
171
|
+
- - ! '>='
|
151
172
|
- !ruby/object:Gem::Version
|
152
173
|
version: 10.0.3
|
153
174
|
- !ruby/object:Gem::Dependency
|
154
175
|
name: rspec
|
155
176
|
requirement: !ruby/object:Gem::Requirement
|
177
|
+
none: false
|
156
178
|
requirements:
|
157
|
-
- - '>='
|
179
|
+
- - ! '>='
|
158
180
|
- !ruby/object:Gem::Version
|
159
181
|
version: 2.12.0
|
160
182
|
type: :development
|
161
183
|
prerelease: false
|
162
184
|
version_requirements: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
163
186
|
requirements:
|
164
|
-
- - '>='
|
187
|
+
- - ! '>='
|
165
188
|
- !ruby/object:Gem::Version
|
166
189
|
version: 2.12.0
|
167
190
|
- !ruby/object:Gem::Dependency
|
168
191
|
name: rspec_junit_formatter
|
169
192
|
requirement: !ruby/object:Gem::Requirement
|
193
|
+
none: false
|
170
194
|
requirements:
|
171
|
-
- - '>='
|
195
|
+
- - ! '>='
|
172
196
|
- !ruby/object:Gem::Version
|
173
197
|
version: '0'
|
174
198
|
type: :development
|
175
199
|
prerelease: false
|
176
200
|
version_requirements: !ruby/object:Gem::Requirement
|
201
|
+
none: false
|
177
202
|
requirements:
|
178
|
-
- - '>='
|
203
|
+
- - ! '>='
|
179
204
|
- !ruby/object:Gem::Version
|
180
205
|
version: '0'
|
181
206
|
- !ruby/object:Gem::Dependency
|
182
207
|
name: simplecov
|
183
208
|
requirement: !ruby/object:Gem::Requirement
|
209
|
+
none: false
|
184
210
|
requirements:
|
185
|
-
- - '>='
|
211
|
+
- - ! '>='
|
186
212
|
- !ruby/object:Gem::Version
|
187
213
|
version: '0'
|
188
214
|
type: :development
|
189
215
|
prerelease: false
|
190
216
|
version_requirements: !ruby/object:Gem::Requirement
|
217
|
+
none: false
|
191
218
|
requirements:
|
192
|
-
- - '>='
|
219
|
+
- - ! '>='
|
193
220
|
- !ruby/object:Gem::Version
|
194
221
|
version: '0'
|
195
222
|
description: HQ log monitor system, central component
|
@@ -214,32 +241,34 @@ files:
|
|
214
241
|
- features/submit-event.feature
|
215
242
|
- features/overview-page.feature
|
216
243
|
- features/support/steps.rb
|
244
|
+
- features/support/time.rb
|
217
245
|
- features/support/env.rb
|
218
246
|
- features/support/ui-steps.rb
|
219
247
|
- spec/hq/log-monitor-server/misc-spec.rb
|
220
248
|
- bin/hq-log-monitor-server
|
221
249
|
homepage: https://github.com/jamespharaoh/hq-log-monitor-server
|
222
250
|
licenses: []
|
223
|
-
metadata: {}
|
224
251
|
post_install_message:
|
225
252
|
rdoc_options: []
|
226
253
|
require_paths:
|
227
254
|
- lib
|
228
255
|
required_ruby_version: !ruby/object:Gem::Requirement
|
256
|
+
none: false
|
229
257
|
requirements:
|
230
|
-
- - '>='
|
258
|
+
- - ! '>='
|
231
259
|
- !ruby/object:Gem::Version
|
232
260
|
version: '0'
|
233
261
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
262
|
+
none: false
|
234
263
|
requirements:
|
235
|
-
- - '>='
|
264
|
+
- - ! '>='
|
236
265
|
- !ruby/object:Gem::Version
|
237
266
|
version: 1.3.6
|
238
267
|
requirements: []
|
239
268
|
rubyforge_project: hq-log-monitor-server
|
240
|
-
rubygems_version:
|
269
|
+
rubygems_version: 1.8.23
|
241
270
|
signing_key:
|
242
|
-
specification_version:
|
271
|
+
specification_version: 3
|
243
272
|
summary: HQ log monitor server
|
244
273
|
test_files:
|
245
274
|
- features/event-page.feature
|
@@ -247,6 +276,7 @@ test_files:
|
|
247
276
|
- features/submit-event.feature
|
248
277
|
- features/overview-page.feature
|
249
278
|
- features/support/steps.rb
|
279
|
+
- features/support/time.rb
|
250
280
|
- features/support/env.rb
|
251
281
|
- features/support/ui-steps.rb
|
252
282
|
- spec/hq/log-monitor-server/misc-spec.rb
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 6c802a656d6c2c2f5cee3eed1f4c866b812fc5ba
|
4
|
-
data.tar.gz: e234c43d9f6be7a9879c5192b7d0ab0a1b15e33f
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: a2db019440cc38fe7319b32cb4d357f6b35eed61f7fdbedcdd651c12110a36c49751bb9c3ec47116660f8d230e2569ec6a9aed44cb4438bdd54215a34b570e7e
|
7
|
-
data.tar.gz: 4f6b25e91c08a504f272615a4f34a6f03a3ad75532bd621a34fe9c728787bbefa55057e8a4abb963eecd62ab10730161729fae253c553e5ab2f880538038c34d
|