jossh 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 89bbdbdf3826fe36d90cb9c883b272dc2a61b480
4
+ data.tar.gz: 8f3ee16da118802914ec86221606a4abf99cdb89
5
+ SHA512:
6
+ metadata.gz: 474aa547a0e00146e1a0bc0b477e358e2d210939639f58f8e854b42c530c8a24d20f04d711de205a6eb2fa538e7a2793dcc9dfa2eb186ee2634627c9db0be2c2
7
+ data.tar.gz: 28e579729179e79b391eb2ce7e443d3dd5087bba59d98e67269f7f18c0ee85ca310f49fec4cb50f2b9c571b6bfa1316898cbc0b3936d8188e3b16471d6bcfdc1
data/README.md ADDED
@@ -0,0 +1,81 @@
1
+ Jossh - Your SSH Buddy
2
+ ======================
3
+
4
+ Ruby SSH functions for easier and prettier remote deployment and automation.
5
+
6
+ ## Install
7
+
8
+ Add to your Gemfile
9
+
10
+ gem 'jossh'
11
+
12
+ Or install manually
13
+
14
+ gem install jossh
15
+
16
+
17
+ ## Features
18
+
19
+ 1. Allows running one or more commands over SSH.
20
+ 2. Allows running external local scripts remotely
21
+ 3. Has four commands: `ssh`, `ssh!`, `ssh_script` and `ssh_script!`. The 'bang' versions generate pretty and indented output.
22
+ 4. Uses a single SSH connection.
23
+ 5. Uses a simple hash for defining hosts.
24
+ 6. Allows storing host specifications in a YAML file.
25
+ 7. Supports all options available in `Net::SSH#start`.
26
+ 8. Prints output Heroku-style.
27
+
28
+ ## Usage
29
+
30
+ ### Example 1: Host specifications in a YAML file
31
+
32
+ ```ruby
33
+ # example.rb
34
+ require 'jossh'
35
+
36
+ ssh! :localhost, ["cd /opt/app", "git pull"]
37
+ ```
38
+
39
+ ```yaml
40
+ # ssh_hosts.yml
41
+ :localhost:
42
+ :host: 'localhost'
43
+ :user: 'vagrant'
44
+ ```
45
+
46
+ ### Example 2: Host specifications directly in the code
47
+
48
+ ```ruby
49
+ # example.rb
50
+ require 'jossh'
51
+
52
+ localhost = {
53
+ host: 'localhost',
54
+ user: 'vagrant',
55
+ forward_agent: true,
56
+ }
57
+
58
+ ssh! localhost, ["cd /opt/app", "git pull"]
59
+ ```
60
+
61
+
62
+ ### Example 3: Run an external local script remotely
63
+
64
+ ```ruby
65
+ # example.rb
66
+ require 'jossh'
67
+
68
+ ssh_script! :production, deploy
69
+ ```
70
+
71
+ ```bash
72
+ # deploy
73
+ cd /opt/app
74
+ echo "-> Pulling source from origin"
75
+ git pull
76
+ echo "-> Restarting server"
77
+ touch 'tmp/restart.txt'
78
+ echo "-> Done"
79
+ ```
80
+
81
+ See also: The examples folder
data/lib/jossh/api.rb ADDED
@@ -0,0 +1,21 @@
1
+ module Jossh
2
+
3
+ def ssh_script!(hostspec, script)
4
+ CommandRunner.new.ssh_script! hostspec, script
5
+ end
6
+
7
+ def ssh_script(hostspec, script, callback: nil)
8
+ CommandRunner.new.ssh_script hostspec, script, callback: callback
9
+ end
10
+
11
+ def ssh!(hostspec, script)
12
+ CommandRunner.new.ssh! hostspec, script
13
+ end
14
+
15
+ def ssh(hostspec, script, callback: nil)
16
+ CommandRunner.new.ssh hostspec, script, callback: callback
17
+ end
18
+
19
+
20
+ end
21
+
@@ -0,0 +1,64 @@
1
+ require "net/ssh"
2
+ require "yaml"
3
+
4
+ module Jossh
5
+
6
+ class CommandRunner
7
+
8
+ def ssh!(hostspec, script)
9
+ ssh hostspec, script, callback: OutputHandler.new.method(:pretty_puts)
10
+ end
11
+
12
+ def ssh(hostspec, script, callback: nil)
13
+ callback ||= method :puts
14
+ script = script.join "\n" if script.is_a? Array
15
+ hostspec = load_spec(hostspec) if hostspec.is_a? Symbol
16
+ host = hostspec.delete :host
17
+ user = hostspec.delete :user
18
+
19
+ Net::SSH.start( host, user, hostspec ) do |ssh|
20
+ ssh.exec! script do |ch, stream, data|
21
+ callback.call data
22
+ end
23
+ end
24
+ end
25
+
26
+ def ssh_script!(hostspec, script)
27
+ ssh! hostspec, load_script(script)
28
+ end
29
+
30
+ def ssh_script(hostspec, script, callback: nil)
31
+ ssh hostspec, load_script(script), callback: callback
32
+ end
33
+
34
+ private
35
+
36
+ def load_spec(key)
37
+ ssh_hosts[key] or abort "Cannot find :#{key} in #{hostfile}"
38
+ end
39
+
40
+ def ssh_hosts
41
+ @ssh_hosts ||= load_ssh_hosts
42
+ end
43
+
44
+ def load_ssh_hosts
45
+ File.exist? hostfile or abort "Cannot find #{hostfile}"
46
+ YAML.load_file hostfile
47
+ end
48
+
49
+ def hostfile
50
+ @hostfile ||= 'ssh_hosts.yml'
51
+ end
52
+
53
+ def hostfile=(file)
54
+ @hostfile = file
55
+ end
56
+
57
+ def load_script(script)
58
+ File.read script
59
+ end
60
+
61
+ end
62
+
63
+ end
64
+
@@ -0,0 +1,52 @@
1
+ require 'colsole'
2
+
3
+ # Print functions inspired by Heroku and based on code from Mina
4
+ # https://github.com/mina-deploy/mina/blob/master/lib/mina/output_helpers.rb
5
+
6
+ module Jossh
7
+
8
+ class OutputHandler
9
+
10
+ include Colsole
11
+
12
+ def pretty_puts(lines)
13
+ lines = lines.split("\n") if lines.is_a? String
14
+ lines.each do |line|
15
+ if line =~ /^\-+> (.*?)$/
16
+ puts_status $1
17
+ elsif line =~ /^! (.*?)$/
18
+ puts_error $1
19
+ elsif line =~ /^\$ (.*?)$/
20
+ puts_command $1
21
+ else
22
+ puts_stdout line
23
+ end
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def puts_status(msg)
30
+ say "!txtgrn!----->!txtrst! #{msg}"
31
+ end
32
+
33
+ def puts_error(msg)
34
+ say " !txtylw!!!txtrst! !txtred!#{msg}"
35
+ end
36
+
37
+ def puts_stderr(msg)
38
+ say " !txtred!#{msg}"
39
+ end
40
+
41
+ def puts_command(msg)
42
+ say " !txtpur!$ #{msg}"
43
+ end
44
+
45
+ def puts_stdout(msg)
46
+ say " #{msg}"
47
+ end
48
+
49
+ end
50
+
51
+ end
52
+
@@ -0,0 +1,3 @@
1
+ module Jossh
2
+ VERSION = "0.0.1"
3
+ end
data/lib/jossh.rb ADDED
@@ -0,0 +1,6 @@
1
+ require 'jossh/version'
2
+ require 'jossh/command_runner'
3
+ require 'jossh/output_handler'
4
+ require 'jossh/api'
5
+
6
+ self.extend Jossh
metadata ADDED
@@ -0,0 +1,120 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jossh
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Danny Ben Shitrit
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-11-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: colsole
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: net-ssh
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.8'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.8'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest-reporters
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.1'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: run-gem-dev
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.2'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.2'
83
+ description: Jossh is a wrapper around Ruby Net::SSH with a simpler interface and
84
+ prettier output
85
+ email: db@dannyben.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - README.md
91
+ - lib/jossh.rb
92
+ - lib/jossh/api.rb
93
+ - lib/jossh/command_runner.rb
94
+ - lib/jossh/output_handler.rb
95
+ - lib/jossh/version.rb
96
+ homepage: https://github.com/DannyBen/jossh
97
+ licenses:
98
+ - MIT
99
+ metadata: {}
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ requirements: []
115
+ rubyforge_project:
116
+ rubygems_version: 2.4.6
117
+ signing_key:
118
+ specification_version: 4
119
+ summary: Easier and Prettier SSH for Ruby
120
+ test_files: []