patronus_fati 0.9.11 → 0.9.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/patronus_fati/connection.rb +3 -4
- data/lib/patronus_fati/data_models/access_point.rb +3 -5
- data/lib/patronus_fati/data_models/client.rb +3 -5
- data/lib/patronus_fati/data_models/common.rb +20 -0
- data/lib/patronus_fati/data_models/ssid.rb +0 -1
- data/lib/patronus_fati/data_observers/access_point_observer.rb +7 -2
- data/lib/patronus_fati/data_observers/client_observer.rb +0 -2
- data/lib/patronus_fati/data_observers/connection_observer.rb +0 -3
- data/lib/patronus_fati/data_observers/ssid_observer.rb +12 -30
- data/lib/patronus_fati/message_processor/alert.rb +12 -7
- data/lib/patronus_fati/message_processor.rb +3 -0
- data/lib/patronus_fati/version.rb +1 -1
- data/lib/patronus_fati.rb +0 -3
- metadata +2 -5
- data/lib/patronus_fati/data_models/alert.rb +0 -24
- data/lib/patronus_fati/data_models/mac.rb +0 -48
- data/lib/patronus_fati/data_observers/alert_observer.rb +0 -12
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9494304c05c4e1107313822eb7ca6671fe736a40
|
|
4
|
+
data.tar.gz: ed4c5b18d335e2d08611718d4d3957ebe9202a15
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 30cc6b08f1a9e44f54ed589ec15211e8debf8244f3e2969ef1384477dddd0c51b5d266cc5c46a98a4c79c9a272ce41a05ff0d2dd4a4512cd2f59584618342bdf
|
|
7
|
+
data.tar.gz: 30ee69e1c3d916d7e46068c2383f370dcee51d6362b331e5dbd3d8962b3fff92cb01584bb10761060e8e7db4ebeb6849909190e6a42d66496ebaaef67a012297
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
module PatronusFati
|
|
2
|
-
DisconnectError = Class.new(StandardError)
|
|
3
|
-
|
|
4
2
|
class Connection
|
|
5
3
|
attr_reader :port, :read_queue, :server, :write_queue
|
|
6
4
|
|
|
@@ -14,17 +12,18 @@ module PatronusFati
|
|
|
14
12
|
|
|
15
13
|
def connect
|
|
16
14
|
establish_connection
|
|
15
|
+
return unless connected?
|
|
17
16
|
|
|
18
17
|
start_read_thread
|
|
19
18
|
start_write_thread
|
|
20
19
|
end
|
|
21
20
|
|
|
22
21
|
def connected?
|
|
23
|
-
!socket.nil?
|
|
22
|
+
!(socket.nil? || socket.closed?)
|
|
24
23
|
end
|
|
25
24
|
|
|
26
25
|
def disconnect
|
|
27
|
-
return unless
|
|
26
|
+
return unless socket
|
|
28
27
|
|
|
29
28
|
Thread.kill(read_thread)
|
|
30
29
|
Thread.kill(write_thread)
|
|
@@ -2,6 +2,7 @@ module PatronusFati::DataModels
|
|
|
2
2
|
class AccessPoint
|
|
3
3
|
include DataMapper::Resource
|
|
4
4
|
|
|
5
|
+
include PatronusFati::DataModels::AutoVendorLookup
|
|
5
6
|
include PatronusFati::DataModels::ExpirationAttributes
|
|
6
7
|
include PatronusFati::DataModels::ReportedAttributes
|
|
7
8
|
|
|
@@ -20,10 +21,7 @@ module PatronusFati::DataModels
|
|
|
20
21
|
:child_key => :access_point_id
|
|
21
22
|
has n, :ssids, :constraint => :destroy
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
before :save do
|
|
25
|
-
self.mac = Mac.first_or_create(mac: bssid)
|
|
26
|
-
end
|
|
24
|
+
vendor_attribute :bssid
|
|
27
25
|
|
|
28
26
|
def self.current_expiration_threshold
|
|
29
27
|
Time.now.to_i - PatronusFati::AP_EXPIRATION
|
|
@@ -48,7 +46,7 @@ module PatronusFati::DataModels
|
|
|
48
46
|
.merge(
|
|
49
47
|
active: active?,
|
|
50
48
|
connected_clients: connected_clients.map(&:bssid),
|
|
51
|
-
vendor:
|
|
49
|
+
vendor: vendor,
|
|
52
50
|
ssids: current_ssids.map(&:full_state)
|
|
53
51
|
)
|
|
54
52
|
end
|
|
@@ -2,6 +2,7 @@ module PatronusFati::DataModels
|
|
|
2
2
|
class Client
|
|
3
3
|
include DataMapper::Resource
|
|
4
4
|
|
|
5
|
+
include PatronusFati::DataModels::AutoVendorLookup
|
|
5
6
|
include PatronusFati::DataModels::ExpirationAttributes
|
|
6
7
|
include PatronusFati::DataModels::ReportedAttributes
|
|
7
8
|
|
|
@@ -15,10 +16,7 @@ module PatronusFati::DataModels
|
|
|
15
16
|
|
|
16
17
|
has n, :probes, :constraint => :destroy
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
before :save do
|
|
20
|
-
self.mac = Mac.first_or_create(mac: bssid)
|
|
21
|
-
end
|
|
19
|
+
vendor_attribute :bssid
|
|
22
20
|
|
|
23
21
|
def self.current_expiration_threshold
|
|
24
22
|
Time.now.to_i - PatronusFati::CLIENT_EXPIRATION
|
|
@@ -39,7 +37,7 @@ module PatronusFati::DataModels
|
|
|
39
37
|
active: active?,
|
|
40
38
|
connected_access_points: connected_access_points.map(&:bssid),
|
|
41
39
|
probes: probes.map(&:essid),
|
|
42
|
-
vendor:
|
|
40
|
+
vendor: vendor
|
|
43
41
|
)
|
|
44
42
|
end
|
|
45
43
|
end
|
|
@@ -17,6 +17,26 @@ module PatronusFati
|
|
|
17
17
|
end
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
+
module AutoVendorLookup
|
|
21
|
+
def self.included(klass)
|
|
22
|
+
klass.extend AVLClassMethods
|
|
23
|
+
klass.property :vendor, DataMapper::Property::String, :length => 255
|
|
24
|
+
|
|
25
|
+
klass.before(:save) do
|
|
26
|
+
next if self.vendor || self.class.vendor_attribute.nil?
|
|
27
|
+
result = Louis.lookup(attributes[self.class.vendor_attribute])
|
|
28
|
+
self.vendor = result['long_vendor'] || result['short_vendor']
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
module AVLClassMethods
|
|
33
|
+
def vendor_attribute(attr = nil)
|
|
34
|
+
@@vendor_attribute = attr if attr && properties[attr]
|
|
35
|
+
@@vendor_attribute
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
20
40
|
module ExpirationAttributes
|
|
21
41
|
def self.included(klass)
|
|
22
42
|
klass.extend EAClassMethods
|
|
@@ -37,12 +37,17 @@ module PatronusFati::DataObservers
|
|
|
37
37
|
after :save do
|
|
38
38
|
next unless @change_type
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
fs = self.full_state
|
|
41
|
+
|
|
42
|
+
# During the initial creation we haven't had the opportunity to see any
|
|
43
|
+
# broadcast SSIDs yet. If we sent up an empty one it would delete the
|
|
44
|
+
# existing SSIDs.
|
|
45
|
+
fs.delete(:ssids) if @change_type == :new
|
|
41
46
|
|
|
42
47
|
PatronusFati.event_handler.event(
|
|
43
48
|
:access_point,
|
|
44
49
|
@change_type,
|
|
45
|
-
|
|
50
|
+
fs,
|
|
46
51
|
@change_list || {}
|
|
47
52
|
)
|
|
48
53
|
|
|
@@ -7,47 +7,29 @@ module PatronusFati::DataObservers
|
|
|
7
7
|
before :save do
|
|
8
8
|
next unless self.valid?
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
self.reported_online = true
|
|
13
|
-
|
|
14
|
-
@change_list = {
|
|
15
|
-
ssids: [
|
|
16
|
-
[],
|
|
17
|
-
[full_state]
|
|
18
|
-
]
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
unless self.new?
|
|
22
|
-
dirty = self.dirty_attributes.map { |a| a.first.name }.map(&:to_s)
|
|
23
|
-
dirty.delete('last_seen_at')
|
|
24
|
-
|
|
25
|
-
# If there weren't any meaningful changes, don't print out anything
|
|
26
|
-
# after we save.
|
|
27
|
-
if dirty.empty?
|
|
28
|
-
@change_list = nil
|
|
29
|
-
self.reported_online = old_ro_val
|
|
30
|
-
next
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
tmp_obj = Hash[original_attributes.map { |k,v| [k.name, v] }]
|
|
34
|
-
@change_list[:ssids][0] = PatronusFati::DataModels::Ssid.new(tmp_obj).full_state
|
|
35
|
-
end
|
|
10
|
+
@old_ssids = self.access_point.ssids.active.map(&:full_state)
|
|
11
|
+
.sort_by { |s| s[:essid] }
|
|
36
12
|
end
|
|
37
13
|
|
|
38
14
|
after :save do
|
|
39
|
-
|
|
15
|
+
new_ssids = self.access_point.ssids.active.map(&:full_state)
|
|
16
|
+
.sort_by { |s| s[:essid] }
|
|
40
17
|
|
|
41
|
-
|
|
18
|
+
change_list = {
|
|
19
|
+
ssids: [
|
|
20
|
+
@old_ssids,
|
|
21
|
+
new_ssids
|
|
22
|
+
]
|
|
23
|
+
}
|
|
42
24
|
|
|
43
25
|
PatronusFati.event_handler.event(
|
|
44
26
|
:access_point,
|
|
45
27
|
:changed,
|
|
46
28
|
self.access_point.full_state,
|
|
47
|
-
|
|
29
|
+
change_list
|
|
48
30
|
)
|
|
49
31
|
|
|
50
|
-
@
|
|
32
|
+
@old_ssids = nil
|
|
51
33
|
end
|
|
52
34
|
end
|
|
53
35
|
end
|
|
@@ -2,14 +2,19 @@ module PatronusFati::MessageProcessor::Alert
|
|
|
2
2
|
include PatronusFati::MessageProcessor
|
|
3
3
|
|
|
4
4
|
def self.process(obj)
|
|
5
|
-
|
|
6
|
-
dst_mac = PatronusFati::DataModels::Mac.first_or_create(mac: obj[:dest])
|
|
7
|
-
other_mac = PatronusFati::DataModels::Mac.first_or_create(mac: obj[:other])
|
|
8
|
-
|
|
9
|
-
PatronusFati::DataModels::Alert.first_or_create({created_at: obj.sec, \
|
|
10
|
-
message: obj[:text]}, {created_at: obj.sec, message: obj[:text], \
|
|
11
|
-
src_mac: src_mac, dst_mac: dst_mac, other_mac: other_mac})
|
|
5
|
+
PatronusFati.event_handler.event(:alert, :new, process_obj(obj))
|
|
12
6
|
|
|
13
7
|
nil
|
|
14
8
|
end
|
|
9
|
+
|
|
10
|
+
def self.process_obj(obj)
|
|
11
|
+
{
|
|
12
|
+
created_at: obj[:sec],
|
|
13
|
+
message: obj[:text],
|
|
14
|
+
|
|
15
|
+
source: obj[:source],
|
|
16
|
+
destination: obj[:dest],
|
|
17
|
+
other: obj[:other]
|
|
18
|
+
}
|
|
19
|
+
end
|
|
15
20
|
end
|
|
@@ -12,15 +12,18 @@ module PatronusFati
|
|
|
12
12
|
ap.update(:reported_online => false)
|
|
13
13
|
PatronusFati.event_handler.event(:access_point, :offline, {'bssid' => ap.bssid, 'uptime' => ap.uptime})
|
|
14
14
|
ap.disconnect_clients!
|
|
15
|
+
ap.destroy
|
|
15
16
|
end
|
|
16
17
|
|
|
17
18
|
PatronusFati::DataModels::Client.inactive.reported_online.each do |cli|
|
|
18
19
|
cli.update(:reported_online => false)
|
|
19
20
|
PatronusFati.event_handler.event(:client, :offline, {'bssid' => cli.bssid, 'uptime' => cli.uptime})
|
|
20
21
|
cli.disconnect!
|
|
22
|
+
cli.destroy
|
|
21
23
|
end
|
|
22
24
|
|
|
23
25
|
PatronusFati::DataModels::Connection.inactive.connected.map(&:disconnect!)
|
|
26
|
+
PatronusFati::DataModels::Ssid.inactive.destroy
|
|
24
27
|
end
|
|
25
28
|
end
|
|
26
29
|
|
data/lib/patronus_fati.rb
CHANGED
|
@@ -34,15 +34,12 @@ require 'patronus_fati/message_processor'
|
|
|
34
34
|
require 'patronus_fati/data_models/common'
|
|
35
35
|
|
|
36
36
|
require 'patronus_fati/data_models/access_point'
|
|
37
|
-
require 'patronus_fati/data_models/alert'
|
|
38
37
|
require 'patronus_fati/data_models/client'
|
|
39
38
|
require 'patronus_fati/data_models/connection'
|
|
40
|
-
require 'patronus_fati/data_models/mac'
|
|
41
39
|
require 'patronus_fati/data_models/probe'
|
|
42
40
|
require 'patronus_fati/data_models/ssid'
|
|
43
41
|
|
|
44
42
|
require 'patronus_fati/data_observers/access_point_observer'
|
|
45
|
-
require 'patronus_fati/data_observers/alert_observer'
|
|
46
43
|
require 'patronus_fati/data_observers/client_observer'
|
|
47
44
|
require 'patronus_fati/data_observers/connection_observer'
|
|
48
45
|
require 'patronus_fati/data_observers/ssid_observer'
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: patronus_fati
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.9.
|
|
4
|
+
version: 0.9.12
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sam Stelfox
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-
|
|
11
|
+
date: 2016-04-20 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: dm-constraints
|
|
@@ -287,15 +287,12 @@ files:
|
|
|
287
287
|
- lib/patronus_fati/data_mapper/crypt_flags.rb
|
|
288
288
|
- lib/patronus_fati/data_mapper/null_table_prefix.rb
|
|
289
289
|
- lib/patronus_fati/data_models/access_point.rb
|
|
290
|
-
- lib/patronus_fati/data_models/alert.rb
|
|
291
290
|
- lib/patronus_fati/data_models/client.rb
|
|
292
291
|
- lib/patronus_fati/data_models/common.rb
|
|
293
292
|
- lib/patronus_fati/data_models/connection.rb
|
|
294
|
-
- lib/patronus_fati/data_models/mac.rb
|
|
295
293
|
- lib/patronus_fati/data_models/probe.rb
|
|
296
294
|
- lib/patronus_fati/data_models/ssid.rb
|
|
297
295
|
- lib/patronus_fati/data_observers/access_point_observer.rb
|
|
298
|
-
- lib/patronus_fati/data_observers/alert_observer.rb
|
|
299
296
|
- lib/patronus_fati/data_observers/client_observer.rb
|
|
300
297
|
- lib/patronus_fati/data_observers/connection_observer.rb
|
|
301
298
|
- lib/patronus_fati/data_observers/probe_observer.rb
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
module PatronusFati::DataModels
|
|
2
|
-
class Alert
|
|
3
|
-
include DataMapper::Resource
|
|
4
|
-
|
|
5
|
-
property :id, Serial
|
|
6
|
-
property :created_at, Integer, :default => Proc.new { Time.now.to_i }
|
|
7
|
-
property :message, String, :length => 255
|
|
8
|
-
|
|
9
|
-
belongs_to :src_mac, :model => 'Mac', :required => false
|
|
10
|
-
belongs_to :dst_mac, :model => 'Mac', :required => false
|
|
11
|
-
belongs_to :other_mac, :model => 'Mac', :required => false
|
|
12
|
-
|
|
13
|
-
def full_state
|
|
14
|
-
{
|
|
15
|
-
created_at: created_at,
|
|
16
|
-
message: message,
|
|
17
|
-
|
|
18
|
-
source: src_mac.mac,
|
|
19
|
-
destination: dst_mac.mac,
|
|
20
|
-
other: other_mac.mac
|
|
21
|
-
}
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
module PatronusFati::DataModels
|
|
2
|
-
class Mac
|
|
3
|
-
include DataMapper::Resource
|
|
4
|
-
|
|
5
|
-
property :id, Serial
|
|
6
|
-
|
|
7
|
-
property :mac, String, :length => 17, :unique => true
|
|
8
|
-
property :vendor, String, :length => 255
|
|
9
|
-
|
|
10
|
-
property :alert_count, Integer, :default => 0
|
|
11
|
-
property :clients_connected, Integer, :default => 0
|
|
12
|
-
property :active_ssids, Integer, :default => 0
|
|
13
|
-
property :is_client, Boolean, :default => false
|
|
14
|
-
property :connections_to_ap, Integer, :default => 0
|
|
15
|
-
|
|
16
|
-
has n, :access_points
|
|
17
|
-
has n, :clients
|
|
18
|
-
|
|
19
|
-
has n, :dst_alerts, :model => 'Alert', :child_key => :dst_mac_id
|
|
20
|
-
has n, :other_alerts, :model => 'Alert', :child_key => :other_mac_id
|
|
21
|
-
has n, :src_alerts, :model => 'Alert', :child_key => :src_mac_id
|
|
22
|
-
|
|
23
|
-
before :save do
|
|
24
|
-
next if self.vendor
|
|
25
|
-
|
|
26
|
-
result = Louis.lookup(mac)
|
|
27
|
-
self.vendor = result['long_vendor'] || result['short_vendor']
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def is_ap?
|
|
31
|
-
access_points.active.any?
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def is_client?
|
|
35
|
-
clients.active.any?
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def update_cached_counts!
|
|
39
|
-
update(
|
|
40
|
-
alert_count: (dst_alerts | other_alerts | src_alerts).count,
|
|
41
|
-
active_ssids: access_points.ssids.active.count,
|
|
42
|
-
clients_connected: access_points.connections.connected.count,
|
|
43
|
-
connections_to_ap: clients.connections.connected.count,
|
|
44
|
-
is_client: is_client?
|
|
45
|
-
)
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
module PatronusFati::DataObservers
|
|
2
|
-
class AlertObserver
|
|
3
|
-
include DataMapper::Observer
|
|
4
|
-
|
|
5
|
-
observe PatronusFati::DataModels::Alert
|
|
6
|
-
|
|
7
|
-
after :save do
|
|
8
|
-
[src_mac, dst_mac, other_mac].uniq.map(&:update_cached_counts!)
|
|
9
|
-
PatronusFati.event_handler.event(:alert, :new, self.full_state)
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|