vagrant-proxyconf 1.0.1 → 1.1.0
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 +7 -0
- data/.gitignore +1 -1
- data/.travis.yml +15 -1
- data/CHANGELOG.md +25 -0
- data/Gemfile +6 -3
- data/LICENSE.txt +1 -1
- data/README.md +34 -8
- data/Rakefile +2 -0
- data/lib/vagrant-proxyconf/action.rb +28 -5
- data/lib/vagrant-proxyconf/action/base.rb +26 -19
- data/lib/vagrant-proxyconf/action/configure_chef_proxy.rb +15 -15
- data/lib/vagrant-proxyconf/action/configure_env_proxy.rb +2 -2
- data/lib/vagrant-proxyconf/action/configure_pear_proxy.rb +29 -0
- data/lib/vagrant-proxyconf/action/configure_yum_proxy.rb +5 -10
- data/lib/vagrant-proxyconf/action/is_enabled.rb +24 -0
- data/lib/vagrant-proxyconf/cap/linux/pear_proxy_conf.rb +15 -0
- data/lib/vagrant-proxyconf/capability.rb +31 -0
- data/lib/vagrant-proxyconf/config.rb +27 -0
- data/lib/vagrant-proxyconf/config/apt_proxy.rb +24 -24
- data/lib/vagrant-proxyconf/config/env_proxy.rb +8 -1
- data/lib/vagrant-proxyconf/config/key_mixin.rb +3 -2
- data/lib/vagrant-proxyconf/config/proxy.rb +3 -0
- data/lib/vagrant-proxyconf/hook.rb +41 -0
- data/lib/vagrant-proxyconf/plugin.rb +42 -70
- data/lib/vagrant-proxyconf/version.rb +1 -1
- data/locales/en.yml +9 -1
- data/spec/spec_helper.rb +11 -9
- data/spec/unit/vagrant-proxyconf/action/configure_chef_proxy_spec.rb +3 -1
- data/spec/unit/vagrant-proxyconf/action/configure_pear_proxy_spec.rb +10 -0
- data/spec/unit/vagrant-proxyconf/action/configure_yum_proxy_spec.rb +5 -1
- data/spec/unit/vagrant-proxyconf/action/is_enabled_spec.rb +39 -0
- data/spec/unit/vagrant-proxyconf/cap/linux/pear_proxy_conf_spec.rb +25 -0
- data/spec/unit/vagrant-proxyconf/config/env_proxy_spec.rb +15 -8
- data/spec/unit/vagrant-proxyconf/plugin_spec.rb +54 -15
- metadata +19 -15
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module ProxyConf
|
5
|
+
class Action
|
6
|
+
# Action for configuring Pear on the guest
|
7
|
+
class ConfigurePearProxy < Base
|
8
|
+
def config_name
|
9
|
+
'pear_proxy'
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
# @return [Vagrant::Plugin::V2::Config] the configuration
|
15
|
+
def config
|
16
|
+
# Use global proxy config
|
17
|
+
@config ||= finalize_config(@machine.config.proxy)
|
18
|
+
end
|
19
|
+
|
20
|
+
def configure_machine
|
21
|
+
proxy = config.http || ''
|
22
|
+
|
23
|
+
@machine.communicate.sudo(
|
24
|
+
"pear config-set http_proxy #{escape(proxy)} system")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -13,15 +13,15 @@ module VagrantPlugins
|
|
13
13
|
|
14
14
|
private
|
15
15
|
|
16
|
-
def configure_machine
|
16
|
+
def configure_machine
|
17
17
|
tmp = "/tmp/vagrant-proxyconf"
|
18
|
-
path = config_path
|
18
|
+
path = config_path
|
19
19
|
|
20
|
-
machine.communicate.tap do |comm|
|
20
|
+
@machine.communicate.tap do |comm|
|
21
21
|
comm.sudo("rm #{tmp}", error_check: false)
|
22
22
|
comm.upload(ProxyConf.resource("yum_config.awk"), tmp)
|
23
23
|
comm.sudo("touch #{path}")
|
24
|
-
comm.sudo("gawk -f #{tmp} #{proxy_params
|
24
|
+
comm.sudo("gawk -f #{tmp} #{proxy_params} #{path} > #{path}.new")
|
25
25
|
comm.sudo("chmod 0644 #{path}.new")
|
26
26
|
comm.sudo("chown root:root #{path}.new")
|
27
27
|
comm.sudo("mv #{path}.new #{path}")
|
@@ -29,15 +29,10 @@ module VagrantPlugins
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
def proxy_params
|
32
|
+
def proxy_params
|
33
33
|
u = UserinfoURI.new(config.http)
|
34
34
|
"-v proxy=#{escape(u.uri)} -v user=#{escape(u.user)} -v pass=#{escape(u.pass)}"
|
35
35
|
end
|
36
|
-
|
37
|
-
# @param value [String, nil] the string to escape for shell usage
|
38
|
-
def escape(value)
|
39
|
-
value.to_s.shellescape
|
40
|
-
end
|
41
36
|
end
|
42
37
|
end
|
43
38
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module ProxyConf
|
3
|
+
class Action
|
4
|
+
# Action which checks if the plugin should be enabled
|
5
|
+
class IsEnabled
|
6
|
+
def initialize(app, env)
|
7
|
+
@app = app
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
env[:result] = plugin_enabled?(env[:machine].config.proxy)
|
12
|
+
|
13
|
+
@app.call(env)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def plugin_enabled?(config)
|
19
|
+
config.enabled != false && config.enabled != ''
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module ProxyConf
|
3
|
+
module Cap
|
4
|
+
module Linux
|
5
|
+
# Capability for PEAR proxy configuration
|
6
|
+
module PearProxyConf
|
7
|
+
# @return [Boolean] if PEAR is installed
|
8
|
+
def self.pear_proxy_conf(machine)
|
9
|
+
machine.communicate.test("which pear")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module ProxyConf
|
5
|
+
class Plugin < Vagrant.plugin('2')
|
6
|
+
guest_capability 'debian', 'apt_proxy_conf' do
|
7
|
+
require_relative 'cap/debian/apt_proxy_conf'
|
8
|
+
Cap::Debian::AptProxyConf
|
9
|
+
end
|
10
|
+
|
11
|
+
guest_capability 'coreos', 'env_proxy_conf' do
|
12
|
+
# disabled on CoreOS
|
13
|
+
end
|
14
|
+
|
15
|
+
guest_capability 'linux', 'env_proxy_conf' do
|
16
|
+
require_relative 'cap/linux/env_proxy_conf'
|
17
|
+
Cap::Linux::EnvProxyConf
|
18
|
+
end
|
19
|
+
|
20
|
+
guest_capability 'linux', 'pear_proxy_conf' do
|
21
|
+
require_relative 'cap/linux/pear_proxy_conf'
|
22
|
+
Cap::Linux::PearProxyConf
|
23
|
+
end
|
24
|
+
|
25
|
+
guest_capability 'redhat', 'yum_proxy_conf' do
|
26
|
+
require_relative 'cap/redhat/yum_proxy_conf'
|
27
|
+
Cap::Redhat::YumProxyConf
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module ProxyConf
|
5
|
+
class Plugin < Vagrant.plugin('2')
|
6
|
+
config 'apt_proxy' do
|
7
|
+
require_relative 'config/apt_proxy'
|
8
|
+
Config::AptProxy
|
9
|
+
end
|
10
|
+
|
11
|
+
config 'env_proxy' do
|
12
|
+
require_relative 'config/env_proxy'
|
13
|
+
Config::EnvProxy
|
14
|
+
end
|
15
|
+
|
16
|
+
config 'proxy' do
|
17
|
+
require_relative 'config/proxy'
|
18
|
+
Config::Proxy
|
19
|
+
end
|
20
|
+
|
21
|
+
config 'yum_proxy' do
|
22
|
+
require_relative 'config/yum_proxy'
|
23
|
+
Config::YumProxy
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -20,56 +20,56 @@ module VagrantPlugins
|
|
20
20
|
# @return [String] the FTP proxy
|
21
21
|
key :ftp, env_var: 'VAGRANT_APT_FTP_PROXY'
|
22
22
|
|
23
|
+
def finalize!
|
24
|
+
super
|
25
|
+
|
26
|
+
keys.each do |key|
|
27
|
+
value = get(key)
|
28
|
+
set(key, finalize_uri(key, value)) if value
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
23
32
|
private
|
24
33
|
|
25
34
|
# (see KeyMixin#config_for)
|
26
35
|
def config_for(key, value)
|
27
|
-
|
36
|
+
%Q{Acquire::#{key.name}::Proxy #{value.inspect};\n} if value
|
37
|
+
end
|
38
|
+
|
39
|
+
def finalize_uri(key, value)
|
40
|
+
AptProxyURI.new(key.name, value).to_s
|
28
41
|
end
|
29
42
|
|
30
|
-
# Helper for constructing
|
43
|
+
# Helper for constructing configuration values for apt.conf
|
31
44
|
#
|
32
45
|
# @api private
|
33
|
-
class
|
46
|
+
class AptProxyURI
|
34
47
|
|
35
|
-
attr_reader :
|
48
|
+
attr_reader :scheme, :value
|
36
49
|
|
37
|
-
# @param
|
50
|
+
# @param scheme [String] the protocol ("http", "https", ...)
|
38
51
|
# @param value [Object] the configuration value
|
39
|
-
def initialize(
|
40
|
-
@
|
52
|
+
def initialize(scheme, value)
|
53
|
+
@scheme = scheme
|
41
54
|
@value = value
|
42
55
|
end
|
43
56
|
|
44
|
-
# @return [String] the full Apt configuration line
|
45
57
|
def to_s
|
46
|
-
|
58
|
+
direct || "#{prefix}#{value}#{suffix}"
|
47
59
|
end
|
48
60
|
|
49
61
|
private
|
50
62
|
|
51
|
-
def set?
|
52
|
-
value && !value.empty?
|
53
|
-
end
|
54
|
-
|
55
63
|
def direct
|
56
|
-
|
57
|
-
end
|
58
|
-
|
59
|
-
def proxy_uri
|
60
|
-
"#{prefix}#{value}#{suffix}"
|
64
|
+
'DIRECT' if value.upcase == 'DIRECT'
|
61
65
|
end
|
62
66
|
|
63
67
|
def prefix
|
64
|
-
"#{
|
68
|
+
"#{scheme}://" if value !~ %r{^.*://}
|
65
69
|
end
|
66
70
|
|
67
71
|
def suffix
|
68
|
-
|
69
|
-
end
|
70
|
-
|
71
|
-
def default_port
|
72
|
-
3142
|
72
|
+
':3142' if value !~ %r{:\d+$} && value !~ %r{/}
|
73
73
|
end
|
74
74
|
end
|
75
75
|
end
|
@@ -27,8 +27,15 @@ module VagrantPlugins
|
|
27
27
|
|
28
28
|
# (see KeyMixin#config_for)
|
29
29
|
def config_for(key, value)
|
30
|
-
if value
|
30
|
+
if value
|
31
31
|
var = env_variable_name(key)
|
32
|
+
|
33
|
+
# Quote the `no_proxy` value in case there are spaces and special
|
34
|
+
# characters. Unfortunately we can't escape other values before
|
35
|
+
# v2.0 as even the README had an example of using shell variables
|
36
|
+
# still in v1.0.x.
|
37
|
+
value = value.inspect if key.name == :no_proxy
|
38
|
+
|
32
39
|
[var.upcase, var.downcase].map { |v| "export #{v}=#{value}\n" }.join
|
33
40
|
end
|
34
41
|
end
|
@@ -70,7 +70,7 @@ module VagrantPlugins
|
|
70
70
|
# @param value [String, nil] the configuration value
|
71
71
|
# @return [#to_s] the configuration line(s)
|
72
72
|
def config_for(key, value)
|
73
|
-
"#{key}=#{value}\n"
|
73
|
+
"#{key}=#{value && value}\n"
|
74
74
|
end
|
75
75
|
|
76
76
|
# Returns a new instance of this class where all nil keys are
|
@@ -113,10 +113,11 @@ module VagrantPlugins
|
|
113
113
|
private
|
114
114
|
|
115
115
|
def resolve_value(key)
|
116
|
-
key.value_from_env_var do |default|
|
116
|
+
ret = key.value_from_env_var do |default|
|
117
117
|
value = get(key)
|
118
118
|
value == self.class::UNSET_VALUE ? default : value
|
119
119
|
end
|
120
|
+
ret == '' ? false : ret
|
120
121
|
end
|
121
122
|
end
|
122
123
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module ProxyConf
|
5
|
+
class Plugin < Vagrant.plugin('2')
|
6
|
+
# Actions to run before any provisioner or other plugin
|
7
|
+
action_hook 'proxyconf_configure' do |hook|
|
8
|
+
require_relative 'action'
|
9
|
+
|
10
|
+
# the standard provision action
|
11
|
+
hook.after Vagrant::Action::Builtin::Provision, Action.configure
|
12
|
+
|
13
|
+
# Vagrant 1.5+ can install NFS client
|
14
|
+
if check_vagrant_version('>= 1.5.0.dev')
|
15
|
+
hook.after Vagrant::Action::Builtin::SyncedFolders, Action.configure
|
16
|
+
end
|
17
|
+
|
18
|
+
# vagrant-aws < 0.4.0 uses a non-standard provision action
|
19
|
+
if defined?(VagrantPlugins::AWS::Action::TimedProvision)
|
20
|
+
hook.after VagrantPlugins::AWS::Action::TimedProvision, Action.configure
|
21
|
+
end
|
22
|
+
|
23
|
+
# configure the proxies before vagrant-omnibus
|
24
|
+
if defined?(VagrantPlugins::Omnibus::Action::InstallChef)
|
25
|
+
hook.after VagrantPlugins::Omnibus::Action::InstallChef, Action.configure
|
26
|
+
end
|
27
|
+
|
28
|
+
# configure the proxies before vagrant-vbguest
|
29
|
+
if defined?(VagrantVbguest::Middleware)
|
30
|
+
hook.before VagrantVbguest::Middleware, Action.configure(before: true)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Actions to run after each provisioner run
|
35
|
+
action_hook 'proxyconf_configure', :provisioner_run do |hook|
|
36
|
+
require_relative 'action'
|
37
|
+
hook.after :run_provisioner, Action.configure_after_provisoner
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'vagrant'
|
2
|
+
require_relative 'logger'
|
2
3
|
|
3
4
|
module VagrantPlugins
|
4
5
|
module ProxyConf
|
@@ -6,19 +7,30 @@ module VagrantPlugins
|
|
6
7
|
#
|
7
8
|
# @!parse class Plugin < Vagrant::Plugin::V2::Plugin; end
|
8
9
|
class Plugin < Vagrant.plugin('2')
|
9
|
-
#
|
10
|
-
|
10
|
+
# Compatible Vagrant versions
|
11
|
+
VAGRANT_VERSION_REQUIREMENT = '>= 1.2.0'
|
11
12
|
|
12
13
|
# A list of plugins whose action classes we hook to if installed
|
13
14
|
OPTIONAL_PLUGIN_DEPENDENCIES = %w[vagrant-aws vagrant-omnibus vagrant-vbguest]
|
14
15
|
|
16
|
+
# Returns true if the Vagrant version fulfills the requirements
|
17
|
+
#
|
18
|
+
# @param requirements [String, Array<String>] the version requirement
|
19
|
+
# @return [Boolean]
|
20
|
+
def self.check_vagrant_version(*requirements)
|
21
|
+
Gem::Requirement.new(*requirements).satisfied_by?(
|
22
|
+
Gem::Version.new(Vagrant::VERSION))
|
23
|
+
end
|
24
|
+
|
15
25
|
# Verifies that the Vagrant version fulfills the requirements
|
16
26
|
#
|
17
27
|
# @raise [VagrantPlugins::ProxyConf::VagrantVersionError] if this plugin
|
18
28
|
# is incompatible with the Vagrant version
|
19
29
|
def self.check_vagrant_version!
|
20
|
-
if
|
21
|
-
msg = I18n.t(
|
30
|
+
if !check_vagrant_version(VAGRANT_VERSION_REQUIREMENT)
|
31
|
+
msg = I18n.t(
|
32
|
+
'vagrant_proxyconf.errors.vagrant_version',
|
33
|
+
requirement: VAGRANT_VERSION_REQUIREMENT.inspect)
|
22
34
|
$stderr.puts msg
|
23
35
|
raise msg
|
24
36
|
end
|
@@ -31,19 +43,36 @@ module VagrantPlugins
|
|
31
43
|
end
|
32
44
|
|
33
45
|
# Ensures a dependent plugin is loaded before us if it is installed.
|
34
|
-
# Ignores
|
46
|
+
# Ignores Errors while loading, as Vagrant itself anyway shows them to
|
47
|
+
# used when *it* tries to load the plugin.
|
35
48
|
#
|
36
49
|
# @param plugin [String] the plugin name
|
37
50
|
def self.load_optional_dependency(plugin)
|
38
|
-
|
39
|
-
|
40
|
-
|
51
|
+
logger = ProxyConf.logger
|
52
|
+
logger.info "Trying to load #{plugin}"
|
53
|
+
|
54
|
+
if check_vagrant_version('< 1.5.0.dev')
|
55
|
+
begin
|
56
|
+
Vagrant.require_plugin plugin
|
57
|
+
rescue Vagrant::Errors::PluginLoadError
|
58
|
+
logger.info "Ignoring the load error of #{plugin}"
|
59
|
+
end
|
60
|
+
else
|
61
|
+
begin
|
62
|
+
require plugin
|
63
|
+
rescue Exception => e
|
64
|
+
logger.info "Failed to load #{plugin}: #{e.inspect}"
|
65
|
+
logger.info "Ignoring the error"
|
66
|
+
end
|
67
|
+
end
|
41
68
|
end
|
42
69
|
|
43
70
|
# Loads the plugins to ensure their action hooks are registered before us.
|
44
71
|
# Uses alphabetical order to not change the default behaviour otherwise.
|
45
72
|
def self.load_optional_dependencies
|
46
|
-
OPTIONAL_PLUGIN_DEPENDENCIES.sort.each
|
73
|
+
OPTIONAL_PLUGIN_DEPENDENCIES.sort.each do |plugin|
|
74
|
+
load_optional_dependency plugin
|
75
|
+
end
|
47
76
|
end
|
48
77
|
|
49
78
|
setup_i18n
|
@@ -51,67 +80,10 @@ module VagrantPlugins
|
|
51
80
|
load_optional_dependencies
|
52
81
|
|
53
82
|
name 'vagrant-proxyconf'
|
54
|
-
|
55
|
-
config 'apt_proxy' do
|
56
|
-
require_relative 'config/apt_proxy'
|
57
|
-
Config::AptProxy
|
58
|
-
end
|
59
|
-
|
60
|
-
config 'env_proxy' do
|
61
|
-
require_relative 'config/env_proxy'
|
62
|
-
Config::EnvProxy
|
63
|
-
end
|
64
|
-
|
65
|
-
config 'proxy' do
|
66
|
-
require_relative 'config/proxy'
|
67
|
-
Config::Proxy
|
68
|
-
end
|
69
|
-
|
70
|
-
config 'yum_proxy' do
|
71
|
-
require_relative 'config/yum_proxy'
|
72
|
-
Config::YumProxy
|
73
|
-
end
|
74
|
-
|
75
|
-
guest_capability 'debian', 'apt_proxy_conf' do
|
76
|
-
require_relative 'cap/debian/apt_proxy_conf'
|
77
|
-
Cap::Debian::AptProxyConf
|
78
|
-
end
|
79
|
-
|
80
|
-
guest_capability 'linux', 'env_proxy_conf' do
|
81
|
-
require_relative 'cap/linux/env_proxy_conf'
|
82
|
-
Cap::Linux::EnvProxyConf
|
83
|
-
end
|
84
|
-
|
85
|
-
guest_capability 'coreos', 'env_proxy_conf' do
|
86
|
-
# disabled on CoreOS
|
87
|
-
end
|
88
|
-
|
89
|
-
guest_capability 'redhat', 'yum_proxy_conf' do
|
90
|
-
require_relative 'cap/redhat/yum_proxy_conf'
|
91
|
-
Cap::Redhat::YumProxyConf
|
92
|
-
end
|
93
|
-
|
94
|
-
action_hook 'proxyconf_configure' do |hook|
|
95
|
-
require_relative 'action'
|
96
|
-
|
97
|
-
# the standard provision action
|
98
|
-
hook.after Vagrant::Action::Builtin::Provision, Action.configure
|
99
|
-
|
100
|
-
# vagrant-aws < 0.4.0 uses a non-standard provision action
|
101
|
-
if defined?(VagrantPlugins::AWS::Action::TimedProvision)
|
102
|
-
hook.after VagrantPlugins::AWS::Action::TimedProvision, Action.configure
|
103
|
-
end
|
104
|
-
|
105
|
-
# configure the proxies before vagrant-omnibus
|
106
|
-
if defined?(VagrantPlugins::Omnibus::Action::InstallChef)
|
107
|
-
hook.after VagrantPlugins::Omnibus::Action::InstallChef, Action.configure
|
108
|
-
end
|
109
|
-
|
110
|
-
# configure the proxies before vagrant-vbguest
|
111
|
-
if defined?(VagrantVbguest::Middleware)
|
112
|
-
hook.before VagrantVbguest::Middleware, Action.configure(before: true)
|
113
|
-
end
|
114
|
-
end
|
115
83
|
end
|
116
84
|
end
|
117
85
|
end
|
86
|
+
|
87
|
+
require_relative "capability"
|
88
|
+
require_relative "config"
|
89
|
+
require_relative "hook"
|