convert more hosts: arch and linux
This commit is contained in:
parent
bdb88da743
commit
a6c7cc481e
|
@ -13,32 +13,6 @@ module Vagrant
|
||||||
def detect?
|
def detect?
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns true of false denoting whether or not this host supports
|
|
||||||
# NFS shared folder setup. This method ideally should verify that
|
|
||||||
# NFS is installed.
|
|
||||||
#
|
|
||||||
# @return [Boolean]
|
|
||||||
def nfs?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
# Exports the given hash of folders via NFS.
|
|
||||||
#
|
|
||||||
# @param [String] id A unique ID that is guaranteed to be unique to
|
|
||||||
# match these sets of folders.
|
|
||||||
# @param [String] ip IP of the guest machine.
|
|
||||||
# @param [Hash] folders Shared folders to sync.
|
|
||||||
def nfs_export(id, ip, folders)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Prunes any NFS exports made by Vagrant which aren't in the set
|
|
||||||
# of valid ids given.
|
|
||||||
#
|
|
||||||
# @param [Array<String>] valid_ids Valid IDs that should not be
|
|
||||||
# pruned.
|
|
||||||
def nfs_prune(valid_ids)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
module VagrantPlugins
|
||||||
|
module HostArch
|
||||||
|
module Cap
|
||||||
|
class NFS
|
||||||
|
def self.nfs_check_command(env)
|
||||||
|
if systemd?
|
||||||
|
return "/usr/sbin/systemctl status nfsd"
|
||||||
|
else
|
||||||
|
return "/etc/rc.d/nfs-server status"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.nfs_start_command(env)
|
||||||
|
if systemd?
|
||||||
|
return "/usr/sbin/systemctl start nfsd rpc-idmapd rpc-mountd rpcbind"
|
||||||
|
else
|
||||||
|
return "sh -c 'for s in {rpcbind,nfs-common,nfs-server}; do /etc/rc.d/$s start; done'"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.nfs_installed(environment)
|
||||||
|
Kernel.system("grep -Fq nfs /proc/filesystems")
|
||||||
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
# This tests to see if systemd is used on the system. This is used
|
||||||
|
# in newer versions of Arch, and requires a change in behavior.
|
||||||
|
def self.systemd?
|
||||||
|
`ps -o comm= 1`.chomp == 'systemd'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,46 +1,11 @@
|
||||||
require "vagrant"
|
require "vagrant"
|
||||||
|
|
||||||
require Vagrant.source_root.join("plugins/hosts/linux/host")
|
|
||||||
|
|
||||||
module VagrantPlugins
|
module VagrantPlugins
|
||||||
module HostArch
|
module HostArch
|
||||||
class Host < VagrantPlugins::HostLinux::Host
|
class Host < Vagrant.plugin("2", :host)
|
||||||
def self.match?
|
def detect?(env)
|
||||||
File.exist?("/etc/arch-release")
|
File.exist?("/etc/arch-release")
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.nfs?
|
|
||||||
# HostLinux checks for nfsd which returns false unless the
|
|
||||||
# services are actively started. This leads to a misleading
|
|
||||||
# error message. Checking for nfs (no d) seems to work
|
|
||||||
# regardless. Also fixes useless use of cat, regex, and
|
|
||||||
# redirection.
|
|
||||||
Kernel.system("grep -Fq nfs /proc/filesystems")
|
|
||||||
end
|
|
||||||
|
|
||||||
# Normal, mid-range precedence.
|
|
||||||
def self.precedence
|
|
||||||
5
|
|
||||||
end
|
|
||||||
|
|
||||||
def initialize(*args)
|
|
||||||
super
|
|
||||||
if systemd?
|
|
||||||
@nfs_check_command = "/usr/sbin/systemctl status nfsd"
|
|
||||||
@nfs_start_command = "/usr/sbin/systemctl start nfsd rpc-idmapd rpc-mountd rpcbind"
|
|
||||||
else
|
|
||||||
@nfs_check_command = "/etc/rc.d/nfs-server status"
|
|
||||||
@nfs_start_command = "sh -c 'for s in {rpcbind,nfs-common,nfs-server}; do /etc/rc.d/$s start; done'"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
protected
|
|
||||||
|
|
||||||
# This tests to see if systemd is used on the system. This is used
|
|
||||||
# in newer versions of Arch, and requires a change in behavior.
|
|
||||||
def systemd?
|
|
||||||
`ps -o comm= 1`.chomp == 'systemd'
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,10 +6,32 @@ module VagrantPlugins
|
||||||
name "Arch host"
|
name "Arch host"
|
||||||
description "Arch host support."
|
description "Arch host support."
|
||||||
|
|
||||||
host("arch") do
|
host("arch", "linux") do
|
||||||
require File.expand_path("../host", __FILE__)
|
require_relative "host"
|
||||||
Host
|
Host
|
||||||
end
|
end
|
||||||
|
|
||||||
|
host_capability("arch", "nfs_installed") do
|
||||||
|
require_relative "cap/nfs"
|
||||||
|
Cap::NFS
|
||||||
|
end
|
||||||
|
|
||||||
|
# Linux-specific helpers we need to determine paths that can
|
||||||
|
# be overriden.
|
||||||
|
host_capability("arch", "nfs_apply_command") do
|
||||||
|
require_relative "cap/nfs"
|
||||||
|
Cap::NFS
|
||||||
|
end
|
||||||
|
|
||||||
|
host_capability("arch", "nfs_check_command") do
|
||||||
|
require_relative "cap/nfs"
|
||||||
|
Cap::NFS
|
||||||
|
end
|
||||||
|
|
||||||
|
host_capability("arch", "nfs_start_command") do
|
||||||
|
require_relative "cap/nfs"
|
||||||
|
Cap::NFS
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,126 @@
|
||||||
|
require "vagrant/util"
|
||||||
|
require "vagrant/util/retryable"
|
||||||
|
|
||||||
|
module VagrantPlugins
|
||||||
|
module HostLinux
|
||||||
|
module Cap
|
||||||
|
class NFS
|
||||||
|
extend Vagrant::Util::Retryabe
|
||||||
|
|
||||||
|
def self.nfs_apply_command(env)
|
||||||
|
"/usr/bin/exportfs -r"
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.nfs_check_command(env)
|
||||||
|
"/etc/init.d/nfs-kernel-server status"
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.nfs_start_command(env)
|
||||||
|
"/etc/init.d/nfs-kernel-server start"
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.nfs_export(env, ui, id, ips, folders)
|
||||||
|
# Get some values we need before we do anything
|
||||||
|
nfs_apply_command = env.host.capability(:nfs_apply_command)
|
||||||
|
nfs_check_command = env.host.capability(:nfs_check_command)
|
||||||
|
nfs_start_command = env.host.capability(:nfs_start_command)
|
||||||
|
|
||||||
|
nfs_opts_setup(folders)
|
||||||
|
output = Vagrant::Util::TemplateRenderer.render('nfs/exports_linux',
|
||||||
|
:uuid => id,
|
||||||
|
:ips => ips,
|
||||||
|
:folders => folders,
|
||||||
|
:user => Process.uid)
|
||||||
|
|
||||||
|
ui.info I18n.t("vagrant.hosts.linux.nfs_export")
|
||||||
|
sleep 0.5
|
||||||
|
|
||||||
|
nfs_cleanup(id)
|
||||||
|
|
||||||
|
output.split("\n").each do |line|
|
||||||
|
# This should only ask for administrative permission once, even
|
||||||
|
# though its executed in multiple subshells.
|
||||||
|
system(%Q[sudo su root -c "echo '#{line}' >> /etc/exports"])
|
||||||
|
end
|
||||||
|
|
||||||
|
if nfs_running?(nfs_check_command)
|
||||||
|
system("sudo #{nfs_apply_command}")
|
||||||
|
else
|
||||||
|
system("sudo #{nfs_start_command}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.nfs_installed(environment)
|
||||||
|
retryable(:tries => 10, :on => TypeError) do
|
||||||
|
# Check procfs to see if NFSd is a supported filesystem
|
||||||
|
system("cat /proc/filesystems | grep nfsd > /dev/null 2>&1")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.nfs_prune(environment, ui, valid_ids)
|
||||||
|
return if !File.exist?("/etc/exports")
|
||||||
|
|
||||||
|
logger = Log4r::Logger.new("vagrant::hosts::linux")
|
||||||
|
logger.info("Pruning invalid NFS entries...")
|
||||||
|
|
||||||
|
output = false
|
||||||
|
user = Process.uid
|
||||||
|
|
||||||
|
File.read("/etc/exports").lines.each do |line|
|
||||||
|
if id = line[/^# VAGRANT-BEGIN:( #{user})? ([A-Za-z0-9-]+?)$/, 2]
|
||||||
|
if valid_ids.include?(id)
|
||||||
|
logger.debug("Valid ID: #{id}")
|
||||||
|
else
|
||||||
|
if !output
|
||||||
|
# We want to warn the user but we only want to output once
|
||||||
|
ui.info I18n.t("vagrant.hosts.linux.nfs_prune")
|
||||||
|
output = true
|
||||||
|
end
|
||||||
|
|
||||||
|
logger.info("Invalid ID, pruning: #{id}")
|
||||||
|
nfs_cleanup(id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def self.nfs_cleanup(id)
|
||||||
|
return if !File.exist?("/etc/exports")
|
||||||
|
|
||||||
|
user = Process.uid
|
||||||
|
|
||||||
|
# Use sed to just strip out the block of code which was inserted
|
||||||
|
# by Vagrant
|
||||||
|
system("sudo sed -r -e '/^# VAGRANT-BEGIN:( #{user})? #{id}/,/^# VAGRANT-END:( #{user})? #{id}/ d' -ibak /etc/exports")
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.nfs_opts_setup(folders)
|
||||||
|
folders.each do |k, opts|
|
||||||
|
if !opts[:linux__nfs_options]
|
||||||
|
opts[:linux__nfs_options] ||= ["rw", "no_subtree_check", "all_squash"]
|
||||||
|
end
|
||||||
|
|
||||||
|
# Only automatically set anonuid/anongid if they weren't
|
||||||
|
# explicitly set by the user.
|
||||||
|
hasgid = false
|
||||||
|
hasuid = false
|
||||||
|
opts[:linux__nfs_options].each do |opt|
|
||||||
|
hasgid = !!(opt =~ /^anongid=/) if !hasgid
|
||||||
|
hasuid = !!(opt =~ /^anonuid=/) if !hasuid
|
||||||
|
end
|
||||||
|
|
||||||
|
opts[:linux__nfs_options] << "anonuid=#{opts[:map_uid]}" if !hasuid
|
||||||
|
opts[:linux__nfs_options] << "anongid=#{opts[:map_gid]}" if !hasgid
|
||||||
|
opts[:linux__nfs_options] << "fsid=#{opts[:uuid]}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.nfs_running?(check_command)
|
||||||
|
system(check_command)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,128 +1,12 @@
|
||||||
require 'log4r'
|
|
||||||
|
|
||||||
require "vagrant"
|
require "vagrant"
|
||||||
require 'vagrant/util/platform'
|
|
||||||
|
|
||||||
module VagrantPlugins
|
module VagrantPlugins
|
||||||
module HostLinux
|
module HostLinux
|
||||||
# Represents a Linux based host, such as Ubuntu.
|
# Represents a Linux based host, such as Ubuntu.
|
||||||
class Host < Vagrant.plugin("2", :host)
|
class Host < Vagrant.plugin("2", :host)
|
||||||
include Vagrant::Util
|
def self.detect?(env)
|
||||||
include Vagrant::Util::Retryable
|
|
||||||
|
|
||||||
def self.match?
|
|
||||||
Vagrant::Util::Platform.linux?
|
Vagrant::Util::Platform.linux?
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.precedence
|
|
||||||
# Set a lower precedence because this is a generic OS. We
|
|
||||||
# want specific distros to match first.
|
|
||||||
2
|
|
||||||
end
|
|
||||||
|
|
||||||
def initialize(*args)
|
|
||||||
super
|
|
||||||
|
|
||||||
@logger = Log4r::Logger.new("vagrant::hosts::linux")
|
|
||||||
@nfs_apply_command = "/usr/sbin/exportfs -r"
|
|
||||||
@nfs_check_command = "/etc/init.d/nfs-kernel-server status"
|
|
||||||
@nfs_start_command = "/etc/init.d/nfs-kernel-server start"
|
|
||||||
end
|
|
||||||
|
|
||||||
def nfs?
|
|
||||||
retryable(:tries => 10, :on => TypeError) do
|
|
||||||
# Check procfs to see if NFSd is a supported filesystem
|
|
||||||
system("cat /proc/filesystems | grep nfsd > /dev/null 2>&1")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def nfs_opts_setup(folders)
|
|
||||||
folders.each do |k, opts|
|
|
||||||
if !opts[:linux__nfs_options]
|
|
||||||
opts[:linux__nfs_options] ||= ["rw", "no_subtree_check", "all_squash"]
|
|
||||||
end
|
|
||||||
|
|
||||||
# Only automatically set anonuid/anongid if they weren't
|
|
||||||
# explicitly set by the user.
|
|
||||||
hasgid = false
|
|
||||||
hasuid = false
|
|
||||||
opts[:linux__nfs_options].each do |opt|
|
|
||||||
hasgid = !!(opt =~ /^anongid=/) if !hasgid
|
|
||||||
hasuid = !!(opt =~ /^anonuid=/) if !hasuid
|
|
||||||
end
|
|
||||||
|
|
||||||
opts[:linux__nfs_options] << "anonuid=#{opts[:map_uid]}" if !hasuid
|
|
||||||
opts[:linux__nfs_options] << "anongid=#{opts[:map_gid]}" if !hasgid
|
|
||||||
opts[:linux__nfs_options] << "fsid=#{opts[:uuid]}"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def nfs_export(id, ips, folders)
|
|
||||||
nfs_opts_setup(folders)
|
|
||||||
output = TemplateRenderer.render('nfs/exports_linux',
|
|
||||||
:uuid => id,
|
|
||||||
:ips => ips,
|
|
||||||
:folders => folders,
|
|
||||||
:user => Process.uid)
|
|
||||||
|
|
||||||
@ui.info I18n.t("vagrant.hosts.linux.nfs_export")
|
|
||||||
sleep 0.5
|
|
||||||
|
|
||||||
nfs_cleanup(id)
|
|
||||||
|
|
||||||
output.split("\n").each do |line|
|
|
||||||
# This should only ask for administrative permission once, even
|
|
||||||
# though its executed in multiple subshells.
|
|
||||||
system(%Q[sudo su root -c "echo '#{line}' >> /etc/exports"])
|
|
||||||
end
|
|
||||||
|
|
||||||
if nfs_running?
|
|
||||||
system("sudo #{@nfs_apply_command}")
|
|
||||||
else
|
|
||||||
system("sudo #{@nfs_start_command}")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def nfs_prune(valid_ids)
|
|
||||||
return if !File.exist?("/etc/exports")
|
|
||||||
|
|
||||||
@logger.info("Pruning invalid NFS entries...")
|
|
||||||
|
|
||||||
output = false
|
|
||||||
user = Process.uid
|
|
||||||
|
|
||||||
File.read("/etc/exports").lines.each do |line|
|
|
||||||
if id = line[/^# VAGRANT-BEGIN:( #{user})? ([A-Za-z0-9-]+?)$/, 2]
|
|
||||||
if valid_ids.include?(id)
|
|
||||||
@logger.debug("Valid ID: #{id}")
|
|
||||||
else
|
|
||||||
if !output
|
|
||||||
# We want to warn the user but we only want to output once
|
|
||||||
@ui.info I18n.t("vagrant.hosts.linux.nfs_prune")
|
|
||||||
output = true
|
|
||||||
end
|
|
||||||
|
|
||||||
@logger.info("Invalid ID, pruning: #{id}")
|
|
||||||
nfs_cleanup(id)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
protected
|
|
||||||
|
|
||||||
def nfs_running?
|
|
||||||
system("#{@nfs_check_command}")
|
|
||||||
end
|
|
||||||
|
|
||||||
def nfs_cleanup(id)
|
|
||||||
return if !File.exist?("/etc/exports")
|
|
||||||
|
|
||||||
user = Process.uid
|
|
||||||
# Use sed to just strip out the block of code which was inserted
|
|
||||||
# by Vagrant
|
|
||||||
system("sudo sed -r -e '/^# VAGRANT-BEGIN:( #{user})? #{id}/,/^# VAGRANT-END:( #{user})? #{id}/ d' -ibak /etc/exports")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,9 +7,41 @@ module VagrantPlugins
|
||||||
description "Linux host support."
|
description "Linux host support."
|
||||||
|
|
||||||
host("linux") do
|
host("linux") do
|
||||||
require File.expand_path("../host", __FILE__)
|
require_relative "host"
|
||||||
Host
|
Host
|
||||||
end
|
end
|
||||||
|
|
||||||
|
host_capability("linux", "nfs_export") do
|
||||||
|
require_relative "cap/nfs"
|
||||||
|
Cap::NFS
|
||||||
|
end
|
||||||
|
|
||||||
|
host_capability("linux", "nfs_installed") do
|
||||||
|
require_relative "cap/nfs"
|
||||||
|
Cap::NFS
|
||||||
|
end
|
||||||
|
|
||||||
|
host_capability("linux", "nfs_prune") do
|
||||||
|
require_relative "cap/nfs"
|
||||||
|
Cap::NFS
|
||||||
|
end
|
||||||
|
|
||||||
|
# Linux-specific helpers we need to determine paths that can
|
||||||
|
# be overriden.
|
||||||
|
host_capability("linux", "nfs_apply_command") do
|
||||||
|
require_relative "cap/nfs"
|
||||||
|
Cap::NFS
|
||||||
|
end
|
||||||
|
|
||||||
|
host_capability("linux", "nfs_check_command") do
|
||||||
|
require_relative "cap/nfs"
|
||||||
|
Cap::NFS
|
||||||
|
end
|
||||||
|
|
||||||
|
host_capability("linux", "nfs_start_command") do
|
||||||
|
require_relative "cap/nfs"
|
||||||
|
Cap::NFS
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue