smart_proxy_dhcp_bluecat 0.1.0 → 0.1.5

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.
@@ -1,109 +1,128 @@
1
- require 'dhcp_common/server'
2
-
3
- module Proxy::DHCP::BlueCat
4
- class Provider < ::Proxy::DHCP::Server
5
- include Proxy::Log
6
- include Proxy::Util
7
-
8
- attr_reader :connection
9
- def initialize(connection, managed_subnets)
10
- @connection = connection
11
- @managed_subnets = managed_subnets
12
- super('bluecat', managed_subnets, nil)
13
- end
14
-
15
- def subnets
16
- logger.debug('START subnets')
17
- subnets = @connection.get_subnets
18
- logger.debug('END subnets')
19
- logger.debug('Returned: ' + subnets.class.to_s + ': ' + subnets.to_s)
20
- subnets
21
- end
22
-
23
- def all_hosts(network_address)
24
- logger.debug('START all_hosts with network_address: ' + network_address.to_s)
25
- hosts = @connection.get_hosts(network_address)
26
- logger.debug('END all_hosts with network_address: ' + network_address.to_s)
27
- logger.debug('Returned: ' + hosts.class.to_s + ': ' + hosts.to_s)
28
- hosts
29
- end
30
-
31
- def all_leases(network_address)
32
- logger.debug('START all_leases with network_address: ' + network_address.to_s)
33
- hosts = @connection.get_hosts(network_address)
34
- logger.debug('END all_leases with network_address: ' + network_address.to_s)
35
- logger.debug('Returned: ' + hosts.class.to_s + ': ' + hosts.to_s)
36
- hosts
37
- end
38
-
39
- def unused_ip(subnet, mac_address, from_ip_address, to_ip_address)
40
- logger.debug('START unused_ip with subnet: ' + subnet.to_s + ' mac_address: ' + mac_address.to_s + ' from_ip_address: ' + from_ip_address.to_s + ' to_ip_address: ' + to_ip_address.to_s)
41
- ip = @connection.get_next_ip(subnet, from_ip_address, to_ip_address)
42
- logger.debug('END unused_ip with subnet: ' + subnet.to_s + ' mac_address: ' + mac_address.to_s + ' from_ip_address: ' + from_ip_address.to_s + ' to_ip_address: ' + to_ip_address.to_s)
43
- logger.debug('Returned: ' + ip.class.to_s + ': ' + ip.to_s)
44
- ip
45
- end
46
-
47
- def find_record(subnet_address, address)
48
- logger.debug('START find_record with subnet_address: ' + subnet_address.to_s + ' address: ' + address.to_s)
49
- records = if IPAddress.valid?(address)
50
- find_records_by_ip(subnet_address, address)
51
- else
52
- find_record_by_mac(subnet_address, address)
53
- end
54
- logger.debug('END find_record with subnet_address: ' + subnet_address.to_s + ' address: ' + address.to_s)
55
- logger.debug('Returned: ' + records.class.to_s + ': ' + records.to_s)
56
- return [] if records.nil?
57
- records
58
- end
59
-
60
- def find_records_by_ip(subnet_address, ip)
61
- logger.debug('START find_records_by_ip with subnet_address: ' + subnet_address.to_s + ' ip: ' + ip.to_s)
62
- records = @connection.get_hosts_by_ip(ip)
63
- logger.debug('END find_records_by_ip with subnet_address: ' + subnet_address.to_s + ' ip: ' + ip.to_s)
64
- logger.debug('Returned: ' + records.class.to_s + ': ' + records.to_s)
65
- return [] if records.nil?
66
- records
67
- end
68
-
69
- def find_record_by_mac(subnet_address, mac_address)
70
- logger.debug('START find_record_by_mac with subnet_address: ' + subnet_address.to_s + ' mac_address: ' + mac_address.to_s)
71
- record = @connection.get_host_by_mac(mac_address)
72
- logger.debug('END find_record_by_mac with subnet_address: ' + subnet_address.to_s + ' mac_address: ' + mac_address.to_s)
73
- logger.debug('Returned: ' + record.class.to_s + ': ' + record.to_s)
74
- record
75
- end
76
-
77
- def find_subnet(subnet_address)
78
- logger.debug('START find_subnet with subnet_address: ' + subnet_address.to_s)
79
- net = @connection.find_mysubnet(subnet_address)
80
- logger.debug('END find_subnet with subnet_address: ' + subnet_address.to_s)
81
- logger.debug('Returned: ' + net.class.to_s + ': ' + net.to_s)
82
- net
83
- end
84
-
85
- def get_subnet(subnet_address)
86
- logger.debug('START get_subnet with subnet_address: ' + subnet_address.to_s)
87
- net = @connection.find_mysubnet(subnet_address)
88
- logger.debug('END get_subnet with subnet_address: ' + subnet_address.to_s)
89
- logger.debug('Returned: ' + net.class.to_s + ': ' + net.to_s)
90
- net
91
- end
92
-
93
- def add_record(options)
94
- logger.debug('START add_record with options: ' + options.to_s)
95
- @connection.add_host(options)
96
- logger.debug('END add_record with options: ' + options.to_s)
97
- end
98
-
99
- def del_record(record)
100
- logger.debug('START del_record with record: ' + record.to_s)
101
- if record.empty?
102
- logger.debug('record empty, nothing to do')
103
- else
104
- @connection.remove_host(record.ip)
105
- end
106
- logger.debug('END del_record with record: ' + record.to_s)
107
- end
108
- end
109
- end
1
+ require 'dhcp_common/server'
2
+
3
+ module Proxy
4
+ module DHCP
5
+ module BlueCat
6
+ # this class handles commuincation from foreman
7
+ class Provider < ::Proxy::DHCP::Server
8
+ include Proxy::Log
9
+ include Proxy::Util
10
+
11
+ attr_reader :connection
12
+ def initialize(connection, managed_subnets)
13
+ @connection = connection
14
+ @managed_subnets = managed_subnets
15
+ super('bluecat', managed_subnets, nil)
16
+ end
17
+
18
+ # returns all subnets
19
+ def subnets
20
+ logger.debug('START subnets')
21
+ subnets = @connection.subnets
22
+ logger.debug('END subnets')
23
+ logger.debug('Returned: ' + subnets.class.to_s + ': ' + subnets.to_s)
24
+ subnets
25
+ end
26
+
27
+ # returns all hosts in a subnet
28
+ # in bluecat leases and hosts are the same
29
+ def all_hosts(network_address)
30
+ logger.debug('START all_hosts with network_address: ' + network_address.to_s)
31
+ hosts = @connection.hosts(network_address)
32
+ logger.debug('END all_hosts with network_address: ' + network_address.to_s)
33
+ logger.debug('Returned: ' + hosts.class.to_s + ': ' + hosts.to_s)
34
+ hosts
35
+ end
36
+
37
+ # returns all leases in a subnet
38
+ # in bluecat leases and hosts are the same
39
+ def all_leases(network_address)
40
+ logger.debug('START all_leases with network_address: ' + network_address.to_s)
41
+ hosts = @connection.hosts(network_address)
42
+ logger.debug('END all_leases with network_address: ' + network_address.to_s)
43
+ logger.debug('Returned: ' + hosts.class.to_s + ': ' + hosts.to_s)
44
+ hosts
45
+ end
46
+
47
+ # returns the next free ip in a subnet
48
+ def unused_ip(subnet, mac_address, from_ip_address, to_ip_address)
49
+ logger.debug('START unused_ip with subnet: ' + subnet.to_s + ' mac_address: ' + mac_address.to_s + ' from_ip_address: ' + from_ip_address.to_s + ' to_ip_address: ' + to_ip_address.to_s)
50
+ ip = @connection.next_ip(subnet, from_ip_address, to_ip_address)
51
+ logger.debug('END unused_ip with subnet: ' + subnet.to_s + ' mac_address: ' + mac_address.to_s + ' from_ip_address: ' + from_ip_address.to_s + ' to_ip_address: ' + to_ip_address.to_s)
52
+ logger.debug('Returned: ' + ip.class.to_s + ': ' + ip.to_s)
53
+ ip
54
+ end
55
+
56
+ # returns a record
57
+ # foreman calls this method with a ip or a mac address
58
+ def find_record(subnet_address, address)
59
+ logger.debug('START find_record with subnet_address: ' + subnet_address.to_s + ' address: ' + address.to_s)
60
+ records = if IPAddress.valid?(address)
61
+ find_records_by_ip(subnet_address, address)
62
+ else
63
+ find_record_by_mac(subnet_address, address)
64
+ end
65
+ logger.debug('END find_record with subnet_address: ' + subnet_address.to_s + ' address: ' + address.to_s)
66
+ logger.debug('Returned: ' + records.class.to_s + ': ' + records.to_s)
67
+ return [] if records.nil?
68
+ records
69
+ end
70
+
71
+ # returns a record based on a ip address
72
+ def find_records_by_ip(subnet_address, ip)
73
+ logger.debug('START find_records_by_ip with subnet_address: ' + subnet_address.to_s + ' ip: ' + ip.to_s)
74
+ records = @connection.hosts_by_ip(ip)
75
+ logger.debug('END find_records_by_ip with subnet_address: ' + subnet_address.to_s + ' ip: ' + ip.to_s)
76
+ logger.debug('Returned: ' + records.class.to_s + ': ' + records.to_s)
77
+ return [] if records.nil?
78
+ records
79
+ end
80
+
81
+ # returns a record based on a mac address
82
+ def find_record_by_mac(subnet_address, mac_address)
83
+ logger.debug('START find_record_by_mac with subnet_address: ' + subnet_address.to_s + ' mac_address: ' + mac_address.to_s)
84
+ record = @connection.host_by_mac(mac_address)
85
+ logger.debug('END find_record_by_mac with subnet_address: ' + subnet_address.to_s + ' mac_address: ' + mac_address.to_s)
86
+ logger.debug('Returned: ' + record.class.to_s + ': ' + record.to_s)
87
+ record
88
+ end
89
+
90
+ # returns a subnet based on a subnet address
91
+ def find_subnet(subnet_address)
92
+ logger.debug('START find_subnet with subnet_address: ' + subnet_address.to_s)
93
+ net = @connection.find_mysubnet(subnet_address)
94
+ logger.debug('END find_subnet with subnet_address: ' + subnet_address.to_s)
95
+ logger.debug('Returned: ' + net.class.to_s + ': ' + net.to_s)
96
+ net
97
+ end
98
+
99
+ # returns a subnet based on a subnet address
100
+ def get_subnet(subnet_address)
101
+ logger.debug('START get_subnet with subnet_address: ' + subnet_address.to_s)
102
+ net = @connection.find_mysubnet(subnet_address)
103
+ logger.debug('END get_subnet with subnet_address: ' + subnet_address.to_s)
104
+ logger.debug('Returned: ' + net.class.to_s + ': ' + net.to_s)
105
+ net
106
+ end
107
+
108
+ # adds a host record
109
+ def add_record(options)
110
+ logger.debug('START add_record with options: ' + options.to_s)
111
+ @connection.add_host(options)
112
+ logger.debug('END add_record with options: ' + options.to_s)
113
+ end
114
+
115
+ # removes a host record
116
+ def del_record(record)
117
+ logger.debug('START del_record with record: ' + record.to_s)
118
+ if record.empty?
119
+ logger.debug('record empty, nothing to do')
120
+ else
121
+ @connection.remove_host(record.ip)
122
+ end
123
+ logger.debug('END del_record with record: ' + record.to_s)
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
@@ -1,34 +1,38 @@
1
- module Proxy::DHCP::BlueCat
2
- class Plugin < ::Proxy::Provider
3
- plugin :dhcp_bluecat, ::Proxy::DHCP::BlueCat::VERSION
4
-
5
- validate_presence :scheme, :verify, :host, :parent_block, :view_name, :config_id, :config_name, :server_id, :username, :password
6
-
7
- requires :dhcp, '>= 1.16'
8
-
9
- load_classes ::Proxy::DHCP::BlueCat::PluginConfiguration
10
- load_dependency_injection_wirings ::Proxy::DHCP::BlueCat::PluginConfiguration
11
-
12
- load_validators scheme_validator: ::Proxy::DHCP::BlueCat::SchemeValidator,
13
- verify_validator: ::Proxy::DHCP::BlueCat::VerifyValidator,
14
- host_validator: ::Proxy::DHCP::BlueCat::HostValidator,
15
- parent_block_validator: ::Proxy::DHCP::BlueCat::ParentBlockValidator,
16
- view_name_validator: ::Proxy::DHCP::BlueCat::ViewNameValidator,
17
- config_id_validator: ::Proxy::DHCP::BlueCat::ConfigIdValidator,
18
- config_name_validator: ::Proxy::DHCP::BlueCat::ConfigNameValidator,
19
- server_id_validator: ::Proxy::DHCP::BlueCat::ServerIdValidator,
20
- username_validator: ::Proxy::DHCP::BlueCat::UsernameValidator,
21
- password_validator: ::Proxy::DHCP::BlueCat::PasswordValidator
22
-
23
- validate :scheme, scheme_validator: true
24
- validate :verify, verify_validator: true
25
- validate :host, host_validator: true
26
- validate :parent_block, parent_block_validator: true
27
- validate :view_name, view_name_validator: true
28
- validate :config_id, config_id_validator: true
29
- validate :config_name, config_name_validator: true
30
- validate :server_id, server_id_validator: true
31
- validate :username, username_validator: true
32
- validate :password, password_validator: true
33
- end
34
- end
1
+ module Proxy
2
+ module DHCP
3
+ module BlueCat
4
+ class Plugin < ::Proxy::Provider
5
+ plugin :dhcp_bluecat, ::Proxy::DHCP::BlueCat::VERSION
6
+
7
+ validate_presence :scheme, :verify, :host, :parent_block, :view_name, :config_id, :config_name, :server_id, :username, :password
8
+
9
+ requires :dhcp, '>= 1.16'
10
+
11
+ load_classes ::Proxy::DHCP::BlueCat::PluginConfiguration
12
+ load_dependency_injection_wirings ::Proxy::DHCP::BlueCat::PluginConfiguration
13
+
14
+ load_validators scheme_validator: ::Proxy::DHCP::BlueCat::SchemeValidator,
15
+ verify_validator: ::Proxy::DHCP::BlueCat::VerifyValidator,
16
+ host_validator: ::Proxy::DHCP::BlueCat::HostValidator,
17
+ parent_block_validator: ::Proxy::DHCP::BlueCat::ParentBlockValidator,
18
+ view_name_validator: ::Proxy::DHCP::BlueCat::ViewNameValidator,
19
+ config_id_validator: ::Proxy::DHCP::BlueCat::ConfigIdValidator,
20
+ config_name_validator: ::Proxy::DHCP::BlueCat::ConfigNameValidator,
21
+ server_id_validator: ::Proxy::DHCP::BlueCat::ServerIdValidator,
22
+ username_validator: ::Proxy::DHCP::BlueCat::UsernameValidator,
23
+ password_validator: ::Proxy::DHCP::BlueCat::PasswordValidator
24
+
25
+ validate :scheme, scheme_validator: true
26
+ validate :verify, verify_validator: true
27
+ validate :host, host_validator: true
28
+ validate :parent_block, parent_block_validator: true
29
+ validate :view_name, view_name_validator: true
30
+ validate :config_id, config_id_validator: true
31
+ validate :config_name, config_name_validator: true
32
+ validate :server_id, server_id_validator: true
33
+ validate :username, username_validator: true
34
+ validate :password, password_validator: true
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,7 +1,7 @@
1
1
  module Proxy
2
2
  module DHCP
3
3
  module BlueCat
4
- VERSION = '0.1.0'.freeze
4
+ VERSION = '0.1.5'.freeze
5
5
  end
6
6
  end
7
7
  end
@@ -1,6 +1,12 @@
1
- class ::Proxy::DHCP::BlueCat::ModuleLoader < ::Proxy::DefaultModuleLoader
2
- def log_provider_settings(settings)
3
- super(settings)
4
- logger.warn('http is used for connection to BlueCat address manager') if settings[:scheme] != 'https'
5
- end
6
- end
1
+ module Proxy
2
+ module DHCP
3
+ module BlueCat
4
+ class ModuleLoader < ::Proxy::DefaultModuleLoader
5
+ def log_provider_settings(settings)
6
+ super(settings)
7
+ logger.warn('http is used for connection to BlueCat address manager') if settings[:scheme] != 'https'
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,33 +1,37 @@
1
- module Proxy::DHCP::BlueCat
2
- class PluginConfiguration
3
- def load_classes
4
- require 'dhcp_common/dhcp_common'
5
- require 'smart_proxy_dhcp_bluecat/bluecat_api'
6
- require 'smart_proxy_dhcp_bluecat/dhcp_bluecat_main'
7
- end
8
-
9
- def load_dependency_injection_wirings(c, settings)
10
- c.dependency :connection, (lambda do
11
- BlueCat.new(
12
- settings[:scheme],
13
- settings[:verify],
14
- settings[:host],
15
- settings[:parent_block],
16
- settings[:view_name],
17
- settings[:config_name],
18
- settings[:config_id],
19
- settings[:server_id],
20
- settings[:username],
21
- settings[:password]
22
- )
23
- end)
24
-
25
- c.dependency :dhcp_provider, (lambda do
26
- ::Proxy::DHCP::BlueCat::Provider.new(
27
- c.get_dependency(:connection),
28
- settings[:subnets]
29
- )
30
- end)
31
- end
32
- end
33
- end
1
+ module Proxy
2
+ module DHCP
3
+ module BlueCat
4
+ class PluginConfiguration
5
+ def load_classes
6
+ require 'dhcp_common/dhcp_common'
7
+ require 'smart_proxy_dhcp_bluecat/bluecat_api'
8
+ require 'smart_proxy_dhcp_bluecat/dhcp_bluecat_main'
9
+ end
10
+
11
+ def load_dependency_injection_wirings(c, settings)
12
+ c.dependency :connection, (lambda do
13
+ ::Proxy::DHCP::BlueCat::BlueCatAPI.new(
14
+ settings[:scheme],
15
+ settings[:verify],
16
+ settings[:host],
17
+ settings[:parent_block],
18
+ settings[:view_name],
19
+ settings[:config_name],
20
+ settings[:config_id],
21
+ settings[:server_id],
22
+ settings[:username],
23
+ settings[:password]
24
+ )
25
+ end)
26
+
27
+ c.dependency :dhcp_provider, (lambda do
28
+ ::Proxy::DHCP::BlueCat::Provider.new(
29
+ c.get_dependency(:connection),
30
+ settings[:subnets]
31
+ )
32
+ end)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,62 +1,66 @@
1
- module ::Proxy::DHCP::BlueCat
2
- class SchemeValidator < ::Proxy::PluginValidators::Base
3
- def validate!(settings)
4
- return true if ['http', 'https'].include?(settings[:scheme])
5
- raise ::Proxy::Error::ConfigurationError, "Setting 'scheme' can be set to either 'http' or 'https'"
6
- end
7
- end
8
- class VerifyValidator < ::Proxy::PluginValidators::Base
9
- def validate!(settings)
10
- return true if [true, false].include?(settings[:verify])
11
- raise ::Proxy::Error::ConfigurationError, "Setting 'verify' can be set to either 'true' or 'false' (bool)"
12
- end
13
- end
14
- class HostValidator < ::Proxy::PluginValidators::Base
15
- def validate!(settings)
16
- return true if ['http', 'https'].include?(settings[:scheme])
17
- raise ::Proxy::Error::ConfigurationError, "Setting 'scheme' can be set to either 'http' or 'https'"
18
- end
19
- end
20
- class ParentBlockValidator < ::Proxy::PluginValidators::Base
21
- def validate!(settings)
22
- return true if settings[:parent_block].is_a?(Integer)
23
- raise ::Proxy::Error::ConfigurationError, "Setting 'parent_block' must be (integer)"
24
- end
25
- end
26
- class ViewNameValidator < ::Proxy::PluginValidators::Base
27
- def validate!(settings)
28
- return true if settings[:view_name].is_a?(String)
29
- raise ::Proxy::Error::ConfigurationError, "Setting 'view_name' must be (string)"
30
- end
31
- end
32
- class ConfigIdValidator < ::Proxy::PluginValidators::Base
33
- def validate!(settings)
34
- return true if settings[:config_id].is_a?(Integer)
35
- raise ::Proxy::Error::ConfigurationError, "Setting 'parent_block' must be (integer)"
36
- end
37
- end
38
- class ConfigNameValidator < ::Proxy::PluginValidators::Base
39
- def validate!(settings)
40
- return true if settings[:config_name].is_a?(String)
41
- raise ::Proxy::Error::ConfigurationError, "Setting 'config_name' must be (string)"
42
- end
43
- end
44
- class ServerIdValidator < ::Proxy::PluginValidators::Base
45
- def validate!(settings)
46
- return true if settings[:server_id].is_a?(Integer)
47
- raise ::Proxy::Error::ConfigurationError, "Setting 'server_id' must be (integer)"
48
- end
49
- end
50
- class UsernameValidator < ::Proxy::PluginValidators::Base
51
- def validate!(settings)
52
- return true if settings[:username].is_a?(String)
53
- raise ::Proxy::Error::ConfigurationError, "Setting 'username' must be (string)"
54
- end
55
- end
56
- class PasswordValidator < ::Proxy::PluginValidators::Base
57
- def validate!(settings)
58
- return true if settings[:password].is_a?(String)
59
- raise ::Proxy::Error::ConfigurationError, "Setting 'password' must be (string)"
60
- end
61
- end
62
- end
1
+ module Proxy
2
+ module DHCP
3
+ module BlueCat
4
+ class SchemeValidator < ::Proxy::PluginValidators::Base
5
+ def validate!(settings)
6
+ return true if ['http', 'https'].include?(settings[:scheme])
7
+ raise ::Proxy::Error::ConfigurationError, "Setting 'scheme' can be set to either 'http' or 'https'"
8
+ end
9
+ end
10
+ class VerifyValidator < ::Proxy::PluginValidators::Base
11
+ def validate!(settings)
12
+ return true if [true, false].include?(settings[:verify])
13
+ raise ::Proxy::Error::ConfigurationError, "Setting 'verify' can be set to either 'true' or 'false' (bool)"
14
+ end
15
+ end
16
+ class HostValidator < ::Proxy::PluginValidators::Base
17
+ def validate!(settings)
18
+ return true if ['http', 'https'].include?(settings[:scheme])
19
+ raise ::Proxy::Error::ConfigurationError, "Setting 'scheme' can be set to either 'http' or 'https'"
20
+ end
21
+ end
22
+ class ParentBlockValidator < ::Proxy::PluginValidators::Base
23
+ def validate!(settings)
24
+ return true if settings[:parent_block].is_a?(Integer)
25
+ raise ::Proxy::Error::ConfigurationError, "Setting 'parent_block' must be (integer)"
26
+ end
27
+ end
28
+ class ViewNameValidator < ::Proxy::PluginValidators::Base
29
+ def validate!(settings)
30
+ return true if settings[:view_name].is_a?(String)
31
+ raise ::Proxy::Error::ConfigurationError, "Setting 'view_name' must be (string)"
32
+ end
33
+ end
34
+ class ConfigIdValidator < ::Proxy::PluginValidators::Base
35
+ def validate!(settings)
36
+ return true if settings[:config_id].is_a?(Integer)
37
+ raise ::Proxy::Error::ConfigurationError, "Setting 'parent_block' must be (integer)"
38
+ end
39
+ end
40
+ class ConfigNameValidator < ::Proxy::PluginValidators::Base
41
+ def validate!(settings)
42
+ return true if settings[:config_name].is_a?(String)
43
+ raise ::Proxy::Error::ConfigurationError, "Setting 'config_name' must be (string)"
44
+ end
45
+ end
46
+ class ServerIdValidator < ::Proxy::PluginValidators::Base
47
+ def validate!(settings)
48
+ return true if settings[:server_id].is_a?(Integer)
49
+ raise ::Proxy::Error::ConfigurationError, "Setting 'server_id' must be (integer)"
50
+ end
51
+ end
52
+ class UsernameValidator < ::Proxy::PluginValidators::Base
53
+ def validate!(settings)
54
+ return true if settings[:username].is_a?(String)
55
+ raise ::Proxy::Error::ConfigurationError, "Setting 'username' must be (string)"
56
+ end
57
+ end
58
+ class PasswordValidator < ::Proxy::PluginValidators::Base
59
+ def validate!(settings)
60
+ return true if settings[:password].is_a?(String)
61
+ raise ::Proxy::Error::ConfigurationError, "Setting 'password' must be (string)"
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end