vagrant-notify 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.rspec +3 -0
- data/.travis.yml +6 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +60 -0
- data/Guardfile +5 -0
- data/LICENSE.txt +22 -0
- data/README.md +53 -0
- data/Rakefile +22 -0
- data/files/notify-send.erb +38 -0
- data/lib/vagrant-notify.rb +32 -0
- data/lib/vagrant-notify/middleware.rb +3 -0
- data/lib/vagrant-notify/middleware/install_command.rb +43 -0
- data/lib/vagrant-notify/middleware/start_server.rb +48 -0
- data/lib/vagrant-notify/middleware/stop_server.rb +49 -0
- data/lib/vagrant-notify/server.rb +28 -0
- data/lib/vagrant-notify/version.rb +5 -0
- data/lib/vagrant_init.rb +4 -0
- data/spec/middleware/install_command_spec.rb +59 -0
- data/spec/middleware/start_server_spec.rb +69 -0
- data/spec/middleware/stop_server_spec.rb +49 -0
- data/spec/server_spec.rb +18 -0
- data/spec/spec_helper.rb +15 -0
- data/vagrant-notify.gemspec +24 -0
- metadata +129 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
vagrant-notify (0.0.1)
|
5
|
+
vagrant
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
archive-tar-minitar (0.5.2)
|
11
|
+
childprocess (0.3.6)
|
12
|
+
ffi (~> 1.0, >= 1.0.6)
|
13
|
+
diff-lcs (1.1.3)
|
14
|
+
erubis (2.7.0)
|
15
|
+
ffi (1.1.5)
|
16
|
+
guard (1.4.0)
|
17
|
+
listen (>= 0.4.2)
|
18
|
+
thor (>= 0.14.6)
|
19
|
+
guard-rspec (2.1.0)
|
20
|
+
guard (>= 1.1)
|
21
|
+
rspec (~> 2.11)
|
22
|
+
i18n (0.6.1)
|
23
|
+
json (1.5.4)
|
24
|
+
listen (0.5.3)
|
25
|
+
log4r (1.1.10)
|
26
|
+
net-scp (1.0.4)
|
27
|
+
net-ssh (>= 1.99.1)
|
28
|
+
net-ssh (2.2.2)
|
29
|
+
rake (0.9.2.2)
|
30
|
+
rb-inotify (0.8.8)
|
31
|
+
ffi (>= 0.5.0)
|
32
|
+
rspec (2.11.0)
|
33
|
+
rspec-core (~> 2.11.0)
|
34
|
+
rspec-expectations (~> 2.11.0)
|
35
|
+
rspec-mocks (~> 2.11.0)
|
36
|
+
rspec-core (2.11.1)
|
37
|
+
rspec-expectations (2.11.3)
|
38
|
+
diff-lcs (~> 1.1.3)
|
39
|
+
rspec-mocks (2.11.3)
|
40
|
+
thor (0.16.0)
|
41
|
+
vagrant (1.0.5)
|
42
|
+
archive-tar-minitar (= 0.5.2)
|
43
|
+
childprocess (~> 0.3.1)
|
44
|
+
erubis (~> 2.7.0)
|
45
|
+
i18n (~> 0.6.0)
|
46
|
+
json (~> 1.5.1)
|
47
|
+
log4r (~> 1.1.9)
|
48
|
+
net-scp (~> 1.0.4)
|
49
|
+
net-ssh (~> 2.2.2)
|
50
|
+
|
51
|
+
PLATFORMS
|
52
|
+
ruby
|
53
|
+
|
54
|
+
DEPENDENCIES
|
55
|
+
guard
|
56
|
+
guard-rspec
|
57
|
+
rake
|
58
|
+
rb-inotify
|
59
|
+
rspec
|
60
|
+
vagrant-notify!
|
data/Guardfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Fabio Rehm
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
# Vagrant::Notify
|
2
|
+
|
3
|
+
[![Build Status](https://travis-ci.org/fgrehm/vagrant-notify.png)](https://travis-ci.org/fgrehm/vagrant-notify)
|
4
|
+
|
5
|
+
A Vagrant plugin that forwards `notify-send` from guest to host machine, tested
|
6
|
+
using Ubuntu as guest and host machine.
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
Add this line to your application's Gemfile:
|
11
|
+
|
12
|
+
gem 'vagrant-notify'
|
13
|
+
|
14
|
+
And then execute:
|
15
|
+
|
16
|
+
$ bundle
|
17
|
+
|
18
|
+
Or install it yourself as:
|
19
|
+
|
20
|
+
$ gem install vagrant-notify
|
21
|
+
|
22
|
+
## Usage
|
23
|
+
|
24
|
+
After installing the gem, whenever you run `vagrant up`, a Ruby
|
25
|
+
[TCPServer](http://www.ruby-doc.org/stdlib-1.9.3/libdoc/socket/rdoc/TCPServer.html)
|
26
|
+
will fire up on `8081` port and a [script](https://github.com/fgrehm/vagrant-notify/blob/master/files/notify-send.erb)
|
27
|
+
will be installed on the guest machine to replace the original `notify-send`
|
28
|
+
command.
|
29
|
+
|
30
|
+
If by any change your IP changes, you can run `vagrant provision` in order to
|
31
|
+
update the guest script with the new IP.
|
32
|
+
|
33
|
+
In case you need to run the notification server on a different port, you can set
|
34
|
+
it from your `Vagrantfile`:
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
Vagrant::Notify::server_port = 8888
|
38
|
+
```
|
39
|
+
|
40
|
+
## TODO
|
41
|
+
|
42
|
+
* Display guest machine icons
|
43
|
+
* Support for Multi-VM environments
|
44
|
+
* Notify provisioning status
|
45
|
+
* Support for Mac OS
|
46
|
+
|
47
|
+
## Contributing
|
48
|
+
|
49
|
+
1. Fork it
|
50
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
51
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
52
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
53
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
|
3
|
+
require 'rspec/core/rake_task'
|
4
|
+
RSpec::Core::RakeTask.new do |t|
|
5
|
+
t.pattern = "spec/**/*_spec.rb"
|
6
|
+
end
|
7
|
+
|
8
|
+
desc 'Outpus some information about Vagrant middleware stack useful for development (use ACTION=action_name to filter out actions)'
|
9
|
+
task 'vagrant-stack' do
|
10
|
+
require 'vagrant'
|
11
|
+
Vagrant.actions.to_hash.each do |action, stack|
|
12
|
+
next unless !ENV['ACTION'] || ENV['ACTION'] == action.to_s
|
13
|
+
|
14
|
+
puts action
|
15
|
+
stack.send(:stack).each do |middleware|
|
16
|
+
puts " #{middleware[0]}"
|
17
|
+
puts " -> #{middleware[1].inspect}" unless middleware[1].empty?
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
task :default => :spec
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- mode: ruby -*-
|
3
|
+
# vi: set ft=ruby :
|
4
|
+
|
5
|
+
# This is the wrapper around Ubuntu's notify-send that connects to the host machine
|
6
|
+
# when sending notifications
|
7
|
+
|
8
|
+
require 'rubygems'
|
9
|
+
require 'socket'
|
10
|
+
require 'optparse'
|
11
|
+
|
12
|
+
options = {}
|
13
|
+
OptionParser.new do |opts|
|
14
|
+
opts.banner = "Usage: example.rb [options]"
|
15
|
+
|
16
|
+
opts.on('-u', '--urgency LEVEL') { |v| options[:u] = v }
|
17
|
+
opts.on('-t', '--expire-time TIME') { |v| options[:t] = v }
|
18
|
+
opts.on('-a', '--app-name APP_NAME') { |v| options[:a] = v }
|
19
|
+
opts.on('-i', '--icon ICON[,ICON...]') { |v| options[:i] = v }
|
20
|
+
opts.on('-c', '--category TYPE[,TYPE...]') { |v| options[:c] = v }
|
21
|
+
opts.on('-h', '--hint TYPE:NAME:VALUE') { |v| options[:h] = v }
|
22
|
+
opts.on('-v', '--version') { |v| options[:v] = v }
|
23
|
+
|
24
|
+
end.parse!
|
25
|
+
|
26
|
+
cmd = options.map do |key, value|
|
27
|
+
"-#{key} '#{value}'"
|
28
|
+
end.join(' ')
|
29
|
+
|
30
|
+
# TODO: Need to escape values
|
31
|
+
unless ARGV.empty?
|
32
|
+
cmd << ' -- '
|
33
|
+
cmd << ARGV.map{|a| "'#{a}'"}.join(' ')
|
34
|
+
end
|
35
|
+
|
36
|
+
TCPSocket.open "<%= host_ip %>", <%= host_port %> do |s|
|
37
|
+
s.send cmd, 0
|
38
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
require 'socket'
|
3
|
+
require 'erb'
|
4
|
+
require 'ostruct'
|
5
|
+
|
6
|
+
require 'vagrant-notify/middleware'
|
7
|
+
require 'vagrant-notify/server'
|
8
|
+
require "vagrant-notify/version"
|
9
|
+
|
10
|
+
module Vagrant
|
11
|
+
module Notify
|
12
|
+
class << self
|
13
|
+
def server_port
|
14
|
+
@@server_port ||= 8081
|
15
|
+
end
|
16
|
+
def server_port=(server_port)
|
17
|
+
@@server_port = server_port
|
18
|
+
end
|
19
|
+
|
20
|
+
def files_path
|
21
|
+
@file_path ||= File.expand_path(File.dirname(__FILE__) + '/../files')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
Vagrant.actions[:start].tap do |start|
|
28
|
+
start.use Vagrant::Notify::Middleware::StartServer
|
29
|
+
start.insert_after Vagrant::Action::VM::Boot, Vagrant::Notify::Middleware::InstallCommand
|
30
|
+
end
|
31
|
+
Vagrant.actions[:halt].use Vagrant::Notify::Middleware::StopServer
|
32
|
+
Vagrant.actions[:provision].use Vagrant::Notify::Middleware::InstallCommand
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Vagrant
|
2
|
+
module Notify
|
3
|
+
module Middleware
|
4
|
+
class InstallCommand
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
@command_template_file = Vagrant::Notify.files_path + '/notify-send.erb'
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
env[:ui].info('Compiling and installing notify-send script on guest machine')
|
12
|
+
path = compile_command(env)
|
13
|
+
install_command_on_guest(env, path)
|
14
|
+
@app.call(env)
|
15
|
+
end
|
16
|
+
|
17
|
+
def host_ip(env)
|
18
|
+
ip = nil
|
19
|
+
env[:vm].channel.execute('echo -n $SSH_CLIENT | cut -d" " -f1') do |buffer, data|
|
20
|
+
ip = data.chomp if buffer == :stdout
|
21
|
+
end
|
22
|
+
ip
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def compile_command(env)
|
28
|
+
host_port = Vagrant::Notify::server_port
|
29
|
+
template_binding = OpenStruct.new(:host_ip => host_ip(env), :host_port => host_port)
|
30
|
+
command = ERB.new(File.read(@command_template_file)).result(template_binding.instance_eval { binding })
|
31
|
+
File.open(env[:vm].env.tmp_path + 'vagrant-notify-send', 'w') { |f| f.write(command) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def install_command_on_guest(env, command_path)
|
35
|
+
# DISCUSS: Should we back up the original command if present?
|
36
|
+
source = env[:vm].env.tmp_path + 'vagrant-notify-send'
|
37
|
+
env[:vm].channel.upload(source.to_s, '/tmp/notify-send')
|
38
|
+
env[:vm].channel.sudo('mv /tmp/notify-send /usr/bin/notify-send && chmod +x /usr/bin/notify-send')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Vagrant
|
2
|
+
module Notify
|
3
|
+
module Middleware
|
4
|
+
class StartServer
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
if pid = server_is_running?(env)
|
11
|
+
env[:ui].info "Notification server is already running (#{pid})"
|
12
|
+
else
|
13
|
+
pid = run_server(env)
|
14
|
+
env[:ui].info "Notification server fired up (#{pid})"
|
15
|
+
end
|
16
|
+
|
17
|
+
@app.call(env)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def run_server(env)
|
23
|
+
pid = Server.run
|
24
|
+
|
25
|
+
local_data = env[:vm].env.local_data
|
26
|
+
local_data['vagrant-notify'] ||= Vagrant::Util::HashWithIndifferentAccess.new
|
27
|
+
local_data['vagrant-notify']['pid'] = pid
|
28
|
+
local_data.commit
|
29
|
+
|
30
|
+
pid
|
31
|
+
end
|
32
|
+
|
33
|
+
# REFACTOR: This is duplicated on Middleware::StopServer
|
34
|
+
def server_is_running?(env)
|
35
|
+
begin
|
36
|
+
pid = env[:vm].env.local_data.fetch('vagrant-notify', {}).fetch('pid', nil)
|
37
|
+
return false unless pid
|
38
|
+
|
39
|
+
Process.getpgid(pid)
|
40
|
+
pid
|
41
|
+
rescue Errno::ESRCH
|
42
|
+
false
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Vagrant
|
2
|
+
module Notify
|
3
|
+
module Middleware
|
4
|
+
class StopServer
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
# TODO: Need to handle multi VMs setup
|
11
|
+
|
12
|
+
if pid = server_is_running?(env)
|
13
|
+
env[:ui].info('Stopping notification server...')
|
14
|
+
stop_server(pid)
|
15
|
+
cleanup_local_data(env)
|
16
|
+
end
|
17
|
+
|
18
|
+
@app.call(env)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def stop_server(pid)
|
24
|
+
Process.kill('KILL', pid.to_i) rescue nil
|
25
|
+
end
|
26
|
+
|
27
|
+
def cleanup_local_data(env)
|
28
|
+
local_data = env[:vm].env.local_data
|
29
|
+
local_data['vagrant-notify'] ||= Vagrant::Util::HashWithIndifferentAccess.new
|
30
|
+
local_data['vagrant-notify'].delete('pid')
|
31
|
+
local_data.commit
|
32
|
+
end
|
33
|
+
|
34
|
+
# REFACTOR: This is duplicated on Middleware::StartServer
|
35
|
+
def server_is_running?(env)
|
36
|
+
begin
|
37
|
+
pid = env[:vm].env.local_data.fetch('vagrant-notify', {}).fetch('pid', nil)
|
38
|
+
return false unless pid
|
39
|
+
|
40
|
+
Process.getpgid(pid.to_i)
|
41
|
+
pid
|
42
|
+
rescue Errno::ESRCH
|
43
|
+
false
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Vagrant
|
2
|
+
module Notify
|
3
|
+
class Server
|
4
|
+
def receive_data(client)
|
5
|
+
args = ''
|
6
|
+
while tmp = client.gets
|
7
|
+
args << tmp
|
8
|
+
end
|
9
|
+
client.close
|
10
|
+
|
11
|
+
system("notify-send #{args}")
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.run
|
15
|
+
fork do
|
16
|
+
$0 = 'vagrant-notify-server'
|
17
|
+
tcp_server = TCPServer.open(Vagrant::Notify::server_port)
|
18
|
+
server = self.new
|
19
|
+
loop {
|
20
|
+
Thread.start(tcp_server.accept) do |client|
|
21
|
+
server.receive_data(client)
|
22
|
+
end
|
23
|
+
}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/vagrant_init.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
describe Vagrant::Notify::Middleware::InstallCommand do
|
2
|
+
let(:start_stack) { Vagrant.actions[:start].send(:stack) }
|
3
|
+
let(:provision_stack) { Vagrant.actions[:provision].send(:stack) }
|
4
|
+
let(:host_ip) { 'host-ip' }
|
5
|
+
let(:host_port) { Vagrant::Notify::server_port }
|
6
|
+
let(:template) { ERB.new('<%= host_ip %> <%= host_port %>') }
|
7
|
+
let(:compiled_command_path) { @env[:vm].env.tmp_path + 'vagrant-notify-send' }
|
8
|
+
let(:target_tmp_path) { '/tmp/notify-send' }
|
9
|
+
let(:target_path) { '/usr/bin/notify-send' }
|
10
|
+
let(:channel) { mock(:channel, :sudo => true, :upload => true, :execute => true) }
|
11
|
+
let(:get_ip_command) { 'echo -n $SSH_CLIENT | cut -d" " -f1' }
|
12
|
+
|
13
|
+
subject { described_class.new(@app, @env) }
|
14
|
+
|
15
|
+
before do
|
16
|
+
@app, @env = action_env(vagrant_env.vms.values.first.env)
|
17
|
+
@env[:vm].stub(:channel => channel)
|
18
|
+
ERB.stub(:new => template)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'gets called after boot middleware when starting machine' do
|
22
|
+
boot_index = start_stack.index([Vagrant::Action::VM::Boot, [], nil])
|
23
|
+
middleware_index = start_stack.index([described_class, [], nil])
|
24
|
+
|
25
|
+
boot_index.should < middleware_index
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'gets called when provisioning machine' do
|
29
|
+
provision_stack.should include([described_class, [], nil])
|
30
|
+
end
|
31
|
+
|
32
|
+
it "is able to identify host's ip" do
|
33
|
+
channel.should_receive(:execute).with(get_ip_command).and_yield(:stdout, host_ip + "\n")
|
34
|
+
subject.host_ip(@env).should == host_ip
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'compiles command script passing host ip and server port' do
|
38
|
+
subject.stub(:host_ip => host_ip)
|
39
|
+
subject.call(@env)
|
40
|
+
File.read(compiled_command_path).should == "#{host_ip} #{host_port}"
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'uploads compiled command script over to guest machine' do
|
44
|
+
channel.should_receive(:upload).with(compiled_command_path.to_s, target_tmp_path)
|
45
|
+
subject.stub(:host_ip => host_ip)
|
46
|
+
subject.call(@env)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'installs command for all users' do
|
50
|
+
channel.should_receive(:sudo).with("mv #{target_tmp_path} #{target_path} && chmod +x #{target_path}")
|
51
|
+
subject.stub(:host_ip => host_ip)
|
52
|
+
subject.call(@env)
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'notifies user about script installation' do
|
56
|
+
@env[:ui].should_receive(:info).with('Compiling and installing notify-send script on guest machine')
|
57
|
+
subject.call(@env)
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
describe Vagrant::Notify::Middleware::StartServer do
|
2
|
+
let(:start_stack) { Vagrant.actions[:start].send(:stack) }
|
3
|
+
let(:server_pid) { 1234 }
|
4
|
+
let(:local_data) { Hash.new }
|
5
|
+
|
6
|
+
subject { described_class.new(@app, @env) }
|
7
|
+
|
8
|
+
before do
|
9
|
+
@app, @env = action_env(vagrant_env.vms.values.first.env)
|
10
|
+
@env[:vm].env.stub(:local_data => local_data)
|
11
|
+
local_data.stub(:commit)
|
12
|
+
Vagrant::Notify::Server.stub(:run => server_pid)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'gets called when starting machine' do
|
16
|
+
start_stack.should include([described_class, [], nil])
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'server is down' do
|
20
|
+
before { Process.stub(:getpgid).and_raise(Errno::ESRCH) }
|
21
|
+
|
22
|
+
it 'fires up notification server when called' do
|
23
|
+
Vagrant::Notify::Server.should_receive(:run)
|
24
|
+
subject.call(@env)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'notifies user about server start' do
|
28
|
+
@env[:ui].should_receive(:info).with("Notification server fired up (#{server_pid})")
|
29
|
+
subject.call(@env)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "persists server PID on local data" do
|
33
|
+
local_data.should_receive(:commit)
|
34
|
+
subject.call(@env)
|
35
|
+
local_data['vagrant-notify']['pid'].should == server_pid
|
36
|
+
end
|
37
|
+
|
38
|
+
context "and a PID is present on Vagrant's local data" do
|
39
|
+
let(:new_pid) { server_pid + 1 }
|
40
|
+
|
41
|
+
before do
|
42
|
+
Vagrant::Notify::Server.stub(:run => new_pid)
|
43
|
+
local_data['vagrant-notify'] = { 'pid' => server_pid }
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'updates server PID' do
|
47
|
+
subject.call(@env)
|
48
|
+
local_data['vagrant-notify']['pid'].should == new_pid
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'server is up' do
|
54
|
+
before do
|
55
|
+
Process.stub(:getpgid => true)
|
56
|
+
local_data['vagrant-notify'] = { 'pid' => server_pid }
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'does not start a new server instance' do
|
60
|
+
Vagrant::Notify::Server.should_not_receive(:run)
|
61
|
+
subject.call(@env)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'notifies user that server is already running' do
|
65
|
+
@env[:ui].should_receive(:info).with("Notification server is already running (#{server_pid})")
|
66
|
+
subject.call(@env)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
describe Vagrant::Notify::Middleware::StopServer do
|
2
|
+
let(:halt_stack) { Vagrant.actions[:halt].send(:stack) }
|
3
|
+
let(:server_pid) { '1234' }
|
4
|
+
let(:local_data) { { 'vagrant-notify' => { 'pid' => server_pid } } }
|
5
|
+
|
6
|
+
subject { described_class.new(@app, @env) }
|
7
|
+
|
8
|
+
before do
|
9
|
+
@app, @env = action_env(vagrant_env.vms.values.first.env)
|
10
|
+
@env[:vm].env.stub(:local_data => local_data)
|
11
|
+
local_data.stub(:commit)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'gets called when halting machine' do
|
15
|
+
halt_stack.should include([described_class, [], nil])
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'server is down' do
|
19
|
+
before { Process.stub(:getpgid).and_raise(Errno::ESRCH) }
|
20
|
+
|
21
|
+
it 'does not notify user about server stop' do
|
22
|
+
@env[:ui].should_not_receive(:info)
|
23
|
+
subject.call(@env)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'server is up' do
|
28
|
+
before do
|
29
|
+
Process.stub(:getpgid => true)
|
30
|
+
local_data['vagrant-notify'] = { 'pid' => server_pid }
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'notifies user that server is stopping' do
|
34
|
+
@env[:ui].should_receive(:info).with('Stopping notification server...')
|
35
|
+
subject.call(@env)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'kills notification server' do
|
39
|
+
Process.should_receive(:kill).with('KILL', server_pid.to_i)
|
40
|
+
subject.call(@env)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "removes server PID on local data" do
|
44
|
+
local_data.should_receive(:commit)
|
45
|
+
subject.call(@env)
|
46
|
+
local_data['vagrant-notify']['pid'].should be_nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/spec/server_spec.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
describe Vagrant::Notify::Server do
|
2
|
+
let(:arguments) { "-- '20 examples, 1 failure\n10 seconds'" }
|
3
|
+
let(:client) { StringIO.new(arguments) }
|
4
|
+
|
5
|
+
before do
|
6
|
+
subject.stub(:system => true)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'runs notify-send with received data from client' do
|
10
|
+
subject.should_receive(:system).with("notify-send #{arguments}")
|
11
|
+
subject.receive_data(client)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'closes connection after reading data' do
|
15
|
+
client.should_receive(:close)
|
16
|
+
subject.receive_data(client)
|
17
|
+
end
|
18
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'vagrant-notify'
|
2
|
+
|
3
|
+
RSpec.configure do |config|
|
4
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
5
|
+
config.run_all_when_everything_filtered = true
|
6
|
+
config.filter_run :focus
|
7
|
+
|
8
|
+
# Run specs in random order to surface order dependencies. If you find an
|
9
|
+
# order dependency and want to debug it, you can fix the order by providing
|
10
|
+
# the seed, which is printed after each run.
|
11
|
+
# --seed 1234
|
12
|
+
config.order = 'random'
|
13
|
+
|
14
|
+
config.include Vagrant::TestHelpers
|
15
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'vagrant-notify/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "vagrant-notify"
|
8
|
+
gem.version = Vagrant::Notify::VERSION
|
9
|
+
gem.authors = ["Fabio Rehm"]
|
10
|
+
gem.email = ["fgrehm@gmail.com"]
|
11
|
+
gem.description = 'A Vagrant plugin that redirects system notifications from guest to host machine.'
|
12
|
+
gem.summary = gem.description
|
13
|
+
gem.homepage = "https://github.com/fgrehm/vagrant-notify"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.add_dependency 'vagrant'
|
21
|
+
|
22
|
+
gem.add_development_dependency 'rake'
|
23
|
+
gem.add_development_dependency 'rspec'
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vagrant-notify
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Fabio Rehm
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-10-26 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: vagrant
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
description: A Vagrant plugin that redirects system notifications from guest to host
|
63
|
+
machine.
|
64
|
+
email:
|
65
|
+
- fgrehm@gmail.com
|
66
|
+
executables: []
|
67
|
+
extensions: []
|
68
|
+
extra_rdoc_files: []
|
69
|
+
files:
|
70
|
+
- .gitignore
|
71
|
+
- .rspec
|
72
|
+
- .travis.yml
|
73
|
+
- Gemfile
|
74
|
+
- Gemfile.lock
|
75
|
+
- Guardfile
|
76
|
+
- LICENSE.txt
|
77
|
+
- README.md
|
78
|
+
- Rakefile
|
79
|
+
- files/notify-send.erb
|
80
|
+
- lib/vagrant-notify.rb
|
81
|
+
- lib/vagrant-notify/middleware.rb
|
82
|
+
- lib/vagrant-notify/middleware/install_command.rb
|
83
|
+
- lib/vagrant-notify/middleware/start_server.rb
|
84
|
+
- lib/vagrant-notify/middleware/stop_server.rb
|
85
|
+
- lib/vagrant-notify/server.rb
|
86
|
+
- lib/vagrant-notify/version.rb
|
87
|
+
- lib/vagrant_init.rb
|
88
|
+
- spec/middleware/install_command_spec.rb
|
89
|
+
- spec/middleware/start_server_spec.rb
|
90
|
+
- spec/middleware/stop_server_spec.rb
|
91
|
+
- spec/server_spec.rb
|
92
|
+
- spec/spec_helper.rb
|
93
|
+
- vagrant-notify.gemspec
|
94
|
+
homepage: https://github.com/fgrehm/vagrant-notify
|
95
|
+
licenses: []
|
96
|
+
post_install_message:
|
97
|
+
rdoc_options: []
|
98
|
+
require_paths:
|
99
|
+
- lib
|
100
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
102
|
+
requirements:
|
103
|
+
- - ! '>='
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
segments:
|
107
|
+
- 0
|
108
|
+
hash: -675474948593784751
|
109
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
none: false
|
111
|
+
requirements:
|
112
|
+
- - ! '>='
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
segments:
|
116
|
+
- 0
|
117
|
+
hash: -675474948593784751
|
118
|
+
requirements: []
|
119
|
+
rubyforge_project:
|
120
|
+
rubygems_version: 1.8.23
|
121
|
+
signing_key:
|
122
|
+
specification_version: 3
|
123
|
+
summary: A Vagrant plugin that redirects system notifications from guest to host machine.
|
124
|
+
test_files:
|
125
|
+
- spec/middleware/install_command_spec.rb
|
126
|
+
- spec/middleware/start_server_spec.rb
|
127
|
+
- spec/middleware/stop_server_spec.rb
|
128
|
+
- spec/server_spec.rb
|
129
|
+
- spec/spec_helper.rb
|