Class: Docker_Sync::SyncStrategy::Unison

Inherits:
Object
  • Object
show all
Includes:
Thor::Shell
Defined in:
lib/docker_sync/sync_strategy/unison.rb

Constant Summary collapse

UNISON_IMAGE =
'leighmcculloch/unison'
UNISON_VERSION =
'2.48.3'
UNISON_CONTAINER_PORT =
'5000'

Instance Method Summary collapse

Constructor Details

#initialize(sync_name, options) ⇒ Unison

Returns a new instance of Unison.



13
14
15
16
# File 'lib/docker_sync/sync_strategy/unison.rb', line 13

def initialize(sync_name, options)
  @sync_name = sync_name
  @options = options
end

Instance Method Details

#cleanObject



90
91
92
# File 'lib/docker_sync/sync_strategy/unison.rb', line 90

def clean
  reset_container
end

#reset_containerObject



84
85
86
87
88
# File 'lib/docker_sync/sync_strategy/unison.rb', line 84

def reset_container
  stop_container
  `docker rm #{@sync_name}`
  `docker volume rm #{@sync_name}`
end

#runObject



18
19
20
21
# File 'lib/docker_sync/sync_strategy/unison.rb', line 18

def run
  start_container
  sync
end

#start_containerObject



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/docker_sync/sync_strategy/unison.rb', line 56

def start_container
  say_status 'ok', 'Starting rsync', :white
  running = `docker ps --filter 'status=running' --filter 'name=#{@sync_name}' | grep #{@sync_name}`
  if running == ''
    say_status 'ok', "#{@sync_name} container not running", :white
    exists = `docker ps --filter "status=exited" --filter "name=filesync_dw" | grep filesync_dw`
    if exists == ''
      say_status 'ok', "creating #{@sync_name} container", :white
      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}"
    else
      say_status 'success', "starting #{@sync_name} container", :green
      cmd = "docker start #{@sync_name}"
    end
    say_status 'command', cmd, :white
    `#{cmd}` || raise('Start failed')
  else
    say_status 'ok', "#{@sync_name} container still running", :blue
  end
  say_status 'success', "starting initial #{@sync_name} of src", :green
  # this sleep is needed since the container could be not started
  sleep 1
  sync
end

#stopObject



94
95
96
97
98
99
100
101
102
# File 'lib/docker_sync/sync_strategy/unison.rb', line 94

def stop
  say_status 'ok', "Stopping sync container #{@sync_name}"
  begin
    stop_container
  rescue Exception => e
    say_status 'error', "Stopping failed of #{@sync_name}:", :red
    puts e.message
  end
end

#stop_containerObject



80
81
82
# File 'lib/docker_sync/sync_strategy/unison.rb', line 80

def stop_container
  `docker stop #{@sync_name}`
end

#syncObject



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/docker_sync/sync_strategy/unison.rb', line 23

def sync
  args = sync_options
  cmd = 'unison ' + args.join(' ')

  say_status 'command', cmd, :white if @options['verbose']

  out = `#{cmd}`
  if $?.exitstatus > 0
    say_status 'error', "Error starting sync, exit code #{$?.exitstatus}", :red
    say_status 'message', out
  else
    say_status 'success', "Synced #{@options['src']}", :green
    if @options['verbose']
      say_status 'output', out
    end
  end
end

#sync_optionsObject



41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/docker_sync/sync_strategy/unison.rb', line 41

def sync_options
  args = []

  unless @options['sync_excludes'].nil?
    # TODO: does unison support excludes as a command paramter? seems to be a config-value only
    say_status 'warning','Excludes are yet not implemented for unison!', :orange
    #  args = @options['sync_excludes'].map { |pattern| "--exclude='#{pattern}'" } + args
  end
  args.push(@options['src'])
  args.push('-auto')
  args.push('-batch')
  args.push(@options['sync_args']) if @options.key?('sync_args')
  args.push("socket://#{@options['sync_host_ip']}:#{@options['sync_host_port']}/")
end