ring-sqa 0.0.23 → 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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/lib/ring/sqa/alarm/cfg.rb +9 -7
- data/lib/ring/sqa/alarm/email.rb +4 -3
- data/lib/ring/sqa/alarm/exec.rb +34 -0
- data/lib/ring/sqa/alarm/message.rb +1 -1
- data/lib/ring/sqa/alarm/udp2irc.rb +14 -10
- data/lib/ring/sqa/alarm.rb +14 -4
- data/lib/ring/sqa/analyzer.rb +1 -1
- data/lib/ring/sqa/cfg.rb +10 -2
- data/lib/ring/sqa/nodes.rb +2 -1
- data/ring-sqa.gemspec +1 -1
- metadata +19 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca449f8a8c7a0ab2161b8b29b660e676b03a35b6
|
4
|
+
data.tar.gz: 75eda160f04f86f654f6a1238e27c9b8baf2632b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4171a64a662db193d702b783adb1e8d39c26110d4e53c852948033cffa9d69d1b5e6347d38f127007e1a50631a17116c31969ee9b7b458bb36f3d7e56899b558
|
7
|
+
data.tar.gz: f931c2971269e66bfe2fa5506cf1ae93da4e0e7e6bd96d81765ec79acea0363b9516dd6563d76415faca49806ba92ccc36ca1551511d1bedc4499eab8cc9535e
|
data/lib/ring/sqa/alarm/cfg.rb
CHANGED
@@ -3,13 +3,15 @@ class SQA
|
|
3
3
|
|
4
4
|
class Alarm
|
5
5
|
Config = Asetus.new name: 'sqa', load: false, usrdir: Directory, cfgfile: 'alarm.conf'
|
6
|
-
Config.default.email.to
|
7
|
-
Config.default.email.from
|
8
|
-
Config.default.email.prefix
|
9
|
-
Config.default.irc.host
|
10
|
-
Config.default.irc.port
|
11
|
-
Config.default.irc.password
|
12
|
-
Config.default.irc.target
|
6
|
+
Config.default.email.to = false
|
7
|
+
Config.default.email.from = 'foo@example.com'
|
8
|
+
Config.default.email.prefix = false
|
9
|
+
Config.default.irc.host = '213.136.8.179'
|
10
|
+
Config.default.irc.port = 5502
|
11
|
+
Config.default.irc.password = 'shough2oChoo'
|
12
|
+
Config.default.irc.target = '#ring'
|
13
|
+
Config.default.exec.command = false
|
14
|
+
Config.default.exec.arguments = false
|
13
15
|
|
14
16
|
begin
|
15
17
|
Config.load
|
data/lib/ring/sqa/alarm/email.rb
CHANGED
@@ -7,12 +7,13 @@ class Alarm
|
|
7
7
|
class Email
|
8
8
|
SERVER = 'localhost'
|
9
9
|
|
10
|
-
def send
|
10
|
+
def send opts
|
11
|
+
short, long = opts[:short], opts[:long]
|
11
12
|
@from = CFG.email.from
|
12
13
|
@to = [CFG.email.to].flatten
|
13
14
|
prefix = CFG.email.prefix? ? CFG.email.prefix : ''
|
14
|
-
@subject = prefix +
|
15
|
-
@body =
|
15
|
+
@subject = prefix + short
|
16
|
+
@body = long
|
16
17
|
send_email compose_email
|
17
18
|
rescue => error
|
18
19
|
Log.error "Email raised '#{error.class}' with message '#{error.message}'"
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Ring
|
2
|
+
class SQA
|
3
|
+
class Alarm
|
4
|
+
|
5
|
+
class Exec
|
6
|
+
def send opts
|
7
|
+
stdout = JSON.pretty_generate( {
|
8
|
+
:alarm_buffer => opts[:alarm_buffer].exceeding_nodes,
|
9
|
+
:nodes => opts[:nodes].all,
|
10
|
+
:short => opts[:short],
|
11
|
+
:long => opts[:long],
|
12
|
+
:status => opts[:status],
|
13
|
+
})
|
14
|
+
exec stdout, CFG.exec.command, CFG.exec.arguments?
|
15
|
+
rescue => error
|
16
|
+
Log.error "Exec raised '#{error.class}' with message '#{error.message}'"
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def exec write, cmd, args
|
22
|
+
args = '' unless args
|
23
|
+
args = args.split ' '
|
24
|
+
Open3.popen3(cmd, *args) do |stdin, stdout, stderr, wait_thr|
|
25
|
+
stdin.write write
|
26
|
+
stdin.close
|
27
|
+
wait_thr.join
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -28,7 +28,7 @@ An alarm is raised under the following conditions: every 30 seconds
|
|
28
28
|
your node pings all other nodes. The amount of nodes that cannot be
|
29
29
|
reached is stored in a circular buffer, with each element representing
|
30
30
|
a minute of measurements. In the event that the last three minutes are
|
31
|
-
#{Ring::SQA::CFG.analyzer.tolerance} above the median of the previous
|
31
|
+
#{Ring::SQA::CFG.analyzer.tolerance} above the median of the previous #{Ring::SQA::CFG.analyzer.median_of} measurement slots, a partial
|
32
32
|
outage is assumed. The ring buffer's output is as following:
|
33
33
|
|
34
34
|
#{buffer_list}
|
@@ -3,12 +3,16 @@ class SQA
|
|
3
3
|
class Alarm
|
4
4
|
|
5
5
|
class UDP2IRC
|
6
|
-
def send
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
6
|
+
def send opts
|
7
|
+
short, long = opts[:short], opts[:long]
|
8
|
+
irc = CFG.irc
|
9
|
+
url = Paste.add long
|
10
|
+
if irc.class == Array
|
11
|
+
irc.each do |target|
|
12
|
+
udp2irc target['password'], target['target'], short, url, target['host'], target['port']
|
13
|
+
end
|
14
|
+
else
|
15
|
+
udp2irc irc.password, irc.target, short, url, irc.host, irc.port
|
12
16
|
end
|
13
17
|
rescue => error
|
14
18
|
Log.error "UDP2IRC raised '#{error.class}' with message '#{error.message}'"
|
@@ -16,10 +20,10 @@ class Alarm
|
|
16
20
|
|
17
21
|
private
|
18
22
|
|
19
|
-
def
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
+
def udp2irc password, target, message, url, host, port
|
24
|
+
msg = [password, target, message, url].join ' '
|
25
|
+
msg += "\0" while msg.size % 16 > 0
|
26
|
+
UDPSocket.new.send msg, 0, host, port
|
23
27
|
end
|
24
28
|
end
|
25
29
|
|
data/lib/ring/sqa/alarm.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative 'alarm/email'
|
2
2
|
require_relative 'alarm/udp2irc'
|
3
|
+
require_relative 'alarm/exec'
|
3
4
|
require_relative 'alarm/cfg'
|
4
5
|
require_relative 'alarm/message'
|
5
6
|
require_relative 'mtr'
|
@@ -14,17 +15,17 @@ class SQA
|
|
14
15
|
@alarm = true
|
15
16
|
msg = compose_message alarm_buffer
|
16
17
|
Log.info msg[:short]
|
17
|
-
@methods.each { |alarm_method| alarm_method
|
18
|
+
@methods.each { |alarm_method| alarm_send alarm_method, 'raise', msg, alarm_buffer }
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
21
22
|
def clear
|
22
23
|
if @alarm == true
|
23
24
|
@alarm = false
|
24
|
-
msg = { short: "#{@hostname}: clearing alarm" }
|
25
|
+
msg = { short: "#{@hostname}: clearing #{@afi} alarm" }
|
25
26
|
msg[:long] = msg[:short]
|
26
27
|
Log.info msg[:short]
|
27
|
-
@methods.each { |alarm_method| alarm_method
|
28
|
+
@methods.each { |alarm_method| alarm_send alarm_method, 'clear', msg, nil }
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
@@ -34,7 +35,8 @@ class SQA
|
|
34
35
|
@nodes = nodes
|
35
36
|
@methods = []
|
36
37
|
@methods << Email.new if CFG.email.to?
|
37
|
-
@methods << UDP2IRC.new if CFG.irc.password?
|
38
|
+
@methods << UDP2IRC.new if Array === CFG.irc or CFG.irc.password?
|
39
|
+
@methods << Exec.new if CFG.exec.command?
|
38
40
|
@hostname = Ring::SQA::CFG.host.name
|
39
41
|
@afi = Ring::SQA::CFG.afi
|
40
42
|
@alarm = false
|
@@ -70,6 +72,14 @@ class SQA
|
|
70
72
|
msg
|
71
73
|
end
|
72
74
|
|
75
|
+
def alarm_send alarm_method, status, msg, alarm_buffer=nil
|
76
|
+
alarm_method.send(short: msg[:short],
|
77
|
+
long: msg[:long],
|
78
|
+
status: status,
|
79
|
+
alarm_buffer: alarm_buffer,
|
80
|
+
nodes: @nodes)
|
81
|
+
end
|
82
|
+
|
73
83
|
end
|
74
84
|
|
75
85
|
end
|
data/lib/ring/sqa/analyzer.rb
CHANGED
@@ -38,7 +38,7 @@ class SQA
|
|
38
38
|
|
39
39
|
class AnalyzeBuffer
|
40
40
|
attr_reader :array
|
41
|
-
def initialize nodes_count, max_size=
|
41
|
+
def initialize nodes_count, max_size=CFG.analyzer.size, median_of=CFG.analyzer.median_of
|
42
42
|
@max_size = max_size
|
43
43
|
@median_of = median_of
|
44
44
|
nodes_count = CFG.fake? ? 0 : nodes_count
|
data/lib/ring/sqa/cfg.rb
CHANGED
@@ -7,30 +7,38 @@ module Ring
|
|
7
7
|
class NoConfig < StandardError; end
|
8
8
|
|
9
9
|
Config = Asetus.new name: 'sqa', load: false, usrdir: Directory, cfgfile: 'main.conf'
|
10
|
+
hosts = Asetus.new name: 'sqa', load: false, usrdir: Directory, cfgfile: 'hosts.conf'
|
11
|
+
|
10
12
|
Config.default.directory = Directory
|
11
13
|
Config.default.debug = false
|
12
|
-
Config.default.hosts.load = %w( ring.nlnog.net )
|
13
|
-
Config.default.hosts.ignore = %w( infra.ring.nlnog.net )
|
14
14
|
Config.default.port = 'ring'.to_i(36)/100
|
15
15
|
Config.default.analyzer.tolerance = 1.2
|
16
|
+
Config.default.analyzer.size = 30
|
17
|
+
Config.default.analyzer.median_of = 27
|
16
18
|
Config.default.nodes_json = '/etc/ring/nodes.json'
|
17
19
|
Config.default.mtr.args = '-i0.5 -c5 -r -w -n'
|
18
20
|
Config.default.mtr.timeout = 15
|
19
21
|
Config.default.ram_database = false
|
20
22
|
Config.default.paste.url = 'https://ring.nlnog.net/paste/'
|
21
23
|
|
24
|
+
hosts.default.load = %w( ring.nlnog.net )
|
25
|
+
hosts.default.ignore = %w( infra.ring.nlnog.net )
|
26
|
+
|
22
27
|
begin
|
23
28
|
Config.load
|
29
|
+
hosts.load
|
24
30
|
rescue => error
|
25
31
|
raise InvalidConfig, "Error loading configuration: #{error.message}"
|
26
32
|
end
|
27
33
|
|
28
34
|
CFG = Config.cfg
|
35
|
+
CFG.hosts = hosts.cfg
|
29
36
|
|
30
37
|
CFG.host.name = Socket.gethostname
|
31
38
|
CFG.host.ipv4 = Socket::getaddrinfo(CFG.host.name,"echo",Socket::AF_INET)[0][3]
|
32
39
|
CFG.host.ipv6 = Socket::getaddrinfo(CFG.host.name,"echo",Socket::AF_INET6)[0][3]
|
33
40
|
|
41
|
+
hosts.create
|
34
42
|
raise NoConfig, 'edit /etc/ring-sqa/main.conf' if Config.create
|
35
43
|
end
|
36
44
|
end
|
data/lib/ring/sqa/nodes.rb
CHANGED
@@ -39,13 +39,14 @@ class SQA
|
|
39
39
|
nodes_hash list
|
40
40
|
rescue => error
|
41
41
|
Log.warn "#{error.class} raised with message '#{error.message}' while generating nodes list"
|
42
|
-
@all
|
42
|
+
(@all or {})
|
43
43
|
end
|
44
44
|
|
45
45
|
def nodes_hash ips, file=CFG.nodes_json
|
46
46
|
nodes = {}
|
47
47
|
json = JSON.load File.read(file)
|
48
48
|
json['results']['nodes'].each do |node|
|
49
|
+
next if node['service']['sqa'] == false rescue nil
|
49
50
|
addr = node[CFG.afi]
|
50
51
|
next unless ips.include? addr
|
51
52
|
nodes[addr] = node
|
data/ring-sqa.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ring-sqa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Saku Ytti
|
@@ -9,82 +9,82 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-07-
|
12
|
+
date: 2014-07-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: slop
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - ~>
|
18
|
+
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: '3.5'
|
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: '3.5'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: rb-inotify
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- - ~>
|
32
|
+
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '0.9'
|
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: '0.9'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: sequel
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- - ~>
|
46
|
+
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '4.12'
|
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
55
|
version: '4.12'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: sqlite3
|
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: :runtime
|
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: asetus
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
|
-
- - ~>
|
74
|
+
- - "~>"
|
75
75
|
- !ruby/object:Gem::Version
|
76
76
|
version: '0.1'
|
77
|
-
- -
|
77
|
+
- - ">="
|
78
78
|
- !ruby/object:Gem::Version
|
79
79
|
version: 0.1.2
|
80
80
|
type: :runtime
|
81
81
|
prerelease: false
|
82
82
|
version_requirements: !ruby/object:Gem::Requirement
|
83
83
|
requirements:
|
84
|
-
- - ~>
|
84
|
+
- - "~>"
|
85
85
|
- !ruby/object:Gem::Version
|
86
86
|
version: '0.1'
|
87
|
-
- -
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: 0.1.2
|
90
90
|
description: gets list of nodes and pings from each to each storing results
|
@@ -95,6 +95,7 @@ executables:
|
|
95
95
|
extensions: []
|
96
96
|
extra_rdoc_files: []
|
97
97
|
files:
|
98
|
+
- CHANGELOG.md
|
98
99
|
- Gemfile
|
99
100
|
- README.md
|
100
101
|
- Rakefile
|
@@ -103,6 +104,7 @@ files:
|
|
103
104
|
- lib/ring/sqa/alarm.rb
|
104
105
|
- lib/ring/sqa/alarm/cfg.rb
|
105
106
|
- lib/ring/sqa/alarm/email.rb
|
107
|
+
- lib/ring/sqa/alarm/exec.rb
|
106
108
|
- lib/ring/sqa/alarm/message.rb
|
107
109
|
- lib/ring/sqa/alarm/udp2irc.rb
|
108
110
|
- lib/ring/sqa/analyzer.rb
|
@@ -130,17 +132,17 @@ require_paths:
|
|
130
132
|
- lib
|
131
133
|
required_ruby_version: !ruby/object:Gem::Requirement
|
132
134
|
requirements:
|
133
|
-
- -
|
135
|
+
- - ">="
|
134
136
|
- !ruby/object:Gem::Version
|
135
137
|
version: 1.9.3
|
136
138
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
137
139
|
requirements:
|
138
|
-
- -
|
140
|
+
- - ">="
|
139
141
|
- !ruby/object:Gem::Version
|
140
142
|
version: '0'
|
141
143
|
requirements: []
|
142
144
|
rubyforge_project: ring-sqa
|
143
|
-
rubygems_version: 2.
|
145
|
+
rubygems_version: 2.2.2
|
144
146
|
signing_key:
|
145
147
|
specification_version: 4
|
146
148
|
summary: NLNOG Ring SQA
|