sonic-screwdriver 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/Gemfile.lock +26 -2
- data/README.md +156 -23
- data/bin/sonic +8 -1
- data/docs/.gitignore +4 -0
- data/docs/CNAME +1 -0
- data/docs/Gemfile +3 -0
- data/docs/LICENSE +21 -0
- data/docs/README.md +21 -0
- data/docs/_config.yml +69 -0
- data/docs/_docs/commands.md +10 -0
- data/docs/_docs/how-it-works.md +34 -0
- data/docs/_docs/install.md +75 -0
- data/docs/_docs/next-steps.md +18 -0
- data/docs/_docs/settings.md +73 -0
- data/docs/_docs/sonic-ecs-exec.md +7 -0
- data/docs/_docs/sonic-ecs-run.md +7 -0
- data/docs/_docs/sonic-execute.md +7 -0
- data/docs/_docs/sonic-help.md +7 -0
- data/docs/_docs/sonic-list.md +7 -0
- data/docs/_docs/sonic-ssh.md +7 -0
- data/docs/_docs/tutorial-ecs-exec.md +69 -0
- data/docs/_docs/tutorial-ecs-run.md +94 -0
- data/docs/_docs/tutorial-execute.md +38 -0
- data/docs/_docs/tutorial-ssh.md +119 -0
- data/docs/_docs/tutorial.md +11 -0
- data/docs/_docs/why.md +27 -0
- data/docs/_includes/about.html +19 -0
- data/docs/_includes/commands.html +28 -0
- data/docs/_includes/contact.html +17 -0
- data/docs/_includes/contact_disqus.html +16 -0
- data/docs/_includes/contact_static.html +17 -0
- data/docs/_includes/content.html +21 -0
- data/docs/_includes/css/bootstrap.min.css +7 -0
- data/docs/_includes/css/main.css +481 -0
- data/docs/_includes/css/quotes.css +102 -0
- data/docs/_includes/css/sonic.css +163 -0
- data/docs/_includes/css/syntax.css +60 -0
- data/docs/_includes/css/table.css +53 -0
- data/docs/_includes/css/timeline.css +201 -0
- data/docs/_includes/edit-on-github.html +11 -0
- data/docs/_includes/example.html +21 -0
- data/docs/_includes/footer.html +49 -0
- data/docs/_includes/head.html +32 -0
- data/docs/_includes/header.html +15 -0
- data/docs/_includes/js.html +28 -0
- data/docs/_includes/js_disqus.html +21 -0
- data/docs/_includes/modals.html +40 -0
- data/docs/_includes/nav.html +27 -0
- data/docs/_includes/quotes.html +19 -0
- data/docs/_includes/subnav.html +35 -0
- data/docs/_includes/ufo-ship-options.md +13 -0
- data/docs/_includes/uses.html +19 -0
- data/docs/_layouts/default.html +11 -0
- data/docs/_layouts/style.css +6 -0
- data/docs/articles.md +5 -0
- data/docs/css/font-awesome/css/font-awesome.css +1566 -0
- data/docs/css/font-awesome/css/font-awesome.min.css +4 -0
- data/docs/css/font-awesome/fonts/FontAwesome.otf +0 -0
- data/docs/css/font-awesome/fonts/fontawesome-webfont.eot +0 -0
- data/docs/css/font-awesome/fonts/fontawesome-webfont.svg +504 -0
- data/docs/css/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
- data/docs/css/font-awesome/fonts/fontawesome-webfont.woff +0 -0
- data/docs/docs.md +21 -0
- data/docs/img/logos/boltops-logo-full.png +0 -0
- data/docs/img/logos/boltops-logo.png +0 -0
- data/docs/img/sonic-screwdriver.jpg +0 -0
- data/docs/img/tutorials/ec2-console-public-ip.png +0 -0
- data/docs/img/ufo.jpg +0 -0
- data/docs/index.html +9 -0
- data/docs/js/bootstrap.js +2114 -0
- data/docs/js/bootstrap.min.js +6 -0
- data/docs/js/cbpAnimatedHeader.js +44 -0
- data/docs/js/cbpAnimatedHeader.min.js +11 -0
- data/docs/js/classie.js +80 -0
- data/docs/js/contact_me.js +70 -0
- data/docs/js/contact_me_static.js +23 -0
- data/docs/js/freelancer.js +37 -0
- data/docs/js/jqBootstrapValidation.js +912 -0
- data/docs/js/jquery-1.11.0.js +4 -0
- data/docs/js/jquery.easing.min.js +44 -0
- data/docs/js/nav.js +53 -0
- data/docs/quick-start.md +39 -0
- data/docs/style.css +3 -0
- data/lib/bash_scripts/docker-exec.sh +15 -0
- data/lib/bash_scripts/docker-run.sh +15 -0
- data/lib/sonic.rb +11 -2
- data/lib/sonic/aws_services.rb +19 -0
- data/lib/sonic/cli.rb +37 -8
- data/lib/sonic/cli/help.rb +123 -3
- data/lib/sonic/default/settings.yml +12 -0
- data/lib/sonic/docker.rb +128 -0
- data/lib/sonic/execute.rb +131 -0
- data/lib/sonic/list.rb +85 -0
- data/lib/sonic/settings.rb +80 -0
- data/lib/sonic/ssh.rb +136 -0
- data/lib/sonic/ssh/ec2_tag.rb +59 -0
- data/lib/sonic/ssh/identifier_detector.rb +145 -0
- data/lib/sonic/ui.rb +26 -0
- data/lib/sonic/version.rb +2 -2
- data/qa.md +21 -0
- data/sonic.gemspec +3 -1
- data/spec/fixtures/home/.gitkeep +0 -0
- data/spec/fixtures/project/.gitkeep +0 -0
- data/spec/fixtures/project/command.txt +2 -0
- data/spec/lib/cli_spec.rb +16 -6
- data/spec/lib/sonic/execute_spec.rb +35 -0
- data/spec/spec_helper.rb +5 -3
- metadata +133 -3
@@ -0,0 +1,145 @@
|
|
1
|
+
module Sonic
|
2
|
+
class Ssh
|
3
|
+
autoload :Ec2Tag, 'sonic/ssh/ec2_tag'
|
4
|
+
class IdentifierDetector
|
5
|
+
|
6
|
+
include Ec2Tag
|
7
|
+
include AwsServices
|
8
|
+
|
9
|
+
def initialize(cluster, service, identifier, options)
|
10
|
+
@cluster = cluster
|
11
|
+
@service = service
|
12
|
+
@identifier = identifier
|
13
|
+
@options = options
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns exactly 1 instance_id or exits the program.
|
17
|
+
# The bang check_* methods can exit early.
|
18
|
+
def detect!
|
19
|
+
instance_id = case detected_type
|
20
|
+
when :ecs_container_instance_or_task_arn
|
21
|
+
check_cluster_exists! unless @options[:noop]
|
22
|
+
|
23
|
+
find_container_instance(@identifier) ||
|
24
|
+
find_task(@identifier)
|
25
|
+
when :ecs_service
|
26
|
+
check_cluster_exists! unless @options[:noop]
|
27
|
+
check_service_exists!
|
28
|
+
check_tasks_running!
|
29
|
+
|
30
|
+
find_container_instance(task.container_instance_arn)
|
31
|
+
when :ec2_tag
|
32
|
+
find_ec2_instance
|
33
|
+
when :ec2_instance
|
34
|
+
@identifier
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Any of these methods either returns exactly 1 instance_id or exit the program.
|
39
|
+
#
|
40
|
+
# Returns detected_type
|
41
|
+
def detected_type
|
42
|
+
# Note order here matters because some checks are slower in performance
|
43
|
+
@detected_type ||= if instance_id? # fast
|
44
|
+
:ec2_instance
|
45
|
+
elsif container_instance_or_task_arn? # fast
|
46
|
+
:ecs_container_instance_or_task_arn
|
47
|
+
elsif ec2_tag_exists? # slow
|
48
|
+
:ec2_tag
|
49
|
+
else
|
50
|
+
:ecs_service # will be slower with the logic from the calling method
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# takes argument
|
55
|
+
def find_container_instance(container_instance_arn)
|
56
|
+
response = ecs.describe_container_instances(
|
57
|
+
cluster: @cluster,
|
58
|
+
container_instances: [container_instance_arn])
|
59
|
+
|
60
|
+
container_instance = response.container_instances.first
|
61
|
+
return false unless container_instance
|
62
|
+
|
63
|
+
ec2_instance_id = container_instance.ec2_instance_id
|
64
|
+
end
|
65
|
+
|
66
|
+
def find_task(task_arn)
|
67
|
+
response = ecs.describe_tasks(cluster: @cluster, tasks: [task_arn])
|
68
|
+
|
69
|
+
task = response.tasks.first
|
70
|
+
unless task
|
71
|
+
puts "Unable to find a #{task_arn.green} container instance or task in the #{@cluster.green} cluster."
|
72
|
+
exit 1
|
73
|
+
end
|
74
|
+
|
75
|
+
find_container_instance(task.container_instance_arn)
|
76
|
+
end
|
77
|
+
|
78
|
+
def check_cluster_exists!
|
79
|
+
cluster = ecs.describe_clusters(clusters: [@cluster]).clusters.first
|
80
|
+
unless cluster
|
81
|
+
UI.error "The #{@cluster.green} cluster does not exist. Are you sure you specified the right cluster?"
|
82
|
+
exit 1
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def check_service_exists!
|
87
|
+
begin
|
88
|
+
resp = ecs.describe_services(services: [@service], cluster: @cluster)
|
89
|
+
rescue Aws::ECS::Errors::ClusterNotFoundException
|
90
|
+
UI.error("Unable to find ECS cluster '#{@cluster}'. Are you sure the cluster exists?")
|
91
|
+
UI.say("You can specify the cluster with --cluster or you can specify it as a setting in settings.yml.")
|
92
|
+
UI.say("More info about settings available at: http://sonic-screwdriver.cloud/docs/settings")
|
93
|
+
exit 1
|
94
|
+
end
|
95
|
+
|
96
|
+
service = resp.services.first
|
97
|
+
unless service
|
98
|
+
UI.error "The #{@service.green} service does not exist in #{@cluster.green} cluster. Are you sure you specified the right service and cluster?"
|
99
|
+
exit 1
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def check_tasks_running!
|
104
|
+
if task_arns.empty?
|
105
|
+
puts "Unable to find a running task that belongs to the #{@service} service on the #{@cluster} cluster."
|
106
|
+
puts "There must be a running task in order for sonic to look up an container instance."
|
107
|
+
exit 1
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def task_arns
|
112
|
+
@task_arns ||= ecs.list_tasks(cluster: @cluster, service_name: @service).task_arns
|
113
|
+
end
|
114
|
+
|
115
|
+
# Only need one container instance to ssh into so we'll just use the first.
|
116
|
+
# Useful to have this in a method for subclasses like Sonic::Exec.
|
117
|
+
def task
|
118
|
+
@task ||= ecs.describe_tasks(cluster: @cluster, tasks: [task_arns.first]).tasks.first
|
119
|
+
end
|
120
|
+
|
121
|
+
|
122
|
+
# Examples:
|
123
|
+
#
|
124
|
+
# Container instance ids:
|
125
|
+
# b748e59a-b679-42a7-b713-afb12294935b
|
126
|
+
# 9f1dadc7-4f67-41da-abec-ec08810bfbc9
|
127
|
+
#
|
128
|
+
# Task ids:
|
129
|
+
# 222c9e66-780b-4755-8c16-8670988e8011
|
130
|
+
# 6358f9c2-b231-4f5b-a59b-15bf19d52a15
|
131
|
+
#
|
132
|
+
# Container instance and task ids have the same format
|
133
|
+
def container_instance_or_task_arn?
|
134
|
+
@identifier =~ /.{8}-.{4}-.{4}-.{4}-.{12}/
|
135
|
+
end
|
136
|
+
|
137
|
+
# Examples:
|
138
|
+
# i-006a097bb10643e20
|
139
|
+
def instance_id?
|
140
|
+
@identifier =~ /i-.{17}/
|
141
|
+
end
|
142
|
+
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
data/lib/sonic/ui.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
module Sonic
|
2
|
+
class UI
|
3
|
+
class << self
|
4
|
+
@@mute = false
|
5
|
+
def mute
|
6
|
+
@@mute
|
7
|
+
end
|
8
|
+
def mute=(v)
|
9
|
+
@@mute=v
|
10
|
+
end
|
11
|
+
|
12
|
+
@@noop = false
|
13
|
+
def noop=(v)
|
14
|
+
@@noop=v
|
15
|
+
end
|
16
|
+
|
17
|
+
def say(msg='')
|
18
|
+
msg = "NOOP: #{msg}" if @@noop
|
19
|
+
puts msg unless mute
|
20
|
+
end
|
21
|
+
def error(msg='')
|
22
|
+
say "ERROR: #{msg}".colorize(:red)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/sonic/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module Sonic
|
2
|
-
VERSION = "0.0
|
3
|
-
end
|
2
|
+
VERSION = "1.0.0"
|
3
|
+
end
|
data/qa.md
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# QA Notes
|
2
|
+
|
3
|
+
sonic ssh [INSTANCE_ID]
|
4
|
+
* when instance is ready
|
5
|
+
* when instance is terminated
|
6
|
+
* when instance is pending
|
7
|
+
* when instance does not exist
|
8
|
+
|
9
|
+
sonic ssh [ECS_CONTAINER_ID]
|
10
|
+
* when container instance found
|
11
|
+
* when container instance is terminated
|
12
|
+
* when container instance does not exist
|
13
|
+
|
14
|
+
sonic ssh [ECS_SERVICE]
|
15
|
+
* when service found and instance found
|
16
|
+
* when service found but instance not found
|
17
|
+
* when service not found
|
18
|
+
|
19
|
+
sonic ssh [ECS_TASK_ID]
|
20
|
+
* when task found and instance found
|
21
|
+
* when task not found
|
data/sonic.gemspec
CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |spec|
|
|
7
7
|
spec.name = "sonic-screwdriver"
|
8
8
|
spec.version = Sonic::VERSION
|
9
9
|
spec.authors = ["Tung Nguyen"]
|
10
|
-
spec.email = ["
|
10
|
+
spec.email = ["tung@boltops.com"]
|
11
11
|
spec.description = %q{Multi-functional tool to manage AWS infrastructure}
|
12
12
|
spec.summary = %q{Multi-functional tool to manage AWS infrastructure}
|
13
13
|
spec.homepage = ""
|
@@ -21,6 +21,8 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_dependency "thor"
|
22
22
|
spec.add_dependency "hashie"
|
23
23
|
spec.add_dependency "colorize"
|
24
|
+
spec.add_dependency "aws-sdk"
|
25
|
+
spec.add_dependency "tty-prompt"
|
24
26
|
|
25
27
|
spec.add_development_dependency "bundler", "~> 1.3"
|
26
28
|
spec.add_development_dependency "rake"
|
File without changes
|
File without changes
|
data/spec/lib/cli_spec.rb
CHANGED
@@ -2,18 +2,28 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
# to run specs with what's remembered from vcr
|
4
4
|
# $ rake
|
5
|
-
#
|
5
|
+
#
|
6
6
|
# to run specs with new fresh data from aws api calls
|
7
7
|
# $ rake clean:vcr ; time rake
|
8
8
|
describe Sonic::CLI do
|
9
9
|
before(:all) do
|
10
|
-
@args = "--
|
10
|
+
@args = "--project-root spec/fixtures/project --noop"
|
11
11
|
end
|
12
12
|
|
13
13
|
describe "sonic" do
|
14
|
-
it "should
|
15
|
-
out = execute("bin/sonic
|
16
|
-
expect(out).to include("
|
14
|
+
it "ssh should print out ssh command to be ran" do
|
15
|
+
out = execute("bin/sonic ssh my-service #{@args} --cluster default")
|
16
|
+
expect(out).to include("=> ssh")
|
17
|
+
end
|
18
|
+
|
19
|
+
it "execute should print that command has been sent" do
|
20
|
+
out = execute("bin/sonic execute #{@args} --filter 1,2,3 uptime")
|
21
|
+
expect(out).to include("Command sent")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "list should list running instances" do
|
25
|
+
out = execute("bin/sonic list #{@args} --filter 1,2,3 --header")
|
26
|
+
expect(out).to include("Instance Id")
|
17
27
|
end
|
18
28
|
end
|
19
|
-
end
|
29
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Sonic::Execute do
|
4
|
+
before(:each) do
|
5
|
+
@options = {
|
6
|
+
project_root: "spec/fixtures/project",
|
7
|
+
filter: "hi-web-stag,hi-clock-stag"
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "Sonic#execute" do
|
12
|
+
it "should build up options for ssm send command with inline command" do
|
13
|
+
execute = Sonic::Execute.new(["uname", "-a"], @options)
|
14
|
+
options = execute.build_ssm_options
|
15
|
+
expect(options[:instance_ids]).to eq nil
|
16
|
+
expect(options[:targets]).to eq [{:key=>"tag:Name", :values=>%w[hi-web-stag hi-clock-stag]}]
|
17
|
+
expect(options[:document_name]).to eq "AWS-RunShellScript"
|
18
|
+
expect(options[:comment]).to include "sonic "
|
19
|
+
expect(options[:parameters]["commands"]).to eq ["uname -a"]
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should build up options for ssm send command with file" do
|
23
|
+
execute = Sonic::Execute.new(["file://command.txt"], @options)
|
24
|
+
options = execute.build_ssm_options
|
25
|
+
expect(options[:instance_ids]).to eq nil
|
26
|
+
expect(options[:targets]).to eq [{:key=>"tag:Name", :values=>%w[hi-web-stag hi-clock-stag]}]
|
27
|
+
expect(options[:document_name]).to eq "AWS-RunShellScript"
|
28
|
+
expect(options[:comment]).to include "sonic "
|
29
|
+
expect(options[:parameters]["commands"]).to eq([
|
30
|
+
'#!/usr/bin/env ruby',
|
31
|
+
'puts "hi"'
|
32
|
+
])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
ENV['TEST'] = '1'
|
2
|
+
# Ensures aws api never called. Fixture home folder does not contain ~/.aws/credentails
|
3
|
+
ENV['HOME'] = "spec/fixtures/home"
|
2
4
|
|
3
|
-
|
4
|
-
|
5
|
+
# Ensures aws api never called. Fixture home folder does not contain ~/.aws/credentails
|
6
|
+
ENV['HOME'] = "spec/fixtures/home"
|
5
7
|
|
6
8
|
require "pp"
|
7
9
|
|
@@ -19,4 +21,4 @@ end
|
|
19
21
|
|
20
22
|
RSpec.configure do |c|
|
21
23
|
c.include Helpers
|
22
|
-
end
|
24
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sonic-screwdriver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tung Nguyen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-06-
|
11
|
+
date: 2017-06-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -52,6 +52,34 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: aws-sdk
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: tty-prompt
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: bundler
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -124,7 +152,7 @@ dependencies:
|
|
124
152
|
version: '0'
|
125
153
|
description: Multi-functional tool to manage AWS infrastructure
|
126
154
|
email:
|
127
|
-
-
|
155
|
+
- tung@boltops.com
|
128
156
|
executables:
|
129
157
|
- sonic
|
130
158
|
extensions: []
|
@@ -132,6 +160,7 @@ extra_rdoc_files: []
|
|
132
160
|
files:
|
133
161
|
- ".gitignore"
|
134
162
|
- ".rspec"
|
163
|
+
- CHANGELOG.md
|
135
164
|
- Gemfile
|
136
165
|
- Gemfile.lock
|
137
166
|
- Guardfile
|
@@ -139,13 +168,110 @@ files:
|
|
139
168
|
- README.md
|
140
169
|
- Rakefile
|
141
170
|
- bin/sonic
|
171
|
+
- docs/.gitignore
|
172
|
+
- docs/CNAME
|
173
|
+
- docs/Gemfile
|
174
|
+
- docs/LICENSE
|
175
|
+
- docs/README.md
|
176
|
+
- docs/_config.yml
|
177
|
+
- docs/_docs/commands.md
|
178
|
+
- docs/_docs/how-it-works.md
|
179
|
+
- docs/_docs/install.md
|
180
|
+
- docs/_docs/next-steps.md
|
181
|
+
- docs/_docs/settings.md
|
182
|
+
- docs/_docs/sonic-ecs-exec.md
|
183
|
+
- docs/_docs/sonic-ecs-run.md
|
184
|
+
- docs/_docs/sonic-execute.md
|
185
|
+
- docs/_docs/sonic-help.md
|
186
|
+
- docs/_docs/sonic-list.md
|
187
|
+
- docs/_docs/sonic-ssh.md
|
188
|
+
- docs/_docs/tutorial-ecs-exec.md
|
189
|
+
- docs/_docs/tutorial-ecs-run.md
|
190
|
+
- docs/_docs/tutorial-execute.md
|
191
|
+
- docs/_docs/tutorial-ssh.md
|
192
|
+
- docs/_docs/tutorial.md
|
193
|
+
- docs/_docs/why.md
|
194
|
+
- docs/_includes/about.html
|
195
|
+
- docs/_includes/commands.html
|
196
|
+
- docs/_includes/contact.html
|
197
|
+
- docs/_includes/contact_disqus.html
|
198
|
+
- docs/_includes/contact_static.html
|
199
|
+
- docs/_includes/content.html
|
200
|
+
- docs/_includes/css/bootstrap.min.css
|
201
|
+
- docs/_includes/css/main.css
|
202
|
+
- docs/_includes/css/quotes.css
|
203
|
+
- docs/_includes/css/sonic.css
|
204
|
+
- docs/_includes/css/syntax.css
|
205
|
+
- docs/_includes/css/table.css
|
206
|
+
- docs/_includes/css/timeline.css
|
207
|
+
- docs/_includes/edit-on-github.html
|
208
|
+
- docs/_includes/example.html
|
209
|
+
- docs/_includes/footer.html
|
210
|
+
- docs/_includes/head.html
|
211
|
+
- docs/_includes/header.html
|
212
|
+
- docs/_includes/js.html
|
213
|
+
- docs/_includes/js_disqus.html
|
214
|
+
- docs/_includes/modals.html
|
215
|
+
- docs/_includes/nav.html
|
216
|
+
- docs/_includes/quotes.html
|
217
|
+
- docs/_includes/subnav.html
|
218
|
+
- docs/_includes/ufo-ship-options.md
|
219
|
+
- docs/_includes/uses.html
|
220
|
+
- docs/_layouts/default.html
|
221
|
+
- docs/_layouts/style.css
|
222
|
+
- docs/articles.md
|
223
|
+
- docs/css/font-awesome/css/font-awesome.css
|
224
|
+
- docs/css/font-awesome/css/font-awesome.min.css
|
225
|
+
- docs/css/font-awesome/fonts/FontAwesome.otf
|
226
|
+
- docs/css/font-awesome/fonts/fontawesome-webfont.eot
|
227
|
+
- docs/css/font-awesome/fonts/fontawesome-webfont.svg
|
228
|
+
- docs/css/font-awesome/fonts/fontawesome-webfont.ttf
|
229
|
+
- docs/css/font-awesome/fonts/fontawesome-webfont.woff
|
230
|
+
- docs/docs.md
|
231
|
+
- docs/img/logos/boltops-logo-full.png
|
232
|
+
- docs/img/logos/boltops-logo.png
|
233
|
+
- docs/img/sonic-screwdriver.jpg
|
234
|
+
- docs/img/tutorials/ec2-console-public-ip.png
|
235
|
+
- docs/img/ufo.jpg
|
236
|
+
- docs/index.html
|
237
|
+
- docs/js/bootstrap.js
|
238
|
+
- docs/js/bootstrap.min.js
|
239
|
+
- docs/js/cbpAnimatedHeader.js
|
240
|
+
- docs/js/cbpAnimatedHeader.min.js
|
241
|
+
- docs/js/classie.js
|
242
|
+
- docs/js/contact_me.js
|
243
|
+
- docs/js/contact_me_static.js
|
244
|
+
- docs/js/freelancer.js
|
245
|
+
- docs/js/jqBootstrapValidation.js
|
246
|
+
- docs/js/jquery-1.11.0.js
|
247
|
+
- docs/js/jquery.easing.min.js
|
248
|
+
- docs/js/nav.js
|
249
|
+
- docs/quick-start.md
|
250
|
+
- docs/style.css
|
251
|
+
- lib/bash_scripts/docker-exec.sh
|
252
|
+
- lib/bash_scripts/docker-run.sh
|
142
253
|
- lib/sonic.rb
|
254
|
+
- lib/sonic/aws_services.rb
|
143
255
|
- lib/sonic/cli.rb
|
144
256
|
- lib/sonic/cli/help.rb
|
145
257
|
- lib/sonic/command.rb
|
258
|
+
- lib/sonic/default/settings.yml
|
259
|
+
- lib/sonic/docker.rb
|
260
|
+
- lib/sonic/execute.rb
|
261
|
+
- lib/sonic/list.rb
|
262
|
+
- lib/sonic/settings.rb
|
263
|
+
- lib/sonic/ssh.rb
|
264
|
+
- lib/sonic/ssh/ec2_tag.rb
|
265
|
+
- lib/sonic/ssh/identifier_detector.rb
|
266
|
+
- lib/sonic/ui.rb
|
146
267
|
- lib/sonic/version.rb
|
268
|
+
- qa.md
|
147
269
|
- sonic.gemspec
|
270
|
+
- spec/fixtures/home/.gitkeep
|
271
|
+
- spec/fixtures/project/.gitkeep
|
272
|
+
- spec/fixtures/project/command.txt
|
148
273
|
- spec/lib/cli_spec.rb
|
274
|
+
- spec/lib/sonic/execute_spec.rb
|
149
275
|
- spec/spec_helper.rb
|
150
276
|
homepage: ''
|
151
277
|
licenses:
|
@@ -172,5 +298,9 @@ signing_key:
|
|
172
298
|
specification_version: 4
|
173
299
|
summary: Multi-functional tool to manage AWS infrastructure
|
174
300
|
test_files:
|
301
|
+
- spec/fixtures/home/.gitkeep
|
302
|
+
- spec/fixtures/project/.gitkeep
|
303
|
+
- spec/fixtures/project/command.txt
|
175
304
|
- spec/lib/cli_spec.rb
|
305
|
+
- spec/lib/sonic/execute_spec.rb
|
176
306
|
- spec/spec_helper.rb
|