analyze_controller.rb - warvox - VoIP based wardialing tool, forked from rapid7/warvox.
 (HTM) git clone git://jay.scot/warvox
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
       analyze_controller.rb (6328B)
       ---
            1 class AnalyzeController < ApplicationController
            2 
            3   def index
            4     @jobs = Job.order('id DESC').paginate(
            5       page: params[:page],
            6       per_page: 30
            7     )
            8   end
            9 
           10   def view
           11     @job_id   = params[:id]
           12     @job      = Job.find(@job_id)
           13     @shown    = params[:show]
           14 
           15     if request.format.html?
           16       ltypes = Call.select('DISTINCT line_type').where(job_id: @job_id).map{|r| r.line_type}
           17       res_types = {}
           18 
           19       ltypes.each do |k|
           20         next if not k
           21         res_types[k.capitalize.to_sym] = Call.where(job_id: @job_id, line_type: k).count
           22       end
           23 
           24       @lines_by_type = res_types
           25     end
           26 
           27     sort_by  = params[:sort_by] || 'number'
           28     sort_dir = params[:sort_dir] || 'asc'
           29 
           30     @results = []
           31     @results_total_count = 0
           32 
           33     if request.format.json?
           34 
           35       @results_total_count = Call.where("job_id = ? AND analysis_completed_at IS NOT NULL", @job.id).count()
           36 
           37       if params[:iDisplayLength] == '-1'
           38         @results_per_page = nil
           39       else
           40         @results_per_page = (params[:iDisplayLength] || 20).to_i
           41       end
           42       @results_offset = (params[:iDisplayStart] || 0).to_i
           43 
           44     calls_search
           45 
           46     @results_total_display_count = Call.where(@search_conditions).count()
           47     @results = Call.where(@search_conditions).includes(:provider).limit(@results_per_page).offset(@results_offset).order(calls_sort_option)
           48 
           49     end
           50 
           51     respond_to do |format|
           52       format.html
           53       format.json {
           54         render content_type: 'application/json', json: render_to_string(partial: 'view', results: @results, lines_by_type: @lines_by_type )
           55       }
           56     end
           57 
           58   end
           59 
           60   def view_matches
           61     @result = Call.find(params[:call_id])
           62     @match_scopes = [
           63       { scope: 'job', label: 'This Job' },
           64       { scope: 'project', label: 'This Project' },
           65       { scope: 'global', label: 'All Projects' }
           66     ]
           67 
           68     @job_id = params[:job_id]
           69 
           70     if @job_id
           71         @match_scope = params[:match_scope] || "job"
           72     else
           73       @match_scope = params[:match_scope] || "project"
           74     end
           75 
           76     @results = @result.paginate_matches(@match_scope, 30.0, params[:page], 30)
           77   end
           78 
           79   def index
           80     @shown = params[:show]
           81 
           82     ltypes = Line.select('DISTINCT line_type').where(project_id: @project.id).map{|r| r.line_type}
           83     res_types = {}
           84 
           85     ltypes.each do |k|
           86       next if not k
           87       res_types[k.capitalize.to_sym] = Line.where(project_id: @project.id, line_type: k).count()
           88     end
           89 
           90     @lines_by_type = res_types
           91 
           92     sort_by  = params[:sort_by] || 'number'
           93     sort_dir = params[:sort_dir] || 'asc'
           94 
           95     @results = []
           96     @results_total_count = @project.calls.where("analysis_completed_at IS NOT NULL").count()
           97 
           98     if request.format.json?
           99       if params[:iDisplayLength] == '-1'
          100         @results_per_page = nil
          101       else
          102         @results_per_page = (params[:iDisplayLength] || 20).to_i
          103       end
          104       @results_offset = (params[:iDisplayStart] || 0).to_i
          105 
          106     project_search
          107       @results = Call.where(@search_conditions).includes(:provider).limit(@results_per_page).offset(@results_offset).order(calls_sort_option)
          108       @results_total_display_count = Call.where(@search_conditions).includes(:provider).count()
          109     end
          110 
          111     respond_to do |format|
          112       format.html
          113       format.json {
          114         render content_type: 'application/json', json: render_to_string(partial: 'index', results: @results, lines_by_type: @lines_by_type )
          115       }
          116     end
          117 
          118   end
          119 
          120   def resource
          121     ctype = 'text/html'
          122     cpath = nil
          123     cdata = "File not found"
          124 
          125     res = CallMedium.where(call_id: params[:result_id].to_i).first
          126 
          127     if res
          128       case params[:rtype]
          129       when 'big_sig'
          130         ctype = 'image/png'
          131         cdata = res.png_sig_freq
          132       when 'big_sig_dots'
          133         ctype = 'image/png'
          134         cdata = res.png_big_dots
          135       when 'small_sig'
          136         ctype = 'image/png'
          137         cdata = res.png_sig
          138       when 'big_freq'
          139         ctype = 'image/png'
          140         cdata = res.png_big_freq
          141       when 'small_freq'
          142         ctype = 'image/png'
          143         cdata = res.png_sig_freq
          144       when 'mp3'
          145         ctype = 'audio/mpeg'
          146         cdata = res.mp3
          147       when 'sig'
          148         ctype = 'text/plain'
          149         cdata = res.fprint
          150       when 'raw'
          151         ctype = 'octet/binary-stream'
          152         cdata = res.audio
          153       end
          154     end
          155 
          156     send_data(cdata, type: ctype, disposition: 'inline')
          157   end
          158 
          159   #
          160   # Generate a SQL sort by option based on the incoming DataTables paramater.
          161   #
          162   # Returns the SQL String.
          163   def calls_sort_option
          164     column = case params[:iSortCol_0].to_s
          165       when '1'
          166         'number'
          167       when '2'
          168         'line_type'
          169       when '3'
          170         'peak_freq'
          171       end
          172     column + ' ' + (params[:sSortDir_0] =~ /^A/i ? 'asc' : 'desc') if column
          173   end
          174 
          175   def calls_search
          176     @search_conditions = []
          177     terms = params[:sSearch].to_s
          178     terms = Shellword.shellwords(terms) rescue terms.split(/\s+/)
          179     where = "job_id = ? AND analysis_completed_at IS NOT NULL "
          180     param = [ @job_id ]
          181     glue  = "AND "
          182     terms.each do |w|
          183       next if w == "undefined"
          184       where << glue
          185       case w
          186         when /^F(\d+)$/i   # F2100 = peak frequency between 2095hz and 2105hz
          187           freq = $1.to_i
          188           where << "( peak_freq > ? AND peak_freq < ? ) "
          189           param << freq - 5.0
          190           param << freq + 5.0
          191         else
          192           where << "( number ILIKE ? OR caller_id ILIKE ? OR line_type ILIKE ? ) "
          193           param << "%#{w}%"
          194           param << "%#{w}%"
          195           param << "%#{w}%"
          196       end
          197       glue = "AND " if glue.empty?
          198     end
          199     @search_conditions = [ where, *param ]
          200   end
          201 
          202   def project_search
          203     @search_conditions = []
          204     terms = params[:sSearch].to_s
          205     terms = Shellword.shellwords(terms) rescue terms.split(/\s+/)
          206     where = "project_id = ? AND analysis_completed_at IS NOT NULL "
          207     param = [ @project.id ]
          208     glue  = "AND "
          209     terms.each do |w|
          210       next if w == "undefined"
          211       where << glue
          212       case w
          213         when /^F(\d+)$/i   # F2100 = peak frequency between 2095hz and 2105hz
          214           freq = $1.to_i
          215           where << "( peak_freq > ? AND peak_freq < ? ) "
          216           param << freq - 5.0
          217           param << freq + 5.0
          218         else
          219           where << "( number ILIKE ? OR caller_id ILIKE ? OR line_type ILIKE ? ) "
          220           param << "%#{w}%"
          221           param << "%#{w}%"
          222           param << "%#{w}%"
          223       end
          224       glue = "AND " if glue.empty?
          225     end
          226     @search_conditions = [ where, *param ]
          227   end
          228 
          229 end