vagrant-libvirt 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # 0.0.6 (Jul 24, 2013)
2
+
3
+ * Synced folder via NFS support.
4
+ * Routed private network support.
5
+ * Configurable ssh parameters in Vagrantfile via `config.ssh.*`.
6
+ * Fixed uploading base box image to storage pool bug (buffer was too big).
7
+
1
8
  # 0.0.5 (May 10, 2013)
2
9
 
3
10
  * Private networks support.
data/README.md CHANGED
@@ -4,12 +4,12 @@ This is a [Vagrant](http://www.vagrantup.com) 1.1+ plugin that adds an
4
4
  [Libvirt](http://libvirt.org) provider to Vagrant, allowing Vagrant to
5
5
  control and provision machines via Libvirt toolkit.
6
6
 
7
- **Note:** Actual version (0.0.5) is still a development one. Feedback is
7
+ **Note:** Actual version (0.0.6) is still a development one. Feedback is
8
8
  welcome and can help a lot :-)
9
9
 
10
- ## Features (Version 0.0.5)
10
+ ## Features (Version 0.0.6)
11
11
 
12
- * Controll local or remote Libvirt hypervisors.
12
+ * Controll local Libvirt hypervisors.
13
13
  * Vagrant `up`, `destroy`, `suspend`, `resume`, `halt`, `ssh` and `provision` commands.
14
14
  * Upload box image (qcow2 format) to Libvirt storage pool.
15
15
  * Create volume as COW diff image for domains.
@@ -18,7 +18,7 @@ welcome and can help a lot :-)
18
18
  * SSH into domains.
19
19
  * Setup hostname and network interfaces.
20
20
  * Provision domains with any built-in Vagrant provisioner.
21
- * Minimal synced folder support via `rsync`.
21
+ * Synced folder support via `rsync` or `nfs`.
22
22
 
23
23
  ## Future work
24
24
 
@@ -66,6 +66,11 @@ centos64 box and setup with 10.20.30.40 IP address.
66
66
 
67
67
  ```ruby
68
68
  Vagrant.configure("2") do |config|
69
+
70
+ # If you are still using old centos box, you have to setup root username for
71
+ # ssh access. Read more in section 'SSH Access To VM'.
72
+ config.ssh.username = "root"
73
+
69
74
  config.vm.define :test_vm do |test_vm|
70
75
  test_vm.vm.box = "centos64"
71
76
  test_vm.vm.network :private_network, :ip => '10.20.30.40'
@@ -110,6 +115,7 @@ Vagrant.configure("2") do |config|
110
115
  dbserver.vm.provider :libvirt do |domain|
111
116
  domain.memory = 2048
112
117
  domain.cpus = 2
118
+ domain.nested = true
113
119
  end
114
120
  end
115
121
 
@@ -153,7 +159,7 @@ An examples of network interface definitions:
153
159
 
154
160
  ```ruby
155
161
  config.vm.define :test_vm1 do |test_vm1|
156
- test_vm1.vm.network :private_network, :ip => '10.20.30.40'
162
+ test_vm1.vm.network :private_network, :ip => "10.20.30.40",
157
163
  end
158
164
  ```
159
165
 
@@ -178,14 +184,18 @@ starts with 'libvirt__' string. Here is a list of those options:
178
184
  network 'default' is used.
179
185
  * `:libvirt__netmask` - Used only together with `:ip` option. Default is
180
186
  '255.255.255.0'.
181
- * `:libvirt__nat_interface` - Name of interface, where should network be
182
- NATed. Used only when creating new network. By default, all physical
183
- interfaces are used.
184
- * `:libvirt__isolated` - If network should be isolated - without NAT to outside.
185
- Used only when creating new network. Default is set to false.
186
187
  * `:libvirt__dhcp_enabled` - If DHCP will offer addresses, or not. Used only
187
188
  when creating new network. Default is true.
188
189
  * `:libvirt__adapter` - Number specifiyng sequence number of interface.
190
+ * `:libvirt__forward_mode` - Specify one of `none`, `nat` or `route` options.
191
+ This option is used only when creating new network. Mode `none` will create
192
+ isolated network without NATing or routing outside. You will want to use
193
+ NATed forwarding typically to reach networks outside of hypervisor. Routed
194
+ forwarding is typically useful to reach other networks within hypervisor.
195
+ By default, option `nat` is used.
196
+ * `:libvirt__forward_device` - Name of interface/device, where network should
197
+ be forwarded (NATed or routed). Used only when creating new network. By
198
+ default, all physical interfaces are used.
189
199
 
190
200
  ## Obtaining Domain IP Address
191
201
 
@@ -197,6 +207,24 @@ makes lease information public in `/var/lib/libvirt/dnsmasq` directory, or in
197
207
  information like which MAC address has which IP address resides and it's parsed
198
208
  by vagrant-libvirt plugin.
199
209
 
210
+ ## SSH Access To VM
211
+
212
+ There are some configuration options for ssh access to VM via `config.ssh.*` in
213
+ Vagrantfile. Untill provider version 0.0.5, root user was hardcoded and used to
214
+ access VMs ssh. Now, vagrant user is used by default, but it's configurable via
215
+ `config.ssh.username` option in Vagrantfile now.
216
+
217
+ If you are still using CentOS 6.4 box from example in this README, please set
218
+ ssh username back to root, because user vagrant is not usable (I forgot to add
219
+ necessary ssh key to his authorized_keys).
220
+
221
+ Configurable ssh parameters in Vagrantfile after provider version 0.0.5 are:
222
+
223
+ * `config.ssh.username` - Default is username vagrant.
224
+ * `config.ssh.guest_port` - Default port is set to 22.
225
+ * `config.ssh.forward_agent` - Default is false.
226
+ * `config.ssh.forward_x11` - Default is false.
227
+
200
228
  ## Synced Folders
201
229
 
202
230
  There is minimal support for synced folders. Upon `vagrant up`, the Libvirt
@@ -206,6 +234,8 @@ to the remote machine over SSH.
206
234
  This is good enough for all built-in Vagrant provisioners (shell,
207
235
  chef, and puppet) to work!
208
236
 
237
+ If used options `:nfs => true`, folder will exported by nfs.
238
+
209
239
  ## Box Format
210
240
 
211
241
  You can view an example box in the [example_box/directory](https://github.com/pradels/vagrant-libvirt/tree/master/example_box). That directory also contains instructions on how to build a box.
@@ -7,13 +7,25 @@ Vagrant.configure("2") do |config|
7
7
  #
8
8
  #config.vm.define :test_vm do |test_vm|
9
9
  # Box name
10
+ #
10
11
  #test_vm.vm.box = "centos64"
11
12
 
13
+ # Domain Specific Options
14
+ #
15
+ # See README for more info.
16
+ #
17
+ #test_vm.vm.provider :libvirt do |domain|
18
+ # domain.memory = 2048
19
+ # domain.cpus = 2
20
+ #end
21
+
12
22
  # Interfaces for VM
13
23
  #
14
- # Hostonly network is not supported in this version of provider. Bridged
15
- # interface with network id specified can be created.
16
- #test_vm.vm.network :bridged, :bridge => "default", :adapter => 1
24
+ # Networking features in the form of `config.vm.network` support private
25
+ # networks concept. No public network or port forwarding are supported in
26
+ # current version of provider. See README for more info.
27
+ #
28
+ #test_vm.vm.network :private_network, :ip => '10.20.30.40'
17
29
  #end
18
30
 
19
31
  # Options for libvirt vagrant provider.
@@ -24,6 +24,10 @@ module VagrantPlugins
24
24
  b2.use TimedProvision
25
25
  b2.use CreateNetworks
26
26
  b2.use CreateNetworkInterfaces
27
+
28
+ b2.use NFS
29
+ b2.use PrepareNFSSettings
30
+ b2.use ShareFolders
27
31
  b2.use SetHostname
28
32
  b2.use StartDomain
29
33
  b2.use WaitTillUp
@@ -100,6 +104,7 @@ module VagrantPlugins
100
104
  end
101
105
 
102
106
  b2.use ConnectLibvirt
107
+ b2.use PruneNFSExports
103
108
  b2.use DestroyDomain
104
109
  b2.use DestroyNetworks
105
110
  end
@@ -274,6 +279,9 @@ module VagrantPlugins
274
279
  autoload :WaitTillUp, action_root.join("wait_till_up")
275
280
  autoload :SyncFolders, action_root.join("sync_folders")
276
281
  autoload :SSHRun, "vagrant/action/builtin/ssh_run"
282
+ autoload :PrepareNFSSettings, action_root.join("prepare_nfs_settings")
283
+ autoload :PruneNFSExports, action_root.join("prune_nfs_exports")
284
+ autoload :ShareFolders, action_root.join("share_folders")
277
285
  end
278
286
  end
279
287
  end
@@ -18,7 +18,7 @@ module VagrantPlugins
18
18
  env[:libvirt_compute] = Libvirt.libvirt_connection
19
19
  return @app.call(env)
20
20
  end
21
-
21
+
22
22
  # Get config options for libvirt provider.
23
23
  config = env[:machine].provider_config
24
24
 
@@ -38,7 +38,7 @@ module VagrantPlugins
38
38
  else
39
39
  uri << '://'
40
40
  uri << config.host if config.host
41
- end
41
+ end
42
42
  uri << '/system?no_verify=1'
43
43
 
44
44
  conn_attr = {}
@@ -46,7 +46,7 @@ module VagrantPlugins
46
46
  conn_attr[:libvirt_uri] = uri
47
47
  conn_attr[:libvirt_username] = config.username if config.username
48
48
  conn_attr[:libvirt_password] = config.password if config.password
49
-
49
+
50
50
  # Setup command for retrieving IP address for newly created machine
51
51
  # with some MAC address. Get it from dnsmasq leases table - either
52
52
  # /var/lib/libvirt/dnsmasq/*.leases files, or
@@ -54,7 +54,7 @@ module VagrantPlugins
54
54
  ip_command = "LEASES='/var/lib/libvirt/dnsmasq/*.leases'; "
55
55
  ip_command << "[ -f /var/lib/misc/dnsmasq.leases ] && "
56
56
  ip_command << "LEASES='/var/lib/misc/dnsmasq.leases'; "
57
- ip_command << "cat $LEASES | grep $mac | awk '{ print $3 }'"
57
+ ip_command << "grep $mac $LEASES | awk '{ print $3 }'"
58
58
  conn_attr[:libvirt_ip_command] = ip_command
59
59
 
60
60
  @logger.info("Connecting to Libvirt (#{uri}) ...")
@@ -123,7 +123,7 @@ module VagrantPlugins
123
123
 
124
124
  env[:ui].info I18n.t("vagrant.actions.vm.network.configuring")
125
125
  env[:machine].guest.capability(
126
- :configure_networks, networks_to_configure)
126
+ :configure_networks, networks_to_configure)
127
127
  end
128
128
 
129
129
  private
@@ -45,6 +45,8 @@ module VagrantPlugins
45
45
  @options = scoped_hash_override(options, :libvirt)
46
46
  @options = {
47
47
  :netmask => '255.255.255.0',
48
+ :dhcp_enabled => true,
49
+ :forward_mode => 'nat',
48
50
  }.merge(@options)
49
51
 
50
52
  # Prepare a hash describing network for this specific interface.
@@ -201,14 +203,9 @@ module VagrantPlugins
201
203
  @network_address = @interface_network[:ip_address]
202
204
  @network_netmask = @interface_network[:netmask]
203
205
 
204
- if @options[:isolated]
205
- @network_forward_mode = false
206
- else
207
- @network_forward_mode = 'nat'
208
-
209
- if @options[:nat_interface]
210
- @network_nat_interface = @options[:nat_interface]
211
- end
206
+ @network_forward_mode = @options[:forward_mode]
207
+ if @options[:forward_device]
208
+ @network_forward_device = @options[:forward_device]
212
209
  end
213
210
 
214
211
  if @options[:dhcp_enabled]
@@ -96,7 +96,14 @@ module VagrantPlugins
96
96
  volume = pool.lookup_volume_by_name(volume_name)
97
97
  stream = env[:libvirt_compute].client.stream
98
98
  volume.upload(stream, offset=0, length=image_size)
99
- buf_size = 1024*1024 # 1M
99
+
100
+ # Exception Libvirt::RetrieveError can be raised if buffer is
101
+ # longer than length accepted by API send function.
102
+ #
103
+ # TODO: How to find out if buffer is too large and what is the
104
+ # length that send function will accept?
105
+
106
+ buf_size = 1024*250 # 250K
100
107
  progress = 0
101
108
  open(image_file, 'rb') do |io|
102
109
  while (buff = io.read(buf_size)) do
@@ -0,0 +1,66 @@
1
+ require 'nokogiri'
2
+ module VagrantPlugins
3
+ module Libvirt
4
+ module Action
5
+ class PrepareNFSSettings
6
+ def initialize(app,env)
7
+ @app = app
8
+ @logger = Log4r::Logger.new("vagrant::action::vm::nfs")
9
+ end
10
+
11
+ def call(env)
12
+ @app.call(env)
13
+
14
+ using_nfs = false
15
+ env[:machine].config.vm.synced_folders.each do |id, opts|
16
+ if opts[:nfs]
17
+ using_nfs = true
18
+ break
19
+ end
20
+ end
21
+
22
+ if using_nfs
23
+ @logger.info("Using NFS, preparing NFS settings by reading host IP and machine IP")
24
+ env[:nfs_host_ip] = read_host_ip(env[:machine],env)
25
+ env[:nfs_machine_ip] = env[:machine].ssh_info[:host]
26
+
27
+ raise Vagrant::Errors::NFSNoHostonlyNetwork if !env[:nfs_machine_ip]
28
+ end
29
+ end
30
+
31
+ # Returns the IP address of the first host only network adapter
32
+ #
33
+ # @param [Machine] machine
34
+ # @return [String]
35
+ def read_host_ip(machine,env)
36
+ nets = env[:libvirt_compute].list_networks
37
+ if nets.size == 1
38
+ net = nets.first
39
+ else
40
+ domain = env[:libvirt_compute].servers.get(machine.id.to_s)
41
+ xml=Nokogiri::XML(domain.to_xml)
42
+ networkname = xml.xpath('/domain/devices/interface/source').first.attributes['network'].value.to_s
43
+ puts "network name = #{networkname}"
44
+ net = env[:libvirt_compute].list_networks.find {|netw| netw[:name] == networkname}
45
+ end
46
+ # FIXME better implement by libvirt xml parsing
47
+ `ip addr show | grep -A 2 #{net[:bridge_name]} | grep -i 'inet ' | tr -s ' ' | cut -d' ' -f3 | cut -d'/' -f 1`.chomp
48
+ end
49
+
50
+ # Returns the IP address of the guest by looking at the first
51
+ # enabled host only network.
52
+ #
53
+ # @return [String]
54
+ def read_machine_ip(machine)
55
+ machine.config.vm.networks.each do |type, options|
56
+ if type == :private_network && options[:ip].is_a?(String)
57
+ return options[:ip]
58
+ end
59
+ end
60
+
61
+ nil
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,26 @@
1
+ require 'yaml'
2
+ module VagrantPlugins
3
+ module Libvirt
4
+ module Action
5
+ class PruneNFSExports
6
+
7
+ def initialize(app, env)
8
+ @app = app
9
+ end
10
+
11
+ def call(env)
12
+ if env[:host]
13
+ uuid = env[:machine].id
14
+ # get all uuids
15
+ uuids = env[:libvirt_compute].servers.all.map(&:id)
16
+ # not exiisted in array will removed from nfs
17
+ uuids.delete(uuid)
18
+ env[:host].nfs_prune(uuids)
19
+ end
20
+
21
+ @app.call(env)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -40,15 +40,19 @@ module VagrantPlugins
40
40
  }
41
41
  raise Errors::NoIpAddressError if not ip_address
42
42
 
43
- # Return the info
44
- # TODO: Some info should be configurable in Vagrantfile
45
- return {
43
+ ssh_info = {
46
44
  :host => ip_address,
47
- :port => 22,
48
- :username => 'root',
49
- :forward_agent => true,
50
- :forward_x11 => true,
45
+ :port => machine.config.ssh.guest_port,
46
+ :username => machine.config.ssh.username,
47
+ :forward_agent => machine.config.ssh.forward_agent,
48
+ :forward_x11 => machine.config.ssh.forward_x11,
51
49
  }
50
+
51
+ if not ssh_info[:username]
52
+ ssh_info[:username] = machine.config.ssh.default.username
53
+ end
54
+
55
+ ssh_info
52
56
  end
53
57
  end
54
58
  end
@@ -0,0 +1,76 @@
1
+ require "pathname"
2
+
3
+ require "log4r"
4
+
5
+ module VagrantPlugins
6
+ module Libvirt
7
+ module Action
8
+ class ShareFolders
9
+ def initialize(app, env)
10
+ @logger = Log4r::Logger.new("vagrant::action::vm::share_folders")
11
+ @app = app
12
+ end
13
+
14
+ def call(env)
15
+ @env = env
16
+
17
+ prepare_folders
18
+ create_metadata
19
+
20
+ @app.call(env)
21
+ end
22
+
23
+ # This method returns an actual list of shared
24
+ # folders to create and their proper path.
25
+ def shared_folders
26
+ {}.tap do |result|
27
+ @env[:machine].config.vm.synced_folders.each do |id, data|
28
+ # Ignore NFS shared folders
29
+ next if !data[:nfs]
30
+
31
+ # convert to NFS share
32
+ #data[:nfs] = true
33
+
34
+ # This to prevent overwriting the actual shared folders data
35
+ result[id] = data.dup
36
+ end
37
+ end
38
+ end
39
+
40
+ # Prepares the shared folders by verifying they exist and creating them
41
+ # if they don't.
42
+ def prepare_folders
43
+ shared_folders.each do |id, options|
44
+ hostpath = Pathname.new(options[:hostpath]).expand_path(@env[:root_path])
45
+
46
+ if !hostpath.directory? && options[:create]
47
+ # Host path doesn't exist, so let's create it.
48
+ @logger.debug("Host path doesn't exist, creating: #{hostpath}")
49
+
50
+ begin
51
+ hostpath.mkpath
52
+ rescue Errno::EACCES
53
+ raise Vagrant::Errors::SharedFolderCreateFailed,
54
+ :path => hostpath.to_s
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ def create_metadata
61
+ @env[:ui].info I18n.t("vagrant.actions.vm.share_folders.creating")
62
+
63
+ folders = []
64
+ shared_folders.each do |id, data|
65
+ folders << {
66
+ :name => id,
67
+ :hostpath => File.expand_path(data[:hostpath], @env[:root_path]),
68
+ :transient => data[:transient]
69
+ }
70
+ end
71
+ end
72
+
73
+ end
74
+ end
75
+ end
76
+ end
@@ -18,6 +18,7 @@ module VagrantPlugins
18
18
  ssh_info = env[:machine].ssh_info
19
19
 
20
20
  env[:machine].config.vm.synced_folders.each do |id, data|
21
+ next if data[:nfs]
21
22
  hostpath = File.expand_path(data[:hostpath], env[:root_path])
22
23
  guestpath = data[:guestpath]
23
24
 
@@ -25,7 +25,7 @@ module VagrantPlugins
25
25
  end
26
26
 
27
27
  class ImageUploadError < VagrantLibvirtError
28
- error_key(:image_upload_error_error)
28
+ error_key(:image_upload_error)
29
29
  end
30
30
 
31
31
 
@@ -9,6 +9,7 @@ module VagrantPlugins
9
9
  class Provider < Vagrant.plugin('2', :provider)
10
10
  def initialize(machine)
11
11
  @machine = machine
12
+ raise 'REQUIRE USE RUBY >= 1.9.3 VERSION' if RUBY_VERSION < '1.9.3'
12
13
  end
13
14
 
14
15
  # This should return an action callable for the given name.
@@ -2,9 +2,9 @@
2
2
  <name><%= @network_name %></name>
3
3
  <bridge name="<%= @network_bridge_name %>" />
4
4
 
5
- <% if @network_forward_mode != false %>
6
- <% if @network_nat_interface %>
7
- <forward mode="<%= @network_forward_mode %>" dev="<%= @network_nat_interface %>" />
5
+ <% if @network_forward_mode != 'none' %>
6
+ <% if @network_forward_device %>
7
+ <forward mode="<%= @network_forward_mode %>" dev="<%= @network_forward_device %>" />
8
8
  <% else %>
9
9
  <forward mode="<%= @network_forward_mode %>" />
10
10
  <% end %>
@@ -1,5 +1,5 @@
1
1
  module VagrantPlugins
2
2
  module Libvirt
3
- VERSION = "0.0.5"
3
+ VERSION = "0.0.6"
4
4
  end
5
5
  end
@@ -10,7 +10,7 @@
10
10
  # For more info about creating custom box refer to
11
11
  # https://github.com/pradels/vagrant-libvirt/tree/master/example_box
12
12
 
13
- # We need a hostname.
13
+ # We need to set a hostname.
14
14
  if [ $# -ne 1 ]; then
15
15
  echo "Usage: $0 <hostname>"
16
16
  echo "Hostname should be in format vagrant-[os-name], e.g. vagrant-redhat63."
@@ -75,7 +75,7 @@ sed -i 's/Defaults\s*requiretty/Defaults !requiretty/' /etc/sudoers
75
75
 
76
76
 
77
77
  # SSH setup
78
- # Add Vagrant ssh key for root accout.
78
+ # Add Vagrant ssh key for root and vagrant accouts.
79
79
  sed -i 's/.*UseDNS.*/UseDNS no/' /etc/ssh/sshd_config
80
80
 
81
81
  [ -d ~root/.ssh ] || mkdir ~root/.ssh
@@ -85,6 +85,13 @@ ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7
85
85
  EOF
86
86
  chmod 600 ~root/.ssh/authorized_keys
87
87
 
88
+ [ -d ~vagrant/.ssh ] || mkdir ~vagrant/.ssh
89
+ chmod 700 ~vagrant/.ssh
90
+ cat > ~vagrant/.ssh/authorized_keys << EOF
91
+ ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key
92
+ EOF
93
+ chmod 600 ~vagrant/.ssh/authorized_keys
94
+
88
95
 
89
96
  # Disable firewall and switch SELinux to permissive mode.
90
97
  chkconfig iptables off
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-libvirt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-10 00:00:00.000000000 Z
12
+ date: 2013-07-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fog
@@ -94,10 +94,13 @@ files:
94
94
  - lib/vagrant-libvirt/action/message_not_created.rb
95
95
  - lib/vagrant-libvirt/action/message_not_running.rb
96
96
  - lib/vagrant-libvirt/action/message_not_suspended.rb
97
+ - lib/vagrant-libvirt/action/prepare_nfs_settings.rb
98
+ - lib/vagrant-libvirt/action/prune_nfs_exports.rb
97
99
  - lib/vagrant-libvirt/action/read_ssh_info.rb
98
100
  - lib/vagrant-libvirt/action/read_state.rb
99
101
  - lib/vagrant-libvirt/action/resume_domain.rb
100
102
  - lib/vagrant-libvirt/action/set_name_of_domain.rb
103
+ - lib/vagrant-libvirt/action/share_folders.rb
101
104
  - lib/vagrant-libvirt/action/start_domain.rb
102
105
  - lib/vagrant-libvirt/action/suspend_domain.rb
103
106
  - lib/vagrant-libvirt/action/sync_folders.rb