ring-sqa 0.0.23 → 0.1.0

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