geoptima 0.1.4 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/bin/csv_chart CHANGED
@@ -10,7 +10,7 @@ require 'geoptima/options'
10
10
  require 'fileutils'
11
11
  require 'geoptima/daterange'
12
12
 
13
- Geoptima::assert_version("0.1.4")
13
+ Geoptima::assert_version("0.1.6")
14
14
  Geoptima::Chart.available? || puts("No charting libraries available") || exit(-1)
15
15
 
16
16
  $export_dir = '.'
@@ -37,18 +37,19 @@ $merge_all = true if($time_split)
37
37
  $help = true unless($files.length>0)
38
38
  if $help
39
39
  puts <<EOHELP
40
- Usage: csv_chart <-dhamt> <-S specfile> <-N name> <-D dir> <-T range> <-P diversity> files...
41
- -d debug mode #{cw $debug}
42
- -h print this help #{cw $help}
43
- -a automatically create charts for all properties #{cw $create_all}
44
- -m merge all files into single stats #{cw $merge_all}
45
- -t merge and split by time (days) #{cw $time_split}
46
- -N use specified name for merged dataset: #{$merged_name}
47
- -D export charts to specified directory: #{$export_dir}
48
- -S use chart specification in specified file: #{$specfile}
49
- -P diversity threshold in percentage for automatic reports: #{$diversity}
50
- -T set time-range filter: #{$time_range}
51
- -W set default chart-width: #{$chart_width}
40
+ Usage: csv_chart <-dhamtf> <-S specfile> <-N name> <-D dir> <-T range> <-P diversity> files...
41
+ -d debug mode #{cw $debug}
42
+ -h print this help #{cw $help}
43
+ -a automatically create charts for all properties #{cw $create_all}
44
+ -m merge all files into single stats #{cw $merge_all}
45
+ -t merge and split by time (days) #{cw $time_split}
46
+ -f flush stdout #{cw $flush_stdout}
47
+ -N use specified name for merged dataset: #{$merged_name}
48
+ -D export charts to specified directory: #{$export_dir}
49
+ -S use chart specification in specified file: #{$specfile}
50
+ -P diversity threshold in percentage for automatic reports: #{$diversity}
51
+ -T set time-range filter: #{$time_range}
52
+ -W set default chart-width: #{$chart_width}
52
53
  Files to import: #{$files.join(', ')}
53
54
  EOHELP
54
55
  exit
@@ -224,18 +225,18 @@ module Geoptima
224
225
  val
225
226
  end
226
227
  end
227
- def prepare_values(values)
228
+ def prepare_values(all_values)
228
229
  @values = []
229
230
  if @indices
230
231
  puts "StatSpec[#{self}]: #{options.inspect}" if($debug)
231
- @values = @indices.map{|i| values[i]}
232
+ @values = @indices.map{|i| all_values[i]}
232
233
  puts "\tVALUES: #{values.inspect}" if($debug)
233
234
  end
234
235
  @values
235
236
  end
236
- def vals_for(values,filter={})
237
+ def vals_for(all_values,filter={})
237
238
  if @indices
238
- prepare_values(values)
239
+ prepare_values(all_values)
239
240
  (options[:filter] || filter).each do |field,expected|
240
241
  puts "\t\tChecking if field #{field} is #{expected}" if($debug)
241
242
  puts "\t\tLooking for #{field} or #{event}.#{field} in #{@fields.inspect}" if($debug)
@@ -246,8 +247,8 @@ module Geoptima
246
247
  values
247
248
  end
248
249
  end
249
- def map_fields(values,filter={})
250
- if vals = vals_for(values,filter)
250
+ def map_fields(all_values,filter={})
251
+ if vals = vals_for(all_values,filter)
251
252
  val = proc.nil? ? vals[0] : proc.call(*vals)
252
253
  puts "\tBLOCK MAP: #{vals.inspect} --> #{val.inspect}" if($debug)
253
254
  if options[:div]
data/bin/csv_merge CHANGED
@@ -9,7 +9,7 @@ require 'geoptima/options'
9
9
  require 'fileutils'
10
10
  require 'geoptima/daterange'
11
11
 
12
- Geoptima::assert_version("0.1.4")
12
+ Geoptima::assert_version("0.1.6")
13
13
 
14
14
  $export_dir = '.'
15
15
  $export_name = 'merged.csv'
data/bin/show_geoptima CHANGED
@@ -8,7 +8,7 @@ require 'date'
8
8
  require 'geoptima'
9
9
  require 'geoptima/options'
10
10
 
11
- Geoptima::assert_version("0.1.4")
11
+ Geoptima::assert_version("0.1.6")
12
12
 
13
13
  $debug=false
14
14
 
@@ -117,6 +117,7 @@ Usage: show_geoptima <-dpvxomlsah> <-L limit> <-E types> <-T min,max> <-M mapfil
117
117
  -l longer header list (phone and operator fields) #{cw $more_headers}
118
118
  -s seperate the export files by event type #{cw $seperate}
119
119
  -a combine all IMEI's into a single dataset #{cw $combine_all}
120
+ -f flush stdout #{cw $flush_stdout}
120
121
  -h show this help
121
122
  -P prefix for exported files (default: ''; current: #{$export_prefix})
122
123
  -E comma-seperated list of event types to show and export (default: all; current: #{$event_names.join(',')})
@@ -202,15 +203,15 @@ class Export
202
203
  when 'LAC-CI'
203
204
  "#{dataset.recent(event,'service.lac')}-#{dataset.recent(event,'service.cell_id')}"
204
205
  when 'MCC'
205
- event.file[h] || dataset.recent(event,'service.mcc')
206
+ event.file[h] || dataset.recent(event,'service.mcc',3600)
206
207
  when 'MNC'
207
- event.file[h] || dataset.recent(event,'service.mnc')
208
+ event.file[h] || dataset.recent(event,'service.mnc',3600)
208
209
  when 'Battery'
209
210
  dataset.recent(event,'batteryState.state',600)
210
211
  when 'Operator'
211
- event.file['carrierName']
212
- when 'IMSI'
213
- event.file['imsi']
212
+ event.file['carrierName'] || dataset.recent(event,'carrierName',3600)
213
+ when 'IMSI', 'OS', 'Platform', 'IMSI', 'MSISDN', 'Model'
214
+ event.file[h] || dataset.recent(event,h,3600)
214
215
  else
215
216
  event.file[h]
216
217
  end
@@ -283,13 +284,14 @@ def if_le
283
284
  $count += 1
284
285
  end
285
286
 
286
- puts "Found #{$datasets.length} IMEIs"
287
+ puts "Found #{$datasets.length} datasets: #{$datasets.values.join('; ')}"
288
+
287
289
  $datasets.keys.sort.each do |imei|
288
290
  dataset = $datasets[imei]
289
291
  imsi = dataset.imsi
290
292
  events = dataset.sorted
291
293
  puts if($print)
292
- puts "Found #{dataset}"
294
+ puts "Found #{dataset.description}"
293
295
  if $verbose
294
296
  puts "\tFirst Event: #{dataset.first}"
295
297
  puts "\tLast Event: #{dataset.last}"
@@ -10,7 +10,7 @@ require 'geoptima/options'
10
10
  require 'fileutils'
11
11
  require 'geoptima/daterange'
12
12
 
13
- Geoptima::assert_version("0.1.4")
13
+ Geoptima::assert_version("0.1.6")
14
14
  Geoptima::Chart.available? || puts("No charting libraries available") || exit(-1)
15
15
 
16
16
  $export_dir = '.'
@@ -37,18 +37,19 @@ $merge_all = true if($time_split)
37
37
  $help = true unless($files.length>0)
38
38
  if $help
39
39
  puts <<EOHELP
40
- Usage: csv_chart <-dhamt> <-S specfile> <-N name> <-D dir> <-T range> <-P diversity> files...
41
- -d debug mode #{cw $debug}
42
- -h print this help #{cw $help}
43
- -a automatically create charts for all properties #{cw $create_all}
44
- -m merge all files into single stats #{cw $merge_all}
45
- -t merge and split by time (days) #{cw $time_split}
46
- -N use specified name for merged dataset: #{$merged_name}
47
- -D export charts to specified directory: #{$export_dir}
48
- -S use chart specification in specified file: #{$specfile}
49
- -P diversity threshold in percentage for automatic reports: #{$diversity}
50
- -T set time-range filter: #{$time_range}
51
- -W set default chart-width: #{$chart_width}
40
+ Usage: csv_chart <-dhamtf> <-S specfile> <-N name> <-D dir> <-T range> <-P diversity> files...
41
+ -d debug mode #{cw $debug}
42
+ -h print this help #{cw $help}
43
+ -a automatically create charts for all properties #{cw $create_all}
44
+ -m merge all files into single stats #{cw $merge_all}
45
+ -t merge and split by time (days) #{cw $time_split}
46
+ -f flush stdout #{cw $flush_stdout}
47
+ -N use specified name for merged dataset: #{$merged_name}
48
+ -D export charts to specified directory: #{$export_dir}
49
+ -S use chart specification in specified file: #{$specfile}
50
+ -P diversity threshold in percentage for automatic reports: #{$diversity}
51
+ -T set time-range filter: #{$time_range}
52
+ -W set default chart-width: #{$chart_width}
52
53
  Files to import: #{$files.join(', ')}
53
54
  EOHELP
54
55
  exit
@@ -224,18 +225,18 @@ module Geoptima
224
225
  val
225
226
  end
226
227
  end
227
- def prepare_values(values)
228
+ def prepare_values(all_values)
228
229
  @values = []
229
230
  if @indices
230
231
  puts "StatSpec[#{self}]: #{options.inspect}" if($debug)
231
- @values = @indices.map{|i| values[i]}
232
+ @values = @indices.map{|i| all_values[i]}
232
233
  puts "\tVALUES: #{values.inspect}" if($debug)
233
234
  end
234
235
  @values
235
236
  end
236
- def vals_for(values,filter={})
237
+ def vals_for(all_values,filter={})
237
238
  if @indices
238
- prepare_values(values)
239
+ prepare_values(all_values)
239
240
  (options[:filter] || filter).each do |field,expected|
240
241
  puts "\t\tChecking if field #{field} is #{expected}" if($debug)
241
242
  puts "\t\tLooking for #{field} or #{event}.#{field} in #{@fields.inspect}" if($debug)
@@ -246,8 +247,8 @@ module Geoptima
246
247
  values
247
248
  end
248
249
  end
249
- def map_fields(values,filter={})
250
- if vals = vals_for(values,filter)
250
+ def map_fields(all_values,filter={})
251
+ if vals = vals_for(all_values,filter)
251
252
  val = proc.nil? ? vals[0] : proc.call(*vals)
252
253
  puts "\tBLOCK MAP: #{vals.inspect} --> #{val.inspect}" if($debug)
253
254
  if options[:div]
@@ -9,7 +9,7 @@ require 'geoptima/options'
9
9
  require 'fileutils'
10
10
  require 'geoptima/daterange'
11
11
 
12
- Geoptima::assert_version("0.1.4")
12
+ Geoptima::assert_version("0.1.6")
13
13
 
14
14
  $export_dir = '.'
15
15
  $export_name = 'merged.csv'
@@ -8,7 +8,7 @@ require 'date'
8
8
  require 'geoptima'
9
9
  require 'geoptima/options'
10
10
 
11
- Geoptima::assert_version("0.1.4")
11
+ Geoptima::assert_version("0.1.6")
12
12
 
13
13
  $debug=false
14
14
 
@@ -117,6 +117,7 @@ Usage: show_geoptima <-dpvxomlsah> <-L limit> <-E types> <-T min,max> <-M mapfil
117
117
  -l longer header list (phone and operator fields) #{cw $more_headers}
118
118
  -s seperate the export files by event type #{cw $seperate}
119
119
  -a combine all IMEI's into a single dataset #{cw $combine_all}
120
+ -f flush stdout #{cw $flush_stdout}
120
121
  -h show this help
121
122
  -P prefix for exported files (default: ''; current: #{$export_prefix})
122
123
  -E comma-seperated list of event types to show and export (default: all; current: #{$event_names.join(',')})
@@ -202,15 +203,15 @@ class Export
202
203
  when 'LAC-CI'
203
204
  "#{dataset.recent(event,'service.lac')}-#{dataset.recent(event,'service.cell_id')}"
204
205
  when 'MCC'
205
- event.file[h] || dataset.recent(event,'service.mcc')
206
+ event.file[h] || dataset.recent(event,'service.mcc',3600)
206
207
  when 'MNC'
207
- event.file[h] || dataset.recent(event,'service.mnc')
208
+ event.file[h] || dataset.recent(event,'service.mnc',3600)
208
209
  when 'Battery'
209
210
  dataset.recent(event,'batteryState.state',600)
210
211
  when 'Operator'
211
- event.file['carrierName']
212
- when 'IMSI'
213
- event.file['imsi']
212
+ event.file['carrierName'] || dataset.recent(event,'carrierName',3600)
213
+ when 'IMSI', 'OS', 'Platform', 'IMSI', 'MSISDN', 'Model'
214
+ event.file[h] || dataset.recent(event,h,3600)
214
215
  else
215
216
  event.file[h]
216
217
  end
@@ -283,13 +284,14 @@ def if_le
283
284
  $count += 1
284
285
  end
285
286
 
286
- puts "Found #{$datasets.length} IMEIs"
287
+ puts "Found #{$datasets.length} datasets: #{$datasets.values.join('; ')}"
288
+
287
289
  $datasets.keys.sort.each do |imei|
288
290
  dataset = $datasets[imei]
289
291
  imsi = dataset.imsi
290
292
  events = dataset.sorted
291
293
  puts if($print)
292
- puts "Found #{dataset}"
294
+ puts "Found #{dataset.description}"
293
295
  if $verbose
294
296
  puts "\tFirst Event: #{dataset.first}"
295
297
  puts "\tLast Event: #{dataset.last}"
data/lib/geoptima/data.rb CHANGED
@@ -239,10 +239,10 @@ module Geoptima
239
239
 
240
240
  class Dataset
241
241
 
242
- attr_reader :imei, :options
242
+ attr_reader :name, :options
243
243
 
244
- def initialize(imei,options={})
245
- @imei = imei
244
+ def initialize(name,options={})
245
+ @name = name
246
246
  @data = []
247
247
  @options = options
248
248
  @time_range = options[:time_range] || DateRange.new(Config[:min_datetime],Config[:max_datetime])
@@ -263,14 +263,26 @@ module Geoptima
263
263
  end
264
264
 
265
265
  def imsis
266
- @imsis ||= @data.inject({}) do |a,d|
267
- a[d['imsi']] ||= 0
268
- a[d['imsi']] += d.count.to_i
266
+ @imsis ||= make_all_from_metadata('imsi')
267
+ end
268
+
269
+ def imei
270
+ imeis[0]
271
+ end
272
+
273
+ def imeis
274
+ @imeis ||= make_all_from_metadata('imei')
275
+ end
276
+
277
+ def make_all_from_metadata(field_name)
278
+ @data.inject({}) do |a,d|
279
+ a[d[field_name]] ||= 0
280
+ a[d[field_name]] += d.count.to_i
269
281
  a
270
282
  end.to_a.sort do |a,b|
271
283
  b[1]<=>a[1]
272
284
  end.map do |x|
273
- #puts "Have IMSI: #{x.join('=')}"
285
+ #puts "Have #{field_name}: #{x.join('=')}"
274
286
  x[0]
275
287
  end.compact.uniq
276
288
  end
@@ -304,18 +316,18 @@ module Geoptima
304
316
  end
305
317
 
306
318
  def [](key)
307
- @fields[key.downcase] ||= @data.map{|d| d[key]}.compact.uniq[0]
319
+ @fields[key.downcase] ||= @data.map{|d| d[key]}.compact.uniq
308
320
  end
309
321
 
310
- def platform
322
+ def platforms
311
323
  self['Platform']
312
324
  end
313
325
 
314
- def model
326
+ def models
315
327
  self['Model']
316
328
  end
317
329
 
318
- def os
330
+ def oses
319
331
  self['OS']
320
332
  end
321
333
 
@@ -345,8 +357,8 @@ module Geoptima
345
357
 
346
358
  def header(names=nil)
347
359
  merge_events unless @sorted
348
- (names || events_names).map do |name|
349
- [(s=sorted(name)[0]) && s.header]
360
+ (names || events_names).map do |event_type|
361
+ [(s=sorted(event_type)[0]) && s.header]
350
362
  end.flatten
351
363
  end
352
364
 
@@ -420,7 +432,11 @@ module Geoptima
420
432
  end
421
433
 
422
434
  def to_s
423
- "IMEI:#{imei}, IMSI:#{imsis.join(',')}, Platform:#{platform}, Model:#{model}, OS:#{os}, Files:#{file_count}, Events:#{sorted && sorted.length}"
435
+ (imei.to_s.length < 1 || name == imei) ? name : imeis.join(',')
436
+ end
437
+
438
+ def description
439
+ "Dataset:#{name}, IMEI:#{imeis.join(',')}, IMSI:#{imsis.join(',')}, Platform:#{platforms.join(',')}, Model:#{models.join(',')}, OS:#{oses.join(',')}, Files:#{file_count}, Events:#{sorted && sorted.length}"
424
440
  end
425
441
 
426
442
  def self.make_datasets(files, options={})
@@ -45,6 +45,7 @@ module Geoptima
45
45
 
46
46
  def self.process_args(debug=nil)
47
47
  options = Options.new(debug)
48
+ options.add('f') {$flush_stdout = true}
48
49
  options.add('v') {$print_version = true}
49
50
  options.add('d') {$debug = true}
50
51
  options.add('h') {$help = true}
@@ -60,6 +61,7 @@ module Geoptima
60
61
  end
61
62
  end
62
63
  puts "Geoptima Gem Version: #{Geoptima::VERSION}" if($print_version)
64
+ STDOUT.sync if($flush_stdout)
63
65
  options.args
64
66
  end
65
67
 
@@ -1,6 +1,6 @@
1
1
  module Geoptima
2
2
 
3
- VERSION = "0.1.4"
3
+ VERSION = "0.1.6"
4
4
 
5
5
  def self.version_as_int(ver)
6
6
  base = 1
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geoptima
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 4
10
- version: 0.1.4
9
+ - 6
10
+ version: 0.1.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Craig Taverner
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-04-17 00:00:00 +02:00
18
+ date: 2012-04-23 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency