gom-sensor-ports 0.1.2 → 0.2.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 +7 -0
- data/.gitignore +7 -23
- data/Gemfile +4 -0
- data/Gemfile.lock +74 -0
- data/Guardfile +11 -0
- data/LICENSE +1 -1
- data/README.mkd +9 -5
- data/Rakefile +19 -13
- data/VERSION +1 -1
- data/autotest/discover.rb +1 -0
- data/bin/gom-sensor-port +28 -0
- data/bin/gom-sensor-ports +11 -2
- data/gom-sensor-ports.gemspec +46 -0
- data/lib/gom/sensor_port.rb +78 -0
- data/lib/gom/sensor_ports/version.rb +5 -0
- data/lib/gom/sensor_ports.rb +110 -0
- data/lib/gom-sensor-ports.rb +1 -3
- data/spec/lib/gom/sensor_port_spec.rb +52 -0
- data/spec/lib/gom/sensor_ports_spec.rb +65 -0
- data/spec/spec.opts +1 -1
- data/spec/spec_helper.rb +5 -5
- metadata +180 -105
- data/lib/gom-sensor-ports/sensor-ports.rb +0 -67
- data/spec/gom-sensor-ports/sensor-ports_spec.rb +0 -33
- data/spec/gom-sensor-ports_spec.rb +0 -7
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: b33f183a094f50f689b5e0f928e85f777cc35464
|
|
4
|
+
data.tar.gz: c68ddf9f61a70e16d275033d48b3e57e80736215
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 8ce8b07eba98e6ce221a9f0a909b443c0481ca4db7b6b90699d1358938d7adeb638af1238f9f78af4901a37ca2a785eaebe98e9721032a5a5bcec93ae2791d86
|
|
7
|
+
data.tar.gz: 494c09640086cd7fbbf35a02bcee854f75f96be502ecb952f1663a873f37ee618e0991fed2b84aa70449b91890b2bf158393e37198eb38c9f120eff2444424f1
|
data/.gitignore
CHANGED
|
@@ -1,27 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
# Ignore bundler config
|
|
2
|
+
/.bundle
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
tmtags
|
|
4
|
+
# Ignore the default SQLite database.
|
|
5
|
+
/db/*.sqlite3
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
.\#*
|
|
12
|
-
|
|
13
|
-
## VIM
|
|
14
|
-
*.swp
|
|
15
|
-
|
|
16
|
-
## PROJECT::GENERAL
|
|
17
|
-
coverage
|
|
18
|
-
rdoc
|
|
19
|
-
pkg
|
|
7
|
+
# Ignore all logfiles and tempfiles.
|
|
8
|
+
/log/*.log
|
|
9
|
+
/tmp
|
|
20
10
|
|
|
21
11
|
## PROJECT::SPECIFIC
|
|
22
|
-
*.sw?
|
|
23
|
-
.DS_Store
|
|
24
|
-
coverage
|
|
25
|
-
rdoc
|
|
26
|
-
pkg
|
|
27
|
-
*.gemspec
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
gom-sensor-ports (0.2.2)
|
|
5
|
+
daemons
|
|
6
|
+
gom-core (~> 0.2.2)
|
|
7
|
+
gom-script (~> 0.2.2)
|
|
8
|
+
|
|
9
|
+
GEM
|
|
10
|
+
remote: https://rubygems.org/
|
|
11
|
+
specs:
|
|
12
|
+
applix (0.4.10)
|
|
13
|
+
daemons
|
|
14
|
+
columnize (0.3.6)
|
|
15
|
+
daemons (1.0.10)
|
|
16
|
+
debugger (1.6.0)
|
|
17
|
+
columnize (>= 0.3.1)
|
|
18
|
+
debugger-linecache (~> 1.2.0)
|
|
19
|
+
debugger-ruby_core_source (~> 1.2.1)
|
|
20
|
+
debugger-linecache (1.2.0)
|
|
21
|
+
debugger-ruby_core_source (1.2.2)
|
|
22
|
+
diff-lcs (1.1.3)
|
|
23
|
+
fakeweb (1.3.0)
|
|
24
|
+
ffi (1.0.11)
|
|
25
|
+
gem_plugin (0.2.3)
|
|
26
|
+
gom-core (0.2.2)
|
|
27
|
+
gom-script (0.2.2)
|
|
28
|
+
applix
|
|
29
|
+
gom-core (~> 0.2.2)
|
|
30
|
+
json
|
|
31
|
+
mongrel (>= 1.2.0.pre2)
|
|
32
|
+
rack
|
|
33
|
+
growl (1.0.3)
|
|
34
|
+
guard (1.2.3)
|
|
35
|
+
listen (>= 0.4.2)
|
|
36
|
+
thor (>= 0.14.6)
|
|
37
|
+
guard-rspec (1.2.0)
|
|
38
|
+
guard (>= 1.1)
|
|
39
|
+
json (1.7.3)
|
|
40
|
+
listen (0.4.7)
|
|
41
|
+
rb-fchange (~> 0.0.5)
|
|
42
|
+
rb-fsevent (~> 0.9.1)
|
|
43
|
+
rb-inotify (~> 0.8.8)
|
|
44
|
+
mongrel (1.2.0.pre2)
|
|
45
|
+
daemons (~> 1.0.10)
|
|
46
|
+
gem_plugin (~> 0.2.3)
|
|
47
|
+
rack (1.4.1)
|
|
48
|
+
rb-fchange (0.0.5)
|
|
49
|
+
ffi
|
|
50
|
+
rb-fsevent (0.9.1)
|
|
51
|
+
rb-inotify (0.8.8)
|
|
52
|
+
ffi (>= 0.5.0)
|
|
53
|
+
rspec (2.11.0)
|
|
54
|
+
rspec-core (~> 2.11.0)
|
|
55
|
+
rspec-expectations (~> 2.11.0)
|
|
56
|
+
rspec-mocks (~> 2.11.0)
|
|
57
|
+
rspec-core (2.11.0)
|
|
58
|
+
rspec-expectations (2.11.1)
|
|
59
|
+
diff-lcs (~> 1.1.3)
|
|
60
|
+
rspec-mocks (2.11.1)
|
|
61
|
+
thor (0.15.4)
|
|
62
|
+
|
|
63
|
+
PLATFORMS
|
|
64
|
+
ruby
|
|
65
|
+
|
|
66
|
+
DEPENDENCIES
|
|
67
|
+
debugger
|
|
68
|
+
fakeweb
|
|
69
|
+
gom-sensor-ports!
|
|
70
|
+
growl
|
|
71
|
+
guard
|
|
72
|
+
guard-rspec
|
|
73
|
+
rspec
|
|
74
|
+
rspec-mocks
|
data/Guardfile
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# A sample Guardfile
|
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
|
3
|
+
|
|
4
|
+
guard 'rspec', :version => 2, :cli => '-d' do
|
|
5
|
+
watch(%r{^spec/.+_spec\.rb$})
|
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
|
7
|
+
|
|
8
|
+
watch('spec/spec_helper.rb') { "spec" }
|
|
9
|
+
watch('*.gemspec') { "spec" }
|
|
10
|
+
watch('Gemfile') { "spec" }
|
|
11
|
+
end
|
data/LICENSE
CHANGED
data/README.mkd
CHANGED
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
# gom-sensor-ports
|
|
2
|
-
|
|
3
|
-
Easy access over the wire to a remote GOM node. This gem includes a GNP
|
|
2
|
+
Easy UDP/TCP sensor data sending to a remote GOM node. This gem includes a GNP
|
|
4
3
|
callback server, support for automatic observer refreshments and command line
|
|
5
4
|
tools for reading, writing and observing GOM entries.
|
|
6
5
|
|
|
7
6
|
## Install
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
use the bundler tasks:
|
|
8
|
+
|
|
9
|
+
$ rake build install
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
optional:
|
|
12
|
+
|
|
13
|
+
$ rake release
|
|
12
14
|
|
|
13
15
|
## Dependencies
|
|
14
16
|
|
|
17
|
+
see Gemfile
|
|
18
|
+
|
|
15
19
|
## Note on Patches/Pull Requests
|
|
16
20
|
|
|
17
21
|
* Fork the project.
|
data/Rakefile
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
require '
|
|
2
|
-
|
|
1
|
+
require 'bundler'
|
|
2
|
+
Bundler::GemHelper.install_tasks
|
|
3
|
+
|
|
4
|
+
__END__
|
|
3
5
|
|
|
4
6
|
begin
|
|
5
7
|
require 'jeweler'
|
|
6
8
|
Jeweler::Tasks.new do |gem|
|
|
7
9
|
gem.name = "gom-sensor-ports"
|
|
8
10
|
gem.summary = %Q{
|
|
9
|
-
gateway for barebone TCP/
|
|
11
|
+
gateway for barebone TCP/UDP reporting sensors to GOM/HTTP protocoll
|
|
10
12
|
}
|
|
11
13
|
gem.description = %Q{
|
|
12
14
|
This gems implements a gateway server to allow barebone basic sensor
|
|
@@ -24,6 +26,7 @@ begin
|
|
|
24
26
|
|
|
25
27
|
gem.add_runtime_dependency "applix"
|
|
26
28
|
gem.add_runtime_dependency "gom-script"
|
|
29
|
+
gem.add_runtime_dependency "gom-core"
|
|
27
30
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
|
28
31
|
end
|
|
29
32
|
Jeweler::GemcutterTasks.new
|
|
@@ -31,16 +34,19 @@ rescue LoadError
|
|
|
31
34
|
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
|
32
35
|
end
|
|
33
36
|
|
|
34
|
-
require 'spec/rake/spectask'
|
|
35
|
-
Spec::Rake::SpecTask.new(:spec) do |spec|
|
|
36
|
-
spec.libs << 'lib' << 'spec'
|
|
37
|
-
spec.spec_files = FileList['spec/**/*_spec.rb']
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
spec.
|
|
42
|
-
spec.
|
|
43
|
-
|
|
37
|
+
#require 'spec/rake/spectask'
|
|
38
|
+
#Spec::Rake::SpecTask.new(:spec) do |spec|
|
|
39
|
+
# spec.libs << 'lib' << 'spec'
|
|
40
|
+
# spec.spec_files = FileList['spec/**/*_spec.rb']
|
|
41
|
+
#end
|
|
42
|
+
#Spec::Rake::SpecTask.new(:rcov) do |spec|
|
|
43
|
+
# spec.libs << 'lib' << 'spec'
|
|
44
|
+
# spec.pattern = 'spec/**/*_spec.rb'
|
|
45
|
+
# spec.rcov = true
|
|
46
|
+
#end
|
|
47
|
+
require 'rspec/core/rake_task'
|
|
48
|
+
RSpec::Core::RakeTask.new(:rcov) do |t|
|
|
49
|
+
t.rcov_opts = %q[--exclude "spec"]
|
|
44
50
|
end
|
|
45
51
|
|
|
46
52
|
task :spec => :check_dependencies
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.1
|
|
1
|
+
0.2.1
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Autotest.add_discovery { "rspec2" }
|
data/bin/gom-sensor-port
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'rubygems'
|
|
4
|
+
require 'applix'
|
|
5
|
+
|
|
6
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
|
7
|
+
require 'gom/sensor_port'
|
|
8
|
+
|
|
9
|
+
Defaults = { :verbose => false }
|
|
10
|
+
|
|
11
|
+
def usage
|
|
12
|
+
puts "#{__FILE__} serve <gom sensor node URL>"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
Applix.main(ARGV, Defaults) do
|
|
16
|
+
|
|
17
|
+
any { usage }
|
|
18
|
+
|
|
19
|
+
# example: gom-sensor-port serve /gom/sensors/udp
|
|
20
|
+
handle(:serve) do |*args, options|
|
|
21
|
+
puts "args: #{args.inspect}"
|
|
22
|
+
puts "opts: #{options}"
|
|
23
|
+
path, _ = *args
|
|
24
|
+
_, node_path = (Gom::Remote::Connection.init path)
|
|
25
|
+
gsp = Gom::SensorPort.new(node_path, options)
|
|
26
|
+
gsp.listen
|
|
27
|
+
end
|
|
28
|
+
end
|
data/bin/gom-sensor-ports
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
__END__
|
|
1
2
|
#!/usr/bin/env ruby
|
|
2
3
|
|
|
3
4
|
require 'rubygems'
|
|
@@ -23,7 +24,14 @@ def main argv
|
|
|
23
24
|
|
|
24
25
|
Gom::Remote::Daemon.new(sensor_url, options) do |daemon, path|
|
|
25
26
|
sp = Gom::SensorPorts.new path, options
|
|
26
|
-
daemon.sensor_loop
|
|
27
|
+
daemon.sensor_loop do
|
|
28
|
+
begin
|
|
29
|
+
sp.listen
|
|
30
|
+
rescue SignalException => e
|
|
31
|
+
Gom::Log.ex e, "shutting down on <#{e.class}>"
|
|
32
|
+
:stop
|
|
33
|
+
end
|
|
34
|
+
end
|
|
27
35
|
end
|
|
28
36
|
|
|
29
37
|
rescue Usage => e
|
|
@@ -34,7 +42,8 @@ usage: #{__FILE__} <sensor port URL>
|
|
|
34
42
|
## #{e}
|
|
35
43
|
TXT
|
|
36
44
|
rescue => e
|
|
37
|
-
|
|
45
|
+
Gom::Log.ex e
|
|
46
|
+
#puts " ## #{e}\n -> #{e.backtrace.join "\n "}"
|
|
38
47
|
end
|
|
39
48
|
|
|
40
49
|
main ARGV
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
+
require 'gom/sensor_ports/version'
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |s|
|
|
6
|
+
s.name = 'gom-sensor-ports'
|
|
7
|
+
s.version = Gom::SensorPorts::VERSION
|
|
8
|
+
s.authors = ['art+com/dirk luesebrink']
|
|
9
|
+
s.email = ['dirk.luesebrink@artcom.de']
|
|
10
|
+
s.homepage = 'http://github.com/crux/gom-sensor-ports'
|
|
11
|
+
s.summary = %q{
|
|
12
|
+
gateway for barebone TCP/UCP reporting sensors to GOM/HTTP protocoll
|
|
13
|
+
}
|
|
14
|
+
s.description = %q{
|
|
15
|
+
This gems implements a gateway server to allow barebone basic sensor
|
|
16
|
+
components to report state change updates as simple protocol free udates
|
|
17
|
+
over TCP/UDP ports without the 'overhead' of the HTTP protocoll. For
|
|
18
|
+
example, a power sensor might just broadcast a four byte floating point
|
|
19
|
+
binary number once every second to an UCP port
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
s.add_dependency 'daemons'
|
|
23
|
+
s.add_dependency 'gom-core', '~>0.2.2'
|
|
24
|
+
s.add_dependency 'gom-script', '~>0.2.2'
|
|
25
|
+
|
|
26
|
+
# development section
|
|
27
|
+
#
|
|
28
|
+
s.add_development_dependency 'rspec'
|
|
29
|
+
s.add_development_dependency 'rspec-mocks'
|
|
30
|
+
s.add_development_dependency 'fakeweb'
|
|
31
|
+
s.add_development_dependency 'guard'
|
|
32
|
+
s.add_development_dependency 'guard-rspec'
|
|
33
|
+
s.add_development_dependency 'growl'
|
|
34
|
+
if RUBY_PLATFORM.match /java/i
|
|
35
|
+
s.add_development_dependency 'ruby-debug'
|
|
36
|
+
else
|
|
37
|
+
s.add_development_dependency 'debugger'
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
s.files = `git ls-files`.split("\n")
|
|
41
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
42
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map do |f|
|
|
43
|
+
File.basename(f)
|
|
44
|
+
end
|
|
45
|
+
s.require_paths = ["lib"]
|
|
46
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
require 'socket'
|
|
2
|
+
require 'applix/oattr'
|
|
3
|
+
require 'gom/remote'
|
|
4
|
+
|
|
5
|
+
module Gom
|
|
6
|
+
class SensorPort
|
|
7
|
+
|
|
8
|
+
# GOM default Logger instance
|
|
9
|
+
Log = Gom::Logger.new
|
|
10
|
+
|
|
11
|
+
Defaults = {
|
|
12
|
+
:interface => '0.0.0.0',
|
|
13
|
+
:port => 44470,
|
|
14
|
+
:mode => :udp,
|
|
15
|
+
:verbose => false,
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
include OAttr
|
|
19
|
+
oattr :interface, :port, :mode
|
|
20
|
+
|
|
21
|
+
def initialize path, options = {}
|
|
22
|
+
@path = path
|
|
23
|
+
@options = Defaults.merge(find_gom_node @path).merge(options)
|
|
24
|
+
#puts " -- new sensor port: #{self.inspect}"
|
|
25
|
+
|
|
26
|
+
verbose? and (Log.level = ::Logger::DEBUG)
|
|
27
|
+
Log.info "new sensor port: #{self.inspect}"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def verbose?
|
|
31
|
+
@options[:verbose] || @options[:v]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def listen
|
|
35
|
+
#puts " -- listen: #{self.inspect}"
|
|
36
|
+
Log.info "listen: #{self.inspect}"
|
|
37
|
+
self.send "listen_#{mode}"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def listen_udp
|
|
41
|
+
socket = UDPSocket.new
|
|
42
|
+
socket.bind(interface, port)
|
|
43
|
+
loop do
|
|
44
|
+
line, source = socket.recvfrom(1024)
|
|
45
|
+
dispatch_sensor_message line, source
|
|
46
|
+
end
|
|
47
|
+
ensure
|
|
48
|
+
socket.close rescue nil
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def listen_tcp
|
|
52
|
+
raise "not yet implemented"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def dispatch_sensor_message line, source = nil
|
|
56
|
+
line.strip!
|
|
57
|
+
Log.debug "-->#{line}<-- #{source.inspect}"
|
|
58
|
+
key, value = (line.split /\s*[:=]\s*/)
|
|
59
|
+
value.nil? or value.strip!
|
|
60
|
+
# TODO: val might need type conversion
|
|
61
|
+
Gom::Remote.connection.write "#{@path}:raw", line
|
|
62
|
+
Gom::Remote.connection.write "#{@path}/values:#{key}", value
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# TODO: temporarily here from gom-script
|
|
66
|
+
def find_gom_node path
|
|
67
|
+
json = (Gom::Remote.connection.read "#{path}.json")
|
|
68
|
+
(JSON.parse json)["node"]["entries"].select do |entry|
|
|
69
|
+
# 1. select attribute entries
|
|
70
|
+
entry.has_key? "attribute"
|
|
71
|
+
end.inject({}) do |h, a|
|
|
72
|
+
# 2. make it a key, value list
|
|
73
|
+
h[a["attribute"]["name"].to_sym] = a["attribute"]["value"]
|
|
74
|
+
h
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
__END__
|
|
2
|
+
require 'applix/oattr'
|
|
3
|
+
require 'gom/remote'
|
|
4
|
+
require 'gom/log'
|
|
5
|
+
require 'gom/sensor_port'
|
|
6
|
+
require 'gom/sensor_ports/version'
|
|
7
|
+
|
|
8
|
+
module Gom
|
|
9
|
+
class SensorPorts #< Gom::Remote::Entry
|
|
10
|
+
|
|
11
|
+
Defaults = {
|
|
12
|
+
:logfile => '-',
|
|
13
|
+
:interface => '0.0.0.0',
|
|
14
|
+
:sensor_port => 76001,
|
|
15
|
+
:mode => :udp,
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
include OAttr
|
|
19
|
+
oattr :logfile, :interface, :sensor_port, :mode
|
|
20
|
+
|
|
21
|
+
# TODO: temporarily here from gom-script
|
|
22
|
+
def find_gom_node path
|
|
23
|
+
json = (Gom::Remote.connection.read "#{path}.json")
|
|
24
|
+
(JSON.parse json)["node"]["entries"].select do |entry|
|
|
25
|
+
# 1. select attribute entries
|
|
26
|
+
entry.has_key? "attribute"
|
|
27
|
+
end.inject({}) do |h, a|
|
|
28
|
+
# 2. make it a key, value list
|
|
29
|
+
h[a["attribute"]["name"].to_sym] = a["attribute"]["value"]
|
|
30
|
+
h
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def initialize path, options = {}
|
|
35
|
+
@path = path
|
|
36
|
+
@options = Defaults.merge(find_gom_node @path).merge(options)
|
|
37
|
+
#puts " -- new sensor port: #{self.inspect}"
|
|
38
|
+
Log.info "new sensor port: #{self.inspect}"
|
|
39
|
+
|
|
40
|
+
#redirect_to logfile
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def serve *args#path, opts = {}
|
|
44
|
+
Log.info "listen: #{self.inspect}"
|
|
45
|
+
self.send "listen_#{mode}"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def listen
|
|
49
|
+
#puts " -- listen: #{self.inspect}"
|
|
50
|
+
Log.info "listen: #{self.inspect}"
|
|
51
|
+
self.send "listen_#{mode}"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def listen_udp
|
|
55
|
+
socket = UDPSocket.new
|
|
56
|
+
socket.bind(interface, sensor_port)
|
|
57
|
+
loop do
|
|
58
|
+
line, source = socket.recvfrom(1024)
|
|
59
|
+
dispatch_sensor_message line, source
|
|
60
|
+
end
|
|
61
|
+
ensure
|
|
62
|
+
socket.close rescue nil
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def listen_tcp
|
|
66
|
+
raise "not yet implemented"
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def dispatch_sensor_message line, source = nil
|
|
70
|
+
line.strip!
|
|
71
|
+
Log.debug "-->#{line}<-- #{source.inspect}"
|
|
72
|
+
key, value = (line.split /\s*[:=]\s*/)
|
|
73
|
+
value.nil? or value.strip!
|
|
74
|
+
# TODO: val might need type conversion
|
|
75
|
+
Gom::Remote.connection.write "#{@path}:last_sensor_message", line
|
|
76
|
+
Gom::Remote.connection.write "#{@path}/keys:#{key}", value
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def status
|
|
80
|
+
Log.debug @options.inspect
|
|
81
|
+
"not implemented"
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# TODO: must go into gom-script gem
|
|
85
|
+
def redirect_to logfile
|
|
86
|
+
#(@logfile_fd && @logfile_fd.close) rescue nil
|
|
87
|
+
Log.debug "redirecting stdout/stderr to: #{logfile}"
|
|
88
|
+
if logfile == '-'
|
|
89
|
+
# redirect output back to original stdout/err stream can only be done
|
|
90
|
+
# after a previous call has stored them in @stdout/@stderr member
|
|
91
|
+
# variables
|
|
92
|
+
if (@stdout && @stderr)
|
|
93
|
+
#$stdout, $stderr = @stdout, @stderr
|
|
94
|
+
STDOUT.reopen @stdout
|
|
95
|
+
STDERR.reopen @stderr
|
|
96
|
+
end
|
|
97
|
+
else
|
|
98
|
+
#@stdout, @stderr = STDOUT, STDERR #$stdout, $stderr
|
|
99
|
+
#@logfile_fd = File.open(logfile, File::WRONLY|File::APPEND|File::CREAT)
|
|
100
|
+
#@logfile_fd.sync = true
|
|
101
|
+
##$stderr = $stdout = @logfile_fd
|
|
102
|
+
@stdout, @stderr = STDOUT.clone, STDERR.clone
|
|
103
|
+
STDOUT.reopen logfile, 'a+'
|
|
104
|
+
STDERR.reopen logfile, 'a+'
|
|
105
|
+
end
|
|
106
|
+
# first line after redirect
|
|
107
|
+
Log.info "daemon logile redirect at #{Time.now}"
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
data/lib/gom-sensor-ports.rb
CHANGED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "Gom::SensorPort" do
|
|
4
|
+
context "given no options" do
|
|
5
|
+
|
|
6
|
+
let(:path) { '/gom-sensor-port' }
|
|
7
|
+
let(:station) { Gom::SensorPort.new "#{path}" }
|
|
8
|
+
let(:json) { <<-JSON
|
|
9
|
+
{
|
|
10
|
+
"node": {
|
|
11
|
+
"uri": "#{path}",
|
|
12
|
+
"entries": [
|
|
13
|
+
{ "attribute": {
|
|
14
|
+
"name": "status",
|
|
15
|
+
"node": "#{path}",
|
|
16
|
+
"value": "<void>", "type": "string"
|
|
17
|
+
} }
|
|
18
|
+
]
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
JSON
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
before :each do
|
|
25
|
+
($gom.stub! :read).with("#{path}.json").and_return(json)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe "#dispatch_sensor_message" do
|
|
29
|
+
it "writes sensor value to gom" do
|
|
30
|
+
$gom.should_receive(:write).
|
|
31
|
+
with("#{path}:raw", "foo:123")
|
|
32
|
+
$gom.should_receive(:write).
|
|
33
|
+
with("#{path}/values:foo", "123")
|
|
34
|
+
station.dispatch_sensor_message "foo:123"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
describe ".initialize" do
|
|
39
|
+
it "has a default interface" do
|
|
40
|
+
station.interface.should == '0.0.0.0'
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "defaults to udp mode" do
|
|
44
|
+
station.mode.should == :udp
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "configures sensor port on 76001" do
|
|
48
|
+
station.port.should == 44470
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
__END__
|
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
|
3
|
+
|
|
4
|
+
describe "Gom::SensorPorts" do
|
|
5
|
+
context "given no options" do
|
|
6
|
+
|
|
7
|
+
NODE = '/gom-sensor-ports'
|
|
8
|
+
|
|
9
|
+
before :each do
|
|
10
|
+
($gom.stub! :read).with("#{NODE}.json").and_return(<<-JSON)
|
|
11
|
+
{
|
|
12
|
+
"node": {
|
|
13
|
+
"uri": "#{NODE}",
|
|
14
|
+
"entries": [
|
|
15
|
+
{ "attribute": {
|
|
16
|
+
"name": "status",
|
|
17
|
+
"node": "#{NODE}",
|
|
18
|
+
"value": "<void>", "type": "string"
|
|
19
|
+
} }
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
JSON
|
|
24
|
+
@station = Gom::SensorPorts.new "#{NODE}"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
#describe "#listen_tcp" do
|
|
28
|
+
# expect { @station.listen_tcp }.to raise_error#(ActiveRecord::RecordNotFound)
|
|
29
|
+
#end
|
|
30
|
+
|
|
31
|
+
describe "#dispatch_sensor_message" do
|
|
32
|
+
it "writes sensor value to gom" do
|
|
33
|
+
$gom.should_receive(:write).
|
|
34
|
+
with("#{NODE}:last_sensor_message", "foo:123")
|
|
35
|
+
$gom.should_receive(:write).
|
|
36
|
+
with("#{NODE}/keys:foo", "123")
|
|
37
|
+
@station.dispatch_sensor_message "foo:123"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
describe ".initialize" do
|
|
42
|
+
it "has a default interface" do
|
|
43
|
+
@station.interface.should == '0.0.0.0'
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "logs to stdout" do
|
|
47
|
+
@station.logfile.should == '-'
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "defaults to udp mode" do
|
|
51
|
+
@station.mode.should == :udp
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "configures sensor port on 76001" do
|
|
55
|
+
@station.sensor_port.should == 76001
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
describe "#status" do
|
|
60
|
+
it "dumps status to stdout" do
|
|
61
|
+
@station.status.should be
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
data/spec/spec.opts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
--
|
|
1
|
+
--debugger
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#$:.unshift(File.dirname(__FILE__))
|
|
2
2
|
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
3
|
-
require 'rubygems'
|
|
4
|
-
require 'gom-sensor-ports'
|
|
5
|
-
require 'spec'
|
|
6
|
-
require 'spec/autorun'
|
|
7
3
|
require 'fakeweb'
|
|
4
|
+
require 'gom/sensor_port'
|
|
8
5
|
|
|
9
|
-
|
|
6
|
+
RSpec.configure do |config|
|
|
10
7
|
config.before :each do
|
|
11
8
|
FakeWeb.allow_net_connect = false
|
|
9
|
+
|
|
10
|
+
$gom = Gom::Remote.connection = Object.new
|
|
11
|
+
(Gom::Remote::Connection.stub! :new).and_return $gom
|
|
12
12
|
end
|
|
13
13
|
end
|
metadata
CHANGED
|
@@ -1,140 +1,215 @@
|
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: gom-sensor-ports
|
|
3
|
-
version: !ruby/object:Gem::Version
|
|
4
|
-
|
|
5
|
-
prerelease: false
|
|
6
|
-
segments:
|
|
7
|
-
- 0
|
|
8
|
-
- 1
|
|
9
|
-
- 2
|
|
10
|
-
version: 0.1.2
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.2.3
|
|
11
5
|
platform: ruby
|
|
12
|
-
authors:
|
|
13
|
-
- art+com
|
|
6
|
+
authors:
|
|
7
|
+
- art+com/dirk luesebrink
|
|
14
8
|
autorequire:
|
|
15
9
|
bindir: bin
|
|
16
10
|
cert_chain: []
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
11
|
+
date: 2013-05-30 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: daemons
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - '>='
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - '>='
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: gom-core
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ~>
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: 0.2.2
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ~>
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: 0.2.2
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: gom-script
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ~>
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: 0.2.2
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ~>
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: 0.2.2
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
22
56
|
name: rspec
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - '>='
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
62
|
+
type: :development
|
|
23
63
|
prerelease: false
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - '>='
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: rspec-mocks
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - '>='
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0'
|
|
35
76
|
type: :development
|
|
36
|
-
|
|
37
|
-
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - '>='
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
38
84
|
name: fakeweb
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - '>='
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '0'
|
|
90
|
+
type: :development
|
|
39
91
|
prerelease: false
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - '>='
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '0'
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: guard
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - '>='
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '0'
|
|
49
104
|
type: :development
|
|
50
|
-
version_requirements: *id002
|
|
51
|
-
- !ruby/object:Gem::Dependency
|
|
52
|
-
name: applix
|
|
53
105
|
prerelease: false
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - '>='
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '0'
|
|
111
|
+
- !ruby/object:Gem::Dependency
|
|
112
|
+
name: guard-rspec
|
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
|
114
|
+
requirements:
|
|
115
|
+
- - '>='
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: '0'
|
|
118
|
+
type: :development
|
|
67
119
|
prerelease: false
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
requirements:
|
|
122
|
+
- - '>='
|
|
123
|
+
- !ruby/object:Gem::Version
|
|
124
|
+
version: '0'
|
|
125
|
+
- !ruby/object:Gem::Dependency
|
|
126
|
+
name: growl
|
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
|
128
|
+
requirements:
|
|
129
|
+
- - '>='
|
|
130
|
+
- !ruby/object:Gem::Version
|
|
131
|
+
version: '0'
|
|
132
|
+
type: :development
|
|
133
|
+
prerelease: false
|
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
135
|
+
requirements:
|
|
136
|
+
- - '>='
|
|
137
|
+
- !ruby/object:Gem::Version
|
|
138
|
+
version: '0'
|
|
139
|
+
- !ruby/object:Gem::Dependency
|
|
140
|
+
name: debugger
|
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
|
142
|
+
requirements:
|
|
143
|
+
- - '>='
|
|
144
|
+
- !ruby/object:Gem::Version
|
|
145
|
+
version: '0'
|
|
146
|
+
type: :development
|
|
147
|
+
prerelease: false
|
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
149
|
+
requirements:
|
|
150
|
+
- - '>='
|
|
151
|
+
- !ruby/object:Gem::Version
|
|
152
|
+
version: '0'
|
|
153
|
+
description: " \n This gems implements a gateway server to allow barebone basic
|
|
154
|
+
sensor\n components to report state change updates as simple protocol free udates\n
|
|
155
|
+
\ over TCP/UDP ports without the 'overhead' of the HTTP protocoll. For\n example,
|
|
156
|
+
a power sensor might just broadcast a four byte floating point\n binary number
|
|
157
|
+
once every second to an UCP port\n "
|
|
158
|
+
email:
|
|
159
|
+
- dirk.luesebrink@artcom.de
|
|
160
|
+
executables:
|
|
161
|
+
- gom-sensor-port
|
|
82
162
|
- gom-sensor-ports
|
|
83
163
|
extensions: []
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
- LICENSE
|
|
87
|
-
- README.mkd
|
|
88
|
-
files:
|
|
164
|
+
extra_rdoc_files: []
|
|
165
|
+
files:
|
|
89
166
|
- .document
|
|
90
167
|
- .gitignore
|
|
168
|
+
- Gemfile
|
|
169
|
+
- Gemfile.lock
|
|
170
|
+
- Guardfile
|
|
91
171
|
- LICENSE
|
|
92
172
|
- README.mkd
|
|
93
173
|
- Rakefile
|
|
94
174
|
- VERSION
|
|
175
|
+
- autotest/discover.rb
|
|
176
|
+
- bin/gom-sensor-port
|
|
95
177
|
- bin/gom-sensor-ports
|
|
96
178
|
- etc/gom-sensor-ports-debian-init-script
|
|
179
|
+
- gom-sensor-ports.gemspec
|
|
97
180
|
- lib/gom-sensor-ports.rb
|
|
98
|
-
- lib/gom
|
|
99
|
-
-
|
|
100
|
-
-
|
|
181
|
+
- lib/gom/sensor_port.rb
|
|
182
|
+
- lib/gom/sensor_ports.rb
|
|
183
|
+
- lib/gom/sensor_ports/version.rb
|
|
184
|
+
- spec/lib/gom/sensor_port_spec.rb
|
|
185
|
+
- spec/lib/gom/sensor_ports_spec.rb
|
|
101
186
|
- spec/spec.opts
|
|
102
187
|
- spec/spec_helper.rb
|
|
103
|
-
has_rdoc: true
|
|
104
188
|
homepage: http://github.com/crux/gom-sensor-ports
|
|
105
189
|
licenses: []
|
|
106
|
-
|
|
190
|
+
metadata: {}
|
|
107
191
|
post_install_message:
|
|
108
|
-
rdoc_options:
|
|
109
|
-
|
|
110
|
-
require_paths:
|
|
192
|
+
rdoc_options: []
|
|
193
|
+
require_paths:
|
|
111
194
|
- lib
|
|
112
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
none: false
|
|
123
|
-
requirements:
|
|
124
|
-
- - ">="
|
|
125
|
-
- !ruby/object:Gem::Version
|
|
126
|
-
hash: 3
|
|
127
|
-
segments:
|
|
128
|
-
- 0
|
|
129
|
-
version: "0"
|
|
195
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
196
|
+
requirements:
|
|
197
|
+
- - '>='
|
|
198
|
+
- !ruby/object:Gem::Version
|
|
199
|
+
version: '0'
|
|
200
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
201
|
+
requirements:
|
|
202
|
+
- - '>='
|
|
203
|
+
- !ruby/object:Gem::Version
|
|
204
|
+
version: '0'
|
|
130
205
|
requirements: []
|
|
131
|
-
|
|
132
206
|
rubyforge_project:
|
|
133
|
-
rubygems_version:
|
|
207
|
+
rubygems_version: 2.0.3
|
|
134
208
|
signing_key:
|
|
135
|
-
specification_version:
|
|
209
|
+
specification_version: 4
|
|
136
210
|
summary: gateway for barebone TCP/UCP reporting sensors to GOM/HTTP protocoll
|
|
137
|
-
test_files:
|
|
138
|
-
- spec/gom
|
|
139
|
-
- spec/gom
|
|
211
|
+
test_files:
|
|
212
|
+
- spec/lib/gom/sensor_port_spec.rb
|
|
213
|
+
- spec/lib/gom/sensor_ports_spec.rb
|
|
214
|
+
- spec/spec.opts
|
|
140
215
|
- spec/spec_helper.rb
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
module Gom
|
|
2
|
-
class SensorPorts < Gom::Remote::Entry
|
|
3
|
-
|
|
4
|
-
Defaults = {
|
|
5
|
-
:logfile => '-',
|
|
6
|
-
:interface => '0.0.0.0',
|
|
7
|
-
:sensor_port => 76001,
|
|
8
|
-
:mode => :udp,
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
include OAttr
|
|
12
|
-
oattr :logfile, :interface, :sensor_port, :mode
|
|
13
|
-
|
|
14
|
-
def initialize path, options = {}
|
|
15
|
-
@path = path
|
|
16
|
-
@options = Defaults.merge(gnode @path).merge(options)
|
|
17
|
-
puts " -- new sensor port: #{self.inspect}"
|
|
18
|
-
|
|
19
|
-
redirect_to logfile
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def listen
|
|
23
|
-
puts " -- listen: #{self.inspect}"
|
|
24
|
-
self.send "listen_#{mode}"
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def listen_udp
|
|
28
|
-
socket = UDPSocket.new
|
|
29
|
-
socket.bind(interface, sensor_port)
|
|
30
|
-
loop do
|
|
31
|
-
val, sender = socket.recvfrom(1024)
|
|
32
|
-
puts "-->#{val}<-- #{sender.inspect}"
|
|
33
|
-
connection.write "#{@path}:current_value", val.to_s
|
|
34
|
-
end
|
|
35
|
-
ensure
|
|
36
|
-
socket.close rescue nil
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def status
|
|
40
|
-
puts @options.inspect
|
|
41
|
-
#t = Net::Telnet::new(
|
|
42
|
-
# "Host" => device_ip, "Timeout" => 10, "Prompt" => /[$%#>] \z/n
|
|
43
|
-
#)
|
|
44
|
-
#t.login(user, password) { |c| puts c }
|
|
45
|
-
"not implemented"
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def redirect_to logfile
|
|
49
|
-
(@logfile_fd && @logfile_fd.close) rescue nil
|
|
50
|
-
puts " -- redirecting stdout/stderr to: #{logfile}"
|
|
51
|
-
if logfile == '-'
|
|
52
|
-
if @stdout
|
|
53
|
-
$stderr, $stdout = @stdout, @stderr
|
|
54
|
-
end
|
|
55
|
-
else
|
|
56
|
-
@stderr, @stdout = $stdout, $stderr
|
|
57
|
-
@logfile_fd = File.open(logfile, File::WRONLY|File::APPEND|File::CREAT)
|
|
58
|
-
@logfile_fd.sync = true
|
|
59
|
-
$stderr = $stdout = @logfile_fd
|
|
60
|
-
end
|
|
61
|
-
# first line after redirect
|
|
62
|
-
puts " -- daemon logile redirect at #{Time.now}"
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
|
2
|
-
|
|
3
|
-
describe "Gom::SensorPorts" do
|
|
4
|
-
|
|
5
|
-
before :each do
|
|
6
|
-
$gom = Gom::Remote.connection = Object.new
|
|
7
|
-
(Gom::Remote::Connection.stub! :new).and_return $gom
|
|
8
|
-
($gom.stub! :read).with('/gom/sensor-ports.json').and_return(<<-JSON)
|
|
9
|
-
{
|
|
10
|
-
"node": {
|
|
11
|
-
"uri": "/services/viko/work",
|
|
12
|
-
"mtime": "2010-01-06T15:14:57+01:00",
|
|
13
|
-
"ctime": "2010-01-06T15:14:57+01:00",
|
|
14
|
-
"entries": [
|
|
15
|
-
{ "attribute": {
|
|
16
|
-
"name": "status",
|
|
17
|
-
"node": "/services/viko/work",
|
|
18
|
-
"value": "<void>",
|
|
19
|
-
"type": "string",
|
|
20
|
-
"mtime": "2010-01-07T19:30:36+01:00",
|
|
21
|
-
"ctime": "2010-01-07T19:30:36+01:00"
|
|
22
|
-
} }
|
|
23
|
-
]
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
JSON
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
it "should dump status" do
|
|
30
|
-
station = Gom::SensorPorts.new '/gom/sensor-ports'
|
|
31
|
-
station.status.should_not == nil
|
|
32
|
-
end
|
|
33
|
-
end
|