docker-sync 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e67f02c36cce31164bf4f9afec2a3e69c47cf3bd
4
- data.tar.gz: 136018fec5f98c61aab0f4a6041f8e7e3a243546
3
+ metadata.gz: 7d1a5236f02cd1af95a2c5dd4f958653a2fb3509
4
+ data.tar.gz: f9eea32e9ed875dcd767bd6c7309c7fe0aa0ea4b
5
5
  SHA512:
6
- metadata.gz: d3e1b254b1db4b8d217461671a5e071fa8db7a36c14f041f9ed0da65afe273d947eca3bfa027f62f169148bd8a63b3d1895f4fd3d2f95e20a12d416c4b1f5f52
7
- data.tar.gz: a2158a9ea86617d859dfb5a35152b38c0bb40327b9c5c3ae5f34a5a9243beab05793a4720e160c9562b03888a317e13760f8cee161fa13d04406e90fe9c38177
6
+ metadata.gz: ca288151453629511d80e24436ea0efb072cb83ec559787249873b85932814f876e7bd66dad3ad07c288210a0d44612aef58507adbe27eab98afe9c1f5fd2ce1
7
+ data.tar.gz: 515f0cda8d12222f52c2cd2f63566b8ae5ca8148b76b898fd5e3517fcddbd925743b96d65c4755990b8be3f5ddc09849b1e9bc673d303612014e67192f1a6626
data/Thorfile CHANGED
@@ -2,6 +2,9 @@
2
2
  $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
3
3
  thor = File.expand_path('../tasks', __FILE__)
4
4
 
5
+ module Global
6
+ DO_UPDATE_CHECK=false
7
+ end
5
8
  Dir.glob(File.join(thor, '/**/*.thor')).each { |taskfile|
6
9
  load taskfile
7
10
  }
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.9
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
-
3
- require "thor"
4
2
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
5
3
 
4
+ require 'thor'
5
+ require 'update_check'
6
+ DO_UPDATE_CHECK=true
6
7
  thor = File.expand_path('../../tasks', __FILE__)
7
8
  Dir.glob(File.join(thor, '/**/*.thor')).each { |taskfile|
8
9
  load taskfile
@@ -1,8 +1,31 @@
1
1
  require 'pp'
2
2
  require 'pathname'
3
+ require 'yaml'
3
4
  # this has basically completely reused from Thor::runner.rb - thank you!
4
5
 
5
6
  module DockerSyncConfig
7
+ def global_config_location
8
+ return File.expand_path('~/.docker-sync-global.yml')
9
+ end
10
+
11
+ def global_config
12
+ global_config_path = global_config_location
13
+ date = DateTime.new(2001, 1, 1) #paste
14
+ defaults = {'update_check'=>true, 'update_last_check' => date.iso8601(9), 'update_enforce' => true}
15
+ if File.exist?(global_config_path)
16
+ config = YAML.load_file(global_config_path)
17
+ config = defaults.merge(config)
18
+ return config
19
+ else
20
+ return defaults
21
+ end
22
+ end
23
+
24
+ def global_config_save(config)
25
+ global_config_path = global_config_location
26
+ File.open(global_config_path, 'w') {|f| f.write config.to_yaml }
27
+ end
28
+
6
29
  def find_config
7
30
  files = find_config_file
8
31
  if files.length > 0
@@ -63,63 +63,82 @@ module Docker_Sync
63
63
  return args
64
64
  end
65
65
 
66
+ def get_container_name
67
+ return "#{@sync_name}"
68
+ end
69
+
70
+ def get_volume_name
71
+ return @sync_name
72
+ end
73
+
66
74
  # starts a rsync docker container listening on the specific port
67
75
  # this container exposes a named volume and is on one side used as the rsync-endpoint for the
68
76
  # local rsync command, on the other side the volume is mounted into the app-container to share the code / content
69
77
  def start_container
70
78
  say_status 'ok', 'Starting rsync', :white
71
- running = `docker ps --filter 'status=running' --filter 'name=#{@sync_name}' | grep #{@sync_name}`
79
+ container_name = get_container_name
80
+ volume_name = get_volume_name
81
+ running = `docker ps --filter 'status=running' --filter 'name=#{container_name}' | grep #{container_name}`
72
82
  if running == '' # container is yet not running
73
- say_status 'ok', "#{@sync_name} container not running", :white if @options['verbose']
74
- exists = `docker ps --filter "status=exited" --filter "name=#{@sync_name}" | grep #{@sync_name}`
83
+ say_status 'ok', "#{container_name} container not running", :white if @options['verbose']
84
+ exists = `docker ps --filter "status=exited" --filter "name=#{container_name}" | grep #{container_name}`
75
85
  if exists == '' # container has yet not been created
76
- say_status 'ok', "creating #{@sync_name} container", :white if @options['verbose']
77
-
78
- user_mapping = ''
79
- if @options.key?('sync_user')
80
- user_mapping = "-e OWNER=#{@options['sync_user']}"
81
- if @options.key?('sync_userid')
82
- user_mapping = "#{user_mapping} -e OWNERID=#{@options['sync_userid']}"
83
- end
84
- elsif @options.key?('sync_userid')
85
- raise("#{@sync_name}: You have set a sync_userid but no sync_user - you need to set both")
86
- end
87
-
88
- group_mapping = ''
89
- if @options.key?('sync_group')
90
- group_mapping = "-e GROUP=#{@options['sync_group']}"
91
- if @options.key?('sync_groupid')
92
- group_mapping = "#{group_mapping} -e GROUPID=#{@options['sync_groupid']}"
93
- end
94
- elsif @options.key?('sync_groupid')
95
- raise("#{@sync_name}: You have set a sync_groupid but no sync_group - you need to set both")
96
- end
97
-
98
- cmd = "docker run -p '#{@options['sync_host_port']}:873' -v #{@sync_name}:#{@options['dest']} #{user_mapping} #{group_mapping} -e VOLUME=#{@options['dest']} --name #{@sync_name} -d eugenmayer/rsync"
86
+ say_status 'ok', "creating #{container_name} container", :white if @options['verbose']
87
+
88
+ user_mapping = get_user_mapping
89
+ group_mapping = get_group_mapping
90
+
91
+ cmd = "docker run -p '#{@options['sync_host_port']}:873' -v #{volume_name}:#{@options['dest']} #{user_mapping} #{group_mapping} -e VOLUME=#{@options['dest']} --name #{container_name} -d eugenmayer/rsync"
99
92
  else # container already created, just start / reuse it
100
- say_status 'ok', "starting #{@sync_name} container", :white if @options['verbose']
101
- cmd = "docker start #{@sync_name}"
93
+ say_status 'ok', "starting #{container_name} container", :white if @options['verbose']
94
+ cmd = "docker start #{container_name}"
102
95
  end
103
96
  say_status 'command', cmd, :white if @options['verbose']
104
97
  `#{cmd}` || raise('Start failed')
105
98
  else
106
- say_status 'ok', "#{@sync_name} container still running", :blue if @options['verbose']
99
+ say_status 'ok', "#{container_name} container still running", :blue if @options['verbose']
107
100
  end
108
- say_status 'ok', "starting initial #{@sync_name} of src", :white if @options['verbose']
101
+ say_status 'ok', "#{container_name}: starting initial sync of #{@options['src']}", :white if @options['verbose']
109
102
  # this sleep is needed since the container could be not started
110
103
  sleep 1
111
104
  sync
112
105
  say_status 'success', 'Rsync server started', :green
113
106
  end
114
107
 
108
+ def get_user_mapping
109
+ user_mapping = ''
110
+ if @options.key?('sync_user')
111
+ user_mapping = "-e OWNER=#{@options['sync_user']}"
112
+ if @options.key?('sync_userid')
113
+ user_mapping = "#{user_mapping} -e OWNERID=#{@options['sync_userid']}"
114
+ end
115
+ elsif @options.key?('sync_userid')
116
+ raise("#{get_container_name}: You have set a sync_userid but no sync_user - you need to set both")
117
+ end
118
+ return user_mapping
119
+ end
120
+
121
+ def get_group_mapping
122
+ group_mapping = ''
123
+ if @options.key?('sync_group')
124
+ group_mapping = "-e GROUP=#{@options['sync_group']}"
125
+ if @options.key?('sync_groupid')
126
+ group_mapping = "#{group_mapping} -e GROUPID=#{@options['sync_groupid']}"
127
+ end
128
+ elsif @options.key?('sync_groupid')
129
+ raise("#{get_container_name}: You have set a sync_groupid but no sync_group - you need to set both")
130
+ end
131
+ return group_mapping
132
+ end
133
+
115
134
  def stop_container
116
- `docker stop #{@sync_name}`
135
+ `docker stop #{get_container_name}`
117
136
  end
118
137
 
119
138
  def reset_container
120
139
  stop_container
121
- `docker rm #{@sync_name}`
122
- `docker volume rm #{@sync_name}`
140
+ `docker rm #{get_container_name}`
141
+ `docker volume rm #{get_volume_name}`
123
142
  end
124
143
 
125
144
  def clean
@@ -127,11 +146,11 @@ module Docker_Sync
127
146
  end
128
147
 
129
148
  def stop
130
- say_status 'ok', "Stopping sync container #{@sync_name}"
149
+ say_status 'ok', "Stopping sync container #{get_container_name}"
131
150
  begin
132
151
  stop_container
133
152
  rescue Exception => e
134
- say_status 'error', "Stopping failed of #{@sync_name}:", :red
153
+ say_status 'error', "Stopping failed of #{get_container_name}:", :red
135
154
  puts e.message
136
155
  end
137
156
  end
@@ -39,14 +39,14 @@ module Docker_Sync
39
39
 
40
40
  say_status 'command', cmd, :white if @options['verbose']
41
41
 
42
- Open3.popen3(cmd)
43
- if $?.exitstatus > 0
42
+ stdout, stderr, exit_status = Open3.capture3(cmd)
43
+ if not exit_status.success?
44
44
  say_status 'error', "Error starting sync, exit code #{$?.exitstatus}", :red
45
- say_status 'message', out
45
+ say_status 'message', stderr
46
46
  else
47
47
  say_status 'ok', "Synced #{@options['src']}", :white
48
48
  if @options['verbose']
49
- say_status 'output', out
49
+ say_status 'output', stdout
50
50
  end
51
51
  end
52
52
  end
@@ -64,6 +64,7 @@ module Docker_Sync
64
64
  args.push('-batch')
65
65
  args.push(@options['sync_args']) if @options.key?('sync_args')
66
66
  args.push("socket://#{@options['sync_host_ip']}:#{@options['sync_host_port']}/")
67
+ args.push('-debug verbose') if @options['verbose']
67
68
  if @options.key?('sync_user') || @options.key?('sync_group') || @options.key?('sync_groupid') || @options.key?('sync_userid')
68
69
  raise('Unison does not support sync_user, sync_group, sync_groupid or sync_userid - please use rsync if you need that')
69
70
  end
@@ -72,37 +73,48 @@ module Docker_Sync
72
73
 
73
74
  def start_container
74
75
  say_status 'ok', 'Starting unison', :white
75
- running = `docker ps --filter 'status=running' --filter 'name=#{@sync_name}' | grep #{@sync_name}`
76
+ container_name = get_container_name
77
+ volume_name = get_volume_name
78
+
79
+ running = `docker ps --filter 'status=running' --filter 'name=#{container_name}' | grep #{container_name}`
76
80
  if running == ''
77
- say_status 'ok', "#{@sync_name} container not running", :white if @options['verbose']
78
- exists = `docker ps --filter "status=exited" --filter "name=#{@sync_name}" | grep #{@sync_name}`
81
+ say_status 'ok', "#{container_name} container not running", :white if @options['verbose']
82
+ exists = `docker ps --filter "status=exited" --filter "name=#{container_name}" | grep #{container_name}`
79
83
  if exists == ''
80
- say_status 'ok', "creating #{@sync_name} container", :white if @options['verbose']
81
- 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}"
84
+ say_status 'ok', "creating #{container_name} container", :white if @options['verbose']
85
+ cmd = "docker run -p '#{@options['sync_host_port']}:#{UNISON_CONTAINER_PORT}' -v #{volume_name}:#{@options['dest']} -e UNISON_VERSION=#{UNISON_VERSION} -e UNISON_WORKING_DIR=#{@options['dest']} --name #{container_name} -d #{UNISON_IMAGE}"
82
86
  else
83
- say_status 'ok', "starting #{@sync_name} container", :ok if @options['verbose']
84
- cmd = "docker start #{@sync_name}"
87
+ say_status 'ok', "starting #{container_name} container", :white if @options['verbose']
88
+ cmd = "docker start #{container_name}"
85
89
  end
86
90
  say_status 'command', cmd, :white if @options['verbose']
87
91
  `#{cmd}` || raise('Start failed')
88
92
  else
89
- say_status 'ok', "#{@sync_name} container still running", :blue
93
+ say_status 'ok', "#{container_name} container still running", :blue
90
94
  end
91
- say_status 'ok', "starting initial #{@sync_name} of src", :white if @options['verbose']
95
+ say_status 'ok', "starting initial #{container_name} of src", :white if @options['verbose']
92
96
  # this sleep is needed since the container could be not started
93
97
  sleep 1
94
98
  sync
95
99
  say_status 'success', 'Unison server started', :green
96
100
  end
97
101
 
102
+ def get_container_name
103
+ return "#{@sync_name}"
104
+ end
105
+
106
+ def get_volume_name
107
+ return @sync_name
108
+ end
109
+
98
110
  def stop_container
99
- `docker stop #{@sync_name}`
111
+ `docker stop #{get_container_name}`
100
112
  end
101
113
 
102
114
  def reset_container
103
115
  stop_container
104
- `docker rm #{@sync_name}`
105
- `docker volume rm #{@sync_name}`
116
+ `docker rm #{get_container_name}`
117
+ `docker volume rm #{get_volume_name}`
106
118
  end
107
119
 
108
120
  def clean
@@ -110,11 +122,11 @@ module Docker_Sync
110
122
  end
111
123
 
112
124
  def stop
113
- say_status 'ok', "Stopping sync container #{@sync_name}"
125
+ say_status 'ok', "Stopping sync container #{get_container_name}"
114
126
  begin
115
127
  stop_container
116
128
  rescue Exception => e
117
- say_status 'error', "Stopping failed of #{@sync_name}:", :red
129
+ say_status 'error', "Stopping failed of #{get_container_name}:", :red
118
130
  puts e.message
119
131
  end
120
132
  end
@@ -0,0 +1,63 @@
1
+ require 'gem_update_checker'
2
+ require 'thor/actions'
3
+ require 'config'
4
+
5
+ class UpdateChecker
6
+ include Thor::Shell
7
+ include DockerSyncConfig
8
+ @config
9
+ def initialize
10
+ @config = global_config
11
+ end
12
+
13
+ def run
14
+ unless @config['update_check']
15
+ say_status 'hint','Skipping up-to-date check since it has been disabled in yout ~/.docker-sync-global.yml configuration',:yellow
16
+ return
17
+ end
18
+ unless should_run
19
+ return
20
+ end
21
+ check_and_warn(@config['update_enforce'])
22
+ end
23
+
24
+ def should_run
25
+ now = DateTime.now
26
+ last_check = DateTime.iso8601(@config['update_last_check'])
27
+ check_after_days = 2
28
+ if now - last_check > check_after_days
29
+ return true
30
+ end
31
+
32
+ return false
33
+ end
34
+
35
+ def get_current_version
36
+ path = File.expand_path('../../', __FILE__)
37
+ return File.read("#{path}/VERSION")
38
+ end
39
+
40
+ def docker_sync_update_check
41
+ gem_name = 'docker-sync'
42
+ current_version = get_current_version
43
+ checker = GemUpdateChecker::Client.new(gem_name, current_version)
44
+ return checker
45
+ end
46
+
47
+ def check_and_warn(update_enforced = true)
48
+ # update the timestamp
49
+ now = DateTime.now
50
+ @config['update_last_check'] = now.iso8601(9)
51
+ global_config_save(@config)
52
+
53
+ check = docker_sync_update_check
54
+ if check.update_available
55
+ say_status 'warning',"There is an update (#{check.latest_version}) available (current version #{check.current_version}). Please update before you continue",:yellow
56
+ if yes?("Shall i update docker-sync to #{check.latest_version} for you?")
57
+ system('gem update docker-sync')
58
+ else
59
+ exit 1 if update_enforced
60
+ end
61
+ end
62
+ end
63
+ end
@@ -1,6 +1,7 @@
1
1
  require 'docker_sync/sync_manager'
2
2
  require 'config'
3
3
  require 'preconditions'
4
+ require 'update_check'
4
5
 
5
6
  class Sync < Thor
6
7
  include DockerSyncConfig
@@ -11,6 +12,10 @@ class Sync < Thor
11
12
 
12
13
  desc 'start', 'Start all sync configurations in this project'
13
14
  def start
15
+ # do run update check in the start command only
16
+ updates = UpdateChecker.new
17
+ updates.run
18
+
14
19
  begin
15
20
  check_all_preconditions
16
21
  rescue Exception => e
@@ -82,6 +87,7 @@ class Sync < Thor
82
87
  desc 'list', 'List all sync-points of the project configuration path'
83
88
  method_option :verbose, :default => false, :type => :boolean, :desc => 'Verbose output'
84
89
  def list
90
+ pp Gem.configuration
85
91
  begin
86
92
  check_all_preconditions
87
93
  rescue Exception => e
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: docker-sync
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eugen Mayer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-09 00:00:00.000000000 Z
11
+ date: 2016-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: gem_update_checker
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  description: Sync your code live to docker-containers without losing any performance
28
42
  on OSX
29
43
  email: eugen.mayer@kontextwork.de
@@ -33,6 +47,7 @@ extensions: []
33
47
  extra_rdoc_files: []
34
48
  files:
35
49
  - Thorfile
50
+ - VERSION
36
51
  - bin/docker-sync
37
52
  - lib/config.rb
38
53
  - lib/docker_sync/sync_manager.rb
@@ -42,6 +57,7 @@ files:
42
57
  - lib/docker_sync/watch_strategy/fswatch.rb
43
58
  - lib/execution.rb
44
59
  - lib/preconditions.rb
60
+ - lib/update_check.rb
45
61
  - tasks/sync.thor
46
62
  homepage: https://github.com/EugenMayer/docker_sync
47
63
  licenses: