s3rsync 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/s3rsync/base.rb +3 -2
- data/lib/s3rsync/cli.rb +17 -15
- data/lib/s3rsync/sync.rb +43 -10
- data/lib/s3rsync/templates/s3cmd_conf.erb +44 -0
- data/lib/s3rsync/version.rb +1 -1
- data/spec/sync_spec.rb +28 -15
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MDUyOTRiOWFhOWJjNmY4ZjVkZWI0NzFkY2IwNWFlM2EzNjU5Yzk2Zg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MTg4ZjgzMDA0YzgxMDM5NmQ4YjIzZDdhMmRhZmYzNzRmYjhjMGY5OA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZTM3OGY2NWQzMTVmM2RjN2U2NGZhYmM3Njc1YjIwODM4ZGI4MmNlZDc4YTQw
|
10
|
+
YWVlMjBlOTcwYjdhYzI1NzY3ZDY4OGQ1YWRkZTRiMzI0NDYxNDQ2OWY2YmM4
|
11
|
+
NDEwMGZiNDQ2OGFjN2I5NTE2MTc4Mjg1ZWExYzg4NDVhY2QwMWM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YmIzZGEwMzZiZmU1NmE4ZmMzNTBmMWE4ZWIxYjFjZWE3MTg3ZmQ1YTBhNjhk
|
14
|
+
ZGJlOGZkMjkxM2EzYzU5ZWM5YTNlNmMwNjBjNTNhMzJkNDU3N2RlNjA0NWRl
|
15
|
+
M2UyZmEzOTEwOTlmZjVlMmVhMTAyNjNlNGU2ZjcyZWY0YzZiZWU=
|
data/lib/s3rsync/base.rb
CHANGED
@@ -4,8 +4,9 @@ require 'socket'
|
|
4
4
|
|
5
5
|
module S3Rsync
|
6
6
|
class Base
|
7
|
-
def init_logger
|
8
|
-
|
7
|
+
def init_logger(log_path = nil)
|
8
|
+
output_file = log_path.nil? ? STDOUT : log_path
|
9
|
+
logger = Logger.new(output_file)
|
9
10
|
logger.level = (!ENV['DEBUG'].nil?) ? Logger::DEBUG : Logger::INFO
|
10
11
|
logger.debug "logger.level: #{logger.level}"
|
11
12
|
logger
|
data/lib/s3rsync/cli.rb
CHANGED
@@ -2,29 +2,31 @@ require 'thor'
|
|
2
2
|
|
3
3
|
module S3Rsync
|
4
4
|
class CLI < Thor
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
5
|
+
|
6
|
+
def self.common_opts
|
7
|
+
method_option :path, :aliases => "-p", :required => true
|
8
|
+
method_option :'config-path', :aliases => "-c", :required => true
|
9
|
+
method_option :'s3-prefix', :aliases => "-s", :default => 's3rsync'
|
10
|
+
method_option :'log-path', :aliases => "-l"
|
11
|
+
method_option :'dry-run', :aliases => "-d", :type => :boolean, :default => false
|
12
|
+
end
|
13
|
+
|
14
|
+
desc "upload", "sync from local to s3"
|
15
|
+
common_opts
|
13
16
|
def upload
|
14
17
|
require 's3rsync/sync'
|
15
18
|
sync = Sync.new(options)
|
16
|
-
sync.run(:upload)
|
19
|
+
exit sync.run(:upload)
|
17
20
|
end
|
18
21
|
|
19
|
-
desc "download", "
|
20
|
-
|
21
|
-
method_option :config_path, :aliases => "-c", :required => true
|
22
|
-
method_option :s3_prefix, :aliases => "-p", :default => 's3rsync'
|
22
|
+
desc "download", "sync from s3 to local"
|
23
|
+
common_opts
|
23
24
|
def download
|
24
25
|
require 's3rsync/sync'
|
25
26
|
sync = Sync.new(options)
|
26
|
-
sync.run(:download)
|
27
|
+
exit sync.run(:download)
|
27
28
|
end
|
28
|
-
|
29
|
+
|
29
30
|
end
|
31
|
+
|
30
32
|
end
|
data/lib/s3rsync/sync.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
require "s3rsync"
|
2
2
|
require "json"
|
3
3
|
require "lockfile"
|
4
|
+
require "erb"
|
4
5
|
|
5
6
|
module S3Rsync
|
6
7
|
class Sync < Base
|
7
8
|
|
8
9
|
def initialize(opt)
|
9
|
-
@log = init_logger
|
10
|
+
@log = init_logger(opt['log-path'])
|
10
11
|
@log.debug "opt: #{opt.inspect}"
|
11
12
|
@params = {}
|
12
|
-
@params[:
|
13
|
-
@params[:s3_prefix] = opt['
|
14
|
-
@params[:config_path] = opt['
|
15
|
-
@
|
16
|
-
|
13
|
+
@params[:path] = opt['path'].chomp('/')
|
14
|
+
@params[:s3_prefix] = opt['s3-prefix']
|
15
|
+
@params[:config_path] = opt['config-path']
|
16
|
+
@params[:s3cmd_conf] = @params[:config_path].sub('.json', '_s3rsync.conf')
|
17
17
|
@log.debug "@params[:config_path]: #{@params[:config_path]}"
|
18
18
|
begin
|
19
19
|
conf = JSON.parse File.read(@params[:config_path])
|
@@ -23,7 +23,7 @@ module S3Rsync
|
|
23
23
|
raise mgs
|
24
24
|
exit 1
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
@log.debug "conf: #{conf}"
|
28
28
|
@params[:s3_bucket] = conf['env.static.s3.bucket']
|
29
29
|
@params[:s3_access] = conf['env.static.s3.key.user']
|
@@ -33,19 +33,50 @@ module S3Rsync
|
|
33
33
|
@log.debug "@params: #{@params.inspect}"
|
34
34
|
@statsd = init_statsd @params[:statsd_host], @params[:statsd_port]
|
35
35
|
@log.debug "@statsd: #{@statsd.inspect}"
|
36
|
+
|
37
|
+
init_s3cmd_conf
|
38
|
+
@s3cmd = "s3cmd -c #{@params[:s3cmd_conf]}"
|
36
39
|
end
|
37
40
|
|
38
41
|
def get_lock(name = 'common')
|
39
42
|
lockfile = Lockfile.new(
|
40
43
|
"/tmp/s3rsync_#{name}.lock",
|
41
|
-
:timeout =>
|
44
|
+
:timeout => 3,
|
42
45
|
:max_age => 3600,
|
43
46
|
:debug => !ENV['DEBUG'].nil?
|
44
47
|
)
|
45
48
|
end
|
49
|
+
|
50
|
+
def init_s3cmd_conf
|
51
|
+
@log.debug "@params[:s3cmd_conf]: #{@params[:s3cmd_conf]}"
|
52
|
+
if !File.exists? @params[:s3cmd_conf]
|
53
|
+
@log.info "Generating dynamic s3cfg: #{@params[:s3cmd_conf]}"
|
54
|
+
begin
|
55
|
+
erb_path = File.join(File.dirname(__FILE__), 'templates', 's3cmd_conf.erb')
|
56
|
+
erb_template = IO.read erb_path
|
57
|
+
@log.debug "erb_template: #{erb_template.inspect}"
|
58
|
+
erb = ERB.new erb_template
|
59
|
+
rendered_template = erb.result(binding)
|
60
|
+
@log.debug "rendered_template: #{rendered_template}"
|
61
|
+
File.write @params[:s3cmd_conf], rendered_template
|
62
|
+
rescue Exception => e
|
63
|
+
@log.error "generating s3cmd config failed: #{e.inspect}"
|
64
|
+
exit 1
|
65
|
+
end
|
66
|
+
@log.info "Dynamic s3cfg generated: #{@params[:s3cmd_conf]}"
|
67
|
+
end
|
68
|
+
end
|
46
69
|
|
47
70
|
def run(mode = :upload)
|
48
|
-
|
71
|
+
init_s3cmd_conf
|
72
|
+
|
73
|
+
if !Dir.exists?(@params[:path])
|
74
|
+
@log.error "Local dir not exist on disk: #{@params[:path]}"
|
75
|
+
return 4
|
76
|
+
end
|
77
|
+
|
78
|
+
base_dir_name = @params[:path].split('/').last
|
79
|
+
sync_locations = "#{@params[:path]}/ s3://#{@params[:s3_bucket]}/#{@params[:s3_prefix]}/#{base_dir_name}/"
|
49
80
|
@log.debug "original sync_locations: #{sync_locations}"
|
50
81
|
lockfile = get_lock(mode)
|
51
82
|
@log.debug "lockfile: #{lockfile.inspect}"
|
@@ -63,7 +94,9 @@ module S3Rsync
|
|
63
94
|
sync_output = 1
|
64
95
|
begin
|
65
96
|
lockfile.lock
|
66
|
-
|
97
|
+
cmd = "#{@s3cmd} sync #{sync_locations}"
|
98
|
+
@log.debug "cmd: #{cmd}"
|
99
|
+
sync_output = pass_cli cmd
|
67
100
|
@log.debug "sync_output: #{sync_output}"
|
68
101
|
rescue Exception => e
|
69
102
|
sync_output = 1
|
@@ -0,0 +1,44 @@
|
|
1
|
+
[default]
|
2
|
+
access_key = <%= @params[:s3_access] %>
|
3
|
+
bucket_location = US
|
4
|
+
cloudfront_host = cloudfront.amazonaws.com
|
5
|
+
default_mime_type = binary/octet-stream
|
6
|
+
delete_removed = False
|
7
|
+
dry_run = False
|
8
|
+
enable_multipart = True
|
9
|
+
encoding = UTF-8
|
10
|
+
encrypt = False
|
11
|
+
follow_symlinks = False
|
12
|
+
force = False
|
13
|
+
get_continue = False
|
14
|
+
gpg_command = /usr/bin/gpg
|
15
|
+
gpg_decrypt = %(gpg_command)s -d --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
|
16
|
+
gpg_encrypt = %(gpg_command)s -c --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s
|
17
|
+
gpg_passphrase = <%= @gpg_passphrase %>
|
18
|
+
guess_mime_type = True
|
19
|
+
host_base = s3.amazonaws.com
|
20
|
+
host_bucket = %(bucket)s.s3.amazonaws.com
|
21
|
+
human_readable_sizes = False
|
22
|
+
invalidate_on_cf = False
|
23
|
+
list_md5 = False
|
24
|
+
log_target_prefix =
|
25
|
+
mime_type =
|
26
|
+
multipart_chunk_size_mb = 15
|
27
|
+
preserve_attrs = True
|
28
|
+
progress_meter = True
|
29
|
+
proxy_host =
|
30
|
+
proxy_port = 0
|
31
|
+
recursive = False
|
32
|
+
recv_chunk = 4096
|
33
|
+
reduced_redundancy = False
|
34
|
+
secret_key = <%= @params[:s3_secret] %>
|
35
|
+
send_chunk = 4096
|
36
|
+
simpledb_host = sdb.amazonaws.com
|
37
|
+
skip_existing = False
|
38
|
+
socket_timeout = 300
|
39
|
+
urlencoding_mode = normal
|
40
|
+
use_https = False
|
41
|
+
verbosity = WARNING
|
42
|
+
website_endpoint = http://%(bucket)s.s3-website-%(location)s.amazonaws.com/
|
43
|
+
website_error =
|
44
|
+
website_index = index.html
|
data/lib/s3rsync/version.rb
CHANGED
data/spec/sync_spec.rb
CHANGED
@@ -5,21 +5,30 @@ include Helpers
|
|
5
5
|
|
6
6
|
describe S3Rsync::Sync do
|
7
7
|
context 'sync is successfull' do
|
8
|
-
let(:opt) {
|
9
|
-
|
10
|
-
'
|
11
|
-
'
|
12
|
-
|
8
|
+
let(:opt) {
|
9
|
+
{
|
10
|
+
'path' => '/parent_test_dir/test_dir',
|
11
|
+
's3-prefix' => 's3rsync',
|
12
|
+
'config-path' => 'test_json_conf_path.json',
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
let(:json_conf) {
|
17
|
+
{
|
18
|
+
'env.static.s3.bucket' => 'test-bucket',
|
19
|
+
'env.static.s3.key.user' => 'test_access_key',
|
20
|
+
'env.static.s3.key.secret' => 'test_secret_key',
|
21
|
+
}
|
22
|
+
}
|
13
23
|
|
14
|
-
let(:
|
15
|
-
|
16
|
-
'env.static.s3.key.user' => 'test_access_key',
|
17
|
-
'env.static.s3.key.secret' => 'test_secret_key',
|
18
|
-
} }
|
24
|
+
let(:s3_conf_path) { opt['config-path'].sub('.json', '_s3rsync.conf') }
|
25
|
+
let(:base_sync_path) { opt['path'].split('/').last }
|
19
26
|
|
20
27
|
before do
|
21
28
|
allow(File).to receive(:read).and_return(nil)
|
22
|
-
allow(File).to receive(:read).with(opt['
|
29
|
+
allow(File).to receive(:read).with(opt['config-path']).and_return(json_conf.to_json)
|
30
|
+
allow(Dir).to receive(:exists?).and_return(nil)
|
31
|
+
allow(Dir).to receive(:exists?).with(opt['path']).and_return(true)
|
23
32
|
allow_any_instance_of(S3Rsync::Sync).to receive(:pass_cli).and_return(nil)
|
24
33
|
end
|
25
34
|
|
@@ -31,16 +40,20 @@ describe S3Rsync::Sync do
|
|
31
40
|
#Helpers::pre_run_helper
|
32
41
|
end
|
33
42
|
|
34
|
-
|
35
|
-
|
43
|
+
after(:each) do
|
44
|
+
File.unlink s3_conf_path
|
45
|
+
end
|
46
|
+
|
47
|
+
it "uploads dir" do
|
48
|
+
cmd = "s3cmd -c #{s3_conf_path} sync #{opt['path']}/ s3://#{json_conf['env.static.s3.bucket']}/#{opt['s3-prefix']}/#{base_sync_path}/"
|
36
49
|
allow_any_instance_of(S3Rsync::Sync).to receive(:pass_cli).with(cmd).and_return('Success')
|
37
50
|
|
38
51
|
sync = S3Rsync::Sync.new(opt)
|
39
52
|
expect(sync.run(:upload)).to eq 0
|
40
53
|
end
|
41
54
|
|
42
|
-
it "
|
43
|
-
cmd = "s3cmd sync s3://#{json_conf['env.static.s3.bucket']}/#{opt['
|
55
|
+
it "downloads dir" do
|
56
|
+
cmd = "s3cmd -c #{s3_conf_path} sync s3://#{json_conf['env.static.s3.bucket']}/#{opt['s3-prefix']}/#{base_sync_path}/ #{opt['path']}/"
|
44
57
|
allow_any_instance_of(S3Rsync::Sync).to receive(:pass_cli).with(cmd).and_return('Success')
|
45
58
|
|
46
59
|
sync = S3Rsync::Sync.new(opt)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: s3rsync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- idevops
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -200,6 +200,7 @@ files:
|
|
200
200
|
- lib/s3rsync/base.rb
|
201
201
|
- lib/s3rsync/cli.rb
|
202
202
|
- lib/s3rsync/sync.rb
|
203
|
+
- lib/s3rsync/templates/s3cmd_conf.erb
|
203
204
|
- lib/s3rsync/version.rb
|
204
205
|
- s3rsync.gemspec
|
205
206
|
- spec/spec_helper.rb
|