cortex-reaver 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +1 -1
- data/bin/cortex_reaver +3 -4
- data/lib/cortex_reaver.rb +270 -110
- data/lib/cortex_reaver/cache.rb +23 -0
- data/lib/cortex_reaver/config.rb +178 -74
- data/lib/cortex_reaver/controller/admin.rb +64 -4
- data/lib/cortex_reaver/controller/comment.rb +4 -4
- data/lib/cortex_reaver/controller/controller.rb +3 -3
- data/lib/cortex_reaver/controller/journal.rb +4 -2
- data/lib/cortex_reaver/controller/main.rb +117 -26
- data/lib/cortex_reaver/controller/page.rb +7 -0
- data/lib/cortex_reaver/controller/photograph.rb +12 -10
- data/lib/cortex_reaver/controller/tag.rb +1 -1
- data/lib/cortex_reaver/controller/user.rb +7 -2
- data/lib/cortex_reaver/helper/attachments.rb +2 -2
- data/lib/cortex_reaver/helper/crud.rb +7 -7
- data/lib/cortex_reaver/helper/feeds.rb +56 -38
- data/lib/cortex_reaver/helper/form.rb +12 -16
- data/lib/cortex_reaver/helper/navigation.rb +35 -16
- data/lib/cortex_reaver/helper/photographs.rb +2 -2
- data/lib/cortex_reaver/helper/sidebar.rb +44 -0
- data/lib/cortex_reaver/helper/tags.rb +32 -9
- data/lib/cortex_reaver/helper/workflow.rb +2 -14
- data/lib/cortex_reaver/layout/blank.rhtml +27 -31
- data/lib/cortex_reaver/layout/text.rhtml +54 -67
- data/lib/cortex_reaver/migrations/014_convert_projects_to_pages.rb +79 -0
- data/lib/cortex_reaver/model/comment.rb +7 -8
- data/lib/cortex_reaver/model/page.rb +5 -3
- data/lib/cortex_reaver/model/photograph.rb +57 -13
- data/lib/cortex_reaver/model/tag.rb +1 -4
- data/lib/cortex_reaver/model/user.rb +6 -3
- data/lib/cortex_reaver/plugin.rb +1 -1
- data/lib/cortex_reaver/plugins/twitter.rb +185 -0
- data/lib/cortex_reaver/public/css/actions.css +31 -0
- data/lib/cortex_reaver/public/css/admin.css +50 -27
- data/lib/cortex_reaver/public/css/attachments.css +11 -0
- data/lib/cortex_reaver/public/css/autotags.css +38 -0
- data/lib/cortex_reaver/public/css/code.css +10 -2
- data/lib/cortex_reaver/public/css/colophon.css +10 -0
- data/lib/cortex_reaver/public/css/commments.css +7 -0
- data/lib/cortex_reaver/public/css/custom.css +1 -0
- data/lib/cortex_reaver/public/css/flash.css +17 -0
- data/lib/cortex_reaver/public/css/fonts.css +22 -0
- data/lib/cortex_reaver/public/css/form.css +15 -3
- data/lib/cortex_reaver/public/css/generics.css +39 -0
- data/lib/cortex_reaver/public/css/icons.css +4 -0
- data/lib/cortex_reaver/public/css/journals.css +3 -0
- data/lib/cortex_reaver/public/css/main.css +30 -312
- data/lib/cortex_reaver/public/css/pagination.css +50 -0
- data/lib/cortex_reaver/public/css/photo-show.css +87 -0
- data/lib/cortex_reaver/public/css/photo.css +28 -97
- data/lib/cortex_reaver/public/css/progress.css +35 -0
- data/lib/cortex_reaver/public/css/sidebar.css +83 -0
- data/lib/cortex_reaver/public/css/table-of-contents.css +26 -0
- data/lib/cortex_reaver/public/css/table.css +3 -0
- data/lib/cortex_reaver/public/css/tags.css +29 -0
- data/lib/cortex_reaver/public/css/text.css +19 -1
- data/lib/cortex_reaver/public/css/top_actions.css +50 -0
- data/lib/cortex_reaver/public/css/users.css +3 -0
- data/lib/cortex_reaver/public/images/admin/icons.png +0 -0
- data/lib/cortex_reaver/public/images/admin/icons.xcf +0 -0
- data/lib/cortex_reaver/public/images/background_tile.png +0 -0
- data/lib/cortex_reaver/public/images/edit_34.png +0 -0
- data/lib/cortex_reaver/public/images/edit_34_prelight.png +0 -0
- data/lib/cortex_reaver/public/images/elided.png +0 -0
- data/lib/cortex_reaver/public/images/grid_34.png +0 -0
- data/lib/cortex_reaver/public/images/grid_34_prelight.png +0 -0
- data/lib/cortex_reaver/public/images/next_11.png +0 -0
- data/lib/cortex_reaver/public/images/next_34.png +0 -0
- data/lib/cortex_reaver/public/images/next_34_prelight.png +0 -0
- data/lib/cortex_reaver/public/images/prev_11.png +0 -0
- data/lib/cortex_reaver/public/images/prev_34.png +0 -0
- data/lib/cortex_reaver/public/images/prev_34_prelight.png +0 -0
- data/lib/cortex_reaver/public/js/admin.js +15 -22
- data/lib/cortex_reaver/public/js/autotags.js +120 -0
- data/lib/cortex_reaver/public/js/jquery.autocomplete.js +135 -176
- data/lib/cortex_reaver/public/js/jquery.color.js +124 -0
- data/lib/cortex_reaver/public/js/jquery.corners.min.js +7 -0
- data/lib/cortex_reaver/public/js/jquery.hotkeys-0.7.9.js +244 -0
- data/lib/cortex_reaver/public/js/jquery.js +4361 -4
- data/lib/cortex_reaver/public/js/jquery.periodicalupdater.js +98 -0
- data/lib/cortex_reaver/public/js/photo.js +3 -32
- data/lib/cortex_reaver/public/robots.txt +3 -0
- data/lib/cortex_reaver/snippets/ramaze/cache/memcached.rb +13 -10
- data/lib/cortex_reaver/snippets/range.rb +9 -0
- data/lib/cortex_reaver/support/attachments.rb +12 -0
- data/lib/cortex_reaver/support/comments.rb +1 -3
- data/lib/cortex_reaver/support/renderer.rb +20 -17
- data/lib/cortex_reaver/support/sequenceable.rb +6 -6
- data/lib/cortex_reaver/support/tags.rb +15 -7
- data/lib/cortex_reaver/version.rb +1 -1
- data/lib/cortex_reaver/view/admin/configuration.rhtml +7 -0
- data/lib/cortex_reaver/view/admin/index.rhtml +3 -0
- data/lib/cortex_reaver/view/admin/regenerate_photo_sizes.rhtml +16 -0
- data/lib/cortex_reaver/view/adminbox.rhtml +34 -44
- data/lib/cortex_reaver/view/comments/comment.rhtml +1 -1
- data/lib/cortex_reaver/view/comments/form.rhtml +1 -2
- data/lib/cortex_reaver/view/comments/post_form.rhtml +2 -10
- data/lib/cortex_reaver/view/head.rhtml +11 -0
- data/lib/cortex_reaver/view/journals/journal.rhtml +3 -3
- data/lib/cortex_reaver/view/journals/show.rhtml +0 -4
- data/lib/cortex_reaver/view/js.rhtml +1 -0
- data/lib/cortex_reaver/view/pages/list.rhtml +3 -23
- data/lib/cortex_reaver/view/pages/row.rhtml +13 -0
- data/lib/cortex_reaver/view/photographs/grid.rhtml +30 -36
- data/lib/cortex_reaver/view/photographs/show.rhtml +42 -108
- data/lib/cortex_reaver/view/sidebar/explore_photos.rhtml +7 -0
- data/lib/cortex_reaver/view/sidebar/photographs.rhtml +15 -0
- data/lib/cortex_reaver/view/sidebar/sections.rhtml +4 -0
- data/lib/cortex_reaver/view/sidebar/twitter.rhtml +12 -0
- data/lib/cortex_reaver/view/tags/show.rhtml +0 -10
- data/lib/cortex_reaver/view/tracker.rhtml +0 -0
- data/lib/cortex_reaver/view/users/list.rhtml +1 -7
- data/lib/cortex_reaver/view/users/login.rhtml +1 -1
- metadata +103 -43
- data/lib/cortex_reaver/controller/project.rb +0 -53
- data/lib/cortex_reaver/helper/template.rb +0 -37
- data/lib/cortex_reaver/model/project.rb +0 -57
- data/lib/cortex_reaver/public/css/ramaze_error.css +0 -90
- data/lib/cortex_reaver/public/images/atom-xml-icon.png +0 -0
- data/lib/cortex_reaver/public/images/body.png +0 -0
- data/lib/cortex_reaver/public/images/border_bottom.png +0 -0
- data/lib/cortex_reaver/public/images/border_bottom_left.png +0 -0
- data/lib/cortex_reaver/public/images/border_bottom_right.png +0 -0
- data/lib/cortex_reaver/public/images/border_left.png +0 -0
- data/lib/cortex_reaver/public/images/border_right.png +0 -0
- data/lib/cortex_reaver/public/images/border_top.png +0 -0
- data/lib/cortex_reaver/public/images/border_top_left.png +0 -0
- data/lib/cortex_reaver/public/images/border_top_right.png +0 -0
- data/lib/cortex_reaver/public/images/header.png +0 -0
- data/lib/cortex_reaver/public/images/header.xcf +0 -0
- data/lib/cortex_reaver/public/images/indicator.gif +0 -0
- data/lib/cortex_reaver/public/images/rss-xml-icon.png +0 -0
- data/lib/cortex_reaver/public/images/sections.png +0 -0
- data/lib/cortex_reaver/public/images/sections_highlight.png +0 -0
- data/lib/cortex_reaver/public/js/jquery.autocompletefb.js +0 -125
- data/lib/cortex_reaver/view/photographs/sidebar.rhtml +0 -7
- data/lib/cortex_reaver/view/projects/form.rhtml +0 -14
- data/lib/cortex_reaver/view/projects/list.rhtml +0 -31
- data/lib/cortex_reaver/view/projects/show.rhtml +0 -42
- data/lib/proto/cortex_reaver.yaml +0 -47
data/README
CHANGED
@@ -28,7 +28,7 @@ cortex_reaver --migrate # Initialize an SQLite database.
|
|
28
28
|
cortex_reaver --start # Start the daemon.
|
29
29
|
|
30
30
|
Then point your web browser at localhost:7000, hit control-x, and log in with
|
31
|
-
username "shodan", password "
|
31
|
+
username "shodan", password "citadelstation".
|
32
32
|
|
33
33
|
You can check Cortex Reaver's status with --status, and when you're done, shut
|
34
34
|
it down with --stop.
|
data/bin/cortex_reaver
CHANGED
@@ -59,7 +59,6 @@ module CortexReaver
|
|
59
59
|
@values[:load_file] = file
|
60
60
|
end
|
61
61
|
|
62
|
-
|
63
62
|
o.on '-m', '--migrate [version]',
|
64
63
|
'Migrate the database to schema version, or to the latest version' do |version|
|
65
64
|
@action = :migrate
|
@@ -109,7 +108,7 @@ module CortexReaver
|
|
109
108
|
|
110
109
|
# Connect to dump DB
|
111
110
|
dump = Sequel.connect "sqlite:////#{File.expand_path(file)}"
|
112
|
-
Sequel::Migrator.apply dump, File.join(LIB_DIR
|
111
|
+
Sequel::Migrator.apply dump, File.join(LIB_DIR, 'migrations'), current_version
|
113
112
|
|
114
113
|
# Copy tables
|
115
114
|
db.tables.each do |table|
|
@@ -142,7 +141,7 @@ module CortexReaver
|
|
142
141
|
|
143
142
|
# Drop current migrations and move to the dump's version
|
144
143
|
system($0, '-f', '-m', '0')
|
145
|
-
Sequel::Migrator.apply db, LIB_DIR
|
144
|
+
Sequel::Migrator.apply db, File.join(LIB_DIR, 'migrations'), current_version
|
146
145
|
|
147
146
|
# Copy tables
|
148
147
|
dump.tables.each do |table|
|
@@ -236,7 +235,7 @@ module CortexReaver
|
|
236
235
|
stop
|
237
236
|
|
238
237
|
when :test
|
239
|
-
require File.join(
|
238
|
+
require File.join(LIB_DIR, '..', '..', 'spec', 'spec')
|
240
239
|
|
241
240
|
else
|
242
241
|
abort("Unknown action: #{@action}")
|
data/lib/cortex_reaver.rb
CHANGED
@@ -1,12 +1,16 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
|
3
3
|
begin
|
4
|
+
require 'forwardable' # Patch for broken Thin...
|
4
5
|
require 'find'
|
5
6
|
require 'rubygems'
|
6
7
|
require 'ramaze'
|
7
8
|
require 'sequel'
|
8
|
-
require '
|
9
|
+
require 'construct'
|
9
10
|
require 'socket'
|
11
|
+
require 'cssmin'
|
12
|
+
require 'jsmin'
|
13
|
+
require 'json'
|
10
14
|
|
11
15
|
require 'sequel/extensions/migration'
|
12
16
|
require 'sequel/extensions/inflector'
|
@@ -14,8 +18,8 @@ begin
|
|
14
18
|
rescue LoadError => e
|
15
19
|
puts e
|
16
20
|
puts "You probably need to install some packages Cortex Reaver needs. Try:
|
17
|
-
apt-get install
|
18
|
-
gem install thin mongrel ramaze sequel yaml erubis BlueCloth rmagick exifr hpricot
|
21
|
+
apt-get install libmagick9-dev libmysql-ruby;
|
22
|
+
gem install thin mongrel ramaze sequel yaml erubis BlueCloth rmagick exifr hpricot;"
|
19
23
|
exit 255
|
20
24
|
end
|
21
25
|
|
@@ -29,6 +33,113 @@ module CortexReaver
|
|
29
33
|
require File.join(LIB_DIR, 'version')
|
30
34
|
require File.join(LIB_DIR, 'config')
|
31
35
|
|
36
|
+
# Reads files from stock_dir and custom_dir matching pattern, and appends
|
37
|
+
# their contents. Returns a string.
|
38
|
+
def self.collect_files(stock_dir, custom_dir, pattern = /^[^\.].+/, opts = {})
|
39
|
+
str = ""
|
40
|
+
# Get target files
|
41
|
+
files = Dir.entries(stock_dir) | Dir.entries(custom_dir)
|
42
|
+
|
43
|
+
# Reorder files if necessary.
|
44
|
+
if order = opts[:order]
|
45
|
+
files = (order & files) + (files - order)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Read files
|
49
|
+
files.each do |file|
|
50
|
+
next unless file =~ pattern
|
51
|
+
custom_file = File.join(custom_dir, file)
|
52
|
+
stock_file = File.join(stock_dir, file)
|
53
|
+
if File.exists? custom_file
|
54
|
+
str << File.read(custom_file)
|
55
|
+
else
|
56
|
+
str << File.read(stock_file)
|
57
|
+
end
|
58
|
+
str << "\n"
|
59
|
+
end
|
60
|
+
|
61
|
+
str
|
62
|
+
end
|
63
|
+
|
64
|
+
# Compiles CSS files and creates minified version.
|
65
|
+
def self.compile_css
|
66
|
+
Ramaze::Log.info "Compiling CSS"
|
67
|
+
stock_dir = File.join(LIB_DIR, 'public', 'css')
|
68
|
+
custom_dir = File.join(config.public_root, 'css')
|
69
|
+
|
70
|
+
# Get CSS files
|
71
|
+
FileUtils.mkdir_p(custom_dir)
|
72
|
+
css = collect_files(stock_dir, custom_dir, /^((?!style).)*\.css$/, :order => config.css)
|
73
|
+
|
74
|
+
# Write minified CSS
|
75
|
+
File.open(File.join(custom_dir, 'style.css'), 'w') do |file|
|
76
|
+
file.write CSSMin.minify(css)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Compiles JS files and creates minified version.
|
81
|
+
def self.compile_js
|
82
|
+
Ramaze::Log.info "Compiling JS"
|
83
|
+
stock_dir = File.join(LIB_DIR, 'public', 'js')
|
84
|
+
custom_dir = File.join(config.public_root, 'js')
|
85
|
+
|
86
|
+
# Get JS files
|
87
|
+
FileUtils.mkdir_p(custom_dir)
|
88
|
+
js = collect_files(stock_dir, custom_dir, /^((?!site).)*\.js$/, :order => config.js)
|
89
|
+
|
90
|
+
# Write minified JS
|
91
|
+
File.open(File.join(custom_dir, 'site.js'), 'w') do |file|
|
92
|
+
file.write js #JSMin.minify(js)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.compile_resources
|
97
|
+
# Prepare CSS/JS
|
98
|
+
self.compile_css
|
99
|
+
self.compile_js
|
100
|
+
|
101
|
+
if config.mode == :development
|
102
|
+
# Recompile CSS/JS on changes.
|
103
|
+
@asset_compiler = Thread.new do
|
104
|
+
# Get files to watch
|
105
|
+
files = Dir.glob(File.join(LIB_DIR, 'public', 'css', '*.css'))
|
106
|
+
files |= Dir.glob(File.join(config.public_root, 'css', '*.css'))
|
107
|
+
files |= Dir.glob(File.join(LIB_DIR, 'public', 'js', '*.js'))
|
108
|
+
files |= Dir.glob(File.join(config.public_root, 'js', '*.js'))
|
109
|
+
files -= [
|
110
|
+
File.join(config.public_root, 'css', 'style.css'),
|
111
|
+
File.join(config.public_root, 'js', 'site.js')
|
112
|
+
]
|
113
|
+
last = {}
|
114
|
+
|
115
|
+
# Get initial modification times.
|
116
|
+
files.each do |f|
|
117
|
+
last[f] = File.stat(f).mtime
|
118
|
+
end
|
119
|
+
|
120
|
+
loop do
|
121
|
+
# Check files
|
122
|
+
rebuild = false
|
123
|
+
files.each do |f|
|
124
|
+
mtime = File.stat(f).mtime
|
125
|
+
if last[f] < mtime
|
126
|
+
last[f] = mtime
|
127
|
+
rebuild = true
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
if rebuild
|
132
|
+
# Recompile
|
133
|
+
self.compile_css
|
134
|
+
self.compile_js
|
135
|
+
end
|
136
|
+
|
137
|
+
sleep 2
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
32
143
|
# Returns the site configuration
|
33
144
|
def self.config
|
34
145
|
@config
|
@@ -42,35 +153,55 @@ module CortexReaver
|
|
42
153
|
@config_file = file
|
43
154
|
end
|
44
155
|
|
45
|
-
|
46
|
-
|
47
|
-
|
156
|
+
# The total span of items in the CR DB, for copyright notices and such.
|
157
|
+
def self.content_range
|
158
|
+
return @content_range if @content_range
|
48
159
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
160
|
+
@content_range = [Journal, Page, Photograph].inject(nil) do |total, ds|
|
161
|
+
begin
|
162
|
+
if total
|
163
|
+
total | ds.range(:created_on)
|
164
|
+
else
|
165
|
+
ds.range(:created_on)
|
166
|
+
end
|
167
|
+
rescue
|
168
|
+
# Some range was invalid
|
169
|
+
total
|
170
|
+
end
|
171
|
+
end
|
172
|
+
if @content_range.first.kind_of? String
|
173
|
+
@content_range = DateTime.parse(@content_range.begin) .. DateTime.parse(@content_range.end)
|
58
174
|
end
|
59
175
|
|
60
|
-
#
|
61
|
-
|
62
|
-
|
63
|
-
Ramaze.options.adapter.port = config[:port]
|
176
|
+
# If there's no content, default to today!
|
177
|
+
@content_range ||= Time.now .. Time.now
|
178
|
+
end
|
64
179
|
|
65
|
-
|
66
|
-
|
180
|
+
# Creates the app directories if they don't exist.
|
181
|
+
def self.create_directories
|
182
|
+
# view
|
183
|
+
if config.view_root
|
184
|
+
if not File.directory? config.view_root
|
185
|
+
# Try to create a view directory
|
186
|
+
begin
|
187
|
+
FileUtils.mkdir_p config.view_root
|
188
|
+
rescue => e
|
189
|
+
Ramaze::Log.warn "Unable to create a view directory at #{config.view_root}: #{e}."
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
# public
|
195
|
+
if config.public_root and not File.directory? config.public_root
|
67
196
|
# Try to create a public directory
|
68
197
|
begin
|
69
|
-
FileUtils.mkdir_p config
|
198
|
+
FileUtils.mkdir_p config.public_root
|
70
199
|
rescue => e
|
71
200
|
Ramaze::Log.warn "Unable to create a public directory at #{config.public_root}: #{e}."
|
72
201
|
end
|
73
202
|
end
|
203
|
+
|
204
|
+
# log
|
74
205
|
if config[:log_root] and not File.directory? config[:log_root]
|
75
206
|
# Try to create a log directory
|
76
207
|
begin
|
@@ -82,86 +213,80 @@ module CortexReaver
|
|
82
213
|
config[:log_root] = nil
|
83
214
|
end
|
84
215
|
end
|
216
|
+
end
|
85
217
|
|
86
|
-
|
87
|
-
|
218
|
+
def self.db
|
219
|
+
@db
|
220
|
+
end
|
88
221
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
222
|
+
# Prepare Ramaze, create directories, etc.
|
223
|
+
def self.init
|
224
|
+
# App
|
225
|
+
Ramaze.options.app.name = :cortex_reaver
|
226
|
+
|
227
|
+
# Helper load path
|
228
|
+
Ramaze.options.helpers_helper.paths.unshift LIB_DIR
|
229
|
+
|
230
|
+
# Load controllers
|
231
|
+
require File.join(LIB_DIR, 'controller', 'controller')
|
93
232
|
|
233
|
+
# Server options
|
234
|
+
Ramaze.options.adapter.handler = config[:adapter]
|
235
|
+
Ramaze.options.adapter.host = config[:host]
|
236
|
+
Ramaze.options.adapter.port = config[:port]
|
237
|
+
|
238
|
+
# App mode
|
94
239
|
case config[:mode]
|
95
240
|
when :production
|
96
241
|
Ramaze.options.mode = :live
|
97
|
-
|
98
|
-
# Set up cache
|
99
|
-
case config[:cache]
|
100
|
-
when :memcache
|
101
|
-
Ramaze::Cache.options.default = Ramaze::Cache::MemCache
|
102
|
-
end
|
103
|
-
|
104
|
-
if config[:log_root]
|
105
|
-
# Log to file
|
106
|
-
Ramaze::Log.loggers << Logger.new(
|
107
|
-
File.join(config[:log_root], 'production.log')
|
108
|
-
)
|
109
|
-
Ramaze::Log.level = Logger::Severity::INFO
|
110
|
-
end
|
111
242
|
when :development
|
112
243
|
Ramaze.options.mode = :dev
|
113
|
-
|
114
|
-
if config[:log_root]
|
115
|
-
# Log to file
|
116
|
-
Ramaze::Log.loggers << Logger.new(
|
117
|
-
File.join(config[:log_root], 'development.log')
|
118
|
-
)
|
119
|
-
Ramaze::Log.level = Logger::Severity::DEBUG
|
120
|
-
|
121
|
-
# Also use SQL log
|
122
|
-
db.logger = Logger.new(
|
123
|
-
File.join(config[:log_root], 'sql.log')
|
124
|
-
)
|
125
|
-
end
|
126
244
|
else
|
127
|
-
raise ArgumentError.new("unknown Cortex Reaver mode #{config
|
128
|
-
end
|
129
|
-
|
130
|
-
# Prepare view directory
|
131
|
-
if config.view_root
|
132
|
-
if not File.directory? config.view_root
|
133
|
-
# Try to create a view directory
|
134
|
-
begin
|
135
|
-
FileUtils.mkdir_p config.view_root
|
136
|
-
rescue => e
|
137
|
-
Ramaze::Log.warn "Unable to create a view directory at #{config[:view_root]}: #{e}."
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
# Load plugins
|
143
|
-
config[:plugins].each do |plugin|
|
144
|
-
Ramaze::Log.info "Loading plugin #{plugin}"
|
145
|
-
require File.join(config[:plugin_root], plugin)
|
245
|
+
raise ArgumentError.new("unknown Cortex Reaver mode #{config.mode.inspect}. Expected one of [:production, :development].")
|
146
246
|
end
|
247
|
+
|
248
|
+
create_directories
|
249
|
+
setup_logging
|
250
|
+
setup_cache
|
251
|
+
compile_resources
|
252
|
+
load_plugins
|
147
253
|
end
|
148
254
|
|
149
255
|
# Load libraries
|
150
256
|
def self.load
|
151
257
|
# Load controllers and models
|
258
|
+
require File.join(LIB_DIR, 'version')
|
152
259
|
require File.join(LIB_DIR, 'config')
|
153
260
|
require File.join(LIB_DIR, 'plugin')
|
154
|
-
require File.join(LIB_DIR, 'version')
|
155
261
|
Ramaze::acquire File.join(LIB_DIR, 'snippets', '**', '*')
|
156
262
|
Ramaze::acquire File.join(LIB_DIR, 'support', '*')
|
263
|
+
require File.join(LIB_DIR, 'cache')
|
157
264
|
require File.join(LIB_DIR, 'model', 'model')
|
158
|
-
|
159
|
-
|
265
|
+
end
|
266
|
+
|
267
|
+
# Load plugins
|
268
|
+
def self.load_plugins
|
269
|
+
# Create plugin cache
|
270
|
+
Ramaze::Cache.add(:plugin)
|
271
|
+
|
272
|
+
# Load plugins
|
273
|
+
config.plugins.enabled.each do |plugin|
|
274
|
+
Ramaze::Log.info "Loading plugin #{plugin}"
|
275
|
+
begin
|
276
|
+
require File.join(config.plugin_root, plugin)
|
277
|
+
rescue LoadError => e
|
278
|
+
require File.join(LIB_DIR, 'plugins', plugin)
|
279
|
+
end
|
280
|
+
end
|
160
281
|
end
|
161
282
|
|
162
283
|
# Reloads the site configuration
|
163
284
|
def self.reload_config
|
164
|
-
|
285
|
+
begin
|
286
|
+
@config = CortexReaver::Config.load(File.read(config_file))
|
287
|
+
rescue Errno::ENOENT
|
288
|
+
@config = CortexReaver::Config.new
|
289
|
+
end
|
165
290
|
end
|
166
291
|
|
167
292
|
# Restart Cortex Reaver
|
@@ -180,14 +305,15 @@ module CortexReaver
|
|
180
305
|
# Shutdown callback
|
181
306
|
at_exit do
|
182
307
|
# Remove pidfile
|
183
|
-
FileUtils.rm(config
|
308
|
+
FileUtils.rm(config.pidfile) if File.exist? config.pidfile
|
184
309
|
end
|
185
310
|
|
186
311
|
Ramaze::Log.info "Cortex Reaver #{Process.pid} stalking victims."
|
187
312
|
|
188
313
|
# Run Ramaze
|
189
|
-
|
190
|
-
|
314
|
+
roots = [LIB_DIR]
|
315
|
+
roots.unshift config.root if config.root
|
316
|
+
Ramaze.start :root => roots
|
191
317
|
|
192
318
|
puts "Cortex Reaver finished."
|
193
319
|
end
|
@@ -204,22 +330,16 @@ module CortexReaver
|
|
204
330
|
init
|
205
331
|
end
|
206
332
|
|
207
|
-
# Connect to DB. If check_schema is false, doesn't check to see that the
|
208
|
-
# version is up to date.
|
333
|
+
# Connect to DB. If check_schema is false, doesn't check to see that the
|
334
|
+
# schema version is up to date.
|
209
335
|
def self.setup_db(check_schema = true)
|
210
336
|
unless config
|
211
337
|
raise RuntimeError.new("no configuration available!")
|
212
338
|
end
|
213
339
|
|
214
|
-
# Build Sequel connection string
|
215
|
-
unless (string = config[:database]).is_a? String
|
216
|
-
d = config[:database]
|
217
|
-
string = "#{d[:driver]}://#{d[:user]}:#{d[:password]}@#{d[:host]}/#{d[:database]}"
|
218
|
-
end
|
219
|
-
|
220
340
|
# Connect
|
221
341
|
begin
|
222
|
-
@db = Sequel.connect(
|
342
|
+
@db = Sequel.connect(config.database.str)
|
223
343
|
rescue => e
|
224
344
|
Ramaze::Log.error("Unable to connect to database: #{e}.")
|
225
345
|
abort
|
@@ -234,6 +354,56 @@ module CortexReaver
|
|
234
354
|
end
|
235
355
|
end
|
236
356
|
|
357
|
+
def self.setup_cache
|
358
|
+
# Set up cache
|
359
|
+
case config.cache
|
360
|
+
when :memcache
|
361
|
+
Ramaze::Cache::MemCache::OPTIONS[:servers] = config.memcache.servers
|
362
|
+
Ramaze::Cache.options.default = Ramaze::Cache::MemCache
|
363
|
+
|
364
|
+
# Cache templates
|
365
|
+
Innate::View.options.read_cache = true
|
366
|
+
else
|
367
|
+
# Cache stub
|
368
|
+
# Hmm, this breaks session management.
|
369
|
+
# Ramaze::Log.warn "Caching disabled."
|
370
|
+
# Ramaze::Cache.options.default = CortexReaver::Cache::Noop
|
371
|
+
end
|
372
|
+
end
|
373
|
+
|
374
|
+
def self.setup_logging
|
375
|
+
# Clear loggers
|
376
|
+
Ramaze::Log.loggers.clear
|
377
|
+
|
378
|
+
unless config.daemon
|
379
|
+
# Log to console
|
380
|
+
Ramaze::Log.loggers << Logger.new(STDOUT)
|
381
|
+
end
|
382
|
+
|
383
|
+
if config.log_root
|
384
|
+
# Log to files
|
385
|
+
case config.mode
|
386
|
+
when :production
|
387
|
+
logfile = 'production.log'
|
388
|
+
level = Logger::Severity::INFO
|
389
|
+
when :development
|
390
|
+
logfile = 'development.log'
|
391
|
+
level = Logger::Severity::DEBUG
|
392
|
+
|
393
|
+
# Also use SQL log
|
394
|
+
db.logger = Logger.new(
|
395
|
+
File.join(config.log_root, 'sql.log')
|
396
|
+
)
|
397
|
+
end
|
398
|
+
|
399
|
+
# Create file logger
|
400
|
+
Ramaze::Log.loggers << Logger.new(
|
401
|
+
File.join(config.log_root, logfile)
|
402
|
+
)
|
403
|
+
Ramaze::Log.level = level
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
237
407
|
# Disconnect from DB
|
238
408
|
def self.shutdown_db
|
239
409
|
@db.disconnect
|
@@ -244,32 +414,22 @@ module CortexReaver
|
|
244
414
|
reload_config
|
245
415
|
|
246
416
|
# Check PID
|
247
|
-
if File.file? config
|
248
|
-
pid = File.read(config
|
417
|
+
if File.file? config.pidfile
|
418
|
+
pid = File.read(config.pidfile, 20).strip
|
249
419
|
abort "Cortex Reaver already running? (#{pid})"
|
250
420
|
end
|
251
421
|
|
252
422
|
puts "Activating Cortex Reaver."
|
253
423
|
setup
|
254
424
|
|
255
|
-
|
256
|
-
# begin
|
257
|
-
# socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
|
258
|
-
# sockaddr = Socket.pack_sockaddr_in(*[config[:port], config[:host]])
|
259
|
-
# socket.bind(sockaddr)
|
260
|
-
# socket.close
|
261
|
-
# rescue => e
|
262
|
-
# abort "Unable to bind to port #{config[:host]}:#{config[:port]} (#{e})"
|
263
|
-
# end
|
264
|
-
|
265
|
-
if config[:daemon]
|
425
|
+
if config.daemon
|
266
426
|
fork do
|
267
427
|
# Drop console, create new session
|
268
428
|
Process.setsid
|
269
429
|
exit if fork
|
270
430
|
|
271
431
|
# Write pidfile
|
272
|
-
File.open(config
|
432
|
+
File.open(config.pidfile, 'w') do |file|
|
273
433
|
file << Process.pid
|
274
434
|
end
|
275
435
|
|
@@ -294,16 +454,16 @@ module CortexReaver
|
|
294
454
|
def self.stop
|
295
455
|
reload_config
|
296
456
|
|
297
|
-
unless config
|
457
|
+
unless config.pidfile
|
298
458
|
abort "No pidfile to stop."
|
299
459
|
end
|
300
460
|
|
301
|
-
unless File.file? config
|
302
|
-
abort "Cortex Reaver not running? (check #{config
|
461
|
+
unless File.file? config.pidfile
|
462
|
+
abort "Cortex Reaver not running? (check #{config.pidfile})"
|
303
463
|
end
|
304
464
|
|
305
465
|
# Get PID
|
306
|
-
pid = File.read(config
|
466
|
+
pid = File.read(config.pidfile, 20).strip
|
307
467
|
unless (pid = pid.to_i) != 0
|
308
468
|
abort "Invalid process ID in pidfile (#{pid})."
|
309
469
|
end
|
@@ -337,11 +497,11 @@ module CortexReaver
|
|
337
497
|
# Remove pidfile if killed.
|
338
498
|
if killed
|
339
499
|
begin
|
340
|
-
FileUtils.rm(config
|
500
|
+
FileUtils.rm(config.pidfile)
|
341
501
|
rescue Errno::ENOENT
|
342
502
|
# Pidfile gone
|
343
503
|
rescue => e
|
344
|
-
puts "Unable to remove pidfile #{config
|
504
|
+
puts "Unable to remove pidfile #{config.pidfile}: #{e}."
|
345
505
|
end
|
346
506
|
end
|
347
507
|
end
|