siffer 0.0.4

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 (91) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +65 -0
  3. data/Rakefile +64 -0
  4. data/bin/siffer +71 -0
  5. data/doc/SIF ImplementationSpecification.pdf +0 -0
  6. data/doc/rdoc/classes/Siffer.html +374 -0
  7. data/doc/rdoc/classes/Siffer/Agent.html +296 -0
  8. data/doc/rdoc/classes/Siffer/Container.html +286 -0
  9. data/doc/rdoc/classes/Siffer/Messages.html +141 -0
  10. data/doc/rdoc/classes/Siffer/Messages/Ack.html +216 -0
  11. data/doc/rdoc/classes/Siffer/Messages/Acl.html +160 -0
  12. data/doc/rdoc/classes/Siffer/Messages/Error.html +248 -0
  13. data/doc/rdoc/classes/Siffer/Messages/Message.html +359 -0
  14. data/doc/rdoc/classes/Siffer/Messages/Message/Header.html +181 -0
  15. data/doc/rdoc/classes/Siffer/Messages/Register.html +257 -0
  16. data/doc/rdoc/classes/Siffer/Messages/RequestBody.html +300 -0
  17. data/doc/rdoc/classes/Siffer/Messages/Status.html +269 -0
  18. data/doc/rdoc/classes/Siffer/Messaging.html +331 -0
  19. data/doc/rdoc/classes/Siffer/Protocol.html +388 -0
  20. data/doc/rdoc/classes/Siffer/Protocol/NonPostRequest.html +111 -0
  21. data/doc/rdoc/classes/Siffer/Protocol/UnknownPath.html +111 -0
  22. data/doc/rdoc/classes/Siffer/Registration.html +391 -0
  23. data/doc/rdoc/classes/Siffer/Request.html +209 -0
  24. data/doc/rdoc/classes/Siffer/RequestLogger.html +211 -0
  25. data/doc/rdoc/classes/Siffer/Response.html +182 -0
  26. data/doc/rdoc/classes/Siffer/Server.html +242 -0
  27. data/doc/rdoc/created.rid +1 -0
  28. data/doc/rdoc/files/LICENSE.html +129 -0
  29. data/doc/rdoc/files/README_rdoc.html +184 -0
  30. data/doc/rdoc/files/lib/agent_rb.html +101 -0
  31. data/doc/rdoc/files/lib/container_rb.html +108 -0
  32. data/doc/rdoc/files/lib/messages/ack_rb.html +101 -0
  33. data/doc/rdoc/files/lib/messages/acl_rb.html +101 -0
  34. data/doc/rdoc/files/lib/messages/error_rb.html +101 -0
  35. data/doc/rdoc/files/lib/messages/message_rb.html +101 -0
  36. data/doc/rdoc/files/lib/messages/register_rb.html +101 -0
  37. data/doc/rdoc/files/lib/messages/request_body_rb.html +101 -0
  38. data/doc/rdoc/files/lib/messages/status_rb.html +101 -0
  39. data/doc/rdoc/files/lib/messages_rb.html +114 -0
  40. data/doc/rdoc/files/lib/messaging_rb.html +101 -0
  41. data/doc/rdoc/files/lib/protocol_rb.html +101 -0
  42. data/doc/rdoc/files/lib/registration_rb.html +101 -0
  43. data/doc/rdoc/files/lib/request_logger_rb.html +101 -0
  44. data/doc/rdoc/files/lib/request_rb.html +101 -0
  45. data/doc/rdoc/files/lib/response_rb.html +101 -0
  46. data/doc/rdoc/files/lib/server_rb.html +101 -0
  47. data/doc/rdoc/files/lib/siffer_rb.html +115 -0
  48. data/doc/rdoc/fr_class_index.html +47 -0
  49. data/doc/rdoc/fr_file_index.html +46 -0
  50. data/doc/rdoc/fr_method_index.html +96 -0
  51. data/doc/rdoc/index.html +24 -0
  52. data/doc/rdoc/rdoc-style.css +208 -0
  53. data/lib/agent.rb +43 -0
  54. data/lib/container.rb +96 -0
  55. data/lib/messages.rb +7 -0
  56. data/lib/messages/ack.rb +43 -0
  57. data/lib/messages/acl.rb +25 -0
  58. data/lib/messages/error.rb +174 -0
  59. data/lib/messages/message.rb +71 -0
  60. data/lib/messages/register.rb +60 -0
  61. data/lib/messages/request_body.rb +66 -0
  62. data/lib/messages/status.rb +55 -0
  63. data/lib/messaging.rb +96 -0
  64. data/lib/protocol.rb +159 -0
  65. data/lib/registration.rb +87 -0
  66. data/lib/request.rb +25 -0
  67. data/lib/request_logger.rb +31 -0
  68. data/lib/response.rb +26 -0
  69. data/lib/server.rb +40 -0
  70. data/lib/siffer.rb +44 -0
  71. data/spec/agent_spec.rb +53 -0
  72. data/spec/cli_spec.rb +40 -0
  73. data/spec/container_spec.rb +103 -0
  74. data/spec/default_agent +6 -0
  75. data/spec/default_server +5 -0
  76. data/spec/message_specs/ack_spec.rb +28 -0
  77. data/spec/message_specs/error_spec.rb +24 -0
  78. data/spec/message_specs/header_spec.rb +25 -0
  79. data/spec/message_specs/message_spec.rb +57 -0
  80. data/spec/message_specs/register_spec.rb +86 -0
  81. data/spec/message_specs/request_body_spec.rb +58 -0
  82. data/spec/message_specs/status_spec.rb +25 -0
  83. data/spec/messaging_spec.rb +88 -0
  84. data/spec/protocol_spec.rb +49 -0
  85. data/spec/registration_spec.rb +33 -0
  86. data/spec/request_logger_spec.rb +15 -0
  87. data/spec/request_spec.rb +10 -0
  88. data/spec/response_spec.rb +24 -0
  89. data/spec/server_spec.rb +35 -0
  90. data/spec/spec_helper.rb +26 -0
  91. metadata +191 -0
@@ -0,0 +1,24 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
5
+
6
+ <!--
7
+
8
+ Siffer == h3o(software) SIF
9
+
10
+ -->
11
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
12
+ <head>
13
+ <title>Siffer == h3o(software) SIF</title>
14
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
15
+ </head>
16
+ <frameset rows="20%, 80%">
17
+ <frameset cols="25%,35%,45%">
18
+ <frame src="fr_file_index.html" title="Files" name="Files" />
19
+ <frame src="fr_class_index.html" name="Classes" />
20
+ <frame src="fr_method_index.html" name="Methods" />
21
+ </frameset>
22
+ <frame src="files/README_rdoc.html" name="docwin" />
23
+ </frameset>
24
+ </html>
@@ -0,0 +1,208 @@
1
+
2
+ body {
3
+ font-family: Verdana,Arial,Helvetica,sans-serif;
4
+ font-size: 90%;
5
+ margin: 0;
6
+ margin-left: 40px;
7
+ padding: 0;
8
+ background: white;
9
+ }
10
+
11
+ h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; }
12
+ h1 { font-size: 150%; }
13
+ h2,h3,h4 { margin-top: 1em; }
14
+
15
+ a { background: #eef; color: #039; text-decoration: none; }
16
+ a:hover { background: #039; color: #eef; }
17
+
18
+ /* Override the base stylesheet's Anchor inside a table cell */
19
+ td > a {
20
+ background: transparent;
21
+ color: #039;
22
+ text-decoration: none;
23
+ }
24
+
25
+ /* and inside a section title */
26
+ .section-title > a {
27
+ background: transparent;
28
+ color: #eee;
29
+ text-decoration: none;
30
+ }
31
+
32
+ /* === Structural elements =================================== */
33
+
34
+ div#index {
35
+ margin: 0;
36
+ margin-left: -40px;
37
+ padding: 0;
38
+ font-size: 90%;
39
+ }
40
+
41
+
42
+ div#index a {
43
+ margin-left: 0.7em;
44
+ }
45
+
46
+ div#index .section-bar {
47
+ margin-left: 0px;
48
+ padding-left: 0.7em;
49
+ background: #ccc;
50
+ font-size: small;
51
+ }
52
+
53
+
54
+ div#classHeader, div#fileHeader {
55
+ width: auto;
56
+ color: white;
57
+ padding: 0.5em 1.5em 0.5em 1.5em;
58
+ margin: 0;
59
+ margin-left: -40px;
60
+ border-bottom: 3px solid #006;
61
+ }
62
+
63
+ div#classHeader a, div#fileHeader a {
64
+ background: inherit;
65
+ color: white;
66
+ }
67
+
68
+ div#classHeader td, div#fileHeader td {
69
+ background: inherit;
70
+ color: white;
71
+ }
72
+
73
+
74
+ div#fileHeader {
75
+ background: #057;
76
+ }
77
+
78
+ div#classHeader {
79
+ background: #048;
80
+ }
81
+
82
+
83
+ .class-name-in-header {
84
+ font-size: 180%;
85
+ font-weight: bold;
86
+ }
87
+
88
+
89
+ div#bodyContent {
90
+ padding: 0 1.5em 0 1.5em;
91
+ }
92
+
93
+ div#description {
94
+ padding: 0.5em 1.5em;
95
+ background: #efefef;
96
+ border: 1px dotted #999;
97
+ }
98
+
99
+ div#description h1,h2,h3,h4,h5,h6 {
100
+ color: #125;;
101
+ background: transparent;
102
+ }
103
+
104
+ div#validator-badges {
105
+ text-align: center;
106
+ }
107
+ div#validator-badges img { border: 0; }
108
+
109
+ div#copyright {
110
+ color: #333;
111
+ background: #efefef;
112
+ font: 0.75em sans-serif;
113
+ margin-top: 5em;
114
+ margin-bottom: 0;
115
+ padding: 0.5em 2em;
116
+ }
117
+
118
+
119
+ /* === Classes =================================== */
120
+
121
+ table.header-table {
122
+ color: white;
123
+ font-size: small;
124
+ }
125
+
126
+ .type-note {
127
+ font-size: small;
128
+ color: #DEDEDE;
129
+ }
130
+
131
+ .xxsection-bar {
132
+ background: #eee;
133
+ color: #333;
134
+ padding: 3px;
135
+ }
136
+
137
+ .section-bar {
138
+ color: #333;
139
+ border-bottom: 1px solid #999;
140
+ margin-left: -20px;
141
+ }
142
+
143
+
144
+ .section-title {
145
+ background: #79a;
146
+ color: #eee;
147
+ padding: 3px;
148
+ margin-top: 2em;
149
+ margin-left: -30px;
150
+ border: 1px solid #999;
151
+ }
152
+
153
+ .top-aligned-row { vertical-align: top }
154
+ .bottom-aligned-row { vertical-align: bottom }
155
+
156
+ /* --- Context section classes ----------------------- */
157
+
158
+ .context-row { }
159
+ .context-item-name { font-family: monospace; font-weight: bold; color: black; }
160
+ .context-item-value { font-size: small; color: #448; }
161
+ .context-item-desc { color: #333; padding-left: 2em; }
162
+
163
+ /* --- Method classes -------------------------- */
164
+ .method-detail {
165
+ background: #efefef;
166
+ padding: 0;
167
+ margin-top: 0.5em;
168
+ margin-bottom: 1em;
169
+ border: 1px dotted #ccc;
170
+ }
171
+ .method-heading {
172
+ color: black;
173
+ background: #ccc;
174
+ border-bottom: 1px solid #666;
175
+ padding: 0.2em 0.5em 0 0.5em;
176
+ }
177
+ .method-signature { color: black; background: inherit; }
178
+ .method-name { font-weight: bold; }
179
+ .method-args { font-style: italic; }
180
+ .method-description { padding: 0 0.5em 0 0.5em; }
181
+
182
+ /* --- Source code sections -------------------- */
183
+
184
+ a.source-toggle { font-size: 90%; }
185
+ div.method-source-code {
186
+ background: #262626;
187
+ color: #ffdead;
188
+ margin: 1em;
189
+ padding: 0.5em;
190
+ border: 1px dashed #999;
191
+ overflow: hidden;
192
+ }
193
+
194
+ div.method-source-code pre { color: #ffdead; overflow: hidden; }
195
+
196
+ /* --- Ruby keyword styles --------------------- */
197
+
198
+ .standalone-code { background: #221111; color: #ffdead; overflow: hidden; }
199
+
200
+ .ruby-constant { color: #7fffd4; background: transparent; }
201
+ .ruby-keyword { color: #00ffff; background: transparent; }
202
+ .ruby-ivar { color: #eedd82; background: transparent; }
203
+ .ruby-operator { color: #00ffee; background: transparent; }
204
+ .ruby-identifier { color: #ffdead; background: transparent; }
205
+ .ruby-node { color: #ffa07a; background: transparent; }
206
+ .ruby-comment { color: #b22222; font-weight: bold; background: transparent; }
207
+ .ruby-regexp { color: #ffa07a; background: transparent; }
208
+ .ruby-value { color: #7fffd4; background: transparent; }
@@ -0,0 +1,43 @@
1
+ module Siffer
2
+
3
+ class Agent
4
+
5
+ include Siffer::Protocol
6
+
7
+ attr_reader :name, :host, :port, :admin, :server
8
+
9
+ def initialize(options = {})
10
+ raise "Server URL(s) required" unless options.include? "servers"
11
+ @server = options["servers"]
12
+ raise "Administration URL required" unless options.include? "admin"
13
+ @admin = options["admin"]
14
+ @name = options["name"] || "Default Agent"
15
+ @host = options["host"] || "localhost"
16
+ @port = options["port"] || 8300
17
+ @registered = false
18
+ end
19
+
20
+ def call(env)
21
+ with_each_request(env) do
22
+
23
+ end
24
+ end
25
+
26
+ def wake_up
27
+ self_register unless registered?
28
+ end
29
+
30
+ def self_register
31
+ registration = Siffer::Messages::Register.new(name, name)
32
+ response = Response.from(server,registration)
33
+ # OOOOH BAAAAD ====> Check the ACL please ! Make a parser !
34
+ @registered = response.ok?
35
+ end
36
+
37
+ def registered?
38
+ @registered
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -0,0 +1,96 @@
1
+ module Siffer
2
+
3
+ class Container
4
+
5
+ attr_reader :environment, :component, :name, :host, :port, :log, :pid
6
+
7
+ def initialize(options = {})
8
+ raise "Component Configuration missing" if options[:config].nil?
9
+ raise "Environment missing" if options[:environment].nil?
10
+ @environment = options[:environment]
11
+ config = options[:config]
12
+ type = config.include?("agent") ? "agent" : "server"
13
+ @component = (type == "agent") ?
14
+ Siffer::Agent.new(config["agent"]) :
15
+ Siffer::Server.new(config["server"])
16
+ @name = config[type]["name"]
17
+ @host = config[type]["host"]
18
+ @port = config[type]["port"]
19
+ @daemonize = options[:daemonize]
20
+ @pid = options[:pid]
21
+ @log = options[:log]
22
+ end
23
+
24
+ def daemonized?
25
+ @daemonize
26
+ end
27
+
28
+ def run
29
+ daemonize
30
+ server = best_available_server
31
+ options = {
32
+ :Host => host,
33
+ :Port => port
34
+ }
35
+ component.wake_up if component.respond_to?("wake_up")
36
+ app = component_wrapped_in_environment
37
+ server.run app, options
38
+ end
39
+
40
+ def stop
41
+ pid_id = open("#{@pid}").read.to_i
42
+ Process.kill(15,pid_id)
43
+ File.delete(@pid) if File.exist?(@pid)
44
+ end
45
+
46
+ private
47
+ def best_available_server
48
+ begin
49
+ server = Rack::Handler::Mongrel
50
+ rescue
51
+ server = Rack::Handler::WEBrick
52
+ end
53
+ end
54
+
55
+ def component_wrapped_in_environment
56
+ case environment
57
+ when "development"
58
+ builder = Rack::Builder.new
59
+ builder.use(Siffer::RequestLogger)
60
+ builder.use(Rack::CommonLogger)
61
+ builder.run(@component)
62
+ builder
63
+ when "deployment"
64
+ builder = Rack::Builder.new
65
+ builder.use(Rack::CommonLogger)
66
+ builder.run(@component)
67
+ builder
68
+ when "test": component
69
+ when "none": component
70
+ end
71
+ end
72
+
73
+ def daemonize
74
+ if daemonized?
75
+ if RUBY_PLATFORM !~ /mswin/
76
+ require 'daemons/daemonize'
77
+ Daemonize.daemonize(@log)
78
+ else
79
+ # How to tell about the problem of no Daemon on WINDOWS
80
+ end
81
+ write_pid_file
82
+ end
83
+ end
84
+
85
+ def write_pid_file
86
+ if RUBY_PLATFORM !~ /mswin/
87
+ open(@pid,"w") do |f|
88
+ f.write(Process.pid)
89
+ File.chmod(0644, @pid)
90
+ end
91
+ end
92
+ end
93
+
94
+ end
95
+
96
+ end
@@ -0,0 +1,7 @@
1
+ require 'messages/error'
2
+ require 'messages/status'
3
+ require 'messages/acl'
4
+ require 'messages/request_body'
5
+ require 'messages/message'
6
+ require 'messages/ack'
7
+ require 'messages/register'
@@ -0,0 +1,43 @@
1
+ module Siffer
2
+ module Messages
3
+
4
+ # Acknowledge Message
5
+ # Used by Server and Agent to "acknowledge" receipt of a message. Allows
6
+ # Erorr and Status messages to be injected into the body.
7
+ class Ack < Message
8
+
9
+ attr_reader :original_msg
10
+
11
+ #
12
+ def initialize(source, original, options = {})
13
+ raise ArgumentError, "Original message is required" unless original
14
+ super(source, options)
15
+ @original_msg = original
16
+ @error = options[:error] || nil
17
+ @status = options[:status] || nil
18
+ end
19
+
20
+ def content
21
+ body do |ack|
22
+ ack.SIF_Ack() { |xml|
23
+ put_header_into xml
24
+ if @original_msg.source_id.nil? or @original_msg.source_id == ""
25
+ xml.SIF_OriginalSourceId
26
+ else
27
+ xml.SIF_OriginalSourceId(@original_msg.source_id)
28
+ end
29
+ if @original_msg.msg_id.nil? or @original_msg.msg_id == ""
30
+ xml.SIF_OriginalMsgId
31
+ else
32
+ xml.SIF_OriginalMsgId(@original_msg.msg_id)
33
+ end
34
+ xml << @error.read unless @error.nil?
35
+ xml << @status.read unless @status.nil?
36
+ }
37
+ end
38
+ end
39
+
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,25 @@
1
+ module Siffer
2
+ module Messages
3
+ class Acl
4
+
5
+ # This class roles through all the objects in all the contexts in
6
+ # the zone to provide a list of allowed actions on each object per
7
+ # registered agent
8
+
9
+ def read
10
+ xml = Builder::XmlMarkup.new
11
+ xml.SIF_AgentAcl { |xml|
12
+ # each one of these would collect all objects for each context
13
+ xml.SIF_ProvideAccess
14
+ xml.SIF_SubscribeAccess
15
+ xml.SIF_PublishAddAccess
16
+ xml.SIF_PublishChangeAccess
17
+ xml.SIF_PublishDeleteAccess
18
+ xml.SIF_RequestAccess
19
+ xml.SIF_RespondAccess
20
+ }
21
+ end
22
+
23
+ end
24
+ end
25
+ end