siffer 0.0.4

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