forked from resque/resque
-
Notifications
You must be signed in to change notification settings - Fork 1
/
server.rb
210 lines (169 loc) · 4.45 KB
/
server.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
require 'sinatra/base'
require 'haml'
require 'sass'
require 'compass'
require 'resque'
require 'resque/version'
class Numeric
def humanize
to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")
end
end
module Resque
class Server < Sinatra::Base
dir = File.dirname(File.expand_path(__FILE__))
set :views, "#{dir}/server/views"
set :sass, "#{dir}/server/sass"
set :public, "#{dir}/server/public"
set :static, true
configure do
Compass.configuration do |config|
config.project_path = File.dirname(__FILE__)
config.sass_dir = 'views'
end
set :haml, { :format => :html5 }
set :sass, Compass.sass_engine_options
end
helpers do
include Rack::Utils
alias_method :h, :escape_html
def current_section
url request.path_info.sub('/','').split('/')[0].downcase
end
def current_page
url request.path_info.sub('/','').downcase
end
def url(*path_parts)
[ path_prefix, path_parts ].join("/").squeeze('/')
end
alias_method :u, :url
def path_prefix
request.env['SCRIPT_NAME']
end
def class_if_current(page = '')
{:class => :current} if current_page.include? page.to_s
end
def tab(name)
dname = name.to_s.downcase
"<li #{class_if_current(dname)}><a href='#{url dname}'>#{name}</a></li>"
end
def tabs
Resque::Server.tabs
end
def redis_get_size(key)
case Resque.redis.type(key)
when 'none'
[]
when 'list'
Resque.redis.llen(key).to_i
when 'set'
Resque.redis.scard(key).to_i
when 'string'
Resque.redis.get(key).length.to_i
end
end
def redis_get_value_as_array(key)
case Resque.redis.type(key)
when 'none'
[]
when 'list'
Resque.redis.lrange(key, 0, 20)
when 'set'
Resque.redis.smembers(key)
when 'string'
[Resque.redis.get(key)]
end
end
def show_args(args)
Array(args).map { |a| a.inspect }.join("\n")
end
def partial?
@partial
end
def partial(template, local_vars = {})
@partial = true
haml(template.to_sym, {:layout => false}, local_vars)
ensure
@partial = false
end
end
def show(page, layout = true)
begin
haml page.to_sym, {:layout => layout}, :resque => Resque
rescue Errno::ECONNREFUSED
haml :error, {:layout => false}, :error => "Can't connect to Redis! (#{Resque.redis.server})"
end
end
# to make things easier on ourselves
get "/?" do
redirect url(:overview)
end
%w( overview queues working workers pool key ).each do |page|
get "/#{page}" do
show page
end
get "/#{page}/:id" do
show page
end
end
delete "/queues/:id" do |id|
queue = Resque::Queue.new(id)
return "WontDeleteNonEmptyQueu" if queue.any?
queue.delete
"OK"
end
get "/failed" do
if Resque::Failure.url
redirect Resque::Failure.url
else
show :failed
end
end
post "/failed/clear" do
Resque::Failure.clear
redirect url('failed')
end
post "/reschedule/:key" do
Resque::FailureQueue.new(params[:key]).reschedule
"OK"
end
post "/concurrency/:level" do |level|
throw :halt, [404, "Not Found"] unless level[/\d*/]
Resque.concurrency_level = level
"OK"
end
get "/stats" do
redirect url("/stats/resque")
end
get "/stats/:id" do
show :stats
end
get "/stats/keys/:key" do
show :stats
end
get "/stats.txt" do
info = Resque.info
stats = []
stats << "resque.pending=#{info[:pending]}"
stats << "resque.processed+=#{info[:processed]}"
stats << "resque.failed+=#{info[:failed]}"
stats << "resque.workers=#{info[:workers]}"
stats << "resque.working=#{info[:working]}"
Resque.queues.each do |queue|
stats << "queues.#{queue}=#{Resque.size(queue)}"
end
content_type 'text/plain'
stats.join "\n"
end
get '/screen.css' do
content_type 'text/css', :charset => 'utf-8'
sass :screen
end
def resque
Resque
end
def self.tabs
@tabs ||= ["Overview", "Working", "Failed", "Queues", "Workers", "Stats"]
end
end
end