vagrant-nfs_guest 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: dce3470eb4d34a59abc8737fa5163830ab382f2f
4
+ data.tar.gz: b81fd5ff295c881ec9c6ee377010970bdca3bc5a
5
+ SHA512:
6
+ metadata.gz: 7a32e270cbdb9481d83a7f213986b6927ac7c3c28cbad7a7cea979ba1969b0076cab824f7255418e8927140bca1a410a6fea9fb447839e6802668dee69d46d46
7
+ data.tar.gz: b5b32a5a565c58420ad3c2d733740f073f208914c25a8c2d3d3a4f44ad9f3968dbb915e02c1b964096e527e9d8b705ac14a4504f1d03dce78ce86e00426ecb2b
data/Gemfile CHANGED
@@ -1,11 +1,15 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in vagrant-nfs_guest.gemspec
4
- gemspec
4
+ #gemspec
5
5
 
6
6
  group :development do
7
- # We depend on Vagrant for development, but we don't add it as a
8
- # gem dependency because we expect to be installed within the
9
- # Vagrant environment itself using `vagrant plugin`.
10
- gem "vagrant", :git => "git://github.com/mitchellh/vagrant.git"
7
+ # We depend on Vagrant for development, but we don't add it as a
8
+ # gem dependency because we expect to be installed within the
9
+ # Vagrant environment itself using `vagrant plugin`.
10
+ gem "vagrant", :git => "git://github.com/mitchellh/vagrant.git"
11
+ end
12
+
13
+ group :plugins do
14
+ gem "vagrant-nfs_guest", path: "."
11
15
  end
data/README.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Vagrant-NFS_Guest
2
2
 
3
+ ## What's New?
4
+
5
+ - Supports Vagrant 1.6!
6
+ - Handles actions 'up', 'halt', 'destroy', 'suspend', 'resume' and 'package' properly
7
+ - Uses retryable() for host to guest communications allow more fault tolerance
8
+ - Better error messages and handling
9
+ - Re-organisation of modules and class to better match Vagrant proper
10
+ - Simplified the plugin events binding
11
+
12
+ ## Overview
13
+
3
14
  Allows a guest VM to export synced folders via NFS and the host to mount them.
4
15
 
5
16
  Basically it's just the usual NFS synced folders in Vagrant but the roles are reversed.
@@ -0,0 +1,39 @@
1
+ require 'json'
2
+ module VagrantPlugins
3
+ module SyncedFolderNFSGuest
4
+ module Action
5
+ class MountNFS
6
+
7
+ def initialize(app,env)
8
+ @app = app
9
+ @logger = Log4r::Logger.new("vagrant-nfs_guest::action::unmount_nfs")
10
+ end
11
+
12
+ def call(env)
13
+ @machine = env[:machine]
14
+
15
+ if @machine.state.id == :running
16
+
17
+ raise Vagrant::Errors::NFSNoHostIP if !env[:nfs_guest_host_ip]
18
+ raise Vagrant::Errors::NFSNoGuestIP if !env[:nfs_guest_machine_ip]
19
+
20
+ machine_ip = env[:nfs_guest_machine_ip]
21
+ machine_ip = [machine_ip] if !machine_ip.is_a?(Array)
22
+
23
+ # Mount guest NFS folders
24
+ @machine.ui.info(I18n.t("vagrant_nfs_guest.actions.vm.nfs.mounting"))
25
+ folders = @machine.config.vm.synced_folders
26
+
27
+ @machine.env.host.capability(
28
+ :nfs_mount,
29
+ @machine.ui, @machine.id, machine_ip, folders
30
+ )
31
+ end
32
+
33
+ @app.call(env)
34
+
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -10,17 +10,19 @@ module VagrantPlugins
10
10
 
11
11
  def initialize(app,env)
12
12
  @app = app
13
- @logger = Log4r::Logger.new("vagrant::action::vm::nfs_guest")
13
+ @logger = Log4r::Logger.new("vagrant-nfs_guest::action::prepare_nfs_guest_settings")
14
14
  end
15
15
 
16
16
  def call(env)
17
17
  @machine = env[:machine]
18
- @app.call(env)
19
18
 
20
19
  if using_nfs?
21
20
  @logger.info("Using NFS_guest, preparing NFS settings by reading host IP and machine IP")
22
- add_nfs_settings_to_env!(env)
21
+ add_ips_to_env!(env)
23
22
  end
23
+
24
+ @app.call(env)
25
+
24
26
  end
25
27
 
26
28
  # We're using NFS if we have any synced folder with NFS configured. If
@@ -35,10 +37,9 @@ module VagrantPlugins
35
37
  # mounting.
36
38
  #
37
39
  # The ! indicates that this method modifies its argument.
38
- def add_nfs_settings_to_env!(env)
40
+ def add_ips_to_env!(env)
39
41
  adapter, host_ip = find_host_only_adapter
40
- machine_ip = nil
41
- machine_ip = read_machine_ip(adapter) if adapter
42
+ machine_ip = read_static_machine_ips || read_dynamic_machine_ip(adapter)
42
43
 
43
44
  raise Vagrant::Errors::NFSNoHostonlyNetwork if !host_ip || !machine_ip
44
45
 
@@ -64,6 +65,25 @@ module VagrantPlugins
64
65
  nil
65
66
  end
66
67
 
68
+ # Returns the IP address(es) of the guest by looking for static IPs
69
+ # given to host only adapters in the Vagrantfile
70
+ #
71
+ # @return [Array]<String> Configured static IPs
72
+ def read_static_machine_ips
73
+ ips = []
74
+ @machine.config.vm.networks.each do |type, options|
75
+ if type == :private_network && options[:ip].is_a?(String)
76
+ ips << options[:ip]
77
+ end
78
+ end
79
+
80
+ if ips.empty?
81
+ return nil
82
+ end
83
+
84
+ ips
85
+ end
86
+
67
87
  # Returns the IP address of the guest by looking at vbox guest property
68
88
  # for the appropriate guest adapter.
69
89
  #
@@ -72,7 +92,7 @@ module VagrantPlugins
72
92
  #
73
93
  # @param [Integer] adapter number to read IP for
74
94
  # @return [String] ip address of adapter
75
- def read_machine_ip(adapter)
95
+ def read_dynamic_machine_ip(adapter)
76
96
  # vbox guest properties are 0-indexed, while showvminfo network
77
97
  # interfaces are 1-indexed. go figure.
78
98
  guestproperty_adapter = adapter - 1
@@ -0,0 +1,31 @@
1
+ module VagrantPlugins
2
+ module SyncedFolderNFSGuest
3
+ module Action
4
+ class UnmountNFS
5
+
6
+ def initialize(app,env)
7
+ @app = app
8
+ @logger = Log4r::Logger.new("vagrant-nfs_guest::action::unmount_nfs")
9
+ end
10
+
11
+ def call(env)
12
+ @machine = env[:machine]
13
+
14
+ if @machine.state.id == :running
15
+ # unmount any host mounted NFS folders
16
+ @machine.ui.info(I18n.t("vagrant_nfs_guest.actions.vm.nfs.unmounting"))
17
+ folders = @machine.config.vm.synced_folders
18
+
19
+ @machine.env.host.capability(
20
+ :nfs_unmount,
21
+ @machine.ui, folders
22
+ )
23
+ end
24
+
25
+ @app.call(env)
26
+
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -3,17 +3,20 @@ require "vagrant"
3
3
  module VagrantPlugins
4
4
  module SyncedFolderNFSGuest
5
5
  class Config < Vagrant.plugin("2", :config)
6
+ attr_accessor :functional
6
7
  attr_accessor :map_uid
7
8
  attr_accessor :map_gid
8
9
 
9
10
  def initialize
10
11
  super
11
12
 
12
- @map_uid = UNSET_VALUE
13
- @map_gid = UNSET_VALUE
13
+ @functional = UNSET_VALUE
14
+ @map_uid = UNSET_VALUE
15
+ @map_gid = UNSET_VALUE
14
16
  end
15
17
 
16
18
  def finalize!
19
+ @functional = true if @functional == UNSET_VALUE
17
20
  @map_uid = nil if @map_uid == UNSET_VALUE
18
21
  @map_gid = nil if @map_gid == UNSET_VALUE
19
22
  end
@@ -2,8 +2,18 @@ require "vagrant"
2
2
 
3
3
  module VagrantPlugins
4
4
  module SyncedFolderNFSGuest
5
- class Error < Vagrant::Errors::VagrantError
6
- error_namespace("vagrant.config.nfs_guest.errors")
5
+ module Errors
6
+
7
+ class Error < Vagrant::Errors::VagrantError
8
+ error_namespace("vagrant_nfs_guest.errors")
9
+ end
10
+
11
+ class GuestNFSError < Error
12
+ error_key(:nfs_start_failed)
13
+ error_key(:nfs_apply_failed)
14
+ error_key(:nfs_update_exports_failed)
15
+ end
16
+
7
17
  end
8
18
  end
9
19
  end
@@ -0,0 +1,141 @@
1
+ require "log4r"
2
+
3
+ require "vagrant/util"
4
+ require "vagrant/util/retryable"
5
+
6
+ module VagrantPlugins
7
+ module SyncedFolderNFSGuest
8
+ module GuestLinux
9
+ module Cap
10
+ class NFSExport
11
+ extend Vagrant::Util::Retryable
12
+
13
+ def self.nfs_apply_command(env)
14
+ "exportfs -r"
15
+ end
16
+
17
+ def self.nfs_check_command(env)
18
+ "/etc/init.d/nfs-kernel-server status"
19
+ end
20
+
21
+ def self.nfs_start_command(env)
22
+ "/etc/init.d/nfs-kernel-server start"
23
+ end
24
+
25
+ def self.nfs_exports_template(machine)
26
+ VagrantPlugins::SyncedFolderNFSGuest.source_root.join(
27
+ "templates/nfs_guest/guest_export_linux")
28
+ end
29
+
30
+ def self.nfs_capable?(machine)
31
+ nfs_check_command = machine.guest.capability(:nfs_check_command)
32
+ machine.communicate.test(nfs_check_command)
33
+ end
34
+
35
+ def self.nfs_apply_changes!(machine)
36
+ nfs_apply_command = machine.guest.capability(:nfs_apply_command)
37
+ machine.communicate.sudo(nfs_apply_command,
38
+ error_class: Errors::GuestNFSError,
39
+ error_key: :nfs_apply_failed
40
+ )
41
+ end
42
+
43
+ def self.nfs_start!(machine)
44
+ nfs_start_command = machine.guest.capability(:nfs_start_command)
45
+ machine.communicate.sudo(nfs_start_command,
46
+ error_class: Errors::GuestNFSError,
47
+ error_key: :nfs_start_failed
48
+ )
49
+ end
50
+
51
+ def self.nfs_export(machine, ip, folders)
52
+ nfs_exports_template = machine.guest.capability(:nfs_exports_template)
53
+
54
+ nfs_opts_setup(machine, folders)
55
+
56
+ output = Vagrant::Util::TemplateRenderer.render(
57
+ nfs_exports_template,
58
+ uuid: machine.id,
59
+ ips: [ip],
60
+ folders: folders,
61
+ user: Process.uid)
62
+
63
+ machine.ui.info I18n.t("vagrant_nfs_guest.guests.linux.nfs_export")
64
+ sleep 0.5
65
+
66
+ nfs_cleanup(machine)
67
+
68
+ retryable(on: Errors::GuestNFSError, tries: 8, sleep: 3) do
69
+ output.split("\n").each do |line|
70
+ machine.communicate.sudo(
71
+ %Q[echo '#{line}' >> /etc/exports],
72
+ error_class: Errors::GuestNFSError,
73
+ error_key: :nfs_update_exports_failed
74
+ )
75
+ end
76
+
77
+ if nfs_capable?(machine)
78
+ nfs_apply_changes!(machine)
79
+ else
80
+ nfs_start!(machine)
81
+ end
82
+ end
83
+ end
84
+
85
+ def self.nfs_cleanup(machine)
86
+ id = machine.id
87
+ user = Process.uid
88
+
89
+ # Use sed to just strip out the block of code which was inserted
90
+ # by Vagrant
91
+ #
92
+ machine_do(
93
+ machine,
94
+ "sed -r -e '/^# VAGRANT-BEGIN:( #{user})? #{id}/,/^# " +
95
+ "VAGRANT-END:( #{user})? #{id}/ d' -ibak /etc/exports")
96
+ end
97
+
98
+ def self.nfs_opts_setup(machine, folders)
99
+ folders.each do |k, opts|
100
+ if !opts[:linux__nfs_options]
101
+ opts[:linux__nfs_options] ||= ["rw", "no_subtree_check", "all_squash", "insecure"]
102
+ end
103
+
104
+ # Only automatically set anonuid/anongid if they weren't
105
+ # explicitly set by the user.
106
+ hasgid = false
107
+ hasuid = false
108
+ opts[:linux__nfs_options].each do |opt|
109
+ hasgid = !!(opt =~ /^anongid=/) if !hasgid
110
+ hasuid = !!(opt =~ /^anonuid=/) if !hasuid
111
+ end
112
+
113
+ opts[:linux__nfs_options] << "anonuid=#{opts[:map_uid]}" if !hasuid
114
+ opts[:linux__nfs_options] << "anongid=#{opts[:map_gid]}" if !hasgid
115
+ opts[:linux__nfs_options] << "fsid=#{opts[:uuid]}"
116
+
117
+ # Expand the guest path so we can handle things like "~/vagrant"
118
+ expanded_guest_path = machine.guest.capability(
119
+ :shell_expand_guest_path, opts[:guestpath])
120
+
121
+ begin
122
+ retryable(on: Vagrant::Errors::VagrantError, tries: 8, sleep: 3) do
123
+ # Do the actual creating and mounting
124
+ machine_do(machine, "mkdir -p #{expanded_guest_path}")
125
+ machine_do(machine, "chown -R vagrant:vagrant #{expanded_guest_path}")
126
+ machine_do(machine, "chmod 2775 #{expanded_guest_path}")
127
+ end
128
+ rescue Vagrant::Errors::VagrantError
129
+ raise Errors::CreateMountsFailed
130
+ end
131
+ end
132
+ end
133
+
134
+ def self.machine_do(machine, command)
135
+ machine.communicate.sudo(command)
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,27 @@
1
+ module VagrantPlugins
2
+ module GuestLinux
3
+ module Cap
4
+ class ReadUserIDs
5
+ def self.read_uid(machine)
6
+ command = "id -u"
7
+ result = ""
8
+ machine.communicate.execute(command) do |type, data|
9
+ result << data if type == :stdout
10
+ end
11
+
12
+ result.chomp.split("\n").first
13
+ end
14
+
15
+ def self.read_gid(machine)
16
+ command = "id -g"
17
+ result = ""
18
+ machine.communicate.execute(command) do |type, data|
19
+ result << data if type == :stdout
20
+ end
21
+
22
+ result.chomp.split("\n").first
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,31 @@
1
+ require "log4r"
2
+
3
+ module VagrantPlugins
4
+ module HostBSD
5
+ module Cap
6
+ class MountNFS
7
+
8
+ def self.nfs_mount(environment, ui, id, ips, folders)
9
+ folders.each do |name, opts|
10
+ if opts[:type] != :nfs_guest
11
+ next
12
+ end
13
+
14
+ ips.each do |ip|
15
+ ui.detail(I18n.t("vagrant.actions.vm.share_folders.mounting_entry",
16
+ guestpath: opts[:guestpath],
17
+ hostpath: opts[:hostpath]))
18
+
19
+ system("mkdir -p #{opts[:hostpath]}")
20
+ mount_command = "mount -t nfs -o noatime '#{ip}:#{opts[:guestpath]}' '#{opts[:hostpath]}'"
21
+ if system(mount_command)
22
+ break
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,33 @@
1
+ require "log4r"
2
+
3
+ module VagrantPlugins
4
+ module HostBSD
5
+ module Cap
6
+ class UnmountNFS
7
+
8
+ def self.nfs_unmount(environment, ui, folders)
9
+ folders.each do |name, opts|
10
+ if opts[:type] != :nfs_guest
11
+ next
12
+ end
13
+
14
+ ui.detail(I18n.t("vagrant.actions.vm.share_folders.mounting_entry",
15
+ guestpath: opts[:guestpath],
16
+ hostpath: opts[:hostpath]))
17
+
18
+ expanded_host_path = `printf #{opts[:hostpath]}`
19
+ umount_msg = `umount '#{expanded_host_path}' 2>&1`
20
+
21
+ if $?.exitstatus != 0
22
+ if not umount_msg.include? 'not currently mounted'
23
+ ui.info "NFS mounts still in use!"
24
+ exit(1)
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,18 @@
1
+ require "vagrant"
2
+
3
+ module VagrantPlugins
4
+ module HostBSD
5
+ class Plugin < Vagrant.plugin("2")
6
+
7
+ host_capability("bsd", "nfs_mount") do
8
+ require_relative "cap/mount_nfs"
9
+ Cap::MountNFS
10
+ end
11
+
12
+ host_capability("bsd", "nfs_unmount") do
13
+ require_relative "cap/unmount_nfs"
14
+ Cap::UnmountNFS
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,59 +1,138 @@
1
- require File.expand_path("../hosts/host", __FILE__)
2
- require File.expand_path("../hosts/bsd/host", __FILE__)
1
+ begin
2
+ require "vagrant"
3
+ rescue LoadError
4
+ raise "The Vagrant AWS plugin must be run within Vagrant."
5
+ end
6
+
7
+ # This is a sanity check to make sure no one is attempting to install
8
+ # this into an early Vagrant version.
9
+ if Vagrant::VERSION < "1.2.0"
10
+ raise "The Vagrant AWS plugin is only compatible with Vagrant 1.2+"
11
+ end
3
12
 
4
13
  module VagrantPlugins
5
14
  module SyncedFolderNFSGuest
15
+ # This plugin implements Guest Exported NFS folders.
16
+ #
6
17
  class Plugin < Vagrant.plugin("2")
7
18
  name "vagrant-nfs_guest"
8
19
  description <<-DESC
9
- Adds support for guest nfs exporting of synced folders
20
+ The NFS Guest synced folders plugin enables you to use NFS exports from
21
+ the Guest as a synced folder implementation.
10
22
  DESC
11
23
 
12
24
  config(:nfs_guest) do
13
- require File.expand_path("../config", __FILE__)
25
+ require_relative "config"
14
26
  Config
15
27
  end
16
28
 
17
29
  synced_folder(:nfs_guest, 4) do
18
- require File.expand_path("../synced_folder", __FILE__)
30
+ require_relative "synced_folder"
19
31
  SyncedFolder
20
32
  end
21
33
 
22
- guest_capability(:linux, :export_nfs_folders) do
23
- require File.expand_path("../cap/linux/export_nfs_folders", __FILE__)
24
- Cap::Linux::ExportNFS
34
+ guest_capability(:linux, :nfs_export) do
35
+ require_relative "guests/linux/cap/nfs_export"
36
+ GuestLinux::Cap::NFSExport
25
37
  end
26
38
 
27
- guest_capability(:linux, :export_nfs_capable) do
28
- require File.expand_path("../cap/linux/export_nfs_folders", __FILE__)
29
- Cap::Linux::ExportNFS
39
+ guest_capability(:linux, :nfs_apply_command) do
40
+ require_relative "guests/linux/cap/nfs_export"
41
+ GuestLinux::Cap::NFSExport
42
+ end
43
+
44
+ guest_capability(:linux, :nfs_check_command) do
45
+ require_relative "guests/linux/cap/nfs_export"
46
+ GuestLinux::Cap::NFSExport
47
+ end
48
+
49
+ guest_capability(:linux, :nfs_start_command) do
50
+ require_relative "guests/linux/cap/nfs_export"
51
+ GuestLinux::Cap::NFSExport
52
+ end
53
+
54
+ guest_capability(:linux, :nfs_exports_template) do
55
+ require_relative "guests/linux/cap/nfs_export"
56
+ GuestLinux::Cap::NFSExport
30
57
  end
31
58
 
32
59
  guest_capability(:linux, :read_uid) do
33
- require File.expand_path("../cap/linux/read_user_ids", __FILE__)
34
- Cap::Linux::ReadUserIDs
60
+ require_relative "guests/linux/cap/read_user_ids"
61
+ GuestLinux::Cap::ReadUserIDs
35
62
  end
36
63
 
37
64
  guest_capability(:linux, :read_gid) do
38
- require File.expand_path("../cap/linux/read_user_ids", __FILE__)
39
- Cap::Linux::ReadUserIDs
65
+ require_relative "guests/linux/cap/read_user_ids"
66
+ GuestLinux::Cap::ReadUserIDs
40
67
  end
41
68
 
42
- guest_capability(:linux, :halt) do
43
- require File.expand_path("../cap/linux/halt", __FILE__)
44
- Cap::Linux::Halt
69
+ action_hook(:nfs_guest, :machine_action_up) do |hook|
70
+ require_relative "action/prepare_nfs_guest_settings"
71
+ hook.after(
72
+ VagrantPlugins::ProviderVirtualBox::Action::Boot,
73
+ Action::PrepareNFSGuestSettings
74
+ )
45
75
  end
46
76
 
47
- require File.expand_path("../action/prepare_nfs_guest_settings", __FILE__)
48
- action_hook(:nfs_guest, :machine_action_up) do |hook|
49
- hook.before(VagrantPlugins::ProviderVirtualBox::Action::PrepareNFSSettings,
50
- Action::PrepareNFSGuestSettings)
77
+ action_hook(:nfs_guest, :machine_action_reload) do |hook|
78
+ require_relative "action/prepare_nfs_guest_settings"
79
+ hook.before(
80
+ VagrantPlugins::ProviderVirtualBox::Action::PrepareNFSSettings,
81
+ Action::PrepareNFSGuestSettings
82
+ )
83
+ end
84
+
85
+ action_hook(:nfs_guest, :machine_action_resume) do |hook|
86
+ require_relative "action/mount_nfs"
87
+ require_relative "action/prepare_nfs_guest_settings"
88
+ hook.after(
89
+ VagrantPlugins::ProviderVirtualBox::Action::WaitForCommunicator,
90
+ Action::PrepareNFSGuestSettings
91
+ )
92
+ hook.after(
93
+ Action::PrepareNFSGuestSettings,
94
+ Action::MountNFS
95
+ )
96
+ end
97
+
98
+ action_hook(:nfs_guest, :machine_action_halt) do |hook|
99
+ require_relative "action/unmount_nfs"
100
+ hook.before(
101
+ Vagrant::Action::Builtin::GracefulHalt,
102
+ Action::UnmountNFS
103
+ )
104
+ end
105
+
106
+ action_hook(:nfs_guest, :machine_action_reload) do |hook|
107
+ require_relative "action/unmount_nfs"
108
+ hook.before(
109
+ Vagrant::Action::Builtin::GracefulHalt,
110
+ Action::UnmountNFS
111
+ )
112
+ end
113
+
114
+ action_hook(:nfs_guest, :machine_action_package) do |hook|
115
+ require_relative "action/unmount_nfs"
116
+ hook.before(
117
+ Vagrant::Action::Builtin::GracefulHalt,
118
+ Action::UnmountNFS
119
+ )
51
120
  end
52
121
 
53
- require File.expand_path("../action/unmount_mounts", __FILE__)
54
122
  action_hook(:nfs_guest, :machine_action_destroy) do |hook|
55
- hook.after(Vagrant::Action::Builtin::DestroyConfirm,
56
- Action::UnmountMounts)
123
+ require_relative "action/unmount_nfs"
124
+ hook.after(
125
+ Vagrant::Action::Builtin::DestroyConfirm,
126
+ Action::UnmountNFS
127
+ )
128
+ end
129
+
130
+ action_hook(:nfs_guest, :machine_action_suspend) do |hook|
131
+ require_relative "action/unmount_nfs"
132
+ hook.before(
133
+ VagrantPlugins::ProviderVirtualBox::Action::Suspend,
134
+ Action::UnmountNFS
135
+ )
57
136
  end
58
137
  end
59
138
  end
@@ -1,25 +1,25 @@
1
1
  require 'zlib'
2
+ require 'json'
2
3
 
3
4
  module VagrantPlugins
4
5
  module SyncedFolderNFSGuest
5
6
  class SyncedFolder < Vagrant.plugin("2", :synced_folder)
6
- def usable?(machine)
7
- # NFS is always available
8
- true
9
- end
10
-
11
- def prepare(machine, folders, opts)
12
- # Nothing is necessary to do before VM boot.
7
+ def usable?(machine, raise_error=false)
8
+ # If the machine explicitly said NFS is not supported, then
9
+ # it isn't supported.
10
+ if !machine.config.nfs_guest.functional
11
+ return false
12
+ end
13
+ return true if machine.env.host.capability(:nfs_installed)
14
+ return true if machine.guest.capability(:nfs_installed)
15
+ return false if !raise_error
16
+ raise Vagrant::Errors::NFSNotSupported
13
17
  end
14
18
 
15
19
  def enable(machine, folders, nfsopts)
16
20
  raise Vagrant::Errors::NFSNoHostIP if !nfsopts[:nfs_guest_host_ip]
17
21
  raise Vagrant::Errors::NFSNoGuestIP if !nfsopts[:nfs_guest_machine_ip]
18
22
 
19
- if !machine.guest.capability(:export_nfs_capable)
20
- raise VagrantPlugins::SyncedFolderNFSGuest::Error, :no_nfsd
21
- end
22
-
23
23
  machine_ip = nfsopts[:nfs_guest_machine_ip]
24
24
  machine_ip = [machine_ip] if !machine_ip.is_a?(Array)
25
25
 
@@ -33,13 +33,15 @@ module VagrantPlugins
33
33
  mount_folders[id] = opts.dup if opts[:guestpath]
34
34
  end
35
35
 
36
- machine.ui.info I18n.t("vagrant.actions.vm.nfs.exporting")
36
+ machine.ui.info I18n.t("vagrant_nfs_guest.actions.vm.nfs.exporting")
37
37
  machine.guest.capability(
38
- :export_nfs_folders, nfsopts[:nfs_guest_host_ip], mount_folders)
38
+ :nfs_export, nfsopts[:nfs_guest_host_ip], mount_folders)
39
39
 
40
- machine.ui.info I18n.t("vagrant.actions.vm.nfs.mounting")
41
- machine.env.host.mount_nfs_folders(
42
- machine.id, machine_ip, mount_folders)
40
+ machine.ui.info I18n.t("vagrant_nfs_guest.actions.vm.nfs.mounting")
41
+ machine.env.host.capability(
42
+ :nfs_mount,
43
+ machine.ui, machine.id, machine_ip, mount_folders
44
+ )
43
45
  end
44
46
 
45
47
  protected
@@ -1,5 +1,5 @@
1
1
  module VagrantPlugins
2
2
  module SyncedFolderNFSGuest
3
- VERSION = "0.0.4"
3
+ VERSION = "0.1.0"
4
4
  end
5
5
  end
@@ -1,27 +1,21 @@
1
- begin
2
- require "vagrant"
3
- rescue LoadError
4
- raise "The Vagrant nfs_guest plugin must be run within Vagrant."
5
- end
6
-
7
- # This is a sanity check to make sure no one is attempting to install
8
- # this into an early Vagrant version.
9
- if Vagrant::VERSION < "1.4.0"
10
- raise "The Vagrant nfs_guest plugin is only compatible with Vagrant 1.4+"
11
- end
1
+ require "pathname"
12
2
 
13
3
  require "vagrant-nfs_guest/plugin"
14
- require 'vagrant-nfs_guest/errors'
15
-
16
- require "pathname"
4
+ require "vagrant-nfs_guest/hosts/bsd/plugin"
17
5
 
18
6
  module VagrantPlugins
19
7
  module SyncedFolderNFSGuest
8
+ lib_path = Pathname.new(File.expand_path("../vagrant-nfs_guest", __FILE__))
9
+ autoload :Errors, lib_path.join("errors")
10
+
11
+ # This returns the path to the source of this plugin.
12
+ #
13
+ # @return [Pathname]
20
14
  def self.source_root
21
15
  @source_root ||= Pathname.new(File.expand_path("../../", __FILE__))
22
16
  end
23
17
 
24
- I18n.load_path << File.expand_path('locales/en.yml', source_root)
18
+ I18n.load_path << File.expand_path("templates/locales/en.yml", source_root)
25
19
  I18n.reload!
26
20
  end
27
21
  end
@@ -0,0 +1,43 @@
1
+ en:
2
+ vagrant_nfs_guest:
3
+ actions:
4
+ vm:
5
+ nfs:
6
+ exporting: "Exporting NFS shared folders from guest..."
7
+ mounting: "Mounting NFS shared folders from guest..."
8
+ unmounting: "Unmounting NFS shared folders from guest..."
9
+ guests:
10
+ linux:
11
+ nfs_export: "Preparing to edit /etc/exports on the guest..."
12
+
13
+ errors:
14
+ nfs_update_exports_failed: |-
15
+ There was an error updating the guests /etc/exports file.
16
+
17
+ %{command}
18
+
19
+ Stdout from the command:
20
+ %{stdout}
21
+
22
+ Stderr from the command:
23
+ %{stderr}
24
+ nfs_start_failed: |-
25
+ Something failed while starting the NFS service on the guest.
26
+
27
+ %{command}
28
+
29
+ Stdout from the command:
30
+ %{stdout}
31
+
32
+ Stderr from the command:
33
+ %{stderr}
34
+ nfs_apply_failed: |-
35
+ Something failed while applying changes to the NFS service on the guest.
36
+
37
+ %{command}
38
+
39
+ Stdout from the command:
40
+ %{stdout}
41
+
42
+ Stderr from the command:
43
+ %{stderr}
@@ -1,6 +1,6 @@
1
1
  # VAGRANT-BEGIN: <%= user %> <%= uuid %>
2
2
  <% ips.each do |ip| %>
3
- <% folders.each do |name, opts| %>
3
+ <% folders.each do |dirs, opts| %>
4
4
  "<%= opts[:guestpath] %>" <%= ip %>(<%= opts[:linux__nfs_options].join(",") %>)
5
5
  <% end %>
6
6
  <% end %>
metadata CHANGED
@@ -1,46 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-nfs_guest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Alan Garfield
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-12-16 00:00:00.000000000 Z
11
+ date: 2014-07-02 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: bundler
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
19
  version: '1.3'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
26
  version: '1.3'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rake
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - ">="
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  description: Adds support for guest nfs exporting of synced folders
@@ -50,56 +45,50 @@ executables: []
50
45
  extensions: []
51
46
  extra_rdoc_files: []
52
47
  files:
53
- - .gitignore
48
+ - ".gitignore"
54
49
  - Gemfile
55
50
  - LICENSE.txt
56
51
  - README.md
57
52
  - Rakefile
58
53
  - lib/vagrant-nfs_guest.rb
54
+ - lib/vagrant-nfs_guest/action/mount_nfs.rb
59
55
  - lib/vagrant-nfs_guest/action/prepare_nfs_guest_settings.rb
60
- - lib/vagrant-nfs_guest/action/unmount_mounts.rb
61
- - lib/vagrant-nfs_guest/cap/linux/export_nfs_folders.rb
62
- - lib/vagrant-nfs_guest/cap/linux/halt.rb
63
- - lib/vagrant-nfs_guest/cap/linux/read_user_ids.rb
56
+ - lib/vagrant-nfs_guest/action/unmount_nfs.rb
64
57
  - lib/vagrant-nfs_guest/config.rb
65
58
  - lib/vagrant-nfs_guest/errors.rb
66
- - lib/vagrant-nfs_guest/hosts/bsd/host.rb
67
- - lib/vagrant-nfs_guest/hosts/host.rb
59
+ - lib/vagrant-nfs_guest/guests/linux/cap/nfs_export.rb
60
+ - lib/vagrant-nfs_guest/guests/linux/cap/read_user_ids.rb
61
+ - lib/vagrant-nfs_guest/hosts/bsd/cap/mount_nfs.rb
62
+ - lib/vagrant-nfs_guest/hosts/bsd/cap/unmount_nfs.rb
63
+ - lib/vagrant-nfs_guest/hosts/bsd/plugin.rb
68
64
  - lib/vagrant-nfs_guest/plugin.rb
69
65
  - lib/vagrant-nfs_guest/synced_folder.rb
70
66
  - lib/vagrant-nfs_guest/version.rb
71
- - locales/en.yml
67
+ - templates/locales/en.yml
72
68
  - templates/nfs_guest/guest_export_linux.erb
73
69
  - vagrant-nfs_guest.gemspec
74
70
  homepage: ''
75
71
  licenses:
76
72
  - MIT
73
+ metadata: {}
77
74
  post_install_message:
78
75
  rdoc_options: []
79
76
  require_paths:
80
77
  - lib
81
78
  required_ruby_version: !ruby/object:Gem::Requirement
82
- none: false
83
79
  requirements:
84
- - - ! '>='
80
+ - - ">="
85
81
  - !ruby/object:Gem::Version
86
82
  version: '0'
87
- segments:
88
- - 0
89
- hash: 4128011817276071124
90
83
  required_rubygems_version: !ruby/object:Gem::Requirement
91
- none: false
92
84
  requirements:
93
- - - ! '>='
85
+ - - ">="
94
86
  - !ruby/object:Gem::Version
95
87
  version: '0'
96
- segments:
97
- - 0
98
- hash: 4128011817276071124
99
88
  requirements: []
100
89
  rubyforge_project:
101
- rubygems_version: 1.8.23
90
+ rubygems_version: 2.2.2
102
91
  signing_key:
103
- specification_version: 3
92
+ specification_version: 4
104
93
  summary: Adds support for guest nfs exporting of synced folders
105
94
  test_files: []
@@ -1,20 +0,0 @@
1
- module VagrantPlugins
2
- module SyncedFolderNFSGuest
3
- module Action
4
- class UnmountMounts
5
- def initialize(app,env)
6
- @app = app
7
- @logger = Log4r::Logger.new("vagrant::action::vm::nfs_guest")
8
- end
9
-
10
- def call(env)
11
- @machine = env[:machine]
12
- @app.call(env)
13
-
14
- folders = @machine.config.vm.synced_folders
15
- @machine.env.host.unmount_nfs_folders(folders)
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,116 +0,0 @@
1
- require 'vagrant/util/platform'
2
-
3
- module VagrantPlugins
4
- module SyncedFolderNFSGuest
5
- module Cap
6
- module Linux
7
- class ExportNFS
8
- include Vagrant::Util
9
-
10
- def self.export_nfs_capable(machine)
11
- me = self.new(machine)
12
- return me.nfs_capable?
13
- end
14
-
15
- def self.export_nfs_folders(machine, ip, folders)
16
- me = self.new(machine, ip, folders)
17
-
18
- me.nfs_opts_setup()
19
-
20
- tpl_path = VagrantPlugins::SyncedFolderNFSGuest.source_root.join(
21
- 'templates/nfs_guest/guest_export_linux')
22
- output = TemplateRenderer.render(tpl_path,
23
- :uuid => machine.id,
24
- :ips => [ip],
25
- :folders => folders,
26
- :user => Process.uid)
27
-
28
- machine.ui.info I18n.t("vagrant.hosts.linux.nfs_export")
29
- sleep 0.5
30
-
31
- me.nfs_cleanup()
32
-
33
- output.split("\n").each do |line|
34
- machine.communicate.sudo(%Q[echo '#{line}' >> /etc/exports])
35
- end
36
-
37
- me.restart_nfs()
38
- end
39
-
40
- def initialize(machine, ip = [], folders = [])
41
- @machine = machine
42
- @ip = ip
43
- @folders = folders
44
-
45
- @folder_test_command = "test -d"
46
- @nfs_test_command = "test -e /etc/exports"
47
- @nfs_apply_command = "/usr/sbin/exportfs -r"
48
- @nfs_check_command = "/etc/init.d/nfs-kernel-server status"
49
- @nfs_start_command = "/etc/init.d/nfs-kernel-server start"
50
- end
51
-
52
- def nfs_running?
53
- @machine.communicate.test("#{@nfs_check_command}")
54
- end
55
-
56
- def nfs_capable?
57
- @machine.communicate.test("#{@nfs_test_command}")
58
- end
59
-
60
- # TODO - DRY this; ripped completely from plugins/hosts/linux/host.rb
61
- def nfs_opts_setup()
62
- @folders.each do |k, opts|
63
- if !opts[:linux__nfs_options]
64
- opts[:linux__nfs_options] ||= ["rw", "no_subtree_check", "all_squash", "insecure"]
65
- end
66
-
67
- # Only automatically set anonuid/anongid if they weren't
68
- # explicitly set by the user.
69
- hasgid = false
70
- hasuid = false
71
- opts[:linux__nfs_options].each do |opt|
72
- hasgid = !!(opt =~ /^anongid=/) if !hasgid
73
- hasuid = !!(opt =~ /^anonuid=/) if !hasuid
74
- end
75
-
76
- opts[:linux__nfs_options] << "anonuid=#{opts[:map_uid]}" if !hasuid
77
- opts[:linux__nfs_options] << "anongid=#{opts[:map_gid]}" if !hasgid
78
- opts[:linux__nfs_options] << "fsid=#{opts[:uuid]}"
79
-
80
- # Expand the guest path so we can handle things like "~/vagrant"
81
- expanded_guest_path = @machine.guest.capability(
82
- :shell_expand_guest_path, opts[:guestpath])
83
-
84
- # Do the actual creating and mounting
85
- @machine.communicate.sudo("mkdir -p #{expanded_guest_path}")
86
- @machine.communicate.sudo("chown -R vagrant:vagrant #{expanded_guest_path}")
87
- @machine.communicate.sudo("chmod u+rw #{expanded_guest_path}")
88
- @machine.communicate.sudo("chmod g+rws #{expanded_guest_path}")
89
- end
90
- end
91
-
92
- def nfs_cleanup()
93
- return if !nfs_capable?
94
-
95
- id = @machine.id
96
- user = Process.uid
97
-
98
- # Use sed to just strip out the block of code which was inserted
99
- # by Vagrant
100
- @machine.communicate.sudo("sed -r -e '/^# VAGRANT-BEGIN:( #{user})? #{id}/,/^# VAGRANT-END:( #{user})? #{id}/ d' -ibak /etc/exports")
101
- end
102
-
103
- def restart_nfs()
104
- if nfs_running?
105
- @machine.communicate.sudo("#{@nfs_apply_command}")
106
- else
107
- @machine.communicate.sudo("#{@nfs_start_command}")
108
- end
109
- end
110
- end
111
- end
112
- end
113
- end
114
- end
115
-
116
-
@@ -1,20 +0,0 @@
1
- require Vagrant.source_root.join("plugins/guests/linux/cap/halt")
2
-
3
- module VagrantPlugins
4
- module SyncedFolderNFSGuest
5
- module Cap
6
- module Linux
7
- class Halt
8
- def self.halt(machine)
9
- # unmount any host mounted NFS folders
10
- folders = machine.config.vm.synced_folders
11
- machine.env.host.unmount_nfs_folders(folders)
12
-
13
- VagrantPlugins::GuestLinux::Cap::Halt.halt(machine)
14
- end
15
- end
16
- end
17
- end
18
- end
19
- end
20
-
@@ -1,29 +0,0 @@
1
- module VagrantPlugins
2
- module SyncedFolderNFSGuest
3
- module Cap
4
- module Linux
5
- class ReadUserIDs
6
- def self.read_uid(machine)
7
- command = "id -u"
8
- result = ""
9
- machine.communicate.execute(command) do |type, data|
10
- result << data if type == :stdout
11
- end
12
-
13
- result.chomp.split("\n").first
14
- end
15
-
16
- def self.read_gid(machine)
17
- command = "id -g"
18
- result = ""
19
- machine.communicate.execute(command) do |type, data|
20
- result << data if type == :stdout
21
- end
22
-
23
- result.chomp.split("\n").first
24
- end
25
- end
26
- end
27
- end
28
- end
29
- end
@@ -1,37 +0,0 @@
1
- module VagrantPlugins
2
- module HostBSD
3
- class Host < Vagrant.plugin("2", :host)
4
- def mount_nfs_folders(id, ips, folders)
5
- @logger.debug "Mounting NFS mounts..."
6
- folders.each do |name, opts|
7
- @logger.info opts
8
- ips.each do |ip|
9
- system("mkdir -p #{opts[:hostpath]}")
10
- mount_command = "mount -t nfs -o noatime '#{ip}:#{opts[:guestpath]}' '#{opts[:hostpath]}'"
11
- if system(mount_command)
12
- break
13
- end
14
- end
15
- end
16
- end
17
-
18
- def unmount_nfs_folders(folders)
19
- @logger.debug "Unmounting NFS mounts..."
20
- folders.each do |name, opts|
21
- if opts[:type] == :nfs_guest
22
- expanded_host_path = `printf #{opts[:hostpath]}`
23
- umount_msg = `umount '#{expanded_host_path}' 2>&1`
24
- @ui.info umount_msg
25
- if $?.exitstatus != 0
26
- if not umount_msg.include? 'not currently mounted'
27
- @ui.info "NFS mounts still in use!"
28
- exit(1)
29
- end
30
- end
31
- end
32
- end
33
- end
34
- end
35
- end
36
- end
37
-
@@ -1,23 +0,0 @@
1
- module Vagrant
2
- module Plugin
3
- module V2
4
- class Host
5
- # Mounts the given hash of folders via the guests NFS export
6
- #
7
- # @param [String] id A unique ID that is guaranteed to be unique to
8
- # match these sets of folders.
9
- # @param [Array<String>] ip IPs of the guest machine.
10
- # @param [Hash] folders Shared folders to sync.
11
- def mount_nfs_folders(id, ips, folders)
12
- end
13
-
14
- # Unmounts the given hash of folders
15
- #
16
- # @param [Hash] folders Shared folders to sync.
17
- def unmount_nfs_folders(folders)
18
- end
19
- end
20
- end
21
- end
22
- end
23
-
data/locales/en.yml DELETED
@@ -1,6 +0,0 @@
1
- en:
2
- vagrant:
3
- config:
4
- nfs_guest:
5
- errors:
6
- no_nfsd: "Guest doesn't have the necessary NFS server installed"