LanGrove 0.0.1 → 0.0.2

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