docker-sync 0.0.4 → 0.0.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.
- checksums.yaml +4 -4
- data/Thorfile +1 -1
- data/lib/config.rb +1 -1
- data/lib/docker_sync/sync_manager.rb +2 -0
- data/lib/docker_sync/sync_process.rb +51 -93
- data/lib/docker_sync/sync_strategy/rsync.rb +100 -0
- data/lib/docker_sync/sync_strategy/unison.rb +105 -0
- data/lib/docker_sync/watch_strategy/fswatch.rb +52 -0
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8746cae5b189f20e47f395a21cf677b62746baca
|
4
|
+
data.tar.gz: 793703a123def635266d38e82e70e411bf1994d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d030d530618e60eb2106c9552ad1a2a6d1a8b5f36de28bec3481b53d03f9b4a27f80968cb1129483a136f41a340f7ec832d140c26938457f79fcb12b57cc58c9
|
7
|
+
data.tar.gz: 16581581034acbadf1f20c11f953df4c62fe7b2ee5502e011ac44110ca50ca9750966eb62ea4429bb1831541a570c56570816d0e559b481112195fd9d23c46d6
|
data/Thorfile
CHANGED
data/lib/config.rb
CHANGED
@@ -1,133 +1,91 @@
|
|
1
1
|
require 'thor/shell'
|
2
|
-
|
3
|
-
require '
|
2
|
+
# noinspection RubyResolve
|
3
|
+
require 'docker_sync/sync_strategy/rsync'
|
4
|
+
require 'docker_sync/sync_strategy/unison'
|
5
|
+
# noinspection RubyResolve
|
6
|
+
require 'docker_sync/watch_strategy/fswatch'
|
7
|
+
|
4
8
|
module Docker_Sync
|
5
9
|
class SyncProcess
|
6
10
|
include Thor::Shell
|
7
|
-
include Execution
|
8
11
|
@options
|
9
12
|
@sync_name
|
10
13
|
@watch_thread
|
14
|
+
@sync_strategy
|
15
|
+
@watch_strategy
|
11
16
|
|
17
|
+
# noinspection RubyStringKeysInHashInspection
|
12
18
|
def initialize(sync_name, options)
|
13
19
|
defaults = {
|
14
|
-
|
15
|
-
|
20
|
+
'verbose' => false,
|
21
|
+
'sync_host_ip' => get_host_ip
|
16
22
|
}
|
17
23
|
@sync_name = sync_name
|
18
24
|
@options = defaults.merge(options)
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
return 'localhost'
|
25
|
+
@sync_strategy = nil
|
26
|
+
@watch_strategy = nil
|
27
|
+
set_sync_strategy
|
28
|
+
set_watch_strategy
|
24
29
|
end
|
25
30
|
|
26
|
-
def
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
puts e.message
|
31
|
+
def set_sync_strategy
|
32
|
+
if @options.key?('sync_strategy')
|
33
|
+
case @options['sync_strategy']
|
34
|
+
when 'rsync'
|
35
|
+
@sync_strategy = Docker_Sync::SyncStrategy::Rsync.new(@sync_name, @options)
|
36
|
+
when 'unison'
|
37
|
+
@sync_strategy = Docker_Sync::SyncStrategy::Unison.new(@sync_name, @options)
|
38
|
+
else
|
39
|
+
@sync_strategy = Docker_Sync::SyncStrategy::Rsync.new(@sync_name, @options)
|
40
|
+
end
|
41
|
+
else
|
42
|
+
@sync_strategy = Docker_Sync::SyncStrategy::Rsync.new(@sync_name, @options)
|
39
43
|
end
|
40
44
|
end
|
41
45
|
|
42
|
-
def
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
say_status 'ok', "creating #{@sync_name} container", :white
|
50
|
-
cmd = "docker run -p '#{@options['sync_host_port']}:873' -v #{@sync_name}:#{@options['dest']} -e VOLUME=#{@options['dest']} --name #{@sync_name} -d eugenmayer/rsync"
|
51
|
-
else
|
52
|
-
say_status 'success', "starting #{@sync_name} container", :green
|
53
|
-
cmd = "docker start #{@sync_name}"
|
46
|
+
def set_watch_strategy
|
47
|
+
if @options.key?('watch_strategy')
|
48
|
+
case @options['watch_strategy']
|
49
|
+
when 'fswatch'
|
50
|
+
@watch_strategy = Docker_Sync::WatchStrategy::Fswatch.new(@sync_name, @options)
|
51
|
+
else
|
52
|
+
@watch_strategy = Docker_Sync::WatchStrategy::Fswatch.new(@sync_name, @options)
|
54
53
|
end
|
55
|
-
say_status 'command', cmd, :white
|
56
|
-
`#{cmd}` || raise('Start failed')
|
57
54
|
else
|
58
|
-
|
55
|
+
@watch_strategy = Docker_Sync::WatchStrategy::Fswatch.new(@sync_name, @options)
|
59
56
|
end
|
60
|
-
say_status 'success', "starting initial #{@sync_name} of src", :green
|
61
|
-
# this sleep is needed since the container could be not started
|
62
|
-
sleep 1
|
63
|
-
sync
|
64
57
|
end
|
65
58
|
|
66
|
-
def
|
67
|
-
|
59
|
+
def get_host_ip
|
60
|
+
return 'localhost'
|
61
|
+
end
|
62
|
+
|
63
|
+
def run
|
64
|
+
@sync_strategy.run
|
65
|
+
@watch_strategy.run
|
68
66
|
end
|
69
67
|
|
70
|
-
def
|
71
|
-
|
72
|
-
|
73
|
-
`docker volume rm #{@sync_name}`
|
68
|
+
def stop
|
69
|
+
@sync_strategy.stop
|
70
|
+
@watch_strategy.stop
|
74
71
|
end
|
75
72
|
|
76
73
|
def clean
|
77
|
-
|
74
|
+
@sync_strategy.clean
|
75
|
+
@watch_strategy.clean
|
78
76
|
end
|
79
77
|
|
80
78
|
def sync
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
say_status 'command', cmd, :white if @options['verbose']
|
85
|
-
|
86
|
-
out = `#{cmd}`
|
87
|
-
if $?.exitstatus > 0
|
88
|
-
say_status 'error', "Error starting sync, exit code #{$?.exitstatus}", :red
|
89
|
-
say_status 'message', out
|
90
|
-
else
|
91
|
-
say_status 'success', "Synced #{@options['src']}", :green
|
92
|
-
if @options['verbose']
|
93
|
-
say_status 'output', out
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def sync_options
|
99
|
-
args = []
|
100
|
-
unless @options['sync_excludes'].nil?
|
101
|
-
args = @options['sync_excludes'].map { |pattern| "--exclude='#{pattern}'" } + args
|
102
|
-
end
|
103
|
-
args.push('-ap')
|
104
|
-
args.push(@options['sync_args']) if @options.key?('sync_args')
|
105
|
-
args.push("#{@options['src']}/") # add a trailing slash
|
106
|
-
args.push("rsync://#{@options['sync_host_ip']}:#{@options['sync_host_port']}/volume")
|
79
|
+
# TODO: probably use run here
|
80
|
+
@sync_strategy.sync
|
107
81
|
end
|
108
82
|
|
109
83
|
def watch
|
110
|
-
|
111
|
-
say_status 'ok', "Starting to watch #{@options['src']} - Press CTRL-C to stop", :green
|
112
|
-
cmd = 'fswatch ' + args.join(' ')
|
113
|
-
say_status 'command', cmd, :white if @options['verbose']
|
114
|
-
|
115
|
-
@watch_thread = threadexec(cmd, "Sync #{@sync_name}", :blue)
|
116
|
-
end
|
117
|
-
|
118
|
-
def watch_options
|
119
|
-
args = []
|
120
|
-
unless @options['watch_excludes'].nil?
|
121
|
-
args = @options['watch_excludes'].map { |pattern| "--exclude='#{pattern}'" } + args
|
122
|
-
end
|
123
|
-
args.push('-orIE')
|
124
|
-
args.push(@options['watch_args']) if @options.key?('watch_args')
|
125
|
-
args.push(@options['src'])
|
126
|
-
args.push(" | xargs -I -n1 thor sync:sync -n #{@sync_name} --config='#{@options['config_path']}'")
|
84
|
+
@watch_strategy.run
|
127
85
|
end
|
128
86
|
|
129
87
|
def watch_thread
|
130
|
-
return @watch_thread
|
88
|
+
return @watch_strategy.watch_thread
|
131
89
|
end
|
132
90
|
end
|
133
91
|
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'thor/shell'
|
2
|
+
|
3
|
+
module Docker_Sync
|
4
|
+
module SyncStrategy
|
5
|
+
class Rsync
|
6
|
+
include Thor::Shell
|
7
|
+
@options
|
8
|
+
@sync_name
|
9
|
+
@watch_thread
|
10
|
+
|
11
|
+
def initialize(sync_name, options)
|
12
|
+
@sync_name = sync_name
|
13
|
+
@options = options
|
14
|
+
end
|
15
|
+
|
16
|
+
def run
|
17
|
+
start_container
|
18
|
+
sync
|
19
|
+
end
|
20
|
+
|
21
|
+
def sync
|
22
|
+
args = sync_options
|
23
|
+
cmd = 'rsync ' + args.join(' ')
|
24
|
+
|
25
|
+
say_status 'command', cmd, :white if @options['verbose']
|
26
|
+
|
27
|
+
out = `#{cmd}`
|
28
|
+
if $?.exitstatus > 0
|
29
|
+
say_status 'error', "Error starting sync, exit code #{$?.exitstatus}", :red
|
30
|
+
say_status 'message', out
|
31
|
+
else
|
32
|
+
say_status 'success', "Synced #{@options['src']}", :green
|
33
|
+
if @options['verbose']
|
34
|
+
say_status 'output', out
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def sync_options
|
40
|
+
args = []
|
41
|
+
unless @options['sync_excludes'].nil?
|
42
|
+
args = @options['sync_excludes'].map { |pattern| "--exclude='#{pattern}'" } + args
|
43
|
+
end
|
44
|
+
args.push('-ap')
|
45
|
+
args.push(@options['sync_args']) if @options.key?('sync_args')
|
46
|
+
args.push("#{@options['src']}/") # add a trailing slash
|
47
|
+
args.push("rsync://#{@options['sync_host_ip']}:#{@options['sync_host_port']}/volume")
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
def start_container
|
52
|
+
say_status 'ok', 'Starting rsync', :white
|
53
|
+
running = `docker ps --filter 'status=running' --filter 'name=#{@sync_name}' | grep #{@sync_name}`
|
54
|
+
if running == ''
|
55
|
+
say_status 'ok', "#{@sync_name} container not running", :white
|
56
|
+
exists = `docker ps --filter "status=exited" --filter "name=filesync_dw" | grep filesync_dw`
|
57
|
+
if exists == ''
|
58
|
+
say_status 'ok', "creating #{@sync_name} container", :white
|
59
|
+
cmd = "docker run -p '#{@options['sync_host_port']}:873' -v #{@sync_name}:#{@options['dest']} -e VOLUME=#{@options['dest']} --name #{@sync_name} -d eugenmayer/rsync"
|
60
|
+
else
|
61
|
+
say_status 'success', "starting #{@sync_name} container", :green
|
62
|
+
cmd = "docker start #{@sync_name}"
|
63
|
+
end
|
64
|
+
say_status 'command', cmd, :white
|
65
|
+
`#{cmd}` || raise('Start failed')
|
66
|
+
else
|
67
|
+
say_status 'ok', "#{@sync_name} container still running", :blue
|
68
|
+
end
|
69
|
+
say_status 'success', "starting initial #{@sync_name} of src", :green
|
70
|
+
# this sleep is needed since the container could be not started
|
71
|
+
sleep 1
|
72
|
+
sync
|
73
|
+
end
|
74
|
+
|
75
|
+
def stop_container
|
76
|
+
`docker stop #{@sync_name}`
|
77
|
+
end
|
78
|
+
|
79
|
+
def reset_container
|
80
|
+
stop_container
|
81
|
+
`docker rm #{@sync_name}`
|
82
|
+
`docker volume rm #{@sync_name}`
|
83
|
+
end
|
84
|
+
|
85
|
+
def clean
|
86
|
+
reset_container
|
87
|
+
end
|
88
|
+
|
89
|
+
def stop
|
90
|
+
say_status 'ok', "Stopping sync container #{@sync_name}"
|
91
|
+
begin
|
92
|
+
stop_container
|
93
|
+
rescue Exception => e
|
94
|
+
say_status 'error', "Stopping failed of #{@sync_name}:", :red
|
95
|
+
puts e.message
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'thor/shell'
|
2
|
+
|
3
|
+
module Docker_Sync
|
4
|
+
module SyncStrategy
|
5
|
+
class Unison
|
6
|
+
include Thor::Shell
|
7
|
+
@options
|
8
|
+
@sync_name
|
9
|
+
@watch_thread
|
10
|
+
UNISON_IMAGE = 'leighmcculloch/unison'
|
11
|
+
UNISON_VERSION = '2.48.3'
|
12
|
+
UNISON_CONTAINER_PORT = '5000'
|
13
|
+
def initialize(sync_name, options)
|
14
|
+
@sync_name = sync_name
|
15
|
+
@options = options
|
16
|
+
end
|
17
|
+
|
18
|
+
def run
|
19
|
+
start_container
|
20
|
+
sync
|
21
|
+
end
|
22
|
+
|
23
|
+
def sync
|
24
|
+
args = sync_options
|
25
|
+
cmd = 'unison ' + args.join(' ')
|
26
|
+
|
27
|
+
say_status 'command', cmd, :white if @options['verbose']
|
28
|
+
|
29
|
+
out = `#{cmd}`
|
30
|
+
if $?.exitstatus > 0
|
31
|
+
say_status 'error', "Error starting sync, exit code #{$?.exitstatus}", :red
|
32
|
+
say_status 'message', out
|
33
|
+
else
|
34
|
+
say_status 'success', "Synced #{@options['src']}", :green
|
35
|
+
if @options['verbose']
|
36
|
+
say_status 'output', out
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def sync_options
|
42
|
+
args = []
|
43
|
+
|
44
|
+
unless @options['sync_excludes'].nil?
|
45
|
+
# TODO: does unison support excludes as a command paramter? seems to be a config-value only
|
46
|
+
say_status 'warning','Excludes are yet not implemented for unison!', :orange
|
47
|
+
# args = @options['sync_excludes'].map { |pattern| "--exclude='#{pattern}'" } + args
|
48
|
+
end
|
49
|
+
args.push(@options['src'])
|
50
|
+
args.push('-auto')
|
51
|
+
args.push('-batch')
|
52
|
+
args.push(@options['sync_args']) if @options.key?('sync_args')
|
53
|
+
args.push("socket://#{@options['sync_host_ip']}:#{@options['sync_host_port']}/")
|
54
|
+
end
|
55
|
+
|
56
|
+
def start_container
|
57
|
+
say_status 'ok', 'Starting rsync', :white
|
58
|
+
running = `docker ps --filter 'status=running' --filter 'name=#{@sync_name}' | grep #{@sync_name}`
|
59
|
+
if running == ''
|
60
|
+
say_status 'ok', "#{@sync_name} container not running", :white
|
61
|
+
exists = `docker ps --filter "status=exited" --filter "name=filesync_dw" | grep filesync_dw`
|
62
|
+
if exists == ''
|
63
|
+
say_status 'ok', "creating #{@sync_name} container", :white
|
64
|
+
cmd = "docker run -p '#{@options['sync_host_port']}:#{UNISON_CONTAINER_PORT}' -v #{@sync_name}:#{@options['dest']} -e UNISON_VERSION=#{UNISON_VERSION} -e UNISON_WORKING_DIR=#{@options['dest']} --name #{@sync_name} -d #{UNISON_IMAGE}"
|
65
|
+
else
|
66
|
+
say_status 'success', "starting #{@sync_name} container", :green
|
67
|
+
cmd = "docker start #{@sync_name}"
|
68
|
+
end
|
69
|
+
say_status 'command', cmd, :white
|
70
|
+
`#{cmd}` || raise('Start failed')
|
71
|
+
else
|
72
|
+
say_status 'ok', "#{@sync_name} container still running", :blue
|
73
|
+
end
|
74
|
+
say_status 'success', "starting initial #{@sync_name} of src", :green
|
75
|
+
# this sleep is needed since the container could be not started
|
76
|
+
sleep 1
|
77
|
+
sync
|
78
|
+
end
|
79
|
+
|
80
|
+
def stop_container
|
81
|
+
`docker stop #{@sync_name}`
|
82
|
+
end
|
83
|
+
|
84
|
+
def reset_container
|
85
|
+
stop_container
|
86
|
+
`docker rm #{@sync_name}`
|
87
|
+
`docker volume rm #{@sync_name}`
|
88
|
+
end
|
89
|
+
|
90
|
+
def clean
|
91
|
+
reset_container
|
92
|
+
end
|
93
|
+
|
94
|
+
def stop
|
95
|
+
say_status 'ok', "Stopping sync container #{@sync_name}"
|
96
|
+
begin
|
97
|
+
stop_container
|
98
|
+
rescue Exception => e
|
99
|
+
say_status 'error', "Stopping failed of #{@sync_name}:", :red
|
100
|
+
puts e.message
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'thor/shell'
|
2
|
+
require 'execution'
|
3
|
+
module Docker_Sync
|
4
|
+
module WatchStrategy
|
5
|
+
class Fswatch
|
6
|
+
include Thor::Shell
|
7
|
+
include Execution
|
8
|
+
@options
|
9
|
+
@sync_name
|
10
|
+
@watch_thread
|
11
|
+
|
12
|
+
def initialize(sync_name, options)
|
13
|
+
@sync_name = sync_name
|
14
|
+
@options = options
|
15
|
+
end
|
16
|
+
|
17
|
+
def run
|
18
|
+
watch
|
19
|
+
end
|
20
|
+
|
21
|
+
def stop
|
22
|
+
end
|
23
|
+
|
24
|
+
def clean
|
25
|
+
end
|
26
|
+
|
27
|
+
def watch
|
28
|
+
args = watch_options
|
29
|
+
say_status 'ok', "Starting to watch #{@options['src']} - Press CTRL-C to stop", :green
|
30
|
+
cmd = 'fswatch ' + args.join(' ')
|
31
|
+
say_status 'command', cmd, :white if @options['verbose']
|
32
|
+
|
33
|
+
@watch_thread = threadexec(cmd, "Sync #{@sync_name}", :blue)
|
34
|
+
end
|
35
|
+
|
36
|
+
def watch_options
|
37
|
+
args = []
|
38
|
+
unless @options['watch_excludes'].nil?
|
39
|
+
args = @options['watch_excludes'].map { |pattern| "--exclude='#{pattern}'" } + args
|
40
|
+
end
|
41
|
+
args.push('-orIE')
|
42
|
+
args.push(@options['watch_args']) if @options.key?('watch_args')
|
43
|
+
args.push(@options['src'])
|
44
|
+
args.push(" | xargs -I -n1 thor sync:sync -n #{@sync_name} --config='#{@options['config_path']}'")
|
45
|
+
end
|
46
|
+
|
47
|
+
def watch_thread
|
48
|
+
return @watch_thread
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docker-sync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eugen Mayer
|
@@ -51,6 +51,9 @@ files:
|
|
51
51
|
- lib/config.rb
|
52
52
|
- lib/docker_sync/sync_manager.rb
|
53
53
|
- lib/docker_sync/sync_process.rb
|
54
|
+
- lib/docker_sync/sync_strategy/rsync.rb
|
55
|
+
- lib/docker_sync/sync_strategy/unison.rb
|
56
|
+
- lib/docker_sync/watch_strategy/fswatch.rb
|
54
57
|
- lib/execution.rb
|
55
58
|
- tasks/sync.thor
|
56
59
|
homepage: https://github.com/EugenMayer/docker_sync
|