of `args` itself and as an element inside of an `args` array. Added validation around passing in arrays for arguments. Just knowing that it is an array is not enough, because arrays can contain any other type.
84 lines
2.5 KiB
Ruby
84 lines
2.5 KiB
Ruby
require 'uri'
|
|
|
|
module VagrantPlugins
|
|
module Shell
|
|
class Config < Vagrant.plugin("2", :config)
|
|
attr_accessor :inline
|
|
attr_accessor :path
|
|
attr_accessor :upload_path
|
|
attr_accessor :args
|
|
attr_accessor :privileged
|
|
attr_accessor :binary
|
|
attr_accessor :keep_color
|
|
|
|
def initialize
|
|
@args = UNSET_VALUE
|
|
@inline = UNSET_VALUE
|
|
@path = UNSET_VALUE
|
|
@upload_path = UNSET_VALUE
|
|
@privileged = UNSET_VALUE
|
|
@binary = UNSET_VALUE
|
|
@keep_color = UNSET_VALUE
|
|
end
|
|
|
|
def finalize!
|
|
@args = nil if @args == UNSET_VALUE
|
|
@inline = nil if @inline == UNSET_VALUE
|
|
@path = nil if @path == UNSET_VALUE
|
|
@upload_path = "/tmp/vagrant-shell" if @upload_path == UNSET_VALUE
|
|
@privileged = true if @privileged == UNSET_VALUE
|
|
@binary = false if @binary == UNSET_VALUE
|
|
@keep_color = false if @keep_color == UNSET_VALUE
|
|
end
|
|
|
|
def validate(machine)
|
|
errors = _detected_errors
|
|
|
|
# Validate that the parameters are properly set
|
|
if path && inline
|
|
errors << I18n.t("vagrant.provisioners.shell.path_and_inline_set")
|
|
elsif !path && !inline
|
|
errors << I18n.t("vagrant.provisioners.shell.no_path_or_inline")
|
|
end
|
|
|
|
# If it is not an URL, we validate the existence of a script to upload
|
|
if path && ! remote?
|
|
expanded_path = Pathname.new(path).expand_path(machine.env.root_path)
|
|
if !expanded_path.file?
|
|
errors << I18n.t("vagrant.provisioners.shell.path_invalid",
|
|
:path => expanded_path)
|
|
end
|
|
end
|
|
|
|
# There needs to be a path to upload the script to
|
|
if !upload_path
|
|
errors << I18n.t("vagrant.provisioners.shell.upload_path_not_set")
|
|
end
|
|
|
|
if !args_valid?
|
|
errors << I18n.t("vagrant.provisioners.shell.args_bad_type")
|
|
end
|
|
|
|
{ "shell provisioner" => errors }
|
|
end
|
|
|
|
# Args are optional, but if they're provided we only support them as a
|
|
# string or as an array.
|
|
def args_valid?
|
|
return true if !args
|
|
return true if args.is_a?(String) or args.is_a?(Fixnum)
|
|
if args.is_a?(Array)
|
|
args.each do |a|
|
|
return false if not a.kind_of?(String) and not a.kind_of?(Fixnum)
|
|
end
|
|
return true
|
|
end
|
|
end
|
|
|
|
def remote?
|
|
path =~ URI.regexp(["ftp", "http", "https"])
|
|
end
|
|
end
|
|
end
|
|
end
|