sshez 0.3.0 → 1.0.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/.codeclimate.yml +18 -0
- data/.rubocop.yml +1171 -0
- data/.travis.yml +9 -2
- data/CHANGELOG.md +5 -1
- data/Gemfile.lock +35 -0
- data/README.md +10 -10
- data/bin/sshez +1 -1
- data/lib/sshez.rb +9 -3
- data/lib/sshez/command.rb +63 -0
- data/lib/sshez/exec.rb +179 -32
- data/lib/sshez/parser.rb +128 -0
- data/lib/sshez/printing_manager.rb +52 -0
- data/lib/sshez/runner.rb +60 -0
- data/lib/sshez/version.rb +4 -1
- data/spec/sshez_spec.rb +70 -23
- data/sshez.gemspec +1 -1
- metadata +11 -6
- data/lib/sshez/config_file.rb +0 -83
- data/lib/sshez/params.rb +0 -64
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module Sshez
|
4
|
+
# Just a printing service that keeps track by all its output
|
5
|
+
# Mainly used for testing purposes
|
6
|
+
class PrintingManager
|
7
|
+
include Singleton
|
8
|
+
# An attribute reader to store printing logs
|
9
|
+
attr_reader :output
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@output = ''
|
13
|
+
@verbose = false
|
14
|
+
end
|
15
|
+
|
16
|
+
# adds to output then prints
|
17
|
+
def print(text)
|
18
|
+
@output += %(#{text}\n)
|
19
|
+
puts text
|
20
|
+
end # print(text)
|
21
|
+
|
22
|
+
#
|
23
|
+
# prints only if verbose set to true
|
24
|
+
#
|
25
|
+
def verbose_print(text)
|
26
|
+
@output += %(#{text}\n)
|
27
|
+
puts text if @verbose
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
# Did we print anything?
|
32
|
+
#
|
33
|
+
def output?
|
34
|
+
!@output.empty?
|
35
|
+
end
|
36
|
+
|
37
|
+
#
|
38
|
+
# Let the flooding begin!
|
39
|
+
#
|
40
|
+
def verbose!
|
41
|
+
@verbose = true
|
42
|
+
end
|
43
|
+
|
44
|
+
#
|
45
|
+
# Resets the printer for testing purposes
|
46
|
+
#
|
47
|
+
def clear!
|
48
|
+
@output = ''
|
49
|
+
@verbose = false
|
50
|
+
end
|
51
|
+
end # PrintingManager
|
52
|
+
end
|
data/lib/sshez/runner.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
module Sshez
|
2
|
+
#
|
3
|
+
# Our main class
|
4
|
+
# This will #process the command of the user
|
5
|
+
#
|
6
|
+
# Sshez::Runner.new.process(ARGV)
|
7
|
+
#
|
8
|
+
# Acts as the listener that the +Exec+ needs
|
9
|
+
# * :argument_error(+Command+)
|
10
|
+
# * :done_with_no_guarantee
|
11
|
+
# * :permission_error
|
12
|
+
# * :finished_successfully
|
13
|
+
#
|
14
|
+
#
|
15
|
+
#
|
16
|
+
class Runner
|
17
|
+
PRINTER = PrintingManager.instance
|
18
|
+
|
19
|
+
#
|
20
|
+
# Main method of the application
|
21
|
+
# takes un processed ARGS and pass it to our parser to start our processing
|
22
|
+
#
|
23
|
+
def process(args)
|
24
|
+
parser = Parser.new(Exec.new(self))
|
25
|
+
parser.parse(args)
|
26
|
+
PRINTER.output
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# We've finished everything successfully
|
31
|
+
#
|
32
|
+
def finished_successfully
|
33
|
+
PRINTER.print 'Terminated Successfully!'
|
34
|
+
end
|
35
|
+
|
36
|
+
#
|
37
|
+
# Handles when the config file could not be accessed due to a problem in permissions
|
38
|
+
#
|
39
|
+
def permission_error
|
40
|
+
PRINTER.print "Premission denied!\nPlease check your ~/.ssh/config permissions then try again."
|
41
|
+
end
|
42
|
+
|
43
|
+
#
|
44
|
+
# Returns the appropriate error messages to the given command
|
45
|
+
#
|
46
|
+
def argument_error(command)
|
47
|
+
PRINTER.print(command.error)
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
# When no valid command was supplied (maybe only an option)
|
52
|
+
#
|
53
|
+
def done_with_no_guarantee
|
54
|
+
unless PRINTER.output?
|
55
|
+
PRINTER.print('Invalid input. Use -h for help')
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end # class Runner
|
60
|
+
end
|
data/lib/sshez/version.rb
CHANGED
data/spec/sshez_spec.rb
CHANGED
@@ -2,14 +2,14 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Sshez do
|
4
4
|
|
5
|
-
subject { Sshez::
|
6
|
-
it 'has a version number' do
|
7
|
-
expect(Sshez::VERSION).not_to be nil
|
8
|
-
end
|
5
|
+
subject { Sshez::Runner.new }
|
9
6
|
|
10
7
|
describe '#process' do
|
11
|
-
let(:input) {
|
12
|
-
let(:output)
|
8
|
+
let(:input) { %w{add google root@74.125.224.72 -p 80 -t -b} }
|
9
|
+
let(:output) do
|
10
|
+
Sshez::PrintingManager.instance.clear!
|
11
|
+
subject.process(input)
|
12
|
+
end
|
13
13
|
|
14
14
|
it 'begins with what it does' do
|
15
15
|
expect(output).to start_with "Adding"
|
@@ -21,61 +21,108 @@ describe Sshez do
|
|
21
21
|
expect(output).to match /Port 80/i
|
22
22
|
end
|
23
23
|
|
24
|
+
it 'adds batch mode option' do
|
25
|
+
expect(output).to match /BatchMode yes/i
|
26
|
+
end
|
27
|
+
|
24
28
|
it 'always appends "Done" if succeeds' do
|
25
|
-
expect(output).to end_with
|
29
|
+
expect(output).to end_with "Terminated Successfully!\n"
|
26
30
|
end
|
27
31
|
end
|
28
32
|
|
29
33
|
describe "fails" do
|
30
|
-
let(:input) {
|
31
|
-
let(:output)
|
34
|
+
let(:input) { %w{root@74.125.224.72} }
|
35
|
+
let(:output) do
|
36
|
+
Sshez::PrintingManager.instance.clear!
|
37
|
+
subject.process(input)
|
38
|
+
end
|
32
39
|
|
33
40
|
it 'and printes start' do
|
34
41
|
expect(output).to start_with "Invalid input"
|
35
42
|
end
|
36
43
|
|
37
44
|
it 'and then asks for help at the end' do
|
38
|
-
expect(output).to end_with
|
45
|
+
expect(output).to end_with "Use -h for help\n"
|
39
46
|
end
|
40
47
|
|
41
48
|
end
|
42
49
|
|
43
50
|
describe "help works" do
|
44
51
|
let(:input) { '-h' }
|
45
|
-
let(:output)
|
52
|
+
let(:output) do
|
53
|
+
Sshez::PrintingManager.instance.clear!
|
54
|
+
subject.process([input])
|
55
|
+
end
|
46
56
|
|
47
|
-
it 'prints but
|
48
|
-
expect(output).to
|
57
|
+
it 'prints but ending with this message' do
|
58
|
+
expect(output).to end_with "Show this message\n\n"
|
49
59
|
end
|
50
60
|
end
|
51
61
|
|
52
62
|
describe "remove" do
|
53
|
-
before { subject.process(%w{google root@74.12.32.42 -p 30}) }
|
54
|
-
let(:input) {
|
55
|
-
let(:output)
|
63
|
+
before { subject.process(%w{add google root@74.12.32.42 -p 30}) }
|
64
|
+
let(:input) { %w{remove google} }
|
65
|
+
let(:output) do
|
66
|
+
Sshez::PrintingManager.instance.clear!
|
67
|
+
subject.process(input)
|
68
|
+
end
|
56
69
|
|
57
70
|
it 'ends with 30' do
|
58
|
-
expect(output).to end_with "30\n"
|
71
|
+
expect(output).to end_with "30\n\nTerminated Successfully!\n"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "remove and try to connect" do
|
76
|
+
before do
|
77
|
+
subject.process(%w{add google root@74.12.32.42 -p 30})
|
78
|
+
subject.process(%w{remove google})
|
79
|
+
end
|
80
|
+
|
81
|
+
let(:input) { %w{connect google} }
|
82
|
+
|
83
|
+
let(:output) do
|
84
|
+
Sshez::PrintingManager.instance.clear!
|
85
|
+
subject.process(input)
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'fails to connect to removed host' do
|
89
|
+
expect(output).to end_with "Could not find host `google`\n"
|
59
90
|
end
|
60
91
|
end
|
61
92
|
|
62
93
|
describe "list works" do
|
63
|
-
before { subject.process(%w{google root@74.12.32.42 -p 30}) }
|
64
|
-
let(:input) {
|
65
|
-
let(:output)
|
66
|
-
|
94
|
+
before { subject.process(%w{add google root@74.12.32.42 -p 30}) }
|
95
|
+
let(:input) { %w{list} }
|
96
|
+
let(:output) do
|
97
|
+
Sshez::PrintingManager.instance.clear!
|
98
|
+
subject.process(input)
|
99
|
+
end
|
100
|
+
after { subject.process(%w{remove google}) }
|
67
101
|
|
68
102
|
it 'contains added alias' do
|
69
|
-
expect(output).to end_with "google\n"
|
103
|
+
expect(output).to end_with "google\nTerminated Successfully!\n"
|
70
104
|
end
|
71
105
|
end
|
72
106
|
|
107
|
+
describe "printer works" do
|
108
|
+
before { Sshez::PrintingManager.instance.clear! }
|
109
|
+
|
110
|
+
let(:printer) { Sshez::PrintingManager.instance }
|
111
|
+
let(:output) { printer.print("this is it"); printer.output }
|
112
|
+
|
113
|
+
it 'should be printed and kept' do
|
114
|
+
expect(output).to end_with "this is it\n"
|
115
|
+
end
|
116
|
+
|
117
|
+
after { Sshez::PrintingManager.instance.clear! }
|
118
|
+
end
|
119
|
+
|
73
120
|
describe "version works" do
|
74
121
|
let(:input) { "-v" }
|
75
122
|
let(:output) { subject.process(input.split(" ")) }
|
76
123
|
|
77
124
|
it 'matches gem version' do
|
78
|
-
expect(output).to end_with "#{Sshez.version}"
|
125
|
+
expect(output).to end_with "#{Sshez.version}\n"
|
79
126
|
end
|
80
127
|
end
|
81
128
|
end
|
data/sshez.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
19
19
|
spec.test_files = Dir["spec/**/*"]
|
20
20
|
spec.require_paths = ["lib"]
|
21
|
-
spec.executables = ["sshez"]
|
21
|
+
spec.executables = ["sshez"]
|
22
22
|
|
23
23
|
spec.add_development_dependency "bundler", "~> 1.10"
|
24
24
|
spec.add_development_dependency "rake", "~> 10.0"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sshez
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Immortal Friday
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2016-02-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -64,12 +64,15 @@ executables:
|
|
64
64
|
extensions: []
|
65
65
|
extra_rdoc_files: []
|
66
66
|
files:
|
67
|
+
- ".codeclimate.yml"
|
67
68
|
- ".gitignore"
|
68
69
|
- ".rspec"
|
70
|
+
- ".rubocop.yml"
|
69
71
|
- ".travis.yml"
|
70
72
|
- CHANGELOG.md
|
71
73
|
- CODE_OF_CONDUCT.md
|
72
74
|
- Gemfile
|
75
|
+
- Gemfile.lock
|
73
76
|
- LICENSE
|
74
77
|
- LICENSE.txt
|
75
78
|
- README.md
|
@@ -78,9 +81,11 @@ files:
|
|
78
81
|
- bin/setup
|
79
82
|
- bin/sshez
|
80
83
|
- lib/sshez.rb
|
81
|
-
- lib/sshez/
|
84
|
+
- lib/sshez/command.rb
|
82
85
|
- lib/sshez/exec.rb
|
83
|
-
- lib/sshez/
|
86
|
+
- lib/sshez/parser.rb
|
87
|
+
- lib/sshez/printing_manager.rb
|
88
|
+
- lib/sshez/runner.rb
|
84
89
|
- lib/sshez/version.rb
|
85
90
|
- spec/spec_helper.rb
|
86
91
|
- spec/sshez_spec.rb
|
@@ -106,10 +111,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
111
|
version: '0'
|
107
112
|
requirements: []
|
108
113
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.
|
114
|
+
rubygems_version: 2.5.1
|
110
115
|
signing_key:
|
111
116
|
specification_version: 4
|
112
117
|
summary: Easy ssh config handling
|
113
118
|
test_files:
|
114
|
-
- spec/sshez_spec.rb
|
115
119
|
- spec/spec_helper.rb
|
120
|
+
- spec/sshez_spec.rb
|
data/lib/sshez/config_file.rb
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
module Sshez
|
2
|
-
class ConfigFile
|
3
|
-
FILE_PATH = File.expand_path('~') + "/.ssh/config"
|
4
|
-
|
5
|
-
def self.append(name, user, host, options)
|
6
|
-
output = "Adding\n"
|
7
|
-
config_append = form(name, user, host, options)
|
8
|
-
output += config_append
|
9
|
-
unless options.test
|
10
|
-
file = File.open(FILE_PATH, "a+")
|
11
|
-
file.write(config_append)
|
12
|
-
file.close
|
13
|
-
puts "Successfully added `#{name}` as an alias for `#{user}@#{host}`"
|
14
|
-
system "chmod 600 #{FILE_PATH}"
|
15
|
-
end
|
16
|
-
output += "to #{FILE_PATH}\n"
|
17
|
-
output += "try ssh #{name} \n"
|
18
|
-
|
19
|
-
output
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.form(name, user, host, options)
|
23
|
-
retuned = "\n"
|
24
|
-
retuned += "Host #{name}\n"
|
25
|
-
retuned += " HostName #{host}\n"
|
26
|
-
retuned += " User #{user}\n"
|
27
|
-
|
28
|
-
options.file_content.each_pair do |key, value|
|
29
|
-
retuned += value
|
30
|
-
end
|
31
|
-
retuned
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.remove(name)
|
36
|
-
output = ""
|
37
|
-
started_removing = false
|
38
|
-
file = File.open(FILE_PATH, "r")
|
39
|
-
new_file = File.open(FILE_PATH+"temp", "w")
|
40
|
-
file.each do |line|
|
41
|
-
if line.include?("Host #{name}")|| started_removing
|
42
|
-
if started_removing && line.include?("Host ") && !line.include?(name)
|
43
|
-
started_removing = false
|
44
|
-
else
|
45
|
-
output += line
|
46
|
-
started_removing = true
|
47
|
-
end
|
48
|
-
else
|
49
|
-
new_file.write(line)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
file.close
|
53
|
-
new_file.close
|
54
|
-
File.delete(FILE_PATH)
|
55
|
-
File.rename(FILE_PATH + "temp", FILE_PATH)
|
56
|
-
system "chmod 600 #{FILE_PATH}"
|
57
|
-
|
58
|
-
if output.empty?
|
59
|
-
return "could not find host (#{name})"
|
60
|
-
else
|
61
|
-
return output
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def self.list
|
66
|
-
file = File.open(FILE_PATH, "r")
|
67
|
-
servers = []
|
68
|
-
file.each do |line|
|
69
|
-
if line.include?("Host ")
|
70
|
-
servers << line.sub('Host', '')
|
71
|
-
end
|
72
|
-
end
|
73
|
-
file.close
|
74
|
-
if servers.empty?
|
75
|
-
puts "No aliases added"
|
76
|
-
else
|
77
|
-
puts "Listing aliases:"
|
78
|
-
servers.each{|x| puts "\t- #{x}"}
|
79
|
-
end
|
80
|
-
return servers.join(',')
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
data/lib/sshez/params.rb
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
module Sshez
|
2
|
-
class Params
|
3
|
-
#
|
4
|
-
# Return a structure describing the options.
|
5
|
-
#
|
6
|
-
def self.parse(args)
|
7
|
-
# The options specified on the command line will be collected in *options*.
|
8
|
-
# We set default values here.
|
9
|
-
options = OpenStruct.new
|
10
|
-
options.file_content = OpenStruct.new
|
11
|
-
|
12
|
-
opt_parser = OptionParser.new do |opts|
|
13
|
-
opts.banner = "Usage:\n\tsshez <alias> (role@host|-r) [options]\n\tsshez remove <alias>\n\tsshez list"
|
14
|
-
|
15
|
-
opts.separator ""
|
16
|
-
opts.separator "Specific options:"
|
17
|
-
|
18
|
-
# Mandatory argument.
|
19
|
-
opts.on("-p", "--port PORT",
|
20
|
-
"Specify a port") do |port|
|
21
|
-
options.port = port
|
22
|
-
options.file_content.port_text = " Port #{options.port}\n"
|
23
|
-
end
|
24
|
-
|
25
|
-
# Optional argument; multi-line description.
|
26
|
-
opts.on("-i", "--identity_file [key]",
|
27
|
-
"Add identity") do |key_path|
|
28
|
-
options.identity_file = key_path
|
29
|
-
options.file_content.identity_file_text = " IdentityFile #{options.identity_file}\n"
|
30
|
-
end
|
31
|
-
|
32
|
-
opts.on("-r", "--remove", "Remove handle") do
|
33
|
-
options.remove = true
|
34
|
-
end
|
35
|
-
|
36
|
-
opts.on("-t", "--test", "Writes nothing") do
|
37
|
-
options.test = true
|
38
|
-
end
|
39
|
-
|
40
|
-
opts.separator ""
|
41
|
-
opts.separator "Common options:"
|
42
|
-
|
43
|
-
opts.on("-l", "--list", "List aliases") do
|
44
|
-
Sshez::ConfigFile.list
|
45
|
-
return
|
46
|
-
end
|
47
|
-
|
48
|
-
# Another typical switch to print the version.
|
49
|
-
opts.on("-v", "--version", "Show version") do
|
50
|
-
puts Sshez.version
|
51
|
-
return
|
52
|
-
end
|
53
|
-
|
54
|
-
opts.on_tail("-h", "--help", "Show this message") do
|
55
|
-
puts opts
|
56
|
-
puts "\n"
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
opt_parser.parse!(args)
|
61
|
-
options
|
62
|
-
end # parse()
|
63
|
-
end # class Params
|
64
|
-
end
|