serverside 0.1.59

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 (61) hide show
  1. data/CHANGELOG +97 -0
  2. data/COPYING +18 -0
  3. data/README +51 -0
  4. data/Rakefile +92 -0
  5. data/bin/serverside +74 -0
  6. data/doc/rdoc/classes/Daemon.html +253 -0
  7. data/doc/rdoc/classes/Daemon/Base.html +146 -0
  8. data/doc/rdoc/classes/Daemon/Cluster.html +308 -0
  9. data/doc/rdoc/classes/Daemon/Cluster/PidFile.html +228 -0
  10. data/doc/rdoc/classes/Daemon/PidFile.html +178 -0
  11. data/doc/rdoc/classes/ServerSide.html +160 -0
  12. data/doc/rdoc/classes/ServerSide/Application.html +147 -0
  13. data/doc/rdoc/classes/ServerSide/Application/Base.html +196 -0
  14. data/doc/rdoc/classes/ServerSide/Application/Static.html +154 -0
  15. data/doc/rdoc/classes/ServerSide/Connection.html +128 -0
  16. data/doc/rdoc/classes/ServerSide/Connection/Base.html +343 -0
  17. data/doc/rdoc/classes/ServerSide/Connection/Const.html +229 -0
  18. data/doc/rdoc/classes/ServerSide/Connection/Static.html +172 -0
  19. data/doc/rdoc/classes/ServerSide/Server.html +162 -0
  20. data/doc/rdoc/classes/ServerSide/StaticFiles.html +208 -0
  21. data/doc/rdoc/classes/ServerSide/StaticFiles/Const.html +179 -0
  22. data/doc/rdoc/classes/String.html +210 -0
  23. data/doc/rdoc/classes/Symbol.html +156 -0
  24. data/doc/rdoc/created.rid +1 -0
  25. data/doc/rdoc/files/CHANGELOG.html +260 -0
  26. data/doc/rdoc/files/COPYING.html +129 -0
  27. data/doc/rdoc/files/README.html +171 -0
  28. data/doc/rdoc/files/lib/serverside/application_rb.html +109 -0
  29. data/doc/rdoc/files/lib/serverside/cluster_rb.html +101 -0
  30. data/doc/rdoc/files/lib/serverside/connection_rb.html +101 -0
  31. data/doc/rdoc/files/lib/serverside/core_ext_rb.html +107 -0
  32. data/doc/rdoc/files/lib/serverside/daemon_rb.html +108 -0
  33. data/doc/rdoc/files/lib/serverside/server_rb.html +108 -0
  34. data/doc/rdoc/files/lib/serverside/static_rb.html +101 -0
  35. data/doc/rdoc/files/lib/serverside_rb.html +131 -0
  36. data/doc/rdoc/fr_class_index.html +44 -0
  37. data/doc/rdoc/fr_file_index.html +37 -0
  38. data/doc/rdoc/fr_method_index.html +60 -0
  39. data/doc/rdoc/index.html +24 -0
  40. data/doc/rdoc/rdoc-style.css +208 -0
  41. data/lib/serverside.rb +13 -0
  42. data/lib/serverside/application.rb +40 -0
  43. data/lib/serverside/cluster.rb +72 -0
  44. data/lib/serverside/connection.rb +115 -0
  45. data/lib/serverside/core_ext.rb +27 -0
  46. data/lib/serverside/daemon.rb +67 -0
  47. data/lib/serverside/server.rb +18 -0
  48. data/lib/serverside/static.rb +96 -0
  49. data/test/functional/primitive_static_server_test.rb +37 -0
  50. data/test/functional/static_profile.rb +17 -0
  51. data/test/functional/static_rfuzz.rb +67 -0
  52. data/test/functional/static_server_test.rb +25 -0
  53. data/test/test_helper.rb +2 -0
  54. data/test/unit/application_test.rb +16 -0
  55. data/test/unit/cluster_test.rb +129 -0
  56. data/test/unit/connection_test.rb +193 -0
  57. data/test/unit/core_ext_test.rb +32 -0
  58. data/test/unit/daemon_test.rb +75 -0
  59. data/test/unit/server_test.rb +26 -0
  60. data/test/unit/static_test.rb +143 -0
  61. metadata +140 -0
@@ -0,0 +1,44 @@
1
+
2
+ <?xml version="1.0" encoding="iso-8859-1"?>
3
+ <!DOCTYPE html
4
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
5
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6
+
7
+ <!--
8
+
9
+ Classes
10
+
11
+ -->
12
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
13
+ <head>
14
+ <title>Classes</title>
15
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
16
+ <link rel="stylesheet" href="rdoc-style.css" type="text/css" />
17
+ <base target="docwin" />
18
+ </head>
19
+ <body>
20
+ <div id="index">
21
+ <h1 class="section-bar">Classes</h1>
22
+ <div id="index-entries">
23
+ <a href="classes/Daemon.html">Daemon</a><br />
24
+ <a href="classes/Daemon/Base.html">Daemon::Base</a><br />
25
+ <a href="classes/Daemon/Cluster.html">Daemon::Cluster</a><br />
26
+ <a href="classes/Daemon/Cluster/PidFile.html">Daemon::Cluster::PidFile</a><br />
27
+ <a href="classes/Daemon/PidFile.html">Daemon::PidFile</a><br />
28
+ <a href="classes/ServerSide.html">ServerSide</a><br />
29
+ <a href="classes/ServerSide/Application.html">ServerSide::Application</a><br />
30
+ <a href="classes/ServerSide/Application/Base.html">ServerSide::Application::Base</a><br />
31
+ <a href="classes/ServerSide/Application/Static.html">ServerSide::Application::Static</a><br />
32
+ <a href="classes/ServerSide/Connection.html">ServerSide::Connection</a><br />
33
+ <a href="classes/ServerSide/Connection/Base.html">ServerSide::Connection::Base</a><br />
34
+ <a href="classes/ServerSide/Connection/Const.html">ServerSide::Connection::Const</a><br />
35
+ <a href="classes/ServerSide/Connection/Static.html">ServerSide::Connection::Static</a><br />
36
+ <a href="classes/ServerSide/Server.html">ServerSide::Server</a><br />
37
+ <a href="classes/ServerSide/StaticFiles.html">ServerSide::StaticFiles</a><br />
38
+ <a href="classes/ServerSide/StaticFiles/Const.html">ServerSide::StaticFiles::Const</a><br />
39
+ <a href="classes/String.html">String</a><br />
40
+ <a href="classes/Symbol.html">Symbol</a><br />
41
+ </div>
42
+ </div>
43
+ </body>
44
+ </html>
@@ -0,0 +1,37 @@
1
+
2
+ <?xml version="1.0" encoding="iso-8859-1"?>
3
+ <!DOCTYPE html
4
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
5
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6
+
7
+ <!--
8
+
9
+ Files
10
+
11
+ -->
12
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
13
+ <head>
14
+ <title>Files</title>
15
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
16
+ <link rel="stylesheet" href="rdoc-style.css" type="text/css" />
17
+ <base target="docwin" />
18
+ </head>
19
+ <body>
20
+ <div id="index">
21
+ <h1 class="section-bar">Files</h1>
22
+ <div id="index-entries">
23
+ <a href="files/CHANGELOG.html">CHANGELOG</a><br />
24
+ <a href="files/COPYING.html">COPYING</a><br />
25
+ <a href="files/README.html">README</a><br />
26
+ <a href="files/lib/serverside_rb.html">lib/serverside.rb</a><br />
27
+ <a href="files/lib/serverside/application_rb.html">lib/serverside/application.rb</a><br />
28
+ <a href="files/lib/serverside/cluster_rb.html">lib/serverside/cluster.rb</a><br />
29
+ <a href="files/lib/serverside/connection_rb.html">lib/serverside/connection.rb</a><br />
30
+ <a href="files/lib/serverside/core_ext_rb.html">lib/serverside/core_ext.rb</a><br />
31
+ <a href="files/lib/serverside/daemon_rb.html">lib/serverside/daemon.rb</a><br />
32
+ <a href="files/lib/serverside/server_rb.html">lib/serverside/server.rb</a><br />
33
+ <a href="files/lib/serverside/static_rb.html">lib/serverside/static.rb</a><br />
34
+ </div>
35
+ </div>
36
+ </body>
37
+ </html>
@@ -0,0 +1,60 @@
1
+
2
+ <?xml version="1.0" encoding="iso-8859-1"?>
3
+ <!DOCTYPE html
4
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
5
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6
+
7
+ <!--
8
+
9
+ Methods
10
+
11
+ -->
12
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
13
+ <head>
14
+ <title>Methods</title>
15
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
16
+ <link rel="stylesheet" href="rdoc-style.css" type="text/css" />
17
+ <base target="docwin" />
18
+ </head>
19
+ <body>
20
+ <div id="index">
21
+ <h1 class="section-bar">Methods</h1>
22
+ <div id="index-entries">
23
+ <a href="classes/String.html#M000004">/ (String)</a><br />
24
+ <a href="classes/ServerSide/Application/Base.html#M000024">configuration (ServerSide::Application::Base)</a><br />
25
+ <a href="classes/ServerSide/Application/Base.html#M000023">configure (ServerSide::Application::Base)</a><br />
26
+ <a href="classes/Daemon.html#M000005">control (Daemon)</a><br />
27
+ <a href="classes/Daemon/Cluster.html#M000014">daemon_loop (Daemon::Cluster)</a><br />
28
+ <a href="classes/ServerSide/Application.html#M000022">daemonize (ServerSide::Application)</a><br />
29
+ <a href="classes/ServerSide/Application/Static.html#M000026">daemonize (ServerSide::Application::Static)</a><br />
30
+ <a href="classes/Daemon/Cluster/PidFile.html#M000017">delete (Daemon::Cluster::PidFile)</a><br />
31
+ <a href="classes/Daemon/Cluster.html#M000011">fork_server (Daemon::Cluster)</a><br />
32
+ <a href="classes/ServerSide/Connection/Base.html#M000027">new (ServerSide::Connection::Base)</a><br />
33
+ <a href="classes/ServerSide/Application/Base.html#M000025">new (ServerSide::Application::Base)</a><br />
34
+ <a href="classes/ServerSide/Server.html#M000034">new (ServerSide::Server)</a><br />
35
+ <a href="classes/ServerSide/Connection/Base.html#M000030">parse_parameters (ServerSide::Connection::Base)</a><br />
36
+ <a href="classes/ServerSide/Connection/Base.html#M000029">parse_request (ServerSide::Connection::Base)</a><br />
37
+ <a href="classes/Daemon/Base.html#M000010">pid_fn (Daemon::Base)</a><br />
38
+ <a href="classes/ServerSide/Connection/Base.html#M000028">process (ServerSide::Connection::Base)</a><br />
39
+ <a href="classes/Daemon/PidFile.html#M000009">recall (Daemon::PidFile)</a><br />
40
+ <a href="classes/Daemon/Cluster/PidFile.html#M000019">recall_pids (Daemon::Cluster::PidFile)</a><br />
41
+ <a href="classes/ServerSide/Connection/Static.html#M000033">respond (ServerSide::Connection::Static)</a><br />
42
+ <a href="classes/ServerSide/Connection/Base.html#M000031">send_response (ServerSide::Connection::Base)</a><br />
43
+ <a href="classes/ServerSide/StaticFiles.html#M000021">serve_dir (ServerSide::StaticFiles)</a><br />
44
+ <a href="classes/ServerSide/StaticFiles.html#M000020">serve_file (ServerSide::StaticFiles)</a><br />
45
+ <a href="classes/Daemon.html#M000006">start (Daemon)</a><br />
46
+ <a href="classes/Daemon/Cluster.html#M000015">start (Daemon::Cluster)</a><br />
47
+ <a href="classes/Daemon/Cluster.html#M000012">start_servers (Daemon::Cluster)</a><br />
48
+ <a href="classes/Daemon.html#M000007">stop (Daemon)</a><br />
49
+ <a href="classes/Daemon/Cluster.html#M000016">stop (Daemon::Cluster)</a><br />
50
+ <a href="classes/Daemon/Cluster.html#M000013">stop_servers (Daemon::Cluster)</a><br />
51
+ <a href="classes/Daemon/PidFile.html#M000008">store (Daemon::PidFile)</a><br />
52
+ <a href="classes/Daemon/Cluster/PidFile.html#M000018">store_pid (Daemon::Cluster::PidFile)</a><br />
53
+ <a href="classes/ServerSide/Connection/Base.html#M000032">stream (ServerSide::Connection::Base)</a><br />
54
+ <a href="classes/Symbol.html#M000001">to_s (Symbol)</a><br />
55
+ <a href="classes/String.html#M000002">uri_escape (String)</a><br />
56
+ <a href="classes/String.html#M000003">uri_unescape (String)</a><br />
57
+ </div>
58
+ </div>
59
+ </body>
60
+ </html>
@@ -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
+ ServerSide Documentation
9
+
10
+ -->
11
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
12
+ <head>
13
+ <title>ServerSide Documentation</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.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,13 @@
1
+ # ServerSide is a web framework that make it easy to create custom light-weight
2
+ # web applications. It contains the following functionalities:
3
+ # 1. A fast multithreaded HTTP server with support for persistent connections
4
+ # and streaming.
5
+ # 2. A static file handler.
6
+ # 3. A daemon for controlling a server or a cluster of servers.
7
+ # 4. A simple script for serving files or applications easily.
8
+ # 5. A simple controller-view system for processing requests.
9
+ module ServerSide
10
+ end
11
+
12
+ path = File.join(File.dirname(__FILE__), 'serverside')
13
+ Dir.foreach(path) {|fn| require File.join(path, fn) if fn =~ /\.rb$/}
@@ -0,0 +1,40 @@
1
+ require 'rubygems'
2
+ require 'metaid'
3
+ require File.join(File.dirname(__FILE__), 'connection')
4
+
5
+ module ServerSide
6
+ module Application
7
+
8
+ class Base < ServerSide::Connection::Base
9
+ def self.configure(options)
10
+ @config = options
11
+ end
12
+
13
+ def self.configuration
14
+ @config
15
+ end
16
+
17
+ def initialize(host, port)
18
+ ServerSide::Server.new(host, port, make_request_class)
19
+ end
20
+ end
21
+
22
+ class Static
23
+ def self.daemonize(config, cmd)
24
+ daemon_class = Class.new(Daemon::Cluster) do
25
+ meta_def(:pid_fn) {Daemon::WorkingDirectory/'serverside.pid'}
26
+ meta_def(:server_loop) do |port|
27
+ ServerSide::Server.new(config[:host], port, ServerSide::Connection::Static)
28
+ end
29
+ meta_def(:ports) {$cmd_config[:ports]}
30
+ end
31
+
32
+ Daemon.control(daemon_class, cmd)
33
+ end
34
+ end
35
+
36
+ def self.daemonize
37
+
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,72 @@
1
+ require File.join(File.dirname(__FILE__), 'daemon')
2
+
3
+ module Daemon
4
+ # Implements a cluster controlling daemon. The daemon itself itself forks
5
+ # a child process for each port.
6
+ class Cluster < Base
7
+ # Stores and recalls pids for the child processes.
8
+ class PidFile
9
+ FN = 'serverside_cluster.pid'
10
+
11
+ # Deletes the cluster's pid file.
12
+ def self.delete
13
+ FileUtils.rm(FN) if File.file?(FN)
14
+ end
15
+
16
+ # Stores a pid in the cluster's pid file.
17
+ def self.store_pid(pid)
18
+ File.open(FN, 'a') {|f| f.puts pid}
19
+ end
20
+
21
+ # Recalls all child pids.
22
+ def self.recall_pids
23
+ pids = []
24
+ File.open(FN, 'r') do |f|
25
+ while !f.eof?
26
+ pids << f.gets.to_i
27
+ end
28
+ end
29
+ pids
30
+ end
31
+ end
32
+
33
+ # Forks a child process with a specific port.
34
+ def self.fork_server(port)
35
+ fork do
36
+ trap('TERM') {exit}
37
+ server_loop(port)
38
+ end
39
+ end
40
+
41
+ # Starts child processes.
42
+ def self.start_servers
43
+ PidFile.delete
44
+ ports.each do |p|
45
+ PidFile.store_pid(fork_server(p))
46
+ end
47
+ end
48
+
49
+ # Stops child processes.
50
+ def self.stop_servers
51
+ pids = PidFile.recall_pids
52
+ pids.each {|pid| begin; Process.kill('TERM', pid); rescue; end}
53
+ PidFile.delete
54
+ end
55
+
56
+ # The main daemon loop. Does nothing for now.
57
+ def self.daemon_loop
58
+ loop {sleep 60}
59
+ end
60
+
61
+ # Starts child processes and calls the main loop.
62
+ def self.start
63
+ start_servers
64
+ daemon_loop
65
+ end
66
+
67
+ # Stops child processes.
68
+ def self.stop
69
+ stop_servers
70
+ end
71
+ end
72
+ end