delayed_job_web 1.2.5 → 1.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
|