delayed_job_web 1.2.5 → 1.2.6
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of delayed_job_web might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/delayed_job_web.gemspec +2 -3
- data/lib/delayed_job_web/application/app.rb +58 -27
- data/lib/delayed_job_web/application/public/stylesheets/style.css +2 -1
- data/lib/delayed_job_web/application/views/error.erb +1 -1
- data/lib/delayed_job_web/application/views/failed.erb +2 -0
- data/lib/delayed_job_web/application/views/job.erb +16 -13
- data/lib/delayed_job_web/application/views/layout.erb +4 -4
- data/lib/delayed_job_web/application/views/pending.erb +1 -0
- data/lib/delayed_job_web/application/views/stats.erb +1 -1
- data/test/test_delayed_job_web.rb +4 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74a545eb43b23219f3650c32fb4ec8946f27af4c
|
4
|
+
data.tar.gz: 05713de94d0c7aaf2a7e25a54d0f93f12e671cd6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8904284f071219871077d63c9c52dcd5993ba53e0a33358216f4586be950bf4d085823dc9b9e233c45f7dc9de12917b0229d327796831f6bd4d33556b0a71842
|
7
|
+
data.tar.gz: 9068d6b51e167cf0af75bd902544a3e5de7d18c588acad02481ccd69023f4e784521ce1c6dc74d74d262d769416e4b16df697d9ac7fa27090d39cca4e18b9fad
|
data/delayed_job_web.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "delayed_job_web"
|
5
|
-
s.version = "1.2.
|
5
|
+
s.version = "1.2.6"
|
6
6
|
|
7
7
|
s.authors = ["Erick Schmitt"]
|
8
8
|
s.date = "2014-01-29"
|
@@ -47,10 +47,9 @@ Gem::Specification.new do |s|
|
|
47
47
|
s.require_paths = ["lib"]
|
48
48
|
s.summary = "Web interface for delayed_job"
|
49
49
|
|
50
|
-
s.add_runtime_dependency(%q<sinatra>, [">=
|
50
|
+
s.add_runtime_dependency(%q<sinatra>, [">= 1.4.4"])
|
51
51
|
s.add_runtime_dependency(%q<activerecord>, ["> 3.0.0"])
|
52
52
|
s.add_runtime_dependency(%q<delayed_job>, ["> 2.0.3"])
|
53
53
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
54
54
|
s.add_development_dependency(%q<rack-test>, [">= 0"])
|
55
55
|
end
|
56
|
-
|
@@ -6,9 +6,27 @@ require 'delayed_job'
|
|
6
6
|
class DelayedJobWeb < Sinatra::Base
|
7
7
|
set :root, File.dirname(__FILE__)
|
8
8
|
set :static, true
|
9
|
-
set :public_folder,
|
10
|
-
set :views,
|
11
|
-
|
9
|
+
set :public_folder, File.expand_path('../public', __FILE__)
|
10
|
+
set :views, File.expand_path('../views', __FILE__)
|
11
|
+
|
12
|
+
# Enable sessions so we can use CSRF protection
|
13
|
+
set :sessions,
|
14
|
+
# Unique cookie key that won't clash with Rails etc
|
15
|
+
:key => "rack.delayed-job-web-session"
|
16
|
+
|
17
|
+
set :protection,
|
18
|
+
# Various session protections
|
19
|
+
:session => true,
|
20
|
+
# Various non-default Rack::Protection options
|
21
|
+
:use => [
|
22
|
+
# Prevent destructive actions without a valid CSRF auth token
|
23
|
+
:authenticity_token,
|
24
|
+
# Prevent destructive actions with remote referrers
|
25
|
+
:remote_referrer
|
26
|
+
],
|
27
|
+
# Deny the request, don't clear the session
|
28
|
+
:reaction => :deny
|
29
|
+
|
12
30
|
before do
|
13
31
|
@queues = (params[:queues] || "").split(",").map{|queue| queue.strip}.uniq.compact
|
14
32
|
end
|
@@ -24,13 +42,18 @@ class DelayedJobWeb < Sinatra::Base
|
|
24
42
|
def per_page
|
25
43
|
20
|
26
44
|
end
|
27
|
-
|
45
|
+
|
28
46
|
def url_path(*path_parts)
|
29
47
|
url = [ path_prefix, path_parts ].join("/").squeeze('/')
|
30
48
|
url += "?queues=#{@queues.join(",")}" unless @queues.empty?
|
31
49
|
url
|
32
50
|
end
|
33
|
-
|
51
|
+
|
52
|
+
alias_method :u, :url_path
|
53
|
+
|
54
|
+
def h(text)
|
55
|
+
Rack::Utils.escape_html(text)
|
56
|
+
end
|
34
57
|
|
35
58
|
def path_prefix
|
36
59
|
request.env['SCRIPT_NAME']
|
@@ -55,6 +78,15 @@ class DelayedJobWeb < Sinatra::Base
|
|
55
78
|
end
|
56
79
|
end
|
57
80
|
|
81
|
+
def csrf_token
|
82
|
+
# Set up by Rack::Protection
|
83
|
+
session[:csrf]
|
84
|
+
end
|
85
|
+
|
86
|
+
def csrf_token_tag
|
87
|
+
"<input type='hidden' name='authenticity_token' value='#{h csrf_token}'>"
|
88
|
+
end
|
89
|
+
|
58
90
|
get '/overview' do
|
59
91
|
if delayed_job
|
60
92
|
erb :overview
|
@@ -76,25 +108,25 @@ class DelayedJobWeb < Sinatra::Base
|
|
76
108
|
end
|
77
109
|
end
|
78
110
|
|
79
|
-
|
111
|
+
post "/remove/:id" do
|
80
112
|
delayed_job.find(params[:id]).delete
|
81
113
|
redirect back
|
82
114
|
end
|
83
115
|
|
84
|
-
|
116
|
+
post "/requeue/:id" do
|
85
117
|
job = delayed_job.find(params[:id])
|
86
118
|
job.update_attributes(:run_at => Time.now, :failed_at => nil)
|
87
119
|
redirect back
|
88
120
|
end
|
89
121
|
|
90
|
-
|
122
|
+
post "/reload/:id" do
|
91
123
|
job = delayed_job.find(params[:id])
|
92
124
|
job.update_attributes(:run_at => Time.now, :failed_at => nil, :locked_by => nil, :locked_at => nil, :last_error => nil, :attempts => 0)
|
93
125
|
redirect back
|
94
126
|
end
|
95
127
|
|
96
128
|
post "/failed/clear" do
|
97
|
-
|
129
|
+
delayed_jobs(:failed, @queues).delete_all
|
98
130
|
redirect u('failed')
|
99
131
|
end
|
100
132
|
|
@@ -104,24 +136,23 @@ class DelayedJobWeb < Sinatra::Base
|
|
104
136
|
end
|
105
137
|
|
106
138
|
def delayed_jobs(type, queues = [])
|
107
|
-
delayed_job
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
conditions.compact.join(" AND ")
|
139
|
+
rel = delayed_job
|
140
|
+
|
141
|
+
rel =
|
142
|
+
case type
|
143
|
+
when :working
|
144
|
+
rel.where('locked_at IS NOT NULL')
|
145
|
+
when :failed
|
146
|
+
rel.where('last_error IS NOT NULL')
|
147
|
+
when :pending
|
148
|
+
rel.where(:attempts => 0)
|
149
|
+
else
|
150
|
+
rel
|
151
|
+
end
|
152
|
+
|
153
|
+
rel = rel.where(:queue => queues) unless queues.empty?
|
154
|
+
|
155
|
+
rel
|
125
156
|
end
|
126
157
|
|
127
158
|
get "/?" do
|
@@ -75,6 +75,7 @@ pre { font-family:Courier New; line-height:1.4em; }
|
|
75
75
|
#main ul.job li dl dd .retried .remove { display:none; margin-top: 8px; }
|
76
76
|
#main ul.job li.hover dl dd .retried .remove { display:block; }
|
77
77
|
#main ul.job li dl dd .controls { display:none; float:right; }
|
78
|
+
#main ul.job li dl dd .controls form { display: inline; }
|
78
79
|
#main ul.job li.hover dl dd .controls { display:block; }
|
79
80
|
#main ul.job li dl dd code, #main ul.failed li dl dd pre { font-family:Monaco, "Courier New", monospace; font-size:90%; white-space: pre-wrap;}
|
80
81
|
#main ul.job li dl dd.error a {font-family:Monaco, "Courier New", monospace; font-size:90%; }
|
@@ -84,6 +85,6 @@ pre { font-family:Courier New; line-height:1.4em; }
|
|
84
85
|
#main p.pagination a.less { float:left;}
|
85
86
|
#main p.pagination a.more { float:right;}
|
86
87
|
|
87
|
-
#main
|
88
|
+
#main .header-queues {float:right; margin-top:-10px;margin-left:10px;}
|
88
89
|
|
89
90
|
#main .time a.toggle_format {text-decoration:none;}
|
@@ -1,2 +1,2 @@
|
|
1
1
|
<h1>Error</h1>
|
2
|
-
<p><%= @message %></p>
|
2
|
+
<p><%=h @message %></p>
|
@@ -1,9 +1,11 @@
|
|
1
1
|
<h1>Failed Jobs</h1>
|
2
2
|
<% if @jobs.any? %>
|
3
3
|
<form action="<%= u('failed/clear') %>" method="POST">
|
4
|
+
<%= csrf_token_tag %>
|
4
5
|
<input type="submit" value="Clear Failed Jobs"></input>
|
5
6
|
</form>
|
6
7
|
<form action="<%= u('requeue/all') %>" method="POST">
|
8
|
+
<%= csrf_token_tag %>
|
7
9
|
<input type="submit" value="Retry Failed Jobs"></input>
|
8
10
|
</form>
|
9
11
|
<% end %>
|
@@ -3,59 +3,62 @@
|
|
3
3
|
<dt>ID</dt>
|
4
4
|
<dd>
|
5
5
|
<a name="<%= job.id %>"></a>
|
6
|
-
<a href="#<%= job.id %>"><%= job.id %></a>
|
6
|
+
<a href="#<%= job.id %>"><%=h job.id %></a>
|
7
7
|
<div class="controls">
|
8
|
-
<
|
8
|
+
<form action="<%= u("requeue/#{job.id}") %>" method="post"><%= csrf_token_tag %><input type="submit" value="Retry"></input></form>
|
9
9
|
or
|
10
|
-
<
|
10
|
+
<form action="<%= u("remove/#{job.id}") %>" method="post"><%= csrf_token_tag %><input type="submit" value="Remove"></input></form>
|
11
11
|
or
|
12
|
-
<
|
12
|
+
<form action="<%= u("reload/#{job.id}") %>" method="post"><%= csrf_token_tag %><input type="submit" value="Reload"></input></form>
|
13
13
|
</div>
|
14
14
|
</dd>
|
15
15
|
<dt>Priority</dt>
|
16
|
-
<dd><%= job.priority %></dd>
|
16
|
+
<dd><%=h job.priority %></dd>
|
17
17
|
<dt>Attempts</dt>
|
18
|
-
<dd><%= job.attempts %></dd>
|
18
|
+
<dd><%=h job.attempts %></dd>
|
19
19
|
<% if job.respond_to?(:queue) && job.queue %>
|
20
20
|
<dt>Queue</dt>
|
21
|
-
<dd><%= job.queue %></dd>
|
21
|
+
<dd><%=h job.queue %></dd>
|
22
22
|
<% end %>
|
23
23
|
<dt>Handler</dt>
|
24
24
|
<dd>
|
25
|
-
<pre><%= job.handler %></pre>
|
25
|
+
<pre><%=h job.handler %></pre>
|
26
26
|
</dd>
|
27
27
|
<% if job.last_error %>
|
28
28
|
<dt>Last Error</dt>
|
29
29
|
<dd>
|
30
30
|
<div class="backtrace">
|
31
|
-
<pre><%= job.last_error[0..100] + '...' %></pre>
|
31
|
+
<pre><%=h job.last_error[0..100] + '...' %></pre>
|
32
32
|
</div>
|
33
33
|
<a class="backtrace" href="#">Toggle full message</a>
|
34
34
|
<div class="backtrace full hide">
|
35
|
-
<pre><%= job.last_error %></pre>
|
35
|
+
<pre><%=h job.last_error %></pre>
|
36
36
|
</div>
|
37
37
|
</dd>
|
38
38
|
<% end %>
|
39
39
|
<% if job.run_at %>
|
40
40
|
<dt>Run At</dt>
|
41
41
|
<dd class="time">
|
42
|
-
<%= job.run_at.rfc822 %>
|
42
|
+
<%=h job.run_at.rfc822 %>
|
43
43
|
</dd>
|
44
44
|
<% end %>
|
45
45
|
<% if job.locked_at %>
|
46
46
|
<dt>Locked At</dt>
|
47
47
|
<dd class="time">
|
48
|
-
<%= job.locked_at.rfc822 %>
|
48
|
+
<%=h job.locked_at.rfc822 %>
|
49
49
|
</dd>
|
50
50
|
<% end %>
|
51
51
|
<% if job.locked_by %>
|
52
52
|
<dt>Locked By</dt>
|
53
53
|
<dd>
|
54
|
-
<%= job.locked_by %>
|
54
|
+
<%=h job.locked_by %>
|
55
55
|
</dd>
|
56
56
|
<% end %>
|
57
57
|
<% if job.failed_at %>
|
58
58
|
<dt>Failed At</dt>
|
59
|
+
<dd>
|
60
|
+
<%=h job.failed_at %>
|
61
|
+
</dd>
|
59
62
|
<% end %>
|
60
63
|
</dl>
|
61
64
|
</li>
|
@@ -11,13 +11,13 @@
|
|
11
11
|
<% tabs.each do |tab| %>
|
12
12
|
<li class="<%= request.path_info == tab[:path] ? 'current' : '' %>">
|
13
13
|
<a class="tab" href="<%= u(tab[:path]) %>">
|
14
|
-
<%= tab[:name] %>
|
14
|
+
<%=h tab[:name] %>
|
15
15
|
</a>
|
16
16
|
</li>
|
17
17
|
<% end %>
|
18
18
|
<li>
|
19
|
-
<form method="get" action="" style="display:inline; width: 100%;">
|
20
|
-
<input name="queues" type="text" value="<%= @queues.join(", ") %>" style="width: 300px;" placeholder="Filter jobs by queue name (e.g. queue1, queue2)" />
|
19
|
+
<form method="get" class="header-queues" action="" style="display:inline; width: 100%;">
|
20
|
+
<input name="queues" type="text" value="<%=h @queues.join(", ") %>" style="width: 300px;" placeholder="Filter jobs by queue name (e.g. queue1, queue2)" />
|
21
21
|
<input type="submit" value="Filter" />
|
22
22
|
</form>
|
23
23
|
</li>
|
@@ -30,7 +30,7 @@
|
|
30
30
|
<p>
|
31
31
|
Powered by
|
32
32
|
<a href="https://github.com/collectiveidea/delayed_job">delayed_job</a>
|
33
|
-
&
|
33
|
+
&
|
34
34
|
<a href="https://github.com/ejschmitt/delayed_job_web">delayed_job_web</a>
|
35
35
|
</p>
|
36
36
|
</div>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delayed_job_web
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Erick Schmitt
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.4.4
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 1.4.4
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activerecord
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|