sidekiq-undertaker 1.1.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby-build.yml +1 -1
- data/CHANGELOG.md +104 -0
- data/README.md +7 -4
- data/assets/Undertaker_demo_1_job_1_error.png +0 -0
- data/assets/Undertaker_demo_1_job_all_errors.png +0 -0
- data/assets/Undertaker_demo_all_errors.png +0 -0
- data/assets/Undertaker_demo_all_jobs.png +0 -0
- data/assets/Undertaker_demo_all_jobs_1_error.png +0 -0
- data/lib/sidekiq/undertaker/version.rb +1 -1
- data/lib/sidekiq/undertaker/web_extension/api_helpers.rb +69 -12
- data/lib/sidekiq/undertaker/web_extension.rb +8 -1
- data/sidekiq-undertaker.gemspec +3 -1
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_filter_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +29 -15
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_called/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +13 -15
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_filter/when_job_classbucket_page_is_polled/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +13 -15
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_all_failures_and_errors/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +19 -15
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_specific_job_class_and_a_specific_error/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +19 -15
- data/spec/fixtures/approvals/sidekiq_undertaker_webextension/show_morgue/when_job_classerrorbucket_is_called/with_specific_job_class_and_a_specific_error/with_pagination/behaves_like_a_page/the_displayed_page_is_correct_for_sidekiqv6.approved.txt +19 -15
- data/spec/sidekiq/undertaker/job_distributor_spec.rb +3 -3
- data/spec/sidekiq/undertaker/job_filter_spec.rb +3 -3
- data/spec/sidekiq/undertaker/web_extension_spec.rb +115 -0
- data/web/locales/en.yml +2 -0
- data/web/views/filter.erb +16 -0
- data/web/views/morgue.erb +6 -0
- metadata +31 -14
- data/Demo_Filter.png +0 -0
- data/Demo_Job_Filter.png +0 -0
- data/Demo_Morgue_1_Job.png +0 -0
- data/Demo_Morgue_all.png +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb255bb741814575247793b7ddfdd7dfa6fe5c0d86a21df3b33f315209beef53
|
4
|
+
data.tar.gz: fc6b4970d6e7d2c8410525c76fd97fc1c98943a0f9bb381807946829e38180ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0162683d05be1edf9d3dc362a7b7c543fc4d0d6891945540637cc03dcb919a1780003ed55503f3cbc3af8ab0ef3a03ee28bfe6d6575dac4610ee623dd373b3b1'
|
7
|
+
data.tar.gz: 610f3d98e380193606e37c74953dd53b00c79ae42fd6f091f940f27e9b61d55305df546a207676b8139a8d41719ba0fd3336cf87b5f35ec0b16b43283796c64a
|
@@ -39,7 +39,7 @@ jobs:
|
|
39
39
|
- 'truffleruby+graalvm'
|
40
40
|
|
41
41
|
steps:
|
42
|
-
- uses: actions/checkout@
|
42
|
+
- uses: actions/checkout@v3
|
43
43
|
- name: Set up Ruby
|
44
44
|
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
45
45
|
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## Unreleased
|
4
|
+
|
5
|
+
## [1.3.0] - 2022-04-27
|
6
|
+
### Added
|
7
|
+
- Added option to export and re-import dead jobs
|
8
|
+
|
9
|
+
## [1.2.0] - 2022-02-03
|
10
|
+
### Changed
|
11
|
+
- Updated sidekiq dependency to 6.4.0
|
12
|
+
|
13
|
+
## [1.1.1] - 2022-02-03
|
14
|
+
### Added
|
15
|
+
- Added CHANGELOG.md
|
16
|
+
|
17
|
+
## [1.1.0] - 2022-01-19
|
18
|
+
### Added
|
19
|
+
- Added renovate.json
|
20
|
+
- Added ruby-build github workflow
|
21
|
+
- Added .rspec config file
|
22
|
+
|
23
|
+
### Changed
|
24
|
+
- Updated support for Sidekiq 6.2.2 and higher
|
25
|
+
- Updated travis CI config to use latest ruby versions
|
26
|
+
- Updated to use GitHub-native Dependabot
|
27
|
+
- Updated spech_helper
|
28
|
+
- Updated approvals to version 0.0.25
|
29
|
+
|
30
|
+
## [1.0.2] - 2021-01-27
|
31
|
+
### Added
|
32
|
+
- Consider also explicitly stating that PRs must pass RuboCop to be accepted
|
33
|
+
- Added rubocop badge to README.md
|
34
|
+
|
35
|
+
### Changed
|
36
|
+
- Upgraded rubocop and rt_rubocop_defaults
|
37
|
+
- Updated rake requirement from ~> 12.3 to ~> 13.0
|
38
|
+
- Updated Travis CI to use JRuby-9.2.10.0
|
39
|
+
- Updated README to clarify RuboCop install
|
40
|
+
|
41
|
+
## [1.0.1] - 2020-02-03
|
42
|
+
### Added
|
43
|
+
- Added ruby 2.7.0 to travis file and mark ruby 2.4.9 as optional
|
44
|
+
|
45
|
+
### Changed
|
46
|
+
- Updated codeclimate.yml to enable rubocop
|
47
|
+
|
48
|
+
### Fixed
|
49
|
+
- Fixed pagination on morgue page
|
50
|
+
- Fixed rubocopo issues
|
51
|
+
|
52
|
+
## [1.0.0] - 2019-12-24
|
53
|
+
### Added
|
54
|
+
- Added RubyGems badge
|
55
|
+
- Added custom locales
|
56
|
+
|
57
|
+
### Changed
|
58
|
+
- Renamed gem from sidekiq-cleaner to sidekiq-undertaker
|
59
|
+
- Updated do not show 'all' as job or error name in titles
|
60
|
+
- Updated gemspec, .travis.yml and README.md
|
61
|
+
- Updated rename buckets and add the 'older' bucket
|
62
|
+
- Refactored move sort into JobAggregator
|
63
|
+
- Renamed JobAggregator to JobDistributor
|
64
|
+
- Updated translations
|
65
|
+
- Updated add '/filter' and '/morgue' prefixes to URLs
|
66
|
+
- Renamed Helpers to APIHelpers
|
67
|
+
- Moved view files to top level web folder
|
68
|
+
- Renamed views
|
69
|
+
- Moved WebExtension::Helper into separate file
|
70
|
+
|
71
|
+
### Removed
|
72
|
+
- Removed before install steps from .travis.yml
|
73
|
+
|
74
|
+
### Fixed
|
75
|
+
- Updated README.md to fix broken members link
|
76
|
+
- Fixed approvals specs after sidekiq ref update
|
77
|
+
- Fixed sidekiq dependency in gemspec
|
78
|
+
- Fixed broken links in filter view
|
79
|
+
- Fixed Travis link
|
80
|
+
- Fixed paths in views
|
81
|
+
|
82
|
+
## [0.3.6] - 2019-12-04
|
83
|
+
### Added
|
84
|
+
- Added Test Coverage Badge
|
85
|
+
- Added CodeClimate configuration
|
86
|
+
- Added support for JRuby
|
87
|
+
- Added .travis.yml
|
88
|
+
- Added support for csrf and allowed this to be used with newer versions of sidekiq
|
89
|
+
|
90
|
+
### Changed
|
91
|
+
- Updated travis config
|
92
|
+
- Updated Rubocop and RtRubocopDefaults gems
|
93
|
+
- Updated README.md
|
94
|
+
- Updated gemspec
|
95
|
+
- Renamed approvals specs to shorten file path
|
96
|
+
- Updated approval specs to exclude Sidekiq::VERSION
|
97
|
+
- Removed celluloid dependency
|
98
|
+
- Allowed developers to use other Rubies
|
99
|
+
- Removed .ruby-version and added .ruby-version and .rvmrc to the .gitignore
|
100
|
+
|
101
|
+
### Fixed
|
102
|
+
- Fixed "Retry All" and "Delete All" function
|
103
|
+
- Fixed Csrf and sidekiq version compatibility
|
104
|
+
- Fixed Cleaner Redirect Bug
|
data/README.md
CHANGED
@@ -45,24 +45,24 @@ Or install it yourself as:
|
|
45
45
|
|
46
46
|
The filter page shows a table with time-buckets as columns and rows for each job class.
|
47
47
|
|
48
|
-
![Sidekiq Undertaker](
|
48
|
+
![Sidekiq Undertaker](assets/Undertaker_demo_all_jobs.png)
|
49
49
|
|
50
50
|
#### Job Filter View
|
51
51
|
|
52
52
|
For each job class, you can drill down to view error distribution based on
|
53
53
|
error class.
|
54
54
|
|
55
|
-
![Sidekiq Undertaker](
|
55
|
+
![Sidekiq Undertaker](assets/Undertaker_demo_1_job_all_errors.png)
|
56
56
|
|
57
57
|
#### Morgue View
|
58
58
|
Finally, click on the individual error counts to display details of the
|
59
59
|
errors in a list form.
|
60
60
|
|
61
|
-
![Sidekiq Undertaker](
|
61
|
+
![Sidekiq Undertaker](assets/Undertaker_demo_1_job_1_error.png)
|
62
62
|
|
63
63
|
The morgue view can, for example, also show an error distribution over all job classes.
|
64
64
|
|
65
|
-
![Sidekiq Undertaker](
|
65
|
+
![Sidekiq Undertaker](assets/Undertaker_demo_all_jobs_1_error.png)
|
66
66
|
|
67
67
|
## Contributing
|
68
68
|
|
@@ -81,6 +81,9 @@ this fork was renamed to `sidekiq-undertaker`.
|
|
81
81
|
|
82
82
|
The [Sidekiq-Cleaner](https://github.com/HackingHabits/sidekiq-cleaner) gem was originally created by [Madan Thangavelu](https://github.com/HackingHabits).
|
83
83
|
[Tout](https://github.com/Tout/sidekiq-cleaner) and [TheWudu](https://github.com/TheWudu/sidekiq-cleaner) also contributed to it.
|
84
|
+
[Zlatko Rednjak](https://github.com/Rednjak) added the initial version of the `CHANGELOG.md`.
|
85
|
+
[Lucas Dell'Isola](https://github.com/ldellisola) added the export/import feature for dead jobs.
|
86
|
+
|
84
87
|
For the complete list of network members have a look at the [fork overview](https://github.com/ThomasKoppensteiner/sidekiq-undertaker/network/members).
|
85
88
|
|
86
89
|
## Alternative Projects
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -2,11 +2,16 @@
|
|
2
2
|
|
3
3
|
require "sidekiq/undertaker/job_distributor"
|
4
4
|
require "sidekiq/undertaker/job_filter"
|
5
|
+
require "json"
|
6
|
+
require "zip"
|
5
7
|
|
6
8
|
module Sidekiq
|
7
9
|
module Undertaker
|
8
10
|
module WebExtension
|
11
|
+
# rubocop:disable Metrics/ModuleLength
|
9
12
|
module APIHelpers
|
13
|
+
EXPORT_CHUNK_SIZE = 2000
|
14
|
+
|
10
15
|
def show_filter
|
11
16
|
store_request_params
|
12
17
|
|
@@ -59,22 +64,25 @@ module Sidekiq
|
|
59
64
|
def post_undertaker
|
60
65
|
raise ::ArgumentError.new("Key missing") unless params["key"]
|
61
66
|
|
62
|
-
params["key"].
|
63
|
-
job = Sidekiq::DeadSet.new.fetch(*parse_params(key)).first
|
64
|
-
if job
|
65
|
-
if params["retry"]
|
66
|
-
job.retry
|
67
|
-
elsif params["delete"]
|
68
|
-
job.delete
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
67
|
+
jobs = params["key"].map { |k| Sidekiq::DeadSet.new.fetch(*parse_params(k)).first }.compact
|
72
68
|
|
73
|
-
|
69
|
+
handle_selected_jobs jobs
|
74
70
|
rescue ::ArgumentError
|
75
71
|
bad_request
|
76
72
|
end
|
77
73
|
|
74
|
+
def handle_selected_jobs(jobs)
|
75
|
+
return send_data(*prepare_data(jobs.map(&:item), EXPORT_CHUNK_SIZE)) if params["export"]
|
76
|
+
|
77
|
+
if params["retry"]
|
78
|
+
jobs.each(&:retry)
|
79
|
+
elsif params["delete"]
|
80
|
+
jobs.each(&:delete)
|
81
|
+
end
|
82
|
+
|
83
|
+
redirect redirect_path(request)
|
84
|
+
end
|
85
|
+
|
78
86
|
def post_undertaker_job_class_error_class_buckent_name_delete
|
79
87
|
store_request_params
|
80
88
|
@dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(params)
|
@@ -96,6 +104,28 @@ module Sidekiq
|
|
96
104
|
redirect redirect_path(request)
|
97
105
|
end
|
98
106
|
|
107
|
+
def post_undertaker_job_class_error_class_buckent_name_export
|
108
|
+
store_request_params
|
109
|
+
|
110
|
+
@dead_jobs = Sidekiq::Undertaker::JobFilter.filter_dead_jobs(params)
|
111
|
+
send_data(*prepare_data(@dead_jobs.map { |j| j.job.item }, EXPORT_CHUNK_SIZE))
|
112
|
+
end
|
113
|
+
|
114
|
+
def post_import_jobs
|
115
|
+
file = params["upload_file"]
|
116
|
+
raise ::ArgumentError.new("The file is not a json") if file.nil? || file[:type] != "application/json"
|
117
|
+
|
118
|
+
data = params["upload_file"][:tempfile].read
|
119
|
+
dead_set = Sidekiq::DeadSet.new
|
120
|
+
|
121
|
+
JSON.parse(data).each do |job|
|
122
|
+
dead_set.kill(Sidekiq.dump_json(job))
|
123
|
+
end
|
124
|
+
redirect redirect_path(request)
|
125
|
+
rescue StandardError
|
126
|
+
bad_request
|
127
|
+
end
|
128
|
+
|
99
129
|
def render_result(template)
|
100
130
|
render(:erb, File.read(File.join(view_path, template)))
|
101
131
|
end
|
@@ -112,13 +142,40 @@ module Sidekiq
|
|
112
142
|
|
113
143
|
def redirect_path(request)
|
114
144
|
path = request.referer ? URI.parse(request.referer).path : request.path
|
115
|
-
path.gsub("/delete", "").gsub("/retry", "")
|
145
|
+
path.gsub("/delete", "").gsub("/retry", "").gsub("/export", "")
|
146
|
+
end
|
147
|
+
|
148
|
+
def prepare_data(data, chunk_size)
|
149
|
+
filename = Time.now.strftime("%Y-%m-%d_%H-%M").to_s
|
150
|
+
return [data.to_json, "application/json", "#{filename}.json"] if data.length <= chunk_size
|
151
|
+
|
152
|
+
filename = "#{@req_job_class}_#{filename}"
|
153
|
+
zip = Zip::OutputStream.write_buffer do |file|
|
154
|
+
data.each_slice(chunk_size).each_with_index do |chunk, index|
|
155
|
+
file.put_next_entry("#{filename}_part-#{index + 1}.json")
|
156
|
+
file.write chunk.to_json
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
[zip.string, "application/zip", "#{filename}.zip"]
|
161
|
+
end
|
162
|
+
|
163
|
+
def send_data(data, content_type = "text/plain", file_name = "attachment.txt")
|
164
|
+
[
|
165
|
+
200,
|
166
|
+
{
|
167
|
+
"Content-Type" => content_type,
|
168
|
+
"Content-Disposition" => "attachment; filename=\"#{file_name}\""
|
169
|
+
},
|
170
|
+
[data]
|
171
|
+
]
|
116
172
|
end
|
117
173
|
|
118
174
|
def bad_request
|
119
175
|
[400, { "Content-Type" => "text/plain" }, ["Bad Request"]]
|
120
176
|
end
|
121
177
|
end
|
178
|
+
# rubocop:enable Metrics/ModuleLength
|
122
179
|
end
|
123
180
|
end
|
124
181
|
end
|
@@ -12,7 +12,6 @@ module Sidekiq
|
|
12
12
|
app.get "/undertaker/filter" do
|
13
13
|
show_filter
|
14
14
|
end
|
15
|
-
|
16
15
|
app.get "/undertaker/filter/:job_class/:bucket_name" do
|
17
16
|
show_filter_by_job_class_bucket_name
|
18
17
|
end
|
@@ -32,6 +31,14 @@ module Sidekiq
|
|
32
31
|
app.post "/undertaker/morgue/:job_class/:error_class/:bucket_name/retry" do
|
33
32
|
post_undertaker_job_class_error_class_buckent_name_retry
|
34
33
|
end
|
34
|
+
|
35
|
+
app.post "/undertaker/morgue/:job_class/:error_class/:bucket_name/export" do
|
36
|
+
post_undertaker_job_class_error_class_buckent_name_export
|
37
|
+
end
|
38
|
+
|
39
|
+
app.post "/undertaker/import_jobs" do
|
40
|
+
post_import_jobs
|
41
|
+
end
|
35
42
|
end
|
36
43
|
# rubocop:enable Metrics/MethodLength
|
37
44
|
end
|
data/sidekiq-undertaker.gemspec
CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.metadata = {
|
22
22
|
"homepage_uri" => "https://github.com/ThomasKoppensteiner/sidekiq-undertaker",
|
23
23
|
"source_code_uri" => "https://github.com/ThomasKoppensteiner/sidekiq-undertaker",
|
24
|
+
"changelog_uri" => "https://github.com/ThomasKoppensteiner/sidekiq-undertaker/blob/master/CHANGELOG.md",
|
24
25
|
"bug_tracker_uri" => "https://github.com/ThomasKoppensteiner/sidekiq-undertaker/issues",
|
25
26
|
"build_status_uri" => "https://travis-ci.org/ThomasKoppensteiner/sidekiq-undertaker",
|
26
27
|
"rubygems_mfa_required" => "true"
|
@@ -54,5 +55,6 @@ Gem::Specification.new do |spec|
|
|
54
55
|
spec.add_development_dependency "sinatra", "~> 2.0"
|
55
56
|
spec.add_development_dependency "timecop", "~> 0.9"
|
56
57
|
|
57
|
-
spec.add_runtime_dependency "
|
58
|
+
spec.add_runtime_dependency "rubyzip"
|
59
|
+
spec.add_runtime_dependency "sidekiq", ">= 6.4", "< 7"
|
58
60
|
end
|
@@ -18,7 +18,7 @@
|
|
18
18
|
<meta name="google" content="notranslate" />
|
19
19
|
|
20
20
|
</head>
|
21
|
-
<body class="admin" data-
|
21
|
+
<body class="admin" data-locale="en">
|
22
22
|
<div class="navbar navbar-default navbar-fixed-top">
|
23
23
|
<div class="container-fluid">
|
24
24
|
<div class="navbar-header" data-navbar="static">
|
@@ -29,9 +29,8 @@
|
|
29
29
|
</button>
|
30
30
|
<div class="navbar-toggle collapsed navbar-livereload">
|
31
31
|
|
32
|
-
|
33
|
-
<a
|
34
|
-
|
32
|
+
<a class="live-poll-start live-poll btn btn-primary">Live Poll</a>
|
33
|
+
<a class="live-poll-stop live-poll btn btn-primary active">Stop Polling</a>
|
35
34
|
|
36
35
|
|
37
36
|
|
@@ -95,9 +94,8 @@
|
|
95
94
|
<li class="navbar-livereload">
|
96
95
|
<div class="poll-wrapper">
|
97
96
|
|
98
|
-
|
99
|
-
<a
|
100
|
-
|
97
|
+
<a class="live-poll-start live-poll btn btn-primary">Live Poll</a>
|
98
|
+
<a class="live-poll-stop live-poll btn btn-primary active">Stop Polling</a>
|
101
99
|
|
102
100
|
|
103
101
|
|
@@ -114,40 +112,40 @@
|
|
114
112
|
<div class="col-sm-12 summary_bar">
|
115
113
|
<ul class="list-unstyled summary row">
|
116
114
|
<li class="processed col-sm-1">
|
117
|
-
<span class="count">0</span>
|
115
|
+
<span id="txtProcessed" class="count">0</span>
|
118
116
|
<span class="desc">Processed</span>
|
119
117
|
</li>
|
120
118
|
<li class="failed col-sm-1">
|
121
|
-
<span class="count">0</span>
|
119
|
+
<span id="txtFailed" class="count">0</span>
|
122
120
|
<span class="desc">Failed</span>
|
123
121
|
</li>
|
124
122
|
<li class="busy col-sm-1">
|
125
123
|
<a href="/sidekiq/busy">
|
126
|
-
<span class="count">0</span>
|
124
|
+
<span id="txtBusy" class="count">0</span>
|
127
125
|
<span class="desc">Busy</span>
|
128
126
|
</a>
|
129
127
|
</li>
|
130
128
|
<li class="enqueued col-sm-1">
|
131
129
|
<a href="/sidekiq/queues">
|
132
|
-
<span class="count">0</span>
|
130
|
+
<span id="txtEnqueued" class="count">0</span>
|
133
131
|
<span class="desc">Enqueued</span>
|
134
132
|
</a>
|
135
133
|
</li>
|
136
134
|
<li class="retries col-sm-1">
|
137
135
|
<a href="/sidekiq/retries">
|
138
|
-
<span class="count">0</span>
|
136
|
+
<span id="txtRetries" class="count">0</span>
|
139
137
|
<span class="desc">Retries</span>
|
140
138
|
</a>
|
141
139
|
</li>
|
142
140
|
<li class="scheduled col-sm-1">
|
143
141
|
<a href="/sidekiq/scheduled">
|
144
|
-
<span class="count">0</span>
|
142
|
+
<span id="txtScheduled" class="count">0</span>
|
145
143
|
<span class="desc">Scheduled</span>
|
146
144
|
</a>
|
147
145
|
</li>
|
148
146
|
<li class="dead col-sm-1">
|
149
147
|
<a href="/sidekiq/morgue">
|
150
|
-
<span class="count">4</span>
|
148
|
+
<span id="txtDead" class="count">4</span>
|
151
149
|
<span class="desc">Dead</span>
|
152
150
|
</a>
|
153
151
|
</li>
|
@@ -213,6 +211,22 @@
|
|
213
211
|
|
214
212
|
</table>
|
215
213
|
|
214
|
+
<header class="row header">
|
215
|
+
<div class="col-sm-12">
|
216
|
+
<h3>
|
217
|
+
Import Jobs
|
218
|
+
</h3>
|
219
|
+
</div>
|
220
|
+
</header>
|
221
|
+
|
222
|
+
<form enctype="multipart/form-data" method="post" action='/sidekiq/undertaker/import_jobs'>
|
223
|
+
<input type='hidden' name='authenticity_token' value='stubbed-csrf-token'/>
|
224
|
+
<input type="file" id=upload_file" name="upload_file" >
|
225
|
+
<button class="btn btn-danger" style="margin-top: 10px" type="submit">
|
226
|
+
Import
|
227
|
+
</button>
|
228
|
+
</form>
|
229
|
+
|
216
230
|
</div>
|
217
231
|
</div>
|
218
232
|
</div>
|
@@ -228,7 +242,7 @@
|
|
228
242
|
<p class="navbar-text redis-url" title="redis://127.0.0.1:6379/0">redis://127.0.0.1:6379/0</p>
|
229
243
|
</li>
|
230
244
|
<li>
|
231
|
-
<p class="navbar-text server-utc-time">20:57:00 UTC</p>
|
245
|
+
<p id="serverUtcTime" class="navbar-text server-utc-time">20:57:00 UTC</p>
|
232
246
|
</li>
|
233
247
|
<li>
|
234
248
|
<p class="navbar-text"><a style="color: gray;" href="https://github.com/mperham/sidekiq/wiki">docs</a></p>
|
@@ -18,7 +18,7 @@
|
|
18
18
|
<meta name="google" content="notranslate" />
|
19
19
|
|
20
20
|
</head>
|
21
|
-
<body class="admin" data-
|
21
|
+
<body class="admin" data-locale="en">
|
22
22
|
<div class="navbar navbar-default navbar-fixed-top">
|
23
23
|
<div class="container-fluid">
|
24
24
|
<div class="navbar-header" data-navbar="static">
|
@@ -29,9 +29,8 @@
|
|
29
29
|
</button>
|
30
30
|
<div class="navbar-toggle collapsed navbar-livereload">
|
31
31
|
|
32
|
-
|
33
|
-
<a
|
34
|
-
|
32
|
+
<a class="live-poll-start live-poll btn btn-primary">Live Poll</a>
|
33
|
+
<a class="live-poll-stop live-poll btn btn-primary active">Stop Polling</a>
|
35
34
|
|
36
35
|
|
37
36
|
|
@@ -95,9 +94,8 @@
|
|
95
94
|
<li class="navbar-livereload">
|
96
95
|
<div class="poll-wrapper">
|
97
96
|
|
98
|
-
|
99
|
-
<a
|
100
|
-
|
97
|
+
<a class="live-poll-start live-poll btn btn-primary">Live Poll</a>
|
98
|
+
<a class="live-poll-stop live-poll btn btn-primary active">Stop Polling</a>
|
101
99
|
|
102
100
|
|
103
101
|
|
@@ -114,40 +112,40 @@
|
|
114
112
|
<div class="col-sm-12 summary_bar">
|
115
113
|
<ul class="list-unstyled summary row">
|
116
114
|
<li class="processed col-sm-1">
|
117
|
-
<span class="count">0</span>
|
115
|
+
<span id="txtProcessed" class="count">0</span>
|
118
116
|
<span class="desc">Processed</span>
|
119
117
|
</li>
|
120
118
|
<li class="failed col-sm-1">
|
121
|
-
<span class="count">0</span>
|
119
|
+
<span id="txtFailed" class="count">0</span>
|
122
120
|
<span class="desc">Failed</span>
|
123
121
|
</li>
|
124
122
|
<li class="busy col-sm-1">
|
125
123
|
<a href="/sidekiq/busy">
|
126
|
-
<span class="count">0</span>
|
124
|
+
<span id="txtBusy" class="count">0</span>
|
127
125
|
<span class="desc">Busy</span>
|
128
126
|
</a>
|
129
127
|
</li>
|
130
128
|
<li class="enqueued col-sm-1">
|
131
129
|
<a href="/sidekiq/queues">
|
132
|
-
<span class="count">0</span>
|
130
|
+
<span id="txtEnqueued" class="count">0</span>
|
133
131
|
<span class="desc">Enqueued</span>
|
134
132
|
</a>
|
135
133
|
</li>
|
136
134
|
<li class="retries col-sm-1">
|
137
135
|
<a href="/sidekiq/retries">
|
138
|
-
<span class="count">0</span>
|
136
|
+
<span id="txtRetries" class="count">0</span>
|
139
137
|
<span class="desc">Retries</span>
|
140
138
|
</a>
|
141
139
|
</li>
|
142
140
|
<li class="scheduled col-sm-1">
|
143
141
|
<a href="/sidekiq/scheduled">
|
144
|
-
<span class="count">0</span>
|
142
|
+
<span id="txtScheduled" class="count">0</span>
|
145
143
|
<span class="desc">Scheduled</span>
|
146
144
|
</a>
|
147
145
|
</li>
|
148
146
|
<li class="dead col-sm-1">
|
149
147
|
<a href="/sidekiq/morgue">
|
150
|
-
<span class="count">4</span>
|
148
|
+
<span id="txtDead" class="count">4</span>
|
151
149
|
<span class="desc">Dead</span>
|
152
150
|
</a>
|
153
151
|
</li>
|
@@ -229,7 +227,7 @@
|
|
229
227
|
<p class="navbar-text redis-url" title="redis://127.0.0.1:6379/0">redis://127.0.0.1:6379/0</p>
|
230
228
|
</li>
|
231
229
|
<li>
|
232
|
-
<p class="navbar-text server-utc-time">20:57:00 UTC</p>
|
230
|
+
<p id="serverUtcTime" class="navbar-text server-utc-time">20:57:00 UTC</p>
|
233
231
|
</li>
|
234
232
|
<li>
|
235
233
|
<p class="navbar-text"><a style="color: gray;" href="https://github.com/mperham/sidekiq/wiki">docs</a></p>
|
@@ -18,7 +18,7 @@
|
|
18
18
|
<meta name="google" content="notranslate" />
|
19
19
|
|
20
20
|
</head>
|
21
|
-
<body class="admin" data-
|
21
|
+
<body class="admin" data-locale="en">
|
22
22
|
<div class="navbar navbar-default navbar-fixed-top">
|
23
23
|
<div class="container-fluid">
|
24
24
|
<div class="navbar-header" data-navbar="static">
|
@@ -29,9 +29,8 @@
|
|
29
29
|
</button>
|
30
30
|
<div class="navbar-toggle collapsed navbar-livereload">
|
31
31
|
|
32
|
-
|
33
|
-
<a
|
34
|
-
|
32
|
+
<a class="live-poll-start live-poll btn btn-primary">Live Poll</a>
|
33
|
+
<a class="live-poll-stop live-poll btn btn-primary active">Stop Polling</a>
|
35
34
|
|
36
35
|
|
37
36
|
|
@@ -95,9 +94,8 @@
|
|
95
94
|
<li class="navbar-livereload">
|
96
95
|
<div class="poll-wrapper">
|
97
96
|
|
98
|
-
|
99
|
-
<a
|
100
|
-
|
97
|
+
<a class="live-poll-start live-poll btn btn-primary">Live Poll</a>
|
98
|
+
<a class="live-poll-stop live-poll btn btn-primary active">Stop Polling</a>
|
101
99
|
|
102
100
|
|
103
101
|
|
@@ -114,40 +112,40 @@
|
|
114
112
|
<div class="col-sm-12 summary_bar">
|
115
113
|
<ul class="list-unstyled summary row">
|
116
114
|
<li class="processed col-sm-1">
|
117
|
-
<span class="count">0</span>
|
115
|
+
<span id="txtProcessed" class="count">0</span>
|
118
116
|
<span class="desc">Processed</span>
|
119
117
|
</li>
|
120
118
|
<li class="failed col-sm-1">
|
121
|
-
<span class="count">0</span>
|
119
|
+
<span id="txtFailed" class="count">0</span>
|
122
120
|
<span class="desc">Failed</span>
|
123
121
|
</li>
|
124
122
|
<li class="busy col-sm-1">
|
125
123
|
<a href="/sidekiq/busy">
|
126
|
-
<span class="count">0</span>
|
124
|
+
<span id="txtBusy" class="count">0</span>
|
127
125
|
<span class="desc">Busy</span>
|
128
126
|
</a>
|
129
127
|
</li>
|
130
128
|
<li class="enqueued col-sm-1">
|
131
129
|
<a href="/sidekiq/queues">
|
132
|
-
<span class="count">0</span>
|
130
|
+
<span id="txtEnqueued" class="count">0</span>
|
133
131
|
<span class="desc">Enqueued</span>
|
134
132
|
</a>
|
135
133
|
</li>
|
136
134
|
<li class="retries col-sm-1">
|
137
135
|
<a href="/sidekiq/retries">
|
138
|
-
<span class="count">0</span>
|
136
|
+
<span id="txtRetries" class="count">0</span>
|
139
137
|
<span class="desc">Retries</span>
|
140
138
|
</a>
|
141
139
|
</li>
|
142
140
|
<li class="scheduled col-sm-1">
|
143
141
|
<a href="/sidekiq/scheduled">
|
144
|
-
<span class="count">0</span>
|
142
|
+
<span id="txtScheduled" class="count">0</span>
|
145
143
|
<span class="desc">Scheduled</span>
|
146
144
|
</a>
|
147
145
|
</li>
|
148
146
|
<li class="dead col-sm-1">
|
149
147
|
<a href="/sidekiq/morgue">
|
150
|
-
<span class="count">4</span>
|
148
|
+
<span id="txtDead" class="count">4</span>
|
151
149
|
<span class="desc">Dead</span>
|
152
150
|
</a>
|
153
151
|
</li>
|
@@ -229,7 +227,7 @@
|
|
229
227
|
<p class="navbar-text redis-url" title="redis://127.0.0.1:6379/0">redis://127.0.0.1:6379/0</p>
|
230
228
|
</li>
|
231
229
|
<li>
|
232
|
-
<p class="navbar-text server-utc-time">20:57:00 UTC</p>
|
230
|
+
<p id="serverUtcTime" class="navbar-text server-utc-time">20:57:00 UTC</p>
|
233
231
|
</li>
|
234
232
|
<li>
|
235
233
|
<p class="navbar-text"><a style="color: gray;" href="https://github.com/mperham/sidekiq/wiki">docs</a></p>
|