| Updated importer, schema, classes - warvox - VoIP based wardialing tool, forked… | |
| Log | |
| Files | |
| Refs | |
| README | |
| --- | |
| commit 7bcac597dbf94b510242581bb21f8d9ddae4a514 | |
| parent 74be216401da43b3f2234fdcf38c2a07da7c9108 | |
| Author: HD Moore <[email protected]> | |
| Date: Mon, 31 Dec 2012 13:54:05 -0600 | |
| Updated importer, schema, classes | |
| Diffstat: | |
| D app/models/dial_result.rb | 36 -----------------------------… | |
| D app/models/dial_result_medium.rb | 3 --- | |
| M app/models/job.rb | 8 ++++++++ | |
| M app/models/project.rb | 4 +++- | |
| M bin/import_audio.rb | 122 ++++++++++++++++++++---------… | |
| M db/migrate/20121228171549_initial_… | 109 +++++++++++++++++++++------… | |
| M db/schema.rb | 112 ++++++++++++++++++++---------… | |
| 7 files changed, 239 insertions(+), 155 deletions(-) | |
| --- | |
| diff --git a/app/models/dial_result.rb b/app/models/dial_result.rb | |
| @@ -1,36 +0,0 @@ | |
| -class DialResult < ActiveRecord::Base | |
| - belongs_to :provider | |
| - belongs_to :dial_job | |
| - has_one :dial_result_medium, :dependent => :delete | |
| - | |
| - has_many :matches, :class_name => 'DialResult', :finder_sql => proc { | |
| - 'SELECT dial_results.*, ' + | |
| - " (( icount(\'{#{fprint.map{|x| x.to_s}.join(",")}}\'::… | |
| - 'FROM dial_results ' + | |
| - 'WHERE icount(dial_results.fprint) > 0 AND ' + | |
| - "dial_results.dial_job_id = \'#{dial_job_id}\' AND " + | |
| - "dial_results.id != \'#{id}\' " + | |
| -# "AND (( icount(\'{#{fprint.map{|x| x.to_s}.join(",")}}\'::int… | |
| - 'ORDER BY matchscore DESC' | |
| - } | |
| - | |
| - has_many :matches_all_jobs, :class_name => 'DialResult', :finder_sql =… | |
| - 'SELECT dial_results.*, ' + | |
| - " (( icount(\'{#{fprint.map{|x| x.to_s}.join(",")}}\'::… | |
| - 'FROM dial_results ' + | |
| - 'WHERE icount(dial_results.fprint) > 0 AND ' + | |
| - "dial_results.id != \'#{id}\' " + | |
| -# "AND (( icount(\'{#{fprint.map{|x| x.to_s}.join(",")}}\'::int… | |
| - 'ORDER BY matchscore DESC' | |
| - } | |
| - | |
| - | |
| - def media | |
| - DialResultMedium.find_or_create_by_dial_result_id(self[:id]) | |
| - end | |
| - | |
| - def media_fields | |
| - DialResultMedium.columns_hash.keys.reject{|x| x =~ /^id|_id$/} | |
| - end | |
| - | |
| -end | |
| diff --git a/app/models/dial_result_medium.rb b/app/models/dial_result_medium.rb | |
| @@ -1,3 +0,0 @@ | |
| -class DialResultMedium < ActiveRecord::Base | |
| - belongs_to :dial_result | |
| -end | |
| diff --git a/app/models/job.rb b/app/models/job.rb | |
| @@ -1,4 +1,12 @@ | |
| class Job < ActiveRecord::Base | |
| has_many :calls | |
| belongs_to :project | |
| + | |
| + def update_progress(pct) | |
| + if pct >= 100 | |
| + self.class.update_all({ :progress => pct, :completed_a… | |
| + else | |
| + self.class.update_all({ :progress => pct }, { :id => s… | |
| + end | |
| + end | |
| end | |
| diff --git a/app/models/project.rb b/app/models/project.rb | |
| @@ -3,5 +3,7 @@ class Project < ActiveRecord::Base | |
| attr_accessible :name, :description, :included, :excluded | |
| - has_many :lines, :calls, :jobs | |
| + has_many :lines | |
| + has_many :calls | |
| + has_many :jobs | |
| end | |
| diff --git a/bin/import_audio.rb b/bin/import_audio.rb | |
| @@ -21,7 +21,7 @@ require 'config/boot' | |
| require 'config/environment' | |
| def usage | |
| - $stderr.puts "Usage: #{$0} [Input Dir] <Job ID>" | |
| + $stderr.puts "Usage: #{$0} [Input Directory] <Project ID> <Provider ID… | |
| exit(1) | |
| end | |
| @@ -29,59 +29,89 @@ end | |
| # Script | |
| # | |
| -dir = ARGV.shift | |
| -jid = ARGV.shift | |
| - | |
| +dir = ARGV.shift() || usage() | |
| if (dir and dir =="-h") or (! dir) | |
| usage() | |
| end | |
| + | |
| +project_id = ARGV.shift | |
| +provider_id = ARGV.shift | |
| + | |
| +todo = Dir["#{dir}/**/*.raw"].to_a | |
| + | |
| +if todo.empty? | |
| + $stderr.puts "Error: No raw audio files found within #{dir}" | |
| + exit(1) | |
| +end | |
| + | |
| +project = nil | |
| +provider = nil | |
| + | |
| +if project_id | |
| + project = Project.find(pid) | |
| + unless project | |
| + $stderr.puts "Error: Specified Project ID not found" | |
| + exit(1) | |
| + end | |
| +end | |
| + | |
| +if provider_id | |
| + provider = Provider.find(pid) | |
| + unless provider | |
| + $stderr.puts "Error: Specified Provider ID not found" | |
| + exit(1) | |
| + end | |
| +end | |
| + | |
| +unless project | |
| + project = Project.create( | |
| + :name => "Import from #{dir}", | |
| + :created_by => "importer" | |
| + ) | |
| +end | |
| + | |
| provider = Provider.first | |
| unless provider | |
| provider = Provider.create( | |
| - :name => 'Import Provider', | |
| - :host => 'localhost', | |
| - :port => 4369, | |
| - :user => "null", | |
| - :pass => "null", | |
| - :lines => 1, | |
| + :name => 'Import Provider', | |
| + :host => 'localhost', | |
| + :port => 4369, | |
| + :user => "null", | |
| + :pass => "null", | |
| + :lines => 1, | |
| :enabled => false | |
| ) | |
| end | |
| -job = nil | |
| -if jid | |
| - job = DialJob.find(jid.to_i) | |
| - unless job | |
| - $stderr.puts "Error: Specified Job ID not found" | |
| - exit(1) | |
| - end | |
| -else | |
| - job = DialJob.new | |
| - job.range = "IMPORTED" | |
| - job.seconds = 60 | |
| - job.lines = 1 | |
| - job.cid_mask = "XXXXX" | |
| - job.status = "completed" | |
| - job.progress = 100 | |
| - job.started_at = Time.now | |
| - job.completed_at = Time.now | |
| - job.processed = false | |
| - job.save | |
| -end | |
| -Dir["#{dir}/**/*.raw"].each do |rfile| | |
| +job = Job.new | |
| +job.project_id = project.id | |
| +job.name = "Import Audio Job" | |
| +job.locked_by = "importer" | |
| +job.locked_at = Time.now.utc | |
| +job.started_at = Time.now.utc | |
| +job.created_by = "importer" | |
| +job.task = "import" | |
| +job.args = Marshal.dump({ :directory => dir, :project_id => project.id… | |
| +job.status = "running" | |
| +job.save | |
| + | |
| +pct = 0 | |
| +cnt = 0 | |
| + | |
| +todo.each do |rfile| | |
| num, ext = File.basename(rfile).split(".", 2) | |
| - dr = DialResult.new | |
| - dr.dial_job_id = job[:id] | |
| - dr.number = num | |
| - dr.provider_id = provider[:id] | |
| - dr.completed = true | |
| - dr.busy = false | |
| - dr.seconds = File.size(rfile) / 16000.0 | |
| - dr.ringtime = 0 | |
| - dr.processed = false | |
| - dr.cid = num | |
| + dr = Call.new | |
| + dr.number = num | |
| + dr.job_id = job.id | |
| + dr.project_id = project.id | |
| + dr.provider_id = provider.id | |
| + dr.answered = true | |
| + dr.busy = false | |
| + dr.audio_length = File.size(rfile) / 16000.0 | |
| + dr.ring_length = 0 | |
| + dr.caller_id = num | |
| dr.save | |
| mr = dr.media | |
| @@ -90,5 +120,13 @@ Dir["#{dir}/**/*.raw"].each do |rfile| | |
| mr.save | |
| end | |
| - $stdout.puts "[*] Imported #{num}" | |
| + cnt += 1 | |
| + pct = (cnt / todo.length.to_f) * 100.0 | |
| + if cnt % 10 == 0 | |
| + job.update_progress(pct) | |
| + end | |
| + | |
| + $stdout.puts "[ %#{"%.3d" % pct.to_i} ] Imported #{num} into project '… | |
| end | |
| + | |
| +job.update_progress(100) | |
| diff --git a/db/migrate/20121228171549_initial_schema.rb b/db/migrate/201212281… | |
| @@ -4,7 +4,6 @@ class InitialSchema < ActiveRecord::Migration | |
| # Require the intarray extension | |
| execute("CREATE EXTENSION IF NOT EXISTS intarray") | |
| - | |
| create_table :settings do |t| | |
| t.string :var, :null => false | |
| t.text :value, :null => true | |
| @@ -40,49 +39,70 @@ class InitialSchema < ActiveRecord::Migration | |
| create_table 'projects' do |t| | |
| t.timestamps | |
| - t.text "name" | |
| + t.text "name", :null => false | |
| t.text "description" | |
| t.text "included" | |
| t.text "excluded" | |
| t.string "created_by" | |
| end | |
| - create_table "dial_jobs" do |t| | |
| + create_table "jobs" do |t| | |
| + t.timestamps | |
| + t.integer "project_id", :null => false | |
| + t.string "name", :null => false | |
| + t.string "locked_by" | |
| + t.timestamp "locked_at" | |
| + t.timestamp "started_at" | |
| + t.timestamp "completed_at" | |
| + t.string "created_by" | |
| + t.string "task", :null => false | |
| + t.binary "args" | |
| + t.string "status" | |
| + t.text "error" | |
| + t.integer "progress", :default => 0 | |
| + end | |
| + | |
| + create_table "lines" do |t| | |
| + t.timestamps | |
| + t.text "number", :null => false | |
| + t.integer "project_id", :null => false | |
| + t.text "type" | |
| + t.text "notes" | |
| + end | |
| + | |
| + create_table "line_attributes" do |t| | |
| t.timestamps | |
| - t.text "range" | |
| - t.integer "seconds" | |
| - t.integer "lines" | |
| - t.text "status" | |
| - t.integer "progress" | |
| - t.datetime "started_at" | |
| - t.datetime "completed_at" | |
| - t.boolean "processed" | |
| - t.text "cid_mask" | |
| + t.integer "line_id", :null => false | |
| + t.text "name", :null => false | |
| + t.binary "value", :null => false | |
| + t.string "content_type", :default => "t… | |
| end | |
| - create_table "dial_results" do |t| | |
| + create_table "calls" do |t| | |
| + # Created by the dialer job | |
| t.timestamps | |
| - t.text "number" | |
| - t.integer "dial_job_id" | |
| - t.integer "provider_id" | |
| - t.boolean "completed" | |
| + t.text "number", :null => false | |
| + t.integer "project_id", :null => false | |
| + t.integer "job_id", :null => false | |
| + t.integer "provider_id", :null => false | |
| + t.boolean "answered" | |
| t.boolean "busy" | |
| - t.integer "seconds" | |
| - t.integer "ringtime" | |
| - t.boolean "processed" | |
| - t.datetime "processed_at" | |
| - t.text "cid" | |
| + t.integer "audio_length" | |
| + t.integer "ring_length" | |
| + t.text "caller_id" | |
| + | |
| + # Generated by the analysis job | |
| + t.integer "analysis_job_id" | |
| + t.boolean "analysis_started_at" | |
| + t.boolean "analysis_completed_at" | |
| t.float "peak_freq" | |
| t.text "peak_freq_data" | |
| - t.text "sig_data" | |
| t.text "line_type" | |
| - t.text "notes" | |
| - t.text "signatures" | |
| t.integer "fprint", :array => true | |
| end | |
| - create_table "dial_result_media" do |t| | |
| - t.integer "dial_result_id" | |
| + create_table "call_media" do |t| | |
| + t.integer "call_id", :null => false | |
| t.binary "audio" | |
| t.binary "mp3" | |
| t.binary "png_big" | |
| @@ -92,24 +112,43 @@ class InitialSchema < ActiveRecord::Migration | |
| t.binary "png_sig_freq" | |
| end | |
| + create_table "signatures" do |t| | |
| + t.timestamps | |
| + t.text "name", :null => false | |
| + t.string "source" | |
| + t.text "description" | |
| + t.string "category" | |
| + t.string "line_type" | |
| + t.integer "risk" | |
| + end | |
| + | |
| + create_table "signature_fp" do |t| | |
| + t.integer "signature_id", :null => false | |
| + t.integer "fprint", :array => true | |
| + end | |
| + | |
| create_table "providers" do |t| | |
| t.timestamps | |
| - t.text "name" | |
| - t.text "host" | |
| - t.integer "port" | |
| + t.text "name", :null => false | |
| + t.text "host", :null => false | |
| + t.integer "port", :null => false | |
| t.text "user" | |
| t.text "pass" | |
| - t.integer "lines" | |
| - t.boolean "enabled" | |
| + t.integer "lines", :null => false, :def… | |
| + t.boolean "enabled", :default => true | |
| end | |
| end | |
| def down | |
| drop_table "providers" | |
| - drop_table "dial_result_media" | |
| - drop_table "dial_results" | |
| - drop_table "dial_jobs" | |
| + drop_table "signature_fp" | |
| + drop_table "signatures" | |
| + drop_table "call_media" | |
| + drop_table "calls" | |
| + drop_table "line_attributes" | |
| + drop_table "lines" | |
| + drop_table "jobs" | |
| drop_table "projects" | |
| drop_table "users" | |
| drop_table "settings" | |
| diff --git a/db/schema.rb b/db/schema.rb | |
| @@ -15,22 +15,8 @@ ActiveRecord::Schema.define(:version => 20121228171549) do | |
| add_extension "intarray" | |
| - create_table "dial_jobs", :force => true do |t| | |
| - t.datetime "created_at", :null => false | |
| - t.datetime "updated_at", :null => false | |
| - t.text "range" | |
| - t.integer "seconds" | |
| - t.integer "lines" | |
| - t.text "status" | |
| - t.integer "progress" | |
| - t.datetime "started_at" | |
| - t.datetime "completed_at" | |
| - t.boolean "processed" | |
| - t.text "cid_mask" | |
| - end | |
| - | |
| - create_table "dial_result_media", :force => true do |t| | |
| - t.integer "dial_result_id" | |
| + create_table "call_media", :force => true do |t| | |
| + t.integer "call_id", :null => false | |
| t.binary "audio" | |
| t.binary "mp3" | |
| t.binary "png_big" | |
| @@ -40,26 +26,60 @@ ActiveRecord::Schema.define(:version => 20121228171549) do | |
| t.binary "png_sig_freq" | |
| end | |
| - create_table "dial_results", :force => true do |t| | |
| - t.datetime "created_at", :null => false | |
| - t.datetime "updated_at", :null => false | |
| - t.text "number" | |
| - t.integer "dial_job_id" | |
| - t.integer "provider_id" | |
| - t.boolean "completed" | |
| + create_table "calls", :force => true do |t| | |
| + t.datetime "created_at", :null => false | |
| + t.datetime "updated_at", :null => false | |
| + t.text "number", :null => false | |
| + t.integer "project_id", :null => false | |
| + t.integer "job_id", :null => false | |
| + t.integer "provider_id", :null => false | |
| + t.boolean "answered" | |
| t.boolean "busy" | |
| - t.integer "seconds" | |
| - t.integer "ringtime" | |
| - t.boolean "processed" | |
| - t.datetime "processed_at" | |
| - t.text "cid" | |
| + t.integer "audio_length" | |
| + t.integer "ring_length" | |
| + t.text "caller_id" | |
| + t.integer "analysis_job_id" | |
| + t.boolean "analysis_started_at" | |
| + t.boolean "analysis_completed_at" | |
| t.float "peak_freq" | |
| t.text "peak_freq_data" | |
| - t.text "sig_data" | |
| t.text "line_type" | |
| + t.integer "fprint", :array => true | |
| + end | |
| + | |
| + create_table "jobs", :force => true do |t| | |
| + t.datetime "created_at", :null => false | |
| + t.datetime "updated_at", :null => false | |
| + t.integer "project_id", :null => false | |
| + t.string "name", :null => false | |
| + t.string "locked_by" | |
| + t.datetime "locked_at" | |
| + t.datetime "started_at" | |
| + t.datetime "completed_at" | |
| + t.string "created_by" | |
| + t.string "task", :null => false | |
| + t.binary "args" | |
| + t.string "status" | |
| + t.text "error" | |
| + t.integer "progress", :default => 0 | |
| + end | |
| + | |
| + create_table "line_attributes", :force => true do |t| | |
| + t.datetime "created_at", :null => false | |
| + t.datetime "updated_at", :null => false | |
| + t.integer "line_id", :null => false | |
| + t.text "name", :null => false | |
| + t.binary "value", :null => false | |
| + t.string "content_type", :default => "text" | |
| + end | |
| + | |
| + create_table "lines", :force => true do |t| | |
| + t.datetime "created_at", :null => false | |
| + t.datetime "updated_at", :null => false | |
| + t.text "number", :null => false | |
| + t.integer "project_id", :null => false | |
| + t.text "type" | |
| t.text "notes" | |
| - t.text "signatures" | |
| - t.integer "fprint", :array => true | |
| end | |
| create_table "projects", :force => true do |t| | |
| @@ -73,15 +93,15 @@ ActiveRecord::Schema.define(:version => 20121228171549) do | |
| end | |
| create_table "providers", :force => true do |t| | |
| - t.datetime "created_at", :null => false | |
| - t.datetime "updated_at", :null => false | |
| - t.text "name" | |
| - t.text "host" | |
| - t.integer "port" | |
| + t.datetime "created_at", :null => false | |
| + t.datetime "updated_at", :null => false | |
| + t.text "name", :null => false | |
| + t.text "host", :null => false | |
| + t.integer "port", :null => false | |
| t.text "user" | |
| t.text "pass" | |
| - t.integer "lines" | |
| - t.boolean "enabled" | |
| + t.integer "lines", :default => 1, :null => false | |
| + t.boolean "enabled", :default => true | |
| end | |
| create_table "settings", :force => true do |t| | |
| @@ -95,6 +115,22 @@ ActiveRecord::Schema.define(:version => 20121228171549) do | |
| add_index "settings", ["thing_type", "thing_id", "var"], :name => "index_set… | |
| + create_table "signature_fp", :force => true do |t| | |
| + t.integer "signature_id", :null => false | |
| + t.integer "fprint", :array => true | |
| + end | |
| + | |
| + create_table "signatures", :force => true do |t| | |
| + t.datetime "created_at", :null => false | |
| + t.datetime "updated_at", :null => false | |
| + t.text "name", :null => false | |
| + t.string "source" | |
| + t.text "description" | |
| + t.string "category" | |
| + t.string "line_type" | |
| + t.integer "risk" | |
| + end | |
| + | |
| create_table "users", :force => true do |t| | |
| t.string "login", :null => false | |
| t.string "email" |