ssh-manager 1.0.7 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ssh/manager/ask.sh +10 -0
- data/lib/ssh/manager/cli.rb +126 -106
- data/lib/ssh/manager/client.rb +27 -17
- data/lib/ssh/manager/db.rb +39 -15
- data/lib/ssh/manager/version.rb +1 -1
- metadata +3 -3
- data/config/sshm.db +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 56dbc7d6e9248cc66a7a3840669ffc4cf0056555
|
4
|
+
data.tar.gz: 54cae9ac4705336ad6dbbb39628cb18003d101c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e15cc62eb68e761da4214faa7b1e5b4191aef724436386b045e593cfc7b8ed7fc4bf67481d599b2550aaeed28fb3849f1bc161c30e0c36fe763f444b67ea8ec2
|
7
|
+
data.tar.gz: 603a5b658f4db6f72a9725448f53f671fd09bfb875c9c7c19baeaee71db7d11e742700f979b28b3b5b0672302e5309a85d6be7c4180626aa3a8c033d7fb94089
|
data/lib/ssh/manager/cli.rb
CHANGED
@@ -12,44 +12,58 @@ module SSH
|
|
12
12
|
|
13
13
|
def initialize(opts = {})
|
14
14
|
@options = opts
|
15
|
+
@pretty_names = {:id => "ID", #TODO :connect_via
|
16
|
+
:ip => "IP or hostname",
|
17
|
+
:user => "Username",
|
18
|
+
:hostname => "Alias",
|
19
|
+
:port => "Port",
|
20
|
+
:note => "Note",
|
21
|
+
:options => "Options",
|
22
|
+
:group => "Group",
|
23
|
+
:connect_via => "Connect via (id)"}
|
24
|
+
@visible_fields = [:id, :ip, :group, :note]
|
25
|
+
@input_fields = [:ip, :hostname, :user, :port, :options, :note, :group, :connect_via]
|
26
|
+
@column_width = 15 #TODO make this dynamic or a yaml setting
|
15
27
|
end
|
16
28
|
|
17
|
-
def
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
+
def connect_to(id)
|
30
|
+
id.each do |conn|
|
31
|
+
conn.to_i
|
32
|
+
ssh_command = ""
|
33
|
+
i = conn
|
34
|
+
begin
|
35
|
+
connection = DATABASE.get_connection_by_id(i)
|
36
|
+
ip = connection[:ip]
|
37
|
+
user = connection[:user]
|
38
|
+
user = ENV['USER'] if user == ""
|
39
|
+
options = connection[:options]
|
40
|
+
via = connection[:connect_via]
|
41
|
+
ssh_command = "ssh -A -t #{options} #{user}@#{ip} #{ssh_command}"
|
42
|
+
i = via
|
43
|
+
#TODO prevent endless via-loops
|
44
|
+
end while via
|
45
|
+
connection[:count] += 1
|
46
|
+
connection[:last_time] = Time.now
|
47
|
+
DATABASE.update_connection(connection)
|
48
|
+
if CONFIG['target'] == "self"
|
49
|
+
exec ssh_command
|
50
|
+
elsif CONFIG['terminal'] == "xfce4-terminal" || CONFIG['terminal'] == "gnome-terminal"
|
51
|
+
if CONFIG['tabbed'] == 'true'
|
52
|
+
command = "--title=#{user}@#{ip} --tab --command="
|
53
|
+
else
|
54
|
+
command = "--title=#{user}@#{ip} --command="
|
55
|
+
end
|
56
|
+
#TODO: add title --title='connection name to identify '
|
57
|
+
#TODO: bug when no terminal is open => wants to open 2 terms
|
58
|
+
#TODO: dnslookup
|
59
|
+
%x(#{CONFIG['terminal']} #{command}"#{ssh_command}")
|
60
|
+
elsif CONFIG['terminal'] == "xterm" || CONFIG['terminal'] == "urxvt"
|
61
|
+
%x(#{CONFIG['terminal']} -e "#{ssh_command}")
|
29
62
|
else
|
30
|
-
|
63
|
+
puts "We dont support #{CONFIG['terminal']} right now"
|
64
|
+
puts 'Check Github for further development or contributing'
|
31
65
|
end
|
32
|
-
elsif CONFIG['terminal'] == "xterm" || CONFIG['terminal'] == "urxvt"
|
33
|
-
%x(#{CONFIG['terminal']} -e "ssh #{user}@#{ip}")
|
34
|
-
else
|
35
|
-
puts "We dont support #{CONFIG['terminal']} right now"
|
36
|
-
puts 'Check Github for further development or contributing'
|
37
66
|
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def connect_to(id)
|
41
|
-
via = DATABASE.get_connection_data[id.to_i-1][-1] =~ /@/
|
42
|
-
if via.nil?
|
43
|
-
@ip = DATABASE.get_connection_data[id.to_i-1][0]
|
44
|
-
@user = DATABASE.get_connection_data[id.to_i-1][1]
|
45
|
-
check_term(@ip, @user, via)
|
46
|
-
else
|
47
|
-
@ip = DATABASE.get_connection_data[id.to_i-1][0]
|
48
|
-
@user = DATABASE.get_connection_data[id.to_i-1][1]
|
49
|
-
via = DATABASE.get_connection_data[id.to_i-1][-1]
|
50
|
-
check_term(@ip, @user, via)
|
51
|
-
end
|
52
|
-
#TODO: check for options
|
53
67
|
#TODO: if db[secure_login] = false => http://linuxcommando.blogspot.de/2008/10/how-to-disable-ssh-host-key-checking.html
|
54
68
|
end
|
55
69
|
|
@@ -59,119 +73,125 @@ module SSH
|
|
59
73
|
if new_version<old_version
|
60
74
|
puts "There is a update available #{new_version} was released. -> sudo gem update ssh-manager"
|
61
75
|
else
|
62
|
-
|
76
|
+
puts "Version: #{old_version} is up to date."
|
63
77
|
end
|
64
78
|
end
|
65
79
|
|
80
|
+
def show_info(id)
|
81
|
+
@input_fields << :count
|
82
|
+
@input_fields << :last_time
|
83
|
+
id.each do |conn|
|
84
|
+
connections = DATABASE.get_connection_by_id(conn.to_i)
|
85
|
+
puts "\n"
|
86
|
+
@input_fields.each do |field|
|
87
|
+
if field == :connect_via && connections[field] != nil
|
88
|
+
via_ip = DATABASE.get_connection_by_id(connections[field])[:ip]
|
89
|
+
printf "%s: %s -|- %s ", field, connections[field], via_ip
|
90
|
+
else
|
91
|
+
printf "%s: %s", field, connections[field]
|
92
|
+
end
|
93
|
+
puts "\n"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def transfer_key(id)
|
99
|
+
#TODO connect_via
|
100
|
+
#TODO options
|
101
|
+
connection = DATABASE.get_connection_by_id(id)
|
102
|
+
user = connection[:user]
|
103
|
+
user = ENV['USER'] if user == ""
|
104
|
+
%x(ssh-copy-id #{user}@#{connection[:ip]})
|
105
|
+
end
|
106
|
+
|
66
107
|
def ping(id)
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
108
|
+
connection = DATABASE.get_connection_by_id(id)
|
109
|
+
if connection[:connect_via]
|
110
|
+
connect_via = DATABASE.get_connection_by_id(connection[:connect_via])
|
111
|
+
ssh = "ssh #{connect_via[:user]}@#{connect_via[:ip]}"
|
112
|
+
exec("#{ssh} ping #{connection[:ip]} -c 3")
|
71
113
|
else
|
72
|
-
|
73
|
-
exec("ssh #{via} ping #{@ip}")
|
114
|
+
exec("ping #{connection[:ip]} -c 3")
|
74
115
|
end
|
75
116
|
end
|
76
117
|
|
77
|
-
def
|
78
|
-
|
79
|
-
|
80
|
-
%x(ssh-copy-id #{@user}@#{@ip})
|
118
|
+
def test(type)
|
119
|
+
require 'byebug'
|
120
|
+
byebug
|
81
121
|
end
|
82
122
|
|
83
123
|
def transfer_file(filename, id='', dest_path="/home/#{user}/")
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
124
|
+
#TODO connect_via
|
125
|
+
#TODO options
|
126
|
+
connection = DATABASE.get_connection_by_id(id)
|
127
|
+
user = connection[:user]
|
128
|
+
user = ENV['USER'] if user == ""
|
129
|
+
%x(scp #{filename} #{user}@#{connection[:ip]}:#{dest_path}) if File.file?(filename)
|
130
|
+
%x(scp -r #{filename} #{@user}@#{connection[:ip]}:#{dest_path}) if File.directory?(filename)
|
88
131
|
end
|
89
132
|
|
90
|
-
def add_connection
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
options = '' if options == ''
|
104
|
-
puts 'Group: '
|
105
|
-
group = $stdin.gets.chomp
|
106
|
-
puts 'Connect via(ip): '
|
107
|
-
connect_via_ip = $stdin.gets.chomp
|
108
|
-
puts 'With Username: '
|
109
|
-
connect_via_user = $stdin.gets.chomp
|
110
|
-
connect_via = ""
|
111
|
-
connect_via= "#{connect_via_user}@#{connect_via_ip}" unless connect_via_user.empty?
|
112
|
-
count = 0
|
113
|
-
created_at = Time.now.to_s
|
114
|
-
last_time = Time.now.to_s
|
115
|
-
DATABASE.add_new_connection(ip, user, hostname, port, note, connect_via, created_at, options, count, group, last_time)
|
133
|
+
def add_connection
|
134
|
+
connection = {:user => ENV['USER'],
|
135
|
+
:port => "22"}
|
136
|
+
@input_fields.each do |key|
|
137
|
+
#TODO make this a method
|
138
|
+
connection[key] = %x{source #{File.dirname(__FILE__)}/ask.sh; ask '#{@pretty_names[key]}' '#{connection[key]}'}.chomp
|
139
|
+
end
|
140
|
+
connection[:count] = 0
|
141
|
+
connection[:created_at] = Time.now.to_s
|
142
|
+
connection[:last_time] = Time.now.to_s
|
143
|
+
connection[:connect_via] = nil if connection[:connect_via] == ""
|
144
|
+
DATABASE.add_new_connection(connection)
|
145
|
+
#TODO catch SQLite3::ConstraintException
|
116
146
|
end
|
117
147
|
|
118
148
|
def delete(id)
|
119
|
-
id
|
120
|
-
|
149
|
+
id.each do |conn|
|
150
|
+
conn.to_i
|
151
|
+
DATABASE.delete_connection(conn)
|
152
|
+
end
|
121
153
|
end
|
122
154
|
|
123
155
|
def list_all
|
124
|
-
|
125
|
-
|
126
|
-
puts
|
127
|
-
connections.each do |
|
128
|
-
|
129
|
-
x[1].each do |a|
|
130
|
-
printf '%-15s', a
|
131
|
-
end
|
156
|
+
connections = DATABASE.get_connection_data
|
157
|
+
@visible_fields.each { |f| printf "%-#{@column_width}s", @pretty_names[f] }
|
158
|
+
puts "\n"
|
159
|
+
connections.each do |c|
|
160
|
+
@visible_fields.each { |f| printf "%-#{@column_width}s", c[f] }
|
132
161
|
puts "\n"
|
133
162
|
end
|
134
163
|
end
|
135
164
|
|
136
165
|
def update(id)
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
port = $stdin.gets.chomp
|
146
|
-
port = DATABASE.get_connection_data[id.to_i][3] if port == ''
|
147
|
-
puts 'Notes: '
|
148
|
-
note = $stdin.gets.chomp
|
149
|
-
note = DATABASE.get_connection_data[id.to_i][4] if note == ''
|
150
|
-
DATABASE.update_connection(DATABASE.get_connection_data[id.to_i][0], user, hostname, port, note)
|
166
|
+
connection = DATABASE.get_connection_by_id(id)
|
167
|
+
@input_fields.each do |key|
|
168
|
+
#TODO make this a method
|
169
|
+
connection[key] = %x{source #{File.dirname(__FILE__)}/ask.sh; ask '#{@pretty_names[key]}' '#{connection[key]}'}.chomp
|
170
|
+
end
|
171
|
+
connection[:connect_via] = nil if connection[:connect_via] == ""
|
172
|
+
DATABASE.update_connection(connection)
|
173
|
+
#TODO catch SQLite3::ConstraintException
|
151
174
|
end
|
152
175
|
|
153
176
|
def search_for(term)
|
154
|
-
puts
|
177
|
+
puts "All results for searchterm: #{term}"
|
178
|
+
@visible_fields.each { |f| printf "%-#{@column_width}s", @pretty_names[f] }
|
179
|
+
print "\n"
|
155
180
|
DATABASE.search_for(term).each do |x|
|
156
181
|
x.all.each do |cons|
|
157
|
-
|
158
|
-
printf '%-20s', each_con
|
159
|
-
end
|
182
|
+
@visible_fields.each { |f| printf "%-#{@column_width}s", cons[f] }
|
160
183
|
puts "\n"
|
161
184
|
end
|
162
185
|
end
|
163
|
-
puts "All results for searchterm: #{term}"
|
164
186
|
end
|
165
187
|
|
166
188
|
def multiple_connection(term)
|
167
189
|
DATABASE.search_for(term).each do |x|
|
168
190
|
x.all.each do |dataset|
|
169
|
-
|
170
|
-
#TODO: Add terminalposition
|
191
|
+
self.connect_to(dataset[:id])
|
171
192
|
end
|
172
193
|
end
|
173
194
|
end
|
174
|
-
|
175
195
|
end
|
176
196
|
end
|
177
197
|
end
|
data/lib/ssh/manager/client.rb
CHANGED
@@ -18,15 +18,24 @@ module SSH
|
|
18
18
|
|
19
19
|
def execute!
|
20
20
|
cli = SSH::Manager::Cli
|
21
|
+
# TODO id.to_i is not good enough. we want to support hostnames too
|
22
|
+
# Checking and casting in the methods itself could solve the problem
|
23
|
+
# futhermore this could reside in a separate method
|
21
24
|
if @options[:add]
|
22
25
|
puts 'Adding ..'
|
23
|
-
cli.new(@options).add_connection
|
26
|
+
cli.new(@options).add_connection
|
24
27
|
elsif @options[:connect]
|
25
28
|
puts 'Connecting ..'
|
26
29
|
cli.new(@options).connect_to(@options[:connect])
|
30
|
+
elsif @options[:info]
|
31
|
+
puts 'Printing info ..'
|
32
|
+
cli.new(@options).show_info(@options[:info])
|
27
33
|
elsif @options[:transfer_file]
|
28
34
|
puts 'Transfering file..'
|
29
|
-
cli.new(@options).transfer_file(@options[:transfer_file], @argv[2], @argv[3])
|
35
|
+
cli.new(@options).transfer_file(@options[:transfer_file].to_i, @argv[2], @argv[3])
|
36
|
+
elsif @options[:ping]
|
37
|
+
puts 'Pinging..'
|
38
|
+
cli.new(@options).ping(@options[:ping].to_i)
|
30
39
|
elsif @options[:delete]
|
31
40
|
puts 'Deleting ..'
|
32
41
|
cli.new(@options).delete(@options[:delete])
|
@@ -38,16 +47,13 @@ module SSH
|
|
38
47
|
cli.new(@options).update_available
|
39
48
|
elsif @options[:update]
|
40
49
|
puts 'Updating ..'
|
41
|
-
cli.new(@options).update(@options[:update])
|
50
|
+
cli.new(@options).update(@options[:update].to_i)
|
42
51
|
elsif @options[:multi]
|
43
52
|
puts 'Connecting to multiple ips..'
|
44
53
|
cli.new(@options).multiple_connection(@options[:multi])
|
45
54
|
elsif @options[:transfer_key]
|
46
55
|
puts 'Transfering key..'
|
47
|
-
cli.new(@options).transfer_key(@options[:transfer_key])
|
48
|
-
elsif @options[:ping]
|
49
|
-
puts 'Ping Pong..'
|
50
|
-
cli.new(@options).ping(@options[:ping])
|
56
|
+
cli.new(@options).transfer_key(@options[:transfer_key].to_i)
|
51
57
|
elsif @options[:search]
|
52
58
|
puts 'Searching ..'
|
53
59
|
cli.new(@options).search_for(@options[:search])
|
@@ -65,27 +71,31 @@ module SSH
|
|
65
71
|
@optparse = OptionParser.new do |opts|
|
66
72
|
opts.banner = "Usage: sshm [options] ..."
|
67
73
|
@options[:add] = false
|
68
|
-
opts.on( '-a', '--add
|
69
|
-
@options[:add] =
|
74
|
+
opts.on( '-a', '--add', 'add a new connection' ) do
|
75
|
+
@options[:add] = true
|
70
76
|
end
|
71
77
|
@options[:transfer_key] = false
|
72
78
|
opts.on( '-t', '--transferkey id', 'transfer key to <id>' ) do |opt|
|
73
79
|
@options[:transfer_key] = opt
|
74
80
|
end
|
75
|
-
@options[:ping] = false
|
76
|
-
opts.on( '-p', '--ping connection id', 'ping connection/)' ) do |opt|
|
77
|
-
@options[:ping] = opt
|
78
|
-
end
|
79
81
|
@options[:transfer_file] = false
|
80
82
|
opts.on( '-r', '--transferfile filename', 'file or dir / connection_ID / dest_path(default is /home/user/)' ) do |opt|
|
81
83
|
@options[:transfer_file] = opt
|
82
84
|
end
|
83
85
|
@options[:connect] = false
|
84
|
-
opts.on( '-c', '--connect
|
86
|
+
opts.on( '-c', '--connect x y z', Array, 'connect to <ids>' ) do |opt|
|
85
87
|
@options[:connect] = opt
|
86
88
|
end
|
89
|
+
@options[:info] = false
|
90
|
+
opts.on( '-i', '--info id1 id2 id3',Array, 'info about to <id>' ) do |opt|
|
91
|
+
@options[:info] = opt
|
92
|
+
end
|
93
|
+
@options[:ping] = false
|
94
|
+
opts.on( '-p', '--ping id', 'test connection of <id>' ) do |opt|
|
95
|
+
@options[:ping] = opt
|
96
|
+
end
|
87
97
|
@options[:delete] = false
|
88
|
-
opts.on( '-d', '--delete
|
98
|
+
opts.on( '-d', '--delete id1 id2 id3',Array, 'delete connection <ids>' ) do |opt|
|
89
99
|
@options[:delete] = opt
|
90
100
|
end
|
91
101
|
@options[:update] = false
|
@@ -108,11 +118,11 @@ module SSH
|
|
108
118
|
opts.on( '-g', '--upgrade', 'checks for upgrade' ) do
|
109
119
|
@options[:upgrade] = true
|
110
120
|
end
|
111
|
-
opts.on( '-h', '--help', '
|
121
|
+
opts.on( '-h', '--help', 'display this screen' ) do
|
112
122
|
puts opts
|
113
123
|
exit
|
114
124
|
end
|
115
|
-
opts.on( '-v', '--version', '
|
125
|
+
opts.on( '-v', '--version', 'print programs version' ) do
|
116
126
|
puts SSH::Manager::VERSION
|
117
127
|
exit
|
118
128
|
end
|
data/lib/ssh/manager/db.rb
CHANGED
@@ -5,41 +5,65 @@ module SSH
|
|
5
5
|
module Manager
|
6
6
|
class Database
|
7
7
|
|
8
|
-
|
9
|
-
FileUtils.
|
8
|
+
@config_dir = "#{ENV['HOME']}/.config/sshm"
|
9
|
+
FileUtils.mkdir_p(@config_dir) unless Dir.exists?(@config_dir)
|
10
10
|
|
11
|
-
@
|
12
|
-
|
11
|
+
@database_file = "#{@config_dir}/sshm.sqlite3"
|
12
|
+
unless File.exists?(@database_file)
|
13
|
+
Sequel.sqlite(@database_file).run <<-NEW_DB
|
14
|
+
CREATE TABLE connection (
|
15
|
+
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
|
16
|
+
"ip" TEXT,
|
17
|
+
"user" TEXT,
|
18
|
+
"hostname" TEXT,
|
19
|
+
"port" INTEGER,
|
20
|
+
"note" TEXT,
|
21
|
+
"created_at" TEXT,
|
22
|
+
"options" TEXT,
|
23
|
+
"group" TEXT,
|
24
|
+
"count" INTEGER,
|
25
|
+
"last_time" TEXT,
|
26
|
+
"secure_check" INTEGER,
|
27
|
+
"connect_via" INTEGER NULL,
|
28
|
+
FOREIGN KEY("connect_via") REFERENCES connection("id")
|
29
|
+
);
|
30
|
+
|
31
|
+
INSERT INTO connection ("ip", "hostname") VALUES ("127.0.0.1", "localhost");
|
32
|
+
NEW_DB
|
33
|
+
#TODO make group a n:m relation to extra table
|
34
|
+
end
|
35
|
+
DATABASE = Sequel.sqlite(@database_file)
|
13
36
|
|
14
37
|
attr_accessor :connections
|
15
38
|
|
16
39
|
def initialize
|
17
|
-
@connections= DATABASE
|
40
|
+
@connections = DATABASE[:connection]
|
41
|
+
end
|
42
|
+
|
43
|
+
def get_connection_by_id(id)
|
44
|
+
@connections[:id => id].to_hash
|
18
45
|
end
|
19
46
|
|
20
47
|
def get_connection_data
|
21
|
-
@connections.
|
48
|
+
@connections.all
|
22
49
|
end
|
23
50
|
|
24
|
-
def add_new_connection(
|
25
|
-
@connections.insert(
|
51
|
+
def add_new_connection(connection)
|
52
|
+
@connections.insert(connection)
|
26
53
|
end
|
27
54
|
|
28
|
-
def delete_connection(
|
29
|
-
|
30
|
-
@connections.where(:ip => ip).delete
|
55
|
+
def delete_connection(id)
|
56
|
+
@connections.where(:id => id).delete
|
31
57
|
end
|
32
58
|
|
33
|
-
def update_connection(
|
34
|
-
@connections.where(:
|
59
|
+
def update_connection(connection)
|
60
|
+
@connections.where(:id => connection[:id]).update(connection)
|
35
61
|
end
|
36
62
|
|
37
63
|
def search_for(term)
|
38
64
|
# check online: search for 'contains' not for complete matching
|
39
65
|
return @connections.where(:ip => term), @connections.where(:user => term), @connections.where(:hostname => term), @connections.where(:port => term), @connections.where(:note => term), @connections.where(:group => term), @connections.where(:options => term)
|
40
66
|
end
|
41
|
-
|
42
|
-
|
43
67
|
end
|
44
68
|
end
|
45
69
|
end
|
data/lib/ssh/manager/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ssh-manager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joshua Schmid
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -88,9 +88,9 @@ files:
|
|
88
88
|
- Rakefile
|
89
89
|
- bin/sshm
|
90
90
|
- config/settings.yml
|
91
|
-
- config/sshm.db
|
92
91
|
- doc/user_spec
|
93
92
|
- lib/ssh/manager.rb
|
93
|
+
- lib/ssh/manager/ask.sh
|
94
94
|
- lib/ssh/manager/cli.rb
|
95
95
|
- lib/ssh/manager/client.rb
|
96
96
|
- lib/ssh/manager/db.rb
|
data/config/sshm.db
DELETED
Binary file
|