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 +20 -19
- data/bin/csv_merge +1 -1
- data/bin/show_geoptima +10 -8
- data/examples/csv_chart.rb +20 -19
- data/examples/csv_merge.rb +1 -1
- data/examples/show_geoptima.rb +10 -8
- data/lib/geoptima/data.rb +30 -14
- data/lib/geoptima/options.rb +2 -0
- data/lib/geoptima/version.rb +1 -1
- metadata +4 -4
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.
|
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 <-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
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(
|
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|
|
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(
|
237
|
+
def vals_for(all_values,filter={})
|
237
238
|
if @indices
|
238
|
-
prepare_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(
|
250
|
-
if vals = vals_for(
|
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
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.
|
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[
|
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}
|
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/examples/csv_chart.rb
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.
|
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 <-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
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(
|
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|
|
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(
|
237
|
+
def vals_for(all_values,filter={})
|
237
238
|
if @indices
|
238
|
-
prepare_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(
|
250
|
-
if vals = vals_for(
|
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/examples/csv_merge.rb
CHANGED
data/examples/show_geoptima.rb
CHANGED
@@ -8,7 +8,7 @@ require 'date'
|
|
8
8
|
require 'geoptima'
|
9
9
|
require 'geoptima/options'
|
10
10
|
|
11
|
-
Geoptima::assert_version("0.1.
|
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[
|
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}
|
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 :
|
242
|
+
attr_reader :name, :options
|
243
243
|
|
244
|
-
def initialize(
|
245
|
-
@
|
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 ||=
|
267
|
-
|
268
|
-
|
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
|
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
|
319
|
+
@fields[key.downcase] ||= @data.map{|d| d[key]}.compact.uniq
|
308
320
|
end
|
309
321
|
|
310
|
-
def
|
322
|
+
def platforms
|
311
323
|
self['Platform']
|
312
324
|
end
|
313
325
|
|
314
|
-
def
|
326
|
+
def models
|
315
327
|
self['Model']
|
316
328
|
end
|
317
329
|
|
318
|
-
def
|
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 |
|
349
|
-
[(s=sorted(
|
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
|
-
|
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={})
|
data/lib/geoptima/options.rb
CHANGED
@@ -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
|
|
data/lib/geoptima/version.rb
CHANGED
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:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
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-
|
18
|
+
date: 2012-04-23 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|