logstash-filter-ipam 0.1.1 → 0.1.2
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/logstash/filters/ipam.rb +82 -26
- data/logstash-filter-ipam.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aa73397a601bf30ef7770ae0acbdbca481597337b99d4e5645fecddbd3b644da
|
4
|
+
data.tar.gz: eaeb7ce6e8ef074f38805f18783092f1b4a41e322740881db07a786888907170
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c9c1c7939ececb9984e9aa85e6d411324958b9c7e38b680bbef37e7308d5a530ec89e121e064c074aaf6acf69888cae7304a3940588f162df4f12ea0bb6c5cf9
|
7
|
+
data.tar.gz: 55868dcf04026c5e36f3942439f904322c55db2ab740227aebd2ff006eb3642980ccf10f826bd3f85e761d1a579b4a81919171bbc3345ec4bd6ed6bc29c117c7
|
@@ -2,9 +2,10 @@
|
|
2
2
|
require "logstash/filters/base"
|
3
3
|
require "logstash/namespace"
|
4
4
|
require "ipaddr"
|
5
|
+
require "mysql"
|
5
6
|
require "json"
|
6
7
|
|
7
|
-
# This filter will replace the contents of the default
|
8
|
+
# This filter will replace the contents of the default
|
8
9
|
# message field with whatever you specify in the configuration.
|
9
10
|
#
|
10
11
|
# It is only intended to be used as an .
|
@@ -12,50 +13,105 @@ class LogStash::Filters::Ipam < LogStash::Filters::Base
|
|
12
13
|
|
13
14
|
# Setting the config_name here is required. This is how you
|
14
15
|
# configure this filter from your Logstash config.
|
15
|
-
#
|
16
|
-
# filter {
|
17
|
-
# {
|
18
|
-
# message => "My message..."
|
19
|
-
# }
|
20
|
-
# }
|
21
|
-
#
|
22
16
|
config_name "ipam"
|
23
|
-
|
24
|
-
#
|
17
|
+
|
18
|
+
# Logstash filter options.
|
25
19
|
config :ip, :validate => :string, :required => true
|
26
|
-
config :file, :validate => :string, :default => "/opt/subnets/subnets.json"
|
27
20
|
config :field, :validate => :string, :default => "subnets"
|
21
|
+
config :gateway, :validate => :boolean, :default => false
|
28
22
|
|
23
|
+
# Mysql connection options.
|
24
|
+
config :mysql_host, :validate => :string, :required => true
|
25
|
+
config :mysql_user, :validate => :string, :required => true
|
26
|
+
config :mysql_pass, :validate => :string, :required => true
|
27
|
+
config :mysql_db, :validate => :string, :default => "phpipam"
|
29
28
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end # def register
|
29
|
+
# File storage options.
|
30
|
+
config :time_reset, :validate => :number, :default => 600
|
31
|
+
config :file, :validate => :string, :default => "/tmp/logstash-filter-ipam.json"
|
34
32
|
|
35
|
-
public
|
36
|
-
def filter(event)
|
37
|
-
|
38
|
-
results = Array.new
|
39
|
-
file = File.read(@file)
|
40
|
-
json = JSON.parse(file)
|
41
|
-
subnets = json["subnets"]
|
42
33
|
|
34
|
+
public
|
35
|
+
def register
|
36
|
+
# Check if the IP string is an actual IP, or stop process
|
43
37
|
begin
|
44
|
-
ip = IPAddr.new(@ip)
|
38
|
+
@ip = IPAddr.new(@ip)
|
45
39
|
rescue ArgumentError => e
|
46
40
|
@logger.warn("Invalid IP address, skipping", :address => @ip, :event => event)
|
47
41
|
nil
|
48
42
|
end
|
43
|
+
end # def register
|
44
|
+
|
45
|
+
private
|
46
|
+
def downloadIpamSubnets(event)
|
47
|
+
begin
|
48
|
+
client = Mysql::Client.new(:host => @mysql_host,
|
49
|
+
:username => @mysql_user,
|
50
|
+
:password => @mysql_pass,
|
51
|
+
:database => @mysql_db)
|
52
|
+
result = client.query("SELECT id, FROM subnets")
|
53
|
+
client.close()
|
54
|
+
return JSON.parse(result)
|
55
|
+
rescue
|
56
|
+
@logger.warn("Impossible to retrieve data from Mysql.", :address => @mysql_host, :event => event)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
def getSubnets(event)
|
62
|
+
# Reading files
|
63
|
+
begin
|
64
|
+
file = File.read(@file)
|
65
|
+
json JSON.parse(file)
|
66
|
+
return json["subnets"]
|
67
|
+
rescue
|
68
|
+
@logger.warn("Impossible to read into file.", :address => @file, :event => event)
|
69
|
+
end
|
70
|
+
end
|
49
71
|
|
72
|
+
private
|
73
|
+
def checkIpSubnets(ip, subnets)
|
74
|
+
results = Array.new
|
50
75
|
subnets.each do |sub|
|
51
|
-
if
|
76
|
+
if !@gateway && sub['subnet'] == "0.0.0.0"
|
77
|
+
next
|
78
|
+
end
|
79
|
+
if IPAddr.new(sub['subnet'] + "/" + sub['netmask'].to_s).include?(ip)
|
52
80
|
results.push(sub)
|
53
81
|
end
|
54
82
|
end
|
83
|
+
return results
|
84
|
+
end
|
85
|
+
|
86
|
+
private
|
87
|
+
def checkFile(event)
|
88
|
+
if (!File.exist?(@file) || File.mtime(@file).utc < (Time.now - @time_reset).utc)
|
89
|
+
begin
|
90
|
+
file = File.open(@file, 'w')
|
91
|
+
file.write(downloadIpamSubnets(event))
|
92
|
+
rescue
|
93
|
+
@logger.warn("Impossible to write into file.", :address => @file, :event => event)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
public
|
99
|
+
def filter(event)
|
100
|
+
# Check file
|
101
|
+
# if doesn't exist => create with content.
|
102
|
+
# if need reset => update content.
|
103
|
+
checkFile(event)
|
104
|
+
|
105
|
+
# Get Subnets Checking the IP
|
106
|
+
# if can't read => Warning
|
107
|
+
# if gateway is false => won't register "0.0.0.0" subnets
|
108
|
+
ipamSubnets = getIpamSubnets(event)
|
109
|
+
subnets = checkIpSubnets(@ip, subnets)
|
55
110
|
|
56
111
|
# Set field only if there is some subnets checked.
|
57
|
-
if
|
58
|
-
event.set(@field,
|
112
|
+
if subnets.length > 0
|
113
|
+
event.set(@field, subnets)
|
114
|
+
else
|
59
115
|
# filter_matched should go in the last line of our successful code
|
60
116
|
filter_matched(event)
|
61
117
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'logstash-filter-ipam'
|
3
|
-
s.version = '0.1.
|
3
|
+
s.version = '0.1.2'
|
4
4
|
s.licenses = ['Apache-2.0']
|
5
5
|
s.summary = 'Correlation with IPAM.'
|
6
6
|
s.description = 'Filter that allows getting subnets from existing file extracted from IPAM for an IP address.'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-filter-ipam
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Corentin Dekimpe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-12-
|
11
|
+
date: 2017-12-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|