vagrant-scp-sync 0.5.10 → 0.5.11
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/CHANGELOG.md +17 -0
- data/lib/vagrant-scp-sync/action/scp_sync.rb +81 -42
- data/lib/vagrant-scp-sync/command/scp.rb +1 -1
- data/lib/vagrant-scp-sync/errors.rb +36 -9
- data/lib/vagrant-scp-sync/plugin.rb +38 -1
- data/lib/vagrant-scp-sync/synced_folder.rb +4 -3
- data/lib/vagrant-scp-sync/version.rb +1 -1
- data/lib/vagrant-scp-sync.rb +14 -3
- data/locales/en.yml +39 -4
- 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: a6dab1627126fa4175b128368987b80ba059ada1226d05346325bac4c124fe4c
|
4
|
+
data.tar.gz: ecf339d488869952c926f2226bdc0e584c6c4c9139455497a89a65441d544868
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca832eaa5a34e0f0535ec8ff2e7806cf0ba2f472e5df84e8c6f1973af1f1cbf0a2148e240b516c4f20246e077b670d0bee449c5c5a35d760d9eef83262603cee
|
7
|
+
data.tar.gz: 45ba7fa7c86c90836a8c1b78427e0e1a250ce348c8e1b34a7effcc7d1b0612c69d3a7a140ea0659e0bcd640a8b559672041caa31dd0d496af1faebce190f50e0
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [0.5.11](https://github.com/STARTcloud/vagrant-scp-sync/compare/v0.5.10...v0.5.11) (2024-11-20)
|
4
|
+
|
5
|
+
|
6
|
+
### Bug Fixes
|
7
|
+
|
8
|
+
* implentation complete ([987197d](https://github.com/STARTcloud/vagrant-scp-sync/commit/987197d15506d7c11b08af2e279efeb178037b71))
|
9
|
+
* linting ([c531e5b](https://github.com/STARTcloud/vagrant-scp-sync/commit/c531e5b2137781d6c670dc1cc0053d79a63637b6))
|
10
|
+
* linting ([9720ea7](https://github.com/STARTcloud/vagrant-scp-sync/commit/9720ea74d683180f213b62dc45c821b3b3e9c615))
|
11
|
+
* linting ([dbc75c3](https://github.com/STARTcloud/vagrant-scp-sync/commit/dbc75c328c7e5e042d02e8c7472a83e3898b274b))
|
12
|
+
* linting ([fbb7533](https://github.com/STARTcloud/vagrant-scp-sync/commit/fbb7533ee869bd1d761fd33b365b26bcca9557c7))
|
13
|
+
* linting ([70266d1](https://github.com/STARTcloud/vagrant-scp-sync/commit/70266d1a4aafe9e68ed9e1f5f0242268f1f3e5cc))
|
14
|
+
* linting ([3e7facd](https://github.com/STARTcloud/vagrant-scp-sync/commit/3e7facd04a4af7060773e96b6e298a2c0ae0f953))
|
15
|
+
* linting ([da0ef5d](https://github.com/STARTcloud/vagrant-scp-sync/commit/da0ef5d2435ca6cef31fc626891d1144677a34bb))
|
16
|
+
* synced folders reference ([2b8ade9](https://github.com/STARTcloud/vagrant-scp-sync/commit/2b8ade9ef7d896e11851eb004ac687031f8dd1a0))
|
17
|
+
* synced folders refernce ([3efe97c](https://github.com/STARTcloud/vagrant-scp-sync/commit/3efe97c50ea6e18e5aca4876c2fd05003401ddb0))
|
18
|
+
* synced folders refernce ([fa1dfc5](https://github.com/STARTcloud/vagrant-scp-sync/commit/fa1dfc5a04611ac623b84cd02c7c513fb390936e))
|
19
|
+
|
3
20
|
## [0.5.10](https://github.com/STARTcloud/vagrant-scp-sync/compare/v0.5.9...v0.5.10) (2024-11-19)
|
4
21
|
|
5
22
|
|
@@ -7,65 +7,104 @@ module VagrantPlugins
|
|
7
7
|
module ScpSync
|
8
8
|
# This will SCP the files
|
9
9
|
class ScpSyncHelper
|
10
|
-
def self.scp_single(machine, opts)
|
10
|
+
def self.scp_single(machine, opts, scp_path)
|
11
11
|
ssh_info = machine.ssh_info
|
12
12
|
raise Vagrant::Errors::SSHNotReady if ssh_info.nil?
|
13
13
|
|
14
|
-
source_files = opts[:
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
target_files =
|
19
|
-
|
20
|
-
target_files += '/' unless target_files.end_with?('/')
|
14
|
+
source_files = expand_path(opts[:map], machine)
|
15
|
+
has_trailing_slash_source = opts[:map].end_with?('/')
|
16
|
+
sync_source_files = append_wildcard(source_files, has_trailing_slash_source)
|
17
|
+
|
18
|
+
target_files = expand_path(opts[:to], machine)
|
19
|
+
|
21
20
|
opts[:owner] ||= ssh_info[:username]
|
22
21
|
opts[:group] ||= ssh_info[:username]
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
''
|
29
|
-
end
|
22
|
+
|
23
|
+
ssh_opts = build_ssh_options(ssh_info)
|
24
|
+
scp_opts = build_scp_options(opts)
|
25
|
+
|
26
|
+
delete = scp_opts.include?('--delete')
|
30
27
|
|
31
28
|
if opts[:direction] == :upload || opts[:direction].nil?
|
32
|
-
source =
|
33
|
-
target = "#{username}@#{host}
|
29
|
+
source = sync_source_files
|
30
|
+
target = "#{ssh_info[:username]}@#{ssh_info[:host]}:#{target_files}"
|
31
|
+
make_dir = build_ssh_command(ssh_opts, "sudo mkdir -p #{target_files}", ssh_info)
|
32
|
+
change_ownership = build_ssh_command(ssh_opts, "sudo chown -R #{opts[:owner]}:#{opts[:group]} #{target_files}", ssh_info)
|
33
|
+
change_permissions = build_ssh_command(ssh_opts, "sudo chmod 777 #{target_files}", ssh_info)
|
34
|
+
remove_dir = build_ssh_command(ssh_opts, "sudo rm -rf #{target_files}", ssh_info)
|
34
35
|
elsif opts[:direction] == :download
|
35
|
-
source = "#{username}@#{host}
|
36
|
-
target =
|
36
|
+
source = "#{ssh_info[:username]}@#{ssh_info[:host]}:#{sync_source_files}"
|
37
|
+
target = target_files
|
38
|
+
make_dir = "mkdir -p #{target_files}"
|
37
39
|
end
|
38
40
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
proxy_command,
|
47
|
-
@ssh_info[:private_key_path].map { |k| "-i '#{k}'" }.join(' '),
|
48
|
-
source,
|
49
|
-
target
|
50
|
-
].join(' ')
|
41
|
+
synchronize = build_scp_command(scp_path, ssh_opts, source, target)
|
42
|
+
execute_command(machine, remove_dir, delete, nil, opts)
|
43
|
+
execute_command(machine, make_dir, false, nil, opts)
|
44
|
+
execute_command(machine, change_ownership, false, nil, opts)
|
45
|
+
execute_command(machine, change_permissions, false, nil, opts)
|
46
|
+
execute_command(machine, synchronize, true, 'scp_sync_folder', opts)
|
47
|
+
end
|
51
48
|
|
52
|
-
|
53
|
-
|
49
|
+
def self.expand_path(path, machine)
|
50
|
+
expanded_path = File.expand_path(path, machine.env.root_path)
|
51
|
+
Vagrant::Util::Platform.fs_real_path(expanded_path).to_s
|
52
|
+
end
|
54
53
|
|
55
|
-
|
54
|
+
def self.append_wildcard(path, has_trailing_slash)
|
55
|
+
has_trailing_slash ? "#{path}/*" : path
|
56
|
+
end
|
56
57
|
|
57
|
-
|
58
|
+
def self.build_ssh_options(ssh_info)
|
59
|
+
opts = %w[
|
60
|
+
-o StrictHostKeyChecking=no
|
61
|
+
-o UserKnownHostsFile=/dev/null
|
62
|
+
-o LogLevel=ERROR
|
63
|
+
]
|
64
|
+
opts << "-o port=#{ssh_info[:port]}"
|
65
|
+
opts << ssh_info[:private_key_path].map { |k| "-i #{k}" }.join(' ')
|
66
|
+
opts
|
67
|
+
end
|
58
68
|
|
59
|
-
|
69
|
+
def self.build_scp_options(opts)
|
70
|
+
opts[:scp__args] ? Array(opts[:scp__args]).dup : ['--verbose']
|
71
|
+
end
|
60
72
|
|
61
|
-
|
73
|
+
def self.build_ssh_command(ssh_opts, command, ssh_info)
|
74
|
+
['ssh', *ssh_opts, "#{ssh_info[:username]}@#{ssh_info[:host]}", command].join(' ')
|
75
|
+
end
|
62
76
|
|
63
|
-
|
64
|
-
|
65
|
-
source_files: source_files,
|
66
|
-
target_files: target_files,
|
67
|
-
stderr: r.stderr
|
77
|
+
def self.build_scp_command(scp_path, ssh_opts, source, target)
|
78
|
+
[scp_path, '-r', *ssh_opts, source, target].join(' ')
|
68
79
|
end
|
80
|
+
|
81
|
+
def self.execute_command(machine, command, raise_error, message_key, opts)
|
82
|
+
return if command.nil?
|
83
|
+
|
84
|
+
if message_key
|
85
|
+
machine.ui.info(
|
86
|
+
I18n.t(
|
87
|
+
"vagrant_scp_sync.action.#{message_key}",
|
88
|
+
command: command,
|
89
|
+
target_files: opts[:to],
|
90
|
+
source_files: opts[:map]
|
91
|
+
)
|
92
|
+
)
|
93
|
+
end
|
94
|
+
|
95
|
+
result = Vagrant::Util::Subprocess.execute('sh', '-c', command)
|
96
|
+
|
97
|
+
raise_scp_error(message_key, command, result.stderr) if raise_error && !result.exit_code.zero?
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.raise_scp_error(message_key, command, stderr)
|
101
|
+
raise Errors.const_get("SyncedFolderScpSync#{message_key.split('_').map(&:capitalize).join}Error"),
|
102
|
+
command: command,
|
103
|
+
stderr: stderr
|
104
|
+
end
|
105
|
+
|
106
|
+
private_class_method :expand_path, :append_wildcard, :build_ssh_options, :build_scp_options,
|
107
|
+
:build_ssh_command, :build_scp_command, :execute_command, :raise_scp_error
|
69
108
|
end
|
70
109
|
end
|
71
110
|
end
|
@@ -2,16 +2,43 @@
|
|
2
2
|
|
3
3
|
require 'vagrant'
|
4
4
|
|
5
|
-
module
|
6
|
-
module
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
module VagrantPlugins
|
6
|
+
module ScpSync
|
7
|
+
module Errors
|
8
|
+
# Namespace for Vagrant SCP Sync Errors
|
9
|
+
class VagrantScpSyncError < Vagrant::Errors::VagrantError
|
10
|
+
error_namespace('vagrant_scp_sync.errors')
|
11
|
+
end
|
12
|
+
|
13
|
+
# This Class denotes Errors for SCP Sync
|
14
|
+
class SyncedFolderScpSyncError < VagrantScpSyncError
|
15
|
+
error_key(:scp_sync_error, 'vagrant_scp_sync.errors')
|
16
|
+
end
|
17
|
+
|
18
|
+
# This Class denotes Delete Dir Errors for SCP Sync
|
19
|
+
class SyncedFolderScpSyncDeleteDirError < VagrantScpSyncError
|
20
|
+
error_key(:scp_sync_error_delete_directory, 'vagrant_scp_sync.errors')
|
21
|
+
end
|
22
|
+
|
23
|
+
# This Class denotes Make Dir Errors for SCP Sync
|
24
|
+
class SyncedFolderScpSyncMakeDirError < VagrantScpSyncError
|
25
|
+
error_key(:scp_sync_error_make_directory, 'vagrant_scp_sync.errors')
|
26
|
+
end
|
27
|
+
|
28
|
+
# This Class denotes Make Dir Errors for SCP Sync
|
29
|
+
class SyncedFolderScpSyncChangePermissionsDirError < VagrantScpSyncError
|
30
|
+
error_key(:scp_sync_error_change_permissions_directory, 'vagrant_scp_sync.errors')
|
31
|
+
end
|
32
|
+
|
33
|
+
# This Class denotes Make Dir Errors for SCP Sync
|
34
|
+
class SyncedFolderScpSyncChangeOwnershipDirError < VagrantScpSyncError
|
35
|
+
error_key(:scp_sync_error_change_ownership_directory, 'vagrant_scp_sync.errors')
|
36
|
+
end
|
11
37
|
|
12
|
-
|
13
|
-
|
14
|
-
|
38
|
+
# This Class denotes that SCP Sync is not found
|
39
|
+
class SCPNotFound < VagrantScpSyncError
|
40
|
+
error_key(:scp_installed_error, 'vagrant_scp_sync.errors')
|
41
|
+
end
|
15
42
|
end
|
16
43
|
end
|
17
44
|
end
|
@@ -19,7 +19,7 @@ module VagrantPlugins
|
|
19
19
|
|
20
20
|
command 'scp' do
|
21
21
|
setup_i18n
|
22
|
-
require_relative 'command'
|
22
|
+
require_relative 'command/scp'
|
23
23
|
Command
|
24
24
|
end
|
25
25
|
|
@@ -28,10 +28,47 @@ module VagrantPlugins
|
|
28
28
|
SyncedFolder
|
29
29
|
end
|
30
30
|
|
31
|
+
# This initializes the internationalization strings.
|
31
32
|
def self.setup_i18n
|
32
33
|
I18n.load_path << File.expand_path('locales/en.yml', ScpSync.source_root)
|
33
34
|
I18n.reload!
|
34
35
|
end
|
36
|
+
|
37
|
+
# This sets up our log level to be whatever VAGRANT_LOG is.
|
38
|
+
def self.setup_logging
|
39
|
+
require 'log4r'
|
40
|
+
|
41
|
+
level = nil
|
42
|
+
begin
|
43
|
+
level = Log4r.const_get(ENV['VAGRANT_LOG'].upcase)
|
44
|
+
rescue NameError
|
45
|
+
# This means that the logging constant wasn't found,
|
46
|
+
# which is fine. We just keep `level` as `nil`. But
|
47
|
+
# we tell the user.
|
48
|
+
level = nil
|
49
|
+
end
|
50
|
+
|
51
|
+
# Some constants, such as "true" resolve to booleans, so the
|
52
|
+
# above error checking doesn't catch it. This will check to make
|
53
|
+
# sure that the log level is an integer, as Log4r requires.
|
54
|
+
level = nil unless level.is_a?(Integer)
|
55
|
+
|
56
|
+
# Set the logging level on all "vagrant" namespaced
|
57
|
+
# logs as long as we have a valid level.
|
58
|
+
|
59
|
+
return unless level
|
60
|
+
|
61
|
+
logger = Log4r::Logger.new('vagrant_scp_sync')
|
62
|
+
logger.outputters = Log4r::Outputter.stderr
|
63
|
+
logger.level = level
|
64
|
+
logger
|
65
|
+
end
|
66
|
+
|
67
|
+
# Setup logging and i18n before any autoloading loads other classes
|
68
|
+
# with logging configured as this prevents inheritance of the log level
|
69
|
+
# from the parent logger.
|
70
|
+
setup_logging
|
71
|
+
setup_i18n
|
35
72
|
end
|
36
73
|
end
|
37
74
|
end
|
@@ -18,11 +18,11 @@ module VagrantPlugins
|
|
18
18
|
@logger = Log4r::Logger.new('vagrant_scp_sync')
|
19
19
|
end
|
20
20
|
|
21
|
-
def usable?(_machine,
|
21
|
+
def usable?(_machine, *args)
|
22
22
|
scp_path = Which.which('scp')
|
23
23
|
return true if scp_path
|
24
24
|
|
25
|
-
return false unless raise_error
|
25
|
+
return false unless args.include?(:raise_error) && args[:raise_error]
|
26
26
|
|
27
27
|
raise Vagrant::Errors::SCPNotFound
|
28
28
|
end
|
@@ -31,11 +31,12 @@ module VagrantPlugins
|
|
31
31
|
|
32
32
|
def enable(machine, folders, _opts)
|
33
33
|
ssh_info = machine.ssh_info
|
34
|
+
scp_path = Which.which('scp')
|
34
35
|
|
35
36
|
machine.ui.warn(I18n.t('vagrant.scp_ssh_password')) if ssh_info[:private_key_path].empty? && ssh_info[:password]
|
36
37
|
|
37
38
|
folders.each_value do |folder_opts|
|
38
|
-
ScpSyncHelper.scp_single(machine, folder_opts)
|
39
|
+
ScpSyncHelper.scp_single(machine, folder_opts, scp_path)
|
39
40
|
end
|
40
41
|
end
|
41
42
|
end
|
data/lib/vagrant-scp-sync.rb
CHANGED
@@ -1,14 +1,25 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require '
|
4
|
-
require 'vagrant-scp-sync/plugin'
|
5
|
-
require 'vagrant-scp-sync/errors'
|
3
|
+
require 'pathname'
|
6
4
|
|
7
5
|
module VagrantPlugins
|
8
6
|
# This is used to SCP files to/from Guests and Hosts
|
9
7
|
module ScpSync
|
8
|
+
lib_path = Pathname.new(File.expand_path('vagrant-scp-sync', __dir__))
|
9
|
+
autoload :Errors, lib_path.join('errors')
|
10
10
|
def self.source_root
|
11
11
|
@source_root ||= Pathname.new(File.expand_path('..', __dir__))
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
15
|
+
|
16
|
+
begin
|
17
|
+
require 'vagrant'
|
18
|
+
rescue LoadError
|
19
|
+
raise 'The Vagrant vagrant-zones plugin must be run within Vagrant.'
|
20
|
+
end
|
21
|
+
|
22
|
+
raise 'The Vagrant vagrant-zones plugin is only compatible with Vagrant 2+.' if Vagrant::VERSION < '2'
|
23
|
+
|
24
|
+
require 'vagrant-scp-sync/version'
|
25
|
+
require 'vagrant-scp-sync/plugin'
|
data/locales/en.yml
CHANGED
@@ -1,18 +1,53 @@
|
|
1
1
|
en:
|
2
2
|
vagrant_scp_sync:
|
3
|
+
action:
|
4
|
+
scp_sync_folder: |-
|
5
|
+
Syncing Folder: %{source_files} ==> %{target_files}
|
6
|
+
|
3
7
|
errors:
|
4
8
|
not_yet_implemented: |-
|
5
9
|
Configuration is not yet implemented
|
10
|
+
scp_sync_error_delete_directory: |-
|
11
|
+
There was an error when attemping to delete the directory for SCP Sync.
|
12
|
+
Target Files: %{target_files}
|
13
|
+
|
14
|
+
Error: %{stderr}
|
15
|
+
Full command causing error:
|
16
|
+
%{command}
|
17
|
+
|
18
|
+
scp_sync_error_change_ownership_directory: |-
|
19
|
+
There was an error when attemping to change the ownership of the directory for SCP Sync.
|
20
|
+
Target Files: %{target_files}
|
21
|
+
|
22
|
+
Error: %{stderr}
|
23
|
+
Full command causing error:
|
24
|
+
%{command}
|
25
|
+
|
26
|
+
scp_sync_error_change_permissions_directory: |-
|
27
|
+
There was an error when attemping to change the permissions of the directory for SCP Sync.
|
28
|
+
Target Files: %{target_files}
|
29
|
+
|
30
|
+
Error: %{stderr}
|
31
|
+
Full command causing error:
|
32
|
+
%{command}
|
33
|
+
|
34
|
+
scp_sync_error_make_directory: |-
|
35
|
+
There was an error when attemping to create the directory for SCP Sync.
|
36
|
+
Target Files: %{target_files}
|
37
|
+
|
38
|
+
Error: %{stderr}
|
39
|
+
Full command causing error:
|
40
|
+
%{command}
|
6
41
|
|
7
42
|
scp_sync_error: |-
|
8
43
|
There was an error when attemping to sync folders using scp.
|
9
44
|
Please inspect the error message below for more info.
|
10
45
|
|
11
|
-
|
12
|
-
|
46
|
+
Source Files: %{source_files}
|
47
|
+
Target Files: %{target_files}
|
13
48
|
Error: %{stderr}
|
14
|
-
Full command causing error:
|
49
|
+
Full command causing error:
|
15
50
|
%{command}
|
16
51
|
|
17
52
|
scp_installed_error: |-
|
18
|
-
SCP was not detected as installed
|
53
|
+
SCP was not detected as installed
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-scp-sync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Gilbert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-11-
|
11
|
+
date: 2024-11-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: i18n
|