ftl 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/Changelog +18 -10
- data/Gemfile.lock +1 -1
- data/README.md +68 -5
- data/bin/ftl +4 -0
- data/lib/ftl/client.rb +92 -64
- data/lib/ftl/version.rb +1 -1
- data/lib/resources/ftl.yml +18 -5
- metadata +62 -56
data/.gitignore
CHANGED
data/Changelog
CHANGED
@@ -1,18 +1,26 @@
|
|
1
|
-
Release Version 0.2.
|
1
|
+
# Release Version 0.2.4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
2
|
+
|
3
|
+
* Add ftl <action> <server> to execute arbitrary commands on running instances
|
4
|
+
* Add ftl sample_config to see the latest sample ftl.yml
|
5
|
+
* Add ftl images # Shows AMIs associated with your account
|
6
|
+
|
7
|
+
# Release Version 0.2.3 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
2
8
|
|
3
|
-
|
4
|
-
|
9
|
+
* Add ftl status
|
10
|
+
* find_instances returns exact match preferentially
|
11
|
+
* Update README with more examples and setup
|
12
|
+
* Adds :keys config parameter
|
5
13
|
|
6
|
-
Release Version 0.2.2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
14
|
+
# Release Version 0.2.2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
7
15
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
16
|
+
* Adds templates feature to config file
|
17
|
+
* Start and cancel spot requests
|
18
|
+
* Execution without parameters shows help screen
|
19
|
+
* Fixes various bugs
|
12
20
|
|
13
|
-
Release Version 0.2.0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
21
|
+
# Release Version 0.2.0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
14
22
|
|
15
|
-
|
23
|
+
* First revamped release handling AWS in a more generic way
|
16
24
|
|
17
25
|
Previous releases were focused on starting up Pair Programming servers.
|
18
26
|
The latest releases can also be used for this but are more useful in a generic
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -4,7 +4,7 @@ Faster Than Light. Fog Terminal Language. For Terminal Launching.
|
|
4
4
|
|
5
5
|
## Description
|
6
6
|
|
7
|
-
|
7
|
+
`ftl` is an AWS (fog-based) application for managing cloud instances from the command line.
|
8
8
|
Easier than chef or the ec2 command line tools. Smarter too.
|
9
9
|
|
10
10
|
## Installation
|
@@ -15,8 +15,6 @@ Install is easy.
|
|
15
15
|
|
16
16
|
## Usage
|
17
17
|
|
18
|
-
### Example commands
|
19
|
-
|
20
18
|
Usage: ftl [<config-options>] <command> [<command-options>]
|
21
19
|
commands: start, kill, list, edit, connect, servers, tags, images, snapshots, volumes
|
22
20
|
examples:
|
@@ -35,10 +33,75 @@ Install is easy.
|
|
35
33
|
ftl headers servers # Show possible headers for servers
|
36
34
|
ftl headers volumes # Show possible headers for volumes
|
37
35
|
ftl edit # Edit ftl.yml with your $EDITOR
|
38
|
-
ftl --config=~/ftl.yml servers # Uses custom config file
|
39
|
-
ftl --headers=id,tags.Name servers # Uses specified headers
|
36
|
+
ftl --config=~/ftl.yml servers # Uses custom config file
|
37
|
+
ftl --headers=id,tags.Name servers # Uses specified headers
|
40
38
|
ftl --version # Show version number
|
41
39
|
|
40
|
+
## Getting started
|
41
|
+
|
42
|
+
`ftl` depends on a configuration file. When you run it for the first time,
|
43
|
+
it will create a simple configuration file at `~/.ftl/ftl.yml`. Note that the starter file is incomplete;
|
44
|
+
you will need to supply at least your Amazon AWS security credentials. You can open the
|
45
|
+
configuration file in the editor named by the `$EDITOR` environment variable by running `ftl edit`.
|
46
|
+
|
47
|
+
### Configuration file
|
48
|
+
|
49
|
+
In addition to the AWS security credentials, the configuration file contains parameters for
|
50
|
+
launching instances and connecting to them.
|
51
|
+
|
52
|
+
ACCESS_KEY_ID: # Amazon AWS access key
|
53
|
+
SECRET_ACCESS_KEY: # Amazon AWS secret access key
|
54
|
+
|
55
|
+
:keys:
|
56
|
+
ninja-keypair: ~/.ec2/id_rsa-ninja-keypair
|
57
|
+
|
58
|
+
:templates:
|
59
|
+
:ninja:
|
60
|
+
:ami: ami-a29943cb # Ubuntu 12.04 LTS Precise Pangolin
|
61
|
+
:username: ubuntu
|
62
|
+
:keypair: ninja-keypair
|
63
|
+
:instance_type: m1.small
|
64
|
+
:tags: {}
|
65
|
+
:groups:
|
66
|
+
- default
|
67
|
+
- apache
|
68
|
+
- postgresql
|
69
|
+
|
70
|
+
#### The :templates section
|
71
|
+
|
72
|
+
`:templates` is a hash of server names and the EC2 parameters used to launch them.
|
73
|
+
|
74
|
+
* :ami -- the ID of the AMI to use
|
75
|
+
* :availability_zone -- the availability zone into which the instance should be launched
|
76
|
+
* :groups -- a list of names and/or IDs of security groups to assign to the instance
|
77
|
+
* :instance_type -- the name of the EC2 instance size (e.g. 'm1.small')
|
78
|
+
* :ip_private -- the private IP address to assign to the instance (optional)
|
79
|
+
* :ip_public -- the public IP address to assign to the instance (optional)
|
80
|
+
* :keypair -- the name of the keypair installed in the instance when launched; this is important
|
81
|
+
for connecting to the instance once it has been launched
|
82
|
+
* :subnet_id -- the ID of the subnet into which the instance should be launched (optional)
|
83
|
+
* :tags -- a hash of tags to be set on the instance; 'Name' will be automatically set from the
|
84
|
+
server name
|
85
|
+
* :username -- the username to use when connecting to the instance
|
86
|
+
|
87
|
+
#### A note on security groups
|
88
|
+
|
89
|
+
Security groups defined in a virtual private cloud (VPC) can be specified only by ID.
|
90
|
+
|
91
|
+
#### The :keys section
|
92
|
+
|
93
|
+
`:keys`, if defined, is a hash of keypair names and the names of files on the local filesystem
|
94
|
+
containing them. If there is an entry in `:keys` with the same name as the server, the file will be
|
95
|
+
passed in the `-i` option to `ssh` when connecting.
|
96
|
+
|
97
|
+
### Launching an instance
|
98
|
+
|
99
|
+
Once a server has been configured, it can be launched by name.
|
100
|
+
|
101
|
+
ftl launch ninja
|
102
|
+
|
103
|
+
To connect to it, run `ftl connect ninja`.
|
104
|
+
|
42
105
|
## Contributing
|
43
106
|
|
44
107
|
1. Fork it
|
data/bin/ftl
CHANGED
@@ -11,6 +11,10 @@ optparse = OptionParser.new do |opts|
|
|
11
11
|
exit
|
12
12
|
end
|
13
13
|
|
14
|
+
# opts.on('-s', '--sample-config', "Displays sample ftl.yml config file") do |opts|
|
15
|
+
# Ftl.sample_config
|
16
|
+
# end
|
17
|
+
|
14
18
|
opts.on('-d', '--headers FILE', Array, "provide custom headers") do |headers|
|
15
19
|
options[:headers] = headers
|
16
20
|
end
|
data/lib/ftl/client.rb
CHANGED
@@ -20,8 +20,10 @@ module Ftl
|
|
20
20
|
ftl headers servers # Show possible headers for servers
|
21
21
|
ftl headers volumes # Show possible headers for volumes
|
22
22
|
ftl edit # Edit ftl.yml with your $EDITOR
|
23
|
-
ftl
|
24
|
-
ftl
|
23
|
+
ftl images # Show AMIs associated with your account
|
24
|
+
ftl <action> ninja # Execute the <action> (specified in ftl.yml) on the remote server instance
|
25
|
+
ftl --config=~/ftl.yml servers # Uses custom config file
|
26
|
+
ftl --headers=id,tags.Name servers # Uses specified headers
|
25
27
|
ftl --version # Show version number
|
26
28
|
}
|
27
29
|
end
|
@@ -32,39 +34,59 @@ module Ftl
|
|
32
34
|
|
33
35
|
class Client
|
34
36
|
|
37
|
+
SINGLE_COMMANDS = %w{ edit sample }
|
38
|
+
|
35
39
|
attr_reader :con
|
36
40
|
attr_accessor :options
|
37
41
|
|
38
42
|
def initialize(args=nil, opts={})
|
39
43
|
load_config(opts)
|
40
|
-
@con = Fog::Compute.new(:provider => 'AWS', :aws_secret_access_key => options['SECRET_ACCESS_KEY'], :aws_access_key_id => options['ACCESS_KEY_ID'])
|
41
44
|
if args && args.length > 0
|
42
45
|
arg = args.reverse.pop
|
43
|
-
|
46
|
+
if (!SINGLE_COMMANDS.include?(arg))
|
47
|
+
@con = Fog::Compute.new(:provider => 'AWS', :aws_secret_access_key => options['SECRET_ACCESS_KEY'], :aws_access_key_id => options['ACCESS_KEY_ID'])
|
48
|
+
end
|
49
|
+
begin
|
50
|
+
send(arg, args - [arg])
|
51
|
+
rescue
|
52
|
+
Ftl.help
|
53
|
+
end
|
44
54
|
else
|
45
55
|
Ftl.help
|
46
56
|
end
|
47
57
|
end
|
48
58
|
|
49
|
-
def
|
50
|
-
if args.first.nil?
|
51
|
-
display "Please provide a short name for instance\n\t[bold]ftl[/] launch <name>"
|
52
|
-
return
|
53
|
-
end
|
59
|
+
def launch_instance(args)
|
54
60
|
display "Spinning up FTL..."
|
55
61
|
opts = options
|
56
62
|
opts = options[:templates][args.first.to_sym] if !options[:templates][args.first.to_sym].nil?
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
:
|
63
|
-
:
|
64
|
-
:
|
65
|
-
|
63
|
+
|
64
|
+
opts[:group_ids] = (opts[:group_ids] || []) + opts[:groups].select { | group | group.to_s =~ /^sg-[0-9a-f]{8}$/ }
|
65
|
+
opts[:groups] = opts[:groups].reject { | group | group.to_s =~ /^sg-[0-9a-f]{8}$/ }
|
66
|
+
|
67
|
+
server = con.servers.create(:user_data => opts[:user_data],
|
68
|
+
:key_name => opts[:keypair],
|
69
|
+
:groups => opts[:groups],
|
70
|
+
:security_group_ids => opts[:group_ids],
|
71
|
+
:image_id => opts[:ami],
|
72
|
+
:availability_zone => opts[:availability_zone],
|
73
|
+
:flavor_id => opts[:instance_type],
|
74
|
+
:username => opts[:username],
|
75
|
+
:tags => opts[:tags].merge(:Name => args.first),
|
76
|
+
:subnet_id => opts[:subnet_id],
|
77
|
+
:private_ip_address => opts[:ip_private],
|
78
|
+
)
|
79
|
+
|
66
80
|
display server
|
67
|
-
|
81
|
+
display "Executing :post_script..." if opts[:post_script]
|
82
|
+
eval(opts[:post_script]) if opts[:post_script]
|
83
|
+
end
|
84
|
+
|
85
|
+
def launch(args={})
|
86
|
+
guard(args.first, "Please provide a short name for instance\n\t[bold]ftl[/] launch <name>")
|
87
|
+
display "Spinning up FTL..."
|
88
|
+
options.merge(options[:templates][args.first.to_sym]) if !options[:templates][args.first.to_sym].nil?
|
89
|
+
server = launch_instance(args)
|
68
90
|
end
|
69
91
|
alias :up :launch
|
70
92
|
alias :spinup :launch
|
@@ -72,28 +94,12 @@ module Ftl
|
|
72
94
|
alias :new :launch
|
73
95
|
|
74
96
|
def spot(args={})
|
75
|
-
|
76
|
-
|
77
|
-
return
|
78
|
-
end
|
79
|
-
if args[1].nil?
|
80
|
-
display "Please provide a price for spot request\n\t[bold]ftl[/] spot <name> <price>"
|
81
|
-
return
|
82
|
-
end
|
97
|
+
guard(args.first, "Please provide a short name for instance\n\t[bold]ftl[/] spot <name> <price>")
|
98
|
+
guard(args[1], "Please provide a price for spot request\n\t[bold]ftl[/] spot <name> <price>")
|
83
99
|
display "Spinning up FTL..."
|
84
|
-
|
85
|
-
|
86
|
-
server =
|
87
|
-
:price => args[1],
|
88
|
-
:key_name => opts[:keypair],
|
89
|
-
:groups => opts[:groups],
|
90
|
-
:image_id => opts[:ami],
|
91
|
-
:availability_zone => opts[:availability_zone],
|
92
|
-
:flavor_id => opts[:instance_type],
|
93
|
-
:username => opts[:username],
|
94
|
-
:tags => {:Name => args.first}
|
95
|
-
)
|
96
|
-
display server
|
100
|
+
options.merge(options[:templates][args.first.to_sym]) if !options[:templates][args.first.to_sym].nil?
|
101
|
+
options[:price] = args[1]
|
102
|
+
server = launch_instance(args)
|
97
103
|
end
|
98
104
|
|
99
105
|
def spots(args={})
|
@@ -101,10 +107,7 @@ module Ftl
|
|
101
107
|
end
|
102
108
|
|
103
109
|
def cancel(args={})
|
104
|
-
|
105
|
-
display "Please provide the id for the spot request to cancel."
|
106
|
-
return
|
107
|
-
end
|
110
|
+
guard(args.first, "Please provide the id for the spot request to cancel.")
|
108
111
|
spot = con.spot_requests.get(args.first)
|
109
112
|
if spot && spot.destroy
|
110
113
|
display "Canceled Spot Instance #{spot.id}."
|
@@ -115,7 +118,9 @@ module Ftl
|
|
115
118
|
|
116
119
|
def connect(args={})
|
117
120
|
if match = find_instances(args.first).select{|i| i.state == "running" }.first
|
118
|
-
|
121
|
+
opt_key = "-i #{options[:keys][match[:key_name]]}" unless (options[:keys].nil? || options[:keys][match[:key_name]].nil?)
|
122
|
+
hostname = match[:dns_name] || match[:public_ip_address] || match[:private_ip_address]
|
123
|
+
exec("ssh #{opt_key} #{options[:username]||'root'}@#{hostname}")
|
119
124
|
else
|
120
125
|
display "Typo alert! No server found!"
|
121
126
|
end
|
@@ -124,6 +129,7 @@ module Ftl
|
|
124
129
|
alias :ssh :connect
|
125
130
|
|
126
131
|
def status(args={})
|
132
|
+
guard(args, :message => "Please provide the name/id of a server (ftl status <server>)")
|
127
133
|
server = find_instance(args.first)
|
128
134
|
display server
|
129
135
|
end
|
@@ -150,11 +156,11 @@ module Ftl
|
|
150
156
|
display "No instances found"
|
151
157
|
end
|
152
158
|
end
|
153
|
-
alias :d :destroy
|
154
|
-
alias :delete :destroy
|
155
|
-
alias :kill :destroy
|
156
|
-
alias :down :destroy
|
157
|
-
alias :shutdown :destroy
|
159
|
+
alias :d :destroy
|
160
|
+
alias :delete :destroy
|
161
|
+
alias :kill :destroy
|
162
|
+
alias :down :destroy
|
163
|
+
alias :shutdown :destroy
|
158
164
|
|
159
165
|
def info(args={})
|
160
166
|
display find_instance(args.first)
|
@@ -171,9 +177,17 @@ module Ftl
|
|
171
177
|
Formatador.display_table(con.images.find(:id => args.first))
|
172
178
|
end
|
173
179
|
|
174
|
-
# TODO: Make
|
175
|
-
|
176
|
-
|
180
|
+
# TODO: Make this better by including more details of block devices
|
181
|
+
def images(args={})
|
182
|
+
hashes = con.describe_images('Owner' => 'self').body['imagesSet'].collect do |hash|
|
183
|
+
h = {}
|
184
|
+
h[:image_id] = hash['imageId']
|
185
|
+
h[:name] = hash['name']
|
186
|
+
h[:rootDeviceType] = hash['rootDeviceType']
|
187
|
+
h
|
188
|
+
end
|
189
|
+
puts Formatador.display_table(hashes)
|
190
|
+
end
|
177
191
|
|
178
192
|
def headers(args={})
|
179
193
|
display "Showing header options for #{args.first}"
|
@@ -189,12 +203,22 @@ module Ftl
|
|
189
203
|
`$EDITOR ~/.ftl/ftl.yml`
|
190
204
|
end
|
191
205
|
|
206
|
+
def sample(args={})
|
207
|
+
puts File.open(File.dirname(__FILE__) + "/../resources/ftl.yml").read
|
208
|
+
end
|
192
209
|
|
193
210
|
###########################################################################
|
194
211
|
## private ###
|
195
212
|
###########################################################################
|
196
213
|
private
|
197
214
|
|
215
|
+
def guard(arg, options={:message => "Please refer to ftl help"})
|
216
|
+
if arg.nil?
|
217
|
+
display options[:message]
|
218
|
+
exit
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
198
222
|
def ftl_yml
|
199
223
|
File.open("lib/resources/ftl.yml").read
|
200
224
|
end
|
@@ -208,11 +232,11 @@ module Ftl
|
|
208
232
|
default_config_dir = '/.ftl/'
|
209
233
|
default_config_home = "#{ENV['HOME']}#{default_config_dir}"
|
210
234
|
default_config_file = "#{default_config_home}#{default_config_name}"
|
211
|
-
if Dir.exist?(default_config_home) # Directory exists
|
235
|
+
if Dir.exist?(default_config_home) # Directory exists
|
212
236
|
if !File.exist?(default_config_file) # File does not
|
213
237
|
File.open(default_config_file, 'w') {|f| f << ftl_yml }
|
214
238
|
end
|
215
|
-
else # Directory does not exist
|
239
|
+
else # Directory does not exist
|
216
240
|
Dir.mkdir(default_config_home)
|
217
241
|
File.open(default_config_file, 'w') {|f| f << ftl_yml }
|
218
242
|
end
|
@@ -235,7 +259,7 @@ module Ftl
|
|
235
259
|
|
236
260
|
def _headers_for(object)
|
237
261
|
return options[:headers].map(&:to_sym) if options[:headers]
|
238
|
-
case object
|
262
|
+
case object
|
239
263
|
when :snapshots
|
240
264
|
[:id, :volume_id, :state, :volume_size, :description, :"tags.Name"]
|
241
265
|
when :spot_requests
|
@@ -258,16 +282,20 @@ module Ftl
|
|
258
282
|
Formatador.display_line(msg)
|
259
283
|
end
|
260
284
|
|
285
|
+
def eval_action(script, args)
|
286
|
+
# TODO Complete the script to handle multiple servers, like:
|
287
|
+
# ftl bundle server1 server2 server3
|
288
|
+
server = find_instance(args[1].first)
|
289
|
+
eval(script, binding)
|
290
|
+
end
|
291
|
+
|
261
292
|
def method_missing(*args)
|
262
293
|
begin
|
263
|
-
method = args.first
|
264
|
-
|
265
|
-
if
|
266
|
-
|
267
|
-
|
268
|
-
Ftl.help
|
269
|
-
end
|
270
|
-
rescue
|
294
|
+
method = args.first.to_sym
|
295
|
+
display con.send(method).table(_headers_for(method)) if con.respond_to? method
|
296
|
+
eval_action(@options[:actions][method], args) if @options[:actions][method]
|
297
|
+
Ftl.help
|
298
|
+
rescue
|
271
299
|
end
|
272
300
|
end
|
273
301
|
|
data/lib/ftl/version.rb
CHANGED
data/lib/resources/ftl.yml
CHANGED
@@ -1,20 +1,33 @@
|
|
1
|
+
# Sample ftl.yml. Your ftl.yml should be located in ~/.ftl/ftl.yml and should
|
2
|
+
# look similar to this file
|
3
|
+
#
|
4
|
+
# FILL IN THESE TWO VALUES
|
1
5
|
ACCESS_KEY_ID:
|
2
6
|
SECRET_ACCESS_KEY:
|
7
|
+
|
3
8
|
:ami: ami-a29943cb # Ubuntu 12.04 LTS Precise Pangolin
|
4
9
|
:username: ubuntu
|
5
|
-
:instance_type: m1.small
|
6
|
-
:
|
10
|
+
:instance_type: t1.micro # m1.small
|
11
|
+
:user_data: |
|
7
12
|
#!/bin/sh
|
8
13
|
touch /root/file.touched
|
9
|
-
:
|
14
|
+
:post_script: |
|
10
15
|
:tags: {}
|
16
|
+
:actions:
|
17
|
+
:uptime: puts server.ssh('uptime').first.stdout
|
18
|
+
:mount: puts server.ssh('mount').first.stdout
|
19
|
+
:df: puts server.ssh('df -h').first.stdout
|
20
|
+
:w: puts server.ssh('w').first.stdout
|
21
|
+
|
11
22
|
|
12
23
|
:templates:
|
13
24
|
:default:
|
14
25
|
:ami: ami-a29943cb # Ubuntu 12.04 LTS Precise Pangolin
|
15
26
|
:username: ubuntu
|
16
27
|
:instance_type: m1.small
|
17
|
-
:
|
28
|
+
:user_data: |
|
18
29
|
#!/bin/sh
|
19
30
|
touch /root/file.touched
|
20
|
-
:
|
31
|
+
:post_script: |
|
32
|
+
|
33
|
+
|
metadata
CHANGED
@@ -1,79 +1,82 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: ftl
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.3
|
3
|
+
version: !ruby/object:Gem::Version
|
5
4
|
prerelease:
|
5
|
+
version: 0.2.4
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Matt Petty
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
|
13
|
+
date: 2012-07-15 00:00:00 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
15
16
|
name: rdoc
|
16
|
-
requirement: &
|
17
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
18
|
none: false
|
18
|
-
requirements:
|
19
|
-
- -
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version:
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: "0"
|
22
23
|
type: :development
|
23
24
|
prerelease: false
|
24
|
-
version_requirements: *
|
25
|
-
- !ruby/object:Gem::Dependency
|
25
|
+
version_requirements: *id001
|
26
|
+
- !ruby/object:Gem::Dependency
|
26
27
|
name: aruba
|
27
|
-
requirement: &
|
28
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
28
29
|
none: false
|
29
|
-
requirements:
|
30
|
-
- -
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version:
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
33
34
|
type: :development
|
34
35
|
prerelease: false
|
35
|
-
version_requirements: *
|
36
|
-
- !ruby/object:Gem::Dependency
|
36
|
+
version_requirements: *id002
|
37
|
+
- !ruby/object:Gem::Dependency
|
37
38
|
name: rake
|
38
|
-
requirement: &
|
39
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
39
40
|
none: false
|
40
|
-
requirements:
|
41
|
+
requirements:
|
41
42
|
- - ~>
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
+
- !ruby/object:Gem::Version
|
43
44
|
version: 0.9.2
|
44
45
|
type: :development
|
45
46
|
prerelease: false
|
46
|
-
version_requirements: *
|
47
|
-
- !ruby/object:Gem::Dependency
|
47
|
+
version_requirements: *id003
|
48
|
+
- !ruby/object:Gem::Dependency
|
48
49
|
name: fog
|
49
|
-
requirement: &
|
50
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
50
51
|
none: false
|
51
|
-
requirements:
|
52
|
-
- -
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version:
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: "0"
|
55
56
|
type: :runtime
|
56
57
|
prerelease: false
|
57
|
-
version_requirements: *
|
58
|
-
- !ruby/object:Gem::Dependency
|
58
|
+
version_requirements: *id004
|
59
|
+
- !ruby/object:Gem::Dependency
|
59
60
|
name: formatador
|
60
|
-
requirement: &
|
61
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
61
62
|
none: false
|
62
|
-
requirements:
|
63
|
+
requirements:
|
63
64
|
- - ~>
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
+
- !ruby/object:Gem::Version
|
65
66
|
version: 0.2.2
|
66
67
|
type: :runtime
|
67
68
|
prerelease: false
|
68
|
-
version_requirements: *
|
69
|
+
version_requirements: *id005
|
69
70
|
description: Ftl is a command line tool for Fog/AWS
|
70
|
-
email:
|
71
|
+
email:
|
71
72
|
- matt@kizmeta.com
|
72
|
-
executables:
|
73
|
+
executables:
|
73
74
|
- ftl
|
74
75
|
extensions: []
|
76
|
+
|
75
77
|
extra_rdoc_files: []
|
76
|
-
|
78
|
+
|
79
|
+
files:
|
77
80
|
- .gitignore
|
78
81
|
- Changelog
|
79
82
|
- Gemfile
|
@@ -98,35 +101,38 @@ files:
|
|
98
101
|
- test/tc_something.rb
|
99
102
|
homepage: http://github.com/lodestone/ftl
|
100
103
|
licenses: []
|
104
|
+
|
101
105
|
post_install_message:
|
102
106
|
rdoc_options: []
|
103
|
-
|
107
|
+
|
108
|
+
require_paths:
|
104
109
|
- lib
|
105
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
106
111
|
none: false
|
107
|
-
requirements:
|
108
|
-
- -
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
|
111
|
-
segments:
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
hash: -3514707693365094716
|
116
|
+
segments:
|
112
117
|
- 0
|
113
|
-
|
114
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
|
+
version: "0"
|
119
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
120
|
none: false
|
116
|
-
requirements:
|
117
|
-
- -
|
118
|
-
- !ruby/object:Gem::Version
|
119
|
-
|
120
|
-
segments:
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
hash: -3514707693365094716
|
125
|
+
segments:
|
121
126
|
- 0
|
122
|
-
|
127
|
+
version: "0"
|
123
128
|
requirements: []
|
129
|
+
|
124
130
|
rubyforge_project:
|
125
131
|
rubygems_version: 1.8.11
|
126
132
|
signing_key:
|
127
133
|
specification_version: 3
|
128
134
|
summary: Ftl is a command line tool for Fog/AWS
|
129
|
-
test_files:
|
135
|
+
test_files:
|
130
136
|
- features/ftl.feature
|
131
137
|
- features/step_definitions/ftl_steps.rb
|
132
138
|
- features/support/env.rb
|