kismet-gpsxml 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/bin/gpsxml-filter-bad-bssid +16 -0
- data/bin/gpsxml2csv +18 -4
- data/kismet-gpsxml.gemspec +4 -3
- data/lib/kismet-gpsxml.rb +54 -6
- data/test/helper.rb +4 -0
- data/test/test_kismet-gpsxml.rb +30 -4
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 795d35c2d0f134187651956ebcc02dac33b33f3c
|
4
|
+
data.tar.gz: 79cfb9f7bb72725ed648c586331857f959389018
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 979750dcfbcf764301602085d894b86fa5bfe6b1b029a5d228a1cbdc79a939faa62af1dbb3099d9ccc4657059dc79ddb7d2ecad0a6bacaf26b0932800aafdaa1
|
7
|
+
data.tar.gz: 559e322a14e3ac870ac24e17f9043cddcd44757a3cd89dd0687519d96d334168d5101be77b400c735474889a9e7bc209d681b60568f77b43397e1b8e7bf78d00
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'kismet-gpsxml'
|
4
|
+
|
5
|
+
unless ARGV[0]
|
6
|
+
$stderr.puts "Usage: #{__FILE__} logfile.gpsxml > output.gpsxml"
|
7
|
+
exit 1
|
8
|
+
end
|
9
|
+
|
10
|
+
file = ARGV[0]
|
11
|
+
|
12
|
+
reader = Kismet::GPSXML::Reader.from_io File.open(file)
|
13
|
+
|
14
|
+
count = reader.write_interesting_nodes_to_file STDOUT
|
15
|
+
|
16
|
+
$stderr.puts "\n#{count} gps-point written."
|
data/bin/gpsxml2csv
CHANGED
@@ -5,7 +5,9 @@ require 'kismet-gpsxml'
|
|
5
5
|
DEFAULT_ROUNDING = 4
|
6
6
|
|
7
7
|
unless ARGV[0]
|
8
|
-
$stderr.puts "Usage: #{__FILE__} logfile.gpsxml [rounding-level]
|
8
|
+
$stderr.puts "Usage: #{__FILE__} logfile.gpsxml [rounding-level]"
|
9
|
+
$stderr.puts "Default rounding-level is #{DEFAULT_ROUNDING} decimal places."
|
10
|
+
$stderr.puts "Set GPSXML_OUTPUT_XML if you want the output to be XML."
|
9
11
|
exit 1
|
10
12
|
end
|
11
13
|
|
@@ -15,8 +17,20 @@ rounding = ARGV[1] ? ARGV[1].to_i : DEFAULT_ROUNDING
|
|
15
17
|
reader = Kismet::GPSXML::Reader.from_io File.open(file)
|
16
18
|
reader.rounding = rounding
|
17
19
|
|
18
|
-
|
20
|
+
bssids = reader.bssids_by_lat_long
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
+
unless ENV['GPSXML_OUTPUT_XML']
|
23
|
+
bssids.each do |point,set|
|
24
|
+
puts [point, set.size].join(",")
|
25
|
+
end
|
26
|
+
else
|
27
|
+
puts '<points input="%s" >' % File.basename(file)
|
28
|
+
bssids.each do |point,set|
|
29
|
+
puts '<point coord="%s" count="%d">' % [point, set.size]
|
30
|
+
set.each do |bssid|
|
31
|
+
puts '<bssid>%s</bssid>' % bssid
|
32
|
+
end
|
33
|
+
puts '</point>'
|
34
|
+
end
|
35
|
+
puts "</points>"
|
22
36
|
end
|
data/kismet-gpsxml.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: kismet-gpsxml 0.
|
5
|
+
# stub: kismet-gpsxml 0.2.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "kismet-gpsxml"
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "0.2.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
@@ -14,7 +14,7 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.date = "2014-09-14"
|
15
15
|
s.description = "A quick solution to model Kismet-generated gpsxml log files and output to CSV"
|
16
16
|
s.email = "colin.dean@metamesh.org"
|
17
|
-
s.executables = ["gpsxml2csv"]
|
17
|
+
s.executables = ["gpsxml-filter-bad-bssid", "gpsxml2csv"]
|
18
18
|
s.extra_rdoc_files = [
|
19
19
|
"LICENSE.txt",
|
20
20
|
"README.md"
|
@@ -27,6 +27,7 @@ Gem::Specification.new do |s|
|
|
27
27
|
"README.md",
|
28
28
|
"Rakefile",
|
29
29
|
"VERSION",
|
30
|
+
"bin/gpsxml-filter-bad-bssid",
|
30
31
|
"bin/gpsxml2csv",
|
31
32
|
"kismet-gpsxml.gemspec",
|
32
33
|
"lib/kismet-gpsxml.rb",
|
data/lib/kismet-gpsxml.rb
CHANGED
@@ -22,25 +22,73 @@ class Kismet::GPSXML::Reader
|
|
22
22
|
@rounding = 4
|
23
23
|
end
|
24
24
|
|
25
|
-
def
|
25
|
+
def bssids_by_lat_long
|
26
26
|
points = {}
|
27
27
|
reader.each do |node|
|
28
|
-
next unless
|
28
|
+
next unless interesting_gpsxml_node? node
|
29
29
|
point = point_info node
|
30
30
|
lat, lon, bssid = point.values
|
31
31
|
key = [lat,lon].join(",")
|
32
|
-
points[key] =
|
32
|
+
points[key] = SortedSet.new if points[key].nil?
|
33
33
|
points[key].add bssid
|
34
34
|
end
|
35
35
|
points
|
36
36
|
end
|
37
37
|
|
38
|
+
# Returns the number of interesting_gpsxml_nodes it wrote
|
39
|
+
def write_interesting_nodes_to_file io
|
40
|
+
counter = 0
|
41
|
+
reader.each do |node|
|
42
|
+
unless undesirable_node? node
|
43
|
+
io.write node_to_string(node)
|
44
|
+
counter += 1 if interesting_gpsxml_node? node
|
45
|
+
end
|
46
|
+
end
|
47
|
+
counter
|
48
|
+
end
|
49
|
+
|
38
50
|
private
|
39
51
|
|
40
|
-
def
|
41
|
-
node.name == "gps-point" &&
|
52
|
+
def is_gpspoint? node
|
42
53
|
node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT &&
|
43
|
-
node.
|
54
|
+
node.name == "gps-point"
|
55
|
+
end
|
56
|
+
|
57
|
+
def interesting_gpsxml_node? node
|
58
|
+
is_gpspoint?(node) &&
|
59
|
+
!undesirable_node?(node)
|
60
|
+
end
|
61
|
+
|
62
|
+
def undesirable_node? node
|
63
|
+
is_gpspoint?(node) &&
|
64
|
+
(
|
65
|
+
node.attribute("bssid") == "00:00:00:00:00:00" ||
|
66
|
+
node.attribute("bssid") == "GP:SD:TR:AC:KL:OG"
|
67
|
+
)
|
68
|
+
end
|
69
|
+
|
70
|
+
def node_to_string node
|
71
|
+
case node.node_type
|
72
|
+
when Nokogiri::XML::Reader::TYPE_ELEMENT
|
73
|
+
open_node_with_attrs(node)
|
74
|
+
when Nokogiri::XML::Reader::TYPE_END_ELEMENT
|
75
|
+
close_node(node)
|
76
|
+
when Nokogiri::XML::Reader::TYPE_DOCUMENT_TYPE
|
77
|
+
node.outer_xml
|
78
|
+
when Nokogiri::XML::Reader::TYPE_TEXT
|
79
|
+
node.value
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def close_node node
|
84
|
+
"</"+node.name+">"
|
85
|
+
end
|
86
|
+
|
87
|
+
def open_node_with_attrs node
|
88
|
+
name = node.name
|
89
|
+
attrs = node.attributes.collect{|k,v| '%s="%s"'%[k,v] }.join(' ')
|
90
|
+
closing = node.self_closing? ? '/' : ''
|
91
|
+
"<#{[name,attrs].join(' ')}#{closing}>"
|
44
92
|
end
|
45
93
|
|
46
94
|
def point_info node
|
data/test/helper.rb
CHANGED
data/test/test_kismet-gpsxml.rb
CHANGED
@@ -9,7 +9,7 @@ describe Kismet::GPSXML::Reader do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
it "responds to points" do
|
12
|
-
subject.public_instance_methods.must_include :
|
12
|
+
subject.public_instance_methods.must_include :bssids_by_lat_long
|
13
13
|
# subject.must_respond_to :points # this doesn't work on classes, just instances
|
14
14
|
end
|
15
15
|
|
@@ -20,24 +20,50 @@ describe Kismet::GPSXML::Reader do
|
|
20
20
|
|
21
21
|
describe "IO operations" do
|
22
22
|
let(:text_xml_io) { File.open test_xml_location }
|
23
|
+
let(:text_write_io) { File.open test_write_location, 'w' }
|
24
|
+
|
23
25
|
|
24
26
|
before do
|
25
27
|
text_xml_io.rewind
|
26
28
|
@reader = subject.from_io text_xml_io
|
27
29
|
end
|
28
30
|
|
31
|
+
#after do
|
32
|
+
#puts "what %s" % passed?
|
33
|
+
#if passed?
|
34
|
+
# if File.exists?(text_write_io) || File.exists?(test_write_location)
|
35
|
+
# File.unlink test_write_location
|
36
|
+
# end
|
37
|
+
#end
|
38
|
+
#end
|
39
|
+
|
40
|
+
|
29
41
|
it "retrieves points" do
|
30
|
-
@reader.
|
42
|
+
@reader.bssids_by_lat_long.wont_be_empty
|
31
43
|
end
|
32
44
|
|
33
45
|
it "retrieves the expected number of points" do
|
34
|
-
@reader.
|
46
|
+
@reader.bssids_by_lat_long.size.must_equal 4 # one should be filtered out
|
35
47
|
end
|
36
48
|
|
37
49
|
it "filters bssid = 00:00:00:00:00:00" do
|
38
|
-
points_with_bad_bssid = @reader.
|
50
|
+
points_with_bad_bssid = @reader.bssids_by_lat_long.select{|position,bssid| bssid == '00:00:00:00:00:00'}
|
39
51
|
points_with_bad_bssid.must_be_empty
|
40
52
|
end
|
41
53
|
|
54
|
+
it "writes the expected number of points" do
|
55
|
+
count = @reader.write_interesting_nodes_to_file text_write_io
|
56
|
+
text_write_io.close
|
57
|
+
count.must_equal 4
|
58
|
+
end
|
59
|
+
|
60
|
+
it "writes the expected number of points, then doesn't filter more" do
|
61
|
+
count1 = @reader.write_interesting_nodes_to_file text_write_io
|
62
|
+
text_write_io.close
|
63
|
+
@reader2 = subject.from_io File.open(test_write_location)
|
64
|
+
count2 = @reader2.write_interesting_nodes_to_file File.open(test_write_location("-second"), 'w')
|
65
|
+
|
66
|
+
count1.must_equal count2
|
67
|
+
end
|
42
68
|
end
|
43
69
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kismet-gpsxml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Colin Dean
|
@@ -98,6 +98,7 @@ description: A quick solution to model Kismet-generated gpsxml log files and out
|
|
98
98
|
to CSV
|
99
99
|
email: colin.dean@metamesh.org
|
100
100
|
executables:
|
101
|
+
- gpsxml-filter-bad-bssid
|
101
102
|
- gpsxml2csv
|
102
103
|
extensions: []
|
103
104
|
extra_rdoc_files:
|
@@ -111,6 +112,7 @@ files:
|
|
111
112
|
- README.md
|
112
113
|
- Rakefile
|
113
114
|
- VERSION
|
115
|
+
- bin/gpsxml-filter-bad-bssid
|
114
116
|
- bin/gpsxml2csv
|
115
117
|
- kismet-gpsxml.gemspec
|
116
118
|
- lib/kismet-gpsxml.rb
|