vagrant-notify 0.2.2 → 0.3.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/.gitignore +1 -1
- data/Gemfile +3 -5
- data/README.md +5 -8
- data/development/Vagrantfile +13 -0
- data/files/notify-send.erb +7 -0
- data/lib/vagrant-notify/action.rb +13 -0
- data/lib/vagrant-notify/action/install_command.rb +2 -1
- data/lib/vagrant-notify/action/start_server.rb +43 -5
- data/lib/vagrant-notify/action/stop_server.rb +3 -0
- data/lib/vagrant-notify/plugin.rb +7 -4
- data/lib/vagrant-notify/server.rb +10 -17
- data/lib/vagrant-notify/version.rb +1 -1
- data/spec/action/install_command_spec.rb +4 -0
- data/spec/action/start_server_spec.rb +4 -1
- data/spec/action/stop_server_spec.rb +6 -4
- data/spec/server_spec.rb +4 -21
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c08a1c58a9fcfa0470ad77a737f52f2b60cf7971
|
4
|
+
data.tar.gz: b2a3093c5a9dce8a52c28aa8dc90b2e95ef68f07
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 479ab1f5e182e41f8e15ed05e3f91ecd66e044276c3eb6b60059f175babf5c42447ed2de497827abd3f482d83db67d543596ce73235adbfaeb1e5efd067c696e
|
7
|
+
data.tar.gz: e91676a8f4795be0f42f442091c7e7fe25902f45448355c33b7b96da0ea798c9a0e696cd66d873d4654cd89a1ad499185b72dec7761921579bbecad68041862f
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
@@ -10,11 +10,9 @@ group :development do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
group :development, :test do
|
13
|
-
|
14
|
-
|
15
|
-
# Vagrant environment itself using `vagrant plugin`.
|
16
|
-
gem 'vagrant', github: 'mitchellh/vagrant'
|
13
|
+
gem 'vagrant', github: 'mitchellh/vagrant'
|
14
|
+
gem 'vagrant-lxc', github: 'fgrehm/vagrant-lxc'
|
17
15
|
gem 'rake'
|
18
|
-
gem 'rspec'
|
16
|
+
gem 'rspec', '~> 2.13.0'
|
19
17
|
gem 'rspec-spies'
|
20
18
|
end
|
data/README.md
CHANGED
@@ -18,10 +18,10 @@ $ vagrant plugin install vagrant-notify
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
|
22
|
-
[
|
23
|
-
|
24
|
-
will be
|
21
|
+
Whenever you run `vagrant up`, a Ruby [TCPServer](http://www.ruby-doc.org/stdlib-1.9.3/libdoc/socket/rdoc/TCPServer.html)
|
22
|
+
will fire up on a port within the [usable port range](https://github.com/mitchellh/vagrant/blob/master/config/default.rb#L14)
|
23
|
+
and a [script](https://github.com/fgrehm/vagrant-notify/blob/master/files/notify-send.erb)
|
24
|
+
will be copied over to the guest machine to replace the original `notify-send`
|
25
25
|
command.
|
26
26
|
|
27
27
|
If by any chance your IP changes, you can run `vagrant provision` in order to
|
@@ -29,10 +29,7 @@ update the guest script with the new IP.
|
|
29
29
|
|
30
30
|
## Known issues
|
31
31
|
|
32
|
-
*
|
33
|
-
< 1.1 version and I'm planning to fix that as soon as I have a chance.
|
34
|
-
|
35
|
-
* vagrant's `suspend` does not stop the notification server
|
32
|
+
* `vagrant suspend` does not stop the notification server
|
36
33
|
|
37
34
|
|
38
35
|
## Contributing
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
# vi: set ft=ruby :
|
3
|
+
|
4
|
+
Vagrant.require_plugin 'vagrant-notify'
|
5
|
+
Vagrant.require_plugin 'vagrant-lxc'
|
6
|
+
|
7
|
+
Vagrant.configure("2") do |config|
|
8
|
+
config.vm.box = "base"
|
9
|
+
config.vm.box = "quantal64"
|
10
|
+
|
11
|
+
config.vm.define :vm1
|
12
|
+
config.vm.define :vm2
|
13
|
+
end
|
data/files/notify-send.erb
CHANGED
@@ -8,6 +8,7 @@
|
|
8
8
|
require 'rubygems'
|
9
9
|
require 'socket'
|
10
10
|
require 'optparse'
|
11
|
+
require 'fileutils'
|
11
12
|
|
12
13
|
options = {}
|
13
14
|
OptionParser.new do |opts|
|
@@ -23,6 +24,12 @@ OptionParser.new do |opts|
|
|
23
24
|
|
24
25
|
end.parse!
|
25
26
|
|
27
|
+
if options[:i]
|
28
|
+
new_filename = options[:i].gsub('/', '-')
|
29
|
+
FileUtils.cp options[:i], "<%= shared_folder %>/#{new_filename}"
|
30
|
+
options[:i] = new_filename
|
31
|
+
end
|
32
|
+
|
26
33
|
cmd = options.map do |key, value|
|
27
34
|
"-#{key} '#{value}'"
|
28
35
|
end.join(' ')
|
@@ -8,6 +8,19 @@ require_relative 'action/stop_server'
|
|
8
8
|
module Vagrant
|
9
9
|
module Notify
|
10
10
|
module Action
|
11
|
+
class SetSharedFolder
|
12
|
+
def initialize(app, env)
|
13
|
+
@app = app
|
14
|
+
end
|
15
|
+
|
16
|
+
def call(env)
|
17
|
+
host_dir = Pathname("/tmp/vagrant-notify/#{env[:machine].id}")
|
18
|
+
FileUtils.mkdir_p host_dir.to_s unless host_dir.exist?
|
19
|
+
env[:machine].config.vm.synced_folder host_dir, "/tmp/vagrant-notify", id: "vagrant-notify"
|
20
|
+
@app.call(env)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
11
24
|
class << self
|
12
25
|
Call = Vagrant::Action::Builtin::Call
|
13
26
|
|
@@ -17,7 +17,7 @@ module Vagrant
|
|
17
17
|
|
18
18
|
def compile_command(env)
|
19
19
|
host_port = env[:notify_data][:port]
|
20
|
-
template_binding = OpenStruct.new(:host_ip => local_ip, :host_port => host_port)
|
20
|
+
template_binding = OpenStruct.new(:host_ip => local_ip, :host_port => host_port, :shared_folder => '/tmp/vagrant-notify')
|
21
21
|
command_template = ERB.new(Vagrant::Notify.files_path.join('notify-send.erb').read)
|
22
22
|
command = command_template.result(template_binding.instance_eval { binding })
|
23
23
|
|
@@ -27,6 +27,7 @@ module Vagrant
|
|
27
27
|
def install_command_on_guest(env, command_path)
|
28
28
|
source = env[:tmp_path].join 'vagrant-notify-send'
|
29
29
|
env[:machine].communicate.upload(source.to_s, '/tmp/notify-send')
|
30
|
+
env[:machine].communicate.sudo('mv /usr/bin/{notify-send,notify-send.bkp}; exit 0')
|
30
31
|
env[:machine].communicate.sudo('mv /tmp/notify-send /usr/bin/notify-send && chmod +x /usr/bin/notify-send')
|
31
32
|
end
|
32
33
|
|
@@ -1,23 +1,61 @@
|
|
1
|
+
require "vagrant/util/is_port_open"
|
2
|
+
|
1
3
|
require_relative '../server'
|
2
4
|
|
3
5
|
module Vagrant
|
4
6
|
module Notify
|
5
7
|
module Action
|
6
8
|
class StartServer
|
7
|
-
|
8
|
-
# assigned
|
9
|
-
PORT = '9999'
|
9
|
+
include Util::IsPortOpen
|
10
10
|
|
11
11
|
def initialize(app, env)
|
12
12
|
@app = app
|
13
13
|
end
|
14
14
|
|
15
15
|
def call(env)
|
16
|
-
env
|
17
|
-
|
16
|
+
@env = env
|
17
|
+
|
18
|
+
port = next_available_port
|
19
|
+
env[:notify_data][:pid] = Server.run(env, port)
|
20
|
+
env[:notify_data][:port] = port
|
18
21
|
|
19
22
|
@app.call env
|
20
23
|
end
|
24
|
+
|
25
|
+
def next_available_port
|
26
|
+
# Determine a list of usable ports for us to use
|
27
|
+
usable_ports = Set.new(@env[:machine].config.vm.usable_port_range)
|
28
|
+
|
29
|
+
# Pass one, remove all defined host ports from usable ports
|
30
|
+
with_forwarded_ports do |options|
|
31
|
+
usable_ports.delete(options[:host])
|
32
|
+
end
|
33
|
+
|
34
|
+
# Pass two, remove ports used by other processes
|
35
|
+
with_forwarded_ports do |options|
|
36
|
+
host_port = options[:host]
|
37
|
+
usable_ports.delete(options[:host]) if is_port_open?("127.0.0.1", host_port)
|
38
|
+
end
|
39
|
+
|
40
|
+
# If we have no usable ports then we can't use the plugin
|
41
|
+
raise 'No usable ports available!' if usable_ports.empty?
|
42
|
+
|
43
|
+
# Set the port up to be the last one since vagrant's port collision handler
|
44
|
+
# will use the first as in:
|
45
|
+
# https://github.com/mitchellh/vagrant/blob/master/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb#L84
|
46
|
+
usable_ports.to_a.sort.reverse.find do |port|
|
47
|
+
return port unless is_port_open?("127.0.0.1", port)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def with_forwarded_ports
|
52
|
+
@env[:machine].config.vm.networks.each do |type, options|
|
53
|
+
# Ignore anything but forwarded ports
|
54
|
+
next if type != :forwarded_port
|
55
|
+
|
56
|
+
yield options
|
57
|
+
end
|
58
|
+
end
|
21
59
|
end
|
22
60
|
end
|
23
61
|
end
|
@@ -17,18 +17,21 @@ module Vagrant
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
share_folder_hook = lambda do |hook|
|
21
|
+
require_relative './action'
|
22
|
+
hook.after Vagrant::Action::Builtin::Provision, Vagrant::Notify::Action::SetSharedFolder
|
22
23
|
end
|
24
|
+
action_hook 'set-shared-folder-and-start-notify-server-on-machine-up', :machine_action_up, &share_folder_hook
|
25
|
+
action_hook 'set-shared-folder-and-start-notify-server-on-machine-reload', :machine_action_reload, &share_folder_hook
|
23
26
|
|
24
|
-
action_hook 'stop-server-after-
|
27
|
+
action_hook 'stop-server-after-halt' do |hook|
|
25
28
|
require_relative './action'
|
26
29
|
hook.before Vagrant::Action::Builtin::GracefulHalt, Vagrant::Notify::Action.action_stop_server
|
27
30
|
end
|
28
31
|
|
29
32
|
# TODO: This should be generic, we don't want to hard code every single
|
30
33
|
# possible provider action class that Vagrant might have
|
31
|
-
action_hook 'stop-server-before-
|
34
|
+
action_hook 'stop-server-before-destroy', :machine_action_destroy do |hook|
|
32
35
|
require_relative './action'
|
33
36
|
hook.before VagrantPlugins::ProviderVirtualBox::Action::Destroy, Vagrant::Notify::Action.action_stop_server
|
34
37
|
|
@@ -30,18 +30,22 @@ module Vagrant
|
|
30
30
|
if http_request?(args)
|
31
31
|
client.puts HTTP_RESPONSE
|
32
32
|
else
|
33
|
-
|
33
|
+
fix_icon_path!(args)
|
34
34
|
system("notify-send #{args}")
|
35
35
|
end
|
36
36
|
client.close
|
37
37
|
rescue => ex
|
38
|
-
|
39
|
-
log.puts "#{ex.message}"
|
40
|
-
end
|
38
|
+
log ex.message
|
41
39
|
end
|
42
40
|
|
43
41
|
private
|
44
42
|
|
43
|
+
def log(message)
|
44
|
+
File.open("/tmp/vagrant-notify-error-#{@id}.log", 'a+') do |log|
|
45
|
+
log.puts "#{message}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
45
49
|
def read_args(client)
|
46
50
|
''.tap do |args|
|
47
51
|
while tmp = client.gets and tmp !~ /^\s*$/
|
@@ -54,24 +58,13 @@ module Vagrant
|
|
54
58
|
args =~ /^GET/
|
55
59
|
end
|
56
60
|
|
57
|
-
def
|
61
|
+
def fix_icon_path!(args)
|
58
62
|
return unless args =~ /-i '([^']+)'/
|
59
63
|
icon = $1
|
60
64
|
# TODO: Handle system icons
|
61
|
-
host_file = "/tmp/vagrant-notify
|
62
|
-
download(icon, host_file) unless File.exists?(host_file)
|
65
|
+
host_file = "/tmp/vagrant-notify/#{@id}/#{icon.gsub('/', '-')}"
|
63
66
|
args.gsub!(icon, host_file)
|
64
67
|
end
|
65
|
-
|
66
|
-
def download(icon, host_file)
|
67
|
-
communicator.download(icon, host_file)
|
68
|
-
end
|
69
|
-
|
70
|
-
def communicator
|
71
|
-
env = Vagrant::Environment.new
|
72
|
-
machine = env.machine(@machine_name, @provider)
|
73
|
-
machine.communicate
|
74
|
-
end
|
75
68
|
end
|
76
69
|
end
|
77
70
|
end
|
@@ -34,6 +34,10 @@ describe Vagrant::Notify::Action::InstallCommand do
|
|
34
34
|
communicator.should have_received(:upload).with(tmp_cmd_path.to_s, guest_tmp_path)
|
35
35
|
end
|
36
36
|
|
37
|
+
it 'creates a backup for the available command' do
|
38
|
+
communicator.should have_received(:sudo).with("mv /usr/bin/{notify-send,notify-send.bkp}; exit 0")
|
39
|
+
end
|
40
|
+
|
37
41
|
it 'installs command for all users' do
|
38
42
|
communicator.should have_received(:sudo).with("mv #{guest_tmp_path} #{guest_path} && chmod +x #{guest_path}")
|
39
43
|
end
|
@@ -6,12 +6,13 @@ describe Vagrant::Notify::Action::StartServer do
|
|
6
6
|
let(:app) { lambda { |env| } }
|
7
7
|
let(:env) { {notify_data: {}} }
|
8
8
|
let(:pid) { '42' }
|
9
|
-
let(:port) {
|
9
|
+
let(:port) { '1234' }
|
10
10
|
|
11
11
|
subject { described_class.new(app, env) }
|
12
12
|
|
13
13
|
before do
|
14
14
|
Vagrant::Notify::Server.stub(:run => pid)
|
15
|
+
subject.stub(next_available_port: port)
|
15
16
|
subject.call(env)
|
16
17
|
end
|
17
18
|
|
@@ -26,4 +27,6 @@ describe Vagrant::Notify::Action::StartServer do
|
|
26
27
|
it 'persists used port' do
|
27
28
|
env[:notify_data][:port].should == port
|
28
29
|
end
|
30
|
+
|
31
|
+
pending 'identifies the next available port'
|
29
32
|
end
|
@@ -3,10 +3,12 @@ require 'spec_helper'
|
|
3
3
|
require 'vagrant-notify/action/stop_server'
|
4
4
|
|
5
5
|
describe Vagrant::Notify::Action::StopServer do
|
6
|
-
let(:app)
|
7
|
-
let(:
|
8
|
-
let(:
|
9
|
-
let(:
|
6
|
+
let(:app) { lambda { |env| } }
|
7
|
+
let(:communicator) { mock(sudo: true) }
|
8
|
+
let(:machine) { mock(communicate: communicator) }
|
9
|
+
let(:env) { {notify_data: {pid: pid, port: 1234}, machine: machine} }
|
10
|
+
let(:pid) { '42' }
|
11
|
+
let(:port) { described_class::PORT }
|
10
12
|
|
11
13
|
subject { described_class.new(app, env) }
|
12
14
|
|
data/spec/server_spec.rb
CHANGED
@@ -7,7 +7,7 @@ describe Vagrant::Notify::Server do
|
|
7
7
|
|
8
8
|
subject { described_class.new(machine_id) }
|
9
9
|
|
10
|
-
before { subject.stub(:system => true
|
10
|
+
before { subject.stub(:system => true) }
|
11
11
|
|
12
12
|
it 'runs notify-send with received data from client' do
|
13
13
|
subject.should_receive(:system).with("notify-send #{arguments}")
|
@@ -22,27 +22,10 @@ describe Vagrant::Notify::Server do
|
|
22
22
|
context 'notification with an icon' do
|
23
23
|
let(:arguments) { "-i 'foo/bar.jpg'" }
|
24
24
|
|
25
|
-
|
26
|
-
before { subject.receive_data(client) }
|
27
|
-
|
28
|
-
it 'downloads icon file to host machine' do
|
29
|
-
subject.should have_received(:download)
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'rewrites icon path before sending the notification' do
|
33
|
-
subject.should have_received(:system).with("notify-send -i '/tmp/vagrant-notify-#{machine_id}-foo-bar.jpg'")
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
context 'icon file cache is present' do
|
38
|
-
before do
|
39
|
-
File.stub(:exists? => true)
|
40
|
-
subject.receive_data(client)
|
41
|
-
end
|
25
|
+
before { subject.receive_data(client) }
|
42
26
|
|
43
|
-
|
44
|
-
|
45
|
-
end
|
27
|
+
it 'rewrites icon path before sending the notification' do
|
28
|
+
subject.should have_received(:system).with("notify-send -i '/tmp/vagrant-notify/#{machine_id}/foo-bar.jpg'")
|
46
29
|
end
|
47
30
|
end
|
48
31
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-notify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fabio Rehm
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A Vagrant plugin that redirects system notifications from guest to host
|
14
14
|
machine.
|
@@ -27,6 +27,7 @@ files:
|
|
27
27
|
- LICENSE.txt
|
28
28
|
- README.md
|
29
29
|
- Rakefile
|
30
|
+
- development/Vagrantfile
|
30
31
|
- files/notify-send.erb
|
31
32
|
- lib/vagrant-notify.rb
|
32
33
|
- lib/vagrant-notify/action.rb
|