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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5a9e53e58f2786d8d813c824630b6c3885a92d89
4
- data.tar.gz: 795d8eec0b54a1c9cb634adf99006931bcf0173c
3
+ metadata.gz: ca449f8a8c7a0ab2161b8b29b660e676b03a35b6
4
+ data.tar.gz: 75eda160f04f86f654f6a1238e27c9b8baf2632b
5
5
  SHA512:
6
- metadata.gz: a0850b9387086975c40633444e0de890b1899fe25a9af70766f0d78f2e33c6694c3e08ab26aeb835629b1bdcf3400742f3cb34ecdc9272653596454a584e67f3
7
- data.tar.gz: b77f8540839d0af92ed47b923f299d240ad194f344815541e0f384b737bbe921a456f14ea812b44c1bf54a44be6e3108c15166f47ef1af8eb709c6112512ac4a
6
+ metadata.gz: 4171a64a662db193d702b783adb1e8d39c26110d4e53c852948033cffa9d69d1b5e6347d38f127007e1a50631a17116c31969ee9b7b458bb36f3d7e56899b558
7
+ data.tar.gz: f931c2971269e66bfe2fa5506cf1ae93da4e0e7e6bd96d81765ec79acea0363b9516dd6563d76415faca49806ba92ccc36ca1551511d1bedc4499eab8cc9535e
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # 0.1.x
2
+ - FIX: ....
3
+
4
+ # 0.1.0
5
+ - wooo
@@ -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 = 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'
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
@@ -7,12 +7,13 @@ class Alarm
7
7
  class Email
8
8
  SERVER = 'localhost'
9
9
 
10
- def send msg
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 + msg[:short]
15
- @body = msg[:long]
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 27 measurement slots, a partial
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 message, targets=CFG.irc.target
7
- url = Paste.add message[:long]
8
- [targets].flatten.each do |target|
9
- msg = [@password, target, message[:short], url].join ' '
10
- msg += "\0" while msg.size % 16 > 0
11
- UDPSocket.new.send msg, 0, @host, @port.to_i
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 initialize host=CFG.irc.host, port=CFG.irc.port, password=CFG.irc.password
20
- @host = host
21
- @port = port
22
- @password = password
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
 
@@ -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.send msg }
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.send msg }
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
@@ -38,7 +38,7 @@ class SQA
38
38
 
39
39
  class AnalyzeBuffer
40
40
  attr_reader :array
41
- def initialize nodes_count, max_size=30, median_of=27
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
@@ -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
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'ring-sqa'
3
- s.version = '0.0.23'
3
+ s.version = '0.1.0'
4
4
  s.licenses = %w( Apache-2.0 )
5
5
  s.platform = Gem::Platform::RUBY
6
6
  s.authors = [ 'Saku Ytti', 'Job Snijders' ]
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.23
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-28 00:00:00.000000000 Z
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.0.14
145
+ rubygems_version: 2.2.2
144
146
  signing_key:
145
147
  specification_version: 4
146
148
  summary: NLNOG Ring SQA