vagrant-notify 0.4.0 → 0.5.0

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: ba4fc9493cec21bcfb25014ba736fb42b5fec41f
4
- data.tar.gz: a8d46b48d1b215007f65ad3fb5278d4a6810f244
3
+ metadata.gz: e3f06401113919234836bb523fe7c76febdde45b
4
+ data.tar.gz: f7cb2652a42a65b648adbfda7eb700e769a8d28b
5
5
  SHA512:
6
- metadata.gz: af4894a0012437cbd6a81c13a3ada7fa8a2e8dbfe270c0f44732c23b15a92248382fa61300c3bee07bf93edcd827b5d24a417d7cfef9f3ddd14eb56b84602dad
7
- data.tar.gz: 2f82cfb35c78298f9de96d417d23fad6060a0c292ec5005940e6b5e5c4173a7dc6545f91fc7729d45c672711df5f50057c36aeb067b69ffeb292ed8c320b110c
6
+ metadata.gz: 42f8ed1ad51e9de58df011dc50d5949d852fd852d19248f708558e119ee6f9a25ecd2895c0727671a3dbdb9913dd0650635febb1b8a65034cc3c359e73e4c92d
7
+ data.tar.gz: 809382012aaf777f192da1152bc360254d142f5b178540256b1f7e342781bfdd4dda55cf92cd32b36e8c767ed0a29ebcf5d893dec8d8feae311cacaffb0cbcc6
data/.gitignore CHANGED
@@ -16,3 +16,4 @@ test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
18
  /development/.vagrant
19
+ .DS_Store
data/.travis.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  language: ruby
2
2
  bundler_args: --without development
3
3
  rvm:
4
- - 1.9.3
5
4
  - 2.0.0
5
+ - 2.3.0
data/CHANGELOG.md CHANGED
@@ -1,4 +1,27 @@
1
- ## [0.4.0](https://github.com/fgrehm/vagrant-notify/compare/v0.3.0...master) (Feb 26, 2014)
1
+
2
+
3
+ ## [0.5.0](https://github.com/fgrehm/vagrant-notify/compare/v0.4.0...v0.5.0) (June 21, 2016)
4
+
5
+ IMPROVEMENTS
6
+
7
+ - Notification server runs as a daemon (fork() has been removed so it's compatible with Windows). [[GH-14]]
8
+ - Windows support (beta) [[GH-14]]
9
+ - Notification server is available from localhost.
10
+ - Notification server information is displayed each time vagrant is started and halted.
11
+ - New plugin command. Ability to view notification server status, and ability for manual restart. [CLI](https://gist.github.com/alpha01/9b81caca694a2735e658f978c41600b5)
12
+ - New notify-send example scripts for OS X and Windows
13
+
14
+ BUG FIXES
15
+
16
+ - `vagrant suspend/resume` stops/starts notification server respectively. [[GH-18]]
17
+ - Plugin causes VM boot to fail. [[GH-22]]
18
+
19
+ [GH-14]:https://github.com/fgrehm/vagrant-notify/issues/14
20
+ [GH-18]:https://github.com/fgrehm/vagrant-notify/issues/18
21
+ [GH-22]:https://github.com/fgrehm/vagrant-notify/pull/22
22
+
23
+
24
+ ## [0.4.0](https://github.com/fgrehm/vagrant-notify/compare/v0.3.0...v0.4.0) (Feb 26, 2014)
2
25
 
3
26
  IMPROVEMENTS
4
27
 
data/Gemfile CHANGED
@@ -7,6 +7,7 @@ group :development do
7
7
  gem 'rb-inotify'
8
8
  gem 'guard'
9
9
  gem 'guard-rspec'
10
+ gem 'ocra'
10
11
  end
11
12
 
12
13
  group :development, :test do
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  GIT
2
2
  remote: git://github.com/fgrehm/vagrant-lxc.git
3
- revision: c19bc91e708f7a69b62e35f465b5246bf5706cc3
3
+ revision: 4a84d95ff26bf2d887b127765a9ae404899734f9
4
4
  specs:
5
- vagrant-lxc (0.7.1.dev)
5
+ vagrant-lxc (0.8.1.dev)
6
6
 
7
7
  GIT
8
8
  remote: git://github.com/mitchellh/vagrant.git
@@ -19,7 +19,7 @@ GIT
19
19
  PATH
20
20
  remote: .
21
21
  specs:
22
- vagrant-notify (0.4.0)
22
+ vagrant-notify (0.5.0)
23
23
 
24
24
  GEM
25
25
  remote: https://rubygems.org/
@@ -51,6 +51,7 @@ GEM
51
51
  net-scp (1.1.2)
52
52
  net-ssh (>= 2.6.5)
53
53
  net-ssh (2.7.0)
54
+ ocra (1.3.6)
54
55
  pry (0.9.12.2)
55
56
  coderay (~> 1.0.5)
56
57
  method_source (~> 0.8)
@@ -80,6 +81,7 @@ PLATFORMS
80
81
  DEPENDENCIES
81
82
  guard
82
83
  guard-rspec
84
+ ocra
83
85
  rake
84
86
  rb-inotify
85
87
  rspec (~> 2.13.0)
@@ -87,3 +89,6 @@ DEPENDENCIES
87
89
  vagrant!
88
90
  vagrant-lxc!
89
91
  vagrant-notify!
92
+
93
+ BUNDLED WITH
94
+ 1.10.6
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-2014 Fabio Rehm
1
+ Copyright (c) 2012-2016 Fabio Rehm
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  [![Build Status](https://travis-ci.org/fgrehm/vagrant-notify.png)](https://travis-ci.org/fgrehm/vagrant-notify)
4
4
  [![Gem Version](https://badge.fury.io/rb/vagrant-notify.png)](http://badge.fury.io/rb/vagrant-notify)
5
- [![Gittip](http://img.shields.io/gittip/fgrehm.svg)](https://www.gittip.com/fgrehm/)
6
5
 
7
6
  A Vagrant plugin that forwards `notify-send` from guest to host machine and
8
7
  notifies provisioning status. [See it in action](#demo)
@@ -30,8 +29,8 @@ command.
30
29
  ### Provisioning notification
31
30
 
32
31
  Apart from redirecting `notify-send` from the guest VM to the host, whenever
33
- a Vagrant provisioner completes running you'll also receive a notification
34
- like:
32
+ a Vagrant 1.4+ provisioner starts or completes running you'll also receive
33
+ notifications like:
35
34
 
36
35
  ![provisioning](http://i.imgur.com/DgKjDgr.png)
37
36
 
@@ -56,14 +55,26 @@ A (too) primitive script integrating with Growl:
56
55
  growlnotify -t "Vagrant VM" -m "$*"
57
56
  ```
58
57
 
58
+ See example [scripts](https://github.com/fgrehm/vagrant-notify/tree/master/examples).
59
+
60
+ ### Windows (beta)
61
+
62
+ You can use the freeware application [notify-send for Windows](http://vaskovsky.net/notify-send/), make sure the notify-send binary is available on `Path`.
63
+
64
+ See example [scripts](https://github.com/fgrehm/vagrant-notify/tree/master/examples).
65
+
66
+
59
67
  ## Demo
60
68
 
61
69
  ![Demo](http://i.imgur.com/tzOLvGY.gif)
70
+ ![Demo OS X](http://i.imgur.com/216NIlf.gif)
71
+ ![Demo Windows](http://i.imgur.com/cJYqX4y.gif)
62
72
 
63
73
 
64
74
  ## Known issues
65
75
 
66
- * `vagrant suspend` does not stop the notification server
76
+ * `vagrant destroy` on a running VM will not stop the notification server.
77
+ * On rare occasions the notification server may stop receiving notifications if the host is suspended/hibernates. The notification server may need to be manually restarted if that's the case. `vagrant notify --restart`
67
78
 
68
79
 
69
80
  ## Contributing
@@ -0,0 +1,16 @@
1
+ # Example notify-send wrapper scripts
2
+
3
+ ## OS X
4
+
5
+ * [terminal-notifier](https://github.com/alloy/terminal-notifier) [wrapper script](https://github.com/fgrehm/vagrant-notify/blob/master/examples/osx/notify-send_terminal-notifier)
6
+
7
+
8
+ ## Windows
9
+
10
+ * [Growl for Windows](http://www.growlforwindows.com/gfw/default.aspx) [wrapper script](https://github.com/fgrehm/vagrant-notify/blob/master/examples/windows/notify-send_growl_for_windows)
11
+
12
+ **IMPORTANT:** `notify-send` wrapper script has to be binary executable. Also as with `notify-send`, `growlnotify.exe` needs to be is in your `path`.
13
+
14
+ Compiling using ocra:
15
+
16
+ ocra --output notify-send windows/notify-send_growl_for_windows
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- mode: ruby -*-
3
+ # vi: set ft=ruby :
4
+
5
+ # Example OS X terminal-notifier notify-send wrapper script.
6
+
7
+ require 'optparse'
8
+
9
+
10
+ options = {}
11
+ OptionParser.new do |opts|
12
+ opts.on('-u', '--urgency LEVEL') { |v| options[:u] = v } # Option gets removed
13
+ opts.on('-t', '--expire-time TIME') { |v| options[:t] = v } # Option gets removed
14
+ opts.on('-a', '--app-name APP_NAME') { |v| options[:a] = v } # TO DO: Set to -title
15
+ opts.on('-i', '--icon ICON[,ICON...]') { |v| options[:i] = v } # Option gets removed
16
+ opts.on('-c', '--category TYPE[,TYPE...]') { |v| options[:c] = v } # Option gets removed
17
+ opts.on('-h', '--hint TYPE:NAME:VALUE') { |v| options[:h] = v } # Option gets removed
18
+ opts.on('-v', '--version') { |v| options[:v] = v } # Option gets removed
19
+ end.parse!
20
+
21
+
22
+ if ARGV.length == 0
23
+ puts "No summary specified"
24
+ exit 1
25
+ elsif ARGV.length == 1
26
+ message = "-message '\\#{ARGV[0]}'"
27
+ elsif ARGV.length == 2
28
+ message = "-title '\\#{ARGV[0]}' -message '\\#{ARGV[1]}'"
29
+ else
30
+ message = ARGV.map{|a| a =~ /-(title|message)/ ? a : "'\\#{a}'"}.join(' ')
31
+ end
32
+
33
+ system("terminal-notifier -sound default #{message}")
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- mode: ruby -*-
3
+ # vi: set ft=ruby :
4
+
5
+ # Example MS-Windows notify-send wrapper script. Assumes growlnotify.exe is in your 'path'.
6
+
7
+ require 'optparse'
8
+
9
+ options = {}
10
+ OptionParser.new do |opts|
11
+ opts.banner = "Usage: notify-send [options]"
12
+
13
+ opts.on('-u', '--urgency LEVEL') { |v| options[:u] = v } # TO DO: Set to /p:priority
14
+ opts.on('-t', '--expire-time TIME') { |v| options[:t] = v } # Option gets removed
15
+ opts.on('-a', '--app-name APP_NAME') { |v| options[:a] = v } # TO DO: Set to /a:application
16
+ opts.on('-i', '--icon ICON[,ICON...]') { |v| options[:i] = v } # TO DO: Set to /i:icon (url only)
17
+ opts.on('-c', '--category TYPE[,TYPE...]') { |v| options[:c] = v } # Option gets removed
18
+ opts.on('-h', '--hint TYPE:NAME:VALUE') { |v| options[:h] = v } # Option gets removed
19
+ opts.on('-v', '--version') { |v| options[:v] = v } # Option gets removed
20
+ end.parse!
21
+
22
+
23
+
24
+ if ARGV.length == 0
25
+ puts "No summary specified"
26
+ elsif ARGV.length == 1
27
+ message = "'#{ARGV[0]}'"
28
+ system("growlnotify.exe \"#{message}\"")
29
+ elsif ARGV.length == 2
30
+ title = "/t:'#{ARGV[0]}'"
31
+ message = "'#{ARGV[1]}'"
32
+ system("growlnotify.exe \"#{title}\" \"#{message}\"")
33
+ else
34
+ message = ARGV.map{|a| "'#{a}'"}.join(' ')
35
+ system("growlnotify.exe \"#{message}\"")
36
+ end
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env ruby
1
+ #!/usr/bin/ruby
2
2
  # -*- mode: ruby -*-
3
3
  # vi: set ft=ruby :
4
4
 
@@ -12,7 +12,7 @@ require 'fileutils'
12
12
 
13
13
  options = {}
14
14
  OptionParser.new do |opts|
15
- opts.banner = "Usage: example.rb [options]"
15
+ opts.banner = "Usage: notify-send.rb [options]"
16
16
 
17
17
  opts.on('-u', '--urgency LEVEL') { |v| options[:u] = v }
18
18
  opts.on('-t', '--expire-time TIME') { |v| options[:t] = v }
@@ -36,11 +36,10 @@ end.join(' ')
36
36
 
37
37
  # TODO: Need to escape values
38
38
  unless ARGV.empty?
39
- cmd << ' -- '
40
- cmd << ARGV.map{|a| "'#{a}'"}.join(' ')
39
+ cmd << ARGV.map{|a| " '#{a}'"}.join(' ')
41
40
  end
42
41
 
43
- client_ip = ENV['SSH_CLIENT'].split(' ')[0]
44
- TCPSocket.open ENV['SSH_CLIENT'], <%= host_port %> do |s|
42
+ client_ip = `ip route|grep default|awk '{print $3}'`
43
+ TCPSocket.open client_ip, <%= host_port %> do |s|
45
44
  s.send cmd, 0
46
45
  end
@@ -7,7 +7,7 @@ module Vagrant
7
7
  end
8
8
 
9
9
  def call(env)
10
- path = compile_command(env)
10
+ path = compile_command(env, 'notify-send.erb')
11
11
  install_command_on_guest(env, path)
12
12
 
13
13
  @app.call env
@@ -15,10 +15,10 @@ module Vagrant
15
15
 
16
16
  private
17
17
 
18
- def compile_command(env)
18
+ def compile_command(env, template_file)
19
19
  host_port = env[:notify_data][:port]
20
20
  template_binding = OpenStruct.new(:host_port => host_port, :shared_folder => '/tmp/vagrant-notify')
21
- command_template = ERB.new(Vagrant::Notify.files_path.join('notify-send.erb').read)
21
+ command_template = ERB.new(Vagrant::Notify.files_path.join(template_file).read)
22
22
  command = command_template.result(template_binding.instance_eval { binding })
23
23
 
24
24
  env[:tmp_path].join('vagrant-notify-send').open('w') { |f| f.write(command) }
@@ -29,6 +29,9 @@ module Vagrant
29
29
  env[:machine].communicate.upload(source.to_s, '/tmp/notify-send')
30
30
  env[:machine].communicate.sudo('mv /usr/bin/{notify-send,notify-send.bkp}; exit 0')
31
31
  env[:machine].communicate.sudo('mv /tmp/notify-send /usr/bin/notify-send && chmod +x /usr/bin/notify-send')
32
+ if RUBY_PLATFORM =~ /mswin|msys|mingw|cygwin|bccwin|wince|emc/
33
+ env[:machine].communicate.sudo("sed 's/\r\$//' -i /usr/bin/notify-send") # dos2unix
34
+ end
32
35
  end
33
36
  end
34
37
  end
@@ -1,3 +1,5 @@
1
+ require_relative 'windows/process_info'
2
+
1
3
  module Vagrant
2
4
  module Notify
3
5
  module Action
@@ -18,9 +20,13 @@ module Vagrant
18
20
  private
19
21
 
20
22
  def valid_process?(pid)
21
- Process.getpgid(pid.to_i) if pid
22
- rescue Errno::ESRCH
23
- false
23
+ if RUBY_PLATFORM =~ /mswin|msys|mingw|cygwin|bccwin|wince|emc/
24
+ Vagrant::Notify::Action::Windows::ProcessInfo.queryProcess(pid) if pid
25
+ else
26
+ Process.getpgid(pid.to_i) if pid
27
+ end
28
+ rescue Errno::ESRCH
29
+ false
24
30
  end
25
31
  end
26
32
  end
@@ -1,6 +1,5 @@
1
1
  require "vagrant/util/is_port_open"
2
2
 
3
- require_relative '../server'
4
3
 
5
4
  module Vagrant
6
5
  module Notify
@@ -16,8 +15,18 @@ module Vagrant
16
15
  @env = env
17
16
 
18
17
  port = next_available_port
19
- env[:notify_data][:pid] = Server.run(env, port)
20
- env[:notify_data][:port] = port
18
+ id = env[:machine].id
19
+ dir = File.expand_path('../../', __FILE__)
20
+
21
+ if which('ruby')
22
+ env[:notify_data][:pid] = Process.spawn("ruby #{dir}/server.rb #{id} #{port}")
23
+ env[:notify_data][:port] = port
24
+
25
+ env[:machine].ui.success("Started vagrant-notify-server pid: #{env[:notify_data][:pid]}")
26
+ sleep 5
27
+ else
28
+ env[:machine].ui.error("Unable to spawn TCPServer daemon, ruby not found in $PATH")
29
+ end
21
30
 
22
31
  @app.call env
23
32
  end
@@ -56,6 +65,20 @@ module Vagrant
56
65
  yield options
57
66
  end
58
67
  end
68
+
69
+ # http://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby
70
+ # Cross-platform way of finding an executable in the $PATH.
71
+ # which('ruby') #=> /usr/bin/ruby
72
+ def which(cmd)
73
+ exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
74
+ ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
75
+ exts.each { |ext|
76
+ exe = File.join(path, "#{cmd}#{ext}")
77
+ return exe if File.executable?(exe) && !File.directory?(exe)
78
+ }
79
+ end
80
+ return nil
81
+ end
59
82
  end
60
83
  end
61
84
  end
@@ -16,7 +16,14 @@ module Vagrant
16
16
 
17
17
  pid = env[:notify_data][:pid]
18
18
 
19
- Process.kill('KILL', pid.to_i) rescue nil
19
+ begin
20
+ Process.kill('KILL', pid.to_i)
21
+ env[:machine].ui.success("Stopped vagrant-notify-server pid: #{pid}")
22
+ rescue Errno::ESRCH
23
+ nil
24
+ rescue
25
+ env[:machine].ui.error("Failed to stop vagrant-notify-server pid: #{pid}")
26
+ end
20
27
 
21
28
  env[:notify_data][:pid] = nil
22
29
  env[:notify_data][:port] = nil
@@ -0,0 +1,23 @@
1
+
2
+ module Vagrant
3
+ module Notify
4
+ module Action
5
+ module Windows
6
+ class ProcessInfo
7
+ def self.queryProcess(pid)
8
+ return false unless pid =~ /\A\d+\z/
9
+ result = `c\:/Windows/System32/wbem/WMIC.exe process where \"ProcessID = '#{pid}'\" get ProcessID,Commandline /format:list 2>nul`
10
+ querypid = false
11
+ result.split(/\r?\n/).each do |line|
12
+ next if line =~ /^\s*$/
13
+ if line =~ /ProcessId=(\d+)/i
14
+ querypid = $1.to_i
15
+ end
16
+ end
17
+ return querypid
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -52,6 +52,23 @@ module Vagrant
52
52
  end
53
53
  end
54
54
  end
55
+
56
+ def action_status_server
57
+ Vagrant::Action::Builder.new.tap do |b|
58
+ b.use Call, CheckProvider do |env, b2|
59
+ next if !env[:result]
60
+
61
+ b2.use PrepareData
62
+ b2.use Call, ServerIsRunning do |env2, b3|
63
+ if env2[:result]
64
+ env[:machine].ui.success("vagrant-notify-server pid: #{env2[:notify_data][:pid]}")
65
+ else
66
+ env[:machine].ui.error("No vagrant-notify server detected.")
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
55
72
  end
56
73
  end
57
74
  end
@@ -0,0 +1,66 @@
1
+
2
+ require_relative 'action'
3
+
4
+ module Vagrant
5
+ module Notify
6
+ class Command < Vagrant.plugin('2', :command)
7
+
8
+ def self.synopsis
9
+ "plugin: vagrant-notify: forwards notify-send from guest to host machine and notifies provisioning status"
10
+ end
11
+
12
+ def execute
13
+ options = {}
14
+ opts = OptionParser.new do |o|
15
+ o.banner = 'Usage: vagrant notify'
16
+ o.separator ''
17
+ o.version = Vagrant::Notify::VERSION
18
+ o.program_name = 'vagrant notify'
19
+
20
+ o.on('-h', '--help', 'Display this screen.' ) { options[:help] = true }
21
+ o.on('--status', 'Show vagrant-notify-server daemon status. (default)') { options[:status] = true }
22
+ o.on('--start', 'Manually start vagrant-notify-server daemon.') { options[:start] = true }
23
+ o.on('--stop', 'Manually stop vagrant-notify-server daemon.') { options[:stop] = true }
24
+ o.on('--restart', 'Manually restart vagrant-notify-server daemon.') { options[:restart] = true }
25
+ end
26
+
27
+ argv = parse_options(opts)
28
+
29
+ with_target_vms(argv, options) do |machine|
30
+ if options[:help]
31
+ @env.ui.info(opts)
32
+ return 0
33
+ end
34
+ if options[:status] || options.length == 0
35
+ @env.action_runner.run(Vagrant::Notify::Action.action_status_server, {
36
+ :machine => machine,
37
+ })
38
+ return 0
39
+ end
40
+ if options[:stop]
41
+ @env.action_runner.run(Vagrant::Notify::Action.action_stop_server, {
42
+ :machine => machine,
43
+ })
44
+ return 0
45
+ end
46
+ if options[:start]
47
+ @env.action_runner.run(Vagrant::Notify::Action.action_start_server, {
48
+ :machine => machine,
49
+ })
50
+ return 0
51
+ end
52
+ if options[:restart]
53
+ @env.action_runner.run(Vagrant::Notify::Action.action_stop_server, {
54
+ :machine => machine,
55
+ })
56
+ @env.action_runner.run(Vagrant::Notify::Action.action_start_server, {
57
+ :machine => machine,
58
+ })
59
+ return 0
60
+ end
61
+ end
62
+ end
63
+
64
+ end
65
+ end
66
+ end
@@ -13,7 +13,7 @@ module Vagrant
13
13
  # possible provider action class that Vagrant might have
14
14
  start_server_hook = lambda do |hook|
15
15
  require_relative './action'
16
- hook.after VagrantPlugins::ProviderVirtualBox::Action::Boot, Vagrant::Notify::Action.action_start_server
16
+ hook.after VagrantPlugins::ProviderVirtualBox::Action::WaitForCommunicator, Vagrant::Notify::Action.action_start_server
17
17
 
18
18
  if defined?(Vagrant::LXC)
19
19
  require 'vagrant-lxc/action'
@@ -23,6 +23,7 @@ module Vagrant
23
23
 
24
24
  action_hook 'start-server-after-boot-on-machine-up', :machine_action_up, &start_server_hook
25
25
  action_hook 'start-server-after-boot-on-machine-reload', :machine_action_reload, &start_server_hook
26
+ action_hook 'start-server-after-resume-on-machine', :machine_action_resume, &start_server_hook
26
27
 
27
28
  share_folder_hook = lambda do |hook|
28
29
  require_relative './action'
@@ -36,6 +37,7 @@ module Vagrant
36
37
  hook.before Vagrant::Action::Builtin::GracefulHalt, Vagrant::Notify::Action.action_stop_server
37
38
  end
38
39
 
40
+
39
41
  # TODO: This should be generic, we don't want to hard code every single
40
42
  # possible provider action class that Vagrant might have
41
43
  action_hook 'stop-server-before-destroy', :machine_action_destroy do |hook|
@@ -47,6 +49,16 @@ module Vagrant
47
49
  hook.before Vagrant::LXC::Action::Destroy, Vagrant::Notify::Action.action_stop_server
48
50
  end
49
51
  end
52
+
53
+ action_hook 'stop-server-after-suspend', :machine_action_suspend do |hook|
54
+ require_relative './action'
55
+ hook.before VagrantPlugins::ProviderVirtualBox::Action::Suspend, Vagrant::Notify::Action.action_stop_server
56
+ end
57
+
58
+ command(:notify) do
59
+ require_relative 'command'
60
+ Vagrant::Notify::Command
61
+ end
50
62
  end
51
63
  end
52
64
  end
@@ -1,21 +1,31 @@
1
+ require 'socket'
2
+
1
3
  module Vagrant
2
4
  module Notify
3
5
  class Server
4
6
  HTTP_RESPONSE = "Hi! You just reached the vagrant notification server"
5
7
 
6
- def self.run(env, port)
7
- id = env[:machine].id
8
- machine_name = env[:machine].name
9
- provider = env[:machine].provider_name
10
- fork do
11
- $0 = "vagrant-notify-server (#{port})"
12
- tcp_server = TCPServer.open(port)
8
+ def self.run(id, port, machine_name='default', provider='virtualbox')
9
+ #id = env[:machine].id
10
+ #machine_name = env[:machine].name
11
+ #provider = env[:machine].provider_name
12
+
13
+ if __FILE__ == $0
14
+ tcp_server = TCPServer.open("127.0.0.1", port)
13
15
  server = self.new(id, machine_name, provider)
14
- loop {
15
- Thread.start(tcp_server.accept) { |client|
16
- server.receive_data(client)
17
- }
18
- }
16
+
17
+ # Have to wrap this in a begin/rescue block so we can be certain the server is running at all times.
18
+ begin
19
+ loop {
20
+ Thread.start(tcp_server.accept) { |client|
21
+ Thread.handle_interrupt(Interrupt => :never) {
22
+ server.receive_data(client)
23
+ }
24
+ }
25
+ }
26
+ rescue Interrupt
27
+ retry
28
+ end
19
29
  end
20
30
  end
21
31
 
@@ -68,3 +78,10 @@ module Vagrant
68
78
  end
69
79
  end
70
80
  end
81
+
82
+
83
+ # Ghetto
84
+ id = ARGV[0]
85
+ port = ARGV[1]
86
+
87
+ Vagrant::Notify::Server.run(id,port)
@@ -1,5 +1,5 @@
1
1
  module Vagrant
2
2
  module Notify
3
- VERSION = "0.4.0"
3
+ VERSION = "0.5.0"
4
4
  end
5
5
  end
@@ -8,7 +8,6 @@ if File.exists?(File.join(File.expand_path('../../', __FILE__), '.git'))
8
8
  end
9
9
 
10
10
  require 'vagrant-notify/plugin'
11
- require 'vagrant-notify/server'
12
11
  require "vagrant-notify/version"
13
12
 
14
13
  module Vagrant
@@ -2,11 +2,16 @@ require 'spec_helper'
2
2
 
3
3
  require 'vagrant-notify/action/start_server'
4
4
 
5
+ require 'vagrant-notify/server'
6
+
5
7
  describe Vagrant::Notify::Action::StartServer do
6
- let(:app) { lambda { |env| } }
7
- let(:env) { {notify_data: {}} }
8
- let(:pid) { '42' }
9
- let(:port) { '1234' }
8
+ let(:app) { lambda { |env| } }
9
+ let(:ui) { mock(success: true)}
10
+ let(:id) { '425e799c-1293-4939-bo39-263lcc7457e8' }
11
+ let(:machine) { mock(state: stub(id: :stopped), ui: ui, id: id) }
12
+ let(:env) { {notify_data: {}, machine: machine} }
13
+ let(:pid) { '42' }
14
+ let(:port) { '1234' }
10
15
 
11
16
  subject { described_class.new(app, env) }
12
17
 
@@ -16,17 +21,18 @@ describe Vagrant::Notify::Action::StartServer do
16
21
  subject.call(env)
17
22
  end
18
23
 
19
- it 'starts the server' do
20
- Vagrant::Notify::Server.should have_received(:run).with(env, port)
21
- end
22
-
23
- it 'persists pid number' do
24
- env[:notify_data][:pid].should == pid
24
+ after do
25
+ Process.kill('KILL', env[:notify_data][:pid].to_i)
25
26
  end
26
27
 
27
- it 'persists used port' do
28
+ it 'starts the server and persists used port' do
28
29
  env[:notify_data][:port].should == port
29
30
  end
30
31
 
32
+ # need proper test of this
33
+ # it "removes server PID from notify data" do
34
+ # env[:notify_data][:pid].should be_nil
35
+ # end
36
+
31
37
  pending 'identifies the next available port'
32
- end
38
+ end
@@ -5,7 +5,8 @@ require 'vagrant-notify/action/stop_server'
5
5
  describe Vagrant::Notify::Action::StopServer do
6
6
  let(:app) { lambda { |env| } }
7
7
  let(:communicator) { mock(sudo: true) }
8
- let(:machine) { mock(communicate: communicator, state: stub(id: :running)) }
8
+ let(:ui) { mock(success: true)}
9
+ let(:machine) { mock(communicate: communicator, state: stub(id: :running), ui: ui) }
9
10
  let(:env) { {notify_data: {pid: pid, port: 1234}, machine: machine} }
10
11
  let(:pid) { '42' }
11
12
  let(:port) { described_class::PORT }
@@ -6,8 +6,8 @@ require 'vagrant-notify/version'
6
6
  Gem::Specification.new do |gem|
7
7
  gem.name = "vagrant-notify"
8
8
  gem.version = Vagrant::Notify::VERSION
9
- gem.authors = ["Fabio Rehm"]
10
- gem.email = ["fgrehm@gmail.com"]
9
+ gem.authors = ["Fabio Rehm", "Tony Baltazar"]
10
+ gem.email = ["fgrehm@gmail.com", "root@rubyninja.org"]
11
11
  gem.description = 'A Vagrant plugin that forwards `notify-send` from guest to host machine and notifies provisioning status'
12
12
  gem.summary = gem.description
13
13
  gem.homepage = "https://github.com/fgrehm/vagrant-notify"
metadata CHANGED
@@ -1,19 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-notify
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fabio Rehm
8
+ - Tony Baltazar
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2014-02-27 00:00:00.000000000 Z
12
+ date: 2016-06-22 00:00:00.000000000 Z
12
13
  dependencies: []
13
14
  description: A Vagrant plugin that forwards `notify-send` from guest to host machine
14
15
  and notifies provisioning status
15
16
  email:
16
17
  - fgrehm@gmail.com
18
+ - root@rubyninja.org
17
19
  executables: []
18
20
  extensions: []
19
21
  extra_rdoc_files: []
@@ -29,6 +31,9 @@ files:
29
31
  - README.md
30
32
  - Rakefile
31
33
  - development/Vagrantfile
34
+ - examples/README.md
35
+ - examples/osx/notify-send_terminal-notifier
36
+ - examples/windows/notify-send_growl_for_windows
32
37
  - files/notify-send.erb
33
38
  - lib/vagrant-notify.rb
34
39
  - lib/vagrant-notify/action.rb
@@ -40,6 +45,8 @@ files:
40
45
  - lib/vagrant-notify/action/set_shared_folder.rb
41
46
  - lib/vagrant-notify/action/start_server.rb
42
47
  - lib/vagrant-notify/action/stop_server.rb
48
+ - lib/vagrant-notify/action/windows/process_info.rb
49
+ - lib/vagrant-notify/command.rb
43
50
  - lib/vagrant-notify/data.rb
44
51
  - lib/vagrant-notify/plugin.rb
45
52
  - lib/vagrant-notify/server.rb
@@ -72,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
79
  version: '0'
73
80
  requirements: []
74
81
  rubyforge_project:
75
- rubygems_version: 2.2.2
82
+ rubygems_version: 2.5.1
76
83
  signing_key:
77
84
  specification_version: 4
78
85
  summary: A Vagrant plugin that forwards `notify-send` from guest to host machine and