smart_proxy_ipam 0.0.12 → 0.0.13

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 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!'