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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f4ef77e66250887d77ec7236a8f20eb845df7394
4
- data.tar.gz: 637e713f4b840cd3017333f1b29da0d0da7fb9de
3
+ metadata.gz: 56dbc7d6e9248cc66a7a3840669ffc4cf0056555
4
+ data.tar.gz: 54cae9ac4705336ad6dbbb39628cb18003d101c2
5
5
  SHA512:
6
- metadata.gz: ce685710f5976949842c3a0bd5b6d98105aa0460dc66658c1a92df11a37595c52eb8040601f89b9c10b9a87f9b69aaae677659ba1c1ad99f42c4ccfefcea02eb
7
- data.tar.gz: b16ea06b519546be7bdf05aeaf5fdd270e63c52ca84dc87979255c1fec178b2f99f589146d588439cff8a4f4be045dab8894fc38a986e01e279651f73d34c534
6
+ metadata.gz: e15cc62eb68e761da4214faa7b1e5b4191aef724436386b045e593cfc7b8ed7fc4bf67481d599b2550aaeed28fb3849f1bc161c30e0c36fe763f444b67ea8ec2
7
+ data.tar.gz: 603a5b658f4db6f72a9725448f53f671fd09bfb875c9c7c19baeaee71db7d11e742700f979b28b3b5b0672302e5309a85d6be7c4180626aa3a8c033d7fb94089
@@ -0,0 +1,10 @@
1
+ function ask {
2
+
3
+ local QUESTION="$1"
4
+ local DEFAULT_ANSWER="$2"
5
+
6
+ local PROMPT="$QUESTION"
7
+
8
+ read -e -p "${PROMPT}: " -i "$DEFAULT_ANSWER" USER_ANSWER
9
+ echo $USER_ANSWER
10
+ }
@@ -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 check_term(ip, user, via)
18
- if CONFIG['terminal'] == "xfce4-terminal" || CONFIG['terminal'] == "gnome-terminal"
19
- if CONFIG['tabbed'] == 'true'
20
- command = "--title=#{user}@#{ip} --tab --command="
21
- else
22
- command = "--title=#{user}@#{ip} --command="
23
- end
24
- #TODO: add title --title='connection name to identify '
25
- #TODO: bug when no terminal is open => wants to open 2 terms
26
- #TODO: dnslookup
27
- if via.nil? or via.empty?
28
- %x(#{CONFIG['terminal']} #{command}"ssh #{user}@#{ip}")
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
- %x(#{CONFIG['terminal']} #{command}"ssh -A -t #{via} ssh -A -t #{user}@#{ip}")
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
- puts "Version: #{old_version} is up to date."
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
- via = DATABASE.get_connection_data[id.to_i-1][-1] =~ /@/
68
- @ip = DATABASE.get_connection_data[id.to_i-1][0]
69
- if via.nil?
70
- exec("ping #{@ip}")
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
- via = DATABASE.get_connection_data[id.to_i-1][-1]
73
- exec("ssh #{via} ping #{@ip}")
114
+ exec("ping #{connection[:ip]} -c 3")
74
115
  end
75
116
  end
76
117
 
77
- def transfer_key(id)
78
- @ip = DATABASE.get_connection_data[id.to_i-1][0]
79
- @user = DATABASE.get_connection_data[id.to_i-1][1]
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
- @ip = DATABASE.get_connection_data[id.to_i-1][0]
85
- @user = DATABASE.get_connection_data[id.to_i-1][1]
86
- %x(scp #{filename} #{@user}@#{@ip}:#{dest_path}) if File.file?(filename)
87
- %x(scp -r #{filename} #{@user}@#{@ip}:#{dest_path}) if File.directory?(filename)
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(ip)
91
- puts 'Username: '
92
- user = $stdin.gets.chomp
93
- user = 'root' if user == ''
94
- puts 'Hostname: '
95
- hostname = $stdin.gets.chomp
96
- puts 'port: '
97
- port = $stdin.gets.chomp
98
- port = '22' if port == ''
99
- puts 'Notes: '
100
- note = $stdin.gets.chomp
101
- puts 'Options: '
102
- options = $stdin.gets.chomp
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 = id.to_i - 1
120
- DATABASE.delete_connection(DATABASE.get_connection_data[id][0])
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
- cnt = 0
125
- connections = Hash[DATABASE.get_connection_data.collect { |x| [cnt+=1, x]}]
126
- puts 'ID IP USERNAME NOTES GROUP'
127
- connections.each do |x|
128
- print "#{x[0]}: "
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
- puts 'Entries wont change of left out blank.'
138
- puts 'Username: '
139
- user =$stdin.gets.chomp
140
- user = DATABASE.get_connection_data[id.to_i][1] if user == ''
141
- puts 'Hostname: '
142
- hostname = $stdin.gets.chomp
143
- hostname = DATABASE.get_connection_data[id.to_i][2] if hostname == ''
144
- puts 'port: '
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 'IP USERNAME HOSTNAME PORT NOTES GROUP'
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
- cons.values.each do |each_con|
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
- check_term(dataset[:ip], dataset[:user], dataset[:connect_via])
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
@@ -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(@options[:add])
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 ip', 'Add ip to your Connection list' ) do |opt|
69
- @options[:add] = opt
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 id', 'connect to <id>' ) do |opt|
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 id', 'delete connection <id>' ) do |opt|
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', 'Display this screen' ) do
121
+ opts.on( '-h', '--help', 'display this screen' ) do
112
122
  puts opts
113
123
  exit
114
124
  end
115
- opts.on( '-v', '--version', 'Print programs version' ) do
125
+ opts.on( '-v', '--version', 'print programs version' ) do
116
126
  puts SSH::Manager::VERSION
117
127
  exit
118
128
  end
@@ -5,41 +5,65 @@ module SSH
5
5
  module Manager
6
6
  class Database
7
7
 
8
- FileUtils.mkdir_p("#{File.join(ENV['HOME'])}/.config/sshm/") unless Dir.exists?("#{ENV['HOME']}/.config/sshm")
9
- FileUtils.cp ("#{File.dirname(__FILE__)}/../../../config/sshm.db"), ("#{File.join(Dir.home)}" + '/.config/sshm/') unless File.exists?(("#{File.join(Dir.home)}" + '/.config/sshm/sshm.db'))
8
+ @config_dir = "#{ENV['HOME']}/.config/sshm"
9
+ FileUtils.mkdir_p(@config_dir) unless Dir.exists?(@config_dir)
10
10
 
11
- @path = "#{File.join(ENV['HOME'])}/.config/sshm"
12
- DATABASE = Sequel.connect("sqlite://#{@path}/sshm.db")
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.from(:connection)
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.map([:ip, :user, :note, :group, :connect_via])
48
+ @connections.all
22
49
  end
23
50
 
24
- def add_new_connection(ip, user='root', hostname='', port=22, note='', connect_via='', created_at, option, count, group, last_time)
25
- @connections.insert(:ip => ip, :user => user, :hostname => hostname, :port => port, :note => note, :connect_via => connect_via, :created_at => created_at, :options => option, :group => group, :count => count, :last_time => last_time)
51
+ def add_new_connection(connection)
52
+ @connections.insert(connection)
26
53
  end
27
54
 
28
- def delete_connection(ip)
29
- # add && :user => user to ensure deletion
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(ip, user, hostname, port, note)
34
- @connections.where(:ip => ip).update(:user => user, :hostname => hostname, :port => port, :note => note)
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
@@ -1,5 +1,5 @@
1
1
  module SSH
2
2
  module Manager
3
- VERSION = "1.0.7"
3
+ VERSION = "1.1.0"
4
4
  end
5
5
  end
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.7
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-03-18 00:00:00.000000000 Z
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