smart_proxy_ipam 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/smart_proxy_ipam.rb +0 -1
- data/lib/smart_proxy_ipam/ipam.rb +2 -2
- data/lib/smart_proxy_ipam/ipam_main.rb +2 -2
- data/lib/smart_proxy_ipam/phpipam/phpipam_api.rb +31 -20
- data/lib/smart_proxy_ipam/phpipam/phpipam_client.rb +29 -27
- data/lib/smart_proxy_ipam/version.rb +2 -2
- 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: cf80d5537986cfb15d05ac927e2c0498a9cdcab10c98866dab18b4ead3a91131
|
4
|
+
data.tar.gz: 57d175cf91379394aae2f6ba477d0c89a84b4774363e9e391bc473fa9454bc5f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 47f2404f8982398568a8d6d1984116658e7dd9eead7679f836c74bef9772bab678b084b82cdddfbfcc8d6b6b19adf3962510c5b566c0f7a1b80d53b9e9505da8
|
7
|
+
data.tar.gz: e3dc74e8020a7af4c7f660ef7204c03130088a58dd5fff23a0d18440061d3f602182f6a13f0a1d363429ad860499ce87ab33f71fa524a7f10f8006075f469e44
|
data/lib/smart_proxy_ipam.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
|
2
|
-
module Proxy::
|
2
|
+
module Proxy::Ipam
|
3
3
|
class NotFound < RuntimeError; end
|
4
4
|
|
5
5
|
class Plugin < ::Proxy::Plugin
|
6
|
-
plugin 'external_ipam', Proxy::
|
6
|
+
plugin 'external_ipam', Proxy::Ipam::VERSION
|
7
7
|
|
8
8
|
http_rackup_path File.expand_path('ipam_http_config.ru', File.expand_path('../', __FILE__))
|
9
9
|
https_rackup_path File.expand_path('ipam_http_config.ru', File.expand_path('../', __FILE__))
|
@@ -13,26 +13,27 @@ module Proxy::Phpipam
|
|
13
13
|
|
14
14
|
begin
|
15
15
|
cidr = params[:cidr]
|
16
|
-
|
16
|
+
|
17
17
|
if not cidr
|
18
18
|
return {error: "A 'cidr' parameter for the subnet must be provided(e.g. 100.10.10.0/24)"}.to_json
|
19
19
|
end
|
20
20
|
|
21
|
-
|
21
|
+
phpipam_client = PhpipamClient.new
|
22
|
+
response = phpipam_client.get_subnet(cidr)
|
22
23
|
|
23
24
|
if response['message'] && response['message'].downcase == "no subnets found"
|
24
25
|
return {error: "The specified subnet does not exist in phpIPAM."}.to_json
|
25
26
|
end
|
26
27
|
|
27
28
|
subnet_id = response['data'][0]['id']
|
28
|
-
response =
|
29
|
+
response = phpipam_client.get_next_ip(subnet_id)
|
29
30
|
|
30
31
|
if response['message'] && response['message'].downcase == "no free addresses found"
|
31
32
|
return {error: "There are no more free addresses in subnet #{cidr}"}.to_json
|
32
33
|
end
|
33
34
|
|
34
35
|
{cidr: cidr, next_ip: response['data']}.to_json
|
35
|
-
rescue Errno::ECONNREFUSED
|
36
|
+
rescue Errno::ECONNREFUSED
|
36
37
|
return {error: "Unable to connect to phpIPAM server"}.to_json
|
37
38
|
end
|
38
39
|
end
|
@@ -43,9 +44,14 @@ module Proxy::Phpipam
|
|
43
44
|
begin
|
44
45
|
cidr = params[:cidr]
|
45
46
|
|
46
|
-
|
47
|
+
if not cidr
|
48
|
+
return {error: "A 'cidr' parameter for the subnet must be provided(e.g. 100.10.10.0/24)"}.to_json
|
49
|
+
end
|
50
|
+
|
51
|
+
phpipam_client = PhpipamClient.new
|
52
|
+
subnet = phpipam_client.get_subnet(cidr)
|
47
53
|
subnet.to_json
|
48
|
-
rescue Errno::ECONNREFUSED
|
54
|
+
rescue Errno::ECONNREFUSED
|
49
55
|
return {error: "Unable to connect to phpIPAM server"}.to_json
|
50
56
|
end
|
51
57
|
end
|
@@ -54,9 +60,10 @@ module Proxy::Phpipam
|
|
54
60
|
content_type :json
|
55
61
|
|
56
62
|
begin
|
57
|
-
|
63
|
+
phpipam_client = PhpipamClient.new
|
64
|
+
sections = phpipam_client.get_sections
|
58
65
|
sections.to_json
|
59
|
-
rescue Errno::ECONNREFUSED
|
66
|
+
rescue Errno::ECONNREFUSED
|
60
67
|
return {error: "Unable to connect to phpIPAM server"}.to_json
|
61
68
|
end
|
62
69
|
end
|
@@ -71,9 +78,10 @@ module Proxy::Phpipam
|
|
71
78
|
return {error: "A 'section_id' must be provided"}.to_json
|
72
79
|
end
|
73
80
|
|
74
|
-
|
81
|
+
phpipam_client = PhpipamClient.new
|
82
|
+
subnets = phpipam_client.get_subnets(section_id)
|
75
83
|
subnets.to_json
|
76
|
-
rescue Errno::ECONNREFUSED
|
84
|
+
rescue Errno::ECONNREFUSED
|
77
85
|
return {error: "Unable to connect to phpIPAM server"}.to_json
|
78
86
|
end
|
79
87
|
end
|
@@ -88,14 +96,15 @@ module Proxy::Phpipam
|
|
88
96
|
return {error: "Missing 'cidr' parameter. A CIDR IPv4 address must be provided(e.g. 100.10.10.0/24)"}.to_json if not cidr
|
89
97
|
return {error: "Missing 'ip' parameter. An IPv4 address must be provided(e.g. 100.10.10.22)"}.to_json if not ip
|
90
98
|
|
91
|
-
|
99
|
+
phpipam_client = PhpipamClient.new
|
100
|
+
subnet = phpipam_client.get_subnet(cidr)
|
92
101
|
|
93
102
|
if subnet['message'] && subnet['message'].downcase == "no subnets found"
|
94
103
|
return {error: "The specified subnet does not exist in phpIPAM."}.to_json
|
95
104
|
end
|
96
105
|
|
97
106
|
subnet_id = subnet['data'][0]['id']
|
98
|
-
usage =
|
107
|
+
usage = phpipam_client.get_subnet_usage(subnet_id)
|
99
108
|
|
100
109
|
# We need to check subnet usage first in the case there are zero ips in the subnet. Checking
|
101
110
|
# the ip existence on an empty subnet returns a malformed response from phpIPAM, containing
|
@@ -103,7 +112,7 @@ module Proxy::Phpipam
|
|
103
112
|
if usage['data']['used'] == "0"
|
104
113
|
return {ip: ip, exists: false}.to_json
|
105
114
|
else
|
106
|
-
response =
|
115
|
+
response = phpipam_client.ip_exists(ip, subnet_id)
|
107
116
|
|
108
117
|
if response && response['message'] && response['message'].downcase == 'no addresses found'
|
109
118
|
return {ip: ip, exists: false}.to_json
|
@@ -111,7 +120,7 @@ module Proxy::Phpipam
|
|
111
120
|
return {ip: ip, exists: true}.to_json
|
112
121
|
end
|
113
122
|
end
|
114
|
-
rescue Errno::ECONNREFUSED
|
123
|
+
rescue Errno::ECONNREFUSED
|
115
124
|
return {error: "Unable to connect to phpIPAM server"}.to_json
|
116
125
|
end
|
117
126
|
end
|
@@ -126,7 +135,8 @@ module Proxy::Phpipam
|
|
126
135
|
return {error: "Missing 'cidr' parameter. A CIDR IPv4 address must be provided(e.g. 100.10.10.0/24)"}.to_json if not cidr
|
127
136
|
return {error: "Missing 'ip' parameter. An IPv4 address must be provided(e.g. 100.10.10.22)"}.to_json if not ip
|
128
137
|
|
129
|
-
|
138
|
+
phpipam_client = PhpipamClient.new
|
139
|
+
response = phpipam_client.get_subnet(cidr)
|
130
140
|
|
131
141
|
if response['message'] && response['message'].downcase == "no subnets found"
|
132
142
|
return {error: "The specified subnet does not exist in phpIPAM."}.to_json
|
@@ -134,10 +144,10 @@ module Proxy::Phpipam
|
|
134
144
|
|
135
145
|
subnet_id = response['data'][0]['id']
|
136
146
|
|
137
|
-
|
147
|
+
phpipam_client.add_ip_to_subnet(ip, subnet_id, 'Address auto added by Foreman')
|
138
148
|
|
139
149
|
{message: "IP #{ip} added to subnet #{cidr} successfully."}.to_json
|
140
|
-
rescue Errno::ECONNREFUSED
|
150
|
+
rescue Errno::ECONNREFUSED
|
141
151
|
return {error: "Unable to connect to phpIPAM server"}.to_json
|
142
152
|
end
|
143
153
|
end
|
@@ -152,7 +162,8 @@ module Proxy::Phpipam
|
|
152
162
|
return {error: "Missing 'cidr' parameter. A CIDR IPv4 address must be provided(e.g. 100.10.10.0/24)"}.to_json if not cidr
|
153
163
|
return {error: "Missing 'ip' parameter. An IPv4 address must be provided(e.g. 100.10.10.22)"}.to_json if not ip
|
154
164
|
|
155
|
-
|
165
|
+
phpipam_client = PhpipamClient.new
|
166
|
+
response = phpipam_client.get_subnet(cidr)
|
156
167
|
|
157
168
|
if response['message'] && response['message'].downcase == "no subnets found"
|
158
169
|
return {error: "The specified subnet does not exist in phpIPAM."}.to_json
|
@@ -160,10 +171,10 @@ module Proxy::Phpipam
|
|
160
171
|
|
161
172
|
subnet_id = response['data'][0]['id']
|
162
173
|
|
163
|
-
|
174
|
+
phpipam_client.delete_ip_from_subnet(ip, subnet_id)
|
164
175
|
|
165
176
|
{message: "IP #{ip} deleted from subnet #{cidr} successfully."}.to_json
|
166
|
-
rescue Errno::ECONNREFUSED
|
177
|
+
rescue Errno::ECONNREFUSED
|
167
178
|
return {error: "Unable to connect to phpIPAM server"}.to_json
|
168
179
|
end
|
169
180
|
end
|
@@ -7,50 +7,52 @@ require 'smart_proxy_ipam/ipam_main'
|
|
7
7
|
|
8
8
|
module Proxy::Phpipam
|
9
9
|
class PhpipamClient
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
def initialize
|
11
|
+
conf = Proxy::Ipam.get_config[:phpipam]
|
12
|
+
@phpipam_config = {url: conf[:url], user: conf[:user], password: conf[:password]}
|
13
|
+
@api_base = conf[:url] + '/api/' + conf[:user] + '/'
|
14
|
+
@token = nil
|
15
|
+
end
|
14
16
|
|
15
|
-
def
|
17
|
+
def get_subnet(cidr)
|
16
18
|
url = 'subnets/cidr/' + cidr.to_s + '/'
|
17
|
-
|
19
|
+
get(url)
|
18
20
|
end
|
19
21
|
|
20
|
-
def
|
22
|
+
def get_next_ip(subnet_id)
|
21
23
|
url = 'subnets/' + subnet_id.to_s + '/first_free/'
|
22
|
-
|
24
|
+
get(url)
|
23
25
|
end
|
24
26
|
|
25
|
-
def
|
27
|
+
def add_ip_to_subnet(ip, subnet_id, desc)
|
26
28
|
data = {'subnetId': subnet_id, 'ip': ip, 'description': desc}
|
27
|
-
|
29
|
+
post('addresses/', data)
|
28
30
|
end
|
29
31
|
|
30
|
-
def
|
31
|
-
|
32
|
+
def get_sections
|
33
|
+
get('sections/')['data']
|
32
34
|
end
|
33
35
|
|
34
|
-
def
|
35
|
-
|
36
|
+
def get_subnets(section_id)
|
37
|
+
get('sections/' + section_id.to_s + '/subnets/')
|
36
38
|
end
|
37
39
|
|
38
|
-
def
|
39
|
-
|
40
|
+
def ip_exists(ip, subnet_id)
|
41
|
+
get('subnets/' + subnet_id.to_s + '/addresses/' + ip + '/')
|
40
42
|
end
|
41
43
|
|
42
|
-
def
|
43
|
-
|
44
|
+
def get_subnet_usage(subnet_id)
|
45
|
+
get('subnets/' + subnet_id.to_s + '/usage/')
|
44
46
|
end
|
45
47
|
|
46
|
-
def
|
47
|
-
|
48
|
+
def delete_ip_from_subnet(ip, subnet_id)
|
49
|
+
delete('addresses/' + ip + '/' + subnet_id.to_s + '/')
|
48
50
|
end
|
49
51
|
|
50
52
|
private
|
51
53
|
|
52
|
-
def
|
53
|
-
|
54
|
+
def get(path, body=nil)
|
55
|
+
authenticate
|
54
56
|
uri = URI(@api_base + path)
|
55
57
|
uri.query = URI.encode_www_form(body) if body
|
56
58
|
request = Net::HTTP::Get.new(uri)
|
@@ -63,8 +65,8 @@ module Proxy::Phpipam
|
|
63
65
|
JSON.parse(response.body)
|
64
66
|
end
|
65
67
|
|
66
|
-
def
|
67
|
-
|
68
|
+
def delete(path, body=nil)
|
69
|
+
authenticate
|
68
70
|
uri = URI(@api_base + path)
|
69
71
|
uri.query = URI.encode_www_form(body) if body
|
70
72
|
request = Net::HTTP::Delete.new(uri)
|
@@ -77,8 +79,8 @@ module Proxy::Phpipam
|
|
77
79
|
JSON.parse(response.body)
|
78
80
|
end
|
79
81
|
|
80
|
-
def
|
81
|
-
|
82
|
+
def post(path, body=nil)
|
83
|
+
authenticate
|
82
84
|
uri = URI(@api_base + path)
|
83
85
|
uri.query = URI.encode_www_form(body) if body
|
84
86
|
request = Net::HTTP::Post.new(uri)
|
@@ -91,7 +93,7 @@ module Proxy::Phpipam
|
|
91
93
|
JSON.parse(response.body)
|
92
94
|
end
|
93
95
|
|
94
|
-
def
|
96
|
+
def authenticate
|
95
97
|
auth_uri = URI(@api_base + '/user/')
|
96
98
|
request = Net::HTTP::Post.new(auth_uri)
|
97
99
|
request.basic_auth @phpipam_config[:user], @phpipam_config[:password]
|
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.4
|
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-06-
|
11
|
+
date: 2019-06-12 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
|