smart_proxy_ipam 0.0.17 → 0.0.18
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58e0c15cc7ee1369b7a1c5b7fa7cfcae0c7c54d75c8fc6486f02c8672447e0f8
|
4
|
+
data.tar.gz: f7937ba79296964dbfb142c3655e8c0c2c6f97745c10c40fcb3b3eec2b2390d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68a637fbf28997b2fff0d961f1d8c6b5ffb6dcd8b32824bc25753a913429ba168e94261c3c9706ad1f2edeb786926c3626c91912c4b14976e34013f7e1bb419d
|
7
|
+
data.tar.gz: 291c8293ee1e81b577ac96e25fbcb497c6438c9a1d6c4411f7e91e073dfbf3d77847115cf0621a9c0c279f0d20bd259eed148e81375551c6fa6f5540c4fa6e9e
|
@@ -36,11 +36,12 @@ module Proxy::Phpipam
|
|
36
36
|
phpipam_client = PhpipamClient.new
|
37
37
|
subnet = JSON.parse(phpipam_client.get_subnet(cidr, section_name))
|
38
38
|
|
39
|
-
return {:code => subnet['code'], :error => subnet['
|
39
|
+
return {:code => subnet['code'], :error => subnet['error']}.to_json if no_subnets_found?(subnet)
|
40
40
|
|
41
41
|
ipaddr = phpipam_client.get_next_ip(subnet['data']['id'], mac, cidr, section_name)
|
42
|
-
|
43
|
-
|
42
|
+
ipaddr_parsed = JSON.parse(ipaddr)
|
43
|
+
|
44
|
+
return {:code => 404, :error => ipaddr_parsed['error']}.to_json if no_free_ip_found?(ipaddr_parsed)
|
44
45
|
|
45
46
|
ipaddr
|
46
47
|
rescue Errno::ECONNREFUSED, Errno::ECONNRESET
|
@@ -105,7 +106,9 @@ module Proxy::Phpipam
|
|
105
106
|
|
106
107
|
begin
|
107
108
|
phpipam_client = PhpipamClient.new
|
108
|
-
phpipam_client.get_sections
|
109
|
+
sections = phpipam_client.get_sections
|
110
|
+
return {:code => 200, :data => []}.to_json if no_sections_found?(JSON.parse(sections))
|
111
|
+
sections
|
109
112
|
rescue Errno::ECONNREFUSED, Errno::ECONNRESET
|
110
113
|
logger.debug(errors[:no_connection])
|
111
114
|
raise
|
@@ -125,17 +128,18 @@ module Proxy::Phpipam
|
|
125
128
|
# {"code":404,"error":"Not Found"}
|
126
129
|
# Response if :error =>
|
127
130
|
# {"error":"Unable to connect to phpIPAM server"}
|
128
|
-
get '/groups/:
|
131
|
+
get '/groups/:group' do
|
129
132
|
content_type :json
|
130
133
|
|
131
134
|
begin
|
132
|
-
err = validate_required_params(["
|
135
|
+
err = validate_required_params(["group"], params)
|
133
136
|
return err if err.length > 0
|
134
137
|
|
135
138
|
phpipam_client = PhpipamClient.new
|
136
|
-
section = JSON.parse(phpipam_client.get_section(params[:
|
139
|
+
section = JSON.parse(phpipam_client.get_section(params[:group]))
|
137
140
|
|
138
|
-
return {:code => section['code'], :error => section['message']}.to_json if no_section_found(section)
|
141
|
+
return {:code => section['code'], :error => section['message']}.to_json if no_section_found?(section)
|
142
|
+
puts "SECTION: " + section.to_json
|
139
143
|
section.to_json
|
140
144
|
rescue Errno::ECONNREFUSED, Errno::ECONNRESET
|
141
145
|
logger.debug(errors[:no_connection])
|
@@ -198,19 +202,19 @@ module Proxy::Phpipam
|
|
198
202
|
# }
|
199
203
|
# Response if :error =>
|
200
204
|
# {"error":"Unable to connect to External IPAM server"}
|
201
|
-
get '/groups/:
|
205
|
+
get '/groups/:group/subnets' do
|
202
206
|
content_type :json
|
203
207
|
|
204
208
|
begin
|
205
|
-
err = validate_required_params(["
|
209
|
+
err = validate_required_params(["group"], params)
|
206
210
|
return err if err.length > 0
|
207
211
|
|
208
212
|
phpipam_client = PhpipamClient.new
|
209
|
-
section = JSON.parse(phpipam_client.get_section(params[:
|
213
|
+
section = JSON.parse(phpipam_client.get_section(params[:group]))
|
210
214
|
|
211
|
-
return {:code =>
|
215
|
+
return {:code => 404, :error => errors[:no_section]}.to_json if no_section_found?(section)
|
212
216
|
|
213
|
-
phpipam_client.get_subnets(section['data']['id'].to_s)
|
217
|
+
phpipam_client.get_subnets(section['data']['id'].to_s, false)
|
214
218
|
rescue Errno::ECONNREFUSED, Errno::ECONNRESET
|
215
219
|
logger.debug(errors[:no_connection])
|
216
220
|
raise
|
@@ -243,9 +247,15 @@ module Proxy::Phpipam
|
|
243
247
|
phpipam_client = PhpipamClient.new
|
244
248
|
subnet = JSON.parse(phpipam_client.get_subnet(cidr, section_name))
|
245
249
|
|
246
|
-
return {:code =>
|
250
|
+
return {:code => 404, :error => subnet['error']}.to_json if no_subnets_found?(subnet)
|
251
|
+
|
252
|
+
ip_exists = JSON.parse(phpipam_client.ip_exists(ip, subnet['data']['id']))
|
247
253
|
|
248
|
-
|
254
|
+
if ip_exists['data']
|
255
|
+
return {:code => 200, :exists => true}.to_json
|
256
|
+
else
|
257
|
+
return {:code => 404, :exists => false}.to_json
|
258
|
+
end
|
249
259
|
rescue Errno::ECONNREFUSED, Errno::ECONNRESET
|
250
260
|
logger.debug(errors[:no_connection])
|
251
261
|
raise
|
@@ -280,9 +290,15 @@ module Proxy::Phpipam
|
|
280
290
|
phpipam_client = PhpipamClient.new
|
281
291
|
subnet = JSON.parse(phpipam_client.get_subnet(cidr, section_name))
|
282
292
|
|
283
|
-
return {:code =>
|
293
|
+
return {:code => 404, :error => subnet['error']}.to_json if no_subnets_found?(subnet)
|
284
294
|
|
285
|
-
phpipam_client.add_ip_to_subnet(ip, subnet['data']['id'], 'Address auto added by Foreman')
|
295
|
+
add_ip = JSON.parse(phpipam_client.add_ip_to_subnet(ip, subnet['data']['id'], 'Address auto added by Foreman'))
|
296
|
+
|
297
|
+
if add_ip['message'] && add_ip['message'] == "Address created"
|
298
|
+
return {:code => 200}.to_json
|
299
|
+
else
|
300
|
+
return {:code => 500, :error => add_ip['message']}.to_json
|
301
|
+
end
|
286
302
|
rescue Errno::ECONNREFUSED, Errno::ECONNRESET
|
287
303
|
logger.debug(errors[:no_connection])
|
288
304
|
raise
|
@@ -314,9 +330,15 @@ module Proxy::Phpipam
|
|
314
330
|
phpipam_client = PhpipamClient.new
|
315
331
|
subnet = JSON.parse(phpipam_client.get_subnet(cidr, section_name))
|
316
332
|
|
317
|
-
return {:code =>
|
333
|
+
return {:code => 404, :error => subnet['error']}.to_json if no_subnets_found?(subnet)
|
334
|
+
|
335
|
+
delete_ip = JSON.parse(phpipam_client.delete_ip_from_subnet(ip, subnet['data']['id']))
|
318
336
|
|
319
|
-
|
337
|
+
if delete_ip['message'] && delete_ip['message'] == "Address deleted"
|
338
|
+
return {:code => 200}.to_json
|
339
|
+
else
|
340
|
+
return {:code => 500, :error => delete_ip['message']}.to_json
|
341
|
+
end
|
320
342
|
rescue Errno::ECONNREFUSED, Errno::ECONNRESET
|
321
343
|
logger.debug(errors[:no_connection])
|
322
344
|
raise
|
@@ -36,9 +36,9 @@ module Proxy::Phpipam
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
def get_subnet_by_section(cidr, section_name)
|
39
|
+
def get_subnet_by_section(cidr, section_name, include_id = true)
|
40
40
|
section = JSON.parse(get_section(section_name))
|
41
|
-
subnets = JSON.parse(get_subnets(section['data']['id']))
|
41
|
+
subnets = JSON.parse(get_subnets(section['data']['id'], include_id))
|
42
42
|
subnet_id = nil
|
43
43
|
|
44
44
|
subnets['data'].each do |subnet|
|
@@ -49,14 +49,19 @@ module Proxy::Phpipam
|
|
49
49
|
return {:code => 404, :error => "No subnet #{cidr} found in section #{URI.unescape(section_name)}"}.to_json if subnet_id.nil?
|
50
50
|
|
51
51
|
response = get("subnets/#{subnet_id.to_s}/")
|
52
|
+
json_body = JSON.parse(response.body)
|
53
|
+
json_body['data'] = filter_hash(json_body['data'], [:id, :subnet, :mask, :description]) if json_body['data']
|
54
|
+
json_body = filter_hash(json_body, [:code, :data, :error, :message])
|
55
|
+
response.body = json_body.to_json
|
56
|
+
response.header['Content-Length'] = json_body.to_s.length
|
52
57
|
response.body
|
53
58
|
end
|
54
59
|
|
55
60
|
def get_subnet_by_cidr(cidr)
|
56
61
|
response = get("subnets/cidr/#{cidr.to_s}")
|
57
62
|
json_body = JSON.parse(response.body)
|
58
|
-
return response.body if no_subnets_found(json_body)
|
59
63
|
json_body['data'] = filter_fields(json_body, [:id, :subnet, :description, :mask])[0]
|
64
|
+
json_body = filter_hash(json_body, [:code, :data, :error, :message])
|
60
65
|
response.body = json_body.to_json
|
61
66
|
response.header['Content-Length'] = json_body.to_s.length
|
62
67
|
response.body
|
@@ -64,22 +69,31 @@ module Proxy::Phpipam
|
|
64
69
|
|
65
70
|
def get_section(section_name)
|
66
71
|
response = get("sections/#{section_name}/")
|
72
|
+
json_body = JSON.parse(response.body)
|
73
|
+
json_body['data'] = filter_hash(json_body['data'], [:id, :name, :description]) if json_body['data']
|
74
|
+
json_body = filter_hash(json_body, [:code, :data, :error, :message])
|
75
|
+
response.body = json_body.to_json
|
76
|
+
response.header['Content-Length'] = json_body.to_s.length
|
67
77
|
response.body
|
68
78
|
end
|
69
79
|
|
70
80
|
def get_sections
|
71
81
|
response = get('sections/')
|
72
82
|
json_body = JSON.parse(response.body)
|
73
|
-
json_body['data'] = filter_fields(json_body, [:id, :name, :description])
|
83
|
+
json_body['data'] = filter_fields(json_body, [:id, :name, :description]) if json_body['data']
|
84
|
+
json_body = filter_hash(json_body, [:code, :data, :error, :message])
|
74
85
|
response.body = json_body.to_json
|
75
86
|
response.header['Content-Length'] = json_body.to_s.length
|
76
87
|
response.body
|
77
88
|
end
|
78
89
|
|
79
|
-
def get_subnets(section_id)
|
90
|
+
def get_subnets(section_id, include_id = true)
|
80
91
|
response = get("sections/#{section_id}/subnets/")
|
92
|
+
fields = [:subnet, :mask, :description]
|
93
|
+
fields.push(:id) if include_id
|
81
94
|
json_body = JSON.parse(response.body)
|
82
|
-
json_body['data'] = filter_fields(json_body,
|
95
|
+
json_body['data'] = filter_fields(json_body, fields) if json_body['data']
|
96
|
+
json_body = filter_hash(json_body, [:code, :data, :error, :message])
|
83
97
|
response.body = json_body.to_json
|
84
98
|
response.header['Content-Length'] = json_body.to_s.length
|
85
99
|
response.body
|
@@ -87,17 +101,30 @@ module Proxy::Phpipam
|
|
87
101
|
|
88
102
|
def ip_exists(ip, subnet_id)
|
89
103
|
response = get("subnets/#{subnet_id.to_s}/addresses/#{ip}/")
|
104
|
+
json_body = JSON.parse(response.body)
|
105
|
+
json_body['data'] = filter_fields(json_body, [:ip]) if json_body['data']
|
106
|
+
json_body = filter_hash(json_body, [:code, :data, :error, :message])
|
107
|
+
response.body = json_body.to_json
|
108
|
+
response.header['Content-Length'] = json_body.to_s.length
|
90
109
|
response.body
|
91
110
|
end
|
92
111
|
|
93
112
|
def add_ip_to_subnet(ip, subnet_id, desc)
|
94
113
|
data = {:subnetId => subnet_id, :ip => ip, :description => desc}
|
95
114
|
response = post('addresses/', data)
|
115
|
+
json_body = JSON.parse(response.body)
|
116
|
+
json_body = filter_hash(json_body, [:code, :error, :message])
|
117
|
+
response.body = json_body.to_json
|
118
|
+
response.header['Content-Length'] = json_body.to_s.length
|
96
119
|
response.body
|
97
120
|
end
|
98
121
|
|
99
122
|
def delete_ip_from_subnet(ip, subnet_id)
|
100
123
|
response = delete("addresses/#{ip}/#{subnet_id.to_s}/")
|
124
|
+
json_body = JSON.parse(response.body)
|
125
|
+
json_body = filter_hash(json_body, [:code, :error, :message])
|
126
|
+
response.body = json_body.to_json
|
127
|
+
response.header['Content-Length'] = json_body.to_s.length
|
101
128
|
response.body
|
102
129
|
end
|
103
130
|
|
@@ -130,6 +157,8 @@ module Proxy::Phpipam
|
|
130
157
|
json_body['data'] = next_ip
|
131
158
|
end
|
132
159
|
|
160
|
+
json_body = {:code => json_body['code'], :data => json_body['data']}
|
161
|
+
|
133
162
|
response.body = json_body.to_json
|
134
163
|
response.header['Content-Length'] = json_body.to_s.length
|
135
164
|
response.body
|
@@ -223,7 +252,7 @@ module Proxy::Phpipam
|
|
223
252
|
verify_ip = JSON.parse(ip_exists(new_ip, subnet_id))
|
224
253
|
|
225
254
|
# If new IP doesn't exist in IPAM and not in the cache
|
226
|
-
if ip_not_found_in_ipam(verify_ip) && !ip_exists_in_cache(new_ip, cidr, mac, section_name)
|
255
|
+
if ip_not_found_in_ipam?(verify_ip) && !ip_exists_in_cache(new_ip, cidr, mac, section_name)
|
227
256
|
found_ip = new_ip.to_s
|
228
257
|
add_ip_to_cache(found_ip, mac, cidr, section_name)
|
229
258
|
break
|
@@ -9,19 +9,23 @@ module PhpipamHelper
|
|
9
9
|
err.length == 0 ? [] : {:code => 400, :error => err}.to_json
|
10
10
|
end
|
11
11
|
|
12
|
-
def no_subnets_found(subnet)
|
13
|
-
subnet['
|
12
|
+
def no_subnets_found?(subnet)
|
13
|
+
subnet['error'] && subnet['error'].downcase == "no subnets found"
|
14
14
|
end
|
15
15
|
|
16
|
-
def no_section_found(section)
|
16
|
+
def no_section_found?(section)
|
17
17
|
section['message'] && section['message'].downcase == "not found"
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
21
|
-
|
20
|
+
def no_sections_found?(sections)
|
21
|
+
sections['message'] && sections['message'].downcase == "no sections available"
|
22
22
|
end
|
23
23
|
|
24
|
-
def
|
24
|
+
def no_free_ip_found?(ip)
|
25
|
+
ip['error'] && ip['error'].downcase == "no free addresses found"
|
26
|
+
end
|
27
|
+
|
28
|
+
def ip_not_found_in_ipam?(ip)
|
25
29
|
ip && ip['message'] && ip['message'].downcase == 'no addresses found'
|
26
30
|
end
|
27
31
|
|
@@ -36,13 +40,23 @@ module PhpipamHelper
|
|
36
40
|
data
|
37
41
|
end
|
38
42
|
|
43
|
+
# Returns a hash with only the fields given in the fields param
|
44
|
+
def filter_hash(hash, fields)
|
45
|
+
new_hash = {}
|
46
|
+
fields.each do |field|
|
47
|
+
new_hash[field.to_sym] = hash[field.to_s] if hash[field.to_s]
|
48
|
+
end
|
49
|
+
new_hash
|
50
|
+
end
|
51
|
+
|
39
52
|
def errors
|
40
53
|
{
|
41
54
|
:cidr => "A 'cidr' parameter for the subnet must be provided(e.g. IPv4: 100.10.10.0/24, IPv6: 2001:db8:abcd:12::/124)",
|
42
55
|
:mac => "A 'mac' address must be provided(e.g. 00:0a:95:9d:68:10)",
|
43
56
|
:ip => "Missing 'ip' parameter. An IPv4 or IPv6 address must be provided(e.g. IPv4: 100.10.10.22, IPv6: 2001:db8:abcd:12::3)",
|
44
57
|
:section_name => "A 'section_name' must be provided",
|
45
|
-
:no_connection => "Unable to connect to External IPAM server"
|
58
|
+
:no_connection => "Unable to connect to External IPAM server",
|
59
|
+
:no_section => "Group not found in External IPAM"
|
46
60
|
}
|
47
61
|
end
|
48
62
|
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.
|
4
|
+
version: 0.0.18
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher Smith
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-02-
|
11
|
+
date: 2020-02-24 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
|