srscript 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/srscript.rb +355 -0
  2. metadata +55 -0
data/lib/srscript.rb ADDED
@@ -0,0 +1,355 @@
1
+ #!/usr/bin/ruby
2
+
3
+ # file: srscript.rb
4
+
5
+ #!/usr/bin/ruby
6
+
7
+ require 'sinatra/base'
8
+ require 'rscript'
9
+
10
+ class SRScript < Sinatra::Base
11
+
12
+
13
+ URL_BASE = 'http://rorbuilder.info/r/heroku/' #
14
+
15
+ @@count = 0
16
+ @@rscript = RScript.new()
17
+ @@url_base = 'http://rorbuilder.info/r/heroku/' #
18
+ @@get_routes = {}; @@post_routes = {}
19
+ @@services = {}
20
+ @@templates = {}
21
+ @@app = nil
22
+ @content_type = 'text/html'
23
+
24
+ puts 'ready'
25
+
26
+ def initialize()
27
+ super
28
+ puts 'initialized at ' + Time.now.to_s
29
+ end
30
+
31
+ get '/bootstrap' do
32
+
33
+ doc = Document.new(File.open('server.xml','r').read)
34
+ server_name, url_base = XPath.match(doc.root, 'summary/*/text()').map(&:to_s)
35
+
36
+ url = URL_BASE + 'startup-level1.rsf'
37
+ run_script(url, '//job:bootstrap', server_name, url_base)
38
+ end
39
+
40
+
41
+ get '/' do
42
+ uri, @content_type = @@app.run_projectx('registry', 'get-key', :path => 'system/homepage/uri/text()')
43
+ redirect(uri.to_s)
44
+ end
45
+
46
+
47
+ configure do
48
+ puts 'bootstrapping ... '
49
+ doc = Document.new(File.open('server.xml','r').read)
50
+ localhost = XPath.first(doc.root, 'summary/localhost/text()').to_s
51
+ Thread.new {sleep 8; open(localhost + 'bootstrap', 'UserAgent' => 'srscript')}
52
+ end
53
+
54
+ def run_rcscript(rsf_url, jobs, raw_args=[])
55
+ @@rscript.read([rsf_url, jobs.split(/\s/), raw_args].flatten)
56
+ end
57
+
58
+ def run_script(url, jobs, *qargs)
59
+ result, args = run_rcscript(url, jobs, qargs)
60
+ eval(result)
61
+ end
62
+
63
+ def display_url_run(url, jobs, opts)
64
+ h = {'.xml' => 'text/xml','.html' => 'text/html','.txt' => 'text/plain'}
65
+ @content_type = h[opts[:extension]]
66
+ out = run_script(url, jobs, opts[:args])
67
+
68
+ content_type @content_type, :charset => 'utf-8' if defined? content_type
69
+ out
70
+ end
71
+
72
+ def check_url(url)
73
+ url = URI.parse(url)
74
+ Net::HTTP.start(url.host, url.port) do |http|
75
+ return http.head(url.request_uri).code
76
+ end
77
+ end
78
+
79
+ def package_run(package_id, job, opts={})
80
+ o = {
81
+ :extension => '.html',
82
+ :args => []
83
+ }.merge(opts)
84
+ jobs = "//job:" + job
85
+
86
+ url, @content_type = @@app.run_projectx('registry', 'get-key', :path => "system/packages/*[name='#{package_id}']/url/text()").map(&:to_s)
87
+
88
+ url = @@url_base + url[1..-1] if url[/^\//]
89
+
90
+ if url then
91
+ display_url_run(url.to_s.sub(/^#{@@url_base}/,'\0s/open/'),jobs, o)
92
+ else
93
+
94
+ code = check_url(url)
95
+
96
+ if code == '200' then
97
+ url = "%s%s.rsf" % [@@url_base, package_id]
98
+ display_url_run(url,jobs, o)
99
+ else
100
+ # 404
101
+ url = url_base + 'open-uri-error.rsf'
102
+ run_script(url, '//job:with-code', code)
103
+ end
104
+ end
105
+
106
+ end
107
+
108
+ get '/' do
109
+ uri, @content_type = @@app.run_projectx('registry', 'get-key', :path => 'system/homepage/uri/text()')
110
+ redirect(uri.to_s)
111
+ end
112
+
113
+ get %r{^\/([a-zA-Z0-9\-]+)$} do
114
+ raw_url, @content_type = @@app.run_projectx('registry', 'get-key', :path => 'system/uri_aliases/url/text()')
115
+ url = raw_url.to_s.clone
116
+
117
+ #url.sub!('http://rscript.rorbuilder.info/','\0s/open/')
118
+ doc = Document.new(open(url, "UserAgent" => "Sinatra-Rscript").read)
119
+
120
+ #url = @@url_base + "alias.xml?passthru=1"
121
+ #doc = Document.new(open(url, "UserAgent" => "Sinatra-Rscript").read)
122
+ node = XPath.first(doc.root, "records/alias[name='#{params[:captures][0]}' and type='r']")
123
+
124
+ if node.nil? and not @@get_routes.has_key? params[:captures][0] then
125
+ url = "%s%s/index.xml" % [@@url_base, params[:captures][0]]
126
+ status = check_url url
127
+
128
+ redirect params[:captures][0] + '/' if status == '200'
129
+ # url = ...
130
+ # redirect url if check_url ""params[:alias] == '200'
131
+ pass
132
+ else
133
+ pass
134
+ end
135
+ uri = node.text('uri').to_s
136
+
137
+ redirect uri
138
+ end
139
+
140
+ get '/:directory/' do
141
+ open("%s%s/index.xml" % [@@url_base, params[:directory]] , 'UserAgent' => 'S-Rscript').read
142
+ end
143
+
144
+ get '/css/:css' do
145
+
146
+ css = params[:css]
147
+ key = 'css/' + css
148
+
149
+ if @@get_routes.has_key? key then
150
+ out, @content_type = @@get_routes[key].call(params)
151
+ @content_type ||= 'text/css'
152
+ content_type @content_type, :charset => 'utf-8'
153
+ out
154
+ else
155
+ rsf_job, @content_type = @@app.run_projectx('registry', 'get-key', :path => "system/css/*[name='css/#{css}']/rsf_job/text()")
156
+ if rsf_job then
157
+ redirect rsf_job.to_s
158
+ else
159
+ # 404
160
+ end
161
+ end
162
+ end
163
+
164
+ get '/:form/form' do
165
+
166
+ form = params[:form]
167
+ key = form + '/form'
168
+
169
+ if @@get_routes.has_key? key then
170
+ out, @content_type = @@get_routes[key].call(params)
171
+ @content_type ||= 'text/html'
172
+ content_type @content_type, :charset => 'utf-8'
173
+ out
174
+ else
175
+ rsf_job, @content_type = @@app.run_projectx('registry', 'get-key', :path => "system/forms/*[name='#{form}/form']/rsf_job/text()")
176
+ if rsf_job then
177
+ puts 'job found'
178
+ redirect rsf_job.to_s
179
+ else
180
+ # 404
181
+ end
182
+ end
183
+ end
184
+
185
+ get '/:form/form/*' do
186
+
187
+ form = params[:form]
188
+ key = form + '/form'
189
+ args = params[:splat]
190
+
191
+ if @@get_routes.has_key? key then
192
+ out, @content_type = @@get_routes[key].call(params, args)
193
+ @content_type ||= 'text/html'
194
+ content_type @content_type, :charset => 'utf-8'
195
+ out
196
+ else
197
+ rsf_job, @content_type = @@app.run_projectx('registry', 'get-key', :path => "system/forms/*[name='#{form}/form']/rsf_job/text()")
198
+ if rsf_job then
199
+ file_path = args.length > 0 ? '/' + args.join('/') : ''
200
+ puts 'form file_path : ' + file_path.to_s
201
+ redirect rsf_job.to_s + file_path
202
+ else
203
+ # 404
204
+ end
205
+ end
206
+ end
207
+
208
+ get '/do/:package_id/:job' do
209
+ package_id = params[:package_id] #
210
+ job, extension = params[:job][/\.\w{3}$/] ? [$`, $&] : [params[:job], '.html']
211
+ package_run(package_id, job, {:extension => extension})
212
+ end
213
+
214
+ get '/view-source/:package_id/:job' do
215
+ package_id = params[:package_id] #
216
+ *jobs = params[:job]
217
+
218
+ #url = "%s%s.rsf" % [url_base, package_id]
219
+ url, @content_type = @@app.run_projectx('registry', 'get-key', :path => "system/packages/*[name='#{package_id}']/url/text()")
220
+ if url then
221
+
222
+ #redirect rsf_job.to_s
223
+ buffer = open(url.to_s.sub(/^http:\/\/rscript.rorbuilder.info\//,'\0s/open/'), "UserAgent" => 'Sinatra-Rscript').read
224
+ content_type 'text/plain', :charset => 'utf-8'
225
+ doc = Document.new(buffer)
226
+
227
+ jobs.map!{|x| "@id='%s'" % x}
228
+ doc.root.elements.to_a("//job[#{jobs.join(' or ')}]").map do |job|
229
+ job.to_s
230
+ end
231
+ end
232
+
233
+
234
+ end
235
+
236
+ get '/do/:package_id/:job/*' do
237
+ h = {'.xml' => 'text/xml','.html' => 'text/html','.txt' => 'text/plain'}
238
+ package_id = params[:package_id] #
239
+ job, extension = params[:job][/\.\w{3}$/] ? [$`, $&] : [params[:job], '.html']
240
+ jobs = "//job:" + job
241
+ raw_args = params[:splat]
242
+ args = raw_args.join.split('/')
243
+
244
+ package_run(package_id, job, {:extension => extension, :args => args})
245
+
246
+ end
247
+
248
+ get '/view-source/:package_id' do
249
+ package_id = params[:package_id] #
250
+ #url = "%s%s.rsf" % [url_base, package_id]
251
+ url, @content_type = @@app.run_projectx('registry', 'get-key', :path => "system/packages/*[name='#{package_id}']/url/text()")
252
+ if url then
253
+ buffer = open(url.to_s.sub(/^http:\/\/rscript.rorbuilder.info\//,'\0s/open/'), "UserAgent" => 'Sinatra-Rscript').read
254
+ content_type 'text/plain', :charset => 'utf-8'
255
+ buffer
256
+ end
257
+ end
258
+
259
+ get '/do/:package_id/' do
260
+ redirect "/do/r/p/" + params[:package_id]
261
+ end
262
+
263
+
264
+ # projectx request
265
+ get '/p/:project_name/:method_name' do
266
+ project_name = params[:project_name]
267
+ method_name = params[:method_name]
268
+ r, @content_type = @@app.run_projectx(project_name, method_name, request.params)
269
+
270
+ @content_type ||= 'text/html'
271
+ content_type @content_type, :charset => 'utf-8'
272
+ # todo: implement a filter to check for rexml objects to be converted to a string
273
+ r
274
+ end
275
+
276
+
277
+ # projectx request
278
+ get '/p/projectx' do
279
+ xml_project = request.params.to_a[0][1]
280
+ projectx_handler(xml_project)
281
+ end
282
+
283
+ get '/load/:package_id/:job' do
284
+
285
+ package_id = params[:package_id] #
286
+ job, extension = params[:job][/\.\w{3}$/] ? [$`, $&] : [params[:job], '.html']
287
+ load_rsf_job2(package_id, job, route=package_id + '/' + job, extension)
288
+ end
289
+
290
+
291
+
292
+ def follow_route(routes, key)
293
+ if routes.has_key? key then
294
+ routes[key].call(params)
295
+
296
+ else
297
+ route = routes.detect {|k,v| key[/#{k}/]}
298
+
299
+ if route then
300
+ remaining = $'
301
+ if remaining then
302
+ args = remaining.split('/')
303
+ args.shift
304
+ else
305
+ args = []
306
+ end
307
+
308
+ route[1].call( params, args)
309
+
310
+ else
311
+ puts '@@app is ' + @@app.inspect
312
+ out, @content_type = @@app.run_projectx('dir', 'view', {:file_path => key, :passthru => params[:passthru]})
313
+ [out, @content_type]
314
+ #puts "no match"
315
+ end
316
+ end
317
+ end
318
+
319
+ # custom routes
320
+ get '/*' do
321
+ key = params[:splat].join
322
+
323
+ if params.has_key? 'edit' and params[:edit] = '1' then
324
+ # fetch the editor
325
+ # we first need to know the file type
326
+ # open the xml file
327
+ url = @@url_base + key
328
+ buffer = open(url.to_s.sub(/^http:\/\/rscript.rorbuilder.info\//,'\0s/open/'), "UserAgent" => 'Sinatra-Rscript').read
329
+ doc = Document.new(buffer)
330
+ recordx_type = XPath.first(doc.root, 'summary/recordx_type/text()').to_s
331
+ uri, @content_type = @@app.run_projectx('registry', 'get-key', :path => "system/recordx_editor/#{recordx_type}/uri/text()")
332
+ editor_url = @@url_base + uri.to_s + '/' + key
333
+
334
+ redirect editor_url
335
+ else
336
+
337
+ out, content_type = follow_route(@@get_routes, key)
338
+ #puts out
339
+ puts 'Content type : ' + content_type unless content_type.nil?
340
+ content_type ||= 'text/html'
341
+ content_type content_type, :charset => 'utf-8'
342
+ out
343
+ end
344
+ end
345
+
346
+ post '/*' do
347
+ key = params[:splat].join
348
+ out, content_type = follow_route(@@post_routes, key)
349
+ #puts 'sss' + out.to_s
350
+ #out = follow_route(@@post_routes, key)
351
+ content_type ||= 'text/html'
352
+ content_type content_type, :charset => 'utf-8'
353
+ out
354
+ end
355
+
metadata ADDED
@@ -0,0 +1,55 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: srscript
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors: []
7
+
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2011-02-21 00:00:00 +00:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email:
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - lib/srscript.rb
26
+ has_rdoc: true
27
+ homepage:
28
+ licenses: []
29
+
30
+ post_install_message:
31
+ rdoc_options: []
32
+
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: "0"
40
+ version:
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: "0"
46
+ version:
47
+ requirements: []
48
+
49
+ rubyforge_project:
50
+ rubygems_version: 1.3.5
51
+ signing_key:
52
+ specification_version: 3
53
+ summary: srscript
54
+ test_files: []
55
+