serverside 0.1.59

Sign up to get free protection for your applications and to get access to all the features.
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,97 @@
1
+ *SVN*
2
+
3
+ * Added a profiled version of a static server - /test/functional/static_profile.rb.
4
+
5
+ * Added freezing of HTTP headers.
6
+
7
+ * Small change to documentation.
8
+
9
+ * Changed filename for cluster pid file to serverside_cluster.pid.
10
+
11
+ * Added documentation.
12
+
13
+ * Fixed require in serverside script to load the gem.
14
+
15
+ * Fixed the Daemon pid file for static file server mode.
16
+
17
+ * Added directory listing to static file server.
18
+
19
+ * Fixed request header parsing Regexp so a trailing slash would be ignored.
20
+
21
+ * Added static application. Using the binary script in static mode works.
22
+
23
+ * Added cluster class with unit tests.
24
+
25
+ * Added unit tests for static server.
26
+
27
+ * Added static server functional test.
28
+
29
+ * Added static file serving code.
30
+
31
+ * Renamed ServerSide::Request to ServerSide::Connection. This is more appropriate.
32
+
33
+ * Added functional static server test.
34
+
35
+ * Added test/functional for functional tests. Updated Rakefile.
36
+
37
+ * Added Request.send_response and stream.
38
+
39
+ * Added faster Symbol.to_s to core_ext.
40
+
41
+ * Added HTTP parsing code with unit tests.
42
+
43
+ * Started adding request code.
44
+
45
+ * More unit tests for application code.
46
+
47
+ * Basic server code works with unit tests.
48
+
49
+ * Started work on application code.
50
+
51
+ * Added option parsing to serverside script.
52
+
53
+ * Added daemon code and unit tests.
54
+
55
+ * Created serverside script.
56
+
57
+ * Created Gem spec.
58
+
59
+ * Created directory structure.
60
+
61
+ *Mongrel-based branch*
62
+
63
+ * Added host attribute to Controller::Request.
64
+
65
+ * Added ability to create rules on any request attribute, not just path.
66
+
67
+ * Added ability to mount controllers with a block for a rule.
68
+
69
+ * Wrote object extensions to create frozen constants on the fly.
70
+
71
+ * Changed DirHandler to use frozen strings for cache header.
72
+
73
+ * Hooked Mongrel server to Controller::Router.
74
+
75
+ * Imported request code with unit tests.
76
+
77
+ * Wrote unit tests for daemon module.
78
+
79
+ * Wrote unit tests for controller routing code.
80
+
81
+ * Refactored controller routing code.
82
+
83
+ * Imported unit tests for extensions.
84
+
85
+ * Created Rakefile.
86
+
87
+ * Prototypical routing code.
88
+
89
+ * Fixed location of daemon pid files.
90
+
91
+ * Imported Mongrel code from Reality project.
92
+
93
+ * Imported extensions from Reality project.
94
+
95
+ * Implemented daemon and server cluster.
96
+
97
+ * Basic configuration infrastructure is ready.
data/COPYING ADDED
@@ -0,0 +1,18 @@
1
+ Copyright (c) 2006 Sharon Rosner
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to
5
+ deal in the Software without restriction, including without limitation the
6
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7
+ sell copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
16
+ THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,51 @@
1
+ = about ServerSide
2
+
3
+ ServerSide is an HTTP server framework designed to be as fast as possible, and
4
+ as easy as possible to use. ServerSide includes a full-featured HTTP server, a
5
+ controller-view system and a bunch of other tools to easily create servers and
6
+ clusters of servers.
7
+
8
+ == Installation
9
+
10
+ <tt>sudo gem install serverside</tt>
11
+
12
+ == Source Code
13
+
14
+ http://serverside.googlecode.com/svn/
15
+
16
+ == The Daemon
17
+
18
+ Once you have the ServerSide gem installed, you can use the <tt>serverside</tt>
19
+ script to control servers. For example:
20
+
21
+ <tt>serverside -p 8000 start .</tt>
22
+
23
+ will start an HTTP server, serving the content of the working directory. You can
24
+ stop the server by running <tt>serverside stop .</tt>
25
+
26
+ == Serving Dynamic Content
27
+
28
+ You can use the ServerSide::Application and ServerSide::Controller classes to
29
+ create dynamic web applications. The ServerSide framework also lets you route
30
+ requests based on any attribute of incoming requests, such as host name, path,
31
+ URL parameters etc.
32
+
33
+ To start your app, you can either supply the <tt>serverside</tt> script with
34
+ your Ruby code file:
35
+
36
+ <tt>serverside start ~/myapp/myapp.rb</tt>
37
+
38
+ Or you can put your code in a file called <tt>serverside.rb</tt> and tell the
39
+ <tt>serverside</tt> script the directory path:
40
+
41
+ <tt>serverside start /home/nc/reality/production</tt>
42
+
43
+ The script will then load <tt>/home/nc/reality/production/serverside.rb</tt> and
44
+ take care of everything else.
45
+
46
+ == Running a Cluster of Servers
47
+
48
+ ServerSide makes it easy to control a cluster of servers. Just supply a range of
49
+ ports instead of a single port:
50
+
51
+ <tt>serverside -p 8000..8009 start .</tt>
@@ -0,0 +1,92 @@
1
+ require 'rake'
2
+ require 'rake/clean'
3
+ require 'rake/gempackagetask'
4
+ require 'rake/rdoctask'
5
+ require 'rake/testtask'
6
+ require 'fileutils'
7
+ include FileUtils
8
+
9
+ NAME = "serverside"
10
+ REV = File.read(".svn/entries")[/committed-rev="(\d+)"/, 1] rescue nil
11
+ VERS = "0.1" + (REV ? ".#{REV}" : "")
12
+ CLEAN.include ['**/.*.sw?', '*.gem', '.config']
13
+ RDOC_OPTS = ['--quiet', '--title', "ServerSide Documentation",
14
+ "--opname", "index.html",
15
+ "--line-numbers",
16
+ "--main", "README",
17
+ "--inline-source"]
18
+
19
+ desc "Packages up ServerSide."
20
+ task :default => [:package]
21
+ task :package => [:clean]
22
+
23
+ task :doc => [:rdoc]
24
+
25
+ Rake::RDocTask.new do |rdoc|
26
+ rdoc.rdoc_dir = 'doc/rdoc'
27
+ rdoc.options += RDOC_OPTS
28
+ rdoc.main = "README"
29
+ rdoc.title = "ServerSide Documentation"
30
+ rdoc.rdoc_files.add ['README', 'CHANGELOG', 'COPYING', 'lib/serverside.rb', 'lib/serverside/*.rb']
31
+ end
32
+
33
+ spec =
34
+ Gem::Specification.new do |s|
35
+ s.name = NAME
36
+ s.version = VERS
37
+ s.platform = Gem::Platform::RUBY
38
+ s.has_rdoc = true
39
+ s.extra_rdoc_files = ["README", "CHANGELOG", "COPYING"]
40
+ s.rdoc_options += RDOC_OPTS +
41
+ ['--exclude', '^(examples|extras)\/', '--exclude', 'lib/serverside.rb']
42
+ s.summary = "Performance-oriented web framework."
43
+ s.description = s.summary
44
+ s.author = "Sharon Rosner"
45
+ s.email = 'ciconia@gmail.com'
46
+ s.homepage = 'http://code.google.com/p/serverside/'
47
+ s.executables = ['serverside']
48
+
49
+ s.add_dependency('metaid')
50
+ s.required_ruby_version = '>= 1.8.2'
51
+
52
+ s.files = %w(COPYING README Rakefile) +
53
+ Dir.glob("{bin,doc,test,lib}/**/*")
54
+
55
+ s.require_path = "lib"
56
+ s.bindir = "bin"
57
+ end
58
+
59
+ Rake::GemPackageTask.new(spec) do |p|
60
+ p.need_tar = true
61
+ p.gem_spec = spec
62
+ end
63
+
64
+ task :install do
65
+ sh %{rake package}
66
+ sh %{sudo gem install pkg/#{NAME}-#{VERS}}
67
+ end
68
+
69
+ task :uninstall => [:clean] do
70
+ sh %{sudo gem uninstall #{NAME}}
71
+ end
72
+
73
+ desc 'Run unit tests'
74
+ Rake::TestTask.new('test_unit') do |t|
75
+ t.libs << 'test'
76
+ t.pattern = 'test/unit/**/*_test.rb'
77
+ t.verbose = true
78
+ end
79
+
80
+ desc 'Run functional tests'
81
+ Rake::TestTask.new('test_functional') do |t|
82
+ t.libs << 'test'
83
+ t.pattern = 'test/functional/**/*_test.rb'
84
+ t.verbose = true
85
+ end
86
+
87
+ desc 'Run all tests'
88
+ Rake::TestTask.new('test') do |t|
89
+ t.libs << 'test'
90
+ t.pattern = 'test/**/*_test.rb'
91
+ t.verbose = true
92
+ end
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'serverside'
5
+ require 'optparse'
6
+
7
+ $cmd_config = {
8
+ :host => '0.0.0.0',
9
+ :ports => 8000..8000
10
+ }
11
+
12
+ opts = OptionParser.new do |opts|
13
+ opts.banner = "Usage: serverside start|stop|restart [app1 app2 ...]"
14
+ opts.define_head "ServerSide, a fast and simple web framework for ruby."
15
+ opts.separator ""
16
+ opts.separator "The supplied app paths can be directory or file references."
17
+ opts.separator ""
18
+ opts.separator "Options:"
19
+
20
+ opts.on("-h", "--host HOSTNAME", "Host to bind to (default is all IPs)") do |v|
21
+ $cmd_config[:host] = v
22
+ end
23
+ opts.on("-p", "--port NUM", "Port or port range (default is 8000)") do |v|
24
+ $cmd_config[:ports] = (v =~ /\.\./) ? eval(v) : v.to_i..v_to_i
25
+ end
26
+
27
+ # No argument, shows at tail. This will print an options summary.
28
+ # Try it and see!
29
+ opts.on_tail("-?", "--help", "Show this message") do
30
+ puts opts
31
+ exit
32
+ end
33
+
34
+ # Another typical switch to print the version.
35
+ opts.on_tail("-v", "--version", "Show version") do
36
+ class << Gem; attr_accessor :loaded_specs; end
37
+ specs = Gem.loaded_specs['serverside']
38
+ puts "ServerSide #{specs.version} (#{specs.date.strftime '%Y-%m-%d'})"
39
+ exit
40
+ end
41
+
42
+ end
43
+
44
+ opts.parse! ARGV
45
+ if ARGV.length < 1
46
+ puts opts
47
+ exit
48
+ end
49
+
50
+ $cmd = ARGV.shift
51
+ unless %w(start stop restart).include?($cmd)
52
+ puts "Invalid command specified. Known commands are: start, stop, restart."
53
+ exit
54
+ end
55
+
56
+ puts $cmd_config.inspect
57
+
58
+ ARGV << '.' if ARGV.empty?
59
+ path = ARGV.shift
60
+ if File.file?(path)
61
+ puts "Application file #{path}"
62
+ require path
63
+ ServerSide::Application.daemonize($cmd)
64
+ else
65
+ fn = File.join(path, 'serverside.rb')
66
+ if File.file?(fn)
67
+ puts "Application file #{fn}"
68
+ require fn
69
+ ServerSide::Application.daemonize($cmd)
70
+ else
71
+ puts "Static file server #{path}"
72
+ ServerSide::Application::Static.daemonize($cmd_config, $cmd)
73
+ end
74
+ end
@@ -0,0 +1,253 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Module: Daemon</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Module</strong></td>
53
+ <td class="class-name-in-header">Daemon</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../files/lib/serverside/daemon_rb.html">
59
+ lib/serverside/daemon.rb
60
+ </a>
61
+ <br />
62
+ <a href="../files/lib/serverside/cluster_rb.html">
63
+ lib/serverside/cluster.rb
64
+ </a>
65
+ <br />
66
+ </td>
67
+ </tr>
68
+
69
+ </table>
70
+ </div>
71
+ <!-- banner header -->
72
+
73
+ <div id="bodyContent">
74
+
75
+
76
+
77
+ <div id="contextContent">
78
+
79
+ <div id="description">
80
+ <p>
81
+ The <a href="Daemon.html">Daemon</a> module takes care of starting and
82
+ stopping daemons.
83
+ </p>
84
+
85
+ </div>
86
+
87
+
88
+ </div>
89
+
90
+ <div id="method-list">
91
+ <h3 class="section-bar">Methods</h3>
92
+
93
+ <div class="name-list">
94
+ <a href="#M000005">control</a>&nbsp;&nbsp;
95
+ <a href="#M000006">start</a>&nbsp;&nbsp;
96
+ <a href="#M000007">stop</a>&nbsp;&nbsp;
97
+ </div>
98
+ </div>
99
+
100
+ </div>
101
+
102
+
103
+ <!-- if includes -->
104
+
105
+ <div id="section">
106
+
107
+ <div id="class-list">
108
+ <h3 class="section-bar">Classes and Modules</h3>
109
+
110
+ Module <a href="Daemon/PidFile.html" class="link">Daemon::PidFile</a><br />
111
+ Class <a href="Daemon/Base.html" class="link">Daemon::Base</a><br />
112
+ Class <a href="Daemon/Cluster.html" class="link">Daemon::Cluster</a><br />
113
+
114
+ </div>
115
+
116
+ <div id="constants-list">
117
+ <h3 class="section-bar">Constants</h3>
118
+
119
+ <div class="name-list">
120
+ <table summary="Constants">
121
+ <tr class="top-aligned-row context-row">
122
+ <td class="context-item-name">WorkingDirectory</td>
123
+ <td>=</td>
124
+ <td class="context-item-value">FileUtils.pwd</td>
125
+ </tr>
126
+ </table>
127
+ </div>
128
+ </div>
129
+
130
+
131
+
132
+
133
+
134
+
135
+ <!-- if method_list -->
136
+ <div id="methods">
137
+ <h3 class="section-bar">Public Class methods</h3>
138
+
139
+ <div id="method-M000005" class="method-detail">
140
+ <a name="M000005"></a>
141
+
142
+ <div class="method-heading">
143
+ <a href="#M000005" class="method-signature">
144
+ <span class="method-name">control</span><span class="method-args">(daemon, cmd = nil)</span>
145
+ </a>
146
+ </div>
147
+
148
+ <div class="method-description">
149
+ <p>
150
+ Controls a daemon according to the supplied command or command-line
151
+ parameter. If an invalid command is specified, an error is raised.
152
+ </p>
153
+ <p><a class="source-toggle" href="#"
154
+ onclick="toggleCode('M000005-source');return false;">[Source]</a></p>
155
+ <div class="method-source-code" id="M000005-source">
156
+ <pre>
157
+ <span class="ruby-comment cmt"># File lib/serverside/daemon.rb, line 31</span>
158
+ 31: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">control</span>(<span class="ruby-identifier">daemon</span>, <span class="ruby-identifier">cmd</span> = <span class="ruby-keyword kw">nil</span>)
159
+ 32: <span class="ruby-keyword kw">case</span> (<span class="ruby-identifier">cmd</span> <span class="ruby-operator">||</span> (<span class="ruby-operator">!</span><span class="ruby-constant">ARGV</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-constant">ARGV</span>[<span class="ruby-value">0</span>]) <span class="ruby-operator">||</span> <span class="ruby-identifier">:nil</span>).<span class="ruby-identifier">to_sym</span>
160
+ 33: <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:start</span>
161
+ 34: <span class="ruby-identifier">start</span>(<span class="ruby-identifier">daemon</span>)
162
+ 35: <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:stop</span>
163
+ 36: <span class="ruby-identifier">stop</span>(<span class="ruby-identifier">daemon</span>)
164
+ 37: <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:restart</span>
165
+ 38: <span class="ruby-identifier">stop</span>(<span class="ruby-identifier">daemon</span>)
166
+ 39: <span class="ruby-identifier">start</span>(<span class="ruby-identifier">daemon</span>)
167
+ 40: <span class="ruby-keyword kw">else</span>
168
+ 41: <span class="ruby-identifier">raise</span> <span class="ruby-value str">'Invalid command. Please specify start, stop or restart.'</span>
169
+ 42: <span class="ruby-keyword kw">end</span>
170
+ 43: <span class="ruby-keyword kw">end</span>
171
+ </pre>
172
+ </div>
173
+ </div>
174
+ </div>
175
+
176
+ <div id="method-M000006" class="method-detail">
177
+ <a name="M000006"></a>
178
+
179
+ <div class="method-heading">
180
+ <a href="#M000006" class="method-signature">
181
+ <span class="method-name">start</span><span class="method-args">(daemon)</span>
182
+ </a>
183
+ </div>
184
+
185
+ <div class="method-description">
186
+ <p>
187
+ Starts the daemon by forking and bcoming session leader.
188
+ </p>
189
+ <p><a class="source-toggle" href="#"
190
+ onclick="toggleCode('M000006-source');return false;">[Source]</a></p>
191
+ <div class="method-source-code" id="M000006-source">
192
+ <pre>
193
+ <span class="ruby-comment cmt"># File lib/serverside/daemon.rb, line 46</span>
194
+ 46: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">start</span>(<span class="ruby-identifier">daemon</span>)
195
+ 47: <span class="ruby-identifier">fork</span> <span class="ruby-keyword kw">do</span>
196
+ 48: <span class="ruby-constant">Process</span>.<span class="ruby-identifier">setsid</span>
197
+ 49: <span class="ruby-identifier">exit</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">fork</span>
198
+ 50: <span class="ruby-constant">PidFile</span>.<span class="ruby-identifier">store</span>(<span class="ruby-identifier">daemon</span>, <span class="ruby-constant">Process</span>.<span class="ruby-identifier">pid</span>)
199
+ 51: <span class="ruby-constant">Dir</span>.<span class="ruby-identifier">chdir</span> <span class="ruby-constant">WorkingDirectory</span>
200
+ 52: <span class="ruby-constant">File</span>.<span class="ruby-identifier">umask</span> <span class="ruby-value">0000</span>
201
+ 53: <span class="ruby-constant">STDIN</span>.<span class="ruby-identifier">reopen</span> <span class="ruby-value str">&quot;/dev/null&quot;</span>
202
+ 54: <span class="ruby-constant">STDOUT</span>.<span class="ruby-identifier">reopen</span> <span class="ruby-value str">&quot;/dev/null&quot;</span>, <span class="ruby-value str">&quot;a&quot;</span>
203
+ 55: <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">reopen</span> <span class="ruby-constant">STDOUT</span>
204
+ 56: <span class="ruby-identifier">trap</span>(<span class="ruby-value str">&quot;TERM&quot;</span>) {<span class="ruby-identifier">daemon</span>.<span class="ruby-identifier">stop</span>; <span class="ruby-identifier">exit</span>}
205
+ 57: <span class="ruby-identifier">daemon</span>.<span class="ruby-identifier">start</span>
206
+ 58: <span class="ruby-keyword kw">end</span>
207
+ 59: <span class="ruby-keyword kw">end</span>
208
+ </pre>
209
+ </div>
210
+ </div>
211
+ </div>
212
+
213
+ <div id="method-M000007" class="method-detail">
214
+ <a name="M000007"></a>
215
+
216
+ <div class="method-heading">
217
+ <a href="#M000007" class="method-signature">
218
+ <span class="method-name">stop</span><span class="method-args">(daemon)</span>
219
+ </a>
220
+ </div>
221
+
222
+ <div class="method-description">
223
+ <p>
224
+ Stops the daemon by sending it a TERM signal.
225
+ </p>
226
+ <p><a class="source-toggle" href="#"
227
+ onclick="toggleCode('M000007-source');return false;">[Source]</a></p>
228
+ <div class="method-source-code" id="M000007-source">
229
+ <pre>
230
+ <span class="ruby-comment cmt"># File lib/serverside/daemon.rb, line 62</span>
231
+ 62: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">stop</span>(<span class="ruby-identifier">daemon</span>)
232
+ 63: <span class="ruby-identifier">pid</span> = <span class="ruby-constant">PidFile</span>.<span class="ruby-identifier">recall</span>(<span class="ruby-identifier">daemon</span>)
233
+ 64: <span class="ruby-constant">FileUtils</span>.<span class="ruby-identifier">rm</span>(<span class="ruby-identifier">daemon</span>.<span class="ruby-identifier">pid_fn</span>)
234
+ 65: <span class="ruby-identifier">pid</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-constant">Process</span>.<span class="ruby-identifier">kill</span>(<span class="ruby-value str">&quot;TERM&quot;</span>, <span class="ruby-identifier">pid</span>)
235
+ 66: <span class="ruby-keyword kw">end</span>
236
+ </pre>
237
+ </div>
238
+ </div>
239
+ </div>
240
+
241
+
242
+ </div>
243
+
244
+
245
+ </div>
246
+
247
+
248
+ <div id="validator-badges">
249
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
250
+ </div>
251
+
252
+ </body>
253
+ </html>