smart_proxy_ipam 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 03e5b4db2d3b9f5ffad35e382585f0d632c7bf312c9a0b643ff24989d11283d8
4
- data.tar.gz: 34960551000adc62f823b7d66f81d3429530b0f39cc3b8f9301d92207c6c5a7b
3
+ metadata.gz: e15677a434645d7983b2d76599f64846fd15676de6752fd552939463156e406c
4
+ data.tar.gz: a9905c07b628625af2f3d69507f8388d92cfec0cb16fb5bd4583e59ce488147f
5
5
  SHA512:
6
- metadata.gz: da0f3c2643eac27f95a041b8181097b874aadee8d1a46a8d549862870328cb9f40766d0def9688ff487cb27fc00b8a178522a75f90e2e813b60c99256e3b0068
7
- data.tar.gz: 1f3f74603ab6822061a29018a2eb4ef98fd1071cb15c0af0e252da93cbbfe15b7fdc2e396d1a5a3ff3e9b29de97580ce46edae20b8c5357c76d317154ee4ce7d
6
+ metadata.gz: ca743342ca290e14d6c4116475b3106ae71cffff89d7192b7b9873082a5ccaa80b406b25c3d31676b6d51c6cb50efc94c4d821226214de93e1a3c654bb24caf7
7
+ data.tar.gz: a550aab54cfeff4b727a088cf34cb97deb6e3df0575572d6e007699b248e542840de35aa01ec587f5e75c4d9ed48f5b3ea03fcdefbe332ef76a9ee2478a5ad5c
@@ -3,6 +3,7 @@ require 'json'
3
3
  require 'net/http'
4
4
  require 'monitor'
5
5
  require 'concurrent'
6
+ require 'time'
6
7
  require 'smart_proxy_ipam/ipam'
7
8
  require 'smart_proxy_ipam/ipam_main'
8
9
  require 'smart_proxy_ipam/phpipam/phpipam_helper'
@@ -125,10 +126,11 @@ module Proxy::Phpipam
125
126
  return response if response['message']
126
127
 
127
128
  if subnet_hash && subnet_hash.key?(mac.to_sym)
128
- response['next_ip'] = @@ip_cache[cidr.to_sym][mac.to_sym]
129
+ response['next_ip'] = @@ip_cache[cidr.to_sym][mac.to_sym][:ip]
129
130
  else
131
+ next_ip = nil
130
132
  new_ip = response['data']
131
- ip_not_in_cache = subnet_hash && subnet_hash.key(new_ip).nil?
133
+ ip_not_in_cache = subnet_hash && !subnet_hash.to_s.include?(new_ip.to_s)
132
134
 
133
135
  if ip_not_in_cache
134
136
  next_ip = new_ip.to_s
@@ -164,28 +166,47 @@ module Proxy::Phpipam
164
166
  # @@ip_cache structure
165
167
  # {
166
168
  # "100.55.55.0/24":{
167
- # "00:0a:95:9d:68:10": "100.55.55.1"
169
+ # "00:0a:95:9d:68:10": {"ip": "100.55.55.1", "timestamp": "2019-09-17 12:03:43 -D400"}
168
170
  # },
169
171
  # "123.11.33.0/24":{
170
- # "00:0a:95:9d:68:33": "123.11.33.1",
171
- # "00:0a:95:9d:68:34": "123.11.33.2",
172
- # "00:0a:95:9d:68:35": "123.11.33.3"
172
+ # "00:0a:95:9d:68:33": {"ip": "123.11.33.1", "timestamp": "2019-09-17 12:04:43 -0400"}
173
+ # "00:0a:95:9d:68:34": {"ip": "123.11.33.2", "timestamp": "2019-09-17 12:05:48 -0400"}
174
+ # "00:0a:95:9d:68:35": {"ip": "123.11.33.3", "timestamp:: "2019-09-17 12:06:50 -0400"}
173
175
  # }
174
176
  # }
175
177
  def init_cache
176
178
  logger.debug("Clearing ip cache.")
177
179
  @@m.synchronize do
178
- @@ip_cache = {}
180
+ if @@ip_cache and not @@ip_cache.empty?
181
+ @@ip_cache.each do |key, values|
182
+ values.each do |mac, value|
183
+ if Time.now - Time.parse(value[:timestamp]) > DEFAULT_CLEANUP_INTERVAL
184
+ @@ip_cache[key].delete(mac)
185
+ end
186
+ end
187
+ @@ip_cache.delete(key) if @@ip_cache[key].nil? or @@ip_cache[key].empty?
188
+ end
189
+ else
190
+ @@ip_cache = {}
191
+ end
179
192
  end
180
193
  end
181
194
 
182
195
  def add_ip_to_cache(ip, mac, cidr)
183
196
  logger.debug("Adding IP #{ip} to cache for subnet #{cidr}")
184
197
  @@m.synchronize do
198
+ #clear cache data which has the same mac and ip with the new one
199
+ @@ip_cache.each do |key, values|
200
+ if values.keys.include? mac.to_sym
201
+ @@ip_cache[key].delete(mac.to_sym)
202
+ end
203
+ @@ip_cache.delete(key) if @@ip_cache[key].nil? or @@ip_cache[key].empty?
204
+ end
205
+
185
206
  if @@ip_cache.key?(cidr.to_sym)
186
- @@ip_cache[cidr.to_sym][mac.to_sym] = ip.to_s
207
+ @@ip_cache[cidr.to_sym][mac.to_sym] = {:ip => ip.to_s, :timestamp => Time.now.to_s}
187
208
  else
188
- @@ip_cache = @@ip_cache.merge({cidr.to_sym => {mac.to_sym => ip.to_s}})
209
+ @@ip_cache = @@ip_cache.merge({cidr.to_sym => {mac.to_sym => {:ip => ip.to_s, :timestamp => Time.now.to_s}}})
189
210
  end
190
211
  end
191
212
  end
@@ -203,7 +224,7 @@ module Proxy::Phpipam
203
224
  verify_ip = JSON.parse(ip_exists(new_ip, subnet_id))
204
225
 
205
226
  # If new IP doesn't exist in IPAM and not in the cache
206
- if verify_ip['exists'] == false && !ip_exists_in_cache(new_ip, cidr)
227
+ if verify_ip['exists'] == false && !ip_exists_in_cache(new_ip, cidr, mac)
207
228
  found_ip = new_ip.to_s
208
229
  add_ip_to_cache(found_ip, mac, cidr)
209
230
  break
@@ -224,8 +245,8 @@ module Proxy::Phpipam
224
245
  IPAddr.new(ip.to_s).succ.to_s
225
246
  end
226
247
 
227
- def ip_exists_in_cache(ip, cidr)
228
- @@ip_cache[cidr.to_sym] && !@@ip_cache[cidr.to_sym].key(ip).nil?
248
+ def ip_exists_in_cache(ip, cidr, mac)
249
+ @@ip_cache[cidr.to_sym] && @@ip_cache[cidr.to_sym].to_s.include?(ip.to_s)
229
250
  end
230
251
 
231
252
  # Checks if given IP is within a subnet. Broadcast address is considered unusable
@@ -289,4 +310,4 @@ module Proxy::Phpipam
289
310
  @token = response['data']['token']
290
311
  end
291
312
  end
292
- end
313
+ end
@@ -1,6 +1,6 @@
1
1
 
2
2
  module Proxy
3
3
  module Ipam
4
- VERSION = '0.0.12'
4
+ VERSION = '0.0.13'
5
5
  end
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smart_proxy_ipam
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.12
4
+ version: 0.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christopher Smith
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-13 00:00:00.000000000 Z
11
+ date: 2019-10-16 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Smart proxy plugin for IPAM integration with various IPAM providers
14
14
  email: chrisjsmith001@gmail.com
@@ -29,7 +29,6 @@ files:
29
29
  - lib/smart_proxy_ipam/phpipam/phpipam_client.rb
30
30
  - lib/smart_proxy_ipam/phpipam/phpipam_helper.rb
31
31
  - lib/smart_proxy_ipam/version.rb
32
- - settings.d/external_ipam.yml
33
32
  - settings.d/external_ipam.yml.example
34
33
  homepage: http://github.com/grizzthedj/smart_proxy_ipam
35
34
  licenses:
@@ -1,8 +0,0 @@
1
- ---
2
- :enabled: true
3
-
4
- :external_ipam:
5
- :phpipam:
6
- :url: 'http://172.16.16.217'
7
- :user: 'foreman'
8
- :password: 'Test1234!'