LanGrove 0.0.1 → 0.0.2

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.
Files changed (84) hide show
  1. data/.watchr +11 -3
  2. data/Rakefile +12 -5
  3. data/functional/.gitignore +1 -0
  4. data/{bin/datagram_example → functional/bin/datagram} +2 -0
  5. data/{config/environments/development.rb → functional/config/.gitignore} +0 -0
  6. data/{config → functional/config}/boot.rb +0 -0
  7. data/functional/config/daemons.yml +12 -0
  8. data/{config → functional/config}/environment.rb +0 -0
  9. data/{config/environments/production.rb → functional/config/environments/development.rb} +0 -0
  10. data/{config/environments/test.rb → functional/config/environments/production.rb} +0 -0
  11. data/{lib/jobs/Rakefile → functional/config/environments/test.rb} +0 -0
  12. data/functional/lib/daemon/datagram.rb +23 -0
  13. data/functional/lib/handler/socket_to_file.rb +36 -0
  14. data/functional/lib/protocol/socket_to_file.rb +55 -0
  15. data/{libexec → functional/libexec}/daemon.rb +14 -3
  16. data/functional/log/.gitignore +3 -0
  17. data/functional/tmp/README +1 -0
  18. data/lib/langrove.rb +1 -0
  19. data/lib/langrove/_base.rb +26 -0
  20. data/lib/langrove/adaptor/base.rb +3 -0
  21. data/lib/langrove/adaptor/datagram.rb +27 -0
  22. data/lib/langrove/adaptor_base.rb +89 -0
  23. data/lib/langrove/client/base.rb +2 -0
  24. data/lib/langrove/client/datagram.rb +28 -0
  25. data/lib/langrove/client_base.rb +114 -0
  26. data/lib/langrove/daemon/base.rb +2 -0
  27. data/lib/{daemon_base.rb → langrove/daemon_base.rb} +30 -23
  28. data/lib/langrove/ext.rb +7 -0
  29. data/lib/langrove/ext/class_loader.rb +146 -0
  30. data/lib/{ext → langrove/ext}/config_item.rb +4 -5
  31. data/lib/{ext → langrove/ext}/config_loader.rb +2 -2
  32. data/lib/langrove/ext/fake_logger.rb +8 -0
  33. data/lib/{ext → langrove/ext}/persistable.rb +2 -2
  34. data/lib/{ext → langrove/ext}/string.rb +0 -0
  35. data/lib/langrove/handler/base.rb +2 -0
  36. data/lib/{handler_base.rb → langrove/handler_base.rb} +25 -9
  37. data/lib/langrove/protocol/base.rb +2 -0
  38. data/lib/langrove/protocol/syslog.rb +32 -0
  39. data/lib/langrove/protocol_base.rb +32 -0
  40. data/lib/langrove/version.rb +3 -0
  41. data/spec/functional/daemon/datagram_spec.rb +115 -0
  42. data/spec/langrove/adaptor/datagram_spec.rb +6 -0
  43. data/spec/langrove/adaptor_base_spec.rb +48 -0
  44. data/spec/langrove/client/datagram_spec.rb +1 -0
  45. data/spec/langrove/client_base_spec.rb +5 -0
  46. data/spec/langrove/daemon_base_spec.rb +101 -0
  47. data/spec/langrove/ext/class_loader_spec.rb +83 -0
  48. data/spec/langrove/ext/config_item_spec.rb +81 -0
  49. data/spec/langrove/ext/config_loader_spec.rb +5 -0
  50. data/{tmp/TMP → spec/langrove/ext/fake_logger_spec.rb} +0 -0
  51. data/spec/{ext → langrove/ext}/persistable_spec.rb +8 -9
  52. data/spec/{ext → langrove/ext}/string_spec.rb +1 -1
  53. data/spec/langrove/handler_base_spec.rb +57 -0
  54. data/spec/langrove/protocol/syslog_spec.rb +45 -0
  55. data/spec/langrove/protocol_base_spec.rb +6 -0
  56. data/spec/todo_spec.rb +1 -2
  57. data/tmp/README +2 -0
  58. metadata +150 -46
  59. data/config/daemons.yml.tmpl +0 -78
  60. data/lib/adaptor/base.rb +0 -1
  61. data/lib/adaptor/datagram.rb +0 -20
  62. data/lib/adaptor/socket_handler.rb +0 -27
  63. data/lib/adaptor_base.rb +0 -39
  64. data/lib/client/base.rb +0 -1
  65. data/lib/client/puppet_state.rb +0 -74
  66. data/lib/client/radio_state.rb +0 -81
  67. data/lib/client_base.rb +0 -24
  68. data/lib/daemon/base.rb +0 -1
  69. data/lib/daemon/datagram_example.rb +0 -12
  70. data/lib/handler/base.rb +0 -1
  71. data/lib/handler/socket_to_file.rb +0 -30
  72. data/lib/jobs/jobs.rb +0 -1
  73. data/lib/jobs/updated_puppet_state.rb +0 -17
  74. data/lib/protocol_base.rb +0 -5
  75. data/spec/adaptor/datagram_spec.rb +0 -6
  76. data/spec/adaptor/socket_handler_spec.rb +0 -5
  77. data/spec/adaptor_base_spec.rb +0 -45
  78. data/spec/client_base_spec.rb +0 -5
  79. data/spec/daemon_base_spec.rb +0 -97
  80. data/spec/ext/config_item_spec.rb +0 -77
  81. data/spec/ext/config_loader_spec.rb +0 -5
  82. data/spec/functional/datagram_spec.rb +0 -122
  83. data/spec/handler_base_spec.rb +0 -71
  84. data/spec/protocol_base_spec.rb +0 -6
data/lib/adaptor/base.rb DELETED
@@ -1 +0,0 @@
1
- require 'adaptor_base'
@@ -1,20 +0,0 @@
1
- require 'adaptor/base'
2
-
3
- module Adaptor
4
-
5
- class Datagram < Base
6
-
7
- def listen( collection )
8
-
9
- @logger.info "starting listen at UDP #{@iface}:#{@port}"
10
-
11
- EventMachine::open_datagram_socket( @iface, @port,
12
-
13
- @connector ) do |connection|
14
-
15
- connection.handler = collection
16
-
17
- end
18
- end
19
- end
20
- end
@@ -1,27 +0,0 @@
1
- require 'eventmachine'
2
-
3
- module Adaptor
4
-
5
- class SocketHandler < EM::Connection
6
-
7
- #
8
- # The handler collection specified in config
9
- # is bound to this attribute after connect.
10
- #
11
- attr_accessor :handler
12
- attr_accessor :protocol
13
-
14
- def receive_data(data)
15
-
16
- #@handler.message( @protocol.decode( data ) )
17
- @handler.message( data )
18
-
19
- #
20
- # sort out application layer ACKs later
21
- # currently only datagrams arriving here
22
- # so it's not necessary
23
- #
24
-
25
- end
26
- end
27
- end
data/lib/adaptor_base.rb DELETED
@@ -1,39 +0,0 @@
1
- require 'eventmachine'
2
-
3
- require 'adaptor/socket_handler'
4
-
5
- module Adaptor
6
-
7
- class Base
8
-
9
- def initialize( config, logger )
10
-
11
- @config = config
12
- @logger = logger
13
-
14
- @iface = '127.0.0.1'
15
- @port = 12701
16
- @connector = Adaptor::SocketHandler
17
-
18
- @iface = @config['iface'] if @config.has_key? 'iface'
19
- @port = @config['port'] if @config.has_key? 'port'
20
-
21
- if @config.has_key? 'connector' then
22
-
23
- #
24
- # TODO: may need to override default connection handler
25
- #
26
-
27
- end
28
-
29
- end
30
-
31
- def listen( collection ) # ---> handler
32
-
33
- raise DaemonConfigException.new( "NotYetExtended: undefined listen()" )
34
-
35
- end
36
-
37
- end
38
-
39
- end
data/lib/client/base.rb DELETED
@@ -1 +0,0 @@
1
- require 'client_base'
@@ -1,74 +0,0 @@
1
- require 'client/abstract/syslog_state_machine'
2
-
3
- class PuppetState < SyslogStateMachine
4
-
5
- def initialize( hostname, config, logger )
6
- super
7
-
8
- @state[:exit_code] = nil
9
- @state[:last_run_at] = nil
10
- @state[:revision] = ''
11
- @state[:last_run_duration_seconds] = nil
12
-
13
- end
14
-
15
- def change_state( date, tag, message )
16
-
17
- #
18
- # return true if state changed
19
- #
20
-
21
- ### last_started_at
22
- #
23
- # run_puppet: obtained lock: beginning run
24
- #
25
- if /obtained lock: beginning run/.match( message ) then
26
-
27
- @state[:last_run_at] = date
28
- return true
29
-
30
- end
31
-
32
- def reset
33
-
34
- @state[:exit_code] = nil
35
-
36
- end
37
-
38
- ### revision
39
- #
40
- # puppet-git-rev: 0acbf0a78ed813e31dcc3fe58f9c6e9a30219da4
41
- #
42
- if tag == 'puppet-git-rev' then
43
-
44
- @state[:revision] = message
45
- return true
46
-
47
- end
48
-
49
- ### success
50
- ### last_run_duration_seconds
51
- #
52
- # run_puppet: completed, releasing lock (exit code : 2)
53
- #
54
-
55
- if /completed, releasing lock/.match( message ) then
56
-
57
- @state[:exit_code] = /[\d]+/.match(message)[0]
58
- @state[:running] = false
59
-
60
- if @state[:last_run_at] then
61
- @state[:last_run_duration_seconds] = date - @state[:last_run_at]
62
- else
63
- @state[:last_run_duration_seconds] = -1
64
- end
65
-
66
- return true
67
-
68
- end
69
-
70
- return false
71
-
72
- end
73
-
74
- end
@@ -1,81 +0,0 @@
1
- require 'client/abstract/syslog_state_machine'
2
-
3
- class RadioState < SyslogStateMachine
4
-
5
- def persist_change_state( data )
6
-
7
- #
8
- # default product will override with Nano *
9
- #
10
- @state[:vendor] = "BST"
11
- @state[:product] = "Subscriber"
12
-
13
- @state.merge!( data )
14
- @state[:last_seen_at] = data[:timestamp].clone
15
- @state[:last_seen] = data[:timestamp].strftime( '%Y/%m/%d %H:%M:%S')
16
-
17
-
18
- new_min :rx, :rx_min, :rx_min_at
19
- new_max :rx, :rx_max, :rx_max_at
20
-
21
- new_min :tx, :tx_min, :tx_min_at
22
- new_max :tx, :tx_max, :tx_max_at
23
-
24
- #
25
- # flag to store
26
- #
27
- @stored = false
28
-
29
- return true
30
-
31
- end
32
-
33
-
34
- def new_min( val, min_val, at )
35
-
36
- newval = @state[val].to_i
37
-
38
- if @state.has_key? min_val then
39
-
40
- minval = @state[min_val]
41
- begin
42
-
43
- @state[min_val] = newval
44
- @state[at] = @state[:timestamp].clone
45
-
46
- end if minval > newval
47
-
48
- else
49
-
50
- @state[min_val] = newval
51
- @state[at] = @state[:timestamp].clone
52
-
53
- end
54
-
55
- end
56
-
57
-
58
- def new_max( val, max_val, at )
59
-
60
- newval = @state[val].to_i
61
-
62
- if @state.has_key? max_val then
63
-
64
- maxval = @state[max_val]
65
- begin
66
-
67
- @state[max_val] = newval
68
- @state[at] = @state[:timestamp].clone
69
-
70
- end if maxval < newval
71
-
72
- else
73
-
74
- @state[max_val] = newval
75
- @state[at] = @state[:timestamp].clone
76
-
77
- end
78
-
79
- end
80
-
81
- end
data/lib/client_base.rb DELETED
@@ -1,24 +0,0 @@
1
- require 'ext/persistable'
2
-
3
- module Client class Base < Persistable
4
-
5
- #
6
- # Misnomer.
7
- #
8
- #
9
- # This is not the client,
10
- #
11
- #
12
- # It is the server's perspective of the client,
13
- #
14
- # These are generally stored in the daemon's
15
- # handler collection,
16
- #
17
- # Which contains this and all similar clients,
18
- #
19
- # Each bonded through the daemon's connection
20
- # adaptor to the socket that couples them to
21
- # their actual client..
22
- #
23
-
24
- end; end
data/lib/daemon/base.rb DELETED
@@ -1 +0,0 @@
1
- require 'daemon_base'
@@ -1,12 +0,0 @@
1
- require 'daemon/base'
2
-
3
- class DatagramExample < Daemon::Base
4
-
5
- #
6
- # Consider tossing this dependancy.
7
- #
8
- # Not entirely certain this layer in
9
- # the abstraction will be useful.
10
- #
11
-
12
- end
data/lib/handler/base.rb DELETED
@@ -1 +0,0 @@
1
- require 'handler_base'
@@ -1,30 +0,0 @@
1
- #
2
- # Mainly to facilitate functional tests
3
- #
4
-
5
- require 'handler/base'
6
-
7
- module Handler
8
-
9
- class SocketToFile < Base
10
-
11
- def message( data )
12
-
13
- @logger.debug( "Received: #{data}" )
14
-
15
- filename = data.split('|')[0]
16
- filecontents = data.split('|',2)[1]
17
-
18
- File.open( filename, 'w' ) do |f|
19
-
20
- f.write( filecontents )
21
-
22
- end
23
-
24
- @logger.debug "Wrote file: #{filename}"
25
-
26
- end
27
-
28
- end
29
-
30
- end
data/lib/jobs/jobs.rb DELETED
@@ -1 +0,0 @@
1
- require 'jobs/updated_puppet_state'
@@ -1,17 +0,0 @@
1
- class UpdatedPuppetState
2
-
3
- #
4
- # Name of the queue these jobs
5
- # are waiting in.
6
- #
7
- @queue = :updated_puppet_state
8
-
9
- def self.perform( id, parameters )
10
-
11
- #
12
- # Process for changes.
13
- #
14
-
15
- end
16
-
17
- end
data/lib/protocol_base.rb DELETED
@@ -1,5 +0,0 @@
1
- module Protocol class Base
2
-
3
-
4
-
5
- end; end
@@ -1,6 +0,0 @@
1
- require 'adaptor/datagram'
2
-
3
- describe Adaptor::Datagram do
4
-
5
-
6
- end
@@ -1,5 +0,0 @@
1
- require 'adaptor/socket_handler'
2
-
3
- describe Adaptor::SocketHandler do
4
-
5
- end
@@ -1,45 +0,0 @@
1
- require 'adaptor/base'
2
-
3
- require 'ext/fake_logger'
4
-
5
- describe Adaptor::Base do
6
-
7
- before :each do
8
-
9
- @logger = FakeLogger.new
10
-
11
- @extendhandler = 'ExtendedHandler'
12
-
13
- @config = {
14
-
15
- 'iface' => '111.111.111.111',
16
-
17
- 'port' => 11111,
18
-
19
- 'connector' => @extendhandler
20
-
21
- }
22
-
23
- end
24
-
25
- pending 'may need to override default connection handler' do
26
-
27
- Adaptor.const_set( @extendhandler, Class.new )
28
-
29
- subject = Adaptor::Base.new( @config, @logger )
30
- connector = subject.instance_variable_get( :@handler )
31
-
32
- connector.should be_a( Adaptor.const_get( @extendhandler ) )
33
-
34
- end
35
-
36
- it 'assigns defaults' do
37
-
38
- subject = Adaptor::Base.new( {}, @logger )
39
- connector = subject.instance_variable_get( :@connector )
40
-
41
- connector.should == Adaptor::SocketHandler
42
-
43
- end
44
-
45
- end
@@ -1,5 +0,0 @@
1
- require 'client_base'
2
-
3
- describe Client::Base do
4
-
5
- end
@@ -1,97 +0,0 @@
1
- require 'daemon_base'
2
-
3
- require 'ext/fake_logger'
4
-
5
- describe Daemon::Base do
6
-
7
- before :each do
8
-
9
- @logger = FakeLogger.new :silent
10
-
11
- @daemon_name = 'pretend_daemon'
12
-
13
- @adaptor_class = 'Base'
14
- @collection_class = 'Base'
15
-
16
- @config = {
17
-
18
- 'server' => false,
19
-
20
- 'daemons' => {
21
-
22
- 'pretend_daemon' => {
23
-
24
- 'adaptor' => {
25
-
26
- 'connection' => @adaptor_class
27
-
28
- },
29
-
30
- 'handler' => {
31
-
32
- 'collection' => @collection_class
33
-
34
- }
35
- }
36
- }
37
- }
38
-
39
- end
40
-
41
- subject do
42
-
43
- Daemon::Base.new( @config, @daemon_name, @logger )
44
-
45
- end
46
-
47
- it 'requires a logger' do
48
-
49
- expect {
50
-
51
- Daemon::Base.new( @config, @daemon_name, nil )
52
-
53
- }.to raise_error( DaemonConfigException, /Requires a logger/ )
54
-
55
- end
56
-
57
- it 'requires a configuration' do
58
-
59
- expect {
60
-
61
- Daemon::Base.new( {}, @daemon_name, @logger )
62
-
63
- }.to raise_error( DaemonConfigException, /Missing config item/ )
64
-
65
- end
66
-
67
- it 'latebinds an adaptor by config' do
68
-
69
- adaptor = subject.instance_variable_get( :@adaptor )
70
-
71
- adaptor.should be_a( Adaptor.const_get( @adaptor_class ) )
72
-
73
- end
74
-
75
- it 'latebinds a handler by config' do
76
-
77
- handler = subject.instance_variable_get( :@handler )
78
-
79
- handler.should be_a( Handler.const_get( @collection_class ) )
80
-
81
- end
82
-
83
- it 'it schedules periodics'
84
-
85
- it 'when run, it calls to listen if server is true' do
86
-
87
- expect {
88
-
89
- subject.instance_variable_set( :@server, true )
90
-
91
- subject.run
92
-
93
- }.to raise_error( DaemonConfigException, "NotYetExtended: undefined listen()" )
94
-
95
- end
96
-
97
- end