fucking_shell_scripts 0.99 → 1.0
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 +154 -37
- data/bin/fss +5 -1
- data/fucking_shell_scripts.gemspec +1 -0
- data/lib/core_ext/hash.rb +10 -0
- data/lib/ext/fog.rb +2 -2
- data/lib/fucking_shell_scripts.rb +2 -5
- data/lib/fucking_shell_scripts/cli.rb +7 -2
- data/lib/fucking_shell_scripts/configuration.rb +7 -3
- data/lib/fucking_shell_scripts/connection.rb +1 -14
- data/lib/fucking_shell_scripts/errors.rb +5 -0
- data/lib/fucking_shell_scripts/scp.rb +13 -1
- data/lib/fucking_shell_scripts/server.rb +1 -0
- data/lib/fucking_shell_scripts/version.rb +1 -1
- data/spec/core_ext/hash_spec.rb +12 -0
- data/spec/fucking_shell_scripts/cli_spec.rb +48 -0
- data/spec/fucking_shell_scripts/connection_spec.rb +6 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/{servers/search-service.yml → support/servers/test-server.yml} +0 -0
- metadata +40 -18
- data/spec/fss_spec.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c05b1d90cd1b92a78231e67b153532b29b54024a
|
4
|
+
data.tar.gz: c8706137b7ac4f46d8f8498ff07db9d06db9b23b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: adf82e3996b4c1fdbebfe60218c6566eb79057f7bc479524c5e11d3c7664c452b943b4aa0b6ae75e96b18fc463d718482d5356953928910dbe017c2236f655e5
|
7
|
+
data.tar.gz: fb5aed54b314a49cebd5f0574b851525ab62a9adf7d32fdadcb2e748194d75426540d9863f9429ff64da26256604e5c1dd0f02b26796b0dd797904306d422ebc
|
data/README.md
CHANGED
@@ -1,68 +1,185 @@
|
|
1
|
-
#
|
1
|
+
# Fucking Shell Scripts
|
2
2
|
|
3
|
-
The easiest, most common sense configuration management tool...
|
3
|
+
The easiest, most common sense server configuration management tool...because you just use fucking shell scripts.
|
4
4
|
|
5
|
-
|
5
|
+
Completely confused by Chef? Blowing your brains out over Ansible? Lost control of your Puppets? Wanna just use **fucking shell scripts** to configure a server? Read on!
|
6
6
|
|
7
|
-
|
7
|
+
# Features
|
8
8
|
|
9
|
-
|
9
|
+
* Wraps up the fog gem, so it can be used on any cloud service, including AWS, rackspace, etc.
|
10
|
+
* We've intentionally designed this tool to be insanely easy to use
|
10
11
|
|
11
|
-
|
12
|
+
### Step 0: Install the gem
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
$ gem install fucking_shell_scripts
|
14
|
+
```Shell
|
15
|
+
gem install fucking_shell_scripts
|
16
|
+
```
|
18
17
|
|
19
|
-
## Development
|
20
18
|
|
21
|
-
|
19
|
+
### Step 1: Create a project directory
|
22
20
|
|
23
|
-
|
24
|
-
|
21
|
+
```Shell
|
22
|
+
mkdir config_management
|
23
|
+
```
|
25
24
|
|
26
|
-
|
25
|
+
Folder structure:
|
26
|
+
|
27
|
+
* `/servers` _(required)_ - yaml server definitions _(see example below)_
|
28
|
+
|
29
|
+
* `/scripts` _(required)_ - the shell scripts that will configure your servers _(see example below)_
|
30
|
+
|
31
|
+
* `/files` _(optional)_ - files to be transferred to servers _(nginx.conf, ssh keys, database.yml, etc.)_
|
32
|
+
|
33
|
+
An example folder structure:
|
34
|
+
|
35
|
+
```Shell
|
36
|
+
./config_management
|
37
|
+
├── files
|
38
|
+
│ ├── keys
|
39
|
+
│ │ └── deploy_key
|
40
|
+
│ └── rails_config
|
41
|
+
│ └── database.yml
|
42
|
+
├── scripts
|
43
|
+
│ ├── apt.sh
|
44
|
+
│ ├── deploy_key.sh
|
45
|
+
│ ├── git.sh
|
46
|
+
│ ├── redis.sh
|
47
|
+
│ ├── ruby2.sh
|
48
|
+
│ ├── rubygems.sh
|
49
|
+
│ ├── search_service_code.sh
|
50
|
+
│ └── search_service_env.sh
|
51
|
+
└── servers
|
52
|
+
├── defaults.yml
|
53
|
+
└── search-server.yml
|
54
|
+
```
|
27
55
|
|
28
|
-
## Servers
|
29
56
|
|
30
|
-
###
|
57
|
+
### Step 2: Create a server definition file
|
31
58
|
|
32
|
-
|
59
|
+
The server definition file defines how to build a type of server. Server definitions override settings in `defaults.yml`.
|
33
60
|
|
34
|
-
|
61
|
+
```YAML
|
62
|
+
# servers/search-server.yml
|
63
|
+
##################################################
|
64
|
+
# This file defines how to build our search server
|
65
|
+
##################################################
|
35
66
|
|
36
|
-
|
37
|
-
|
38
|
-
security_groups: pd-app-server
|
39
|
-
instance_type: c1.xlarge
|
40
|
-
image_id: ami-e76ac58e
|
67
|
+
name: search-server
|
68
|
+
size: c1.xlarge
|
41
69
|
availability_zone: us-east-1d
|
42
|
-
|
70
|
+
image: ami-90374bf9
|
43
71
|
key_name: pd-app-server
|
44
|
-
private_key_path: /Users/
|
45
|
-
|
72
|
+
private_key_path: /Users/yourname/.ssh/pd-app-server
|
73
|
+
security_groups: search-service # override the security_groups defined in defaults.yml
|
46
74
|
|
47
|
-
|
75
|
+
############################################
|
76
|
+
# Files necessary to build the search server
|
77
|
+
############################################
|
48
78
|
|
49
|
-
|
79
|
+
files:
|
80
|
+
- files/keys/deploy_key
|
50
81
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
instance_type: c1.medium
|
55
|
-
image_id: ami-90374bf9
|
82
|
+
###########################################
|
83
|
+
# Scripts needed to build the search server
|
84
|
+
###########################################
|
56
85
|
|
57
86
|
scripts:
|
58
87
|
- scripts/apt.sh
|
59
|
-
- scripts/
|
88
|
+
- scripts/search_service_env.sh
|
60
89
|
- scripts/git.sh
|
61
|
-
- scripts/
|
90
|
+
- scripts/ruby2.sh
|
62
91
|
- scripts/rubygems.sh
|
63
92
|
- scripts/redis.sh
|
93
|
+
- scripts/deploy_key.sh
|
64
94
|
```
|
65
95
|
|
96
|
+
`servers/defaults.yml`has the same structure and keys a server definition file, **except**, you cannot define scripts or files.
|
97
|
+
|
98
|
+
```YAML
|
99
|
+
# servers/defaults.yml
|
100
|
+
################################
|
101
|
+
# This file defines our defaults
|
102
|
+
################################
|
103
|
+
|
104
|
+
security_groups: simple-group
|
105
|
+
size: c1.medium
|
106
|
+
image: ami-e76ac58e
|
107
|
+
availability_zone: us-east-1d
|
108
|
+
key_name: global-key
|
109
|
+
cloud:
|
110
|
+
provider: AWS
|
111
|
+
aws_access_key_id: <=% ENV[AWS_ACCESS_KEY] %>
|
112
|
+
aws_secret_access_key: <%= ENV[AWS_SECRET_ACCESS_KEY] %>
|
113
|
+
region: us-east-1
|
114
|
+
|
115
|
+
```
|
116
|
+
|
117
|
+
#### Cloud options
|
118
|
+
|
119
|
+
Anything passed in the 'cloud' key will be directly passed to
|
120
|
+
`Fog::Compute.new`. See [the fog website](http://fog.io/compute) for more info.
|
121
|
+
|
122
|
+
FSS will consider any values that look like "ENV[VAR_NAME]" to be
|
123
|
+
environment variables, and will attempt to look up that environment
|
124
|
+
variable. If FSS does not find that variable, an exception will be
|
125
|
+
raised.
|
126
|
+
|
127
|
+
### Step 3: Add shell scripts that configure the server
|
128
|
+
|
129
|
+
Seriously...just write shell scripts.
|
130
|
+
|
131
|
+
Want to install Ruby 2? Here's an example:
|
132
|
+
|
133
|
+
```Shell
|
134
|
+
#!/bin/sh
|
135
|
+
#
|
136
|
+
# scripts/ruby2.sh
|
137
|
+
#
|
138
|
+
sudo apt-get -y install build-essential zlib1g-dev libssl-dev libreadline6-dev libyaml-dev
|
139
|
+
cd /tmp
|
140
|
+
wget http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p247.tar.gz
|
141
|
+
tar -xzf ruby-2.0.0-p247.tar.gz
|
142
|
+
cd ruby-2.0.0-p247
|
143
|
+
./configure --prefix=/usr/local
|
144
|
+
make
|
145
|
+
sudo make install
|
146
|
+
rm -rf /tmp/ruby*
|
147
|
+
```
|
148
|
+
|
149
|
+
### Step 4: Build/configure your server
|
150
|
+
|
151
|
+
```Shell
|
152
|
+
fss search-server
|
153
|
+
```
|
154
|
+
|
155
|
+
This command does 2 things:
|
156
|
+
|
157
|
+
1. Builds the new server
|
158
|
+
2. Runs the scripts configuration
|
159
|
+
|
160
|
+
**To build only:**
|
161
|
+
|
162
|
+
```Shell
|
163
|
+
fss --build search-server
|
164
|
+
```
|
165
|
+
|
166
|
+
**To configure only:**
|
167
|
+
|
168
|
+
```Shell
|
169
|
+
fss --instance-id i-9ad6d7af --configure search-server
|
170
|
+
```
|
171
|
+
|
172
|
+
_Note: `--instance-id` is required when using the `--configure` option_
|
173
|
+
|
174
|
+
|
175
|
+
### Step 5: Remove your chef repo and all its contents.
|
176
|
+
|
177
|
+
```Shell
|
178
|
+
rm -rf ~/old_config_management/chef
|
179
|
+
```
|
180
|
+
|
181
|
+
**HOLY SHIT! THAT WAS EASY.**
|
182
|
+
|
66
183
|
## Contributing
|
67
184
|
|
68
185
|
1. Fork it
|
data/bin/fss
CHANGED
@@ -26,18 +26,22 @@ OptionParser.new do |opts|
|
|
26
26
|
end
|
27
27
|
|
28
28
|
opts.on('-v', '--version', 'Show version' ) do
|
29
|
-
puts FuckingShellScripts::
|
29
|
+
puts FuckingShellScripts::VERSION
|
30
|
+
exit
|
30
31
|
end
|
31
32
|
end.parse!
|
32
33
|
|
33
34
|
options.merge!(type: ARGV.first)
|
34
35
|
|
36
|
+
abort("Specify the type of server to build/configure as the first argument (ie. fss app-server)") unless options[:type]
|
37
|
+
|
35
38
|
cli = FuckingShellScripts::CLI.new(options)
|
36
39
|
|
37
40
|
if options[:build]
|
38
41
|
cli.build
|
39
42
|
|
40
43
|
elsif options[:configure]
|
44
|
+
abort("Specify the server instance ID to configure using the --instance-id option") unless options[:instance_id]
|
41
45
|
cli.configure
|
42
46
|
|
43
47
|
else
|
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
22
|
spec.add_development_dependency "rake"
|
23
23
|
spec.add_development_dependency "rspec"
|
24
|
+
spec.add_development_dependency "pry"
|
24
25
|
|
25
26
|
spec.add_dependency "fog", "~> 1.14.0"
|
26
27
|
end
|
data/lib/ext/fog.rb
CHANGED
@@ -20,13 +20,13 @@ class Fog::SSH::Real
|
|
20
20
|
|
21
21
|
channel.on_data do |ch, data|
|
22
22
|
result.stdout << data
|
23
|
-
|
23
|
+
print data
|
24
24
|
end
|
25
25
|
|
26
26
|
channel.on_extended_data do |ch, type, data|
|
27
27
|
next unless type == 1
|
28
28
|
result.stderr << data
|
29
|
-
|
29
|
+
print data
|
30
30
|
end
|
31
31
|
|
32
32
|
channel.on_request('exit-status') do |ch, data|
|
@@ -1,14 +1,11 @@
|
|
1
1
|
require "fucking_shell_scripts/version"
|
2
2
|
|
3
|
-
begin
|
4
|
-
require 'pry'
|
5
|
-
rescue LoadError
|
6
|
-
end
|
7
|
-
|
8
3
|
require_relative 'fucking_shell_scripts/cli'
|
9
4
|
require_relative 'fucking_shell_scripts/configuration'
|
10
5
|
require_relative 'fucking_shell_scripts/connection'
|
11
6
|
require_relative 'fucking_shell_scripts/scp'
|
12
7
|
require_relative 'fucking_shell_scripts/server'
|
8
|
+
require_relative 'fucking_shell_scripts/errors'
|
13
9
|
|
10
|
+
require_relative 'core_ext/hash'
|
14
11
|
require_relative 'ext/fog'
|
@@ -1,8 +1,9 @@
|
|
1
1
|
module FuckingShellScripts
|
2
2
|
class CLI
|
3
|
+
MissingCloudSettings = Class.new(StandardError)
|
4
|
+
|
3
5
|
def initialize(opts = {})
|
4
6
|
@opts = opts
|
5
|
-
@connection = FuckingShellScripts::Connection.new(options).connection
|
6
7
|
end
|
7
8
|
|
8
9
|
def bootstrap
|
@@ -20,7 +21,11 @@ module FuckingShellScripts
|
|
20
21
|
private
|
21
22
|
|
22
23
|
def server
|
23
|
-
FuckingShellScripts::Server.new(
|
24
|
+
@server ||= FuckingShellScripts::Server.new(connection, options)
|
25
|
+
end
|
26
|
+
|
27
|
+
def connection
|
28
|
+
FuckingShellScripts::Connection.new(options.fetch(:cloud)).connection
|
24
29
|
end
|
25
30
|
|
26
31
|
def options
|
@@ -1,9 +1,11 @@
|
|
1
1
|
require 'yaml'
|
2
|
+
require 'erb'
|
2
3
|
|
3
4
|
module FuckingShellScripts
|
4
5
|
class Configuration
|
5
6
|
MissingServerType = Class.new(StandardError)
|
6
7
|
MissingServerConfiguration = Class.new(StandardError)
|
8
|
+
MissingCloudConfiguration = Class.new(StandardError)
|
7
9
|
|
8
10
|
attr_reader :options
|
9
11
|
|
@@ -13,13 +15,14 @@ module FuckingShellScripts
|
|
13
15
|
read_and_parse_server_options
|
14
16
|
|
15
17
|
raise MissingServerType, "Please specify a type of server you want to create using the --type option" unless options[:type]
|
18
|
+
raise MissingCloudConfiguration, "Please specify settings for your provider per http://fog.io/about/provider_documentation.html" unless options[:cloud]
|
16
19
|
end
|
17
20
|
|
18
21
|
private
|
19
22
|
|
20
23
|
def default_options
|
21
24
|
begin
|
22
|
-
YAML.load(File.read('servers/defaults.yml'))
|
25
|
+
YAML.load(ERB.new(File.read('servers/defaults.yml')).result)
|
23
26
|
rescue Errno::ENOENT
|
24
27
|
{}
|
25
28
|
end
|
@@ -27,7 +30,7 @@ module FuckingShellScripts
|
|
27
30
|
|
28
31
|
def server_options
|
29
32
|
begin
|
30
|
-
YAML.load(File.read(server_file))
|
33
|
+
YAML.load(ERB.new(File.read(server_file)).result)
|
31
34
|
rescue Errno::ENOENT
|
32
35
|
raise MissingServerConfiguration, "Please create a configuration file './servers/#{type}.yml'"
|
33
36
|
end
|
@@ -39,11 +42,12 @@ module FuckingShellScripts
|
|
39
42
|
|
40
43
|
def read_and_parse_server_options
|
41
44
|
options_string_hash = default_options.merge(server_options).merge(@command_line_options)
|
42
|
-
@options =
|
45
|
+
@options = options_string_hash.symbolize_keys_deep!
|
43
46
|
end
|
44
47
|
|
45
48
|
def type
|
46
49
|
@command_line_options[:type]
|
47
50
|
end
|
51
|
+
|
48
52
|
end
|
49
53
|
end
|
@@ -2,25 +2,12 @@ require 'fog'
|
|
2
2
|
|
3
3
|
module FuckingShellScripts
|
4
4
|
class Connection
|
5
|
-
MissingAWSCredentials = Class.new(StandardError)
|
6
|
-
|
7
5
|
def initialize(opts)
|
8
6
|
@opts = opts
|
9
|
-
|
10
|
-
if ENV["AWS_ACCESS_KEY"].nil? || ENV["AWS_SECRET_ACCESS_KEY"].nil?
|
11
|
-
raise FuckingShellScripts::Connection::MissingAWSCredentials, "Make sure AWS_ACCESS_KEY and AWS_SECRET_ACCESS_KEY are environmental variables with your credentials"
|
12
|
-
end
|
13
7
|
end
|
14
8
|
|
15
9
|
def connection
|
16
|
-
@
|
17
|
-
Fog::Compute.new(
|
18
|
-
provider: "AWS",
|
19
|
-
aws_access_key_id: ENV["AWS_ACCESS_KEY"],
|
20
|
-
aws_secret_access_key: ENV["AWS_SECRET_ACCESS_KEY"],
|
21
|
-
region: @opts.fetch(:region)
|
22
|
-
)
|
23
|
-
end
|
10
|
+
Fog::Compute.new(@opts)
|
24
11
|
end
|
25
12
|
end
|
26
13
|
end
|
@@ -7,16 +7,24 @@ module FuckingShellScripts
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def to_server
|
10
|
+
check_executable_permissions
|
10
11
|
create_local_archive
|
11
12
|
scp_files_to_server
|
12
13
|
extract_remote_archive
|
14
|
+
remove_remote_archive
|
13
15
|
remove_local_archive
|
14
16
|
end
|
15
17
|
|
16
18
|
private
|
17
19
|
|
20
|
+
def check_executable_permissions
|
21
|
+
@opts.fetch(:scripts).each do |file|
|
22
|
+
raise FuckingShellScripts::Errors::ScriptNotExecutable , "The script #{file} is not executable." unless File.executable?(file)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
18
26
|
def create_local_archive
|
19
|
-
includes = @opts.fetch(:files) + @opts.fetch(:scripts)
|
27
|
+
includes = @opts.fetch(:files){ [] } + @opts.fetch(:scripts)
|
20
28
|
`tar -czf #{FILENAME} #{includes.join(" ")}`
|
21
29
|
end
|
22
30
|
|
@@ -28,6 +36,10 @@ module FuckingShellScripts
|
|
28
36
|
@server.ssh("tar -xzf #{FILENAME}")
|
29
37
|
end
|
30
38
|
|
39
|
+
def remove_remote_archive
|
40
|
+
@server.ssh("rm #{FILENAME}")
|
41
|
+
end
|
42
|
+
|
31
43
|
def remove_local_archive
|
32
44
|
`rm -f #{FILENAME}`
|
33
45
|
end
|
@@ -23,6 +23,7 @@ module FuckingShellScripts
|
|
23
23
|
groups: options.fetch(:security_groups),
|
24
24
|
private_key_path: options.fetch(:private_key_path)
|
25
25
|
)
|
26
|
+
@server.username = options.fetch(:username) if options.fetch(:username)
|
26
27
|
print "Creating #{options.fetch(:size)} from #{options.fetch(:image)}"
|
27
28
|
|
28
29
|
server.wait_for do
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hash do
|
4
|
+
describe "#symbolize_keys_deep!" do
|
5
|
+
it "symbolizes recusively" do
|
6
|
+
hash = { "a" => 1, "b" => { "c" => 2, "d" => 3 } }
|
7
|
+
hash.symbolize_keys_deep!
|
8
|
+
expect(hash.fetch(:a)).to eq(1)
|
9
|
+
expect(hash.fetch(:b)).to eq({ :c => 2, :d => 3 })
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module FuckingShellScripts
|
4
|
+
describe CLI do
|
5
|
+
let(:server) { double('server', bootstrap: true, build: true, configure: true) }
|
6
|
+
let(:options) {
|
7
|
+
{
|
8
|
+
type: "test-server",
|
9
|
+
region: "us-east-1",
|
10
|
+
}
|
11
|
+
}
|
12
|
+
let(:config) { double('config', options: options) }
|
13
|
+
|
14
|
+
it "initializes a server with the connection" do
|
15
|
+
connection = double('connection')
|
16
|
+
connection_obj = double('obj connection', connection: connection)
|
17
|
+
FuckingShellScripts::Connection.stub(:new).and_return(connection_obj)
|
18
|
+
FuckingShellScripts::Configuration.stub(:new).and_return(config)
|
19
|
+
FuckingShellScripts::Server.should_receive(:new).with(connection, options).and_return(server)
|
20
|
+
FuckingShellScripts::CLI.new.bootstrap
|
21
|
+
end
|
22
|
+
|
23
|
+
context "instance methods" do
|
24
|
+
before :each do
|
25
|
+
ENV["AWS_ACCESS_KEY"] = "key"
|
26
|
+
ENV["AWS_SECRET_ACCESS_KEY"] = "secret"
|
27
|
+
FuckingShellScripts::Configuration.stub(:new).and_return(config)
|
28
|
+
FuckingShellScripts::Server.stub(:new).and_return(server)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "bootstraps a server" do
|
32
|
+
expect(server).to receive(:bootstrap)
|
33
|
+
FuckingShellScripts::CLI.new.bootstrap
|
34
|
+
end
|
35
|
+
|
36
|
+
it "builds a server" do
|
37
|
+
expect(server).to receive(:build)
|
38
|
+
FuckingShellScripts::CLI.new.build
|
39
|
+
end
|
40
|
+
|
41
|
+
it "configures a server" do
|
42
|
+
expect(server).to receive(:configure)
|
43
|
+
FuckingShellScripts::CLI.new.configure
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/spec/spec_helper.rb
ADDED
File without changes
|
metadata
CHANGED
@@ -1,69 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fucking_shell_scripts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0
|
4
|
+
version: '1.0'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Hilkert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-06-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.3'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: fog
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- - ~>
|
73
|
+
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
75
|
version: 1.14.0
|
62
76
|
type: :runtime
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- - ~>
|
80
|
+
- - "~>"
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: 1.14.0
|
69
83
|
description: The easiest, most common sense configuration management tool... because
|
@@ -75,23 +89,28 @@ executables:
|
|
75
89
|
extensions: []
|
76
90
|
extra_rdoc_files: []
|
77
91
|
files:
|
78
|
-
- .gitignore
|
92
|
+
- ".gitignore"
|
79
93
|
- Gemfile
|
80
94
|
- LICENSE.txt
|
81
95
|
- README.md
|
82
96
|
- Rakefile
|
83
97
|
- bin/fss
|
84
98
|
- fucking_shell_scripts.gemspec
|
99
|
+
- lib/core_ext/hash.rb
|
85
100
|
- lib/ext/fog.rb
|
86
101
|
- lib/fucking_shell_scripts.rb
|
87
102
|
- lib/fucking_shell_scripts/cli.rb
|
88
103
|
- lib/fucking_shell_scripts/configuration.rb
|
89
104
|
- lib/fucking_shell_scripts/connection.rb
|
105
|
+
- lib/fucking_shell_scripts/errors.rb
|
90
106
|
- lib/fucking_shell_scripts/scp.rb
|
91
107
|
- lib/fucking_shell_scripts/server.rb
|
92
108
|
- lib/fucking_shell_scripts/version.rb
|
93
|
-
- spec/
|
94
|
-
- spec/
|
109
|
+
- spec/core_ext/hash_spec.rb
|
110
|
+
- spec/fucking_shell_scripts/cli_spec.rb
|
111
|
+
- spec/fucking_shell_scripts/connection_spec.rb
|
112
|
+
- spec/spec_helper.rb
|
113
|
+
- spec/support/servers/test-server.yml
|
95
114
|
homepage: https://github.com/brandonhilkert/fucking_shell_scripts
|
96
115
|
licenses:
|
97
116
|
- MIT
|
@@ -102,21 +121,24 @@ require_paths:
|
|
102
121
|
- lib
|
103
122
|
required_ruby_version: !ruby/object:Gem::Requirement
|
104
123
|
requirements:
|
105
|
-
- -
|
124
|
+
- - ">="
|
106
125
|
- !ruby/object:Gem::Version
|
107
126
|
version: '0'
|
108
127
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
128
|
requirements:
|
110
|
-
- -
|
129
|
+
- - ">="
|
111
130
|
- !ruby/object:Gem::Version
|
112
131
|
version: '0'
|
113
132
|
requirements: []
|
114
133
|
rubyforge_project:
|
115
|
-
rubygems_version: 2.
|
134
|
+
rubygems_version: 2.2.2
|
116
135
|
signing_key:
|
117
136
|
specification_version: 4
|
118
137
|
summary: The easiest, most common sense configuration management tool... because you
|
119
138
|
just use fucking shell scripts.
|
120
139
|
test_files:
|
121
|
-
- spec/
|
122
|
-
- spec/
|
140
|
+
- spec/core_ext/hash_spec.rb
|
141
|
+
- spec/fucking_shell_scripts/cli_spec.rb
|
142
|
+
- spec/fucking_shell_scripts/connection_spec.rb
|
143
|
+
- spec/spec_helper.rb
|
144
|
+
- spec/support/servers/test-server.yml
|