import_audio.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
       ---
       import_audio.rb (2607B)
       ---
            1 #!/usr/bin/env ruby
            2 ###################
            3 
            4 #
            5 # Load the library path
            6 #
            7 base = __FILE__
            8 while File.symlink?(base)
            9   base = File.expand_path(File.readlink(base), File.dirname(base))
           10 end
           11 $:.unshift(File.join(File.expand_path(File.dirname(base)), '..', 'lib'))
           12 
           13 require 'warvox'
           14 require 'fileutils'
           15 
           16 
           17 ENV['RAILS_ENV'] ||= 'production'
           18 
           19 $:.unshift(File.join(File.expand_path(File.dirname(base)), '..'))
           20 
           21 def usage
           22   $stderr.puts "Usage: #{$0} [Input Directory] <Project ID> <Provider ID>"
           23   exit(1)
           24 end
           25 
           26 #
           27 # Script
           28 #
           29 
           30 dir = ARGV.shift() || usage()
           31 if (dir and dir =="-h") or (! dir)
           32   usage()
           33 end
           34 
           35 require 'config/boot'
           36 require 'config/environment'
           37 
           38 project_id  = ARGV.shift
           39 provider_id = ARGV.shift
           40 
           41 todo = Dir["#{dir}/**/*.{raw,wav}"].to_a
           42 
           43 if todo.empty?
           44   $stderr.puts "Error: No raw audio files found within #{dir}"
           45   exit(1)
           46 end
           47 
           48 project  = nil
           49 provider = nil
           50 
           51 if project_id
           52   project = Project.where(id: project_id).first
           53   unless project
           54     $stderr.puts "Error: Specified Project ID not found"
           55     exit(1)
           56   end
           57 end
           58 
           59 if provider_id
           60   provider = Provider.where(id: provider_id).first
           61   unless provider
           62     $stderr.puts "Error: Specified Provider ID not found"
           63     exit(1)
           64   end
           65 end
           66 
           67 unless project
           68   project = Project.create(
           69     name: "Import from #{dir} at #{Time.now.utc.to_s}",
           70     created_by: "importer"
           71   )
           72 end
           73 
           74 provider = Provider.first
           75 unless provider
           76   provider = Provider.create(
           77     name: 'Import Provider',
           78     host: 'localhost',
           79     port: 4369,
           80     user: "null",
           81     pass: "null",
           82     lines: 1,
           83     enabled: false
           84   )
           85 end
           86 
           87 
           88 job = Job.new
           89 job.project_id   = project.id
           90 job.locked_by    = "importer"
           91 job.locked_at    = Time.now.utc
           92 job.started_at   = Time.now.utc
           93 job.created_by   = "importer"
           94 job.task         = "import"
           95 job.args         = Marshal.dump({ directory: dir, project_id: project.id, provider_id: provider.id })
           96 job.status       = "running"
           97 job.save!
           98 
           99 pct  = 0
          100 cnt  = 0
          101 
          102 todo.each do |rfile|
          103   num, ext = File.basename(rfile).split(".", 2)
          104   dr = Call.new
          105   dr.number        = num
          106   dr.job_id        = job.id
          107   dr.project_id    = project.id
          108   dr.provider_id   = provider.id
          109   dr.answered      = true
          110   dr.busy          = false
          111   dr.audio_length  = File.size(rfile) / 16000.0
          112   dr.ring_length   = 0
          113   dr.caller_id     = num
          114   dr.save
          115 
          116   mr = dr.media
          117   ::File.open(rfile, "rb") do |fd|
          118     mr.audio = fd.read(fd.stat.size)
          119     mr.save
          120   end
          121 
          122   cnt += 1
          123   pct = (cnt / todo.length.to_f) * 100.0
          124   if cnt % 10 == 0
          125     job.update_progress(pct)
          126   end
          127 
          128   $stdout.puts "[ %#{"%.3d" % pct.to_i} ] Imported #{num} into project '#{project.name}' ##{project.id}"
          129 end
          130 
          131 job.update_progress(100)