vagrant-aws 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/Gemfile +4 -0
- data/README.md +65 -0
- data/Rakefile +10 -0
- data/lib/vagrant-aws.rb +14 -0
- data/lib/vagrant-aws/action/create.rb +56 -0
- data/lib/vagrant-aws/action/create_image.rb +106 -0
- data/lib/vagrant-aws/action/create_sshkey.rb +39 -0
- data/lib/vagrant-aws/action/deregister_image.rb +27 -0
- data/lib/vagrant-aws/action/populate_ssh.rb +41 -0
- data/lib/vagrant-aws/action/prepare_provisioners.rb +127 -0
- data/lib/vagrant-aws/action/resume.rb +20 -0
- data/lib/vagrant-aws/action/suspend.rb +20 -0
- data/lib/vagrant-aws/action/terminate.rb +21 -0
- data/lib/vagrant-aws/box.rb +20 -0
- data/lib/vagrant-aws/box_collection.rb +15 -0
- data/lib/vagrant-aws/command.rb +186 -0
- data/lib/vagrant-aws/config.rb +38 -0
- data/lib/vagrant-aws/environment.rb +79 -0
- data/lib/vagrant-aws/errors.rb +29 -0
- data/lib/vagrant-aws/middleware.rb +53 -0
- data/lib/vagrant-aws/system.rb +24 -0
- data/lib/vagrant-aws/version.rb +3 -0
- data/lib/vagrant-aws/vm.rb +94 -0
- data/lib/vagrant_init.rb +4 -0
- data/locales/en.yml +64 -0
- data/test/test_helper.rb +24 -0
- data/test/vagrant-aws/action/create_image_test.rb +63 -0
- data/test/vagrant-aws/action/create_ssh_key_test.rb +43 -0
- data/test/vagrant-aws/action/create_test.rb +65 -0
- data/test/vagrant-aws/action/terminate_test.rb +20 -0
- data/test/vagrant-aws/command_test.rb +21 -0
- data/test/vagrant-aws/config_test.rb +14 -0
- data/vagrant-aws.gemspec +29 -0
- metadata +165 -0
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
# vagrant-aws
|
2
|
+
|
3
|
+
`vagrant-aws` is a plugin for [Vagrant](http://vagrantup.com) which allows the user
|
4
|
+
to instantiate the Vagrant environment on Amazon AWS (using EC2). This document assumes
|
5
|
+
you are familiar with Vagrant, if not, the project has excellent [documentation](http://vagrantup.com/docs/index.html).
|
6
|
+
|
7
|
+
**NOTE:** This plugin is "pre-alpha", see below for the caveats
|
8
|
+
|
9
|
+
## Installing / Getting Started
|
10
|
+
|
11
|
+
To use this plugin, first install Vagrant, then install the plugin gem. It should be
|
12
|
+
picked up automatically by vagrant. You can then use the `vagrant aws` commands.
|
13
|
+
|
14
|
+
`vagrant-aws` uses [fog](https://github.com/geemus/fog) internally, and you will need to
|
15
|
+
specify your Amazon AWS credentials in a "fog" file. Create `~/.fog` with:
|
16
|
+
|
17
|
+
---
|
18
|
+
default:
|
19
|
+
aws_access_key_id: <YOUR ACCESS KEY>
|
20
|
+
aws_secret_access_key: <YOUR SECRET KEY>
|
21
|
+
|
22
|
+
If you already have an Amazon key pair (created when you signed-up, or
|
23
|
+
someother time), you can specify the key name and the path the associated
|
24
|
+
private key. Alternately, if no key name is specified, `vagrant-aws` will
|
25
|
+
automatically create and register a key pair for you with the name
|
26
|
+
`vagrant_<MAC ADDRESS>`. If you want to use your pre-existing key, you can
|
27
|
+
specify the key name and path on a per-environment basis (i.e., in each
|
28
|
+
Vagrantfile) or in a single Vagrantfile in your `~/.vagrant` directory. In the
|
29
|
+
latter case, create `~/.vagrant/Vagrantfile` with:
|
30
|
+
|
31
|
+
Vagrant::Config.run do |config|
|
32
|
+
config.aws.key_name = "<KEY NAME>"
|
33
|
+
config.aws.private_key_path = "<PATH/TO/KEY>"
|
34
|
+
end
|
35
|
+
|
36
|
+
With the above in place you should be ready instantiate your Vagrant environment on
|
37
|
+
Amazon AWS. See below for additional information on configuration, caveats, etc..
|
38
|
+
|
39
|
+
## Configuration and Image Boxes
|
40
|
+
|
41
|
+
`vagrant-aws` defines a new configuration class for use in your Vagrantfile. An example
|
42
|
+
usage (showing the defaults) would be:
|
43
|
+
|
44
|
+
Vagrant::Config.run do |config|
|
45
|
+
config.aws.region = "us-east-1"
|
46
|
+
config.aws.availability_zone = nil # Let AWS choose
|
47
|
+
config.aws.image = "ami-2ec83147" # EBS-backed Ubuntu 10.04 64-bit
|
48
|
+
config.aws.username = "ubuntu"
|
49
|
+
config.aws.security_groups = ["default"]
|
50
|
+
config.aws.flavor = "t1.micro"
|
51
|
+
end
|
52
|
+
|
53
|
+
Alternately you can work with "image boxes" using the `vagrant aws box_*` commands. These are
|
54
|
+
similar to Vagrant's native boxes, and have a similar API, but wrap AWS ami IDs. The major
|
55
|
+
difference is that box creation and removal can optionally reregister and deregister AMIs
|
56
|
+
with AWS. Note that AMI creation is only supported for EBS-backed instances.
|
57
|
+
|
58
|
+
## Caveats
|
59
|
+
|
60
|
+
`vagrant-aws` is "pre-alpha" and currently only supports creation, suspension, resumption
|
61
|
+
and descruction of the Vagrant environment. Provisioning should be supported for shell,
|
62
|
+
chef-server and chef-solo, but has only been tested with chef-solo and on an Ubuntu guest.
|
63
|
+
Only a subset of Vagrant features are supported. Currently port forwarding and shared
|
64
|
+
directories are not implemented, nor is host networking (although that is less relevant for AWS).
|
65
|
+
`vagrant-aws` in general has only been tested for a single VM, on OSX 10.6, with chef-solo.
|
data/Rakefile
ADDED
data/lib/vagrant-aws.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
require 'vagrant-aws/version'
|
3
|
+
require 'vagrant-aws/errors'
|
4
|
+
require 'vagrant-aws/environment'
|
5
|
+
require 'vagrant-aws/vm'
|
6
|
+
require 'vagrant-aws/config'
|
7
|
+
require 'vagrant-aws/middleware'
|
8
|
+
require 'vagrant-aws/command'
|
9
|
+
require 'vagrant-aws/system'
|
10
|
+
require 'vagrant-aws/box'
|
11
|
+
require 'vagrant-aws/box_collection'
|
12
|
+
|
13
|
+
# Add our custom translations to the load path
|
14
|
+
I18n.load_path << File.expand_path("../../locales/en.yml", __FILE__)
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module VagrantAWS
|
2
|
+
class Action
|
3
|
+
class Create
|
4
|
+
def initialize(app, env)
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(env)
|
9
|
+
raise Errors::KeyNameNotSpecified if env["config"].aws.key_name.nil?
|
10
|
+
|
11
|
+
env.ui.info I18n.t("vagrant.plugins.aws.actions.create.creating")
|
12
|
+
|
13
|
+
server_def = server_definition(env["config"])
|
14
|
+
|
15
|
+
# Verify AMI is valid (and in the future enable options specific to EBS-based AMIs)
|
16
|
+
image = env["vm"].connection.images.get(server_def[:image_id])
|
17
|
+
image.wait_for { state == 'available' }
|
18
|
+
|
19
|
+
env["vm"].vm = env["vm"].connection.servers.create(server_def)
|
20
|
+
raise VagrantAWS::Errors::VMCreateFailure if env["vm"].vm.nil? || env["vm"].vm.id.nil?
|
21
|
+
|
22
|
+
env.ui.info I18n.t("vagrant.plugins.aws.actions.create.created", :id => env["vm"].vm.id)
|
23
|
+
|
24
|
+
env["vm"].vm.wait_for { ready? }
|
25
|
+
env["vm"].connection.create_tags(env["vm"].vm.id, { "name" => env["vm"].name })
|
26
|
+
|
27
|
+
env.ui.info I18n.t("vagrant.plugins.aws.actions.create.available", :dns => env["vm"].vm.dns_name)
|
28
|
+
|
29
|
+
@app.call(env)
|
30
|
+
end
|
31
|
+
|
32
|
+
def recover(env)
|
33
|
+
if env["vm"].created?
|
34
|
+
return if env["vagrant.error"].is_a?(Vagrant::Errors::VagrantError)
|
35
|
+
|
36
|
+
# Interrupted, destroy the VM
|
37
|
+
env["actions"].run(:aws_destroy)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def server_definition(config)
|
42
|
+
{
|
43
|
+
:image_id => config.aws.image,
|
44
|
+
:groups => config.aws.security_groups,
|
45
|
+
:flavor_id => config.aws.flavor,
|
46
|
+
:key_name => config.aws.key_name,
|
47
|
+
:username => config.aws.username,
|
48
|
+
:private_key_path => config.aws.private_key_path,
|
49
|
+
:availability_zone => config.aws.availability_zone
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
# Path vagrant to not delete pre-existing package file (pull request submitted upstream)
|
4
|
+
|
5
|
+
module Vagrant
|
6
|
+
class Action
|
7
|
+
module General
|
8
|
+
|
9
|
+
class Package
|
10
|
+
def recover(env)
|
11
|
+
unless env["vagrant.error"].is_a?(Errors::PackageOutputExists)
|
12
|
+
# Cleanup any packaged files if the packaging failed at some point.
|
13
|
+
File.delete(tar_path) if File.exist?(tar_path)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
module VagrantAWS
|
23
|
+
class Action
|
24
|
+
class CreateImage
|
25
|
+
include Vagrant::Util
|
26
|
+
|
27
|
+
PACKAGE_VAGRANTFILE = <<EOT
|
28
|
+
Vagrant::Config.run do |config|
|
29
|
+
# This Vagrantfile is auto-generated by `vagrant aws create_image` to contain
|
30
|
+
# the image id and region. Custom configuration should be placed in
|
31
|
+
# the actual `Vagrantfile` in this box.
|
32
|
+
config.vm.base_mac = "000000000000" # Unneeded
|
33
|
+
config.aws.image = "<%= image %>"
|
34
|
+
config.aws.region = "<%= region %>"
|
35
|
+
end
|
36
|
+
EOT
|
37
|
+
|
38
|
+
attr_reader :temp_dir, :image
|
39
|
+
|
40
|
+
def initialize(app, env)
|
41
|
+
@app = app
|
42
|
+
@env = env
|
43
|
+
end
|
44
|
+
|
45
|
+
def call(env)
|
46
|
+
@env = env
|
47
|
+
|
48
|
+
raise Vagrant::Errors::VMNotCreatedError if !@env["vm"].created?
|
49
|
+
raise Vagrant::Errors::VMNotRunningError if !@env["vm"].vm.running?
|
50
|
+
raise VagrantAWS::Errors::EBSDeviceRequired, :command => "box_create" if @env["image.register"] and @env["vm"].vm.root_device_type != "ebs"
|
51
|
+
|
52
|
+
if @env["image.register"]
|
53
|
+
@env.ui.info I18n.t("vagrant.plugins.aws.actions.create_image.creating")
|
54
|
+
@image = @env["vm"].connection.create_image(@env["vm"].vm.id, @env['image.name'], @env['image.desc'])
|
55
|
+
@image = @env["vm"].connection.images.new({ :id => @image.body['imageId'] })
|
56
|
+
@image.wait_for { state == "available" }
|
57
|
+
else
|
58
|
+
@image = @env["vm"].connection.images.get(@env["vm"].vm.image_id)
|
59
|
+
end
|
60
|
+
|
61
|
+
setup_temp_dir
|
62
|
+
export
|
63
|
+
|
64
|
+
@app.call(@env)
|
65
|
+
|
66
|
+
cleanup_temp_dir
|
67
|
+
end
|
68
|
+
|
69
|
+
def recover(env)
|
70
|
+
if env["image.register"]
|
71
|
+
env.ui.info I18n.t("vagrant.plugins.aws.actions.deregister_image.deregistering", :image => @image.id)
|
72
|
+
@image.deregister(!@image.root_device_name.nil?) # Don't try to delete backing snapshot if it was not created
|
73
|
+
end
|
74
|
+
cleanup_temp_dir
|
75
|
+
end
|
76
|
+
|
77
|
+
def cleanup_temp_dir
|
78
|
+
if temp_dir && File.exist?(temp_dir)
|
79
|
+
FileUtils.rm_rf(temp_dir)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def setup_temp_dir
|
84
|
+
@env.ui.info I18n.t("vagrant.actions.vm.export.create_dir")
|
85
|
+
@temp_dir = @env["export.temp_dir"] = @env.env.tmp_path.join(Time.now.to_i.to_s)
|
86
|
+
FileUtils.mkpath(@env["export.temp_dir"])
|
87
|
+
end
|
88
|
+
|
89
|
+
# Write a Vagrantfile with the relevant information
|
90
|
+
def export
|
91
|
+
File.open(File.join(@env["export.temp_dir"], 'Vagrantfile'), "w") do |f|
|
92
|
+
f.write(TemplateRenderer.render_string(PACKAGE_VAGRANTFILE, {
|
93
|
+
:image => @image.id,
|
94
|
+
:region => @env["config"].aws.region
|
95
|
+
}))
|
96
|
+
end
|
97
|
+
File.open(File.join(@env["export.temp_dir"], 'image.json'), "w") do |f|
|
98
|
+
f.write(@image.to_json)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'Macaddr'
|
2
|
+
|
3
|
+
module VagrantAWS
|
4
|
+
class Action
|
5
|
+
class CreateSSHKey
|
6
|
+
def initialize(app, env)
|
7
|
+
@app = app
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
@env = env
|
12
|
+
|
13
|
+
if @env["config"].aws.key_name.nil?
|
14
|
+
# Do we have a previously created key available on AWS?
|
15
|
+
key = @env["vm"].connection.key_pairs.all('key-name' => @env.env.ssh_keys).first
|
16
|
+
if key.nil?
|
17
|
+
# Create and save key
|
18
|
+
key = @env["vm"].connection.key_pairs.create(:name => "vagrantaws_#{Mac.addr.gsub(':','')}")
|
19
|
+
env.ui.info I18n.t("vagrant.plugins.aws.actions.create_ssh_key.created", :name => key.name)
|
20
|
+
File.open(local_key_path(key.name), File::WRONLY|File::TRUNC|File::CREAT, 0600) { |f| f.write(key.private_key) }
|
21
|
+
end
|
22
|
+
|
23
|
+
@env["config"].aws.key_name = key.name
|
24
|
+
@env["config"].aws.private_key_path = local_key_path(key.name)
|
25
|
+
end
|
26
|
+
|
27
|
+
@app.call(env)
|
28
|
+
end
|
29
|
+
|
30
|
+
def local_key_path(name)
|
31
|
+
@env.env.ssh_keys_path.join(name)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module VagrantAWS
|
2
|
+
class Action
|
3
|
+
class DeregisterImage
|
4
|
+
def initialize(app, env)
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(env)
|
9
|
+
if env['image.deregister']
|
10
|
+
image = Fog::Compute.new(:provider => 'AWS').images.new(load_image(env))
|
11
|
+
env.ui.info I18n.t("vagrant.plugins.aws.actions.deregister_image.deregistering", :image => image.id)
|
12
|
+
image.reload
|
13
|
+
image.deregister(true) # Delete snapshot when deregistering
|
14
|
+
end
|
15
|
+
@app.call(env)
|
16
|
+
end
|
17
|
+
|
18
|
+
def load_image(env)
|
19
|
+
File.open(File.join(env["box"].directory, "image.json"), "r") do |f|
|
20
|
+
JSON.parse(f.read)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module VagrantAWS
|
2
|
+
class Action
|
3
|
+
class PopulateSSH
|
4
|
+
def initialize(app, env)
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(env)
|
9
|
+
@env = env
|
10
|
+
|
11
|
+
if @env["config"].aws.private_key_path.nil?
|
12
|
+
# See if we are using a key vagrant aws generated
|
13
|
+
@env["config"].aws.private_key_path = local_key_path(env["vm"].vm.key_name) if env["vm"].vm.key_name =~ /^vagrantaws_[0-9a-f]{12}/
|
14
|
+
end
|
15
|
+
|
16
|
+
raise VagrantAWS::Errors::PrivateKeyFileNotSpecified if env["config"].aws.private_key_path.nil? || !File.exists?(env["config"].aws.private_key_path)
|
17
|
+
|
18
|
+
env["config"].ssh.host = env["vm"].vm.dns_name
|
19
|
+
env["config"].ssh.username = env["config"].aws.username
|
20
|
+
env["config"].ssh.private_key_path = env["config"].aws.private_key_path
|
21
|
+
env["config"].ssh.port = 22
|
22
|
+
|
23
|
+
# Make sure we can connect
|
24
|
+
begin
|
25
|
+
env["vm"].vm.wait_for { env["vm"].ssh.up? }
|
26
|
+
rescue Fog::Errors::Error
|
27
|
+
raise Vagrant::Errors::SSHConnectionRefused
|
28
|
+
end
|
29
|
+
|
30
|
+
@app.call(env)
|
31
|
+
end
|
32
|
+
|
33
|
+
def local_key_path(name)
|
34
|
+
@env.env.ssh_keys_path.join(name)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'archive/tar/minitar'
|
2
|
+
|
3
|
+
module VagrantAWS
|
4
|
+
class Action
|
5
|
+
class PrepareProvisioners
|
6
|
+
def initialize(app, env)
|
7
|
+
@app = app
|
8
|
+
@env = env
|
9
|
+
@env["provision.enabled"] = true if !@env.has_key?("provision.enabled")
|
10
|
+
@provisioner_configs = []
|
11
|
+
|
12
|
+
load_provisioner_configs if provisioning_enabled?
|
13
|
+
end
|
14
|
+
|
15
|
+
def call(env)
|
16
|
+
@provisioner_configs.each do |provisioner_config|
|
17
|
+
if provisioner_config.is_a?(Vagrant::Provisioners::ChefSolo::Config)
|
18
|
+
env.ui.info I18n.t("vagrant.plugins.aws.actions.prepare_provisioners.uploading_chef_resources")
|
19
|
+
ChefSolo.prepare(provisioner_config)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
@app.call(env)
|
23
|
+
end
|
24
|
+
|
25
|
+
def provisioning_enabled?
|
26
|
+
!@env["config"].vm.provisioners.empty? && @env["provision.enabled"]
|
27
|
+
end
|
28
|
+
|
29
|
+
def load_provisioner_configs
|
30
|
+
@env["config"].vm.provisioners.each do |provisioner|
|
31
|
+
@provisioner_configs << provisioner.config
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class ChefSolo
|
36
|
+
|
37
|
+
def self.prepare(config)
|
38
|
+
my_preparer = new(config)
|
39
|
+
my_preparer.bootstrap_if_needed
|
40
|
+
my_preparer.chown_provisioning_folder
|
41
|
+
my_preparer.copy_and_update_paths
|
42
|
+
end
|
43
|
+
|
44
|
+
def initialize(config)
|
45
|
+
@config = config
|
46
|
+
end
|
47
|
+
|
48
|
+
def bootstrap_if_needed
|
49
|
+
begin
|
50
|
+
@config.env.vm.ssh.execute do |ssh|
|
51
|
+
ssh.sudo!("which chef-solo")
|
52
|
+
end
|
53
|
+
rescue Vagrant::Errors::VagrantError
|
54
|
+
# Bootstrap chef-solo
|
55
|
+
@config.env.ui.info I18n.t("vagrant.plugins.aws.actions.prepare_provisioners.chef_not_detected", :binary => "chef-solo")
|
56
|
+
@config.env.vm.system.bootstrap_chef
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
def chown_provisioning_folder
|
62
|
+
@config.env.vm.ssh.execute do |ssh|
|
63
|
+
ssh.sudo!("mkdir -p #{@config.provisioning_path}")
|
64
|
+
ssh.sudo!("chown #{@config.env.config.ssh.username} #{@config.provisioning_path}")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def copy_and_update_paths
|
69
|
+
# Copy relevant host paths to remote instance and update provisioner config
|
70
|
+
# to point to new "vm" paths for cookbooks, etc.
|
71
|
+
%w{ cookbooks_path roles_path data_bags_path }.each do |path|
|
72
|
+
copy_host_paths(@config.send(path), path)
|
73
|
+
@config.send "#{path}=", strip_host_paths(@config.send(path)).push([:vm, path])
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def copy_host_paths(paths, target_directory)
|
78
|
+
archive = tar_host_folder_paths(paths)
|
79
|
+
|
80
|
+
target_d = "#{@config.provisioning_path}/#{target_directory}"
|
81
|
+
target_f = target_d + '.tar'
|
82
|
+
|
83
|
+
@config.env.vm.ssh.upload!(archive.path, target_f)
|
84
|
+
@config.env.vm.ssh.execute do |ssh|
|
85
|
+
ssh.sudo!([
|
86
|
+
"mkdir -p #{target_d}",
|
87
|
+
"chown #{@config.env.config.ssh.username} #{target_d}",
|
88
|
+
"tar -C #{target_d} -xf #{target_f}"
|
89
|
+
])
|
90
|
+
end
|
91
|
+
|
92
|
+
target_directory
|
93
|
+
end
|
94
|
+
|
95
|
+
def tar_host_folder_paths(paths)
|
96
|
+
tarf = Tempfile.new(['vagrant-chef-solo','.tar'])
|
97
|
+
Archive::Tar::Minitar::Output.open(tarf) do |outp|
|
98
|
+
host_folder_paths(paths).each do |full_path|
|
99
|
+
Dir.chdir(full_path) do |ignored|
|
100
|
+
Dir.glob("**#{File::SEPARATOR}**") { |entry| Archive::Tar::Minitar.pack_file(entry, outp) }
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
tarf
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
def host_folder_paths(paths)
|
109
|
+
paths = [paths] if paths.is_a?(String) || paths.first.is_a?(Symbol)
|
110
|
+
paths.inject([]) do |acc, path|
|
111
|
+
path = [:host, path] if !path.is_a?(Array)
|
112
|
+
type, path = path
|
113
|
+
acc << File.expand_path(path, @config.env.root_path) if type == :host
|
114
|
+
acc
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def strip_host_paths(paths)
|
119
|
+
paths = [paths] if paths.is_a?(String) || paths.first.is_a?(Symbol)
|
120
|
+
paths.delete_if { |path| !path.is_a?(Array) || path[0] == :host }
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|