vagrant-notify 0.5.3 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|