vagrant-unison2 1.1.0 → 1.2.0
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/README.md +31 -9
- data/lib/vagrant-unison2/command.rb +31 -2
- data/lib/vagrant-unison2/shell_command.rb +5 -5
- data/lib/vagrant-unison2/ssh_command.rb +17 -14
- data/lib/vagrant-unison2/unison_sync.rb +1 -1
- data/lib/vagrant-unison2/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d1bd32bfb734ac2d670b0c1262302721eb6040f
|
4
|
+
data.tar.gz: c7b2aabc864f537bb8c2d037eff5a5906674840d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13573bf09a741d47532d3c2bea0a453f1f99ae27abb254b26c85f11bad22719409d71e57a3a52e4bb9c570a82ce358e32f4adc33b4abca829da5fb85a1a77751
|
7
|
+
data.tar.gz: e348c59bad88fd9394e8c9b5076bed0ce63010d3e1d98e1bfa1457ae331bda2bf74f1e479f106794c6d9d59d0004b24b58bb14b714af855fbfe7f04bde02cb59
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Vagrant Unison Plugin
|
1
|
+
# Vagrant Unison 2 Plugin
|
2
2
|
|
3
3
|
This is a [Vagrant](http://www.vagrantup.com) 1.1+ plugin that syncs files over SSH from a local folder
|
4
4
|
to your Vagrant VM (local or on AWS). Under the covers it uses [Unison](http://www.cis.upenn.edu/~bcpierce/unison/)
|
@@ -7,12 +7,12 @@ to your Vagrant VM (local or on AWS). Under the covers it uses [Unison](http://
|
|
7
7
|
|
8
8
|
## Features
|
9
9
|
|
10
|
-
* Unisoned folder support via `unison` over `ssh` -> will work with any vagrant provider, eg Virtualbox or AWS.
|
10
|
+
* Unisoned folder support via `unison` over `ssh` -> will work with any vagrant provider, eg Virtualbox or AWS, though it's most tested on a local VM via Virtualbox.
|
11
11
|
|
12
12
|
## Usage
|
13
13
|
|
14
14
|
1. You must already have [Unison](http://www.cis.upenn.edu/~bcpierce/unison/) installed and in your path.
|
15
|
-
* On Mac you can install this with Homebrew: `brew install unison`
|
15
|
+
* On Mac you can install this with Homebrew: `brew install unison`
|
16
16
|
* On Unix (Ubuntu) install using `sudo apt-get install unison`
|
17
17
|
* On Windows, download [2.40.102](http://alan.petitepomme.net/unison/assets/Unison-2.40.102.zip), unzip, rename `Unison-2.40.102 Text.exe` to `unison.exe` and copy to somewhere in your path.
|
18
18
|
1. Install using standard Vagrant 1.1+ plugin installation methods.
|
@@ -32,18 +32,20 @@ end
|
|
32
32
|
```
|
33
33
|
1. Start up your starting your vagrant box as normal (eg: `vagrant up`)
|
34
34
|
|
35
|
+
|
35
36
|
## Start syncing Folders
|
36
37
|
|
37
38
|
Run `vagrant unison-sync-once` to run a single, non-interactive sync and then exit.
|
38
39
|
|
39
|
-
Run `vagrant unison-sync` to
|
40
|
+
Run `vagrant unison-sync-polling` to start in bidirect monitor (repeat) mode - every second unison checks for changes on either side and syncs them.
|
41
|
+
|
42
|
+
## (Legacy) Sync using OSX inotify events
|
40
43
|
|
41
|
-
|
42
|
-
which must be installed in your path.
|
44
|
+
Run `vagrant unison-sync` to sync then start watching the local_folder for changes, and syncing these to your vagrang VM.
|
43
45
|
|
44
|
-
|
46
|
+
This uses the `watch` ruby gem and runs a one-off unison sync when it gets change events.
|
45
47
|
|
46
|
-
|
48
|
+
For some reason, this does not always get all the events immediately which can be frustrating. Since the polling mode (unison repeat mode) is not too resource intensive, I recommend that instead.
|
47
49
|
|
48
50
|
## Sync in interactive mode
|
49
51
|
|
@@ -56,6 +58,12 @@ This is a useful tool when the automatic sync sees a change in a file on both
|
|
56
58
|
sides and skips it.
|
57
59
|
|
58
60
|
## Cleanup unison database
|
61
|
+
Run `vagrant unison-cleanup` to clear the unison metadata from `~/Library/Application Support/Unison/` as well as all files.
|
62
|
+
|
63
|
+
## Error states
|
64
|
+
|
65
|
+
### Inconsistent state with unison metadata
|
66
|
+
|
59
67
|
When you get
|
60
68
|
```
|
61
69
|
Fatal error: Warning: inconsistent state.
|
@@ -67,9 +75,23 @@ Please delete archive files as appropriate and try again
|
|
67
75
|
or invoke Unison with -ignorearchives flag.
|
68
76
|
```
|
69
77
|
|
70
|
-
|
78
|
+
You should run a unison-cleanup
|
79
|
+
|
71
80
|
Running Unison with -ignorearchives flag is a bad idea, since it will produce conflicts.
|
72
81
|
|
82
|
+
### Skipping files changed on both sides
|
83
|
+
|
84
|
+
This is most often caused in my experience by files that get changed by different users with different permissions.
|
85
|
+
|
86
|
+
For instance, if you're running an Ubuntu VM then the unison process is running
|
87
|
+
as the vagrant user. If you have the unison synced folder loaded as a volume in
|
88
|
+
a docker container and a new file gets created in the container, the vagrant
|
89
|
+
user in the VM won't own that file and this can keep unison from being able to
|
90
|
+
sync the file. (I'm looking for a way to fix this particular error case).
|
91
|
+
|
92
|
+
Running a unison-cleanup should fix this state.
|
93
|
+
|
94
|
+
|
73
95
|
## Development
|
74
96
|
|
75
97
|
To work on the `vagrant-unison` plugin, clone this repository out, and use
|
@@ -99,9 +99,12 @@ module VagrantPlugins
|
|
99
99
|
|
100
100
|
class CommandPolling < Vagrant.plugin("2", :command)
|
101
101
|
include UnisonSync
|
102
|
+
attr_accessor :bg_thread
|
102
103
|
|
103
104
|
def execute
|
104
105
|
with_target_vms do |machine|
|
106
|
+
@bg_thread = watch_vm_for_memory_leak(machine)
|
107
|
+
|
105
108
|
execute_sync_command(machine) do |command|
|
106
109
|
command.repeat = true
|
107
110
|
command.terse = true
|
@@ -121,7 +124,10 @@ module VagrantPlugins
|
|
121
124
|
exit_on_next_sigint = false
|
122
125
|
system(command)
|
123
126
|
rescue Interrupt
|
124
|
-
|
127
|
+
if exit_on_next_sigint
|
128
|
+
Thread.kill(@bg_thread) if @bg_thread
|
129
|
+
exit 1
|
130
|
+
end
|
125
131
|
@env.ui.info '** Hit Ctrl + C again to kill. **'
|
126
132
|
exit_on_next_sigint = true
|
127
133
|
rescue Exception
|
@@ -130,9 +136,32 @@ module VagrantPlugins
|
|
130
136
|
end
|
131
137
|
end
|
132
138
|
end
|
133
|
-
|
134
139
|
0
|
135
140
|
end
|
141
|
+
|
142
|
+
def watch_vm_for_memory_leak(machine)
|
143
|
+
ssh_command = SshCommand.new(machine)
|
144
|
+
unison_mem_cap_mb = 100
|
145
|
+
Thread.new(ssh_command.ssh, unison_mem_cap_mb) do |ssh_command_text, mem_cap_mb|
|
146
|
+
while true
|
147
|
+
sleep 15
|
148
|
+
total_mem = `#{ssh_command_text} 'free -m | egrep "^Mem:" | awk "{print \\$2}"' 2>/dev/null`
|
149
|
+
_unison_proc_returnval = `#{ssh_command_text} 'ps aux | grep "[u]nison -server" | awk "{print \\$2, \\$4}"' 2>/dev/null`
|
150
|
+
if _unison_proc_returnval == ''
|
151
|
+
puts "Unison not running in VM"
|
152
|
+
next
|
153
|
+
end
|
154
|
+
pid, mem_pct_unison = _unison_proc_returnval.strip.split(' ')
|
155
|
+
mem_unison = (total_mem.to_f * mem_pct_unison.to_f/100).round(1)
|
156
|
+
# Debugging: uncomment to log every loop tick
|
157
|
+
# puts "Unison running as #{pid} using #{mem_unison} mb"
|
158
|
+
if mem_unison > mem_cap_mb
|
159
|
+
puts "Unison using #{mem_unison} mb memory is over limit of #{mem_cap_mb}, restarting"
|
160
|
+
`#{ssh_command_text} kill -HUP #{pid} 2>/dev/null`
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
136
165
|
end
|
137
166
|
|
138
167
|
class CommandCleanup < Vagrant.plugin("2", :command)
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module VagrantPlugins
|
2
2
|
module Unison
|
3
3
|
class ShellCommand
|
4
|
-
def initialize machine,
|
4
|
+
def initialize machine, unison_paths, ssh_command
|
5
5
|
@machine = machine
|
6
|
-
@
|
6
|
+
@unison_paths = unison_paths
|
7
7
|
@ssh_command = ssh_command
|
8
8
|
end
|
9
9
|
|
@@ -25,13 +25,13 @@ module VagrantPlugins
|
|
25
25
|
def args
|
26
26
|
_args = [
|
27
27
|
'unison',
|
28
|
-
@
|
29
|
-
@ssh_command.uri,
|
28
|
+
@unison_paths.host,
|
29
|
+
@ssh_command.uri(@unison_paths),
|
30
30
|
batch_arg,
|
31
31
|
terse_arg,
|
32
32
|
repeat_arg,
|
33
33
|
ignore_arg,
|
34
|
-
['-sshargs', %("#{@ssh_command.
|
34
|
+
['-sshargs', %("#{@ssh_command.ssh_args}")],
|
35
35
|
].flatten.compact
|
36
36
|
_args
|
37
37
|
end
|
@@ -1,14 +1,21 @@
|
|
1
1
|
module VagrantPlugins
|
2
2
|
module Unison
|
3
3
|
class SshCommand
|
4
|
-
def initialize(machine
|
4
|
+
def initialize(machine)
|
5
5
|
@machine = machine
|
6
|
-
@unison_paths = unison_paths
|
7
6
|
end
|
8
7
|
|
9
|
-
def
|
8
|
+
def ssh
|
10
9
|
%W(
|
11
|
-
|
10
|
+
ssh
|
11
|
+
vagrant@127.0.0.1
|
12
|
+
#{ssh_args}
|
13
|
+
).compact.join(' ')
|
14
|
+
end
|
15
|
+
|
16
|
+
def ssh_args
|
17
|
+
%W(
|
18
|
+
-p #{@machine.ssh_info[:port]}
|
12
19
|
#{proxy_command}
|
13
20
|
-o StrictHostKeyChecking=no
|
14
21
|
-o UserKnownHostsFile=/dev/null
|
@@ -16,27 +23,23 @@ module VagrantPlugins
|
|
16
23
|
).compact.join(' ')
|
17
24
|
end
|
18
25
|
|
19
|
-
def uri
|
20
|
-
username = ssh_info[:username]
|
21
|
-
host = ssh_info[:host]
|
26
|
+
def uri(unison_paths)
|
27
|
+
username = @machine.ssh_info[:username]
|
28
|
+
host = @machine.ssh_info[:host]
|
22
29
|
|
23
|
-
"ssh://#{username}@#{host}/#{
|
30
|
+
"ssh://#{username}@#{host}/#{unison_paths.guest}"
|
24
31
|
end
|
25
32
|
|
26
33
|
private
|
27
34
|
|
28
35
|
def proxy_command
|
29
|
-
command = ssh_info[:proxy_command]
|
36
|
+
command = @machine.ssh_info[:proxy_command]
|
30
37
|
return nil unless command
|
31
38
|
"-o ProxyCommand='#{command}'"
|
32
39
|
end
|
33
40
|
|
34
|
-
def ssh_info
|
35
|
-
@machine.ssh_info
|
36
|
-
end
|
37
|
-
|
38
41
|
def key_paths
|
39
|
-
ssh_info[:private_key_path].map { |p| "-i #{p}" }.join(' ')
|
42
|
+
@machine.ssh_info[:private_key_path].map { |p| "-i #{p}" }.join(' ')
|
40
43
|
end
|
41
44
|
end
|
42
45
|
end
|
@@ -12,7 +12,7 @@ module VagrantPlugins
|
|
12
12
|
machine.communicate.sudo("mkdir -p '#{guest_path}'")
|
13
13
|
machine.communicate.sudo("chown #{machine.ssh_info[:username]} '#{guest_path}'")
|
14
14
|
|
15
|
-
ssh_command = SshCommand.new(machine
|
15
|
+
ssh_command = SshCommand.new(machine)
|
16
16
|
shell_command = ShellCommand.new(machine, unison_paths, ssh_command)
|
17
17
|
|
18
18
|
yield shell_command
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-unison2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Laing
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2016-
|
13
|
+
date: 2016-03-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: listen
|