Introduction
Introduction Statistics Contact Development Disclaimer Help
jobs_controller.rb - warvox - VoIP based wardialing tool, forked from rapid7/wa…
git clone git://jay.scot/warvox
Log
Files
Refs
README
---
jobs_controller.rb (9313B)
---
1 class JobsController < ApplicationController
2 require 'shellwords'
3
4 def index
5 @reload_interval = 20_000
6
7 @submitted_jobs = Job.where(status: %w(submitted scheduled), complet…
8 @active_jobs = Job.where(status: 'running', completed_at: nil)
9 @inactive_jobs = Job.order('id DESC').where('status NOT IN (?)', %w…
10 page: params[:page],
11 per_page: 30
12 )
13
14 @reload_interval = 5000 unless @active_jobs.empty?
15
16 @reload_interval = 3000 unless @submitted_jobs.empty?
17
18 respond_to do |format|
19 format.html
20 end
21 end
22
23 def results
24 @jobs = @project.jobs.order('id DESC').where('(task = ? OR task = ?)…
25 page: params[:page],
26 per_page: 30
27 )
28
29 respond_to do |format|
30 format.html
31 end
32 end
33
34 def view_results
35 @job = Job.find(params[:id])
36
37 @call_results = {
38 Timeout: @job.calls.where(answered: false ).count,
39 Busy: @job.calls.where(busy: true).count,
40 Answered: @job.calls.where(answered: true).count,
41 }
42
43
44 sort_by = params[:sort_by] || 'number'
45 sort_dir = params[:sort_dir] || 'asc'
46
47 @results = []
48 @results_total_count = @job.calls.count
49
50 if request.format.json?
51 if params[:iDisplayLength] == '-1'
52 @results_per_page = nil
53 else
54 @results_per_page = (params[:iDisplayLength] || 20).to_i
55 end
56 @results_offset = (params[:iDisplayStart] || 0).to_i
57
58 calls_search
59 @results = @job.calls.includes(:provider).where(@search_conditions…
60 @results_total_display_count = @job.calls.includes(:provider).wher…
61 end
62
63 respond_to do |format|
64 format.html
65 format.json do
66 render content_type: 'application/json', json: render_to_string(…
67 end
68 end
69 end
70
71 # Generate a SQL sort by option based on the incoming DataTables param…
72 #
73 # Returns the SQL String.
74 def calls_sort_option
75 column = case params[:iSortCol_0].to_s
76 when '1'
77 'number'
78 when '2'
79 'caller_id'
80 when '3'
81 'providers.name'
82 when '4'
83 'answered'
84 when '5'
85 'busy'
86 when '6'
87 'audio_length'
88 when '7'
89 'ring_length'
90 end
91 column + ' ' + (params[:sSortDir_0] =~ /^A/i ? 'asc' : 'desc') if co…
92 end
93
94 def calls_search
95 @search_conditions = []
96 terms = params[:sSearch].to_s
97 terms = begin
98 Shellword.shellwords(terms)
99 rescue
100 terms.split(/\s+/)
101 end
102 where = ''
103 param = []
104 glue = ''
105 terms.each do |w|
106 next if w.casecmp('undefined').zero?
107 where << glue
108 case w
109 when 'answered'
110 where << 'answered = ? '
111 param << true
112 when 'busy'
113 where << 'busy = ? '
114 param << true
115 else
116 where << '( number ILIKE ? OR caller_id ILIKE ? ) '
117 param << "%#{w}%"
118 param << "%#{w}%"
119 end
120 glue = 'AND ' if glue.empty?
121 @search_conditions = [where, *param]
122 end
123 end
124
125 def new_dialer
126 @job = Job.new
127 @job.project = if @project
128 @project
129 else
130 Project.last
131 end
132
133 if params[:result_ids]
134 nums = ''
135 Call.find_each(conditions: { id: params[:result_ids] }) do |call|
136 nums << call.number + "\n"
137 end
138 @job.range = nums
139 end
140
141 respond_to do |format|
142 format.html
143 end
144 end
145
146 def purge_calls
147 unless params[:result_ids].blank?
148 Call.delete_all(id: params[:result_ids])
149 CallMedium.delete_all(call_id: params[:result_ids])
150 flash[:notice] = "Purged #{params[:result_ids].length} calls"
151 end
152
153 if params[:id]
154 @job = Job.find(params[:id])
155 redirect_to view_results_path(@job.project_id, @job.id)
156 else
157 redirect_to analyze_path(@project)
158 end
159 end
160
161 def dialer
162 @job = Job.new(job_params)
163 @job.created_by = @current_user.login
164 @job.task = 'dialer'
165 @job.range.to_s.gsub!(/[^0-9X:,\n]/, '')
166 @job.cid_mask.to_s.gsub!(/[^0-9X]/, '') if @job.cid_mask != 'SELF'
167
168 if @job.range_file.to_s != ''
169 @job.range = @job.range_file.read.gsub(/[^0-9X:,\n]/, '')
170 end
171
172 respond_to do |format|
173 if @job.schedule
174 flash[:notice] = 'Job was successfully created.'
175 format.html { redirect_to action: :index }
176 else
177 format.html { render action: 'new_dialer' }
178 end
179 end
180 end
181
182 def new_analyze
183 @job = Job.new
184 @job.project = if @project
185 @project
186 else
187 Project.last
188 end
189
190 if params[:result_ids]
191 nums = ''
192 Call.find_each(conditions: { id: params[:result_ids] }) do |call|
193 nums << call.number + "\n"
194 end
195 @job.range = nums
196 end
197
198 respond_to do |format|
199 format.html
200 end
201 end
202
203 def new_identify
204 @job = Job.new
205 @job.project = if @project
206 @project
207 else
208 Project.last
209 end
210
211 if params[:result_ids]
212 nums = ''
213 Call.find_each(conditions: { id: params[:result_ids] }) do |call|
214 nums << call.number + "\n"
215 end
216 @job.range = nums
217 end
218
219 respond_to do |format|
220 format.html
221 end
222 end
223
224 def reanalyze_job
225 @job = Job.find(params[:id])
226 @new = Job.new(task: 'analysis', scope: 'job', target_id: @job.id, f…
227 project_id: @project.id, status: 'submitted')
228 @new.created_by = @current_user.login
229 respond_to do |format|
230 if @new.schedule
231 flash[:notice] = 'Analysis job was successfully created.'
232 format.html { redirect_to jobs_path }
233 else
234 flash[:notice] = 'Analysis job could not run: ' + @new.errors.in…
235 format.html { redirect_to results_path(@project) }
236 end
237 end
238 end
239
240 def analyze_job
241 @job = Job.find(params[:id])
242
243 # Handle analysis of specific call IDs via checkbox submission
244 if params[:result_ids]
245 @new = Job.new(task: 'analysis', scope: 'calls', target_ids: param…
246 project_id: @project.id, status: 'submitted')
247 else
248 # Otherwise analyze the entire Job
249 @new = Job.new(task: 'analysis', scope: 'job', target_id: @job.id,
250 project_id: @project.id, status: 'submitted')
251 end
252
253 @new.created_by = @current_user.login
254
255 respond_to do |format|
256 if @new.schedule
257 flash[:notice] = 'Analysis job was successfully created.'
258 format.html { redirect_to jobs_path }
259 else
260 flash[:notice] = 'Analysis job could not run: ' + @new.errors.in…
261 format.html { redirect_to results_path(@project) }
262 end
263 end
264 end
265
266 def analyze_project
267 # Handle analysis of specific call IDs via checkbox submission
268 if params[:result_ids]
269 @new = Job.new(task: 'analysis', scope: 'calls', target_ids: param…
270 project_id: @project.id, status: 'submitted')
271 else
272 # Otherwise analyze the entire Project
273 @new = Job.new(task: 'analysis', scope: 'project', target_id: @pro…
274 project_id: @project.id, status: 'submitted')
275 end
276
277 @new.created_by = @current_user.login
278
279 respond_to do |format|
280 if @new.schedule
281 flash[:notice] = 'Analysis job was successfully created.'
282 format.html { redirect_to jobs_path }
283 else
284 flash[:notice] = 'Analysis job could not run: ' + @new.errors.in…
285 format.html { redirect_to results_path(@project) }
286 end
287 end
288 end
289
290 def identify_job
291 @job = Job.find(params[:id])
292
293 # Handle identification of specific lines via checkbox submission
294 if params[:result_ids]
295 @new = Job.new(task: 'identify', scope: 'calls', target_ids: param…
296 project_id: @project.id, status: 'submitted')
297 else
298 # Otherwise analyze the entire Job
299 @new = Job.new(task: 'identify', scope: 'job', target_id: @job.id,
300 project_id: @project.id, status: 'submitted')
301 end
302
303 @new.created_by = @current_user.login
304
305 respond_to do |format|
306 if @new.schedule
307 flash[:notice] = 'Identify job was successfully created.'
308 format.html { redirect_to jobs_path }
309 else
310 flash[:notice] = 'Identify job could not run: ' + @new.errors.in…
311 format.html { redirect_to results_path(@project) }
312 end
313 end
314 end
315
316 def stop
317 @job = Job.find(params[:id])
318 @job.stop
319 flash[:notice] = 'Job has been cancelled'
320 redirect_to action: 'index'
321 end
322
323 def destroy
324 @job = Job.find(params[:id])
325 @job.destroy
326
327 respond_to do |format|
328 format.html { redirect_to(jobs_url) }
329 format.xml { head :ok }
330 end
331 end
332
333 private
334
335 def job_params
336 params.require(:job).permit(:project_id, :range, :range_file, :secon…
337 end
338 end
You are viewing proxied material from jay.scot. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.