vagrant-notify 0.5.3 → 0.6.1
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 +5 -5
- data/.gitignore +1 -0
- data/.travis.yml +3 -2
- data/CHANGELOG.md +44 -0
- data/Gemfile +1 -1
- data/LICENSE.txt +1 -1
- data/README.md +28 -4
- data/examples/README.md +8 -3
- data/examples/osx/applescript/notify-send.rb +34 -0
- data/files/notify-send.erb +19 -25
- data/lib/vagrant-notify/action/install_command.rb +18 -4
- data/lib/vagrant-notify/action/notify_provisioning_status.rb +14 -3
- data/lib/vagrant-notify/action/set_shared_folder.rb +1 -1
- data/lib/vagrant-notify/action/start_server.rb +7 -2
- data/lib/vagrant-notify/action/stop_server.rb +4 -2
- data/lib/vagrant-notify/config.rb +26 -4
- data/lib/vagrant-notify/plugin.rb +10 -3
- data/lib/vagrant-notify/server.rb +70 -10
- data/lib/vagrant-notify/version.rb +1 -1
- data/spec/action/install_command_spec.rb +12 -6
- data/spec/action/prepare_data_spec.rb +1 -1
- data/spec/action/server_is_running_spec.rb +3 -3
- data/spec/action/start_server_spec.rb +6 -5
- data/spec/action/stop_server_spec.rb +5 -5
- data/spec/server_spec.rb +11 -7
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c1465c9895322fd9c935e8217b9232edd8c7bf8b1d2acce838ea4fdc503f4573
|
4
|
+
data.tar.gz: fdac2a4778a4eb69411321c146d5b99e2c4c3c7a79a14e6e53752ab82dd2c332
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 340cc11227f68d407b83c8b1d5741e0c9fe3d07c11acc055788af4dc00a665f48c267cd9dace64251486e82cd1ceea4510b991d3df89980e24d1f2bd65b06e5c
|
7
|
+
data.tar.gz: a90102d0f68f30b4fc5c5661da637a1da117f49aefe474edbe1e8a4e81246b6d182deb059ebca111f39586ce4b98da4fa2c249025863ddde5694fe1e07d90a5a
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,47 @@
|
|
1
|
+
## [0.6.1](https://github.com/fgrehm/vagrant-notify/compare/v0.6.0...v0.6.1) (December 23, 2020)
|
2
|
+
IMPROVEMENTS
|
3
|
+
|
4
|
+
- Improving notification server startup.
|
5
|
+
|
6
|
+
BUG FIXES
|
7
|
+
|
8
|
+
- avoid error `newline at the end of hostname (SocketError)` [[GH-44]](https://github.com/fgrehm/vagrant-notify/pull/44)
|
9
|
+
|
10
|
+
## [0.6.0](https://github.com/fgrehm/vagrant-notify/compare/v0.5.6...v0.6.0) (September 5, 2020)
|
11
|
+
IMPROVEMENTS
|
12
|
+
|
13
|
+
- Support for custom notifcation application without the need of a notify-send wrapper script.
|
14
|
+
- Ensure plugin plays nice with read-only boxes.
|
15
|
+
- Updating gem dependencies versions and newer version of Ruby for Travis CI testing.
|
16
|
+
|
17
|
+
BUG FIXES
|
18
|
+
|
19
|
+
- Fixnum deprecation warning. [[GH-40]](https://github.com/fgrehm/vagrant-notify/issues/40)
|
20
|
+
|
21
|
+
## [0.5.6](https://github.com/fgrehm/vagrant-notify/compare/v0.5.5...v0.5.6) (September 29, 2017)
|
22
|
+
IMPROVEMENTS
|
23
|
+
|
24
|
+
- AppleScript wrapper script.
|
25
|
+
|
26
|
+
BUG FIXES
|
27
|
+
|
28
|
+
- `vagrant resume` bug fix. [[GH-39]](https://github.com/fgrehm/vagrant-notify/issues/39)
|
29
|
+
|
30
|
+
## [0.5.5](https://github.com/fgrehm/vagrant-notify/compare/v0.5.4...v0.5.5) (May 13, 2017)
|
31
|
+
IMPROVEMENTS
|
32
|
+
|
33
|
+
- Support for Hyper-V and VMWare Workstation providers. [[GH-32]](https://github.com/fgrehm/vagrant-notify/issues/32) [[GH-33]](https://github.com/fgrehm/vagrant-notify/issues/33)
|
34
|
+
- Disable plugin for google, vultr, vcloudair, skytap, and scaleway cloud providers.
|
35
|
+
|
36
|
+
BUG FIXES
|
37
|
+
- Notifcation server suspend fix on VMWare Fusion.
|
38
|
+
|
39
|
+
## [0.5.4](https://github.com/fgrehm/vagrant-notify/compare/v0.5.3...v0.5.4) (May 4, 2017)
|
40
|
+
IMPROVEMENTS
|
41
|
+
|
42
|
+
- Display warning if Ruby is not installed on guest. [[GH-35]](https://github.com/fgrehm/vagrant-notify/issues/35)
|
43
|
+
- Shell name included in provision notify message. [[GH-21]](https://github.com/fgrehm/vagrant-notify/issues/21)
|
44
|
+
|
1
45
|
## [0.5.3](https://github.com/fgrehm/vagrant-notify/compare/v0.5.2...v0.5.3) (November 18, 2016)
|
2
46
|
IMPROVEMENTS
|
3
47
|
|
data/Gemfile
CHANGED
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -21,7 +21,7 @@ $ vagrant plugin install vagrant-notify
|
|
21
21
|
### `notify-send` from guest VMs
|
22
22
|
|
23
23
|
Whenever you run `vagrant up`, a Ruby [TCPServer](http://www.ruby-doc.org/stdlib-1.9.3/libdoc/socket/rdoc/TCPServer.html)
|
24
|
-
will fire up on a port within the [usable port range](https://
|
24
|
+
will fire up on a port within the [usable port range](https://www.vagrantup.com/docs/vagrantfile/machine_settings.html)
|
25
25
|
and a Ruby [script](https://github.com/fgrehm/vagrant-notify/blob/master/files/notify-send.erb)
|
26
26
|
will be copied over to the guest machine to replace the original `notify-send`
|
27
27
|
command.
|
@@ -44,7 +44,7 @@ Since Linux distributions have `notify-send` pre-installed, everything should wo
|
|
44
44
|
|
45
45
|
Check out our OS X notify-send compatible [scripts](https://github.com/fgrehm/vagrant-notify/tree/master/examples#os-x).
|
46
46
|
|
47
|
-
### Windows
|
47
|
+
### Windows
|
48
48
|
|
49
49
|
Check out our Windows notify-send compatible [scripts](https://github.com/fgrehm/vagrant-notify/tree/master/examples#windows).
|
50
50
|
|
@@ -60,9 +60,9 @@ end
|
|
60
60
|
```
|
61
61
|
|
62
62
|
_Please note that as of v0.5.1, the notification server will automatically be disabled for any of the following
|
63
|
-
[cloud providers](lib/vagrant-notify/plugin.rb#
|
63
|
+
[cloud providers](lib/vagrant-notify/plugin.rb#L81-L84)._
|
64
64
|
|
65
|
-
By default, the notification server is binded to [local interfaces](lib/vagrant-notify/plugin.rb#
|
65
|
+
By default, the notification server is binded to [local interfaces](lib/vagrant-notify/plugin.rb#L86-L93). For networking different than your provider's default network configuration, you can use the ***notify.bind\_ip*** configuration option to bind the notification server onto a different local ip address.
|
66
66
|
|
67
67
|
```ruby
|
68
68
|
Vagrant.configure(2) do |config|
|
@@ -71,6 +71,28 @@ Vagrant.configure(2) do |config|
|
|
71
71
|
end
|
72
72
|
```
|
73
73
|
|
74
|
+
By default the local notification server uses the ***notify_send*** command in your host PATH for displaying notifications, there is a possibility to use different app without wrapper scripts:
|
75
|
+
* ***notify.sender\_app*** configuration option is used for specifing application name (default: `notify-send`)
|
76
|
+
* ***notify.sender\_params\_str*** defines how params for applications will be passed (default: `[--app-name {app_name}] [--urgency {urgency}] [--expire-time {expire_time}] [--icon {icon}] [--category {category}] [--hint {hint}] {message}`). You can use these variables (escaped by `{` and `}` characters) here:
|
77
|
+
* ***urgency*** - urgency level for notification
|
78
|
+
* ***expire\_time*** - when notification will expire?
|
79
|
+
* ***app\_name*** - application name
|
80
|
+
* ***icon*** - icon for the notification (can be multiple, devided by comma)
|
81
|
+
* ***category*** - category for the notification (can be multiple, devided by comma)
|
82
|
+
* ***hint*** - icon for the notification (need to use this format: TYPE:NAME:VALUE)
|
83
|
+
* ***message*** - message to send
|
84
|
+
* ***notify.sender\_params\_escape*** - should params will be escaped when passed to script (default: `true`)
|
85
|
+
|
86
|
+
This is example how to to run notifications with build-in MacOS X notifications support:
|
87
|
+
```ruby
|
88
|
+
Vagrant.configure(2) do |config|
|
89
|
+
config.vm.box = "ubuntu/trusty64"
|
90
|
+
config.notify.sender_params_str = '-e \'display notification {message} sound name \"default\"\''
|
91
|
+
config.notify.sender_app = 'osascript'
|
92
|
+
config.notify.sender_params_escape = true
|
93
|
+
end
|
94
|
+
```
|
95
|
+
|
74
96
|
**WARNING**
|
75
97
|
|
76
98
|
_Do **NOT** bind the notification server to an IP accessible over a network! The notification server does not have any authentication and doing so will leave your system vulnerable to remote command execution._
|
@@ -81,9 +103,11 @@ vagrant-notify supports the following providers:
|
|
81
103
|
|
82
104
|
- VirtualBox
|
83
105
|
- Docker
|
106
|
+
- Hyper-V
|
84
107
|
- [LXC](https://github.com/fgrehm/vagrant-lxc)
|
85
108
|
- [Parallels](https://github.com/Parallels/vagrant-parallels)
|
86
109
|
- [VMWare Fusion](https://www.vagrantup.com/vmware)
|
110
|
+
- [VMWare Workstation](https://www.vagrantup.com/vmware)
|
87
111
|
|
88
112
|
vagrant-notify has been tested and known to work with Linux, Solaris 11, FreeBSD, OpenBSD, and NetBSD guests. (notify-send icon forwarding feature is not supported on BSD guests)
|
89
113
|
|
data/examples/README.md
CHANGED
@@ -11,16 +11,15 @@ growlnotify -t "Vagrant VM" -m "$*"
|
|
11
11
|
|
12
12
|
## OS X
|
13
13
|
|
14
|
-
The `notify-send` script
|
14
|
+
The easiest configuration is using the built-in [AppleScript](https://github.com/fgrehm/vagrant-notify/blob/master/examples/osx/applescript/notify-send.rb) support for notifications. Alternatively, you can also create a `notify-send` script that forwards messages to other third party notifications applications like
|
15
15
|
[Growl](http://growl.info/) with [GrowlNotify](http://growl.info/downloads) (version 1.2.2 is free but unreliable)
|
16
16
|
or to the [Notification Center](http://support.apple.com/kb/HT5362) available on OS X 10.8+
|
17
17
|
using f.ex. [terminal-notifier](https://github.com/alloy/terminal-notifier).
|
18
18
|
|
19
|
-
|
19
|
+
* [AppleScript wrapper script](https://github.com/fgrehm/vagrant-notify/blob/master/examples/osx/applescript/notify-send.rb)
|
20
20
|
* [terminal-notifier wrapper script](https://github.com/fgrehm/vagrant-notify/blob/master/examples/osx/terminal-notifier/notify-send.rb)
|
21
21
|
* [growlnotify wrapper script](https://github.com/fgrehm/vagrant-notify/blob/master/examples/osx/growl_for_mac/notify-send.rb)
|
22
22
|
|
23
|
-
|
24
23
|
## Windows
|
25
24
|
|
26
25
|
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`. Or you can create your own notify-send program and compile it to an .exe binary executable.
|
@@ -44,3 +43,9 @@ Compile using [PS1toEXE](https://github.com/aravindvcyber/PS1toEXE):
|
|
44
43
|
|
45
44
|
|
46
45
|
* [Notification Center](https://github.com/fgrehm/vagrant-notify/blob/master/examples/windows/notification-center/notify-send.ps1)
|
46
|
+
|
47
|
+
##### Hyper-V
|
48
|
+
|
49
|
+
Due to Hyper-V's [networking configuration limitation within Vagrant](https://www.vagrantup.com/docs/hyperv/limitations.html). You will most likely need to manually ***bind*** the vagrant-notify notification server to whatever gateway your virtual NAT switch is using. See https://github.com/fgrehm/vagrant-notify#configuration
|
50
|
+
|
51
|
+
[Default NATSwitch IP](https://github.com/fgrehm/vagrant-notify/blob/master/lib/vagrant-notify/plugin.rb#L84) used by vagrant-notify.
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- mode: ruby -*-
|
3
|
+
# vi: set ft=ruby :
|
4
|
+
|
5
|
+
# Example OS X (>= 10.9) applescript 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 = "\"#{ARGV[0]}\""
|
27
|
+
elsif ARGV.length == 2
|
28
|
+
message = "\"#{ARGV[0]}\" with title \"#{ARGV[1]}\""
|
29
|
+
else
|
30
|
+
puts "Invalid number of options."
|
31
|
+
exit 1
|
32
|
+
end
|
33
|
+
|
34
|
+
system "osascript -e 'display notification #{message} sound name \"default\"'"
|
data/files/notify-send.erb
CHANGED
@@ -8,39 +8,34 @@ require 'rubygems'
|
|
8
8
|
require 'socket'
|
9
9
|
require 'optparse'
|
10
10
|
require 'fileutils'
|
11
|
+
require 'json'
|
11
12
|
|
12
13
|
options = {}
|
13
14
|
OptionParser.new do |opts|
|
14
|
-
|
15
|
-
|
16
|
-
opts.on('-u', '--urgency LEVEL') { |v| options[:
|
17
|
-
opts.on('-t', '--expire-time TIME') { |v| options[:
|
18
|
-
opts.on('-a', '--app-name APP_NAME') { |v| options[:
|
19
|
-
opts.on('-i', '--icon ICON[,ICON...]') { |v| options[:
|
20
|
-
opts.on('-c', '--category TYPE[,TYPE...]') { |v| options[:
|
21
|
-
opts.on('-h', '--hint TYPE:NAME:VALUE') { |v| options[:
|
22
|
-
opts.on('-v', '--version') { |v| options[:
|
23
|
-
|
15
|
+
opts.banner = "Usage: notify-send.rb TITLE [MESSAGE] [options]"
|
16
|
+
|
17
|
+
opts.on('-u', '--urgency LEVEL') { |v| options[:urgency] = v }
|
18
|
+
opts.on('-t', '--expire-time TIME') { |v| options[:expire_time] = v }
|
19
|
+
opts.on('-a', '--app-name APP_NAME') { |v| options[:app_name] = v }
|
20
|
+
opts.on('-i', '--icon ICON[,ICON...]') { |v| options[:icon] = v }
|
21
|
+
opts.on('-c', '--category TYPE[,TYPE...]') { |v| options[:category] = v }
|
22
|
+
opts.on('-h', '--hint TYPE:NAME:VALUE') { |v| options[:hint] = v }
|
23
|
+
opts.on('-v', '--version') { |v| options[:version] = v }
|
24
24
|
end.parse!
|
25
25
|
|
26
|
+
options[:title]=ARGV.pop
|
27
|
+
options[:message]=ARGV.pop if ARGV.length > 0
|
28
|
+
|
26
29
|
# BSD guests do not support shared folders
|
27
30
|
unless RUBY_PLATFORM =~ /freebsd|openbsd|netbsd/
|
28
|
-
if options[:
|
29
|
-
new_filename = options[:
|
30
|
-
FileUtils.cp options[:
|
31
|
-
options[:
|
31
|
+
if options[:icon]
|
32
|
+
new_filename = options[:icon].gsub('/', '-')
|
33
|
+
FileUtils.cp options[:icon], "<%= shared_folder %>/#{new_filename}"
|
34
|
+
options[:icon] = new_filename
|
32
35
|
end
|
33
36
|
end
|
34
37
|
|
35
|
-
cmd = options
|
36
|
-
"-#{key} '#{value}'"
|
37
|
-
end.join(' ')
|
38
|
-
|
39
|
-
# All single quotes part of the message get removed.
|
40
|
-
# TODO: Need to escape values.
|
41
|
-
unless ARGV.empty?
|
42
|
-
cmd << ARGV.map{|a| " '#{a.gsub(/'/, "")}'"}.join(' ')
|
43
|
-
end
|
38
|
+
cmd = JSON.generate(options, quirks_mode: true)
|
44
39
|
|
45
40
|
# VirtualBox is the only provider that can communicate with 127.0.0.1, others will have to use default private networking
|
46
41
|
if "<%= provider_name %>" == "virtualbox"
|
@@ -53,7 +48,6 @@ else
|
|
53
48
|
client_ip = "<%= client_ip %>"
|
54
49
|
end
|
55
50
|
|
56
|
-
|
57
|
-
TCPSocket.open client_ip, <%= host_port %> do |s|
|
51
|
+
TCPSocket.open client_ip.strip, <%= host_port %> do |s|
|
58
52
|
s.send cmd, 0
|
59
53
|
end
|
@@ -11,6 +11,7 @@ module Vagrant
|
|
11
11
|
|
12
12
|
path = compile_command(env, 'notify-send.erb')
|
13
13
|
install_command_on_guest(env, path)
|
14
|
+
check_if_ruby_on_guest(env)
|
14
15
|
|
15
16
|
@app.call env
|
16
17
|
end
|
@@ -31,10 +32,23 @@ module Vagrant
|
|
31
32
|
def install_command_on_guest(env, command_path)
|
32
33
|
source = env[:tmp_path].join 'vagrant-notify-send'
|
33
34
|
env[:machine].communicate.upload(source.to_s, '/tmp/notify-send')
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
env[:machine].communicate.sudo(
|
35
|
+
|
36
|
+
begin
|
37
|
+
env[:machine].communicate.sudo('mv /usr/bin/{notify-send,notify-send.bkp}; exit 0')
|
38
|
+
env[:machine].communicate.sudo('mv /tmp/notify-send /usr/bin/notify-send && chmod +x /usr/bin/notify-send')
|
39
|
+
if RUBY_PLATFORM =~ /mswin|msys|mingw|cygwin|bccwin|wince|emc/
|
40
|
+
env[:machine].communicate.sudo("sed 's/\r\$//' -i /usr/bin/notify-send") # dos2unix
|
41
|
+
end
|
42
|
+
rescue => msg
|
43
|
+
env[:machine].ui.warn("vagrant-notify: failed to install /usr/bin/notify-send onto #{env[:machine].name}.\n#{msg}")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def check_if_ruby_on_guest(env)
|
48
|
+
ruby_check = ''
|
49
|
+
env[:machine].communicate.sudo("which ruby 2>/dev/null || true") {|type, data| ruby_check = data }
|
50
|
+
if ruby_check.empty?
|
51
|
+
env[:machine].ui.warn("Ruby is not installed on '#{env[:machine].name}' guest VM! vagrant-notify will not work until a version of Ruby is installed.")
|
38
52
|
end
|
39
53
|
end
|
40
54
|
end
|
@@ -7,8 +7,8 @@ module Vagrant
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def call(env)
|
10
|
-
|
11
|
-
system(
|
10
|
+
message = notify_provision_messages(env) unless env[:machine].config.notify.enable == false
|
11
|
+
system(message[:start]) unless env[:machine].config.notify.enable == false
|
12
12
|
|
13
13
|
begin
|
14
14
|
@app.call(env)
|
@@ -16,9 +16,20 @@ module Vagrant
|
|
16
16
|
system("notify-send '[#{env[:machine].name}] \"#{env[:provisioner_name]}\" provision failed!'") unless env[:machine].config.notify.enable == false
|
17
17
|
env[:machine].ui.error("#{msg}")
|
18
18
|
else
|
19
|
-
system(
|
19
|
+
system(message[:end]) unless env[:machine].config.notify.enable == false
|
20
20
|
end
|
21
|
+
end
|
21
22
|
|
23
|
+
def notify_provision_messages(env)
|
24
|
+
message = Hash.new
|
25
|
+
if env[:provisioner_name].to_s == 'shell' and env[:provisioner].config.name
|
26
|
+
message[:start] = "notify-send '[#{env[:machine].name}] Provisioning with \"#{env[:provisioner_name]} (#{env[:provisioner].config.name})\"...'"
|
27
|
+
message[:end] = "notify-send '[#{env[:machine].name}] Finished provisioning with \"#{env[:provisioner_name]} (#{env[:provisioner].config.name})\"'"
|
28
|
+
else
|
29
|
+
message[:start] = "notify-send '[#{env[:machine].name}] Provisioning with \"#{env[:provisioner_name]}\"...'"
|
30
|
+
message[:end] = "notify-send '[#{env[:machine].name}] Finished provisioning with \"#{env[:provisioner_name]}\"'"
|
31
|
+
end
|
32
|
+
return message
|
22
33
|
end
|
23
34
|
end
|
24
35
|
end
|
@@ -9,7 +9,7 @@ module Vagrant
|
|
9
9
|
def call(env)
|
10
10
|
begin
|
11
11
|
unless env[:machine].config.notify.enable == false
|
12
|
-
host_dir = Pathname("/tmp/vagrant-notify/#{env[:machine].
|
12
|
+
host_dir = Pathname("/tmp/vagrant-notify/#{env[:machine].index_uuid}")
|
13
13
|
FileUtils.mkdir_p host_dir.to_s unless host_dir.exist?
|
14
14
|
env[:machine].config.vm.synced_folder host_dir, "/tmp/vagrant-notify", id: "vagrant-notify"
|
15
15
|
end
|
@@ -20,10 +20,15 @@ module Vagrant
|
|
20
20
|
|
21
21
|
return if env[:machine].config.notify.enable == false
|
22
22
|
|
23
|
-
|
23
|
+
bind_ip=env[:notify_data][:bind_ip]
|
24
|
+
|
25
|
+
port = next_available_port(bind_ip)
|
26
|
+
sender_app = '"' + env[:machine].config.notify.sender_app + '"'
|
27
|
+
sender_params_str = '"' + env[:machine].config.notify.sender_params_str + '"'
|
28
|
+
sender_params_escape = (env[:machine].config.notify.sender_params_escape) ? 1 : 0
|
24
29
|
|
25
30
|
if which('ruby')
|
26
|
-
env[:notify_data][:pid]
|
31
|
+
env[:notify_data][:pid] = Process.spawn("ruby", "#{dir}/server.rb", "#{id}", "#{port}", "#{bind_ip}", "#{sender_app}", "#{sender_params_str}", "#{sender_params_escape}", "#{provider_name}")
|
27
32
|
env[:notify_data][:port] = port
|
28
33
|
|
29
34
|
sleep 5
|
@@ -11,8 +11,10 @@ module Vagrant
|
|
11
11
|
return if env[:machine].config.notify.enable == false
|
12
12
|
|
13
13
|
if env[:machine].state.id == :running
|
14
|
-
|
15
|
-
|
14
|
+
begin
|
15
|
+
env[:machine].communicate.sudo('rm /usr/bin/notify-send; exit 0')
|
16
|
+
env[:machine].communicate.sudo('mv /usr/bin/{notify-send.bkp,notify-send}; exit 0')
|
17
|
+
end
|
16
18
|
end
|
17
19
|
|
18
20
|
@app.call env
|
@@ -1,10 +1,27 @@
|
|
1
1
|
module Vagrant
|
2
2
|
module Notify
|
3
3
|
class Config < Vagrant.plugin(2, :config)
|
4
|
-
|
4
|
+
|
5
|
+
# Enable?
|
6
|
+
attr_accessor :enable
|
7
|
+
|
8
|
+
# Bind IP
|
9
|
+
attr_accessor :bind_ip
|
10
|
+
|
11
|
+
# Notify send application
|
12
|
+
attr_accessor :sender_app
|
13
|
+
|
14
|
+
# Notify send params string
|
15
|
+
attr_accessor :sender_params_str
|
16
|
+
|
17
|
+
# Sender params escape
|
18
|
+
attr_accessor :sender_params_escape
|
5
19
|
|
6
20
|
def initialize()
|
7
21
|
@enable = UNSET_VALUE
|
22
|
+
@sender_app = UNSET_VALUE
|
23
|
+
@sender_params_str = UNSET_VALUE
|
24
|
+
@sender_params_escape = UNSET_VALUE
|
8
25
|
end
|
9
26
|
|
10
27
|
def validate(machine)
|
@@ -18,18 +35,20 @@ module Vagrant
|
|
18
35
|
|
19
36
|
if @enable != 0
|
20
37
|
if @enable != false && @enable != true
|
21
|
-
errors << "Unknown option: #{@enable}"
|
38
|
+
errors << "Unknown option for enable: #{@enable}"
|
22
39
|
end
|
23
40
|
end
|
24
41
|
|
42
|
+
if @sender_params_escape != false && @sender_params_escape != true && @sender_params_escape != UNSET_VALUE
|
43
|
+
errors << "Unknown option for @sender_params_escape: #{@sender_params_escape}"
|
44
|
+
end
|
45
|
+
|
25
46
|
if backed_by_supported_provider?(machine)
|
26
47
|
if @bind_ip.is_a?(String)
|
27
48
|
require "resolv"
|
28
49
|
unless @bind_ip =~ Resolv::IPv4::Regex
|
29
50
|
errors << "Invalid bind IP address: #{@bind_ip}"
|
30
51
|
end
|
31
|
-
elsif @bind_ip.is_a?(FalseClass) || @bind_ip.is_a?(Fixnum) || @bind_ip.is_a?(Array) || @bind_ip.is_a?(Hash)
|
32
|
-
errors << "Unknown bind IP address: #{@bind_ip}"
|
33
52
|
else
|
34
53
|
@bind_ip = SUPPORTED_PROVIDERS[machine.provider_name]
|
35
54
|
end
|
@@ -44,6 +63,9 @@ module Vagrant
|
|
44
63
|
|
45
64
|
def finalize!
|
46
65
|
@enable = 0 if @enable == UNSET_VALUE
|
66
|
+
@sender_app = "notify-send" if @sender_app == UNSET_VALUE
|
67
|
+
@sender_params_str = "[--app-name {app_name}] [--urgency {urgency}] [--expire-time {expire_time}] [--icon {icon}] [--category {category}] [--hint {hint}] {title} [{message}]" if @sender_params_str == UNSET_VALUE
|
68
|
+
@sender_params_escape = true if @sender_app == UNSET_VALUE
|
47
69
|
end
|
48
70
|
|
49
71
|
private
|
@@ -11,6 +11,7 @@ module Vagrant
|
|
11
11
|
|
12
12
|
start_server_hook = lambda do |hook|
|
13
13
|
require_relative './action'
|
14
|
+
hook.before Vagrant::Action::Builtin::WaitForCommunicator, Vagrant::Action::Builtin::ConfigValidate
|
14
15
|
hook.after Vagrant::Action::Builtin::WaitForCommunicator, Vagrant::Notify::Action.action_start_server
|
15
16
|
end
|
16
17
|
|
@@ -48,9 +49,13 @@ module Vagrant
|
|
48
49
|
|
49
50
|
# Third party provider plugins:
|
50
51
|
if defined?(HashiCorp::VagrantVMwarefusion)
|
51
|
-
require 'vagrant-
|
52
|
+
require 'vagrant-vmware-fusion/action'
|
52
53
|
hook.before HashiCorp::VagrantVMwarefusion::Action::Suspend, Vagrant::Notify::Action.action_stop_server
|
53
54
|
end
|
55
|
+
if defined?(HashiCorp::VagrantVMwareworkstation)
|
56
|
+
require 'vagrant-vmware-workstation/action'
|
57
|
+
hook.before HashiCorp::VagrantVMwareworkstation::Action::Suspend, Vagrant::Notify::Action.action_stop_server
|
58
|
+
end
|
54
59
|
if defined?(VagrantPlugins::Parallels)
|
55
60
|
require 'vagrant-parallels/action'
|
56
61
|
hook.before VagrantPlugins::Parallels::Action::Suspend, Vagrant::Notify::Action.action_stop_server
|
@@ -76,13 +81,15 @@ module Vagrant
|
|
76
81
|
# Keep an eye on https://github.com/mitchellh/vagrant/wiki/Available-Vagrant-Plugins#wiki-providers for more.
|
77
82
|
CLOUD_PROVIDERS = %w( aws cloudstack digital_ocean hp joyent openstack rackspace
|
78
83
|
softlayer proxmox managed azure brightbox cloudstack vcloud
|
79
|
-
vsphere )
|
84
|
+
vsphere google vultr vcloudair skytap scaleway )
|
80
85
|
|
81
86
|
# Supported providers and default IPs used to bind the notifcation server too.
|
82
87
|
SUPPORTED_PROVIDERS = { :virtualbox => '127.0.0.1',
|
83
88
|
:docker => '172.17.0.1',
|
89
|
+
:hyperv => '172.21.21.1',
|
84
90
|
:lxc => '10.0.3.1',
|
85
91
|
:parallels => '10.211.55.2',
|
86
|
-
:vmware_fusion => '192.168.172.1'
|
92
|
+
:vmware_fusion => '192.168.172.1',
|
93
|
+
:vmware_workstation => '192.168.38.1'
|
87
94
|
}
|
88
95
|
end
|
@@ -1,14 +1,19 @@
|
|
1
1
|
require 'socket'
|
2
|
+
require 'json'
|
3
|
+
require 'tmpdir'
|
2
4
|
|
3
5
|
module Vagrant
|
4
6
|
module Notify
|
5
7
|
class Server
|
6
8
|
HTTP_RESPONSE = "Hi! You just reached the vagrant notification server"
|
7
9
|
|
8
|
-
def self.run(id, port, bind_ip, machine_name='default', provider='virtualbox')
|
9
|
-
#id
|
10
|
-
#machine_name
|
11
|
-
#provider
|
10
|
+
def self.run(id, port, bind_ip, sender_app, sender_params_str, sender_params_escape, machine_name='default', provider='virtualbox')
|
11
|
+
#id = env[:machine].id
|
12
|
+
#machine_name = env[:machine].name
|
13
|
+
#provider = env[:machine].provider_name
|
14
|
+
#sender_app = env[:machine].config.sender_app
|
15
|
+
#sender_params_str = env[:machine].config.sender_params_str
|
16
|
+
#sender_params_escape = env[:machine].config.sender_params_escape
|
12
17
|
|
13
18
|
if __FILE__ == $0
|
14
19
|
begin
|
@@ -16,7 +21,7 @@ module Vagrant
|
|
16
21
|
rescue
|
17
22
|
exit 1
|
18
23
|
end
|
19
|
-
server = self.new(id, machine_name, provider)
|
24
|
+
server = self.new(id, sender_app, sender_params_str, sender_params_escape, machine_name, provider)
|
20
25
|
|
21
26
|
# Have to wrap this in a begin/rescue block so we can be certain the server is running at all times.
|
22
27
|
begin
|
@@ -33,10 +38,13 @@ module Vagrant
|
|
33
38
|
end
|
34
39
|
end
|
35
40
|
|
36
|
-
def initialize(id, machine_name = :default, provider = :virtualbox)
|
41
|
+
def initialize(id, sender_app, sender_params_str, sender_params_escape, machine_name = :default, provider = :virtualbox)
|
37
42
|
@id = id
|
38
43
|
@machine_name = machine_name
|
39
44
|
@provider = provider
|
45
|
+
@sender_app = sender_app
|
46
|
+
@sender_params_str = sender_params_str
|
47
|
+
@sender_params_escape = sender_params_escape
|
40
48
|
end
|
41
49
|
|
42
50
|
def receive_data(client)
|
@@ -44,8 +52,10 @@ module Vagrant
|
|
44
52
|
if http_request?(args)
|
45
53
|
client.puts HTTP_RESPONSE
|
46
54
|
else
|
47
|
-
|
48
|
-
|
55
|
+
json_data=JSON.parse(args)
|
56
|
+
parsed_args=map_params_str(json_data)
|
57
|
+
fix_icon_path! parsed_args
|
58
|
+
system "#{@sender_app} #{parsed_args}"
|
49
59
|
end
|
50
60
|
client.close
|
51
61
|
rescue => ex
|
@@ -54,12 +64,59 @@ module Vagrant
|
|
54
64
|
|
55
65
|
private
|
56
66
|
|
67
|
+
# Maps params str with values
|
68
|
+
#
|
69
|
+
#@param data [Map] Array values map
|
70
|
+
#
|
71
|
+
#@return [String]
|
72
|
+
def map_params_str(data)
|
73
|
+
cmd=@sender_params_str + ''
|
74
|
+
cmd.gsub! '%', '%%'
|
75
|
+
|
76
|
+
replace=[]
|
77
|
+
cmd.scan(/\[[^\]]+\]/).each do |part|
|
78
|
+
variable=part[/\{[^\}]+\}/][1..-2]
|
79
|
+
if data.key? variable
|
80
|
+
replace << part[1..-2].sub('{' + variable + '}', escape_param(data[variable]))
|
81
|
+
cmd.sub! part, '%'+replace.length.to_s+'$s'
|
82
|
+
else
|
83
|
+
cmd.sub! part, ''
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
cmd.scan(/\{[^\}]+\}/).each do |part|
|
88
|
+
variable=part[1..-2]
|
89
|
+
if data.key? variable
|
90
|
+
replace << escape_param(data[variable])
|
91
|
+
cmd.sub! part, '%'+replace.length.to_s+'$s'
|
92
|
+
end
|
93
|
+
end
|
94
|
+
cmd % replace
|
95
|
+
end
|
96
|
+
|
57
97
|
def log(message)
|
58
|
-
File.open(
|
98
|
+
File.open(@log_path, 'a+') do |log|
|
59
99
|
log.puts "#{message}"
|
60
100
|
end
|
61
101
|
end
|
62
102
|
|
103
|
+
# Escapes param
|
104
|
+
#
|
105
|
+
#@param param [String] Param
|
106
|
+
#
|
107
|
+
#@return [String]
|
108
|
+
def escape_param(param)
|
109
|
+
return param unless @sender_params_escape
|
110
|
+
'"' + param.gsub('"', "\\\"").gsub("'", "\\'").gsub("\\", "\\\\") + '"'
|
111
|
+
end
|
112
|
+
|
113
|
+
# Gets log path
|
114
|
+
#
|
115
|
+
#@return [String]
|
116
|
+
def log_path
|
117
|
+
File.join Dir.tmpdir(), "vagrant-notify-error-#{@id}.log"
|
118
|
+
end
|
119
|
+
|
63
120
|
def read_args(client)
|
64
121
|
''.tap do |args|
|
65
122
|
while tmp = client.gets and tmp !~ /^\s*$/
|
@@ -88,5 +145,8 @@ end
|
|
88
145
|
id = ARGV[0]
|
89
146
|
port = ARGV[1]
|
90
147
|
bind_ip = ARGV[2]
|
148
|
+
sender_app = ARGV[3]
|
149
|
+
sender_params_str = ARGV[4]
|
150
|
+
sender_params_escape = ARGV[5]
|
91
151
|
|
92
|
-
Vagrant::Notify::Server.run
|
152
|
+
Vagrant::Notify::Server.run id, port, bind_ip, sender_app, sender_params_str, sender_params_escape
|
@@ -5,11 +5,13 @@ require 'vagrant-notify/action/install_command'
|
|
5
5
|
|
6
6
|
describe Vagrant::Notify::Action::InstallCommand do
|
7
7
|
let(:app) { lambda { |env| } }
|
8
|
-
let(:config) {
|
8
|
+
let(:config) { double(notify: double(enable: true, bind_ip: "127.0.0.1")) }
|
9
9
|
let(:env) { {notify_data: {port: host_port}, machine: machine, tmp_path: tmp_path} }
|
10
10
|
let(:host_port) { 12345 }
|
11
|
-
let(:
|
12
|
-
let(:
|
11
|
+
let(:ui) { double(warn: true)}
|
12
|
+
let(:name) { 'test-vm' }
|
13
|
+
let(:machine) { double(communicate: communicator, config: config, provider_name: provider_name, ui: ui, name: name) }
|
14
|
+
let(:communicator) { double(upload: true, sudo: true) }
|
13
15
|
let(:host_ip) { '192.168.1.2' }
|
14
16
|
let(:provider_name) { 'virtualbox' }
|
15
17
|
let(:tmp_path) { Pathname.new(Dir.mktmpdir) }
|
@@ -32,14 +34,18 @@ describe Vagrant::Notify::Action::InstallCommand do
|
|
32
34
|
end
|
33
35
|
|
34
36
|
it 'uploads compiled command script over to guest machine' do
|
35
|
-
communicator.should have_received(:upload).with(tmp_cmd_path.to_s, guest_tmp_path)
|
37
|
+
communicator.should have_received(:upload).with(tmp_cmd_path.to_s, guest_tmp_path).at_most(2).times
|
36
38
|
end
|
37
39
|
|
38
40
|
it 'creates a backup for the available command' do
|
39
|
-
communicator.should have_received(:sudo).with("mv /usr/bin/{notify-send,notify-send.bkp}; exit 0")
|
41
|
+
communicator.should have_received(:sudo).with("mv /usr/bin/{notify-send,notify-send.bkp}; exit 0").at_most(3).times
|
40
42
|
end
|
41
43
|
|
42
44
|
it 'installs command for all users' do
|
43
|
-
communicator.should have_received(:sudo).with("mv #{guest_tmp_path} #{guest_path} && chmod +x #{guest_path}")
|
45
|
+
communicator.should have_received(:sudo).with("mv #{guest_tmp_path} #{guest_path} && chmod +x #{guest_path}").at_most(3).times
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'verify if ruby is installed on guest' do
|
49
|
+
communicator.should have_received(:sudo).with("which ruby 2>/dev/null || true").at_most(3).times
|
44
50
|
end
|
45
51
|
end
|
@@ -5,7 +5,7 @@ require 'vagrant-notify/action/prepare_data'
|
|
5
5
|
describe Vagrant::Notify::Action::PrepareData do
|
6
6
|
let(:data_dir) { Pathname.new(Dir.mktmpdir) }
|
7
7
|
let(:app) { lambda { |env| } }
|
8
|
-
let(:env) { {machine:
|
8
|
+
let(:env) { {machine: double(data_dir: data_dir)} }
|
9
9
|
|
10
10
|
subject { described_class.new(app, env) }
|
11
11
|
|
@@ -12,7 +12,7 @@ describe Vagrant::Notify::Action::ServerIsRunning do
|
|
12
12
|
let(:pid) { nil }
|
13
13
|
|
14
14
|
it 'sets the result to false' do
|
15
|
-
env[:result].should
|
15
|
+
env[:result].should be_falsey
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
@@ -26,7 +26,7 @@ describe Vagrant::Notify::Action::ServerIsRunning do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'sets the result to true' do
|
29
|
-
env[:result].should
|
29
|
+
env[:result].should be_truthy
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -37,7 +37,7 @@ describe Vagrant::Notify::Action::ServerIsRunning do
|
|
37
37
|
end
|
38
38
|
|
39
39
|
it 'sets the result to false' do
|
40
|
-
env[:result].should
|
40
|
+
env[:result].should be_falsey
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
@@ -6,11 +6,12 @@ require 'vagrant-notify/server'
|
|
6
6
|
|
7
7
|
describe Vagrant::Notify::Action::StartServer do
|
8
8
|
let(:app) { lambda { |env| } }
|
9
|
-
let(:
|
10
|
-
let(:
|
9
|
+
let(:sender_params_str) { "[--app-name {app_name}] [--urgency {urgency}] [--expire-time {expire_time}] [--icon {icon}] [--category {category}] [--hint {hint}] {message}"}
|
10
|
+
let(:config) { double(notify: double(enable: true, sender_app: 'notify-send', sender_params_str: sender_params_str, sender_params_escape: false)) }
|
11
|
+
let(:ui) { double(success: true)}
|
11
12
|
let(:id) { '425e799c-1293-4939-bo39-263lcc7457e8' }
|
12
13
|
let(:provider_name) { 'virtualbox' }
|
13
|
-
let(:machine) {
|
14
|
+
let(:machine) { double(state: double(id: :stopped), ui: ui, id: id, config: config, provider_name: provider_name) }
|
14
15
|
let(:env) { {notify_data: {bind_ip: "127.0.0.1"}, machine: machine} }
|
15
16
|
let(:pid) { '42' }
|
16
17
|
let(:port) { '1234' }
|
@@ -36,5 +37,5 @@ describe Vagrant::Notify::Action::StartServer do
|
|
36
37
|
# env[:notify_data][:pid].should be_nil
|
37
38
|
# end
|
38
39
|
|
39
|
-
pending 'identifies the next available port'
|
40
|
-
end
|
40
|
+
#pending 'identifies the next available port'
|
41
|
+
end
|
@@ -4,10 +4,10 @@ require 'vagrant-notify/action/stop_server'
|
|
4
4
|
|
5
5
|
describe Vagrant::Notify::Action::StopServer do
|
6
6
|
let(:app) { lambda { |env| } }
|
7
|
-
let(:config) {
|
8
|
-
let(:communicator) {
|
9
|
-
let(:ui) {
|
10
|
-
let(:machine) {
|
7
|
+
let(:config) { double(notify: double(enable: true)) }
|
8
|
+
let(:communicator) { double(sudo: true) }
|
9
|
+
let(:ui) { double(success: true) }
|
10
|
+
let(:machine) { double(communicate: communicator, state: double(id: :running), ui: ui, config: config) }
|
11
11
|
let(:env) { {notify_data: {pid: pid, port: 1234}, machine: machine} }
|
12
12
|
let(:pid) { '42' }
|
13
13
|
let(:port) { described_class::PORT }
|
@@ -20,7 +20,7 @@ describe Vagrant::Notify::Action::StopServer do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'kills the notification server' do
|
23
|
-
Process.should have_received(:kill).with('KILL', pid.to_i)
|
23
|
+
Process.should have_received(:kill).with('KILL', pid.to_i).at_most(2).times
|
24
24
|
end
|
25
25
|
|
26
26
|
it "removes server PID from notify data" do
|
data/spec/server_spec.rb
CHANGED
@@ -1,16 +1,20 @@
|
|
1
1
|
require 'vagrant-notify/server'
|
2
2
|
|
3
3
|
describe Vagrant::Notify::Server do
|
4
|
-
let(:arguments) { "
|
4
|
+
let(:arguments) { '{"message":"It Works!"}' }
|
5
5
|
let(:client) { StringIO.new(arguments) }
|
6
|
+
let(:sender_app) { 'notify-send' }
|
7
|
+
let(:sender_params_str) { "[--app-name {app_name}] [--urgency {urgency}] [--expire-time {expire_time}] [--icon {icon}] [--category {category}] [--hint {hint}] {message}" }
|
8
|
+
let(:sender_params_escape) { true }
|
6
9
|
let(:machine_id) { 'machine-id' }
|
10
|
+
let(:return_string) { '"It Works!"'}
|
7
11
|
|
8
|
-
subject { described_class.new(machine_id) }
|
12
|
+
subject { described_class.new(machine_id, sender_app, sender_params_str, sender_params_escape) }
|
9
13
|
|
10
14
|
before { subject.stub(:system => true) }
|
11
15
|
|
12
16
|
it 'runs notify-send with received data from client' do
|
13
|
-
subject.should_receive(:system).with("
|
17
|
+
subject.should_receive(:system).with("#{sender_app} #{return_string}") #server.rb needs to be updated so it strips this exta white space in the response
|
14
18
|
subject.receive_data(client)
|
15
19
|
end
|
16
20
|
|
@@ -20,12 +24,12 @@ describe Vagrant::Notify::Server do
|
|
20
24
|
end
|
21
25
|
|
22
26
|
context 'notification with an icon' do
|
23
|
-
let(:arguments) { "-
|
27
|
+
let(:arguments) { '{"icon":"-tmp-foo-bar.jpg","message":"Test message"}' }
|
24
28
|
|
25
29
|
before { subject.receive_data(client) }
|
26
30
|
|
27
31
|
it 'rewrites icon path before sending the notification' do
|
28
|
-
subject.should have_received(:system).with("
|
32
|
+
subject.should have_received(:system).with("#{sender_app} --icon \"-tmp-foo-bar.jpg\" \"Test message\"").at_most(2).times
|
29
33
|
end
|
30
34
|
end
|
31
35
|
|
@@ -39,7 +43,7 @@ describe Vagrant::Notify::Server do
|
|
39
43
|
before { subject.receive_data(client) }
|
40
44
|
|
41
45
|
it 'responds with a friendly message' do
|
42
|
-
client.should have_received(:puts).with(described_class::HTTP_RESPONSE)
|
46
|
+
client.should have_received(:puts).with(described_class::HTTP_RESPONSE).at_most(2).times
|
43
47
|
end
|
44
48
|
|
45
49
|
it 'does not issue system commands' do
|
@@ -47,7 +51,7 @@ describe Vagrant::Notify::Server do
|
|
47
51
|
end
|
48
52
|
|
49
53
|
it 'closes connection' do
|
50
|
-
client.should have_received(:close)
|
54
|
+
client.should have_received(:close).at_most(2).times
|
51
55
|
end
|
52
56
|
end
|
53
57
|
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-notify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fabio Rehm
|
8
8
|
- Tony Baltazar
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-12-24 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A Vagrant plugin that forwards `notify-send` from guest to host machine
|
15
15
|
and notifies provisioning status
|
@@ -32,6 +32,7 @@ files:
|
|
32
32
|
- Rakefile
|
33
33
|
- development/Vagrantfile
|
34
34
|
- examples/README.md
|
35
|
+
- examples/osx/applescript/notify-send.rb
|
35
36
|
- examples/osx/growl_for_mac/notify-send.rb
|
36
37
|
- examples/osx/terminal-notifier/notify-send.rb
|
37
38
|
- examples/windows/growl_for_windows/notify-send.rb
|
@@ -67,7 +68,7 @@ files:
|
|
67
68
|
homepage: https://github.com/fgrehm/vagrant-notify
|
68
69
|
licenses: []
|
69
70
|
metadata: {}
|
70
|
-
post_install_message:
|
71
|
+
post_install_message:
|
71
72
|
rdoc_options: []
|
72
73
|
require_paths:
|
73
74
|
- lib
|
@@ -82,9 +83,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
82
83
|
- !ruby/object:Gem::Version
|
83
84
|
version: '0'
|
84
85
|
requirements: []
|
85
|
-
|
86
|
-
|
87
|
-
signing_key:
|
86
|
+
rubygems_version: 3.1.2
|
87
|
+
signing_key:
|
88
88
|
specification_version: 4
|
89
89
|
summary: A Vagrant plugin that forwards `notify-send` from guest to host machine and
|
90
90
|
notifies provisioning status
|