sshkit 0.0.1
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.
- data/.gitignore +2 -0
- data/.travis.yml +5 -0
- data/.yardoc/checksums +13 -0
- data/.yardoc/object_types +0 -0
- data/.yardoc/objects/root.dat +0 -0
- data/.yardoc/proxy_types +0 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +0 -0
- data/EXAMPLES.md +167 -0
- data/FAQ.md +17 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +69 -0
- data/LICENSE.md +674 -0
- data/README.md +181 -0
- data/Rakefile +37 -0
- data/Vagrantfile +18 -0
- data/assets/images/logo.png +0 -0
- data/example.rb +70 -0
- data/lib/core_ext/array.rb +5 -0
- data/lib/core_ext/hash.rb +11 -0
- data/lib/sshkit/all.rb +13 -0
- data/lib/sshkit/backends/abstract.rb +83 -0
- data/lib/sshkit/backends/netssh.rb +82 -0
- data/lib/sshkit/backends/printer.rb +28 -0
- data/lib/sshkit/command.rb +153 -0
- data/lib/sshkit/configuration.rb +29 -0
- data/lib/sshkit/connection_manager.rb +93 -0
- data/lib/sshkit/dsl.rb +15 -0
- data/lib/sshkit/host.rb +151 -0
- data/lib/sshkit/version.rb +3 -0
- data/lib/sshkit.rb +27 -0
- data/sshkit.gemspec +34 -0
- data/test/functional/test_connection_manager.rb +17 -0
- data/test/functional/test_ssh_server_comes_up_for_functional_tests.rb +23 -0
- data/test/helper.rb +125 -0
- data/test/integration/backends/test_netssh.rb +99 -0
- data/test/unit/backends/test_netssh.rb +14 -0
- data/test/unit/backends/test_printer.rb +62 -0
- data/test/unit/core_ext/test_string.rb +12 -0
- data/test/unit/test_command.rb +113 -0
- data/test/unit/test_configuration.rb +47 -0
- data/test/unit/test_connection_manager.rb +78 -0
- data/test/unit/test_host.rb +65 -0
- metadata +301 -0
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/.yardoc/checksums
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
lib/deploy.rb 8f584561b611345114f38176ec53bf00f9d5550f
|
2
|
+
lib/deploy/all.rb 9fc0b15f0968612fbd2ffaf0bba9dff6f788e3d1
|
3
|
+
lib/deploy/host.rb 777a8deedcdd5b41dceab8773c992bafa5ee9f92
|
4
|
+
lib/core_ext/hash.rb b7a0f0d1ab3b83f6b251e2f865ad6fa3766124a0
|
5
|
+
lib/deploy/command.rb 1a04acc7d5abd1b288bbea3676c287434849ef05
|
6
|
+
lib/core_ext/array.rb 3d495a96a0d1566877bf2ebb70ab9ea10a7d32e1
|
7
|
+
lib/deploy/version.rb 30e41688e07f7ee74377aaef147250340df4a3f0
|
8
|
+
lib/deploy/configuration.rb 3e9f042e0e9e9860d3950a1406a988586434de16
|
9
|
+
lib/deploy/backends/netssh.rb c931441edd28ba7e134b0d3ae2fbf40efb347b81
|
10
|
+
lib/deploy/backends/printer.rb db41b51e9624105efd7cb7f1fef426b506ebadaa
|
11
|
+
lib/deploy/backends/abstract.rb 74260020d3a6c4913f7a3d9294968e1b2a1304a9
|
12
|
+
lib/deploy/connection_manager.rb 28c8ef12a8a5923aeaa497ed02fd22869f57186b
|
13
|
+
lib/deploy/dsl.rb a487b4e65ab52955b12a5fe55bda99dec61e16b9
|
Binary file
|
Binary file
|
data/.yardoc/proxy_types
ADDED
Binary file
|
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--no-private - README.md CHANGELOG.md FAQ.md LICENSE.md EXAMPLES.md
|
data/CHANGELOG.md
ADDED
File without changes
|
data/EXAMPLES.md
ADDED
@@ -0,0 +1,167 @@
|
|
1
|
+
# Usage Examples
|
2
|
+
|
3
|
+
## Run a command as a different user
|
4
|
+
|
5
|
+
on hosts do |host|
|
6
|
+
as 'www-data' do
|
7
|
+
puts capture(:whoami)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
## Run a command in a different directory
|
12
|
+
|
13
|
+
on hosts do |host|
|
14
|
+
within '/var/log' do
|
15
|
+
puts capture(:head, '-n5', 'messages')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
## Run a command with specific environmental variables
|
20
|
+
|
21
|
+
on hosts do |host|
|
22
|
+
with rack_env: :test do
|
23
|
+
puts capture("env | grep RACK_ENV")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
## Run a command in a different directory as a different user
|
28
|
+
|
29
|
+
on hosts do |host|
|
30
|
+
as 'www-data' do
|
31
|
+
in '/var/log' do
|
32
|
+
puts capture(:whoami)
|
33
|
+
puts capture(:pwd)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
This will output:
|
39
|
+
|
40
|
+
www-data
|
41
|
+
/var/log
|
42
|
+
|
43
|
+
**Note:** This example is a bit misleading, as the `www-data` user doesn't
|
44
|
+
have a shell defined, one cannot switch to that user.
|
45
|
+
|
46
|
+
## Stack directory nestings:
|
47
|
+
|
48
|
+
on hosts do
|
49
|
+
in "/var" do
|
50
|
+
puts capture(:pwd)
|
51
|
+
in :log do
|
52
|
+
puts capture(:pwd)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
This will output:
|
58
|
+
|
59
|
+
/var/
|
60
|
+
/var/log
|
61
|
+
|
62
|
+
The directory paths are joined using `File.join()`, which should correctly
|
63
|
+
join parts without forcing the user of the code to care about trailing or
|
64
|
+
leading slashes. It may be misleading as the `File.join()` is performed on the
|
65
|
+
machine running the code, if that's a Windows box, the paths may be incorrectly
|
66
|
+
joined according to the expectations of the machine receiving the commands.
|
67
|
+
|
68
|
+
## Do not care about the host block:
|
69
|
+
|
70
|
+
on hosts do
|
71
|
+
# The |host| argument is optional, it will
|
72
|
+
# be nil in the block if not passed
|
73
|
+
end
|
74
|
+
|
75
|
+
## Redirect all output to `/dev/null`
|
76
|
+
|
77
|
+
SSHKit.config.output = File.open('/dev/null')
|
78
|
+
|
79
|
+
## Implement a dirt-simple formatter class:
|
80
|
+
|
81
|
+
class MyFormatter < SSHKit::Formatter::Abstract
|
82
|
+
def write(obj)
|
83
|
+
case obj.is_a? SSHKit::Command
|
84
|
+
# Do something here, see the SSHKit::Command documentation
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
SSHKit.config.output = MyFormatter.new($stdout)
|
90
|
+
SSHKit.config.output = MyFormatter.new(SSHKit.config.output)
|
91
|
+
SSHKit.config.output = MyFormatter.new(File.open('log/deploy.log', 'wb'))
|
92
|
+
|
93
|
+
## Set a password for a host.
|
94
|
+
|
95
|
+
host = SSHKit::Host.new('user@example.com')
|
96
|
+
host.password = "hackme"
|
97
|
+
|
98
|
+
on host do |host|
|
99
|
+
puts capture(:echo, "I don't care about security!")
|
100
|
+
end
|
101
|
+
|
102
|
+
## Execute and raise an error if something goes wrong:
|
103
|
+
|
104
|
+
on hosts do |host|
|
105
|
+
execute!(:echo, '"Example Message!" 1>&2; false')
|
106
|
+
end
|
107
|
+
|
108
|
+
This will raise `SSHKit::CommandUncleanExit.new("Example Message!")` which
|
109
|
+
will cause the command to abort.
|
110
|
+
|
111
|
+
## Do something different on one host, or another depending on a host property:
|
112
|
+
|
113
|
+
host1 = SSHKit::Host.new 'user@example.com'
|
114
|
+
host2 = SSHKit::Host.new 'user@example.org'
|
115
|
+
|
116
|
+
on hosts do |host|
|
117
|
+
target = "/var/www/sites/"
|
118
|
+
if host.hostname =~ /org/
|
119
|
+
target += "dotorg"
|
120
|
+
else
|
121
|
+
target += "dotcom"
|
122
|
+
end
|
123
|
+
execute! :git, :clone, "git@git.#{host.hostname}", target
|
124
|
+
end
|
125
|
+
|
126
|
+
## Connect to a host in the easiest possible way:
|
127
|
+
|
128
|
+
on 'example.com' do |host|
|
129
|
+
execute :uptime
|
130
|
+
end
|
131
|
+
|
132
|
+
This will resolve the `example.com` hostname into a `SSHKit::Host` object, and
|
133
|
+
try to pull up the correct configuration for it.
|
134
|
+
|
135
|
+
|
136
|
+
## Run a command without it being command-mapped:
|
137
|
+
|
138
|
+
If the command you attempt to call contains a space character it won't be
|
139
|
+
mapped:
|
140
|
+
|
141
|
+
Command.new(:git, :push, :origin, :master).to_s
|
142
|
+
# => /usr/bin/env git push origin master
|
143
|
+
# (also: execute(:git, :push, :origin, :master)
|
144
|
+
|
145
|
+
Command.new("git push origin master").to_s
|
146
|
+
# => git push origin master
|
147
|
+
# (also: execute("git push origin master"))
|
148
|
+
|
149
|
+
This can be used to access shell builtins (such as `if` and `test`)
|
150
|
+
|
151
|
+
|
152
|
+
## Run a command with a heredoc
|
153
|
+
|
154
|
+
An extension of the behaviour above, if you write a command like this:
|
155
|
+
|
156
|
+
c = Command.new <<-EOCOMMAND
|
157
|
+
if test -d /var/log
|
158
|
+
then echo "Directory Exists"
|
159
|
+
fi
|
160
|
+
EOCOMMAND
|
161
|
+
c.to_s
|
162
|
+
# => if test -d /var/log; then echo "Directory Exists; fi
|
163
|
+
# (also: execute <<- EOCOMMAND........))
|
164
|
+
|
165
|
+
**Note:** The logic which reformats the script into a oneliner may be naïve, but in all
|
166
|
+
known test cases, it works. The key thing is that `if` is not mapped to
|
167
|
+
`/usr/bin/env if`, which would break with a syntax error.
|
data/FAQ.md
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
## Is it better than Capistrano?
|
2
|
+
|
3
|
+
*SSHKit* is designed to solve a different problem than Capistrano. *SSHKit* is
|
4
|
+
a toolkit for performing structured commands on groups of servers in a
|
5
|
+
repeatable way.
|
6
|
+
|
7
|
+
It provides concurrency handling, sane error checking and control flow that
|
8
|
+
would otherwise be difficult to achive with pure *Net::SSH*.
|
9
|
+
|
10
|
+
Since *Capistrano v3.0*, *SSHKit* is used by *Capistrano* to communicate with
|
11
|
+
backend servers. Whilst Capistrano provides the structure for repeatable
|
12
|
+
deployments.
|
13
|
+
|
14
|
+
## Production Ready?
|
15
|
+
|
16
|
+
It's in private Beta use, and the documentation could use more work, but this
|
17
|
+
is open source, that's more or less how it works.
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
deploy (0.0.1)
|
5
|
+
net-ssh
|
6
|
+
term-ansicolor
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: http://rubygems.org/
|
10
|
+
specs:
|
11
|
+
ZenTest (4.6.2)
|
12
|
+
ansi (1.4.2)
|
13
|
+
archive-tar-minitar (0.5.2)
|
14
|
+
autotest (4.4.6)
|
15
|
+
ZenTest (>= 4.4.1)
|
16
|
+
childprocess (0.3.6)
|
17
|
+
ffi (~> 1.0, >= 1.0.6)
|
18
|
+
columnize (0.3.6)
|
19
|
+
debugger (1.2.2)
|
20
|
+
columnize (>= 0.3.1)
|
21
|
+
debugger-linecache (~> 1.1.1)
|
22
|
+
debugger-ruby_core_source (~> 1.1.5)
|
23
|
+
debugger-linecache (1.1.2)
|
24
|
+
debugger-ruby_core_source (>= 1.1.1)
|
25
|
+
debugger-ruby_core_source (1.1.5)
|
26
|
+
erubis (2.7.0)
|
27
|
+
ffi (1.2.0)
|
28
|
+
i18n (0.6.1)
|
29
|
+
json (1.5.4)
|
30
|
+
log4r (1.1.10)
|
31
|
+
metaclass (0.0.1)
|
32
|
+
minitest (2.11.3)
|
33
|
+
mocha (0.10.5)
|
34
|
+
metaclass (~> 0.0.1)
|
35
|
+
net-scp (1.0.4)
|
36
|
+
net-ssh (>= 1.99.1)
|
37
|
+
net-ssh (2.2.2)
|
38
|
+
rake (10.0.3)
|
39
|
+
redcarpet (2.2.2)
|
40
|
+
term-ansicolor (1.0.7)
|
41
|
+
turn (0.9.3)
|
42
|
+
ansi
|
43
|
+
unindent (1.0)
|
44
|
+
vagrant (1.0.5)
|
45
|
+
archive-tar-minitar (= 0.5.2)
|
46
|
+
childprocess (~> 0.3.1)
|
47
|
+
erubis (~> 2.7.0)
|
48
|
+
i18n (~> 0.6.0)
|
49
|
+
json (~> 1.5.1)
|
50
|
+
log4r (~> 1.1.9)
|
51
|
+
net-scp (~> 1.0.4)
|
52
|
+
net-ssh (~> 2.2.2)
|
53
|
+
yard (0.8.3)
|
54
|
+
|
55
|
+
PLATFORMS
|
56
|
+
ruby
|
57
|
+
|
58
|
+
DEPENDENCIES
|
59
|
+
autotest
|
60
|
+
debugger
|
61
|
+
deploy!
|
62
|
+
minitest (>= 2.11.3, < 2.12.0)
|
63
|
+
mocha
|
64
|
+
rake
|
65
|
+
redcarpet
|
66
|
+
turn
|
67
|
+
unindent
|
68
|
+
vagrant
|
69
|
+
yard
|