This file is indexed.

/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