dployr 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +25 -19
- data/lib/dployr/cli.rb +13 -16
- data/lib/dployr/commands/base.rb +43 -0
- data/lib/dployr/commands/config.rb +29 -12
- data/lib/dployr/commands/execute.rb +13 -16
- data/lib/dployr/commands/provision_test.rb +14 -18
- data/lib/dployr/commands/ssh.rb +40 -0
- data/lib/dployr/commands/start.rb +17 -18
- data/lib/dployr/commands/stop_destroy.rb +19 -21
- data/lib/dployr/commands/utils.rb +40 -0
- data/lib/dployr/compute/aws.rb +76 -77
- data/lib/dployr/compute/gce.rb +134 -0
- data/lib/dployr/config/file_utils.rb +7 -9
- data/lib/dployr/configuration.rb +3 -1
- data/lib/dployr/init.rb +1 -2
- data/lib/dployr/scripts/default_hooks.rb +2 -9
- data/lib/dployr/scripts/hook.rb +4 -9
- data/lib/dployr/scripts/local_shell.rb +29 -0
- data/lib/dployr/scripts/scp.rb +1 -9
- data/lib/dployr/scripts/shell.rb +11 -23
- data/lib/dployr/scripts/ssh.rb +23 -0
- data/lib/dployr/utils.rb +0 -21
- data/lib/dployr/version.rb +1 -1
- data/lib/dployr.rb +4 -0
- data/spec/commands_util_spec.rb +108 -0
- data/{config → spec/fixtures/config}/Dployrfile.yml +19 -8
- data/spec/utils_spec.rb +0 -68
- metadata +15 -5
- /data/{config → spec/fixtures/config}/hello/hello.sh +0 -0
data/lib/dployr/compute/aws.rb
CHANGED
@@ -5,94 +5,93 @@ module Dployr
|
|
5
5
|
module Compute
|
6
6
|
class AWS
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
8
|
+
def initialize(region)
|
9
|
+
@options = {
|
10
|
+
region: region[0..-2],
|
11
|
+
provider: 'AWS',
|
12
|
+
aws_access_key_id: ENV["AWS_ACCESS_KEY"],
|
13
|
+
aws_secret_access_key: ENV["AWS_SECRET_KEY"]
|
14
|
+
}
|
15
|
+
@compute = Fog::Compute.new @options
|
16
|
+
end
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
return instance
|
24
|
-
end
|
18
|
+
def get_instance(name, states)
|
19
|
+
servers = @compute.servers.all
|
20
|
+
servers.each do |instance|
|
21
|
+
if instance.tags["Name"] == name and states.include? instance.state
|
22
|
+
return instance
|
25
23
|
end
|
26
|
-
return nil
|
27
24
|
end
|
25
|
+
nil
|
26
|
+
end
|
28
27
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
instance
|
38
|
-
|
39
|
-
return instance.destroy
|
40
|
-
end
|
28
|
+
def get_ip(name)
|
29
|
+
instance = get_instance(name, ["running"])
|
30
|
+
instance.private_ip_address if instance
|
31
|
+
end
|
32
|
+
|
33
|
+
def destroy(name)
|
34
|
+
instance = get_instance(name, ["running", "stopped", "stopping"])
|
35
|
+
if instance
|
36
|
+
instance.destroy
|
37
|
+
else
|
41
38
|
raise "Instance #{name} not found"
|
42
39
|
end
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
40
|
+
end
|
41
|
+
|
42
|
+
def halt(name)
|
43
|
+
instance = get_instance(name, ["running"])
|
44
|
+
if instance
|
45
|
+
instance.stop
|
46
|
+
else
|
49
47
|
raise "Instance #{name} not found"
|
50
48
|
end
|
49
|
+
end
|
51
50
|
|
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
|
-
end
|
89
|
-
rescue Exception => e
|
90
|
-
print ".".yellow
|
91
|
-
sleep 2
|
51
|
+
def start(attributes, region)
|
52
|
+
server = get_instance(attributes["name"], ["stopped", "stopping"])
|
53
|
+
if server
|
54
|
+
puts "Starting stopped instance for #{attributes["name"]} in #{region}...".yellow
|
55
|
+
server.start
|
56
|
+
else
|
57
|
+
puts "Creating new instance for #{attributes["name"]} in #{region}...".yellow
|
58
|
+
options = {
|
59
|
+
availability_zone: region,
|
60
|
+
flavor_id: attributes["instance_type"],
|
61
|
+
image_id: attributes["ami"],
|
62
|
+
key_name: attributes["keypair"],
|
63
|
+
subnet_id: attributes["subnet_id"],
|
64
|
+
security_group_ids: attributes["security_groups"],
|
65
|
+
tags: { Name: attributes["name"] }
|
66
|
+
#private_ip_address : private_ip_address,
|
67
|
+
#user_data : user_data,
|
68
|
+
#elastic_ip : elastic_ip,
|
69
|
+
#allocate_elastic_ip : allocate_elastic_ip,
|
70
|
+
#block_device_mapping : block_device_mapping,
|
71
|
+
#instance_initiated_shutdown_behavior : terminate_on_shutdown == true ? "terminate" : nil,
|
72
|
+
#monitoring : monitoring,
|
73
|
+
#ebs_optimized : ebs_optimized
|
74
|
+
}
|
75
|
+
puts options.to_yaml
|
76
|
+
server = @compute.servers.create(options)
|
77
|
+
end
|
78
|
+
print "Wait for instance to get online".yellow
|
79
|
+
server.wait_for { print ".".yellow; ready? }
|
80
|
+
|
81
|
+
print "\nWait for ssh to get ready...".yellow
|
82
|
+
while true
|
83
|
+
begin
|
84
|
+
Net::SSH.start(server.private_ip_address, attributes["username"], :keys => attributes["private_key_path"]) do |ssh|
|
85
|
+
print "\n"
|
86
|
+
return server.private_ip_address
|
92
87
|
end
|
88
|
+
rescue Exception => e
|
89
|
+
print ".".yellow
|
90
|
+
sleep 2
|
93
91
|
end
|
94
|
-
|
95
|
-
|
92
|
+
end
|
93
|
+
print "\n"
|
94
|
+
nil
|
96
95
|
end
|
97
96
|
|
98
97
|
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'fog'
|
2
|
+
require 'net/ssh'
|
3
|
+
|
4
|
+
module Dployr
|
5
|
+
module Compute
|
6
|
+
class GCE
|
7
|
+
|
8
|
+
def initialize(region)
|
9
|
+
@options = {
|
10
|
+
provider: 'Google',
|
11
|
+
google_project: ENV["GOOGLE_PROJECT_ID"],
|
12
|
+
google_client_email: ENV["GOOGLE_CLIENT_EMAIL"],
|
13
|
+
google_key_location: ENV["GOOGLE_KEY_LOCATION"]
|
14
|
+
}
|
15
|
+
@compute = Fog::Compute.new @options
|
16
|
+
end
|
17
|
+
|
18
|
+
# https://developers.google.com/compute/docs/instances
|
19
|
+
# private
|
20
|
+
def get_instance(name, states)
|
21
|
+
servers = @compute.servers.all
|
22
|
+
servers.each do |instance|
|
23
|
+
if instance.name == name and states.include? instance.state
|
24
|
+
return instance
|
25
|
+
end
|
26
|
+
end
|
27
|
+
return nil
|
28
|
+
end
|
29
|
+
|
30
|
+
def get_ip(name)
|
31
|
+
instance = get_instance(name, ["PROVISIONING", "STAGING", "RUNNING"])
|
32
|
+
if instance
|
33
|
+
return instance.private_ip_address
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def destroy(name)
|
38
|
+
instance = get_instance(name, ["RUNNING", "STOPPED"])
|
39
|
+
if instance
|
40
|
+
puts "Destroying instance #{name}...".yellow
|
41
|
+
instance.destroy(async = false)
|
42
|
+
puts "Destroying disk #{name}...".yellow
|
43
|
+
disk = @compute.disks.get(name)
|
44
|
+
disk.destroy
|
45
|
+
# Bug in fog. It return "persistent-disk-0" instead of boot disk name (usually the same name of the machine)
|
46
|
+
# instance.disks.each do |disk|
|
47
|
+
# gdisk = @compute.disks.get(disk["deviceName"])
|
48
|
+
# gdisk.destroy
|
49
|
+
# end
|
50
|
+
return
|
51
|
+
end
|
52
|
+
raise "Instance #{name} not found"
|
53
|
+
end
|
54
|
+
|
55
|
+
def halt(name)
|
56
|
+
instance = get_instance(name, ["RUNNING"])
|
57
|
+
if instance
|
58
|
+
instance.disks.each do |disk|
|
59
|
+
if disk["autoDelete"] == true
|
60
|
+
raise "Cannot halt instance with autoDelete disks"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
return instance.destroy
|
64
|
+
end
|
65
|
+
raise "Instance #{name} not found"
|
66
|
+
end
|
67
|
+
|
68
|
+
def create_disk(name, size_gb, zone_name, image_name)
|
69
|
+
disk = @compute.disks.get(name)
|
70
|
+
if disk != nil
|
71
|
+
puts "Disk #{name} already created. Reusing it.".yellow
|
72
|
+
return disk
|
73
|
+
else
|
74
|
+
puts "Creating new boot disk #{name}...".yellow
|
75
|
+
disk = @compute.disks.create(
|
76
|
+
name: name,
|
77
|
+
size_gb: size_gb,
|
78
|
+
zone_name: zone_name,
|
79
|
+
source_image: image_name
|
80
|
+
)
|
81
|
+
|
82
|
+
disk.wait_for { disk.ready? }
|
83
|
+
return disk
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def start(attributes, region)
|
88
|
+
server = get_instance(attributes["name"], ["stopped", "stopping"])
|
89
|
+
if server
|
90
|
+
puts "Starting stopped instance for #{attributes["name"]} in #{region}...".yellow
|
91
|
+
server.start
|
92
|
+
else
|
93
|
+
disks = create_disk(attributes["name"], 10, region, attributes["image_name"])
|
94
|
+
if defined? attributes["autodelete_disk"]
|
95
|
+
autodelete_disk = attributes["autodelete_disk"]
|
96
|
+
else
|
97
|
+
autodelete_disk = false
|
98
|
+
end
|
99
|
+
|
100
|
+
puts "Creating new instance for #{attributes["name"]} in #{region}...".yellow
|
101
|
+
|
102
|
+
options = {
|
103
|
+
name: attributes["name"],
|
104
|
+
zone_name: region,
|
105
|
+
machine_type: attributes["instance_type"],
|
106
|
+
network: attributes["network"],
|
107
|
+
disks: [disks.get_as_boot_disk(true, autodelete_disk)],
|
108
|
+
}
|
109
|
+
|
110
|
+
puts options.to_yaml
|
111
|
+
server = @compute.servers.create(options)
|
112
|
+
end
|
113
|
+
print "Wait for instance to get online".yellow
|
114
|
+
server.wait_for { print ".".yellow; ready? }
|
115
|
+
|
116
|
+
print "\nWait for ssh to get ready...".yellow
|
117
|
+
while true
|
118
|
+
begin
|
119
|
+
Net::SSH.start(server.private_ip_address, attributes["username"], :keys => attributes["private_key_path"]) do |ssh|
|
120
|
+
print "\n"
|
121
|
+
return server.private_ip_address
|
122
|
+
end
|
123
|
+
rescue Exception => e
|
124
|
+
print ".".yellow
|
125
|
+
sleep 2
|
126
|
+
end
|
127
|
+
end
|
128
|
+
print "\n"
|
129
|
+
return nil
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -18,18 +18,16 @@ module Dployr
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def discover(dir = Dir.pwd)
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
file_path = File.join dir, ('../' * n), file
|
26
|
-
if File.file? file_path
|
27
|
-
return File.expand_path file_path, dir
|
28
|
-
end
|
21
|
+
(0..5).each do |n|
|
22
|
+
FILENAMES.each do |file|
|
23
|
+
[nil].concat(EXTENSIONS).each do |ext|
|
24
|
+
file_name = "#{file}.#{ext}" if ext
|
25
|
+
file_path = File.join dir, ('../' * n), (file_name or file)
|
26
|
+
return File.expand_path file_path, dir if File.file? file_path
|
29
27
|
end
|
30
28
|
end
|
31
29
|
end
|
32
|
-
|
30
|
+
nil
|
33
31
|
end
|
34
32
|
|
35
33
|
end
|
data/lib/dployr/configuration.rb
CHANGED
@@ -7,11 +7,12 @@ module Dployr
|
|
7
7
|
|
8
8
|
attr_reader :default, :instances
|
9
9
|
|
10
|
-
def initialize
|
10
|
+
def initialize(attributes = {})
|
11
11
|
@default = nil
|
12
12
|
@config = nil
|
13
13
|
@instances = []
|
14
14
|
@merged = false
|
15
|
+
@attributes = attributes.is_a?(Hash) ? attributes : {}
|
15
16
|
yield self if block_given?
|
16
17
|
end
|
17
18
|
|
@@ -35,6 +36,7 @@ module Dployr
|
|
35
36
|
|
36
37
|
def get_config(name, attributes = {})
|
37
38
|
instance = get_instance name
|
39
|
+
attributes = @attributes.merge (attributes or {})
|
38
40
|
raise ArgumentError.new "Instance '#{name.to_s}' do not exists" if instance.nil?
|
39
41
|
replace_variables merge_config(instance), replace_variables(attributes)
|
40
42
|
end
|
data/lib/dployr/init.rb
CHANGED
@@ -1,19 +1,12 @@
|
|
1
|
-
require 'logger'
|
2
|
-
require 'dployr/utils'
|
3
|
-
require 'colorize'
|
4
|
-
|
5
1
|
module Dployr
|
6
2
|
module Scripts
|
7
3
|
class Default_Hooks
|
8
4
|
|
9
|
-
include Dployr::Utils
|
10
|
-
|
11
5
|
def initialize(ip, config, stage, command)
|
12
|
-
@log = Logger.new STDOUT
|
13
6
|
@config = config
|
14
7
|
@ip = ip
|
15
8
|
@stage = stage
|
16
|
-
|
9
|
+
|
17
10
|
if @config[:scripts]["pre-#{@stage}"]
|
18
11
|
Dployr::Scripts::Hook.new @ip, config, "pre-#{@stage}"
|
19
12
|
end
|
@@ -25,7 +18,7 @@ module Dployr
|
|
25
18
|
Dployr::Scripts::Hook.new @ip, config, "#{@stage}"
|
26
19
|
end
|
27
20
|
end
|
28
|
-
|
21
|
+
|
29
22
|
end
|
30
23
|
end
|
31
24
|
end
|
data/lib/dployr/scripts/hook.rb
CHANGED
@@ -1,15 +1,8 @@
|
|
1
|
-
require 'logger'
|
2
|
-
require 'dployr/utils'
|
3
|
-
require 'colorize'
|
4
|
-
|
5
1
|
module Dployr
|
6
2
|
module Scripts
|
7
3
|
class Hook
|
8
4
|
|
9
|
-
include Dployr::Utils
|
10
|
-
|
11
5
|
def initialize(ip, instance, stage)
|
12
|
-
@log = Logger.new STDOUT
|
13
6
|
@ip = ip
|
14
7
|
@instance = instance
|
15
8
|
@stage = stage
|
@@ -24,12 +17,14 @@ module Dployr
|
|
24
17
|
username = attrs["username"]
|
25
18
|
private_key_path = attrs["private_key_path"]
|
26
19
|
|
27
|
-
puts "
|
20
|
+
puts "Running stage '#{@stage}':".yellow
|
28
21
|
@instance[:scripts][@stage].each do |script|
|
29
22
|
if script["target"]
|
30
23
|
Dployr::Scripts::Scp.new @ip, host, username, private_key_path, script
|
31
|
-
|
24
|
+
elsif script["remote_path"]
|
32
25
|
Dployr::Scripts::Shell.new @ip, host, username, private_key_path, script
|
26
|
+
elsif script["local_path"]
|
27
|
+
Dployr::Scripts::Local_Shell.new script
|
33
28
|
end
|
34
29
|
end
|
35
30
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'net/ssh'
|
2
|
+
|
3
|
+
module Dployr
|
4
|
+
module Scripts
|
5
|
+
class Local_Shell
|
6
|
+
|
7
|
+
def initialize(script)
|
8
|
+
@script = script
|
9
|
+
start
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def start
|
15
|
+
command = @script["local_path"]
|
16
|
+
arguments = @script["args"]
|
17
|
+
|
18
|
+
puts "Running local script '#{command} #{arguments}'".yellow
|
19
|
+
result = system(command + ' ' + arguments)
|
20
|
+
if result == false
|
21
|
+
raise "Exit code non zero when running local script '#{command} #{arguments}'".yellow
|
22
|
+
else
|
23
|
+
puts "Local script '#{command} #{arguments}' finished succesfully".yellow
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/dployr/scripts/scp.rb
CHANGED
@@ -1,18 +1,11 @@
|
|
1
|
-
require 'logger'
|
2
1
|
require 'net/scp'
|
3
|
-
require 'colorize'
|
4
|
-
require 'dployr/utils'
|
5
2
|
|
6
3
|
module Dployr
|
7
4
|
module Scripts
|
8
5
|
class Scp
|
9
6
|
|
10
|
-
include Dployr::Utils
|
11
|
-
|
12
7
|
def initialize(ip, host, username, private_key_path, script)
|
13
|
-
|
14
8
|
begin
|
15
|
-
@log = Logger.new STDOUT
|
16
9
|
puts "Connecting to #{host} (SCP)...".yellow
|
17
10
|
Net::SCP.start(ip, username, :keys => [private_key_path]) do |scp|
|
18
11
|
source = script["source"]
|
@@ -20,12 +13,11 @@ module Dployr
|
|
20
13
|
puts "Coping #{source} -> #{target}".yellow
|
21
14
|
scp.upload(source, target, :recursive => true, :preserve => true)
|
22
15
|
end
|
23
|
-
|
24
16
|
rescue Exception => e
|
25
|
-
@log.error e
|
26
17
|
raise Error.new "Cannot copy to remote: #{e}"
|
27
18
|
end
|
28
19
|
end
|
20
|
+
|
29
21
|
end
|
30
22
|
end
|
31
23
|
end
|
data/lib/dployr/scripts/shell.rb
CHANGED
@@ -1,28 +1,16 @@
|
|
1
|
-
require 'logger'
|
2
1
|
require 'net/ssh'
|
3
|
-
require 'colorize'
|
4
|
-
require 'dployr/utils'
|
5
2
|
|
6
3
|
module Dployr
|
7
4
|
module Scripts
|
8
5
|
class Shell
|
9
6
|
|
10
|
-
include Dployr::Utils
|
11
|
-
|
12
7
|
def initialize(ip, host, username, private_key_path, script)
|
13
|
-
@log = Logger.new STDOUT
|
14
8
|
@ip = ip
|
15
9
|
@host = host
|
16
10
|
@username = username
|
17
11
|
@private_key_path = private_key_path
|
18
12
|
@script = script
|
19
|
-
|
20
|
-
begin
|
21
|
-
start
|
22
|
-
rescue Exception => e
|
23
|
-
@log.error e
|
24
|
-
Process.exit! false
|
25
|
-
end
|
13
|
+
start
|
26
14
|
end
|
27
15
|
|
28
16
|
private
|
@@ -30,11 +18,11 @@ module Dployr
|
|
30
18
|
def start
|
31
19
|
puts "Connecting to #{@host} (SSH)...".yellow
|
32
20
|
Net::SSH.start(@ip, @username, :keys => [@private_key_path]) do |ssh|
|
33
|
-
command = @script["
|
21
|
+
command = @script["remote_path"]
|
34
22
|
arguments = @script["args"]
|
35
23
|
|
36
24
|
puts "Running remote script '#{command} #{arguments}'".yellow
|
37
|
-
result = ssh_exec!(ssh, command)
|
25
|
+
result = ssh_exec!(ssh, command + ' ' + arguments)
|
38
26
|
if result[:exit_code] > 0
|
39
27
|
raise "Exit code #{result[:exit_code]} when running script '#{command} #{arguments}'".yellow
|
40
28
|
else
|
@@ -50,35 +38,35 @@ module Dployr
|
|
50
38
|
exit_code = nil
|
51
39
|
exit_signal = nil
|
52
40
|
ssh.open_channel do |channel|
|
41
|
+
@channel = channel
|
53
42
|
channel.exec(command) do |ch, success|
|
54
43
|
unless success
|
55
44
|
abort "FAILED: couldn't execute command (ssh.channel.exec)"
|
56
45
|
end
|
57
46
|
channel.on_data do |ch,data|
|
58
47
|
stdout_data+=data
|
59
|
-
print "[#{@host}] #{data}".green
|
48
|
+
#print "[#{@host}] #{data}".green
|
49
|
+
print "#{data}".green
|
60
50
|
end
|
61
51
|
|
62
52
|
channel.on_extended_data do |ch,type,data|
|
63
53
|
stderr_data+=data
|
64
|
-
print "[#{@host}] #{data}".red
|
54
|
+
#print "[#{@host}] #{data}".red
|
55
|
+
print "#{data}".red
|
65
56
|
end
|
66
57
|
|
67
58
|
channel.on_request("exit-status") do |ch,data|
|
68
59
|
exit_code = data.read_long
|
60
|
+
@channel.close
|
69
61
|
end
|
70
|
-
|
71
|
-
channel.on_request("exit-signal") do |ch, data|
|
72
|
-
exit_signal = data.read_long
|
73
|
-
end
|
62
|
+
|
74
63
|
end
|
75
64
|
end
|
76
65
|
ssh.loop
|
77
66
|
{
|
78
67
|
stdout_data: stdout_data,
|
79
68
|
stderr_data: stderr_data,
|
80
|
-
exit_code: exit_code
|
81
|
-
exit_signal: exit_signal
|
69
|
+
exit_code: exit_code
|
82
70
|
}
|
83
71
|
end
|
84
72
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'net/ssh'
|
2
|
+
|
3
|
+
module Dployr
|
4
|
+
module Scripts
|
5
|
+
class Ssh
|
6
|
+
|
7
|
+
def initialize(ip, instance)
|
8
|
+
@ip = ip
|
9
|
+
@username = instance[:attributes]["username"]
|
10
|
+
@private_key_path = instance[:attributes]["private_key_path"]
|
11
|
+
run
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def run
|
17
|
+
puts "ssh -i #{@private_key_path} #{@username}@#{@ip}"
|
18
|
+
system("ssh -i #{@private_key_path} #{@username}@#{@ip}")
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/dployr/utils.rb
CHANGED
@@ -46,27 +46,6 @@ module Dployr
|
|
46
46
|
Marshal.load Marshal.dump o
|
47
47
|
end
|
48
48
|
|
49
|
-
def parse_matrix(str)
|
50
|
-
hash = {}
|
51
|
-
str.split(';').each do |val|
|
52
|
-
val = val.split '='
|
53
|
-
hash[val.first.strip] = val.last.strip
|
54
|
-
end if str.is_a? String
|
55
|
-
hash
|
56
|
-
end
|
57
|
-
|
58
|
-
def parse_flags(str)
|
59
|
-
hash = {}
|
60
|
-
str.gsub(/\s+/, ' ').strip.split(' ').each_slice(2) do |val|
|
61
|
-
key = val.first
|
62
|
-
if val.first.is_a? String
|
63
|
-
key = key.gsub(/^\-+/, '').strip
|
64
|
-
hash[key] = (val.last or '').strip
|
65
|
-
end
|
66
|
-
end if str.is_a? String
|
67
|
-
hash
|
68
|
-
end
|
69
|
-
|
70
49
|
def replace_vars(str)
|
71
50
|
str.gsub(/\%\{(\w+)\}/) { yield $1 }
|
72
51
|
end
|
data/lib/dployr/version.rb
CHANGED
data/lib/dployr.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'colorize'
|
1
2
|
require 'dployr/version'
|
2
3
|
require 'dployr/init'
|
3
4
|
require 'dployr/configuration'
|
@@ -9,7 +10,10 @@ require 'dployr/commands/start'
|
|
9
10
|
require 'dployr/commands/stop_destroy'
|
10
11
|
require 'dployr/commands/config'
|
11
12
|
require 'dployr/commands/execute'
|
13
|
+
require 'dployr/commands/ssh'
|
12
14
|
require 'dployr/scripts/hook'
|
13
15
|
require 'dployr/scripts/default_hooks'
|
14
16
|
require 'dployr/scripts/shell'
|
17
|
+
require 'dployr/scripts/local_shell'
|
18
|
+
require 'dployr/scripts/ssh'
|
15
19
|
require 'dployr/scripts/scp'
|