saal 0.3.2 → 0.3.3

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
  SHA256:
3
- metadata.gz: a8e07d635b3ad4c944de3ccbe81096f826754aa457b9ebf06854f01a760d715d
4
- data.tar.gz: 766a7168fa122a72b388b6547b1f6b9531cd4afd5bc1df9df52673b9fd8291ce
3
+ metadata.gz: 90aa53b1093427163af28bee630532e79ccefea47de44463641c3e387f038640
4
+ data.tar.gz: 41fca314cb32d91ca10bfb1982cf7e60a6b584c3c521b8ddcd148b18f465fd86
5
5
  SHA512:
6
- metadata.gz: 1ada5f05af261f043ef3e871c21d61b3f1924b4b99d8059233f1202a8594c30ea9af425e3f62d75050ee2f6c8bc15782c1535e4fc4696c277d7619c0569e40dc
7
- data.tar.gz: 39ece8cad43590608d9410d7ffdcab1449e1fcc309f123343ffa6872dd84b820a59635a0f3a1aaf5807d05e111394674aa1aa49d9dcc2589930477d5f3c10426
6
+ metadata.gz: ff26de3ff3cca4750a365b9672a82165d449f7c11fb3bd57d7f3f27758636a521d766ae99dc84b50cd30e940453eb30826ad485e44f9e50d723bb5625cd07915
7
+ data.tar.gz: f93e18eacc3a2eb6555c95b9ea91f74506a39af91c6083ab6dbb3acc1ef2d83387db9ed59a573afcb7bbd1354cfdf7af51ec11122d9f48f287baf273c235debf
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.dirname(__FILE__)+'/../lib/saal.rb'
4
+
5
+ def usage
6
+ $stderr.puts "USAGE: saal_denkovi_relays <host>"
7
+ $stderr.puts "USAGE: saal_denkovi_relays <host> <num> <ON/OFF>"
8
+ end
9
+
10
+ if ARGV.size != 1 && ARGV.size != 3
11
+ usage()
12
+ exit(1)
13
+ end
14
+
15
+ denkovi = SAAL::Denkovi::OutletGroup::new(
16
+ :host => ARGV[0],
17
+ )
18
+
19
+ if ARGV.size == 3
20
+ num = ARGV[1].to_i
21
+ newstate = ARGV[2]
22
+ if !["ON","OFF"].include? newstate
23
+ $stderr.puts "ERROR: Unknown state '#{newstate}'"
24
+ usage()
25
+ exit(1)
26
+ end
27
+ puts "Setting Relay #{num} to #{newstate}"
28
+ denkovi.set_state(num, newstate)
29
+ end
30
+
31
+ (1..16).each do |num|
32
+ puts "Relay #{num} is #{denkovi.state(num)}"
33
+ end
34
+
@@ -0,0 +1,101 @@
1
+ require 'net/http'
2
+ require 'json'
3
+
4
+ module SAAL
5
+ module Denkovi
6
+ class Outlet < SensorUnderlying
7
+ writeable!
8
+
9
+ def initialize(num, outletgroup)
10
+ @num = num
11
+ @og = outletgroup
12
+ end
13
+
14
+ def sensor_type
15
+ :onoff
16
+ end
17
+
18
+ def read(uncached = false)
19
+ {'ON' => 1.0, 'OFF' => 0.0}[@og.state(@num)]
20
+ end
21
+
22
+ def write(value)
23
+ newstate = {1.0 => 'ON', 0.0 => 'OFF'}[value]
24
+ if newstate
25
+ @og.set_state(@num,newstate)
26
+ value
27
+ end
28
+ end
29
+ end
30
+
31
+ class OutletGroup
32
+ DEFAULT_TIMEOUT = 2
33
+ DEFAULT_CACHE_TIMEOUT = 60
34
+ DEFAULT_OUTLETS = {}
35
+ DEFAULT_DESCRIPTIONS = {}
36
+
37
+ attr_accessor :host, :port, :pass, :timeout, :cache_timeout
38
+
39
+ def initialize(opts={})
40
+ @host = opts[:host] || opts['host'] || 'localhost'
41
+ @port = opts[:port] || opts['port'] || 80
42
+ @pass = opts[:pass] || opts['pass'] || 'admin'
43
+ @timeout = opts[:timeout] || opts['timeout'] || DEFAULT_TIMEOUT
44
+ @cache_timeout = opts[:cache_timeout] || opts['cache_timeout'] || DEFAULT_CACHE_TIMEOUT
45
+ @outlets = opts[:outlets] || opts["outlets"] || DEFAULT_OUTLETS
46
+ @descriptions = opts[:descriptions] || opts["descriptions"] || DEFAULT_DESCRIPTIONS
47
+ @cache = nil
48
+ @cachehit = nil
49
+ @cachetime = nil
50
+ end
51
+
52
+ def state(num)
53
+ if !@cachetime or @cachetime < Time.now - @cache_timeout
54
+ @cache = do_get("/current_state.json?pw=#{@pass}")
55
+ @cachetime = Time.now
56
+ end
57
+ return nil if !@cache
58
+ json = JSON.parse(@cache.body)
59
+ num = num - 1
60
+ if json &&
61
+ json["CurrentState"] &&
62
+ json["CurrentState"]["Output"] &&
63
+ json["CurrentState"]["Output"][num] &&
64
+ json["CurrentState"]["Output"][num]["Value"]
65
+ val = json["CurrentState"]["Output"][num]["Value"]
66
+ {"1" => "ON", "0" => "OFF"}[val]
67
+ else
68
+ nil
69
+ end
70
+ end
71
+
72
+ def set_state(num, state)
73
+ @cachetime = nil
74
+ val = {"ON" => "1", "OFF" => "0"}[state]
75
+ if val
76
+ response = do_get("/current_state.json?pw=#{@pass}&Relay#{num}=#{val}")
77
+ response != nil
78
+ else
79
+ false
80
+ end
81
+ end
82
+
83
+ def create_sensors
84
+ sensors = {}
85
+ (1..16).each do |num|
86
+ name = @outlets[num]
87
+ if name
88
+ description = @descriptions[num] || ""
89
+ sensors[name] = [Outlet.new(num, self), description]
90
+ end
91
+ end
92
+ sensors
93
+ end
94
+
95
+ private
96
+ def do_get(path)
97
+ SAAL::do_http_get(@host, @port, path, nil, nil, @timeout)
98
+ end
99
+ end
100
+ end
101
+ end
@@ -10,7 +10,7 @@ module SAAL
10
10
  DBCONF = CONFDIR+"database.yml"
11
11
  CHARTSCONF = CONFDIR+"charts.yml"
12
12
 
13
- VERSION = '0.3.2'
13
+ VERSION = '0.3.3'
14
14
  end
15
15
 
16
16
  require File.dirname(__FILE__)+'/dbstore.rb'
@@ -25,4 +25,5 @@ require File.dirname(__FILE__)+'/outliercache.rb'
25
25
  require File.dirname(__FILE__)+'/dinrelay.rb'
26
26
  require File.dirname(__FILE__)+'/envoy.rb'
27
27
  require File.dirname(__FILE__)+'/http.rb'
28
+ require File.dirname(__FILE__)+'/denkovi.rb'
28
29
 
@@ -61,6 +61,15 @@ module SAAL
61
61
  return sensors.map do |name, underlying|
62
62
  Sensor.new(dbstore, name, underlying, defs, opts)
63
63
  end
64
+ elsif defs['denkovi']
65
+ defs = defs['denkovi'].merge('prefix' => name)
66
+ denkovi = SAAL::Denkovi::OutletGroup::new(defs)
67
+ sensors = denkovi.create_sensors
68
+ return sensors.map do |name, vals|
69
+ underlying, description = vals
70
+ defs.merge!('name' => description)
71
+ Sensor.new(dbstore, name, underlying, defs, opts)
72
+ end
64
73
  else
65
74
  $stderror.puts "WARNING: Couldn't figure out a valid sensor type for #{name}"
66
75
  end
@@ -6,8 +6,8 @@ Gem::Specification.new do |s|
6
6
  s.platform = Gem::Platform::RUBY
7
7
 
8
8
  s.name = 'saal'
9
- s.version = '0.3.2'
10
- s.date = '2020-12-25'
9
+ s.version = '0.3.3'
10
+ s.date = '2020-12-28'
11
11
 
12
12
  s.summary = "Thin abstraction layer for interfacing and recording sensors (currently onewire) and actuators (currently dinrelay)"
13
13
  s.description = <<EOF
@@ -45,6 +45,7 @@ EOF
45
45
  bin/dinrelaystatus
46
46
  bin/saal_chart
47
47
  bin/saal_daemon
48
+ bin/saal_denkovi_relays
48
49
  bin/saal_dump_database
49
50
  bin/saal_envoy_generate_config
50
51
  bin/saal_envoy_read
@@ -55,6 +56,7 @@ EOF
55
56
  lib/charts.rb
56
57
  lib/daemon.rb
57
58
  lib/dbstore.rb
59
+ lib/denkovi.rb
58
60
  lib/dinrelay.rb
59
61
  lib/envoy.rb
60
62
  lib/http.rb
@@ -69,6 +71,8 @@ EOF
69
71
  test/charts_test.rb
70
72
  test/daemon_test.rb
71
73
  test/dbstore_test.rb
74
+ test/denkovi.json.erb
75
+ test/denkovi_test.rb
72
76
  test/dinrelay.html.erb
73
77
  test/dinrelay_test.rb
74
78
  test/nonexistant_sensor.yml
@@ -77,6 +81,7 @@ EOF
77
81
  test/sensors_test.rb
78
82
  test/test_charts.yml
79
83
  test/test_db.yml
84
+ test/test_denkovi_sensors.yml
80
85
  test/test_dinrelay_sensors.yml
81
86
  test/test_helper.rb
82
87
  test/test_sensor_cleanups.yml
@@ -0,0 +1,39 @@
1
+ {
2
+
3
+ "CurrentState": {
4
+
5
+ "Output": [
6
+
7
+ <% (1..16).each do |num| %>
8
+ <% state = outlets[num] %>
9
+ <% val = state == "ON" ? "1" : "0" %>
10
+ <% if num < 16 %>
11
+ {"Name": "RELAY<%= num %>", "Value": "<%= val %>"},
12
+ <% else %>
13
+ {"Name": "RELAY<%= num %>", "Value": "<%= val %>"}
14
+ <% end %>
15
+ <% end %>
16
+
17
+ ],
18
+
19
+ "Auto-reboot": {
20
+
21
+ "RebootsNumber": "0",
22
+
23
+ "LastReboot": "-"
24
+
25
+ },
26
+
27
+ "Device": {
28
+
29
+ "Name": "SMARTDEN_IP-16R",
30
+
31
+ "MAC": "E8:EA:DA:AA:AA:AA"
32
+
33
+ }
34
+
35
+ }
36
+
37
+ }
38
+
39
+
@@ -0,0 +1,212 @@
1
+ require File.dirname(__FILE__)+'/test_helper.rb'
2
+ require 'webrick'
3
+ require 'benchmark'
4
+
5
+ class TestDenkoviRelay < Test::Unit::TestCase
6
+ def setup
7
+ @@serv_num ||= 0
8
+ @@serv_num += 1
9
+
10
+ @og=SAAL::Denkovi::OutletGroup.new(service_opts)
11
+ @vals={1=>"OFF",2=>"OFF",3=>"ON",4=>"OFF",5=>"ON",6=>"ON",7=>"ON",8=>"OFF",
12
+ 9=>"OFF",10=>"OFF",11=>"ON",12=>"OFF",13=>"ON",14=>"ON",15=>"ON",16=>"OFF"}
13
+ @rvals={1=>"ON",2=>"ON",3=>"OFF",4=>"ON",5=>"OFF",6=>"OFF",7=>"OFF",8=>"ON",
14
+ 9=>"ON",10=>"ON",11=>"OFF",12=>"ON",13=>"OFF",14=>"OFF",15=>"OFF",16=>"ON"}
15
+
16
+ defs = YAML::load(File.new(TEST_SENSORS_DENKOVI_FILE))
17
+ @pass = defs["group1"]["denkovi"]["pass"]
18
+ defs['group1']['denkovi']['port'] = service_opts[:port]
19
+ tempfile = Tempfile.new('denkovi_test_yml')
20
+ File.open(tempfile.path,'w') {|f| f.write(YAML::dump defs)}
21
+ @test_sensors_denkovi_file = tempfile.path
22
+ end
23
+
24
+ def service_opts
25
+ base_opts = {:host => 'localhost', :pass =>"somepass"}
26
+ base_opts.merge(:port => 3333+@@serv_num)
27
+ end
28
+
29
+ class BasicServing < WEBrick::HTTPServlet::AbstractServlet
30
+ def self.get_instance(config, opts)
31
+ new(opts)
32
+ end
33
+ def initialize(opts)
34
+ @html = opts[:html]
35
+ @pass = opts[:pass]
36
+ @status = opts[:status] || 200
37
+ @feedback = opts[:feedback] || {}
38
+ @sleep = opts[:sleep] || 0
39
+ end
40
+ def do_GET(req, res)
41
+ sleep @sleep
42
+ @feedback[:uris] ||= []
43
+ @feedback[:uris] << req.request_uri.to_s
44
+ @feedback[:uri] = req.request_uri.to_s
45
+ @feedback[:nrequests] = (@feedback[:nrequests]||0)+1
46
+ res.body = @html
47
+ res.status = @status
48
+ res['Content-Type'] = "text/html"
49
+ end
50
+ end
51
+
52
+ def with_webrick(opts)
53
+ opts = service_opts.merge(opts)
54
+
55
+ Socket.do_not_reverse_lookup = true # Speed up startup
56
+ log = WEBrick::Log.new($stderr, WEBrick::Log::ERROR)
57
+ access_log = [[log, WEBrick::AccessLog::COMBINED_LOG_FORMAT]]
58
+ s = WEBrick::HTTPServer.new(:Port => opts[:port],
59
+ :Logger => log,
60
+ :AccessLog => access_log)
61
+ s.mount('/', BasicServing, opts.merge(:feedback => (f = {})))
62
+
63
+ thread = Thread.new do
64
+ s.start
65
+ end
66
+ while s.status != :Running; sleep 0.1; end # Make sure the server is up
67
+ yield f
68
+ s.shutdown
69
+ thread.exit
70
+ end
71
+
72
+ def create_current_state_json(hash)
73
+ outlets = hash
74
+ erb = ERB.new(File.open(File.dirname(__FILE__)+'/denkovi.json.erb').read)
75
+ erb.result(binding)
76
+ end
77
+
78
+ def assert_path(path, uri)
79
+ assert_equal "http://localhost:#{service_opts[:port]}"+path, uri
80
+ end
81
+
82
+ def test_read_state
83
+ with_webrick(:html=>create_current_state_json(@vals)) do |feedback|
84
+ @vals.each do |num, state|
85
+ assert_equal state, @og.state(num)
86
+ assert_path "/current_state.json?pw=#{@pass}", feedback[:uri]
87
+ end
88
+ end
89
+ end
90
+
91
+ def test_set_state
92
+ with_webrick(:html=>create_current_state_json(@rvals)) do |feedback|
93
+ @vals.each do |num, state|
94
+ newstate = state == "ON" ? "OFF" : "ON"
95
+ val = {"ON" => "1", "OFF" => "0"}[newstate]
96
+ assert @og.set_state(num,newstate), "State change not working"
97
+ assert_path "/current_state.json?pw=#{@pass}&Relay#{num}=#{val}", feedback[:uri]
98
+ end
99
+ end
100
+ end
101
+
102
+ def test_enumerate_sensors
103
+ sensors = SAAL::Sensors.new(@test_sensors_denkovi_file, TEST_DBCONF)
104
+ assert_equal((1..16).map{|i| "name#{i.to_s.rjust(2, "0")}"}, sensors.map{|s| s.name}.sort)
105
+ assert_equal((1..16).map{|i| "description#{i.to_s.rjust(2, "0")}"}, sensors.map{|s| s.description}.sort)
106
+ end
107
+
108
+ def test_sensor_type
109
+ SAAL::Sensors.new(TEST_SENSORS_DENKOVI_FILE, TEST_DBCONF).each do |s|
110
+ assert_equal :onoff, s.sensor_type
111
+ end
112
+ end
113
+
114
+ def test_read_sensors
115
+ sensors = SAAL::Sensors.new(@test_sensors_denkovi_file, TEST_DBCONF)
116
+ with_webrick(:html=>create_current_state_json(@vals)) do |feedback|
117
+ @vals.each do |num, state|
118
+ value = state == "ON" ? 1.0 : 0.0
119
+ assert_equal value, sensors.send('name'+num.to_s.rjust(2, "0")).read
120
+ assert_path "/current_state.json?pw=#{@pass}", feedback[:uri]
121
+ end
122
+ assert_equal 1, feedback[:nrequests], "denkovi request caching not working"
123
+ end
124
+ end
125
+
126
+ def test_set_sensors
127
+ sensors = SAAL::Sensors.new(@test_sensors_denkovi_file, TEST_DBCONF)
128
+ with_webrick(:html=>create_current_state_json(@rvals)) do |feedback|
129
+ @vals.each do |num, state|
130
+ newval = state == "ON" ? 0.0 : 1.0
131
+ newstate = state == "ON" ? "OFF" : "ON"
132
+ assert_equal newval, sensors.send('name'+num.to_s.rjust(2, "0")).write(newval),
133
+ "State change not working"
134
+ val = {"ON" => "1", "OFF" => "0"}[newstate]
135
+ assert_path "/current_state.json?pw=#{@pass}&Relay#{num}=#{val}", feedback[:uris][-2]
136
+ assert_path "/current_state.json?pw=#{@pass}", feedback[:uris][-1]
137
+ end
138
+ end
139
+ end
140
+
141
+ # Test that write invalidates any caching
142
+ def test_write_read_sensors
143
+ sensors = SAAL::Sensors.new(@test_sensors_denkovi_file, TEST_DBCONF)
144
+ with_webrick(:html=>create_current_state_json(@vals)) do |feedback|
145
+ @vals.each do |num, state|
146
+ sensors.send('name'+num.to_s.rjust(2, "0")).write(0.0)
147
+ sensors.send('name'+num.to_s.rjust(2, "0")).read
148
+ end
149
+ assert_equal 32, feedback[:nrequests], "denkovi caching too much"
150
+ end
151
+ end
152
+
153
+ # Test that the cache times out
154
+ def test_cache_invalidation
155
+ _sensors = SAAL::Sensors.new(@test_sensors_denkovi_file, TEST_DBCONF)
156
+ @og.cache_timeout = 0.1
157
+ with_webrick(:html=>create_current_state_json(@vals)) do |feedback|
158
+ @og.state(1)
159
+ sleep 0.2
160
+ @og.state(1)
161
+ assert_equal 2, feedback[:nrequests], "denkovi caching not invalidating"
162
+ end
163
+ end
164
+
165
+ def test_failed_connection
166
+ @vals.each do |num, state|
167
+ assert_equal nil, @og.state(num)
168
+ assert !@og.set_state(num,"ON"), "State change working without a server?!"
169
+ end
170
+ end
171
+
172
+ def test_failed_request
173
+ with_webrick(:html=>create_current_state_json(@vals),:status=>404) do |feedback|
174
+ @vals.each do |num, state|
175
+ assert_equal nil, @og.state(num)
176
+ assert !@og.set_state(num,"ON"), "State change working without a server?!"
177
+ end
178
+ end
179
+ end
180
+
181
+ def test_fast_open_timeout
182
+ #FIXME: Find a way to make this test address more generic
183
+ @og=SAAL::Denkovi::OutletGroup.new(service_opts.merge(:host => "10.254.254.254",
184
+ :timeout=>0.1))
185
+ with_webrick(:html=>create_current_state_json(@vals)) do |feedback|
186
+ time = Benchmark.measure do
187
+ @vals.each do |num, state|
188
+ assert_equal nil, @og.state(num), "Read not timing out?"
189
+ assert !@og.set_state(num,"ON"), "State change not timing out?"
190
+ end
191
+ end
192
+ total_time = @og.timeout*2*@vals.keys.size
193
+ assert time.total < total_time
194
+ "Doing the reads took too long, are we really timing out?"
195
+ end
196
+ end
197
+
198
+ def test_fast_read_timeout
199
+ @og=SAAL::Denkovi::OutletGroup.new(service_opts.merge(:timeout=>0.1))
200
+ with_webrick(:html=>create_current_state_json(@vals),:sleep=>10) do |feedback|
201
+ time = Benchmark.measure do
202
+ @vals.each do |num, state|
203
+ assert_equal nil, @og.state(num), "Read not timing out?"
204
+ assert !@og.set_state(num,"ON"), "State change not timing out?"
205
+ end
206
+ end
207
+ total_time = @og.timeout*2*@vals.keys.size
208
+ assert time.total < total_time
209
+ "Doing the reads took too long, are we really timing out?"
210
+ end
211
+ end
212
+ end
@@ -0,0 +1,39 @@
1
+ group1:
2
+ denkovi:
3
+ host: localhost
4
+ port: 33333
5
+ pass: somepass
6
+ outlets:
7
+ 1: name01
8
+ 2: name02
9
+ 3: name03
10
+ 4: name04
11
+ 5: name05
12
+ 6: name06
13
+ 7: name07
14
+ 8: name08
15
+ 9: name09
16
+ 10: name10
17
+ 11: name11
18
+ 12: name12
19
+ 13: name13
20
+ 14: name14
21
+ 15: name15
22
+ 16: name16
23
+ descriptions:
24
+ 1: description01
25
+ 2: description02
26
+ 3: description03
27
+ 4: description04
28
+ 5: description05
29
+ 6: description06
30
+ 7: description07
31
+ 8: description08
32
+ 9: description09
33
+ 10: description10
34
+ 11: description11
35
+ 12: description12
36
+ 13: description13
37
+ 14: description14
38
+ 15: description15
39
+ 16: description16
@@ -6,6 +6,7 @@ require File.dirname(__FILE__)+'/../lib/saal.rb'
6
6
  class Test::Unit::TestCase
7
7
  TEST_SENSORS_FILE = File.dirname(__FILE__)+'/test_sensors.yml'
8
8
  TEST_SENSORS_DINRELAY_FILE = File.dirname(__FILE__)+'/test_dinrelay_sensors.yml'
9
+ TEST_SENSORS_DENKOVI_FILE = File.dirname(__FILE__)+'/test_denkovi_sensors.yml'
9
10
  TEST_SENSOR_CLEANUPS_FILE = File.dirname(__FILE__)+'/test_sensor_cleanups.yml'
10
11
  TEST_NONEXIST_SENSOR_FILE = File.dirname(__FILE__)+'/nonexistant_sensor.yml'
11
12
  TEST_CHARTS_FILE = File.dirname(__FILE__)+'/test_charts.yml'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: saal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pedro Côrte-Real
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-25 00:00:00.000000000 Z
11
+ date: 2020-12-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ownet
@@ -76,6 +76,7 @@ executables:
76
76
  - saal_import_mysql
77
77
  - saal_dump_database
78
78
  - saal_readall
79
+ - saal_denkovi_relays
79
80
  - saal_chart
80
81
  - saal_daemon
81
82
  - saal_envoy_generate_config
@@ -94,6 +95,7 @@ files:
94
95
  - bin/dinrelaystatus
95
96
  - bin/saal_chart
96
97
  - bin/saal_daemon
98
+ - bin/saal_denkovi_relays
97
99
  - bin/saal_dump_database
98
100
  - bin/saal_envoy_generate_config
99
101
  - bin/saal_envoy_read
@@ -104,6 +106,7 @@ files:
104
106
  - lib/charts.rb
105
107
  - lib/daemon.rb
106
108
  - lib/dbstore.rb
109
+ - lib/denkovi.rb
107
110
  - lib/dinrelay.rb
108
111
  - lib/envoy.rb
109
112
  - lib/http.rb
@@ -118,6 +121,8 @@ files:
118
121
  - test/charts_test.rb
119
122
  - test/daemon_test.rb
120
123
  - test/dbstore_test.rb
124
+ - test/denkovi.json.erb
125
+ - test/denkovi_test.rb
121
126
  - test/dinrelay.html.erb
122
127
  - test/dinrelay_test.rb
123
128
  - test/nonexistant_sensor.yml
@@ -126,6 +131,7 @@ files:
126
131
  - test/sensors_test.rb
127
132
  - test/test_charts.yml
128
133
  - test/test_db.yml
134
+ - test/test_denkovi_sensors.yml
129
135
  - test/test_dinrelay_sensors.yml
130
136
  - test/test_helper.rb
131
137
  - test/test_sensor_cleanups.yml
@@ -164,6 +170,7 @@ test_files:
164
170
  - test/charts_test.rb
165
171
  - test/daemon_test.rb
166
172
  - test/dbstore_test.rb
173
+ - test/denkovi_test.rb
167
174
  - test/dinrelay_test.rb
168
175
  - test/outliercache_test.rb
169
176
  - test/sensor_test.rb