cortex-reaver 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -1,44 +1,74 @@
1
1
  CORTEX REAVER - A dangerous Ruby blog engine, with a photographic memory.
2
+ =========================================================================
2
3
 
3
- Cortex Reaver is a blog engine for textual journals, photographs, and projects;
4
- written using Ramaze and Sequel. Supports tags, comments, and simple
5
- attachments. Features canonically named URLs (/journals/show/a-post-title) with
6
- conflict resolution, useful formatting modules for content (HTML sanitizing,
7
- attachment references, BlueCloth, etc), and custom pages.
4
+ Cortex Reaver is a terrifying machine which stalks the corridors of Citadel
5
+ Station, searching for humans to assimilate into Shodan's perfection.
8
6
 
9
- GETTING STARTED
7
+ Cortex Reaver is also a blog engine for textual journals, photographs, and
8
+ projects; written using Ramaze and Sequel. It supports tags, comments, and
9
+ simple attachments. Features include canonically named URLs
10
+ (/journals/show/a-post-title) with conflict resolution, useful formatting
11
+ modules for content (HTML sanitizing, attachment references, BlueCloth, etc),
12
+ and custom pages.
10
13
 
11
- Dependencies
14
+ Getting Started
15
+ ---------------
12
16
 
13
- First, you'll need a database. For MySQL:
17
+ mkdir cortex_reaver # Create an empty directory for Cortex Reaver to lurk in.
18
+ cd cortex_reaver
19
+ cortex_reaver --migrate # Initialize an SQLite database.
20
+ cortex_reaver --start # Start the daemon.
14
21
 
15
- create database cortex_reaver;
16
- grant all privileges on cortex_reaver.* to 'cortex_reaver'@'localhost'
17
- identified by 'some-password' with grant option;
22
+ Then point your web browser at localhost:7000, hit control-x, and log in with
23
+ username "shodan", password "shodan".
24
+
25
+ You can check Cortex Reaver's status with --status, and when you're done, shut
26
+ it down with --stop.
27
+
28
+ Configuration
29
+ -------------
18
30
 
19
31
  You'll need a YAML configuration file to define Cortex Reaver's configuration.
20
32
  See proto/cortex_reaver.yaml. If no config file is specified on the command
21
- line, Cortex Reaver assumes you mean cortex_reaver.yaml in the working
22
- directory. Copy lib/proto/cortex_reaver.yaml to a fresh directory, and run
33
+ line with --config, Cortex Reaver assumes you mean cortex_reaver.yaml in the
34
+ working directory. Copy lib/proto/cortex_reaver.yaml to get started.
35
+
36
+ Databases
37
+ ---------
23
38
 
24
- bin/cortex_reaver -m -c path/to/cortex_reaver.yaml
39
+ Cortex Reaver uses Sequel (http://sequel.rubyforge.org/), so you can (in
40
+ theory) use any database Sequel supports. By default, Cortex Reaver builds an
41
+ SQLite database in the working directory, but you can set a different database
42
+ in the config file, either as a Sequel string or with hash of options.
43
+
44
+ For MySQL:
45
+
46
+ create database cortex_reaver;
47
+ grant all privileges on cortex_reaver.* to 'cortex_reaver'@'localhost'
48
+ identified by 'some-password' with grant option;
25
49
 
26
- To wipe the database and set up a fresh schema. Then run
50
+ When you've set up a new database, run cortex_reaver --migrate to update it to
51
+ the latest version. If you need to wipe your database and start over, use
52
+ cortex_reaver --blank to drop the schema and rebuild it.
27
53
 
28
- bin/cortex_reaver -s -c path/to/cortex_reaver.yaml
54
+ Customization
55
+ -------------
29
56
 
30
- To start the server. Cortex Reaver runs on port 7000 by default, and uses the
31
- Mongrel adapter; you can change both of those in your configuration file.
57
+ You may find development mode useful: it reloads source files when they're
58
+ changed, displays traces for errors instead of 404 and 500 responses, logs
59
+ more, and runs in the console instead of detaching by default. Just set :mode
60
+ => :development in your configuration.
32
61
 
33
- When you visit your new site, hit control-x (or visit /users/login) to bring up
34
- a login prompt. The default username and password are both 'shodan'. Then start
35
- posting journals, photographs, projects, and pages!
62
+ Requests for static objects (images, css, javascript, etc.) is pulled from
63
+ public/, which can be specified in your configuration or defaults to
64
+ `cwd`/public. If a request for a file can't be found there, it's retrieved from
65
+ Cortex Reaver's own public directory in lib/public.
36
66
 
37
- Presumably you'll want to start changing images, stylesheets, etc. around. Just
38
- create a directory called 'public' and specify its path in your config file.
39
- Anything in that directory overrides Cortex Reaver's default public files.
67
+ You can also set up your own view templates: copy lib/view to some other
68
+ directory, and specify :view_root in your configuration.
40
69
 
41
- CREDITS
70
+ Credits
71
+ -------
42
72
 
43
73
  I am indebted to the good folks of #sequel and #ramaze for their many
44
74
  suggestions in writing Cortex Reaver, and also to Ryan Grove
data/bin/cortex_reaver CHANGED
@@ -25,7 +25,7 @@ module CortexReaver
25
25
  @values = {}
26
26
  parser = OptionParser.new do |o|
27
27
  o.on '-c', '--config file', 'Configuration file' do |file|
28
- @values[:config_file] = file
28
+ self.config_file = file
29
29
  end
30
30
 
31
31
  o.on '-f', '--force', 'Just do it' do
@@ -47,23 +47,40 @@ module CortexReaver
47
47
  @values[:schema_version] = version ? version.to_i : nil
48
48
  end
49
49
 
50
- o.on '-r', '--reset',
50
+ o.on '-b', '--blank',
51
51
  'Wipes the database and sets up a clean copy of the latest version.' do
52
- @action = :reset
52
+ @action = :blank
53
+ end
54
+
55
+ o.on '-r', '--restart', 'Restart CortexReaver' do
56
+ @action = :restart
57
+ end
58
+
59
+ o.on '-k', '--stop', 'Stop CortexReaver' do
60
+ @action = :stop
61
+ end
62
+
63
+ o.on '--status', 'Check CortexReaver status.' do
64
+ @action = :status
53
65
  end
54
66
  end
55
67
 
56
68
  parser.parse! ARGV
57
69
 
70
+
58
71
  # Main
59
72
  case @action
73
+ when :status
74
+ # Make a quick HTTP request to see how we're doing.
75
+ require 'open-uri'
76
+ reload_config
77
+ response = open("http://#{config[:host] || 'localhost'}:#{config[:port]}/")
78
+ puts response.status.join(' ');
60
79
  when :migrate
61
80
  version = @values[:schema_version]
62
81
 
63
- self.config_file = @values[:config_file]
64
- self.reload_config
65
- self.setup_db
66
-
82
+ reload_config
83
+ setup_db false
67
84
  puts "Using database #{config[:database][:host]}/#{config[:database][:database]}."
68
85
 
69
86
  current_version = Sequel::Migrator.get_current_migration_version(db)
@@ -93,17 +110,22 @@ module CortexReaver
93
110
  exit
94
111
  end
95
112
 
96
- when :reset
113
+ when :blank
97
114
  if confirm "Are you sure you wish to wipe the database?"
98
115
  # Strangely, calling Migrator.apply to go down and then up doesn't seem to work. :-/
99
116
  system($0, '-f', '-m', '0')
100
117
  system($0, '-f', '-m')
101
118
  end
102
119
 
120
+ when :restart
121
+ restart
122
+
103
123
  when :start
104
- self.config_file = @values[:config_file]
105
124
  start
106
125
 
126
+ when :stop
127
+ stop
128
+
107
129
  else
108
130
  abort("Unknown action: #{@action}")
109
131
  end
data/lib/cortex_reaver.rb CHANGED
@@ -5,6 +5,7 @@ begin
5
5
  require 'ramaze'
6
6
  require 'sequel'
7
7
  require 'yaml'
8
+ require 'socket'
8
9
  rescue LoadError => e
9
10
  puts e
10
11
  puts "You probably need to install some packages Cortex Reaver needs. Try:
@@ -16,6 +17,7 @@ end
16
17
  module CortexReaver
17
18
  ROOT = File.expand_path(__DIR__/'..')
18
19
  LIB_DIR = ROOT/:lib/:cortex_reaver
20
+ HOME_DIR = Dir.pwd
19
21
 
20
22
  # We need the configuration class before everything.
21
23
  require LIB_DIR/:config
@@ -33,24 +35,77 @@ module CortexReaver
33
35
  @config_file = file
34
36
  end
35
37
 
36
- # Sets the configuration file and reloads
37
- def self.configure(file = nil)
38
- if file
39
- self.config_file = file
40
- end
41
- reload_config
42
- end
43
-
44
38
  def self.db
45
39
  @db
46
40
  end
47
41
 
48
- # Load libraries
49
- def self.load
50
- # Prepare Ramaze
42
+ # Prepare Ramaze, create directories, etc.
43
+ def self.init
44
+ # Tell Ramaze where to find public files and views
51
45
  Ramaze::Global.public_root = LIB_DIR/:public
52
46
  Ramaze::Global.view_root = config[:view_root]
53
47
 
48
+ # Check directories
49
+ if config[:public_root] and not File.directory? config[:public_root]
50
+ # Try to create a public directory
51
+ begin
52
+ FileUtils.mkdir_p config[:public_root]
53
+ rescue => e
54
+ Ramaze::Log.warn "Unable to create a public directory at #{config[:public_root]}: #{e}."
55
+ end
56
+ end
57
+ if config[:log_root] and not File.directory? config[:log_root]
58
+ # Try to create a log directory
59
+ begin
60
+ FileUtils.mkdir_p config[:log_root]
61
+ File.chmod 0750, config[:log_root]
62
+ rescue => e
63
+ Ramaze::Log.warn "Unable to create a log directory at #{config[:log_root]}: #{e}. File logging disabled."
64
+ # Disable logging
65
+ config[:log_root] = nil
66
+ end
67
+ end
68
+
69
+ # Clear loggers
70
+ Ramaze::Log.loggers.clear
71
+
72
+ unless config[:daemon]
73
+ # Log to console
74
+ Ramaze::Log.loggers << Ramaze::Logger::Informer.new
75
+ end
76
+
77
+ case config[:mode]
78
+ when :production
79
+ if config[:log_root]
80
+ # Log to file
81
+ Ramaze::Log.loggers << Ramaze::Logger::Informer.new(
82
+ File.join(config[:log_root], 'production.log'),
83
+ [:error, :info, :notice]
84
+ )
85
+ end
86
+
87
+ # Don't reload source code
88
+ Ramaze::Global.sourcereload = false
89
+
90
+ # Don't expose errors
91
+ Ramaze::Dispatcher::Error::HANDLE_ERROR.update({
92
+ ArgumentError => [404, 'error_404'],
93
+ Exception => [500, 'error_500']
94
+ })
95
+ when :development
96
+ if config[:log_root]
97
+ # Log to file
98
+ Ramaze::Log.loggers << Ramaze::Logger::Informer.new(
99
+ File.join(config[:log_root], 'development.log')
100
+ )
101
+ end
102
+ else
103
+ raise ArgumentError.new("unknown Cortex Reaver mode #{config[:mode].inspect}. Expected one of [:production, :development].")
104
+ end
105
+ end
106
+
107
+ # Load libraries
108
+ def self.load
54
109
  # Load controllers and models
55
110
  acquire LIB_DIR/:snippets/'**'/'*'
56
111
  acquire LIB_DIR/:support/'*'
@@ -65,45 +120,74 @@ module CortexReaver
65
120
  @config = CortexReaver::Config.new(config_file)
66
121
  end
67
122
 
68
- def self.start
69
- # Load configuration
70
- reload_config
71
-
72
- # Connect to db
73
- setup_db
123
+ # Restart Cortex Reaver
124
+ def self.restart
125
+ begin
126
+ stop
127
+ sleep 5
128
+ ensure
129
+ start
130
+ end
131
+ end
74
132
 
75
- # Load library
76
- self.load
133
+ # Once environment is prepared, run Ramaze
134
+ def self.run
135
+ # Shutdown callback
136
+ at_exit do
137
+ FileUtils.rm(config[:pidfile]) if File.exist? config[:pidfile]
138
+ end
77
139
 
78
- # Go!
79
- Ramaze.start :adapter => config[:adapter], :port => config[:port]
80
- end
140
+ Ramaze::Log.info "Cortex Reaver #{Process.pid} stalking victims."
81
141
 
82
- # Load CortexReaver environment; do everything except start Ramaze
83
- def self.setup(file)
84
- # Load config
85
- @config_file = file
86
- reload_config
142
+ # Run Ramaze
143
+ Ramaze.startup(
144
+ :adapter => config[:adapter],
145
+ :host => config[:host],
146
+ :port => config[:port]
147
+ )
148
+
149
+ puts "Cortex Reaver finished."
150
+ end
87
151
 
152
+ # Load Cortex Reaver environment; do everything except start Ramaze
153
+ def self.setup
88
154
  # Connect to DB
89
155
  setup_db
90
156
 
157
+ # Prepare Ramaze, check directories, etc.
158
+ init
159
+
91
160
  # Load library
92
161
  self.load
93
162
  end
94
163
 
95
- # Connect to DB
96
- def self.setup_db
164
+ # Connect to DB. If check_schema is false, doesn't check to see that the schema
165
+ # version is up to date.
166
+ def self.setup_db(check_schema = true)
97
167
  unless config
98
168
  raise RuntimeError.new("no configuration available!")
99
169
  end
100
170
 
171
+ # Build Sequel connection string
101
172
  unless (string = config[:database]).is_a? String
102
173
  d = config[:database]
103
174
  string = "#{d[:driver]}://#{d[:user]}:#{d[:password]}@#{d[:host]}/#{d[:database]}"
104
175
  end
105
176
 
106
- @db = Sequel.connect(string)
177
+ begin
178
+ @db = Sequel.connect(string)
179
+ rescue => e
180
+ Ramaze::Log.error("Unable to connect to database: #{e}.")
181
+ abort
182
+ end
183
+
184
+ # Check schema
185
+ if check_schema and
186
+ Sequel::Migrator.get_current_migration_version(@db) !=
187
+ Sequel::Migrator.latest_migration_version(LIB_DIR/:migrations)
188
+
189
+ raise RuntimeError.new("database schema missing or out of date. Please run `cortex_reaver --migrate`.")
190
+ end
107
191
  end
108
192
 
109
193
  # Disconnect from DB
@@ -111,4 +195,110 @@ module CortexReaver
111
195
  @db.disconnect
112
196
  @db = nil
113
197
  end
198
+
199
+ def self.start
200
+ reload_config
201
+
202
+ # Check PID
203
+ if File.file? config[:pidfile]
204
+ pid = File.read(config[:pidfile], 20).strip
205
+ abort "Cortex Reaver already running? (#{pid})"
206
+ end
207
+
208
+ puts "Activating Cortex Reaver."
209
+ setup
210
+
211
+ # Check port availability
212
+ begin
213
+ socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
214
+ sockaddr = Socket.pack_sockaddr_in(*[config[:port], config[:host]])
215
+ socket.bind(sockaddr)
216
+ socket.close
217
+ rescue => e
218
+ abort "Unable to bind to port #{config[:host]}:#{config[:port]} (#{e})"
219
+ end
220
+
221
+ if config[:daemon]
222
+ fork do
223
+ # Drop console, create new session
224
+ Process.setsid
225
+ exit if fork
226
+
227
+ # Write pidfile
228
+ File.open(config[:pidfile], 'w') do |file|
229
+ file << Process.pid
230
+ end
231
+
232
+ # Move to homedir; drop creation mask
233
+ Dir.chdir HOME_DIR
234
+ File.umask 0000
235
+
236
+ # Drop stream handles
237
+ STDIN.reopen('/dev/null')
238
+ STDOUT.reopen('/dev/null', 'a')
239
+ STDERR.reopen(STDOUT)
240
+
241
+ # Go!
242
+ run
243
+ end
244
+ else
245
+ # Run in foreground.
246
+ run
247
+ end
248
+ end
249
+
250
+ def self.stop
251
+ reload_config
252
+
253
+ unless config[:pidfile]
254
+ abort "No pidfile to stop."
255
+ end
256
+
257
+ unless File.file? config[:pidfile]
258
+ abort "Cortex Reaver not running? (check #{config[:pidfile]})"
259
+ end
260
+
261
+ # Get PID
262
+ pid = File.read(config[:pidfile], 20).strip
263
+ unless (pid = pid.to_i) != 0
264
+ abort "Invalid process ID in pidfile (#{pid})."
265
+ end
266
+
267
+ puts "Shutting down Cortex Reaver #{pid}..."
268
+
269
+ # Attempt to end Ramaze nicely.
270
+ begin
271
+ # Try to shut down Ramaze nicely.
272
+ Process.kill('INT', pid)
273
+ puts "Shut down."
274
+ killed = true
275
+ rescue Errno::ESRCH
276
+ # The process doesn't exist.
277
+ puts "No Cortex Reaver with pid #{pid}."
278
+ killed = true
279
+ rescue => e
280
+ begin
281
+ # Try to end the process forcibly.
282
+ puts "Cortex Reaver #{pid} has gone rogue (#{e}); forcibly terminating..."
283
+ Process.kill('KILL', pid)
284
+ puts "Killed."
285
+ killed = true
286
+ rescue => e2
287
+ # That failed, too.
288
+ puts "Unable to terminate Cortex Reaver: #{e2}."
289
+ killed = false
290
+ end
291
+ end
292
+
293
+ # Remove pidfile if killed.
294
+ if killed
295
+ begin
296
+ FileUtils.rm(config[:pidfile])
297
+ rescue Errno::ENOENT
298
+ # Pidfile gone
299
+ rescue => e
300
+ puts "Unable to remove pidfile #{config[:pidfile]}: #{e}."
301
+ end
302
+ end
303
+ end
114
304
  end
@@ -2,20 +2,66 @@ module CortexReaver
2
2
  # Contains site-specific configuration information for a CortexReaver site.
3
3
  class Config < Hash
4
4
  # Pass a YAML file with configuration options. At a minimum, it should specify
5
- # database = {:proto, :username, :pasword, :host, :database}
6
- # or database = "sequel_connect_string"
5
+ # :database = {:proto, :username, :pasword, :host, :database}
6
+ # or :database = "sequel_connect_string"
7
+ #
8
+ # :public_root - The directory public files are hosted from. Defaults to
9
+ # HOME_DIR/public.
10
+ # :view_root - The directory containing erubis view templates. Defaults to
11
+ # Cortex Reaver's builtin templates.
12
+ # :log_root - The directory that Cortex Reaver should log to. Defaults to
13
+ # HOME_DIR/log. If nil, file logging disabled.
14
+ # :mode - Cortex Reaver mode: either :development or :production
15
+ # :daemon - Whether to daemonize or not. Defaults to :true if :mode
16
+ # is :production, otherwise nil.
17
+ # :adapter - The Ramaze adapter name (default 'mongrel')
18
+ # :host - Host to bind to
19
+ # :port - Port to bind to (default 7000)
20
+ # :pidfile - Process ID file for this server. Defaults to
21
+ # HOME_DIR/cortex_reaver_<host>_<port>.pid
22
+ #
23
+ # Site configuration options
24
+ # :site = {
25
+ # :name - The name of the site
26
+ # :author - The site author's name
27
+ # :keywords - Keywords describing the site
28
+ # :description - A short description of the site.
29
+ # }
7
30
  def initialize(file)
8
31
  # Defaults
9
- self[:public_root] = File.join(CortexReaver::LIB_DIR, 'public')
32
+ self[:database] = 'sqlite:////' + File.join(
33
+ File.expand_path(CortexReaver::HOME_DIR),
34
+ 'cortex_reaver.db'
35
+ )
36
+ self[:public_root] = File.join(CortexReaver::HOME_DIR, 'public')
10
37
  self[:view_root] = File.join(CortexReaver::LIB_DIR, 'view')
38
+ self[:log_root] = File.join(CortexReaver::HOME_DIR, 'log')
39
+ self[:mode] = :production
11
40
  self[:adapter] = 'mongrel'
41
+ self[:host] = nil
12
42
  self[:port] = 7000
13
43
 
14
- begin
15
- self.merge!(YAML.load(File.read(file)))
16
- rescue => e
17
- raise RuntimeError.new("unable to load local configuration file #{file}: (#{e.message})")
44
+ self[:site] = {
45
+ :name => 'Cortex Reaver',
46
+ :description => "Stalks the dark corridors of this station, converting humans to Shodan's perfection.",
47
+ :keywords => 'Cortex Reaver, blog',
48
+ :author => 'Shodan'
49
+ }
50
+
51
+ # Load from file
52
+ if File.exists? file
53
+ begin
54
+ self.merge!(YAML.load(File.read(file)))
55
+ rescue => e
56
+ raise RuntimeError.new("unable to load local configuration file #{file}: (#{e.message})")
57
+ end
18
58
  end
59
+
60
+ # Pidfile
61
+ self[:pidfile] ||= File.join(CortexReaver::HOME_DIR, "cortex_reaver_#{self[:host] ? self[:host].to_s + '_' : ''}#{self[:port]}.pid")
62
+
63
+ # Daemon mode
64
+ self[:daemon] ||= true if self[:mode] == :production
19
65
  end
20
66
  end
21
67
  end
@@ -112,7 +112,7 @@ th {
112
112
  background: #c6c6c6;
113
113
  padding: 6px;
114
114
  border-left: 1px solid #bbb;
115
- width: 170px;
115
+ width: 158px;
116
116
  }
117
117
 
118
118
  #sidebar .box {
@@ -1,6 +1,6 @@
1
1
  module CortexReaver
2
2
  APP_NAME = 'Cortex Reaver'
3
- APP_VERSION = '0.0.1'
3
+ APP_VERSION = '0.0.2'
4
4
  APP_AUTHOR = 'aphyr'
5
5
  APP_EMAIL = 'aphyr@aphyr.com'
6
6
  APP_URL = 'http://aphyr.com'
@@ -8,7 +8,7 @@
8
8
  <meta http-equiv="Content-Style-Type" content="text/css" />
9
9
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
10
10
  <meta http-equiv="expires" content="0" />
11
- <meta name="description" content="<%=attr_h CortexReaver.config[:site][:description] %>" />
11
+ <meta name="description" content="<%= attr_h CortexReaver.config[:site][:description] %>" />
12
12
  <meta name="generator" content="Cortex Reaver <%= CortexReaver::APP_VERSION %>" />
13
13
  <meta name="keywords" content="<%= attr_h CortexReaver.config[:site][:keywords] %>" />
14
14
  <meta name="author" content="<%= attr_h CortexReaver.config[:site][:author] %>" />
@@ -1,11 +1,14 @@
1
1
  ---
2
2
  # Database connection. You can also just use a Sequel connect() string.
3
- :database:
4
- :driver: 'mysql'
5
- :host: 'localhost'
6
- :user: 'cortex_reaver'
7
- :password: 'some-password'
8
- :database: 'cortex_reaver'
3
+ # :database:
4
+ # :driver: 'mysql'
5
+ # :host: 'localhost'
6
+ # :user: 'cortex_reaver'
7
+ # :password: 'some-password'
8
+ # :database: 'cortex_reaver'
9
+ #
10
+ # Or something like...
11
+ # :database: 'sqlite:////tmp/cortex_reaver.db'
9
12
 
10
13
  # Site-specific configuration parameters
11
14
  :site:
@@ -14,15 +17,32 @@
14
17
  :keywords: 'Cortex Reaver, Citadel Station'
15
18
  :author: 'Shodan'
16
19
 
17
- # Ramaze port and adapter
18
- # :adapter: 'ramaze'
19
- # :port: 7000
20
-
21
20
  # The static files overlay of your site. You need to own this directory if you
22
- # want to use attachments.
21
+ # want to use attachments. It will be created for you, if it does not exist.
23
22
  # :public_root: '/var/www/public'
24
23
 
25
24
  # The directory that contains Cortex Reaver templates. You can copy this from
26
25
  # the lib/cortex_reaver directory and customize to your liking, then reference
27
26
  # that directory here.
28
27
  # :view_root: '/var/www/view'
28
+
29
+ # The directory for CortexReaver log files. Defaults to HOME_DIR/log.
30
+ # :log_root: '/var/www/log'
31
+
32
+ # Cortex Reaver has two modes: production and development. Production disables debugging
33
+ # error messages (returning 404 and 500 errors instead), daemonizes by default, and logs
34
+ # less.
35
+ # :mode: :production
36
+
37
+ # Whether to daemonize (detach from console and lurk silently, awaiting innocent hackers).
38
+ # Defaults to true in production mode, false in development mode.
39
+ # :daemon: true
40
+
41
+ # Ramaze host, port, and adapter. Defaults to nil (listens on all interfaces), mongrel,
42
+ # and port 7000.
43
+ # :host: 127.0.0.1
44
+ # :adapter: 'mongrel'
45
+ # :port: 7000
46
+
47
+ # Process ID file: stores each Cortex Reaver's process ID, so you can control it later.
48
+ # :pidfile: /var/www/cortex_reaver.pid
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cortex-reaver
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - aphyr