geoptima 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/show_geoptima +22 -9
- data/examples/show_geoptima.rb +22 -9
- data/geoptima.gemspec +2 -1
- data/lib/geoptima/data.rb +13 -7
- data/lib/geoptima/version.rb +1 -1
- metadata +22 -6
data/bin/show_geoptima
CHANGED
@@ -7,7 +7,7 @@ $: << '../lib'
|
|
7
7
|
require 'date'
|
8
8
|
require 'geoptima'
|
9
9
|
|
10
|
-
Geoptima::assert_version("0.0.
|
10
|
+
Geoptima::assert_version("0.0.6")
|
11
11
|
|
12
12
|
$debug=false
|
13
13
|
|
@@ -39,8 +39,12 @@ while arg=ARGV.shift do
|
|
39
39
|
$export_stats=true
|
40
40
|
when 'm'
|
41
41
|
$map_headers=true
|
42
|
+
when 'a'
|
43
|
+
$combine_all=true
|
42
44
|
when 'l'
|
43
45
|
$more_headers=true
|
46
|
+
when 'C'
|
47
|
+
$chart_spec = ARGV.shift
|
44
48
|
when 'E'
|
45
49
|
$event_names += ARGV.shift.split(/[\,\;\:\.]+/)
|
46
50
|
when 'T'
|
@@ -75,16 +79,18 @@ Usage: ./showGeoptimaEvents.rb <-dvxEh> <-L limit> <-E types> <-T min,max> file
|
|
75
79
|
-m map headers to classic NetView compatible version #{cw $map_headers}
|
76
80
|
-l longer header list (phone and operator fields) #{cw $more_headers}
|
77
81
|
-s seperate the export files by event type #{cw $seperate}
|
82
|
+
-a combine all IMEI's into a single dataset #{cw $combine_all}
|
78
83
|
-h show this help
|
79
|
-
-
|
84
|
+
-C use specified chart specification file for stats and charts: #{$chart_spec}
|
80
85
|
-E comma-seperated list of event types to show and export (default: all; current: #{$event_names.join(',')})
|
81
86
|
-T time range to limit results to (default: all; current: #{$time_range})
|
87
|
+
-L limit verbose output to specific number of lines #{cw $print_limit}
|
82
88
|
EOHELP
|
83
89
|
exit 0
|
84
90
|
end
|
85
91
|
|
86
92
|
$verbose = $verbose || $debug
|
87
|
-
$datasets = Geoptima::Dataset.make_datasets($files, :locate => true, :time_range => $time_range)
|
93
|
+
$datasets = Geoptima::Dataset.make_datasets($files, :locate => true, :time_range => $time_range, :combine_all => $combine_all)
|
88
94
|
|
89
95
|
class Export
|
90
96
|
attr_reader :files, :imei, :names, :headers
|
@@ -108,7 +114,7 @@ class Export
|
|
108
114
|
puts "Created header for name #{name}: #{a[name].join(',')}" if($debug)
|
109
115
|
a
|
110
116
|
end
|
111
|
-
@headers[nil] = @headers.values.flatten
|
117
|
+
@headers[nil] = @headers.values.flatten.sort
|
112
118
|
files && files.each do |key,file|
|
113
119
|
file.puts map_headers(base_headers+more_headers+header(key)).join("\t")
|
114
120
|
end
|
@@ -118,14 +124,21 @@ class Export
|
|
118
124
|
end
|
119
125
|
end
|
120
126
|
end
|
127
|
+
def export_imei
|
128
|
+
($combine_all || $more_headers)
|
129
|
+
end
|
121
130
|
def base_headers
|
122
|
-
['Time','Event','Latitude','Longitude']
|
131
|
+
['Time','Event','Latitude','Longitude'] +
|
132
|
+
(export_imei ? ['IMEI'] : [])
|
123
133
|
end
|
124
134
|
def more_headers
|
125
|
-
$more_headers ?
|
135
|
+
$more_headers ?
|
136
|
+
['IMSI','MSISDN','MCC','MNC','LAC','CI','LAC-CI','RSSI','Platform','Model','OS','Operator'] :
|
137
|
+
[]
|
126
138
|
end
|
127
139
|
def base_fields(event)
|
128
|
-
[event.time_key,event.name,event.latitude,event.longitude]
|
140
|
+
[event.time_key,event.name,event.latitude,event.longitude] +
|
141
|
+
(export_imei ? [event.file.imei] : [])
|
129
142
|
end
|
130
143
|
def more_fields(event,dataset)
|
131
144
|
more_headers.map do |h|
|
@@ -136,6 +149,8 @@ class Export
|
|
136
149
|
dataset.recent(event,'service.lac')
|
137
150
|
when 'CI'
|
138
151
|
dataset.recent(event,'service.cell_id')
|
152
|
+
when 'LAC-CI'
|
153
|
+
"#{dataset.recent(event,'service.lac')}-#{dataset.recent(event,'service.cell_id')}"
|
139
154
|
when 'MCC'
|
140
155
|
dataset[h] || dataset.recent(event,'service.mcc')
|
141
156
|
when 'MNC'
|
@@ -144,8 +159,6 @@ class Export
|
|
144
159
|
dataset['carrierName']
|
145
160
|
when 'IMSI'
|
146
161
|
dataset.imsi
|
147
|
-
when 'IMEI'
|
148
|
-
dataset.imei
|
149
162
|
else
|
150
163
|
dataset[h]
|
151
164
|
end
|
data/examples/show_geoptima.rb
CHANGED
@@ -7,7 +7,7 @@ $: << '../lib'
|
|
7
7
|
require 'date'
|
8
8
|
require 'geoptima'
|
9
9
|
|
10
|
-
Geoptima::assert_version("0.0.
|
10
|
+
Geoptima::assert_version("0.0.6")
|
11
11
|
|
12
12
|
$debug=false
|
13
13
|
|
@@ -39,8 +39,12 @@ while arg=ARGV.shift do
|
|
39
39
|
$export_stats=true
|
40
40
|
when 'm'
|
41
41
|
$map_headers=true
|
42
|
+
when 'a'
|
43
|
+
$combine_all=true
|
42
44
|
when 'l'
|
43
45
|
$more_headers=true
|
46
|
+
when 'C'
|
47
|
+
$chart_spec = ARGV.shift
|
44
48
|
when 'E'
|
45
49
|
$event_names += ARGV.shift.split(/[\,\;\:\.]+/)
|
46
50
|
when 'T'
|
@@ -75,16 +79,18 @@ Usage: ./showGeoptimaEvents.rb <-dvxEh> <-L limit> <-E types> <-T min,max> file
|
|
75
79
|
-m map headers to classic NetView compatible version #{cw $map_headers}
|
76
80
|
-l longer header list (phone and operator fields) #{cw $more_headers}
|
77
81
|
-s seperate the export files by event type #{cw $seperate}
|
82
|
+
-a combine all IMEI's into a single dataset #{cw $combine_all}
|
78
83
|
-h show this help
|
79
|
-
-
|
84
|
+
-C use specified chart specification file for stats and charts: #{$chart_spec}
|
80
85
|
-E comma-seperated list of event types to show and export (default: all; current: #{$event_names.join(',')})
|
81
86
|
-T time range to limit results to (default: all; current: #{$time_range})
|
87
|
+
-L limit verbose output to specific number of lines #{cw $print_limit}
|
82
88
|
EOHELP
|
83
89
|
exit 0
|
84
90
|
end
|
85
91
|
|
86
92
|
$verbose = $verbose || $debug
|
87
|
-
$datasets = Geoptima::Dataset.make_datasets($files, :locate => true, :time_range => $time_range)
|
93
|
+
$datasets = Geoptima::Dataset.make_datasets($files, :locate => true, :time_range => $time_range, :combine_all => $combine_all)
|
88
94
|
|
89
95
|
class Export
|
90
96
|
attr_reader :files, :imei, :names, :headers
|
@@ -108,7 +114,7 @@ class Export
|
|
108
114
|
puts "Created header for name #{name}: #{a[name].join(',')}" if($debug)
|
109
115
|
a
|
110
116
|
end
|
111
|
-
@headers[nil] = @headers.values.flatten
|
117
|
+
@headers[nil] = @headers.values.flatten.sort
|
112
118
|
files && files.each do |key,file|
|
113
119
|
file.puts map_headers(base_headers+more_headers+header(key)).join("\t")
|
114
120
|
end
|
@@ -118,14 +124,21 @@ class Export
|
|
118
124
|
end
|
119
125
|
end
|
120
126
|
end
|
127
|
+
def export_imei
|
128
|
+
($combine_all || $more_headers)
|
129
|
+
end
|
121
130
|
def base_headers
|
122
|
-
['Time','Event','Latitude','Longitude']
|
131
|
+
['Time','Event','Latitude','Longitude'] +
|
132
|
+
(export_imei ? ['IMEI'] : [])
|
123
133
|
end
|
124
134
|
def more_headers
|
125
|
-
$more_headers ?
|
135
|
+
$more_headers ?
|
136
|
+
['IMSI','MSISDN','MCC','MNC','LAC','CI','LAC-CI','RSSI','Platform','Model','OS','Operator'] :
|
137
|
+
[]
|
126
138
|
end
|
127
139
|
def base_fields(event)
|
128
|
-
[event.time_key,event.name,event.latitude,event.longitude]
|
140
|
+
[event.time_key,event.name,event.latitude,event.longitude] +
|
141
|
+
(export_imei ? [event.file.imei] : [])
|
129
142
|
end
|
130
143
|
def more_fields(event,dataset)
|
131
144
|
more_headers.map do |h|
|
@@ -136,6 +149,8 @@ class Export
|
|
136
149
|
dataset.recent(event,'service.lac')
|
137
150
|
when 'CI'
|
138
151
|
dataset.recent(event,'service.cell_id')
|
152
|
+
when 'LAC-CI'
|
153
|
+
"#{dataset.recent(event,'service.lac')}-#{dataset.recent(event,'service.cell_id')}"
|
139
154
|
when 'MCC'
|
140
155
|
dataset[h] || dataset.recent(event,'service.mcc')
|
141
156
|
when 'MNC'
|
@@ -144,8 +159,6 @@ class Export
|
|
144
159
|
dataset['carrierName']
|
145
160
|
when 'IMSI'
|
146
161
|
dataset.imsi
|
147
|
-
when 'IMEI'
|
148
|
-
dataset.imei
|
149
162
|
else
|
150
163
|
dataset[h]
|
151
164
|
end
|
data/geoptima.gemspec
CHANGED
@@ -30,6 +30,7 @@ EOF
|
|
30
30
|
s.extra_rdoc_files = %w( README.rdoc )
|
31
31
|
s.rdoc_options = ["--quiet", "--title", "Geoptima.rb", "--line-numbers", "--main", "README.rdoc", "--inline-source"]
|
32
32
|
|
33
|
-
s.add_dependency('
|
33
|
+
s.add_dependency('multi_json',">= 1.1.0")
|
34
|
+
s.add_dependency('json_pure',">= 1.6.5")
|
34
35
|
s.required_ruby_version = ">= 1.8.6"
|
35
36
|
end
|
data/lib/geoptima/data.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
|
-
require '
|
4
|
+
require 'multi_json'
|
5
5
|
require 'date'
|
6
6
|
|
7
7
|
#
|
@@ -46,8 +46,9 @@ module Geoptima
|
|
46
46
|
"ftpSpeed" => ["timeoffset","interface","direction","delay","peak","speed"],
|
47
47
|
"browserDedicatedTest" => ["timeoffset","url","pageRenders","pageRendered","pageSize","success"]
|
48
48
|
}
|
49
|
-
attr_reader :header, :name, :data, :fields, :time, :latitude, :longitude
|
50
|
-
def initialize(start,name,header,data)
|
49
|
+
attr_reader :file, :header, :name, :data, :fields, :time, :latitude, :longitude
|
50
|
+
def initialize(file,start,name,header,data)
|
51
|
+
@file = file
|
51
52
|
@name = name
|
52
53
|
@header = header
|
53
54
|
@data = data
|
@@ -97,7 +98,8 @@ module Geoptima
|
|
97
98
|
attr_reader :path, :json, :count
|
98
99
|
def initialize(path)
|
99
100
|
@path = path
|
100
|
-
@json = JSON.parse(File.read(path))
|
101
|
+
# @json = JSON.parse(File.read(path))
|
102
|
+
@json = MultiJson.decode(File.read(path))
|
101
103
|
@fields = {}
|
102
104
|
if $debug
|
103
105
|
puts "Read Geoptima: #{geoptima.to_json}"
|
@@ -118,6 +120,9 @@ module Geoptima
|
|
118
120
|
def subscriber
|
119
121
|
@subscriber ||= geoptima['subscriber']
|
120
122
|
end
|
123
|
+
def imei
|
124
|
+
@imei ||= self['imei']
|
125
|
+
end
|
121
126
|
def [](key)
|
122
127
|
@fields[key] ||= subscriber[key] || subscriber[key.downcase]
|
123
128
|
end
|
@@ -182,7 +187,7 @@ module Geoptima
|
|
182
187
|
data = events[index...(index+header.length)]
|
183
188
|
if data && data.length == header.length
|
184
189
|
@count += 1
|
185
|
-
a << Event.new(start,event_type,header,data)
|
190
|
+
a << Event.new(self,start,event_type,header,data)
|
186
191
|
else
|
187
192
|
puts "Invalid '#{event_type}' data block #{block}: #{data.inspect}"
|
188
193
|
break a
|
@@ -381,8 +386,9 @@ module Geoptima
|
|
381
386
|
unless geoptima.valid?
|
382
387
|
puts "INVALID: #{geoptima.start}\t#{file}\n\n"
|
383
388
|
else
|
384
|
-
|
385
|
-
datasets[
|
389
|
+
key = options[:combine_all] ? 'all' : geoptima['imei']
|
390
|
+
datasets[key] ||= Geoptima::Dataset.new(key, options)
|
391
|
+
datasets[key] << geoptima
|
386
392
|
end
|
387
393
|
end
|
388
394
|
datasets
|
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: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 6
|
10
|
+
version: 0.0.6
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Craig Taverner
|
@@ -15,12 +15,28 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-03-
|
18
|
+
date: 2012-03-13 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
21
|
+
name: multi_json
|
22
22
|
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 19
|
29
|
+
segments:
|
30
|
+
- 1
|
31
|
+
- 1
|
32
|
+
- 0
|
33
|
+
version: 1.1.0
|
34
|
+
type: :runtime
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: json_pure
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
24
40
|
none: false
|
25
41
|
requirements:
|
26
42
|
- - ">="
|
@@ -32,7 +48,7 @@ dependencies:
|
|
32
48
|
- 5
|
33
49
|
version: 1.6.5
|
34
50
|
type: :runtime
|
35
|
-
version_requirements: *
|
51
|
+
version_requirements: *id002
|
36
52
|
description: |
|
37
53
|
Geoptima is a suite of applications for measuring and locating mobile/cellular subscriber experience on GPS enabled smartphones.
|
38
54
|
It is produced by AmanziTel AB in Helsingborg, Sweden, and supports many phone manufacturers, with free downloads from the
|