vagrant-sshfs 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -2
- data/RELEASE.txt +7 -0
- data/features/sshfs_cwd_mount.feature +6 -6
- data/features/step_definitions/sshfs_cwd_mount_steps.rb +3 -3
- data/lib/vagrant-sshfs.rb +2 -2
- data/lib/vagrant-sshfs/action_hostpath_fixup.rb +130 -0
- data/lib/vagrant-sshfs/cap/guest/debian/sshfs_client.rb +1 -0
- data/lib/vagrant-sshfs/cap/guest/freebsd/sshfs_client.rb +22 -0
- data/lib/vagrant-sshfs/cap/guest/freebsd/sshfs_forward_mount.rb +13 -0
- data/lib/vagrant-sshfs/cap/guest/linux/sshfs_forward_mount.rb +53 -30
- data/lib/vagrant-sshfs/cap/guest/linux/sshfs_get_absolute_path.rb +1 -1
- data/lib/vagrant-sshfs/cap/guest/redhat/sshfs_client.rb +3 -3
- data/lib/vagrant-sshfs/cap/host/darwin/sshfs_reverse_mount.rb +13 -6
- data/lib/vagrant-sshfs/cap/host/linux/sshfs_reverse_mount.rb +13 -8
- data/lib/vagrant-sshfs/plugin.rb +46 -0
- data/lib/vagrant-sshfs/synced_folder.rb +1 -0
- data/lib/vagrant-sshfs/synced_folder/sshfs_forward_mount.rb +1 -1
- data/lib/vagrant-sshfs/version.rb +1 -1
- data/test/libvirt/Vagrantfile +1 -1
- data/test/misc/Vagrantfile +2 -2
- data/test/virtualbox/Vagrantfile +1 -1
- data/vagrant-sshfs.gemspec +5 -5
- metadata +26 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4d157c8505dffb3fd49fc1bf75f22f0941021e4f
|
4
|
+
data.tar.gz: d3140fe56a5aaae22881f62a5a3503982979d641
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d2d085b190c1179951d81802a03d847cf3bddceaebbb0d7324eda7d19a0c4b66ff0c55905761590b498ca9bb5f7ad460dd5e8051f4202ae3c4008ea6b126b34
|
7
|
+
data.tar.gz: 4426f39f7934c6a7b2e314be8f49924792bc418b6ba522c321f372145869bcd48c33aa3f63d46e65d1adb94a1c0e4ba49ac2e6387b104278a26d825fa8b9bc3c
|
data/Gemfile
CHANGED
@@ -6,12 +6,12 @@ group :development do
|
|
6
6
|
# We depend on Vagrant for development, but we don't add it as a
|
7
7
|
# gem dependency because we expect to be installed within the
|
8
8
|
# Vagrant environment itself using `vagrant plugin`.
|
9
|
-
gem "vagrant", :git => "https://github.com/mitchellh/vagrant.git", :ref => '
|
9
|
+
gem "vagrant", :git => "https://github.com/mitchellh/vagrant.git", :ref => 'v2.0.2'
|
10
10
|
end
|
11
11
|
|
12
12
|
group :plugins do
|
13
13
|
gem "vagrant-sshfs" , path: "."
|
14
14
|
# Add vagrant-libvirt plugin here, otherwise you won't be able to
|
15
15
|
# use libvirt as a provider when you execute `bundle exec vagrant up`
|
16
|
-
gem "vagrant-libvirt" , '0.0.
|
16
|
+
gem "vagrant-libvirt" , '0.0.43'
|
17
17
|
end
|
data/RELEASE.txt
CHANGED
@@ -44,6 +44,13 @@ gpg --armor --detach-sign pkg/vagrant-sshfs-1.2.0.gem
|
|
44
44
|
$ ls pkg/vagrant-sshfs-1.2.0.gem*
|
45
45
|
pkg/vagrant-sshfs-1.2.0.gem pkg/vagrant-sshfs-1.2.0.gem.asc
|
46
46
|
|
47
|
+
# make tar.gz and zip files
|
48
|
+
git archive --format=tar.gz v1.3.0 > vagrant-sshfs-1.3.0.tar.gz
|
49
|
+
gpg --armor --detach-sign vagrant-sshfs-1.3.0.tar.gz
|
50
|
+
git archive --format=zip v1.3.0 > vagrant-sshfs-1.3.0.zip
|
51
|
+
gpg --armor --detach-sign vagrant-sshfs-1.3.0.zip
|
52
|
+
|
53
|
+
|
47
54
|
# Update release notes and upload files on github
|
48
55
|
|
49
56
|
# push to rubygems with:
|
@@ -3,9 +3,9 @@
|
|
3
3
|
# human readable. All Gherkin files have a .feature extension
|
4
4
|
#
|
5
5
|
# See more here: https://en.wikipedia.org/wiki/Cucumber_(software)
|
6
|
-
#
|
7
|
-
#
|
8
|
-
# to define most of the basic step definitions that we use as part of
|
6
|
+
#
|
7
|
+
# Additionally in the setup/env.rb file we set up Aruba. Aruba is used
|
8
|
+
# to define most of the basic step definitions that we use as part of
|
9
9
|
# the Gherkin syntax in this file.
|
10
10
|
#
|
11
11
|
# For more information on the step definitions provided see:
|
@@ -21,7 +21,7 @@ Feature: SSHFS mount of vagrant current working directory
|
|
21
21
|
# Disable the default rsync
|
22
22
|
config.vm.synced_folder '.', '/vagrant', disabled: true
|
23
23
|
|
24
|
-
# If using libvirt and nested virt (vagrant in vagrant) then
|
24
|
+
# If using libvirt and nested virt (vagrant in vagrant) then
|
25
25
|
# we need to use a different network than 192.168.121.0
|
26
26
|
config.vm.provider :libvirt do |libvirt|
|
27
27
|
libvirt.management_network_name = 'vagrant-libvirt-test'
|
@@ -42,5 +42,5 @@ Feature: SSHFS mount of vagrant current working directory
|
|
42
42
|
Examples:
|
43
43
|
| box |
|
44
44
|
| centos/7 |
|
45
|
-
|
46
|
-
|
45
|
+
|
46
|
+
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# This is a cucumber step definition. Cucumber scenarios become automated
|
2
|
-
# tests with the addition of what are called step definitions. A step
|
3
|
-
# definition is a block of code associated with one or more steps by a
|
1
|
+
# This is a cucumber step definition. Cucumber scenarios become automated
|
2
|
+
# tests with the addition of what are called step definitions. A step
|
3
|
+
# definition is a block of code associated with one or more steps by a
|
4
4
|
# regular expression (or, in simple cases, a string).
|
5
5
|
#
|
6
6
|
# This is the step definition for the `And vagrant current working
|
data/lib/vagrant-sshfs.rb
CHANGED
@@ -4,8 +4,8 @@ rescue LoadError
|
|
4
4
|
raise "The Vagrant sshfs plugin must be run within Vagrant"
|
5
5
|
end
|
6
6
|
|
7
|
-
# Only load the gem on Windows since it replaces some methods in Ruby's
|
8
|
-
# Process class. Also load it here before Process.uid is called the first
|
7
|
+
# Only load the gem on Windows since it replaces some methods in Ruby's
|
8
|
+
# Process class. Also load it here before Process.uid is called the first
|
9
9
|
# time by Vagrant. The Process.create() function actually gets used in
|
10
10
|
# lib/vagrant-sshfs/cap/guest/linux/sshfs_forward_mount.rb
|
11
11
|
if Vagrant::Util::Platform.windows?
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require "log4r"
|
2
|
+
|
3
|
+
require "vagrant/action/builtin/mixin_synced_folders"
|
4
|
+
|
5
|
+
module VagrantPlugins
|
6
|
+
module SyncedFolderSSHFS
|
7
|
+
|
8
|
+
# Class that contains common function that are called by both
|
9
|
+
# HostPathFix and HostPathUnfix classes.
|
10
|
+
class HostPathFixCommon
|
11
|
+
|
12
|
+
include Vagrant::Action::Builtin::MixinSyncedFolders
|
13
|
+
|
14
|
+
def initialize()
|
15
|
+
@logger = Log4r::Logger.new("vagrant::synced_folders::sshfs")
|
16
|
+
end
|
17
|
+
|
18
|
+
def fix(data)
|
19
|
+
# If this is an arbitrary host mount we need to set the hostpath
|
20
|
+
# to something that will pass the config checks that assume the
|
21
|
+
# hostpath is coming from the vagrant host and not from an arbitrary
|
22
|
+
# host. Save off the original hostpath and then set the hostpath to
|
23
|
+
# "." to pass the checks.
|
24
|
+
if data[:ssh_host]
|
25
|
+
data[:hostpath_orig] = data[:hostpath]
|
26
|
+
data[:hostpath] = "."
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def unfix(data)
|
31
|
+
# If this is a reverse mounted folder or an arbitrary host mount
|
32
|
+
# then we'll set "hostpath_exact" so they don't try to create a
|
33
|
+
# folder on the host in Vagrant::Action::Builtin::SyncedFolders.
|
34
|
+
if data[:ssh_host]
|
35
|
+
data[:hostpath_exact] = true
|
36
|
+
data[:hostpath] = data[:hostpath_orig]
|
37
|
+
data.delete(:hostpath_orig)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Loop through synced folder entries and either fix or unfix
|
42
|
+
# based on the fix arg
|
43
|
+
def loop_and_fix_unfix(env, fix)
|
44
|
+
|
45
|
+
opts = {
|
46
|
+
cached: !!env[:synced_folders_cached],
|
47
|
+
config: env[:synced_folders_config],
|
48
|
+
}
|
49
|
+
|
50
|
+
@logger.debug("SyncedFolders loading from cache: #{opts[:cached]}")
|
51
|
+
folders = synced_folders(env[:machine], **opts)
|
52
|
+
|
53
|
+
folders.each do |impl_name, fs|
|
54
|
+
next if impl_name != :sshfs
|
55
|
+
@logger.debug("Synced Folder Implementation: #{impl_name}")
|
56
|
+
|
57
|
+
fs.each do |id, data|
|
58
|
+
|
59
|
+
# replace data with a copy since we may delete/add new data to the config
|
60
|
+
data = data.dup
|
61
|
+
|
62
|
+
if fix
|
63
|
+
@logger.debug("fixup host path before: - #{id}: #{data[:hostpath]} => #{data[:guestpath]}")
|
64
|
+
fix(data)
|
65
|
+
@logger.debug("fixup host path after: - #{id}: #{data[:hostpath]} => #{data[:guestpath]}")
|
66
|
+
else
|
67
|
+
@logger.debug("unfixup host path before: - #{id}: #{data[:hostpath]} => #{data[:guestpath]}")
|
68
|
+
unfix(data)
|
69
|
+
@logger.debug("fixup host path after: - #{id}: #{data[:hostpath]} => #{data[:guestpath]}")
|
70
|
+
end
|
71
|
+
|
72
|
+
# Replace the entry in the config with the updated one
|
73
|
+
env[:machine].config.vm.synced_folders.delete(id)
|
74
|
+
env[:machine].config.vm.synced_folder(
|
75
|
+
data[:hostpath],
|
76
|
+
data[:guestpath],
|
77
|
+
data)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# Class that will massage the data for synced folders that are
|
84
|
+
# arbitrary host mounts (contain ssh_host in the options) to make
|
85
|
+
# it so that "host path checking" isn't performed on the vagrant
|
86
|
+
# host machine
|
87
|
+
class HostPathFix
|
88
|
+
|
89
|
+
def initialize(app, env)
|
90
|
+
@app = app
|
91
|
+
@logger = Log4r::Logger.new("vagrant::synced_folders::sshfs")
|
92
|
+
end
|
93
|
+
|
94
|
+
def call(env)
|
95
|
+
classname = "VagrantPlugins::SyncedFolderSSHFS::HostPathFix"
|
96
|
+
@logger.debug("Executing hook within #{classname}")
|
97
|
+
|
98
|
+
# This part is for the IN action call
|
99
|
+
HostPathFixCommon.new().loop_and_fix_unfix(env, fix=true)
|
100
|
+
|
101
|
+
# Now continue until the OUT call
|
102
|
+
@app.call(env)
|
103
|
+
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
# Class that will undo the data manipulation that was done in
|
109
|
+
# HostPathFix and also set hostpath_exact=true if necessary
|
110
|
+
class HostPathUnfix
|
111
|
+
|
112
|
+
def initialize(app, env)
|
113
|
+
@app = app
|
114
|
+
@logger = Log4r::Logger.new("vagrant::synced_folders::sshfs")
|
115
|
+
end
|
116
|
+
|
117
|
+
def call(env)
|
118
|
+
classname = "VagrantPlugins::SyncedFolderSSHFS::HostPathUnfix"
|
119
|
+
@logger.debug("Executing hook within #{classname}")
|
120
|
+
|
121
|
+
# This part is for the IN action call
|
122
|
+
HostPathFixCommon.new().loop_and_fix_unfix(env, fix=false)
|
123
|
+
|
124
|
+
# Now continue until the OUT call
|
125
|
+
@app.call(env)
|
126
|
+
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module GuestFreeBSD
|
3
|
+
module Cap
|
4
|
+
class SSHFSClient
|
5
|
+
def self.sshfs_install(machine)
|
6
|
+
machine.communicate.sudo("pkg install -y fusefs-sshfs")
|
7
|
+
machine.communicate.sudo("kldload fuse")
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.sshfs_installed(machine)
|
11
|
+
installed = machine.communicate.test("pkg info fusefs-sshfs")
|
12
|
+
if installed
|
13
|
+
# fuse may not get loaded at boot, so check if it's loaded otherwise force load it
|
14
|
+
machine.communicate.sudo("kldstat -m fuse || kldload fuse")
|
15
|
+
end
|
16
|
+
|
17
|
+
installed
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require "log4r"
|
2
2
|
require "vagrant/util/retryable"
|
3
|
+
require "vagrant/util/platform"
|
3
4
|
require "tempfile"
|
4
5
|
|
5
6
|
# This is already done for us in lib/vagrant-sshfs.rb. We needed to
|
@@ -16,13 +17,17 @@ module VagrantPlugins
|
|
16
17
|
extend Vagrant::Util::Retryable
|
17
18
|
@@logger = Log4r::Logger.new("vagrant::synced_folders::sshfs_mount")
|
18
19
|
|
20
|
+
def self.list_mounts_command
|
21
|
+
"cat /proc/mounts"
|
22
|
+
end
|
23
|
+
|
19
24
|
def self.sshfs_forward_is_folder_mounted(machine, opts)
|
20
25
|
mounted = false
|
21
26
|
guest_path = opts[:guestpath]
|
22
27
|
|
23
28
|
# If the path doesn't exist at all in the machine then we
|
24
29
|
# can safely say it is not mounted
|
25
|
-
exists = machine.communicate.test("test -e #{guest_path}")
|
30
|
+
exists = machine.communicate.test("test -e #{guest_path}", sudo: true)
|
26
31
|
return false unless exists
|
27
32
|
|
28
33
|
# find the absolute path so that we can properly check if it is mounted
|
@@ -31,7 +36,7 @@ module VagrantPlugins
|
|
31
36
|
:sshfs_get_absolute_path, guest_path)
|
32
37
|
|
33
38
|
# consult /proc/mounts to see if it is mounted or not
|
34
|
-
machine.communicate.execute(
|
39
|
+
machine.communicate.execute(self.list_mounts_command) do |type, data|
|
35
40
|
if type == :stdout
|
36
41
|
data.each_line do |line|
|
37
42
|
if line.split()[1] == absolute_guest_path
|
@@ -48,7 +53,7 @@ module VagrantPlugins
|
|
48
53
|
# opts contains something like:
|
49
54
|
# { :type=>:sshfs,
|
50
55
|
# :guestpath=>"/sharedfolder",
|
51
|
-
# :hostpath=>"/guests/sharedfolder",
|
56
|
+
# :hostpath=>"/guests/sharedfolder",
|
52
57
|
# :disabled=>false
|
53
58
|
# :ssh_host=>"192.168.1.1"
|
54
59
|
# :ssh_port=>"22"
|
@@ -66,16 +71,23 @@ module VagrantPlugins
|
|
66
71
|
comm.sudo("chmod 777 #{expanded_guest_path}")
|
67
72
|
end
|
68
73
|
|
69
|
-
# Mount path information
|
70
|
-
hostpath
|
71
|
-
|
74
|
+
# Mount path information: if arbitrary host mounting then
|
75
|
+
# take as is. If not, then expand the hostpath to the real
|
76
|
+
# path.
|
77
|
+
if opts[:ssh_host]
|
78
|
+
hostpath = opts[:hostpath].dup
|
79
|
+
else
|
80
|
+
hostpath = File.expand_path(opts[:hostpath], machine.env.root_path)
|
81
|
+
hostpath = Vagrant::Util::Platform.fs_real_path(hostpath).to_s
|
82
|
+
end
|
83
|
+
|
72
84
|
|
73
85
|
# Add in some sshfs/fuse options that are common to both mount methods
|
74
86
|
opts[:sshfs_opts] = ' -o allow_other ' # allow non-root users to access
|
75
87
|
opts[:sshfs_opts]+= ' -o noauto_cache '# disable caching based on mtime
|
76
88
|
|
77
89
|
# Add in some ssh options that are common to both mount methods
|
78
|
-
opts[:ssh_opts] = ' -o StrictHostKeyChecking=no '# prevent yes/no question
|
90
|
+
opts[:ssh_opts] = ' -o StrictHostKeyChecking=no '# prevent yes/no question
|
79
91
|
opts[:ssh_opts]+= ' -o ServerAliveInterval=30 ' # send keepalives
|
80
92
|
|
81
93
|
# Do a normal mount only if the user provided host information
|
@@ -116,25 +128,25 @@ module VagrantPlugins
|
|
116
128
|
protected
|
117
129
|
|
118
130
|
def self.windows_uninherit_handles(machine)
|
119
|
-
# For win32-process Process.create, if we pass any file handles to the
|
120
|
-
# underlying process for stdin/stdout/stderr then all file handles are
|
131
|
+
# For win32-process Process.create, if we pass any file handles to the
|
132
|
+
# underlying process for stdin/stdout/stderr then all file handles are
|
121
133
|
# inherited by default. We'll explicitly go through and set all Handles
|
122
134
|
# to not be inheritable by default. See following links for more info
|
123
|
-
#
|
135
|
+
#
|
124
136
|
# https://github.com/djberg96/win32-process/blob/6b380f450aebb69d44bb7accd958ecb6b9e1d246/lib/win32/process.rb#L445-L447
|
125
137
|
# bInheritHandles from https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx
|
126
|
-
#
|
138
|
+
#
|
127
139
|
# In 6f285cd we made it so that we would uninherit all filehandles by
|
128
140
|
# default on windows. Some users have reported that this operation
|
129
141
|
# is erroring because `The parameter is incorrect.`. See #52
|
130
|
-
# We will make the uninheriting operation best effort. The rationale
|
131
|
-
# is that if a file handle was not able to be set to uninheritable
|
142
|
+
# We will make the uninheriting operation best effort. The rationale
|
143
|
+
# is that if a file handle was not able to be set to uninheritable
|
132
144
|
# then it probably wasn't one that would get inherited in the first place.
|
133
145
|
#
|
134
|
-
# For each open IO object
|
146
|
+
# For each open IO object
|
135
147
|
ObjectSpace.each_object(IO) do |io|
|
136
148
|
if !io.closed?
|
137
|
-
fileno = io.fileno
|
149
|
+
fileno = io.fileno
|
138
150
|
@@logger.debug("Setting file handle #{fileno} to not be inherited")
|
139
151
|
begin
|
140
152
|
self.windows_uninherit_handle(fileno)
|
@@ -151,7 +163,7 @@ module VagrantPlugins
|
|
151
163
|
|
152
164
|
def self.windows_uninherit_handle(fileno)
|
153
165
|
# Right now we'll be doing this using private methods from the win32-process
|
154
|
-
# module by calling For each open IO object. Much of this code was copied from
|
166
|
+
# module by calling For each open IO object. Much of this code was copied from
|
155
167
|
# that module. We access the private methods by using the object.send(:method, args)
|
156
168
|
# technique. In the future we want to get a patch upstream so we don't need to
|
157
169
|
# access private methods. Upstream request is here:
|
@@ -170,15 +182,15 @@ module VagrantPlugins
|
|
170
182
|
end
|
171
183
|
|
172
184
|
# Now clear the HANDLE_FLAG_INHERIT from the HANDLE so that the handle
|
173
|
-
# won't get shared by default. See:
|
185
|
+
# won't get shared by default. See:
|
174
186
|
# https://msdn.microsoft.com/en-us/library/windows/desktop/ms724935(v=vs.85).aspx
|
175
|
-
#
|
187
|
+
#
|
176
188
|
bool = Process.send(:SetHandleInformation, handle,
|
177
189
|
Process::Constants::HANDLE_FLAG_INHERIT, 0)
|
178
190
|
raise SystemCallError.new("SetHandleInformation", FFI.errno) unless bool
|
179
191
|
end
|
180
192
|
|
181
|
-
# Perform a mount by running an sftp-server on the vagrant host
|
193
|
+
# Perform a mount by running an sftp-server on the vagrant host
|
182
194
|
# and piping stdin/stdout to sshfs running inside the guest
|
183
195
|
def self.sshfs_slave_mount(machine, opts, hostpath, expanded_guest_path)
|
184
196
|
|
@@ -198,24 +210,35 @@ module VagrantPlugins
|
|
198
210
|
|
199
211
|
# The remote sshfs command that will run (in slave mode)
|
200
212
|
sshfs_opts+= ' -o slave '
|
201
|
-
sshfs_cmd = "sudo -E sshfs :#{hostpath} #{expanded_guest_path}"
|
213
|
+
sshfs_cmd = "sudo -E sshfs :#{hostpath} #{expanded_guest_path}"
|
202
214
|
sshfs_cmd+= sshfs_opts + ' ' + sshfs_opts_append + ' '
|
203
215
|
|
204
216
|
# The ssh command to connect to guest and then launch sshfs
|
205
|
-
# Note the backslash escapes for IdentityFile - handles spaces in key path
|
206
217
|
ssh_opts = opts[:ssh_opts]
|
207
218
|
ssh_opts+= ' -o User=' + machine.ssh_info[:username]
|
208
219
|
ssh_opts+= ' -o Port=' + machine.ssh_info[:port].to_s
|
209
|
-
ssh_opts+= ' -o "IdentityFile=\"' + machine.ssh_info[:private_key_path][0] + '\""'
|
210
220
|
ssh_opts+= ' -o UserKnownHostsFile=/dev/null '
|
211
221
|
ssh_opts+= ' -F /dev/null ' # Don't pick up options from user's config
|
222
|
+
if machine.ssh_info.key?(:private_key_path) and
|
223
|
+
machine.ssh_info[:private_key_path] and
|
224
|
+
machine.ssh_info[:private_key_path][0]
|
225
|
+
# Add IdentityFile since there is one
|
226
|
+
# Note the backslash escapes for IdentityFile - handles spaces in key path
|
227
|
+
ssh_opts+= ' -o "IdentityFile=\"' + machine.ssh_info[:private_key_path][0] + '\""'
|
228
|
+
end
|
229
|
+
|
230
|
+
# Use an SSH ProxyCommand when corresponding Vagrant setting is defined
|
231
|
+
if machine.ssh_info[:proxy_command]
|
232
|
+
ssh_opts+= " -o ProxyCommand=\"" + machine.ssh_info[:proxy_command] + "\""
|
233
|
+
end
|
234
|
+
|
212
235
|
ssh_cmd = ssh_path + ssh_opts + ' ' + ssh_opts_append + ' ' + machine.ssh_info[:host]
|
213
236
|
ssh_cmd+= ' "' + sshfs_cmd + '"'
|
214
237
|
|
215
238
|
# Log some information
|
216
239
|
@@logger.debug("sftp-server cmd: #{sftp_server_cmd}")
|
217
240
|
@@logger.debug("ssh cmd: #{ssh_cmd}")
|
218
|
-
machine.ui.info(I18n.t("vagrant.sshfs.actions.slave_mounting_folder",
|
241
|
+
machine.ui.info(I18n.t("vagrant.sshfs.actions.slave_mounting_folder",
|
219
242
|
hostpath: hostpath, guestpath: expanded_guest_path))
|
220
243
|
|
221
244
|
# Create two named pipes for communication between sftp-server and
|
@@ -234,8 +257,8 @@ module VagrantPlugins
|
|
234
257
|
# The way this works is by hooking up the stdin+stdout of the
|
235
258
|
# sftp-server process to the stdin+stdout of the sshfs process
|
236
259
|
# running inside the guest in slave mode. An illustration is below:
|
237
|
-
#
|
238
|
-
# stdout => w1 pipe1 r1 => stdin
|
260
|
+
#
|
261
|
+
# stdout => w1 pipe1 r1 => stdin
|
239
262
|
# />------------->==============>----------->\
|
240
263
|
# / \
|
241
264
|
# | |
|
@@ -243,7 +266,7 @@ module VagrantPlugins
|
|
243
266
|
# | |
|
244
267
|
# \ /
|
245
268
|
# \<-------------<==============<-----------</
|
246
|
-
# stdin <= r2 pipe2 w2 <= stdout
|
269
|
+
# stdin <= r2 pipe2 w2 <= stdout
|
247
270
|
#
|
248
271
|
# Wire up things appropriately and start up the processes
|
249
272
|
if Vagrant::Util::Platform.windows?
|
@@ -319,13 +342,13 @@ module VagrantPlugins
|
|
319
342
|
end
|
320
343
|
|
321
344
|
# Log some information
|
322
|
-
machine.ui.info(I18n.t("vagrant.sshfs.actions.normal_mounting_folder",
|
323
|
-
user: username, host: host,
|
345
|
+
machine.ui.info(I18n.t("vagrant.sshfs.actions.normal_mounting_folder",
|
346
|
+
user: username, host: host,
|
324
347
|
hostpath: hostpath, guestpath: expanded_guest_path))
|
325
|
-
|
348
|
+
|
326
349
|
# Build up the command and connect
|
327
350
|
error_class = VagrantPlugins::SyncedFolderSSHFS::Errors::SSHFSNormalMountFailed
|
328
|
-
cmd = echopipe
|
351
|
+
cmd = echopipe
|
329
352
|
cmd+= "sshfs -p #{port} "
|
330
353
|
cmd+= ssh_opts + ' ' + ssh_opts_append + ' '
|
331
354
|
cmd+= sshfs_opts + ' ' + sshfs_opts_append + ' '
|
@@ -4,7 +4,7 @@ module VagrantPlugins
|
|
4
4
|
class SSHFSGetAbsolutePath
|
5
5
|
def self.sshfs_get_absolute_path(machine, path)
|
6
6
|
abs_path = ""
|
7
|
-
machine.communicate.execute("readlink -f #{path}") do |type, data|
|
7
|
+
machine.communicate.execute("readlink -f #{path}", sudo: true) do |type, data|
|
8
8
|
if type == :stdout
|
9
9
|
abs_path = data
|
10
10
|
end
|
@@ -3,7 +3,7 @@ module VagrantPlugins
|
|
3
3
|
module Cap
|
4
4
|
class SSHFSClient
|
5
5
|
def self.sshfs_install(machine)
|
6
|
-
# Install epel rpm if not installed
|
6
|
+
# Install epel rpm if not installed
|
7
7
|
if !epel_installed(machine)
|
8
8
|
epel_install(machine)
|
9
9
|
end
|
@@ -15,7 +15,7 @@ module VagrantPlugins
|
|
15
15
|
def self.sshfs_installed(machine)
|
16
16
|
machine.communicate.test("rpm -q fuse-sshfs")
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
protected
|
20
20
|
|
21
21
|
def self.epel_installed(machine)
|
@@ -26,7 +26,7 @@ module VagrantPlugins
|
|
26
26
|
case machine.guest.capability("flavor")
|
27
27
|
when :rhel_7
|
28
28
|
machine.communicate.sudo("rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm")
|
29
|
-
when :rhel # rhel6
|
29
|
+
when :rhel # rhel6
|
30
30
|
machine.communicate.sudo("rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm")
|
31
31
|
end
|
32
32
|
end
|
@@ -30,7 +30,7 @@ module VagrantPlugins
|
|
30
30
|
# opts contains something like:
|
31
31
|
# { :type=>:sshfs,
|
32
32
|
# :guestpath=>"/sharedfolder",
|
33
|
-
# :hostpath=>"/guests/sharedfolder",
|
33
|
+
# :hostpath=>"/guests/sharedfolder",
|
34
34
|
# :disabled=>false
|
35
35
|
# :ssh_host=>"192.168.1.1"
|
36
36
|
# :ssh_port=>"22"
|
@@ -46,7 +46,7 @@ module VagrantPlugins
|
|
46
46
|
|
47
47
|
protected
|
48
48
|
|
49
|
-
# Perform a mount by running an sftp-server on the vagrant host
|
49
|
+
# Perform a mount by running an sftp-server on the vagrant host
|
50
50
|
# and piping stdin/stdout to sshfs running inside the guest
|
51
51
|
def self.sshfs_mount(machine, opts)
|
52
52
|
|
@@ -64,7 +64,7 @@ module VagrantPlugins
|
|
64
64
|
opts[:sshfs_opts] = ' -o noauto_cache '# disable caching based on mtime
|
65
65
|
|
66
66
|
# Add in some ssh options that are common to both mount methods
|
67
|
-
opts[:ssh_opts] = ' -o StrictHostKeyChecking=no '# prevent yes/no question
|
67
|
+
opts[:ssh_opts] = ' -o StrictHostKeyChecking=no '# prevent yes/no question
|
68
68
|
opts[:ssh_opts]+= ' -o ServerAliveInterval=30 ' # send keepalives
|
69
69
|
|
70
70
|
# SSH connection options
|
@@ -74,6 +74,13 @@ module VagrantPlugins
|
|
74
74
|
ssh_opts+= ' -o "IdentityFile=\"' + machine.ssh_info[:private_key_path][0] + '\""'
|
75
75
|
ssh_opts+= ' -o UserKnownHostsFile=/dev/null '
|
76
76
|
ssh_opts+= ' -F /dev/null ' # Don't pick up options from user's config
|
77
|
+
if machine.ssh_info.key?(:private_key_path) and
|
78
|
+
machine.ssh_info[:private_key_path] and
|
79
|
+
machine.ssh_info[:private_key_path][0]
|
80
|
+
# Add IdentityFile since there is one
|
81
|
+
# Note the backslash escapes for IdentityFile - handles spaces in key path
|
82
|
+
ssh_opts+= ' -o "IdentityFile=\"' + machine.ssh_info[:private_key_path][0] + '\""'
|
83
|
+
end
|
77
84
|
|
78
85
|
ssh_opts_append = opts[:ssh_opts_append].to_s # provided by user
|
79
86
|
|
@@ -88,12 +95,12 @@ module VagrantPlugins
|
|
88
95
|
# The sshfs command to mount the guest directory on the host
|
89
96
|
sshfs_cmd = "#{sshfs_path} #{ssh_opts} #{ssh_opts_append} "
|
90
97
|
sshfs_cmd+= "#{sshfs_opts} #{sshfs_opts_append} "
|
91
|
-
sshfs_cmd+= "#{username}@#{host}:#{expanded_guest_path} #{hostpath}"
|
98
|
+
sshfs_cmd+= "#{username}@#{host}:#{expanded_guest_path} #{hostpath}"
|
92
99
|
|
93
100
|
# Log some information
|
94
101
|
@@logger.debug("sshfs cmd: #{sshfs_cmd}")
|
95
102
|
|
96
|
-
machine.ui.info(I18n.t("vagrant.sshfs.actions.reverse_mounting_folder",
|
103
|
+
machine.ui.info(I18n.t("vagrant.sshfs.actions.reverse_mounting_folder",
|
97
104
|
hostpath: hostpath, guestpath: expanded_guest_path))
|
98
105
|
|
99
106
|
# Log STDERR to predictable files so that we can inspect them
|
@@ -104,7 +111,7 @@ module VagrantPlugins
|
|
104
111
|
|
105
112
|
# Launch sshfs command to mount guest dir into the host
|
106
113
|
if Vagrant::Util::Platform.windows?
|
107
|
-
# Need to handle Windows differently. Kernel.spawn fails to work,
|
114
|
+
# Need to handle Windows differently. Kernel.spawn fails to work,
|
108
115
|
# if the shell creating the process is closed.
|
109
116
|
# See https://github.com/dustymabe/vagrant-sshfs/issues/31
|
110
117
|
Process.create(:command_line => ssh_cmd,
|
@@ -29,7 +29,7 @@ module VagrantPlugins
|
|
29
29
|
# opts contains something like:
|
30
30
|
# { :type=>:sshfs,
|
31
31
|
# :guestpath=>"/sharedfolder",
|
32
|
-
# :hostpath=>"/guests/sharedfolder",
|
32
|
+
# :hostpath=>"/guests/sharedfolder",
|
33
33
|
# :disabled=>false
|
34
34
|
# :ssh_host=>"192.168.1.1"
|
35
35
|
# :ssh_port=>"22"
|
@@ -45,7 +45,7 @@ module VagrantPlugins
|
|
45
45
|
|
46
46
|
protected
|
47
47
|
|
48
|
-
# Perform a mount by running an sftp-server on the vagrant host
|
48
|
+
# Perform a mount by running an sftp-server on the vagrant host
|
49
49
|
# and piping stdin/stdout to sshfs running inside the guest
|
50
50
|
def self.sshfs_mount(machine, opts)
|
51
51
|
|
@@ -63,16 +63,21 @@ module VagrantPlugins
|
|
63
63
|
opts[:sshfs_opts] = ' -o noauto_cache '# disable caching based on mtime
|
64
64
|
|
65
65
|
# Add in some ssh options that are common to both mount methods
|
66
|
-
opts[:ssh_opts] = ' -o StrictHostKeyChecking=no '# prevent yes/no question
|
66
|
+
opts[:ssh_opts] = ' -o StrictHostKeyChecking=no '# prevent yes/no question
|
67
67
|
opts[:ssh_opts]+= ' -o ServerAliveInterval=30 ' # send keepalives
|
68
68
|
|
69
69
|
# SSH connection options
|
70
|
-
# Note the backslash escapes for IdentityFile - handles spaces in key path
|
71
70
|
ssh_opts = opts[:ssh_opts]
|
72
71
|
ssh_opts+= ' -o Port=' + machine.ssh_info[:port].to_s
|
73
|
-
ssh_opts+= ' -o "IdentityFile=\"' + machine.ssh_info[:private_key_path][0] + '\""'
|
74
72
|
ssh_opts+= ' -o UserKnownHostsFile=/dev/null '
|
75
73
|
ssh_opts+= ' -F /dev/null ' # Don't pick up options from user's config
|
74
|
+
if machine.ssh_info.key?(:private_key_path) and
|
75
|
+
machine.ssh_info[:private_key_path] and
|
76
|
+
machine.ssh_info[:private_key_path][0]
|
77
|
+
# Add IdentityFile since there is one
|
78
|
+
# Note the backslash escapes for IdentityFile - handles spaces in key path
|
79
|
+
ssh_opts+= ' -o "IdentityFile=\"' + machine.ssh_info[:private_key_path][0] + '\""'
|
80
|
+
end
|
76
81
|
|
77
82
|
ssh_opts_append = opts[:ssh_opts_append].to_s # provided by user
|
78
83
|
|
@@ -87,12 +92,12 @@ module VagrantPlugins
|
|
87
92
|
# The sshfs command to mount the guest directory on the host
|
88
93
|
sshfs_cmd = "#{sshfs_path} #{ssh_opts} #{ssh_opts_append} "
|
89
94
|
sshfs_cmd+= "#{sshfs_opts} #{sshfs_opts_append} "
|
90
|
-
sshfs_cmd+= "#{username}@#{host}:#{expanded_guest_path} #{hostpath}"
|
95
|
+
sshfs_cmd+= "#{username}@#{host}:#{expanded_guest_path} #{hostpath}"
|
91
96
|
|
92
97
|
# Log some information
|
93
98
|
@@logger.debug("sshfs cmd: #{sshfs_cmd}")
|
94
99
|
|
95
|
-
machine.ui.info(I18n.t("vagrant.sshfs.actions.reverse_mounting_folder",
|
100
|
+
machine.ui.info(I18n.t("vagrant.sshfs.actions.reverse_mounting_folder",
|
96
101
|
hostpath: hostpath, guestpath: expanded_guest_path))
|
97
102
|
|
98
103
|
# Log STDERR to predictable files so that we can inspect them
|
@@ -103,7 +108,7 @@ module VagrantPlugins
|
|
103
108
|
|
104
109
|
# Launch sshfs command to mount guest dir into the host
|
105
110
|
if Vagrant::Util::Platform.windows?
|
106
|
-
# Need to handle Windows differently. Kernel.spawn fails to work,
|
111
|
+
# Need to handle Windows differently. Kernel.spawn fails to work,
|
107
112
|
# if the shell creating the process is closed.
|
108
113
|
# See https://github.com/dustymabe/vagrant-sshfs/issues/31
|
109
114
|
Process.create(:command_line => ssh_cmd,
|
data/lib/vagrant-sshfs/plugin.rb
CHANGED
@@ -20,6 +20,23 @@ module VagrantPlugins
|
|
20
20
|
Command::SSHFS
|
21
21
|
end
|
22
22
|
|
23
|
+
# The following two hooks allow us to workaround
|
24
|
+
# the config validations that assume the hostpaths
|
25
|
+
# are coming from our host machine. This is not the
|
26
|
+
# case for arbitrary host mounts.
|
27
|
+
action_hook("sshfs_hostpath_fixup") do |hook|
|
28
|
+
require_relative "action_hostpath_fixup"
|
29
|
+
hook.before(
|
30
|
+
Vagrant::Action::Builtin::ConfigValidate,
|
31
|
+
HostPathFix)
|
32
|
+
end
|
33
|
+
action_hook("sshfs_hostpath_unfix") do |hook|
|
34
|
+
require_relative "action_hostpath_fixup"
|
35
|
+
hook.after(
|
36
|
+
Vagrant::Action::Builtin::ConfigValidate,
|
37
|
+
HostPathUnfix)
|
38
|
+
end
|
39
|
+
|
23
40
|
host_capability("linux", "sshfs_reverse_mount_folder") do
|
24
41
|
require_relative "cap/host/linux/sshfs_reverse_mount"
|
25
42
|
VagrantPlugins::HostLinux::Cap::MountSSHFS
|
@@ -120,6 +137,35 @@ module VagrantPlugins
|
|
120
137
|
VagrantPlugins::GuestSUSE::Cap::SSHFSClient
|
121
138
|
end
|
122
139
|
|
140
|
+
guest_capability("freebsd", "sshfs_forward_mount_folder") do
|
141
|
+
require_relative "cap/guest/freebsd/sshfs_forward_mount"
|
142
|
+
VagrantPlugins::GuestFreeBSD::Cap::MountSSHFS
|
143
|
+
end
|
144
|
+
|
145
|
+
guest_capability("freebsd", "sshfs_forward_unmount_folder") do
|
146
|
+
require_relative "cap/guest/freebsd/sshfs_forward_mount"
|
147
|
+
VagrantPlugins::GuestFreeBSD::Cap::MountSSHFS
|
148
|
+
end
|
149
|
+
|
150
|
+
guest_capability("freebsd", "sshfs_forward_is_folder_mounted") do
|
151
|
+
require_relative "cap/guest/freebsd/sshfs_forward_mount"
|
152
|
+
VagrantPlugins::GuestFreeBSD::Cap::MountSSHFS
|
153
|
+
end
|
154
|
+
|
155
|
+
guest_capability("freebsd", "sshfs_get_absolute_path") do
|
156
|
+
require_relative "cap/guest/linux/sshfs_get_absolute_path"
|
157
|
+
VagrantPlugins::GuestLinux::Cap::SSHFSGetAbsolutePath
|
158
|
+
end
|
159
|
+
|
160
|
+
guest_capability("freebsd", "sshfs_install") do
|
161
|
+
require_relative "cap/guest/freebsd/sshfs_client"
|
162
|
+
VagrantPlugins::GuestFreeBSD::Cap::SSHFSClient
|
163
|
+
end
|
164
|
+
|
165
|
+
guest_capability("freebsd", "sshfs_installed") do
|
166
|
+
require_relative "cap/guest/freebsd/sshfs_client"
|
167
|
+
VagrantPlugins::GuestFreeBSD::Cap::SSHFSClient
|
168
|
+
end
|
123
169
|
end
|
124
170
|
end
|
125
171
|
end
|
@@ -113,6 +113,7 @@ module VagrantPlugins
|
|
113
113
|
ENV['PATH'] += ':/usr/libexec/openssh' # Linux (Red Hat Family)
|
114
114
|
ENV['PATH'] += ':/usr/lib/openssh' # Linux (Debian Family)
|
115
115
|
ENV['PATH'] += ':/usr/lib/ssh' # Linux (Arch Linux Family)
|
116
|
+
ENV['PATH'] += ':/usr/lib/misc' # Linux (Gentoo Family)
|
116
117
|
ENV['PATH'] += ':/usr/libexec/' # Mac OS X
|
117
118
|
end
|
118
119
|
|
data/test/libvirt/Vagrantfile
CHANGED
data/test/misc/Vagrantfile
CHANGED
@@ -10,7 +10,7 @@ Vagrant.configure(2) do |config|
|
|
10
10
|
# https://github.com/dustymabe/vagrant-sshfs/issues/44
|
11
11
|
config.vm.synced_folder "/etc/", "/sbin/forward_slave_mount_sym_link_test/", type: "sshfs"
|
12
12
|
|
13
|
-
# Test a forward normal mount:
|
13
|
+
# Test a forward normal mount:
|
14
14
|
# mounting a folder from a 3rd party host into guest
|
15
15
|
config.vm.synced_folder "/etc/", "/tmp/forward_normal_mount_etc/", type: "sshfs",
|
16
16
|
ssh_host: ENV['THIRD_PARTY_HOST'],
|
@@ -22,7 +22,7 @@ Vagrant.configure(2) do |config|
|
|
22
22
|
config.vm.synced_folder "/tmp/reverse_mount_etc/", "/etc", type: "sshfs", reverse: true
|
23
23
|
|
24
24
|
host = 'vagrant-sshfs-tests'
|
25
|
-
box = 'fedora/
|
25
|
+
box = 'fedora/25-cloud-base'
|
26
26
|
|
27
27
|
config.vm.define host do | tmp |
|
28
28
|
tmp.vm.hostname = host
|
data/test/virtualbox/Vagrantfile
CHANGED
data/vagrant-sshfs.gemspec
CHANGED
@@ -23,9 +23,9 @@ Gem::Specification.new do |spec|
|
|
23
23
|
|
24
24
|
spec.add_dependency 'win32-process'
|
25
25
|
|
26
|
-
spec.add_development_dependency 'bundler'
|
27
|
-
spec.add_development_dependency 'rake'
|
28
|
-
spec.add_development_dependency 'cucumber'
|
29
|
-
spec.add_development_dependency 'aruba'
|
30
|
-
spec.add_development_dependency 'komenda'
|
26
|
+
spec.add_development_dependency 'bundler'
|
27
|
+
spec.add_development_dependency 'rake'
|
28
|
+
spec.add_development_dependency 'cucumber'
|
29
|
+
spec.add_development_dependency 'aruba'
|
30
|
+
spec.add_development_dependency 'komenda'
|
31
31
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-sshfs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dusty Mabe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-03-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: win32-process
|
@@ -28,72 +28,72 @@ dependencies:
|
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: cucumber
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: aruba
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0
|
75
|
+
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0
|
82
|
+
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: komenda
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0
|
89
|
+
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0
|
96
|
+
version: '0'
|
97
97
|
description: "\n A Vagrant synced folder plugin that mounts folders via SSHFS.
|
98
98
|
\n This is the successor to Fabio Kreusch's implementation:\n https://github.com/fabiokr/vagrant-sshfs"
|
99
99
|
email:
|
@@ -113,9 +113,12 @@ files:
|
|
113
113
|
- features/step_definitions/sshfs_cwd_mount_steps.rb
|
114
114
|
- features/support/env.rb
|
115
115
|
- lib/vagrant-sshfs.rb
|
116
|
+
- lib/vagrant-sshfs/action_hostpath_fixup.rb
|
116
117
|
- lib/vagrant-sshfs/cap/guest/arch/sshfs_client.rb
|
117
118
|
- lib/vagrant-sshfs/cap/guest/debian/sshfs_client.rb
|
118
119
|
- lib/vagrant-sshfs/cap/guest/fedora/sshfs_client.rb
|
120
|
+
- lib/vagrant-sshfs/cap/guest/freebsd/sshfs_client.rb
|
121
|
+
- lib/vagrant-sshfs/cap/guest/freebsd/sshfs_forward_mount.rb
|
119
122
|
- lib/vagrant-sshfs/cap/guest/linux/sshfs_client.rb
|
120
123
|
- lib/vagrant-sshfs/cap/guest/linux/sshfs_forward_mount.rb
|
121
124
|
- lib/vagrant-sshfs/cap/guest/linux/sshfs_get_absolute_path.rb
|
@@ -159,7 +162,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
159
162
|
version: '0'
|
160
163
|
requirements: []
|
161
164
|
rubyforge_project:
|
162
|
-
rubygems_version: 2.
|
165
|
+
rubygems_version: 2.6.14.1
|
163
166
|
signing_key:
|
164
167
|
specification_version: 4
|
165
168
|
summary: 'A Vagrant synced folder plugin that mounts folders via SSHFS. This is the
|