/usr/share/rubygems-integration/all/gems/vagrant-libvirt-0.0.43/lib/vagrant-libvirt/cap/synced_folder.rb is in vagrant-libvirt 0.0.43-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | require 'log4r'
require 'ostruct'
require 'nokogiri'
require 'digest/md5'
require 'vagrant/util/subprocess'
require 'vagrant/errors'
require 'vagrant-libvirt/errors'
# require_relative "helper"
module VagrantPlugins
module SyncedFolder9p
class SyncedFolder < Vagrant.plugin('2', :synced_folder)
include Vagrant::Util
include VagrantPlugins::ProviderLibvirt::Util::ErbTemplate
def initialize(*args)
super
@logger = Log4r::Logger.new('vagrant_libvirt::synced_folders::9p')
end
def usable?(machine, _raise_error = false)
# bail now if not using libvirt since checking version would throw error
return false unless machine.provider_name == :libvirt
# <filesystem/> support in device attach/detach introduced in 1.2.2
# version number format is major * 1,000,000 + minor * 1,000 + release
libvirt_version = machine.provider.driver.connection.client.libversion
libvirt_version >= 1_002_002
end
def prepare(machine, folders, _opts)
raise Vagrant::Errors::Error('No libvirt connection') if machine.provider.driver.connection.nil?
@conn = machine.provider.driver.connection.client
begin
# loop through folders
folders.each do |id, folder_opts|
folder_opts.merge!(target: id,
accessmode: 'passthrough',
mount: true,
readonly: nil) { |_k, ov, _nv| ov }
mount_tag = Digest::MD5.new.update(folder_opts[:hostpath]).to_s[0, 31]
folder_opts[:mount_tag] = mount_tag
machine.ui.info "================\nMachine id: #{machine.id}\nShould be mounting folders\n #{id}, opts: #{folder_opts}"
#xml = to_xml('filesystem', folder_opts)
xml = Nokogiri::XML::Builder.new do |xml|
xml.filesystem(type: 'mount', accessmode: folder_opts[:accessmode]) do
xml.driver(type: 'path', wrpolicy: 'immediate')
xml.source(dir: folder_opts[:hostpath])
xml.target(dir: mount_tag)
xml.readonly unless folder_opts[:readonly].nil?
end
end.to_xml(
save_with: Nokogiri::XML::Node::SaveOptions::NO_DECLARATION |
Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS |
Nokogiri::XML::Node::SaveOptions::FORMAT
)
# puts "<<<<< XML:\n #{xml}\n >>>>>"
@conn.lookup_domain_by_uuid(machine.id).attach_device(xml, 0)
end
rescue => e
machine.ui.error("could not attach device because: #{e}")
raise VagrantPlugins::ProviderLibvirt::Errors::AttachDeviceError,
error_message: e.message
end
end
# TODO: once up, mount folders
def enable(machine, folders, _opts)
# Go through each folder and mount
machine.ui.info('mounting p9 share in guest')
# Only mount folders that have a guest path specified.
mount_folders = {}
folders.each do |id, opts|
next unless opts[:mount] && opts[:guestpath] && !opts[:guestpath].empty?
mount_folders[id] = opts.dup
# merge common options if not given
mount_folders[id].merge!(version: '9p2000.L') { |_k, ov, _nv| ov }
end
# Mount the actual folder
machine.guest.capability(
:mount_p9_shared_folder, mount_folders
)
end
def cleanup(machine, _opts)
if machine.provider.driver.connection.nil?
raise Vagrant::Errors::Error('No libvirt connection')
end
@conn = machine.provider.driver.connection.client
begin
if machine.id && machine.id != ''
dom = @conn.lookup_domain_by_uuid(machine.id)
Nokogiri::XML(dom.xml_desc).xpath(
'/domain/devices/filesystem'
).each do |xml|
dom.detach_device(xml.to_s)
machine.ui.info 'Cleaned up shared folders'
end
end
rescue => e
machine.ui.error("could not detach device because: #{e}")
raise VagrantPlugins::ProviderLibvirt::Errors::DetachDeviceError,
error_message: e.message
end
end
end
end
end
|