smart_proxy_ipam 0.0.3 → 0.0.4
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/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
|